Question 1. Consider the Binomial distribution with \(n = 24\) and \(p
= .9\) that is used to model the number of correctly received
bits on a satellite link that transmits data in \(24\)-bit blocks.
Quesion 1 (a) Plot the probability
density function and cumulative distribution function for the number of
correctly received bits
#Answer 1a
n <- 24
p <- .9
x <- 0:n
dbinom(x, size = n, prob = p)
[1] 1.000000e-24 2.160000e-22 2.235600e-20 1.475496e-18 6.971719e-17 2.509819e-15
[7] 7.152983e-14 1.655405e-12 3.165961e-11 5.065538e-10 6.838477e-09 7.833164e-08
[13] 7.637335e-07 6.344863e-06 4.486725e-05 2.692035e-04 1.362843e-03 5.772039e-03
[19] 2.020214e-02 5.741660e-02 1.291874e-01 2.214640e-01 2.717968e-01 2.127105e-01
[25] 7.976644e-02
plot(x, dbinom(x, size = n, prob = p), main = "Probability Density Function(PDF)",
xlab = "Correctly Received Bits",
ylab = "Probability")

pbinom(x, size = n, prob = p)
[1] 1.000000e-24 2.170000e-22 2.257300e-20 1.498069e-18 7.121525e-17 2.581034e-15
[7] 7.411087e-14 1.729516e-12 3.338913e-11 5.399430e-10 7.378420e-09 8.571006e-08
[13] 8.494436e-07 7.194307e-06 5.206155e-05 3.212650e-04 1.684108e-03 7.456147e-03
[19] 2.765828e-02 8.507489e-02 2.142622e-01 4.357263e-01 7.075230e-01 9.202336e-01
[25] 1.000000e+00
plot(x, pbinom(x, size = n, prob = p), main = "Cumulative Distribution Function(CDF)",
xlab = "Correctly Received Bits",
ylab = "Probability")

NA
Quesion 1 (b) What is the mean number of
correctly received bits? What is the standard deviation?
#Answer 1b
#(make sure that what you print make sense to me) - for example to print mean you can use cat command once you done with the calculation and have value in the variable
#variable_name=10
#cat("Mean number of correctly received bits ", variable_name)
n <- 24
p <- .9
mean <- n * p
cat("Mean number of correctly received bits: ", mean)
Mean number of correctly received bits: 21.6
n <- 24
p <- .9
stdev <- sqrt(n * p * (1-p))
cat("Standard Deviation of correctly received bits: ", stdev)
Standard Deviation of correctly received bits: 1.469694
Quesion 1 (c) What is the probability of
more than \(3\)-bit errors in the block
of \(24\)?
#Answer 1c
n <- 24
p <- 0.9
prob20 <- pbinom(20, size = n, prob = p)
proberror <- 1 - prob20
cat("Probability of more than 3-bit errors in the block of 24: ", proberror)
Probability of more than 3-bit errors in the block of 24: 0.7857378
Quesion 1 (e) What is the 60th quantile
of this distribution? What can you interpret from this
value?
#Answer 1e
n <- 24
p <- 0.9
quantile60 <- qbinom(0.6, size = n, prob = p)
cat("The 60th Quartile of this distribution: ", quantile60, "->", "The 60th quartile represents that 40 pe" )
The 60th Quartile of this distribution: 22 -> The 60th quartile represents that 40 pe
Question2. The Public Service Answering Point (PSAP) in San
Francisco employs \(19\) operators in
\(8\)-hour shifts to process \(911\) calls. There are at least \(5\) operators always answering calls. The
number of calls processed per operator can be modeled with a Poisson
random variable with rate \(\lambda_0
=20\) calls per hour.
Quesion 2 (a) What is the probability an
operator can process 20 calls in an hour? Repeat for 30 calls in an
hour?
#Answer 2a
lambda0 <- 20
prob20 <- dpois(20, lambda0)
prob30 <- dpois(30, lambda0)
cat("Probability an operator can process 20 calls an hour: ", prob20, "\n")
Probability an operator can process 20 calls an hour: 0.08883532
cat("Probabilty an operator can process 30 calls an hour: ", prob30)
Probabilty an operator can process 30 calls an hour: 0.008343536
Quesion 2 (b) Given that 240 calls
occurred in an hour, what is the probability that the ten operators can
process them all assuming they are split equally among the
operators?
#Answer 2b
lambda0 <- 20
operators <- 10
callsperoperator <- 24
prob24peroperator <- dpois(callsperoperator, lambda0)
prob10operators <- prob24peroperator^operators
cat("The Probability that 10 operators can process 24 calls each: ", prob10operators)
The Probability that 10 operators can process 24 calls each: 2.892317e-13
Quesion 2 (c) Now, If the aggregate call
rate per hour \(\lambda_c\) , is
measured by \(\lambda_c = 85\) calls
per hour, what is the probability of more than \(100\) calls in an hour
#Answer 2c
lambdaC <- 85
prob100 <- ppois(100, lambdaC)
prob100more <- 1 - prob100
cat("The probability of more than 100 calls (when Lambda = 85) is: ", prob100more)
The probability of more than 100 calls (when Lambda = 85) is: 0.04934533
Question 3. For the two random number generator below A and B(don’t
forget to add your R code)
- [A] \(Z_i = (9Z_{i-1} + 1) \mod
16\) with \(Z_0 = 5\).
- [B] \(Z_i = (7Z_{i-1} + 3) \mod
32\) with \(Z_0 = 10\),
Quesion 3 (b) Which of these parameters
effect the period of LCG – \(a\), \(b\), \(Z_0\)
#Answer
cat("Answer", "The parameter a, b, and z")
Quesion 3 (c) For both generators plot a
scatter diagram of the Zi values 1 apart. What are your observations
from these plots? What do you think about the property of randomness of
these generators?
#Answer
plot(Z_values_A[-length(Z_values_A)], Z_values_A[-1], main="Scatter Diagram for Generator A", xlab="Zi", ylab="Zi+1")

plot(Z_values_B[-length(Z_values_B)], Z_values_B[-1], main="Scatter Diagram for Generator B", xlab="Zi", ylab="Zi+1")

cat("The first plot shows a slight pattern while the second plot is mostly random. These plots show that the generators are producing random number. This is because if the generators were not producing random numbers, there would be stronger patterns in either of the scatterplots.")
The first plot shows a slight pattern while the second plot is mostly random. These plots show that the generators are producing random number. This is because if the generators were not producing random numbers, there would be stronger patterns in either of the scatterplots.
Quesion 3 (d) Randomness of default
random generator of R – Run runif command to generate 100 random numbers
and plot the scatter diagram of these numbers ( values 1 apart) and
discuss your observations about randomness of this random generator.
#Answer
randomnumbers <- runif(100)
plot(randomnumbers[-100], randomnumbers[-1], xlab="Value at i", ylab="Value at i+1", main="Scatter Diagram of Random Numbers (1 Apart)")

cat("There are not many observations we can make about this scatterplot other than it very random. This is a great example of randomness as there is no observable pattern or strength (postive or negative). ")
Quesion 3 (e) Compute the mean value of
\(U_i\) across the period
#Answer
Z <- 5
Z_values_A <- c(Z)
m_A <- 16
while (TRUE) {
Z <- (9 * Z + 1) %% m_A
if (Z %in% Z_values_A) {
break
}
Z_values_A <- c(Z_values_A, Z)
}
U_values_A <- Z_values_A / m_A
mean <- mean(U_values_A)
cat("Mean value across the period: ", mean)
Mean value across the period: 0.46875
Question 6. For our specific random variable, we know that its PDF
is defined by the function \(f(x) =
10x(1-x)\). Utilize the accept-reject algorithm to draw samples
from this distribution. Take a look at Lecture 10 slide 8 and 9
#Answer
f <- function(x) {
10 * x * (1 - x)
}
g <- function(x) {
1
}
c <- 2.5
acceptrejectsample <- function() {
while(TRUE) {
X <- runif(1)
U <- runif(1)
if(U <= f(X) / (c * g(X))) {
return(X)
}
}
}
sample <- 10000
samples <- replicate(sample, acceptrejectsample())
hist(samples, main="Histogram of Samples", xlab="x", breaks=50)
LS0tDQp0aXRsZTogIiA8Y2VudGVyPjxzcGFuIHN0eWxlPSdjb2xvcjogYmx1ZTsnPiBJTkZTQ0kgMDMxMCBIVzMgPC9zcGFuPjwvY2VudGVyPiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyBRdWVzdGlvbiAxLiAgQ29uc2lkZXIgdGhlIEJpbm9taWFsIGRpc3RyaWJ1dGlvbiB3aXRoICRuID0gMjQkIGFuZCAkcCA9IC45JCB0aGF0IGlzIHVzZWQgdG8gbW9kZWwgdGhlIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyBvbiBhIHNhdGVsbGl0ZSBsaW5rIHRoYXQgdHJhbnNtaXRzIGRhdGEgaW4gJDI0JC1iaXQgYmxvY2tzLg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChhKSBQbG90IHRoZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGFuZCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBmb3IgdGhlIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czwvc3Bhbj4NCg0KYGBge3J9DQojQW5zd2VyIDFhDQoNCm4gPC0gMjQNCnAgPC0gLjkNCnggPC0gMDpuDQpkYmlub20oeCwgc2l6ZSA9IG4sIHByb2IgPSBwKQ0KDQpwbG90KHgsIGRiaW5vbSh4LCBzaXplID0gbiwgcHJvYiA9IHApLCBtYWluID0gIlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24oUERGKSIsDQogIHhsYWIgPSAiQ29ycmVjdGx5IFJlY2VpdmVkIEJpdHMiLA0KICB5bGFiID0gIlByb2JhYmlsaXR5IikNCg0KYGBgDQpgYGB7cn0NCiNBbnN3ZXIgMWENCnBiaW5vbSh4LCBzaXplID0gbiwgcHJvYiA9IHApDQoNCnBsb3QoeCwgcGJpbm9tKHgsIHNpemUgPSBuLCBwcm9iID0gcCksIG1haW4gPSAiQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24oQ0RGKSIsDQogICAgIHhsYWIgPSAiQ29ycmVjdGx5IFJlY2VpdmVkIEJpdHMiLA0KICAgICB5bGFiID0gIlByb2JhYmlsaXR5IikNCiAgICAgDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWINCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlDQojdmFyaWFibGVfbmFtZT0xMCANCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQ0KDQpuIDwtIDI0DQpwIDwtIC45DQoNCm1lYW4gPC0gbiAqIHANCg0KY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czogIiwgbWVhbikNCg0KYGBgDQpgYGB7cn0NCm4gPC0gMjQNCnAgPC0gLjkNCg0Kc3RkZXYgPC0gc3FydChuICogcCAqICgxLXApKQ0KDQpjYXQoIlN0YW5kYXJkIERldmlhdGlvbiBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czogIiwgc3RkZXYpDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChjKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gJDMkLWJpdCBlcnJvcnMgaW4gdGhlIGJsb2NrIG9mICQyNCQ/PC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDFjDQpuIDwtIDI0DQpwIDwtIDAuOQ0KDQpwcm9iMjAgPC0gcGJpbm9tKDIwLCBzaXplID0gbiwgcHJvYiA9IHApDQpwcm9iZXJyb3IgPC0gMSAtIHByb2IyMA0KDQpjYXQoIlByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAzLWJpdCBlcnJvcnMgaW4gdGhlIGJsb2NrIG9mIDI0OiAiLCBwcm9iZXJyb3IpDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGQpIFdoYXQgaXMgdGhlIG1lZGlhbiBvZiB0aGlzIGRpc3RyaWJ1dGlvbj8gV2hhdCBjYW4geW91IGludGVycHJldCBmcm9tIHRoZSBtZWRpYW4gdmFsdWU/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAxZA0KDQpuIDwtIDI0DQpwIDwtIDAuOQ0KDQptZWRpYW4gPC0gMA0KZm9yIChpIGluIDA6bikgew0KICBpZihwYmlub20oaSwgc2l6ZSA9IG4sIHByb2IgPSBwKSA+PSAwLjUpIHsNCiAgICBtZWRpYW4gPC0gaQ0KICAgIGJyZWFrDQogIH0NCiAgDQp9DQoNCmNhdCgiVGhlIG1lZGlhbiB2YWx1ZSBmb3IgdGhpcyBkaXN0cmlidXRpb246ICIsIG1lZGlhbiwiLT4iLCAiIFRoZSBtZWRpYW4gaXMgdGhlIG1pZGRsZSB2YWx1ZSBpcyBhIHNldCBvZiBudW1iZXJzLiBJbiB0aGlzIGNhc2UgdGhlIG1lZGlhbiByZXByZXNlbnRzIHRoZSBtaWRkbGUgdmFsdWUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiAyNCBiaXQgYmxvY2tzLiIpDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWUNCg0KbiA8LSAyNA0KcCA8LSAwLjkNCg0KcXVhbnRpbGU2MCA8LSBxYmlub20oMC42LCBzaXplID0gbiwgcHJvYiA9IHApDQoNCmNhdCgiVGhlIDYwdGggUXVhcnRpbGUgb2YgdGhpcyBkaXN0cmlidXRpb246ICIsIHF1YW50aWxlNjAsICItPiIsICJUaGUgNjB0aCBxdWFydGlsZSByZXByZXNlbnRzIHRoYXQgNDAgcGUiICkNCg0KYGBgDQoNCiMgUXVlc3Rpb24yLiBUaGUgUHVibGljIFNlcnZpY2UgQW5zd2VyaW5nIFBvaW50IChQU0FQKSBpbiBTYW4gRnJhbmNpc2NvIGVtcGxveXMgJDE5JCBvcGVyYXRvcnMgaW4gJDgkLWhvdXIgc2hpZnRzIHRvIHByb2Nlc3MgJDkxMSQgY2FsbHMuIFRoZXJlIGFyZSBhdCBsZWFzdCAkNSQgb3BlcmF0b3JzIGFsd2F5cyBhbnN3ZXJpbmcgY2FsbHMuIFRoZSBudW1iZXIgb2YgY2FsbHMgcHJvY2Vzc2VkIHBlciBvcGVyYXRvciBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgd2l0aCByYXRlICRcbGFtYmRhXzAgPTIwJCBjYWxscyBwZXIgaG91ci4NCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYSkgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMjAgY2FsbHMgaW4gYW4gaG91cj8gUmVwZWF0IGZvciAzMCBjYWxscyBpbiBhbiBob3VyPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMmENCg0KbGFtYmRhMCA8LSAyMA0KDQpwcm9iMjAgPC0gZHBvaXMoMjAsIGxhbWJkYTApDQpwcm9iMzAgPC0gZHBvaXMoMzAsIGxhbWJkYTApDQoNCmNhdCgiUHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMjAgY2FsbHMgYW4gaG91cjogIiwgcHJvYjIwLCAiXG4iKQ0KY2F0KCJQcm9iYWJpbHR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDMwIGNhbGxzIGFuIGhvdXI6ICIsIHByb2IzMCkNCg0KDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYg0KDQpsYW1iZGEwIDwtIDIwDQpvcGVyYXRvcnMgPC0gMTANCmNhbGxzcGVyb3BlcmF0b3IgPC0gMjQNCg0KcHJvYjI0cGVyb3BlcmF0b3IgPC0gZHBvaXMoY2FsbHNwZXJvcGVyYXRvciwgbGFtYmRhMCkNCnByb2IxMG9wZXJhdG9ycyA8LSBwcm9iMjRwZXJvcGVyYXRvcl5vcGVyYXRvcnMNCg0KY2F0KCJUaGUgUHJvYmFiaWxpdHkgdGhhdCAxMCBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgMjQgY2FsbHMgZWFjaDogIiwgcHJvYjEwb3BlcmF0b3JzKQ0KDQoNCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYykgTm93LCBJZiB0aGUgYWdncmVnYXRlIGNhbGwgcmF0ZSBwZXIgaG91ciAkXGxhbWJkYV9jJCAsIGlzIG1lYXN1cmVkIGJ5ICRcbGFtYmRhX2MgPSA4NSQgY2FsbHMgcGVyIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMTAwJCBjYWxscyBpbiBhbiBob3VyPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDJjDQoNCmxhbWJkYUMgPC0gODUNCg0KcHJvYjEwMCA8LSBwcG9pcygxMDAsIGxhbWJkYUMpDQpwcm9iMTAwbW9yZSA8LSAxIC0gcHJvYjEwMA0KDQpjYXQoIlRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gMTAwIGNhbGxzICh3aGVuIExhbWJkYSA9IDg1KSBpczogIiwgcHJvYjEwMG1vcmUpDQoNCmBgYA0KDQojIFF1ZXN0aW9uIDMuIEZvciB0aGUgdHdvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJlbG93IEEgYW5kIEIoZG9u4oCZdCBmb3JnZXQgdG8gYWRkIHlvdXIgUiBjb2RlKQ0KIyMjIC0gW0FdIFwoWl9pID0gKDlaX3tpLTF9ICsgMSkgXG1vZCAxNlwpIHdpdGggXChaXzAgPSA1XCkuDQojIyMgLSBbQl0gXChaX2kgPSAoN1pfe2ktMX0gKyAzKSBcbW9kIDMyXCkgd2l0aCBcKFpfMCA9IDEwXCksDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYSkgQ29tcHV0ZSAkWl9pJCBhbmQgJFVfaSQgZm9yIHZhbHVlcyBvZiAkaSQgdW50aWwgYSBudW1iZXIgaXMgcmVwZWF0ZWQsIHdoYXQgaXMgdGhlIHBlcmlvZCBvZiBib3RoIHRoZSBnZW5lcmF0b3I/IFByb3ZpZGUgeW91ciBjb21tZW50cyBhYm91dCB0aGUgcGVyaW9kIG9mIGJvdGggUkdOIDwvc3Bhbj4NCg0KYGBge3J9DQojQW5zd2VyIDNhDQojR2VuZXJhdG9yIEENCg0KWl8wX0EgPC0gNQ0KWl92YWx1ZXNfQSA8LSBjKFpfMF9BKQ0KVV92YWx1ZXNfQSA8LSBjKFpfMF9BIC8gMTYpDQoNCndoaWxlKFRSVUUpIHsNCiAgWl9uZXh0X0EgPC0gKDkgKiBaX3ZhbHVlc19BW2xlbmd0aChaX3ZhbHVlc19BKV0gKyAxKSAlJSAxNg0KICBpZihaX25leHRfQSAlaW4lIFpfdmFsdWVzX0EpIGJyZWFrDQogIFpfdmFsdWVzX0EgPC0gYXBwZW5kKFpfdmFsdWVzX0EsIFpfbmV4dF9BKQ0KICBVX3ZhbHVlc19BIDwtIGFwcGVuZChVX3ZhbHVlc19BLCBaX25leHRfQSAvIDE2KQ0KfQ0KDQoNCmNhdCgiUGVyaW9kIG9mIEE6ICIsIGxlbmd0aChaX3ZhbHVlc19BKSkNCmBgYA0KDQpgYGB7cn0NCiNBbnN3ZXIgM2ENCiNHZW5lcmF0b3IgQg0KDQpaXzBfQiA8LSAxMA0KWl92YWx1ZXNfQiA8LSBjKFpfMF9CKQ0KVV92YWx1ZXNfQiA8LSBjKFpfMF9CIC8gMzIpDQoNCndoaWxlKFRSVUUpIHsNCiAgWl9uZXh0X0IgPC0gKDcgKiBaX3ZhbHVlc19CW2xlbmd0aChaX3ZhbHVlc19CKV0gKyAzKSAlJSAzMg0KICBpZihaX25leHRfQiAlaW4lIFpfdmFsdWVzX0IpIGJyZWFrDQogIFpfdmFsdWVzX0IgPC0gYXBwZW5kKFpfdmFsdWVzX0IsIFpfbmV4dF9CKQ0KICBVX3ZhbHVlc19CIDwtIGFwcGVuZChVX3ZhbHVlc19CLCBaX25leHRfQiAvIDMyKQ0KfQ0KDQoNCmNhdCgiUGVyaW9kIG9mIEI6ICIsIGxlbmd0aChaX3ZhbHVlc19CKSkNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGIpIFdoaWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMgZWZmZWN0IHRoZSBwZXJpb2Qgb2YgTENHIOKAkyAkYSQsICRiJCwgJFpfMCQgPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIA0KY2F0KCJBbnN3ZXIiLCAiVGhlIHBhcmFtZXRlciBhLCBiLCBhbmQgeiIpDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChjKSBGb3IgYm90aCBnZW5lcmF0b3JzIHBsb3QgYSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlIFppIHZhbHVlcyAxIGFwYXJ0LiBXaGF0IGFyZSB5b3VyIG9ic2VydmF0aW9ucyBmcm9tIHRoZXNlIHBsb3RzPyBXaGF0IGRvIHlvdSB0aGluayBhYm91dCB0aGUgcHJvcGVydHkgb2YgcmFuZG9tbmVzcyBvZiB0aGVzZSBnZW5lcmF0b3JzPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCnBsb3QoWl92YWx1ZXNfQVstbGVuZ3RoKFpfdmFsdWVzX0EpXSwgWl92YWx1ZXNfQVstMV0sIG1haW49IlNjYXR0ZXIgRGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEEiLCB4bGFiPSJaaSIsIHlsYWI9IlppKzEiKQ0KDQpgYGANCmBgYHtyfQ0KcGxvdChaX3ZhbHVlc19CWy1sZW5ndGgoWl92YWx1ZXNfQildLCBaX3ZhbHVlc19CWy0xXSwgbWFpbj0iU2NhdHRlciBEaWFncmFtIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlppIiwgeWxhYj0iWmkrMSIpDQpgYGANCmBgYHtyfQ0KDQpjYXQoIlRoZSBmaXJzdCBwbG90IHNob3dzIGEgc2xpZ2h0IHBhdHRlcm4gd2hpbGUgdGhlIHNlY29uZCBwbG90IGlzIG1vc3RseSByYW5kb20uIFRoZXNlIHBsb3RzIHNob3cgdGhhdCB0aGUgZ2VuZXJhdG9ycyBhcmUgcHJvZHVjaW5nIHJhbmRvbSBudW1iZXIuIFRoaXMgaXMgYmVjYXVzZSBpZiB0aGUgZ2VuZXJhdG9ycyB3ZXJlIG5vdCBwcm9kdWNpbmcgcmFuZG9tIG51bWJlcnMsIHRoZXJlIHdvdWxkIGJlIHN0cm9uZ2VyIHBhdHRlcm5zIGluIGVpdGhlciBvZiB0aGUgc2NhdHRlcnBsb3RzLiIpDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChkKSBSYW5kb21uZXNzIG9mIGRlZmF1bHQgcmFuZG9tIGdlbmVyYXRvciBvZiBSIOKAkyBSdW4gcnVuaWYgY29tbWFuZCB0byBnZW5lcmF0ZSAxMDAgcmFuZG9tIG51bWJlcnMgYW5kIHBsb3QgdGhlIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGVzZSBudW1iZXJzICggdmFsdWVzIDEgYXBhcnQpIGFuZCBkaXNjdXNzIHlvdXIgb2JzZXJ2YXRpb25zIGFib3V0IHJhbmRvbW5lc3Mgb2YgdGhpcyByYW5kb20gZ2VuZXJhdG9yLiA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KcmFuZG9tbnVtYmVycyA8LSBydW5pZigxMDApDQoNCnBsb3QocmFuZG9tbnVtYmVyc1stMTAwXSwgcmFuZG9tbnVtYmVyc1stMV0sIHhsYWI9IlZhbHVlIGF0IGkiLCB5bGFiPSJWYWx1ZSBhdCBpKzEiLCBtYWluPSJTY2F0dGVyIERpYWdyYW0gb2YgUmFuZG9tIE51bWJlcnMgKDEgQXBhcnQpIikNCg0KYGBgDQpgYGB7cn0NCg0KY2F0KCJUaGVyZSBhcmUgbm90IG1hbnkgb2JzZXJ2YXRpb25zIHdlIGNhbiBtYWtlIGFib3V0IHRoaXMgc2NhdHRlcnBsb3Qgb3RoZXIgdGhhbiBpdCB2ZXJ5IHJhbmRvbS4gVGhpcyBpcyBhIGdyZWF0IGV4YW1wbGUgb2YgcmFuZG9tbmVzcyBhcyB0aGVyZSBpcyBubyBvYnNlcnZhYmxlIHBhdHRlcm4gb3Igc3RyZW5ndGggKHBvc3RpdmUgb3IgbmVnYXRpdmUpLiAiKQ0KDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChlKSBDb21wdXRlIHRoZSBtZWFuIHZhbHVlIG9mICRVX2kkIGFjcm9zcyB0aGUgcGVyaW9kPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNClogPC0gNQ0KWl92YWx1ZXNfQSA8LSBjKFopDQptX0EgPC0gMTYNCg0Kd2hpbGUgKFRSVUUpIHsNCiAgWiA8LSAoOSAqIFogKyAxKSAlJSBtX0ENCiAgaWYgKFogJWluJSBaX3ZhbHVlc19BKSB7DQogICAgYnJlYWsNCiAgfQ0KICBaX3ZhbHVlc19BIDwtIGMoWl92YWx1ZXNfQSwgWikNCn0NCg0KVV92YWx1ZXNfQSA8LSBaX3ZhbHVlc19BIC8gbV9BDQptZWFuIDwtIG1lYW4oVV92YWx1ZXNfQSkNCg0KY2F0KCJNZWFuIHZhbHVlIGFjcm9zcyB0aGUgcGVyaW9kOiAiLCBtZWFuKQ0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpoaXN0KFVfdmFsdWVzX0EsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBBIiwgeGxhYj0iVV9pIiwgcHJvYmFiaWxpdHk9VFJVRSkNCg0KYGBgDQpgYGB7cn0NCg0KaGlzdChVX3ZhbHVlc19CLCBicmVha3M9MjAsIG1haW49Ikhpc3RvZ3JhbSBvZiBVX2kgVmFsdWVzIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlVfaSIsIHByb2JhYmlsaXR5PVRSVUUpDQoNCmBgYA0KYGBge3J9DQoNCmNhdCgiQm90aCBnZW5lcmF0b3JzIHByb3ZpZGUgdW5pZm9ybSBoaXN0b2dyYW1zLiBHZW5lcmF0b3IgQiBsb29rcyBtb3JlIHVuaWZvcm0gdGhhbiBHZW5lcmF0b3IgQSBhcyBpdCBpcyBncm91cGVkIGJldHRlci4iKQ0KDQpgYGANCg0KDQojIFF1ZXN0aW9uIDQuIFVzaW5nIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBtZXRob2QNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXN0aW9uIDQuKGEpIERldmVsb3AgYW4gYWxnb3JpdGhtIGZvciB0aGUgcmFuZG9tIHZhcmlhYmxlIHdpdGggY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gRih4KSBiZWxvdy48L3NwYW4+DQoNClxbIEYoeCkgPSAxIC0gZV57LSh4L1xsYW1iZGEpXmt9IFxdDQoNCndoZXJlIFwoIHggXGdlcSAwIFwpLCBcKCBcbGFtYmRhIFxnZXEgMCBcKSwgYW5kIFwoIGsgXGdlcSAwIFwpLg0KDQpgYGB7cn0NCiMgQW5zd2VyIDRhDQojIFRoaXMgbWlnaHQgYmUgaGFyZCB0byBwcmludCB1c2luZyBSIC0geW91IGNhbiB3cml0ZSB0aGUgc3RlcCBpbiB5b3VyIG5vdGVib29rIGFuZCB0aGVuIGluY2x1ZGUgaW1hZ2UgaGVyZSAvIG9yIHlvdSBjYW4gaW5jbHVkZSBhcyBzZXBlcmF0ZSBmaWxlIHdoZW4gdXBsb2FkDQoNCiMgQ2hlY2sgaWYgdGhlIElSZGlzcGxheSBwYWNrYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkDQppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgIyBJZiBub3QgaW5zdGFsbGVkLCBpbnN0YWxsIGl0DQogIGluc3RhbGwucGFja2FnZXMoIklSZGlzcGxheSIpDQogIA0KICAjIExvYWQgdGhlIElSZGlzcGxheSBsaWJyYXJ5DQogIGxpYnJhcnkoSVJkaXNwbGF5KQ0KfSBlbHNlIHsNCiAgIyBJZiBhbHJlYWR5IGluc3RhbGxlZCwganVzdCBsb2FkIHRoZSBsaWJyYXJ5DQogIGxpYnJhcnkoSVJkaXNwbGF5KQ0KfQ0KDQoNCiMgRW1iZWQgYW4gaW1hZ2UNCiNkaXNwbGF5X3BuZyhmaWxlID0gImV4YW1wbGUucG5nIikNCg0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiA0IChiKSBVc2UgdGhlIGZpcnN0IHRocmVlIFVpIHZhbHVlcyBmcm9tIHBhcnQgKGEpIGFuZCBnZW5lcmF0b3IgW0FdIG9mIHByZXZpb3VzIHByb2JsZW0gdG8gY3JlYXRlIDMgdmFsdWVzIGZyb20gdGhlIHJhbmRvbSB2YXJpYWJsZSB3aGVuLCAkXGxhbWJkYSA9IDEkLCAk8J2RmCA9IDUkPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGMpIHNpbmcgUiBnZW5lcmF0ZSAxMCwwMDAgdmFsdWVzIGZyb20geW91ciBhbGdvcml0aG0gd2hlbiAgXGxhbWJkYSA9IDEgLCDwnZGYID0gNSAgYW5kIHBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIGRlbnNpdHkuIERpc2N1c3Mgd2hhdCBpbnNpZ2h0cyB5b3Ugb2J0YWluIHdoZW4geW91IGxvb2sgYXQgdGhlIHBsb3QgZ2VuZXJhdGVkIGhlcmUgdnMgdGhlIHBsb3QgeW91IGdlbmVyYXRlZCBpbiBxdWVzdGlvbiAzIChlKSA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCiMgUXVlc3Rpb24gNS4gRGV2ZWxvcCBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gaW4gUiB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHVuaWZvcm0gWzAsMV0gcmFuZG9tIG51bWJlcnMgdGhhdCBtdXN0IGJlIHN1bW1lZCB0byBnZXQgYSBzdW0gZ3JlYXRlciB0aGFuIDEuIFJ1biBhIHNpbmdsZSBzaW11bGF0aW9uIHdpdGggbiA9IDEwLDAwMCB0aW1lcyBhbmQgZmluZCB0aGUgbWVhbiBvZiB0aGUgbnVtYmVyIG9mIGNvdW50cy4gRG8geW91IHRoaW5rIHRoaXMgbnVtYmVyIGxvb2tzIHNvbWV3aGF0IGZhbWlsaWFyLiBFdmVyeSBzdHVkZW50IG1pZ2h0IGdldCBzbGlnaHRseSBkaWZmZXJlbnQgdmFsdWUgYW55IGlkZWFzIHdoeT8NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpzaW11bGF0aW9uIDwtIGZ1bmN0aW9uKCkgew0KICBzdW0gPC0gMA0KICBjb3VudCA8LSAwDQogIHdoaWxlIChzdW0gPD0gMSkgew0KICAgIHN1bSA8LSBzdW0gKyBydW5pZigxKQ0KICAgIGNvdW50IDwtIGNvdW50ICsgMQ0KICB9DQogIHJldHVybihjb3VudCkNCn0NCg0KbiA8LSAxMDAwMA0KcmVzdWx0cyA8LSByZXBsaWNhdGUobiwgc2ltdWxhdGlvbigpKQ0KDQoNCm1lYW5fY291bnQgPC0gbWVhbihyZXN1bHRzKQ0KDQpjYXQoIk1lYW4gbnVtYmVyIG9mIGNvdW50czogIiwgbWVhbl9jb3VudCwgIlxuIikNCmNhdCgiQW5zd2VycyB3aWxsIGJlIGRpZmZlcmVudCwgYmVjYXVzZSBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gaGFzIHJhbmRvbWx5IGdlbmVyYXRlZCBudW1iZXJzLCB0aGVyZWZvcmUgZXZlcnl0aW1lIHdlIHJ1biB0aGlzIGNvZGUgY2h1bmssIHdlIHdpbGwgZ2V0IGEgZGlmZmVyZW50IGFuc3dlci4iKQ0KDQpgYGANCg0KIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkNCg0KYGBge3J9DQojQW5zd2VyDQoNCmYgPC0gZnVuY3Rpb24oeCkgew0KICAxMCAqIHggKiAoMSAtIHgpDQp9DQoNCmcgPC0gZnVuY3Rpb24oeCkgew0KICAxDQp9DQoNCmMgPC0gMi41DQoNCmFjY2VwdHJlamVjdHNhbXBsZSA8LSBmdW5jdGlvbigpIHsNCiAgd2hpbGUoVFJVRSkgew0KICAgIFggPC0gcnVuaWYoMSkNCiAgICBVIDwtIHJ1bmlmKDEpDQogICAgaWYoVSA8PSBmKFgpIC8gKGMgKiBnKFgpKSkgew0KICAgICAgcmV0dXJuKFgpDQogICAgfQ0KICB9DQp9DQoNCnNhbXBsZSA8LSAxMDAwMA0Kc2FtcGxlcyA8LSByZXBsaWNhdGUoc2FtcGxlLCBhY2NlcHRyZWplY3RzYW1wbGUoKSkNCmhpc3Qoc2FtcGxlcywgbWFpbj0iSGlzdG9ncmFtIG9mIFNhbXBsZXMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwKQ0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChiKSA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg==