Getting Started with R,Part 2 Let us
continue getting started with R as we start discussing important
statistical concepts in Sports Analytics.
Case-scenario 1 This is the fourth season of
outfielder Luis Robert with the Chicago White Socks.
If during the first three seasons he hit 11, 13, and 12 home runs, how
many does he need on this season for his overall average to be at least
20?
Solution Given that x1=11,x2=13,x3=12
we want to find x4 such that the mean (average) number of home-runs
is x¯>=20
Notice that in this case n=4 .
According to the information above: 20×4=11+13+12+x4
so when x4=44, the home-runs average will be 20.
# Home-runs so far- history - we are going to build a vector with this values
HR_before <- c(11, 13, 12)
# Average Number of Home-runs per season wanted
wanted_HR <- 20
# Number of seasons
n_seasons <- 4
# Needed Home-runs on season 4
x_4 <- n_seasons*wanted_HR - sum(HR_before)
# Minimum number of Home-runs needed by Robert
x_4
Based on the calculations above, Robert needs to hit at least 44 home
runs this season to achieve an average of 20 home runs per season.
We could confirm this, by using the function mean() in R
# Division
# Robert's performance we are going to build a vector with 4 values
Robert_HRs <- c(11, 13, 12,44)
# Find mean - for calculating the mean or average of a set of numbers is straightforward
mean(Robert_HRs)
Yes, we confirm that the average is 20.
# Find standard deviation - calculate the standard deviation of a numeric vector using the sd function
sd(Robert_HRs)
# Find the maximum number of home-runs during the four seasons period
#Find the maximum value using the function: max(numbers)
Robert_HRs
max(Robert_HRs)
In this case you can see that the maximum value is 44
# Find the minimum number of home-runs during the four seasons period
#Find the minimum value using using the function min(numbers)
Robert_HRs
min(Robert_HRs)
In this case you can see that the minimum value is 11
We can also use the summary() function to find basic statistics,
including the median!
#For numeric vectors, summary provides a quick overview of your data like the minimum, 1st quartile, median, mean, 3rd quartile, and maximum values:
summary(Robert_HRs)
Question 1 Now, you must complete the problem below
which represents a similar case scenario. You may use the steps that we
executed in Case-scenario 1 as a template for your solution.
This is the sixth season of outfielder Juan Soto in
the majors. If during the first five seasons he received 79, 108,41,145,
and 135 walks, how many does he need on this season for his overall
number of walks received per season to be at least 100?
Solution Given that w1= 79, w2= 108, w3= 41, w4= 145, and
w5= 135
we want to find w6 such that the mean (average) number of walks is
x>=100
Notice that in this case n=6 .
According to the information above: 100 x 6 = 79 + 108 + 41 + 145 +
135 + w6
so when _w6 = 92__, the overall walks per season to be at least
100.
# Walks so far
Walks_before <- c(79, 108,41,145, 135)
# Average Number of Home-runs per season wanted
wanted_walks <- 100
# Number of seasons
JSn_seasons <- 6
# Needed walks on season 6
w6 <- JSn_seasons*wanted_walks - sum(Walks_before)
# Minimum number of Walks needed by Juan Soto
w6
According to the calculations, Juan Soto must receive 92 walks this
season for his average number of walks per season to be at least
100.
Case-scenario 2 The average salary of 10 baseball
players is 72,000 dollars a week and the average salary of 4 soccer
players is 84,000. Find the mean salary of all 14 professional
players.
Solution We can easily find the joined mean by adding both
mean and dividing by the total number of people.
Let n1=10 denote the number of baseball players, and y1=72000 their
mean salary. Let n2=4 the number of soccer players and y2=84000 their
mean salary. Then the mean salary of all 14 individuals is:
(n1x1+n2x2)/(n1+n2)
We can compute this in R as follows:
#number of baseball players
n_1 <- 10
#number of soccer players
n_2 <- 4
#salary of 10 baseball players
y_1 <- 72000
#salary of 4 soccer players
y_2 <- 84000
# Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave
Thus, the average salary of all 14 professional players is
$75,428.57.
Question 2 The average salary of 7 basketball
players is 102,000 dollars a week and the average salary of 9 NFL
players is 91,000. Find the mean salary of all 16 professional
players.
Solution We can easily find the joined mean by adding both
mean and dividing by the total number of people.
Let n3=7 denote the number of basketball players, and y3=102000 their
mean salary. Let n4=9 the number of NFL players and y4=91000 their mean
salary. Then the mean salary of all 16 individuals is:
(n3x3+n4x4)/(n3+n4)
#number of basketball players
n_3 <- 7
#number of NFL players
n_4 <- 9
#salary of 7 basketball players
y_3 <- 102000
#salary of 9 NFL players
y_4 <- 91000
# Mean salary overall
salary_ave_bask_nfl <- (n_3*y_3 + n_4*y_4)/(n_3+n_4)
salary_ave_bask_nfl
Thus, the average salary of all 16 professional players is
$95,812.50.
Case-scenario 3 The frequency distribution below
lists the number of active players in the Barclays Premier League and
the time left in their contract.
Years Number of players 6 28 5 72 4 201 3 109 2 56 1 34
1.Find the mean,the median and the standard deviation.
2.What percentage of the data lies within one standard deviation of
the mean?
3.What percentage of the data lies within two standard deviations of
the mean?
4.What percent of the data lies within three standard deviations of
the mean?
5.Draw a histogram to illustrate the data.
Solution The allcontracts.csv file contains all the
players contracts length. We can read this file in R using the
read.csv() function.
#This assigns the resulting data frame to the variable to contract_length
contract_length <- read.csv("C:/Users/auris/Downloads/allcontracts.csv",header = TRUE, sep = ",")
# This assigns the values of the specified column to the variable contract_years
contract_years <- contract_length$years
1.- To find the mean, mediam and the standard
deviation
# Find mean - for calculating the mean or average of a set of numbers is straightforward
contracts_mean <- mean(contract_years)
contracts_mean
In the Barclays Premier League, the average remaining contract length
is 3.46 years.
# Median
#The median is the value that separates the higher half from the lower half of the data set.
contracts_median <- median(contract_years)
contracts_median
In the Barclays Premier League, the median remaining contract length
is 3 years.
# Find number of players
contracts_n <- length(contract_years)
contracts_n
# Find standard deviation
contracts_sd <- sd(contract_years)
contracts_sd
In the Barclays Premier League, with 499 active players, the standard
deviation of remaining contract length is 1.69 years.
__2.__What percentage of the data lies within one standard deviation
of the mean?
contracts_w1sd <- sum((contract_years - contracts_mean)/contracts_sd < 1)/ contracts_n
# Percentage of observation within one standard deviation of the mean
contracts_w1sd
contracts_w1sd*contracts_n
In the Barclays Premier League, with 499 active players,
approximately 84%, or 420 players, lie within one standard deviation of
the mean (3.46 years) remaining contract length.
## Difference from empirical
contracts_w1sd - 0.68
__3.__What percentage of the data lies within two standard deviations
of the mean?
## Within 2 sd
contracts_w2sd <- sum((contract_years - contracts_mean)/ contracts_sd < 2)/contracts_n
contracts_w2sd
## Difference from empirical
contracts_w2sd - 0.95
In the Barclays Premier League, all 499 active players have remaining
contract lengths that fall within two standard deviations of the mean of
3.46 years.
__4.__What percent of the data lies within three standard deviations
of the mean?
## Within 3 sd
contracts_w3sd <- sum((contract_years - contracts_mean)/ contracts_sd < 3)/contracts_n
contracts_w3sd
## Difference from empirical
contracts_w3sd - 0.9973
In the Barclays Premier League, all 499 active players have remaining
contract lengths that fall within three standard deviations of the mean
of 3.46 years.
__5.__Draw a histogram
# Create histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "red", xlim = c(0,8), ylim = c(0,225),
breaks = 5)
From the graphic, it’s evident that in the Barclays Premier League,
out of 499 active players, approximately 170 have remaining contract
lengths of less than 2 years, about 270 have less than 3 years,
approximately 370 have less than 4 years, around 470 have less than 5
years, and all have less than 6 years remaining.
Question 3 Use the skills learned in case scenario
number 3 on one the following data sets. You may choose only one
dataset. They are both available in Canvas.
Solution The file doubles_hit.csv includes data on
the double hits made by players. In R, we can import this file using the
read.csv() function.
In the Barclays Premier League, the following frequency distribution
lists the number of double hits per active player.
Double hits Number by players 37 4 6 7 9 25 18 11
#This assigns the resulting data frame to the variable to doubles
doubles <- read.csv("C:/Users/auris/Downloads/doubles_hit.csv",header = TRUE, sep = ",")
# This assigns the values of the specified column to the variable contract_years
doubles_hits <- doubles$doubles_hit
1.- To find the mean, mediam and the standard
deviation
# Find mean - for calculating the mean or average of a set of numbers is straightforward
# Mean - Average of the contract
doubles_mean <- mean(doubles_hits)
doubles_mean
In the Barclays Premier League, the average number of double hits per
player is 24.
# Median
#The median is the value that separates the higher half from the lower half of the data set.
doubles_median <- median(doubles_hits)
doubles_median
In the Barclays Premier League, the median number of double hits per
player is 24
# Find number of observations
doubles_n <- length(doubles_hits)
doubles_n
In the dataset for double hits, we can observe that there are 100
players registered with double hits in the Barclays Premier League.
# Find standard deviation
doubles_sd <- sd(doubles_hits)
doubles_sd
The standard deviation of double hits is 13.37
__2.__What percentage of the data lies within one standard deviation
of the mean?
doubles_w1sd <- sum((doubles_hits - doubles_mean)/doubles_sd < 1)/ doubles_n
# Percentage of observation within one standard deviation of the mean
doubles_w1sd
## Difference from empirical
doubles_w1sd - 0.68
In the dataset for double hits in the Barclays Premier League, among
the 100 players, approximately 79% (79 players) lie within one standard
deviation of the mean of 24 double hits
_3. What percentage of the data lies within two standard deviations
of the mean?
## Within 2 sd
contracts_w2sd <- sum((doubles_hits - doubles_mean)/ doubles_sd < 2)/doubles_n
contracts_w2sd
## Difference from empirical
contracts_w2sd - 0.95
In the dataset for double hits in the Barclays Premier League, all
100 players are within two standard deviations of the mean of 24 double
hits.
_4.__What percent of the data lies within three standard deviations
of the mean?
## Within 3 sd
contracts_w3sd <- sum((doubles_hits - doubles_mean)/ doubles_sd < 3)/doubles_n
contracts_w3sd
## Difference from empirical
contracts_w3sd - 0.9973
In the dataset for double hits in the Barclays Premier League, all
100 players are within three standard deviations of the mean of 24
double hits.
__5.__Draw a histogram
# Create histogram
hist(doubles_hits,xlab = "Number of Doubles Hits",col = "green",border = "red", xlim = c(0,50), ylim = c(0,28),
breaks = 5)
From the graphic, it’s evident that in the dataset for double hits in
the Barclays Premier League, among 100 players, approximately:
-21 players have between 0 and 10 double hits,
-23 players have between 10 and 20 double hits,
-23 players have between 20 and 30 double hits,
-22 players have between 30 and 40 double hits,
-11 players have between 40 and 50 double hits.
LS0tDQp0aXRsZTogIkluLWNsYXNzIGFjdGl2aXR5ICM1KEhXKTogSW50cm9kdWN0aW9uIHRvIFIgZm9yIFNwb3J0cyBBbmFseXRpY3MsIFBhcnQgMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCl9fX0dldHRpbmcgU3RhcnRlZCB3aXRoIFIsUGFydCAyX19fDQpMZXQgdXMgY29udGludWUgZ2V0dGluZyBzdGFydGVkIHdpdGggUiBhcyB3ZSBzdGFydCBkaXNjdXNzaW5nIGltcG9ydGFudCBzdGF0aXN0aWNhbCBjb25jZXB0cyBpbiBTcG9ydHMgQW5hbHl0aWNzLg0KDQpfX0Nhc2Utc2NlbmFyaW8gMV9fDQpUaGlzIGlzIHRoZSBmb3VydGggc2Vhc29uIG9mIG91dGZpZWxkZXIgKkx1aXMgUm9iZXJ0KiB3aXRoIHRoZSAqQ2hpY2FnbyBXaGl0ZSBTb2NrcyouIElmIGR1cmluZyB0aGUgZmlyc3QgdGhyZWUgc2Vhc29ucyBoZSBoaXQgMTEsIDEzLCBhbmQgMTIgaG9tZSBydW5zLCBob3cgbWFueSBkb2VzIGhlIG5lZWQgb24gdGhpcyBzZWFzb24gZm9yIGhpcyBvdmVyYWxsIGF2ZXJhZ2UgdG8gYmUgYXQgbGVhc3QgMjA/DQoNCl9fU29sdXRpb25fXw0KR2l2ZW4gdGhhdCB4MT0xMSx4Mj0xMyx4Mz0xMg0KDQp3ZSB3YW50IHRvIGZpbmQgeDQgc3VjaCB0aGF0IHRoZSBtZWFuIChhdmVyYWdlKSBudW1iZXIgb2YgaG9tZS1ydW5zIGlzIHjCrz49MjANCg0KTm90aWNlIHRoYXQgaW4gdGhpcyBjYXNlIG49NA0KLg0KDQpBY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGFib3ZlOiAyMMOXND0xMSsxMysxMit4NA0KDQpzbyB3aGVuIHg0PTQ0LCB0aGUgaG9tZS1ydW5zIGF2ZXJhZ2Ugd2lsbCBiZSAyMC4NCg0KYGBge3J9DQojIEhvbWUtcnVucyBzbyBmYXItIGhpc3RvcnkgLSB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgYSB2ZWN0b3Igd2l0aCB0aGlzIHZhbHVlcw0KSFJfYmVmb3JlIDwtIGMoMTEsIDEzLCAxMikNCiMgQXZlcmFnZSBOdW1iZXIgb2YgSG9tZS1ydW5zIHBlciBzZWFzb24gd2FudGVkDQp3YW50ZWRfSFIgPC0gMjANCiMgTnVtYmVyIG9mIHNlYXNvbnMNCm5fc2Vhc29ucyA8LSA0DQojIE5lZWRlZCBIb21lLXJ1bnMgb24gc2Vhc29uIDQNCnhfNCA8LSBuX3NlYXNvbnMqd2FudGVkX0hSIC0gc3VtKEhSX2JlZm9yZSkNCiMgTWluaW11bSBudW1iZXIgb2YgSG9tZS1ydW5zIG5lZWRlZCBieSBSb2JlcnQNCnhfNA0KYGBgDQpCYXNlZCBvbiB0aGUgY2FsY3VsYXRpb25zIGFib3ZlLCBSb2JlcnQgbmVlZHMgdG8gaGl0IGF0IGxlYXN0IDQ0IGhvbWUgcnVucyB0aGlzIHNlYXNvbiB0byBhY2hpZXZlIGFuIGF2ZXJhZ2Ugb2YgMjAgaG9tZSBydW5zIHBlciBzZWFzb24uDQoNCldlIGNvdWxkIGNvbmZpcm0gdGhpcywgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIG1lYW4oKSBpbiBSDQoNCmBgYHtyfQ0KIyBEaXZpc2lvbg0KIyBSb2JlcnQncyBwZXJmb3JtYW5jZSB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgYSB2ZWN0b3Igd2l0aCA0IHZhbHVlcw0KUm9iZXJ0X0hScyA8LSBjKDExLCAxMywgMTIsNDQpDQojIEZpbmQgbWVhbiAtIGZvciBjYWxjdWxhdGluZyB0aGUgbWVhbiBvciBhdmVyYWdlIG9mIGEgc2V0IG9mIG51bWJlcnMgaXMgc3RyYWlnaHRmb3J3YXJkDQptZWFuKFJvYmVydF9IUnMpDQpgYGANClllcywgd2UgY29uZmlybSB0aGF0IHRoZSBhdmVyYWdlIGlzIDIwLg0KDQpgYGB7cn0NCiMgRmluZCBzdGFuZGFyZCBkZXZpYXRpb24gLSBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIG51bWVyaWMgdmVjdG9yIHVzaW5nIHRoZSBzZCBmdW5jdGlvbg0Kc2QoUm9iZXJ0X0hScykNCmBgYA0KYGBge3J9DQojIEZpbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QNCiNGaW5kIHRoZSBtYXhpbXVtIHZhbHVlIHVzaW5nIHRoZSBmdW5jdGlvbjogbWF4KG51bWJlcnMpDQpSb2JlcnRfSFJzDQptYXgoUm9iZXJ0X0hScykNCmBgYA0KSW4gdGhpcyBjYXNlIHlvdSBjYW4gc2VlIHRoYXQgdGhlIG1heGltdW0gdmFsdWUgaXMgNDQNCg0KYGBge3J9DQojIEZpbmQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QNCiNGaW5kIHRoZSBtaW5pbXVtIHZhbHVlIHVzaW5nIHVzaW5nIHRoZSBmdW5jdGlvbiBtaW4obnVtYmVycykNClJvYmVydF9IUnMNCm1pbihSb2JlcnRfSFJzKQ0KYGBgDQpJbiB0aGlzIGNhc2UgeW91IGNhbiBzZWUgdGhhdCB0aGUgbWluaW11bSB2YWx1ZSBpcyAxMQ0KDQpXZSBjYW4gYWxzbyB1c2UgdGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0byBmaW5kIGJhc2ljIHN0YXRpc3RpY3MsIGluY2x1ZGluZyB0aGUgbWVkaWFuIQ0KDQpgYGB7cn0NCiNGb3IgbnVtZXJpYyB2ZWN0b3JzLCBzdW1tYXJ5IHByb3ZpZGVzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgeW91ciBkYXRhIGxpa2UgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCBtZWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIHZhbHVlczoNCnN1bW1hcnkoUm9iZXJ0X0hScykNCmBgYA0KX19RdWVzdGlvbiAxX18NCk5vdywgeW91IG11c3QgY29tcGxldGUgdGhlIHByb2JsZW0gYmVsb3cgd2hpY2ggcmVwcmVzZW50cyBhIHNpbWlsYXIgY2FzZSBzY2VuYXJpby4gWW91IG1heSB1c2UgdGhlIHN0ZXBzIHRoYXQgd2UgZXhlY3V0ZWQgaW4gQ2FzZS1zY2VuYXJpbyAxIGFzIGEgdGVtcGxhdGUgZm9yIHlvdXIgc29sdXRpb24uDQoNClRoaXMgaXMgdGhlIHNpeHRoIHNlYXNvbiBvZiBvdXRmaWVsZGVyICoqSnVhbiBTb3RvKiogaW4gdGhlIG1ham9ycy4gSWYgZHVyaW5nIHRoZSBmaXJzdCBmaXZlIHNlYXNvbnMgaGUgcmVjZWl2ZWQgNzksIDEwOCw0MSwxNDUsIGFuZCAxMzUgd2Fsa3MsIGhvdyBtYW55IGRvZXMgaGUgbmVlZCBvbiB0aGlzIHNlYXNvbiBmb3IgaGlzIG92ZXJhbGwgbnVtYmVyIG9mIHdhbGtzIHJlY2VpdmVkIHBlciBzZWFzb24gdG8gYmUgYXQgbGVhc3QgMTAwPw0KDQpfU29sdXRpb25fDQpHaXZlbiB0aGF0ICB3MT0gNzksIHcyPSAxMDgsIHczPSA0MSwgdzQ9IDE0NSwgYW5kIHc1PSAxMzUNCg0Kd2Ugd2FudCB0byBmaW5kIHc2IHN1Y2ggdGhhdCB0aGUgbWVhbiAoYXZlcmFnZSkgbnVtYmVyIG9mIHdhbGtzIGlzIHg+PTEwMA0KDQpOb3RpY2UgdGhhdCBpbiB0aGlzIGNhc2Ugbj02DQouDQoNCkFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gYWJvdmU6IDEwMCB4IDYgPSA3OSArIDEwOCArIDQxICsgMTQ1ICsgMTM1ICsgdzYNCg0Kc28gd2hlbiBfdzYgPSA5Ml9fLCB0aGUgb3ZlcmFsbCB3YWxrcyBwZXIgc2Vhc29uIHRvIGJlIGF0IGxlYXN0IDEwMC4NCg0KDQpgYGB7cn0NCiMgV2Fsa3Mgc28gZmFyDQpXYWxrc19iZWZvcmUgPC0gYyg3OSwgMTA4LDQxLDE0NSwgMTM1KQ0KIyBBdmVyYWdlIE51bWJlciBvZiBIb21lLXJ1bnMgcGVyIHNlYXNvbiB3YW50ZWQNCndhbnRlZF93YWxrcyA8LSAxMDANCiMgTnVtYmVyIG9mIHNlYXNvbnMNCkpTbl9zZWFzb25zIDwtIDYNCiMgTmVlZGVkIHdhbGtzIG9uIHNlYXNvbiA2DQp3NiA8LSBKU25fc2Vhc29ucyp3YW50ZWRfd2Fsa3MgLSBzdW0oV2Fsa3NfYmVmb3JlKQ0KIyBNaW5pbXVtIG51bWJlciBvZiBXYWxrcyBuZWVkZWQgYnkgSnVhbiBTb3RvDQp3Ng0KYGBgDQpBY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9ucywgSnVhbiBTb3RvIG11c3QgcmVjZWl2ZSA5MiB3YWxrcyB0aGlzIHNlYXNvbiBmb3IgaGlzIGF2ZXJhZ2UgbnVtYmVyIG9mIHdhbGtzIHBlciBzZWFzb24gdG8gYmUgYXQgbGVhc3QgMTAwLg0KDQpfX0Nhc2Utc2NlbmFyaW8gMl9fIFRoZSBhdmVyYWdlIHNhbGFyeSBvZiAxMCBiYXNlYmFsbCBwbGF5ZXJzIGlzIDcyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDQgc29jY2VyIHBsYXllcnMgaXMgODQsMDAwLiBGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTQgcHJvZmVzc2lvbmFsIHBsYXllcnMuDQoNCl9Tb2x1dGlvbl8gV2UgY2FuIGVhc2lseSBmaW5kIHRoZSBqb2luZWQgbWVhbiBieSBhZGRpbmcgYm90aCBtZWFuIGFuZCBkaXZpZGluZyBieSB0aGUgdG90YWwgbnVtYmVyIG9mIHBlb3BsZS4NCg0KTGV0IG4xPTEwIGRlbm90ZSB0aGUgbnVtYmVyIG9mIGJhc2ViYWxsIHBsYXllcnMsIGFuZCB5MT03MjAwMCB0aGVpciBtZWFuIHNhbGFyeS4gTGV0IG4yPTQgdGhlIG51bWJlciBvZiBzb2NjZXIgcGxheWVycyBhbmQgeTI9ODQwMDAgdGhlaXIgbWVhbiBzYWxhcnkuIFRoZW4gdGhlIG1lYW4gc2FsYXJ5IG9mIGFsbCAxNCBpbmRpdmlkdWFscyBpczogKG4xeDErbjJ4MikvKG4xK24yKQ0KDQpXZSBjYW4gY29tcHV0ZSB0aGlzIGluIFIgYXMgZm9sbG93czoNCg0KYGBge3J9DQojbnVtYmVyIG9mIGJhc2ViYWxsIHBsYXllcnMNCm5fMSA8LSAxMCANCiNudW1iZXIgb2Ygc29jY2VyIHBsYXllcnMNCm5fMiA8LSA0DQojc2FsYXJ5IG9mIDEwIGJhc2ViYWxsIHBsYXllcnMNCnlfMSA8LSA3MjAwMA0KI3NhbGFyeSBvZiA0IHNvY2NlciBwbGF5ZXJzDQp5XzIgPC0gODQwMDANCiMgTWVhbiBzYWxhcnkgb3ZlcmFsbA0Kc2FsYXJ5X2F2ZSA8LSAgKG5fMSp5XzEgKyBuXzIqeV8yKS8obl8xK25fMikNCnNhbGFyeV9hdmUNCmBgYA0KDQpUaHVzLCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgYWxsIDE0IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ3NSw0MjguNTcuDQoNCl9fUXVlc3Rpb24gMl9fIFRoZSBhdmVyYWdlIHNhbGFyeSBvZiA3IGJhc2tldGJhbGwgcGxheWVycyBpcyAxMDIsMDAwIGRvbGxhcnMgYSB3ZWVrIGFuZCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgOSBORkwgcGxheWVycyBpcyA5MSwwMDAuIEZpbmQgdGhlIG1lYW4gc2FsYXJ5IG9mIGFsbCAxNiBwcm9mZXNzaW9uYWwgcGxheWVycy4NCg0KX1NvbHV0aW9uXyBXZSBjYW4gZWFzaWx5IGZpbmQgdGhlIGpvaW5lZCBtZWFuIGJ5IGFkZGluZyBib3RoIG1lYW4gYW5kIGRpdmlkaW5nIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgcGVvcGxlLg0KDQpMZXQgbjM9NyBkZW5vdGUgdGhlIG51bWJlciBvZiBiYXNrZXRiYWxsIHBsYXllcnMsIGFuZCB5Mz0xMDIwMDAgdGhlaXIgbWVhbiBzYWxhcnkuIExldCBuND05IHRoZSBudW1iZXIgb2YgTkZMIHBsYXllcnMgYW5kIHk0PTkxMDAwIHRoZWlyIG1lYW4gc2FsYXJ5LiBUaGVuIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTYgaW5kaXZpZHVhbHMgaXM6IChuM3gzK240eDQpLyhuMytuNCkNCg0KYGBge3J9DQojbnVtYmVyIG9mIGJhc2tldGJhbGwgcGxheWVycw0Kbl8zIDwtIDcNCiNudW1iZXIgb2YgTkZMIHBsYXllcnMNCm5fNCA8LSA5DQojc2FsYXJ5IG9mIDcgYmFza2V0YmFsbCBwbGF5ZXJzDQp5XzMgPC0gMTAyMDAwDQojc2FsYXJ5IG9mIDkgTkZMIHBsYXllcnMNCnlfNCA8LSA5MTAwMA0KIyBNZWFuIHNhbGFyeSBvdmVyYWxsDQpzYWxhcnlfYXZlX2Jhc2tfbmZsIDwtICAobl8zKnlfMyArIG5fNCp5XzQpLyhuXzMrbl80KQ0Kc2FsYXJ5X2F2ZV9iYXNrX25mbA0KYGBgDQpUaHVzLCB0aGUgYXZlcmFnZSBzYWxhcnkgb2YgYWxsIDE2IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ5NSw4MTIuNTAuDQoNCl9fQ2FzZS1zY2VuYXJpbyAzX18gVGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gYmVsb3cgbGlzdHMgdGhlIG51bWJlciBvZiBhY3RpdmUgcGxheWVycyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUgYW5kIHRoZSB0aW1lIGxlZnQgaW4gdGhlaXIgY29udHJhY3QuDQoNClllYXJzIE51bWJlciBvZiBwbGF5ZXJzIDYgMjggNSA3MiA0IDIwMSAzIDEwOSAyIDU2IDEgMzQNCg0KMS5GaW5kIHRoZSBtZWFuLHRoZSBtZWRpYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uDQoNCjIuV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCjMuV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQo0LldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQo1LkRyYXcgYSBoaXN0b2dyYW0gdG8gaWxsdXN0cmF0ZSB0aGUgZGF0YS4NCg0KX19Tb2x1dGlvbl9fIFRoZSBhbGxjb250cmFjdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBwbGF5ZXJzIGNvbnRyYWN0cyBsZW5ndGguIFdlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpgYGB7cn0NCiNUaGlzIGFzc2lnbnMgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lIHRvIHRoZSB2YXJpYWJsZSB0byAgY29udHJhY3RfbGVuZ3RoDQpjb250cmFjdF9sZW5ndGggPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2F1cmlzL0Rvd25sb2Fkcy9hbGxjb250cmFjdHMuY3N2IixoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQojIFRoaXMgYXNzaWducyB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIHRvIHRoZSB2YXJpYWJsZSBjb250cmFjdF95ZWFycw0KY29udHJhY3RfeWVhcnMgPC0gY29udHJhY3RfbGVuZ3RoJHllYXJzDQpgYGANCg0KX18xLi1fXyBUbyBmaW5kIHRoZSBtZWFuLCBtZWRpYW0gIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmBgYHtyfQ0KIyBGaW5kIG1lYW4gLSBmb3IgY2FsY3VsYXRpbmcgdGhlIG1lYW4gb3IgYXZlcmFnZSBvZiBhIHNldCBvZiBudW1iZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZA0KY29udHJhY3RzX21lYW4gIDwtIG1lYW4oY29udHJhY3RfeWVhcnMpDQpjb250cmFjdHNfbWVhbg0KYGBgDQoNCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIGF2ZXJhZ2UgcmVtYWluaW5nIGNvbnRyYWN0IGxlbmd0aCBpcyAzLjQ2IHllYXJzLg0KDQpgYGB7cn0NCiMgTWVkaWFuDQojVGhlIG1lZGlhbiBpcyB0aGUgdmFsdWUgdGhhdCBzZXBhcmF0ZXMgdGhlIGhpZ2hlciBoYWxmIGZyb20gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIGRhdGEgc2V0LiANCmNvbnRyYWN0c19tZWRpYW4gPC0gbWVkaWFuKGNvbnRyYWN0X3llYXJzKQ0KY29udHJhY3RzX21lZGlhbg0KYGBgDQoNCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIG1lZGlhbiByZW1haW5pbmcgY29udHJhY3QgbGVuZ3RoIGlzIDMgeWVhcnMuDQoNCmBgYHtyfQ0KDQojIEZpbmQgbnVtYmVyIG9mIHBsYXllcnMNCmNvbnRyYWN0c19uIDwtIGxlbmd0aChjb250cmFjdF95ZWFycykNCmNvbnRyYWN0c19uDQojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uDQpjb250cmFjdHNfc2QgPC0gc2QoY29udHJhY3RfeWVhcnMpDQpjb250cmFjdHNfc2QNCmBgYA0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHdpdGggNDk5IGFjdGl2ZSBwbGF5ZXJzLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGggaXMgMS42OSB5ZWFycy4NCg0KX18yLl9fV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0KY29udHJhY3RzX3cxc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS9jb250cmFjdHNfc2QgPCAxKS8gY29udHJhY3RzX24NCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KY29udHJhY3RzX3cxc2QNCmBgYA0KYGBge3J9DQpjb250cmFjdHNfdzFzZCpjb250cmFjdHNfbg0KYGBgDQoNCg0KSW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCB3aXRoIDQ5OSBhY3RpdmUgcGxheWVycywgYXBwcm94aW1hdGVseSA4NCUsIG9yIDQyMCBwbGF5ZXJzLCBsaWUgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gKDMuNDYgeWVhcnMpIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGguDQoNCmBgYHtyfQ0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCANCmNvbnRyYWN0c193MXNkIC0gMC42OA0KYGBgDQpfXzMuX19XaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0KIyMgV2l0aGluIDIgc2QNCmNvbnRyYWN0c193MnNkIDwtIHN1bSgoY29udHJhY3RfeWVhcnMgLSBjb250cmFjdHNfbWVhbikvIGNvbnRyYWN0c19zZCA8IDIpL2NvbnRyYWN0c19uDQpjb250cmFjdHNfdzJzZA0KYGBgDQpgYGB7cn0NCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpjb250cmFjdHNfdzJzZCAtIDAuOTUNCmBgYA0KSW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCBhbGwgNDk5IGFjdGl2ZSBwbGF5ZXJzIGhhdmUgcmVtYWluaW5nIGNvbnRyYWN0IGxlbmd0aHMgdGhhdCBmYWxsIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbiBvZiAzLjQ2IHllYXJzLg0KDQpfXzQuX19XaGF0IHBlcmNlbnQgb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojIyBXaXRoaW4gMyBzZCANCmNvbnRyYWN0c193M3NkIDwtIHN1bSgoY29udHJhY3RfeWVhcnMgLSBjb250cmFjdHNfbWVhbikvIGNvbnRyYWN0c19zZCA8IDMpL2NvbnRyYWN0c19uDQpjb250cmFjdHNfdzNzZA0KYGBgDQoNCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KY29udHJhY3RzX3czc2QgLSAwLjk5NzMNCmBgYA0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFsbCA0OTkgYWN0aXZlIHBsYXllcnMgaGF2ZSByZW1haW5pbmcgY29udHJhY3QgbGVuZ3RocyB0aGF0IGZhbGwgd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4gb2YgMy40NiB5ZWFycy4NCg0KX181Ll9fRHJhdyBhIGhpc3RvZ3JhbQ0KDQpgYGB7cn0NCiMgQ3JlYXRlIGhpc3RvZ3JhbQ0KaGlzdChjb250cmFjdF95ZWFycyx4bGFiID0gIlllYXJzIExlZnQgaW4gQ29udHJhY3QiLGNvbCA9ICJncmVlbiIsYm9yZGVyID0gInJlZCIsIHhsaW0gPSBjKDAsOCksIHlsaW0gPSBjKDAsMjI1KSwNCiAgIGJyZWFrcyA9IDUpDQpgYGANCg0KRnJvbSB0aGUgZ3JhcGhpYywgaXQncyBldmlkZW50IHRoYXQgaW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlLCBvdXQgb2YgNDk5IGFjdGl2ZSBwbGF5ZXJzLCBhcHByb3hpbWF0ZWx5IDE3MCBoYXZlIHJlbWFpbmluZyBjb250cmFjdCBsZW5ndGhzIG9mIGxlc3MgdGhhbiAyIHllYXJzLCBhYm91dCAyNzAgaGF2ZSBsZXNzIHRoYW4gMyB5ZWFycywgYXBwcm94aW1hdGVseSAzNzAgaGF2ZSBsZXNzIHRoYW4gNCB5ZWFycywgYXJvdW5kIDQ3MCBoYXZlIGxlc3MgdGhhbiA1IHllYXJzLCBhbmQgYWxsIGhhdmUgbGVzcyB0aGFuIDYgeWVhcnMgcmVtYWluaW5nLg0KDQoNCl9fUXVlc3Rpb24gM19fIFVzZSB0aGUgc2tpbGxzIGxlYXJuZWQgaW4gY2FzZSBzY2VuYXJpbyBudW1iZXIgMyBvbiBvbmUgdGhlIGZvbGxvd2luZyBkYXRhIHNldHMuIFlvdSBtYXkgY2hvb3NlIG9ubHkgb25lIGRhdGFzZXQuIFRoZXkgYXJlIGJvdGggYXZhaWxhYmxlIGluIENhbnZhcy4NCg0KX19Tb2x1dGlvbl9fIFRoZSBmaWxlIGRvdWJsZXNfaGl0LmNzdiBpbmNsdWRlcyBkYXRhIG9uIHRoZSBkb3VibGUgaGl0cyBtYWRlIGJ5IHBsYXllcnMuIEluIFIsIHdlIGNhbiBpbXBvcnQgdGhpcyBmaWxlIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHRoZSBmb2xsb3dpbmcgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBsaXN0cyB0aGUgbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBhY3RpdmUgcGxheWVyLg0KDQpEb3VibGUgaGl0cyBOdW1iZXIgYnkgcGxheWVycyAzNyA0IDYgNyA5IDI1IDE4IDExDQoNCg0KYGBge3J9DQojVGhpcyBhc3NpZ25zIHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZSB0byB0aGUgdmFyaWFibGUgdG8gZG91Ymxlcw0KZG91YmxlcyA8LSByZWFkLmNzdigiQzovVXNlcnMvYXVyaXMvRG93bmxvYWRzL2RvdWJsZXNfaGl0LmNzdiIsaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQ0KIyBUaGlzIGFzc2lnbnMgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0byB0aGUgdmFyaWFibGUgY29udHJhY3RfeWVhcnMNCmRvdWJsZXNfaGl0cyA8LSBkb3VibGVzJGRvdWJsZXNfaGl0DQpgYGANCg0KX18xLi1fXyBUbyBmaW5kIHRoZSBtZWFuLCBtZWRpYW0gIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmBgYHtyfQ0KIyBGaW5kIG1lYW4gLSBmb3IgY2FsY3VsYXRpbmcgdGhlIG1lYW4gb3IgYXZlcmFnZSBvZiBhIHNldCBvZiBudW1iZXJzIGlzIHN0cmFpZ2h0Zm9yd2FyZA0KIyBNZWFuIC0gIEF2ZXJhZ2Ugb2YgdGhlIGNvbnRyYWN0DQpkb3VibGVzX21lYW4gIDwtIG1lYW4oZG91Ymxlc19oaXRzKQ0KZG91Ymxlc19tZWFuDQpgYGANCkluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBwbGF5ZXIgaXMgMjQuDQoNCmBgYHtyfQ0KIyBNZWRpYW4NCiNUaGUgbWVkaWFuIGlzIHRoZSB2YWx1ZSB0aGF0IHNlcGFyYXRlcyB0aGUgaGlnaGVyIGhhbGYgZnJvbSB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgZGF0YSBzZXQuDQpkb3VibGVzX21lZGlhbiA8LSBtZWRpYW4oZG91Ymxlc19oaXRzKQ0KZG91Ymxlc19tZWRpYW4NCg0KYGBgDQpJbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGRvdWJsZSBoaXRzIHBlciBwbGF5ZXIgaXMgMjQNCg0KYGBge3J9DQojIEZpbmQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucw0KZG91Ymxlc19uIDwtIGxlbmd0aChkb3VibGVzX2hpdHMpDQpkb3VibGVzX24NCg0KYGBgDQpJbiB0aGUgZGF0YXNldCBmb3IgZG91YmxlIGhpdHMsIHdlIGNhbiBvYnNlcnZlIHRoYXQgdGhlcmUgYXJlIDEwMCBwbGF5ZXJzIHJlZ2lzdGVyZWQgd2l0aCBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUuDQoNCmBgYHtyfQ0KIyBGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KZG91Ymxlc19zZCA8LSBzZChkb3VibGVzX2hpdHMpDQpkb3VibGVzX3NkDQpgYGANClRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZG91YmxlIGhpdHMgaXMgMTMuMzcNCg0KX18yLl9fV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQpgYGB7cn0NCmRvdWJsZXNfdzFzZCA8LSBzdW0oKGRvdWJsZXNfaGl0cyAtIGRvdWJsZXNfbWVhbikvZG91Ymxlc19zZCA8IDEpLyBkb3VibGVzX24NCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbg0KZG91Ymxlc193MXNkDQpgYGANCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KZG91Ymxlc193MXNkIC0gMC42OA0KYGBgDQoNCkluIHRoZSBkYXRhc2V0IGZvciBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFtb25nIHRoZSAxMDAgcGxheWVycywgYXBwcm94aW1hdGVseSA3OSUgKDc5IHBsYXllcnMpIGxpZSB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiAyNCBkb3VibGUgaGl0cyANCg0KXzMuIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojIyBXaXRoaW4gMiBzZA0KY29udHJhY3RzX3cyc2QgPC0gc3VtKChkb3VibGVzX2hpdHMgLSBkb3VibGVzX21lYW4pLyBkb3VibGVzX3NkIDwgMikvZG91Ymxlc19uDQpjb250cmFjdHNfdzJzZA0KYGBgDQpgYGB7cn0NCiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQpjb250cmFjdHNfdzJzZCAtIDAuOTUNCmBgYA0KDQoNCkluIHRoZSBkYXRhc2V0IGZvciBkb3VibGUgaGl0cyBpbiB0aGUgQmFyY2xheXMgUHJlbWllciBMZWFndWUsIGFsbCAxMDAgcGxheWVycyBhcmUgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuIG9mIDI0IGRvdWJsZSBoaXRzLg0KDQpfNC5fX1doYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQpgYGB7cn0NCiMjIFdpdGhpbiAzIHNkDQpjb250cmFjdHNfdzNzZCA8LSBzdW0oKGRvdWJsZXNfaGl0cyAtIGRvdWJsZXNfbWVhbikvIGRvdWJsZXNfc2QgPCAzKS9kb3VibGVzX24NCmNvbnRyYWN0c193M3NkDQpgYGANCg0KYGBge3J9DQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KY29udHJhY3RzX3czc2QgLSAwLjk5NzMNCmBgYA0KSW4gdGhlIGRhdGFzZXQgZm9yIGRvdWJsZSBoaXRzIGluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgYWxsIDEwMCBwbGF5ZXJzIGFyZSB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbiBvZiAyNCBkb3VibGUgaGl0cy4NCg0KX181Ll9fRHJhdyBhIGhpc3RvZ3JhbQ0KDQpgYGB7cn0NCiMgQ3JlYXRlIGhpc3RvZ3JhbQ0KaGlzdChkb3VibGVzX2hpdHMseGxhYiA9ICJOdW1iZXIgb2YgRG91YmxlcyBIaXRzIixjb2wgPSAiZ3JlZW4iLGJvcmRlciA9ICJyZWQiLCB4bGltID0gYygwLDUwKSwgeWxpbSA9IGMoMCwyOCksDQogICBicmVha3MgPSA1KQ0KYGBgDQoNCg0KRnJvbSB0aGUgZ3JhcGhpYywgaXQncyBldmlkZW50IHRoYXQgaW4gdGhlIGRhdGFzZXQgZm9yIGRvdWJsZSBoaXRzIGluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSwgYW1vbmcgMTAwIHBsYXllcnMsIGFwcHJveGltYXRlbHk6DQoNCi0yMSBwbGF5ZXJzIGhhdmUgYmV0d2VlbiAwIGFuZCAxMCBkb3VibGUgaGl0cywNCg0KLTIzIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDEwIGFuZCAyMCBkb3VibGUgaGl0cywNCg0KLTIzIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDIwIGFuZCAzMCBkb3VibGUgaGl0cywNCg0KLTIyIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDMwIGFuZCA0MCBkb3VibGUgaGl0cywNCg0KLTExIHBsYXllcnMgaGF2ZSBiZXR3ZWVuIDQwIGFuZCA1MCBkb3VibGUgaGl0cy4NCg0KDQo=