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 (a) Compute \(Z_i\) and \(U_i\) for values of \(i\) until a number is repeated, what is the period of both the generator? Provide your comments about the period of both RGN

#Answer 3a
#Generator A

Z_0_A <- 5
Z_values_A <- c(Z_0_A)
U_values_A <- c(Z_0_A / 16)

while(TRUE) {
  Z_next_A <- (9 * Z_values_A[length(Z_values_A)] + 1) %% 16
  if(Z_next_A %in% Z_values_A) break
  Z_values_A <- append(Z_values_A, Z_next_A)
  U_values_A <- append(U_values_A, Z_next_A / 16)
}


cat("Period of A: ", length(Z_values_A))
Period of A:  16
#Answer 3a
#Generator B

Z_0_B <- 10
Z_values_B <- c(Z_0_B)
U_values_B <- c(Z_0_B / 32)

while(TRUE) {
  Z_next_B <- (7 * Z_values_B[length(Z_values_B)] + 3) %% 32
  if(Z_next_B %in% Z_values_B) break
  Z_values_B <- append(Z_values_B, Z_next_B)
  U_values_B <- append(U_values_B, Z_next_B / 32)
}


cat("Period of B: ", length(Z_values_B))
Period of B:  8

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")
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). ")
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

Quesion 3 (f) By providing a plot of density (histogram) discuss the uniformity of both of the generators

#Answer

hist(U_values_A, breaks=20, main="Histogram of U_i Values for Generator A", xlab="U_i", probability=TRUE)


hist(U_values_B, breaks=20, main="Histogram of U_i Values for Generator B", xlab="U_i", probability=TRUE)


cat("Both generators provide uniform histograms. Generator B looks more uniform than Generator A as it is grouped better.")
Both generators provide uniform histograms. Generator B looks more uniform than Generator A as it is grouped better.

Question 4. Using the inverse transform method

Question 4.(a) Develop an algorithm for the random variable with cumulative distribution function F(x) below.

\[ F(x) = 1 - e^{-(x/\lambda)^k} \]

where \(x \geq 0\), \(\lambda \geq 0\), and \(k \geq 0\).

# Answer 4a
# This might be hard to print using R - you can write the step in your notebook and then include image here / or you can include as seperate file when upload

# Check if the IRdisplay package is already installed
if (!require(IRdisplay, quietly = TRUE)) {
  # If not installed, install it
  install.packages("IRdisplay")
  
  # Load the IRdisplay library
  library(IRdisplay)
} else {
  # If already installed, just load the library
  library(IRdisplay)
}


# Embed an image
#display_png(file = "example.png")

Quesion 4 (b) Use the first three Ui values from part (a) and generator [A] of previous problem to create 3 values from the random variable when, \(\lambda = 1\), \(𝑘 = 5\)

#Answer

Quesion 4 (c) sing R generate 10,000 values from your algorithm when = 1 , 𝑘 = 5 and plot a histogram of the density. Discuss what insights you obtain when you look at the plot generated here vs the plot you generated in question 3 (e)

#Answer

Question 5. Develop a Monte Carlo simulation in R that counts the number of uniform [0,1] random numbers that must be summed to get a sum greater than 1. Run a single simulation with n = 10,000 times and find the mean of the number of counts. Do you think this number looks somewhat familiar. Every student might get slightly different value any ideas why?

#Answer

simulation <- function() {
  sum <- 0
  count <- 0
  while (sum <= 1) {
    sum <- sum + runif(1)
    count <- count + 1
  }
  return(count)
}

n <- 10000
results <- replicate(n, simulation())


mean_count <- mean(results)

cat("Mean number of counts: ", mean_count, "\n")
Mean number of counts:  2.7119 
cat("Answers will be different, because a Monte Carlo simulation has randomly generated numbers, therefore everytime we run this code chunk, we will get a different answer.")
Answers will be different, because a Monte Carlo simulation has randomly generated numbers, therefore everytime we run this code chunk, we will get a different answer.

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)

Quesion 1 (b)

#Answer
LS0tDQp0aXRsZTogIiA8Y2VudGVyPjxzcGFuIHN0eWxlPSdjb2xvcjogYmx1ZTsnPiBJTkZTQ0kgMDMxMCBIVzMgPC9zcGFuPjwvY2VudGVyPiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyBRdWVzdGlvbiAxLiAgQ29uc2lkZXIgdGhlIEJpbm9taWFsIGRpc3RyaWJ1dGlvbiB3aXRoICRuID0gMjQkIGFuZCAkcCA9IC45JCB0aGF0IGlzIHVzZWQgdG8gbW9kZWwgdGhlIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyBvbiBhIHNhdGVsbGl0ZSBsaW5rIHRoYXQgdHJhbnNtaXRzIGRhdGEgaW4gJDI0JC1iaXQgYmxvY2tzLg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChhKSBQbG90IHRoZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGFuZCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBmb3IgdGhlIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czwvc3Bhbj4NCg0KYGBge3J9DQojQW5zd2VyIDFhDQoNCm4gPC0gMjQNCnAgPC0gLjkNCnggPC0gMDpuDQpkYmlub20oeCwgc2l6ZSA9IG4sIHByb2IgPSBwKQ0KDQpwbG90KHgsIGRiaW5vbSh4LCBzaXplID0gbiwgcHJvYiA9IHApLCBtYWluID0gIlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24oUERGKSIsDQogIHhsYWIgPSAiQ29ycmVjdGx5IFJlY2VpdmVkIEJpdHMiLA0KICB5bGFiID0gIlByb2JhYmlsaXR5IikNCg0KYGBgDQpgYGB7cn0NCiNBbnN3ZXIgMWENCnBiaW5vbSh4LCBzaXplID0gbiwgcHJvYiA9IHApDQoNCnBsb3QoeCwgcGJpbm9tKHgsIHNpemUgPSBuLCBwcm9iID0gcCksIG1haW4gPSAiQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24oQ0RGKSIsDQogICAgIHhsYWIgPSAiQ29ycmVjdGx5IFJlY2VpdmVkIEJpdHMiLA0KICAgICB5bGFiID0gIlByb2JhYmlsaXR5IikNCiAgICAgDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWINCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlDQojdmFyaWFibGVfbmFtZT0xMCANCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQ0KDQpuIDwtIDI0DQpwIDwtIC45DQoNCm1lYW4gPC0gbiAqIHANCg0KY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czogIiwgbWVhbikNCg0KYGBgDQpgYGB7cn0NCm4gPC0gMjQNCnAgPC0gLjkNCg0Kc3RkZXYgPC0gc3FydChuICogcCAqICgxLXApKQ0KDQpjYXQoIlN0YW5kYXJkIERldmlhdGlvbiBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0czogIiwgc3RkZXYpDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChjKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gJDMkLWJpdCBlcnJvcnMgaW4gdGhlIGJsb2NrIG9mICQyNCQ/PC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDFjDQpuIDwtIDI0DQpwIDwtIDAuOQ0KDQpwcm9iMjAgPC0gcGJpbm9tKDIwLCBzaXplID0gbiwgcHJvYiA9IHApDQpwcm9iZXJyb3IgPC0gMSAtIHByb2IyMA0KDQpjYXQoIlByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAzLWJpdCBlcnJvcnMgaW4gdGhlIGJsb2NrIG9mIDI0OiAiLCBwcm9iZXJyb3IpDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGQpIFdoYXQgaXMgdGhlIG1lZGlhbiBvZiB0aGlzIGRpc3RyaWJ1dGlvbj8gV2hhdCBjYW4geW91IGludGVycHJldCBmcm9tIHRoZSBtZWRpYW4gdmFsdWU/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAxZA0KDQpuIDwtIDI0DQpwIDwtIDAuOQ0KDQptZWRpYW4gPC0gMA0KZm9yIChpIGluIDA6bikgew0KICBpZihwYmlub20oaSwgc2l6ZSA9IG4sIHByb2IgPSBwKSA+PSAwLjUpIHsNCiAgICBtZWRpYW4gPC0gaQ0KICAgIGJyZWFrDQogIH0NCiAgDQp9DQoNCmNhdCgiVGhlIG1lZGlhbiB2YWx1ZSBmb3IgdGhpcyBkaXN0cmlidXRpb246ICIsIG1lZGlhbiwiLT4iLCAiIFRoZSBtZWRpYW4gaXMgdGhlIG1pZGRsZSB2YWx1ZSBpcyBhIHNldCBvZiBudW1iZXJzLiBJbiB0aGlzIGNhc2UgdGhlIG1lZGlhbiByZXByZXNlbnRzIHRoZSBtaWRkbGUgdmFsdWUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiAyNCBiaXQgYmxvY2tzLiIpDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWUNCg0KbiA8LSAyNA0KcCA8LSAwLjkNCg0KcXVhbnRpbGU2MCA8LSBxYmlub20oMC42LCBzaXplID0gbiwgcHJvYiA9IHApDQoNCmNhdCgiVGhlIDYwdGggUXVhcnRpbGUgb2YgdGhpcyBkaXN0cmlidXRpb246ICIsIHF1YW50aWxlNjAsICItPiIsICJUaGUgNjB0aCBxdWFydGlsZSByZXByZXNlbnRzIHRoYXQgNDAgcGUiICkNCg0KYGBgDQoNCiMgUXVlc3Rpb24yLiBUaGUgUHVibGljIFNlcnZpY2UgQW5zd2VyaW5nIFBvaW50IChQU0FQKSBpbiBTYW4gRnJhbmNpc2NvIGVtcGxveXMgJDE5JCBvcGVyYXRvcnMgaW4gJDgkLWhvdXIgc2hpZnRzIHRvIHByb2Nlc3MgJDkxMSQgY2FsbHMuIFRoZXJlIGFyZSBhdCBsZWFzdCAkNSQgb3BlcmF0b3JzIGFsd2F5cyBhbnN3ZXJpbmcgY2FsbHMuIFRoZSBudW1iZXIgb2YgY2FsbHMgcHJvY2Vzc2VkIHBlciBvcGVyYXRvciBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgd2l0aCByYXRlICRcbGFtYmRhXzAgPTIwJCBjYWxscyBwZXIgaG91ci4NCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYSkgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMjAgY2FsbHMgaW4gYW4gaG91cj8gUmVwZWF0IGZvciAzMCBjYWxscyBpbiBhbiBob3VyPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMmENCg0KbGFtYmRhMCA8LSAyMA0KDQpwcm9iMjAgPC0gZHBvaXMoMjAsIGxhbWJkYTApDQpwcm9iMzAgPC0gZHBvaXMoMzAsIGxhbWJkYTApDQoNCmNhdCgiUHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMjAgY2FsbHMgYW4gaG91cjogIiwgcHJvYjIwLCAiXG4iKQ0KY2F0KCJQcm9iYWJpbHR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDMwIGNhbGxzIGFuIGhvdXI6ICIsIHByb2IzMCkNCg0KDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYg0KDQpsYW1iZGEwIDwtIDIwDQpvcGVyYXRvcnMgPC0gMTANCmNhbGxzcGVyb3BlcmF0b3IgPC0gMjQNCg0KcHJvYjI0cGVyb3BlcmF0b3IgPC0gZHBvaXMoY2FsbHNwZXJvcGVyYXRvciwgbGFtYmRhMCkNCnByb2IxMG9wZXJhdG9ycyA8LSBwcm9iMjRwZXJvcGVyYXRvcl5vcGVyYXRvcnMNCg0KY2F0KCJUaGUgUHJvYmFiaWxpdHkgdGhhdCAxMCBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgMjQgY2FsbHMgZWFjaDogIiwgcHJvYjEwb3BlcmF0b3JzKQ0KDQoNCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYykgTm93LCBJZiB0aGUgYWdncmVnYXRlIGNhbGwgcmF0ZSBwZXIgaG91ciAkXGxhbWJkYV9jJCAsIGlzIG1lYXN1cmVkIGJ5ICRcbGFtYmRhX2MgPSA4NSQgY2FsbHMgcGVyIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMTAwJCBjYWxscyBpbiBhbiBob3VyPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDJjDQoNCmxhbWJkYUMgPC0gODUNCg0KcHJvYjEwMCA8LSBwcG9pcygxMDAsIGxhbWJkYUMpDQpwcm9iMTAwbW9yZSA8LSAxIC0gcHJvYjEwMA0KDQpjYXQoIlRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gMTAwIGNhbGxzICh3aGVuIExhbWJkYSA9IDg1KSBpczogIiwgcHJvYjEwMG1vcmUpDQoNCmBgYA0KDQojIFF1ZXN0aW9uIDMuIEZvciB0aGUgdHdvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJlbG93IEEgYW5kIEIoZG9u4oCZdCBmb3JnZXQgdG8gYWRkIHlvdXIgUiBjb2RlKQ0KIyMjIC0gW0FdIFwoWl9pID0gKDlaX3tpLTF9ICsgMSkgXG1vZCAxNlwpIHdpdGggXChaXzAgPSA1XCkuDQojIyMgLSBbQl0gXChaX2kgPSAoN1pfe2ktMX0gKyAzKSBcbW9kIDMyXCkgd2l0aCBcKFpfMCA9IDEwXCksDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoYSkgQ29tcHV0ZSAkWl9pJCBhbmQgJFVfaSQgZm9yIHZhbHVlcyBvZiAkaSQgdW50aWwgYSBudW1iZXIgaXMgcmVwZWF0ZWQsIHdoYXQgaXMgdGhlIHBlcmlvZCBvZiBib3RoIHRoZSBnZW5lcmF0b3I/IFByb3ZpZGUgeW91ciBjb21tZW50cyBhYm91dCB0aGUgcGVyaW9kIG9mIGJvdGggUkdOIDwvc3Bhbj4NCg0KYGBge3J9DQojQW5zd2VyIDNhDQojR2VuZXJhdG9yIEENCg0KWl8wX0EgPC0gNQ0KWl92YWx1ZXNfQSA8LSBjKFpfMF9BKQ0KVV92YWx1ZXNfQSA8LSBjKFpfMF9BIC8gMTYpDQoNCndoaWxlKFRSVUUpIHsNCiAgWl9uZXh0X0EgPC0gKDkgKiBaX3ZhbHVlc19BW2xlbmd0aChaX3ZhbHVlc19BKV0gKyAxKSAlJSAxNg0KICBpZihaX25leHRfQSAlaW4lIFpfdmFsdWVzX0EpIGJyZWFrDQogIFpfdmFsdWVzX0EgPC0gYXBwZW5kKFpfdmFsdWVzX0EsIFpfbmV4dF9BKQ0KICBVX3ZhbHVlc19BIDwtIGFwcGVuZChVX3ZhbHVlc19BLCBaX25leHRfQSAvIDE2KQ0KfQ0KDQoNCmNhdCgiUGVyaW9kIG9mIEE6ICIsIGxlbmd0aChaX3ZhbHVlc19BKSkNCmBgYA0KDQpgYGB7cn0NCiNBbnN3ZXIgM2ENCiNHZW5lcmF0b3IgQg0KDQpaXzBfQiA8LSAxMA0KWl92YWx1ZXNfQiA8LSBjKFpfMF9CKQ0KVV92YWx1ZXNfQiA8LSBjKFpfMF9CIC8gMzIpDQoNCndoaWxlKFRSVUUpIHsNCiAgWl9uZXh0X0IgPC0gKDcgKiBaX3ZhbHVlc19CW2xlbmd0aChaX3ZhbHVlc19CKV0gKyAzKSAlJSAzMg0KICBpZihaX25leHRfQiAlaW4lIFpfdmFsdWVzX0IpIGJyZWFrDQogIFpfdmFsdWVzX0IgPC0gYXBwZW5kKFpfdmFsdWVzX0IsIFpfbmV4dF9CKQ0KICBVX3ZhbHVlc19CIDwtIGFwcGVuZChVX3ZhbHVlc19CLCBaX25leHRfQiAvIDMyKQ0KfQ0KDQoNCmNhdCgiUGVyaW9kIG9mIEI6ICIsIGxlbmd0aChaX3ZhbHVlc19CKSkNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGIpIFdoaWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMgZWZmZWN0IHRoZSBwZXJpb2Qgb2YgTENHIOKAkyAkYSQsICRiJCwgJFpfMCQgPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIA0KY2F0KCJBbnN3ZXIiLCAiVGhlIHBhcmFtZXRlciBhLCBiLCBhbmQgeiIpDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChjKSBGb3IgYm90aCBnZW5lcmF0b3JzIHBsb3QgYSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlIFppIHZhbHVlcyAxIGFwYXJ0LiBXaGF0IGFyZSB5b3VyIG9ic2VydmF0aW9ucyBmcm9tIHRoZXNlIHBsb3RzPyBXaGF0IGRvIHlvdSB0aGluayBhYm91dCB0aGUgcHJvcGVydHkgb2YgcmFuZG9tbmVzcyBvZiB0aGVzZSBnZW5lcmF0b3JzPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCnBsb3QoWl92YWx1ZXNfQVstbGVuZ3RoKFpfdmFsdWVzX0EpXSwgWl92YWx1ZXNfQVstMV0sIG1haW49IlNjYXR0ZXIgRGlhZ3JhbSBmb3IgR2VuZXJhdG9yIEEiLCB4bGFiPSJaaSIsIHlsYWI9IlppKzEiKQ0KDQpgYGANCmBgYHtyfQ0KcGxvdChaX3ZhbHVlc19CWy1sZW5ndGgoWl92YWx1ZXNfQildLCBaX3ZhbHVlc19CWy0xXSwgbWFpbj0iU2NhdHRlciBEaWFncmFtIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlppIiwgeWxhYj0iWmkrMSIpDQpgYGANCmBgYHtyfQ0KDQpjYXQoIlRoZSBmaXJzdCBwbG90IHNob3dzIGEgc2xpZ2h0IHBhdHRlcm4gd2hpbGUgdGhlIHNlY29uZCBwbG90IGlzIG1vc3RseSByYW5kb20uIFRoZXNlIHBsb3RzIHNob3cgdGhhdCB0aGUgZ2VuZXJhdG9ycyBhcmUgcHJvZHVjaW5nIHJhbmRvbSBudW1iZXIuIFRoaXMgaXMgYmVjYXVzZSBpZiB0aGUgZ2VuZXJhdG9ycyB3ZXJlIG5vdCBwcm9kdWNpbmcgcmFuZG9tIG51bWJlcnMsIHRoZXJlIHdvdWxkIGJlIHN0cm9uZ2VyIHBhdHRlcm5zIGluIGVpdGhlciBvZiB0aGUgc2NhdHRlcnBsb3RzLiIpDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChkKSBSYW5kb21uZXNzIG9mIGRlZmF1bHQgcmFuZG9tIGdlbmVyYXRvciBvZiBSIOKAkyBSdW4gcnVuaWYgY29tbWFuZCB0byBnZW5lcmF0ZSAxMDAgcmFuZG9tIG51bWJlcnMgYW5kIHBsb3QgdGhlIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGVzZSBudW1iZXJzICggdmFsdWVzIDEgYXBhcnQpIGFuZCBkaXNjdXNzIHlvdXIgb2JzZXJ2YXRpb25zIGFib3V0IHJhbmRvbW5lc3Mgb2YgdGhpcyByYW5kb20gZ2VuZXJhdG9yLiA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KcmFuZG9tbnVtYmVycyA8LSBydW5pZigxMDApDQoNCnBsb3QocmFuZG9tbnVtYmVyc1stMTAwXSwgcmFuZG9tbnVtYmVyc1stMV0sIHhsYWI9IlZhbHVlIGF0IGkiLCB5bGFiPSJWYWx1ZSBhdCBpKzEiLCBtYWluPSJTY2F0dGVyIERpYWdyYW0gb2YgUmFuZG9tIE51bWJlcnMgKDEgQXBhcnQpIikNCg0KYGBgDQpgYGB7cn0NCg0KY2F0KCJUaGVyZSBhcmUgbm90IG1hbnkgb2JzZXJ2YXRpb25zIHdlIGNhbiBtYWtlIGFib3V0IHRoaXMgc2NhdHRlcnBsb3Qgb3RoZXIgdGhhbiBpdCB2ZXJ5IHJhbmRvbS4gVGhpcyBpcyBhIGdyZWF0IGV4YW1wbGUgb2YgcmFuZG9tbmVzcyBhcyB0aGVyZSBpcyBubyBvYnNlcnZhYmxlIHBhdHRlcm4gb3Igc3RyZW5ndGggKHBvc3RpdmUgb3IgbmVnYXRpdmUpLiAiKQ0KDQoNCmBgYA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChlKSBDb21wdXRlIHRoZSBtZWFuIHZhbHVlIG9mICRVX2kkIGFjcm9zcyB0aGUgcGVyaW9kPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNClogPC0gNQ0KWl92YWx1ZXNfQSA8LSBjKFopDQptX0EgPC0gMTYNCg0Kd2hpbGUgKFRSVUUpIHsNCiAgWiA8LSAoOSAqIFogKyAxKSAlJSBtX0ENCiAgaWYgKFogJWluJSBaX3ZhbHVlc19BKSB7DQogICAgYnJlYWsNCiAgfQ0KICBaX3ZhbHVlc19BIDwtIGMoWl92YWx1ZXNfQSwgWikNCn0NCg0KVV92YWx1ZXNfQSA8LSBaX3ZhbHVlc19BIC8gbV9BDQptZWFuIDwtIG1lYW4oVV92YWx1ZXNfQSkNCg0KY2F0KCJNZWFuIHZhbHVlIGFjcm9zcyB0aGUgcGVyaW9kOiAiLCBtZWFuKQ0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpoaXN0KFVfdmFsdWVzX0EsIGJyZWFrcz0yMCwgbWFpbj0iSGlzdG9ncmFtIG9mIFVfaSBWYWx1ZXMgZm9yIEdlbmVyYXRvciBBIiwgeGxhYj0iVV9pIiwgcHJvYmFiaWxpdHk9VFJVRSkNCg0KYGBgDQpgYGB7cn0NCg0KaGlzdChVX3ZhbHVlc19CLCBicmVha3M9MjAsIG1haW49Ikhpc3RvZ3JhbSBvZiBVX2kgVmFsdWVzIGZvciBHZW5lcmF0b3IgQiIsIHhsYWI9IlVfaSIsIHByb2JhYmlsaXR5PVRSVUUpDQoNCmBgYA0KYGBge3J9DQoNCmNhdCgiQm90aCBnZW5lcmF0b3JzIHByb3ZpZGUgdW5pZm9ybSBoaXN0b2dyYW1zLiBHZW5lcmF0b3IgQiBsb29rcyBtb3JlIHVuaWZvcm0gdGhhbiBHZW5lcmF0b3IgQSBhcyBpdCBpcyBncm91cGVkIGJldHRlci4iKQ0KDQpgYGANCg0KDQojIFF1ZXN0aW9uIDQuIFVzaW5nIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBtZXRob2QNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXN0aW9uIDQuKGEpIERldmVsb3AgYW4gYWxnb3JpdGhtIGZvciB0aGUgcmFuZG9tIHZhcmlhYmxlIHdpdGggY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gRih4KSBiZWxvdy48L3NwYW4+DQoNClxbIEYoeCkgPSAxIC0gZV57LSh4L1xsYW1iZGEpXmt9IFxdDQoNCndoZXJlIFwoIHggXGdlcSAwIFwpLCBcKCBcbGFtYmRhIFxnZXEgMCBcKSwgYW5kIFwoIGsgXGdlcSAwIFwpLg0KDQpgYGB7cn0NCiMgQW5zd2VyIDRhDQojIFRoaXMgbWlnaHQgYmUgaGFyZCB0byBwcmludCB1c2luZyBSIC0geW91IGNhbiB3cml0ZSB0aGUgc3RlcCBpbiB5b3VyIG5vdGVib29rIGFuZCB0aGVuIGluY2x1ZGUgaW1hZ2UgaGVyZSAvIG9yIHlvdSBjYW4gaW5jbHVkZSBhcyBzZXBlcmF0ZSBmaWxlIHdoZW4gdXBsb2FkDQoNCiMgQ2hlY2sgaWYgdGhlIElSZGlzcGxheSBwYWNrYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkDQppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgIyBJZiBub3QgaW5zdGFsbGVkLCBpbnN0YWxsIGl0DQogIGluc3RhbGwucGFja2FnZXMoIklSZGlzcGxheSIpDQogIA0KICAjIExvYWQgdGhlIElSZGlzcGxheSBsaWJyYXJ5DQogIGxpYnJhcnkoSVJkaXNwbGF5KQ0KfSBlbHNlIHsNCiAgIyBJZiBhbHJlYWR5IGluc3RhbGxlZCwganVzdCBsb2FkIHRoZSBsaWJyYXJ5DQogIGxpYnJhcnkoSVJkaXNwbGF5KQ0KfQ0KDQoNCiMgRW1iZWQgYW4gaW1hZ2UNCiNkaXNwbGF5X3BuZyhmaWxlID0gImV4YW1wbGUucG5nIikNCg0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiA0IChiKSBVc2UgdGhlIGZpcnN0IHRocmVlIFVpIHZhbHVlcyBmcm9tIHBhcnQgKGEpIGFuZCBnZW5lcmF0b3IgW0FdIG9mIHByZXZpb3VzIHByb2JsZW0gdG8gY3JlYXRlIDMgdmFsdWVzIGZyb20gdGhlIHJhbmRvbSB2YXJpYWJsZSB3aGVuLCAkXGxhbWJkYSA9IDEkLCAk8J2RmCA9IDUkPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGMpIHNpbmcgUiBnZW5lcmF0ZSAxMCwwMDAgdmFsdWVzIGZyb20geW91ciBhbGdvcml0aG0gd2hlbiAgXGxhbWJkYSA9IDEgLCDwnZGYID0gNSAgYW5kIHBsb3QgYSBoaXN0b2dyYW0gb2YgdGhlIGRlbnNpdHkuIERpc2N1c3Mgd2hhdCBpbnNpZ2h0cyB5b3Ugb2J0YWluIHdoZW4geW91IGxvb2sgYXQgdGhlIHBsb3QgZ2VuZXJhdGVkIGhlcmUgdnMgdGhlIHBsb3QgeW91IGdlbmVyYXRlZCBpbiBxdWVzdGlvbiAzIChlKSA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCiMgUXVlc3Rpb24gNS4gRGV2ZWxvcCBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gaW4gUiB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHVuaWZvcm0gWzAsMV0gcmFuZG9tIG51bWJlcnMgdGhhdCBtdXN0IGJlIHN1bW1lZCB0byBnZXQgYSBzdW0gZ3JlYXRlciB0aGFuIDEuIFJ1biBhIHNpbmdsZSBzaW11bGF0aW9uIHdpdGggbiA9IDEwLDAwMCB0aW1lcyBhbmQgZmluZCB0aGUgbWVhbiBvZiB0aGUgbnVtYmVyIG9mIGNvdW50cy4gRG8geW91IHRoaW5rIHRoaXMgbnVtYmVyIGxvb2tzIHNvbWV3aGF0IGZhbWlsaWFyLiBFdmVyeSBzdHVkZW50IG1pZ2h0IGdldCBzbGlnaHRseSBkaWZmZXJlbnQgdmFsdWUgYW55IGlkZWFzIHdoeT8NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpzaW11bGF0aW9uIDwtIGZ1bmN0aW9uKCkgew0KICBzdW0gPC0gMA0KICBjb3VudCA8LSAwDQogIHdoaWxlIChzdW0gPD0gMSkgew0KICAgIHN1bSA8LSBzdW0gKyBydW5pZigxKQ0KICAgIGNvdW50IDwtIGNvdW50ICsgMQ0KICB9DQogIHJldHVybihjb3VudCkNCn0NCg0KbiA8LSAxMDAwMA0KcmVzdWx0cyA8LSByZXBsaWNhdGUobiwgc2ltdWxhdGlvbigpKQ0KDQoNCm1lYW5fY291bnQgPC0gbWVhbihyZXN1bHRzKQ0KDQpjYXQoIk1lYW4gbnVtYmVyIG9mIGNvdW50czogIiwgbWVhbl9jb3VudCwgIlxuIikNCmNhdCgiQW5zd2VycyB3aWxsIGJlIGRpZmZlcmVudCwgYmVjYXVzZSBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gaGFzIHJhbmRvbWx5IGdlbmVyYXRlZCBudW1iZXJzLCB0aGVyZWZvcmUgZXZlcnl0aW1lIHdlIHJ1biB0aGlzIGNvZGUgY2h1bmssIHdlIHdpbGwgZ2V0IGEgZGlmZmVyZW50IGFuc3dlci4iKQ0KDQpgYGANCg0KIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkNCg0KYGBge3J9DQojQW5zd2VyDQoNCmYgPC0gZnVuY3Rpb24oeCkgew0KICAxMCAqIHggKiAoMSAtIHgpDQp9DQoNCmcgPC0gZnVuY3Rpb24oeCkgew0KICAxDQp9DQoNCmMgPC0gMi41DQoNCmFjY2VwdHJlamVjdHNhbXBsZSA8LSBmdW5jdGlvbigpIHsNCiAgd2hpbGUoVFJVRSkgew0KICAgIFggPC0gcnVuaWYoMSkNCiAgICBVIDwtIHJ1bmlmKDEpDQogICAgaWYoVSA8PSBmKFgpIC8gKGMgKiBnKFgpKSkgew0KICAgICAgcmV0dXJuKFgpDQogICAgfQ0KICB9DQp9DQoNCnNhbXBsZSA8LSAxMDAwMA0Kc2FtcGxlcyA8LSByZXBsaWNhdGUoc2FtcGxlLCBhY2NlcHRyZWplY3RzYW1wbGUoKSkNCmhpc3Qoc2FtcGxlcywgbWFpbj0iSGlzdG9ncmFtIG9mIFNhbXBsZXMiLCB4bGFiPSJ4IiwgYnJlYWtzPTUwKQ0KDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChiKSA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg==