Name: Ruowei Fischer

UCID: M14820974

Part 2A. Practice of modeling a binary response using logistic regression.

Create binary responses

Step 1. From now on, please work on the cleaned FAA data set you prepared by carrying out Steps 1-9 in Part 1 of the project. Create two binary variables below and attach them to your data set. long.landing = 1 if distance > 2500; =0 otherwise risky.landing = 1 if distance > 3000; =0 otherwise. Discard the continuous data you have for “distance”, and assume we are given the binary data of “long.landing” and “risky.landing” only.

Identifying important factors using the binary data of “long.landing”.

Step 2. Use a pie chart or a histogram to show the distribution of “long.landing”.
Step 3. Perform single-factor regression analysis for each of the potential risk factors, in a similar way to what you did in Steps 13-15 of Part 1. But here the response “long.landing” is binary. You may consider using logistic regression. Provide a table that ranks the factors from the most important to the least. This table contains 5 columns: the names of variables, the size of the regression coefficient, the odds ratio, the direction of the regression coefficient (positive or negative), and the p-value.

By the nature of long.landing value and risky.landing value, if it’s a risky landing, it must be a long landing, so I decided not to include the risky.landing variable in this regression analysis. Based on the regression summary statistics, we can see that speed_air and speed ground has significant impact on increasing the risk of being a long landing. Aircraft’s P value is very close to 0.05 threshold, but it still indicates that there may not be a significant impact.

Step 4. For those significant factors identified in Step 3, visualize its association with “long.landing”. See the slides (pp. 12-21) for Lecture 3.

Based on the three different plots above, we can see that when speed ground and speed air increase, the risk of having a long landing increase as well, especially when the speed passes 100-105 MPH.

Step 5. Based on the analysis results in Steps 3-4 and the collinearity result seen in Step 16 of Part 1, initiate a “full” model. Fit your model to the data and present your result.

The full model can be written as P(long.landing = 1) = exp(-52.89 + 0.52 * speed_air) / 1 + exp(-52.89 + 0.52 * speed_air). For every 1 unit increase in speed_air, the log-odds of a long landing increase by 0.52234, the higher speed_air is associated with a greater likelihood of a long landing. The odds ratio is 1.686, for every 1-unit increase in speed_air, the odds of a long landing are multiplied by approx. 1.686, a 68.6% increase in odds.

Part 2B. Steps 6 - 13 Data Cleaning and further exploration

Step 6. Use the R function “Step” to perform forward variable selection using AIC. Compare the result with the table obtained in Step 3. Are the results consistent?
model_null <- glm(long.landing ~ 1, data = FAA, family = binomial)
step_aic <- step(model_null, direction = "forward", scope = ~aircraft_num + no_pasg + speed_ground + speed_air + height + pitch + duration, family = binomial)
Start:  AIC=272.2
long.landing ~ 1

               Df Deviance     AIC
+ speed_air     1   94.155  98.155
+ speed_ground  1  105.304 109.304
+ aircraft_num  1  266.574 270.574
<none>             270.199 272.199
+ pitch         1  268.570 272.570
+ height        1  269.133 273.133
+ duration      1  269.935 273.935
+ no_pasg       1  270.169 274.169

Step:  AIC=98.15
long.landing ~ speed_air

               Df Deviance     AIC
+ aircraft_num  1   63.206  69.206
+ height        1   83.909  89.909
+ pitch         1   86.314  92.314
<none>              94.155  98.155
+ speed_ground  1   93.673  99.673
+ no_pasg       1   94.107 100.107
+ duration      1   94.153 100.153

Step:  AIC=69.21
long.landing ~ speed_air + aircraft_num

               Df Deviance    AIC
+ height        1   36.798 44.798
+ pitch         1   60.882 68.882
<none>              63.206 69.206
+ speed_ground  1   62.514 70.514
+ duration      1   62.570 70.570
+ no_pasg       1   63.047 71.047

Step:  AIC=44.8
long.landing ~ speed_air + aircraft_num + height

               Df Deviance    AIC
+ pitch         1   34.278 44.278
<none>              36.798 44.798
+ no_pasg       1   35.974 45.974
+ speed_ground  1   36.379 46.379
+ duration      1   36.704 46.704

Step:  AIC=44.28
long.landing ~ speed_air + aircraft_num + height + pitch

               Df Deviance    AIC
<none>              34.278 44.278
+ no_pasg       1   33.331 45.331
+ speed_ground  1   34.094 46.094
+ duration      1   34.162 46.162
summary(step_aic)

Call:
glm(formula = long.landing ~ speed_air + aircraft_num + height + 
    pitch, family = binomial, data = FAA)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -174.0912    47.8457  -3.639 0.000274 ***
speed_air       1.5923     0.4285   3.716 0.000203 ***
aircraft_num   -8.1444     2.3153  -3.518 0.000435 ***
height          0.3635     0.1142   3.184 0.001454 ** 
pitch           1.5957     1.0958   1.456 0.145327    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 270.199  on 194  degrees of freedom
Residual deviance:  34.278  on 190  degrees of freedom
AIC: 44.278

Number of Fisher Scoring iterations: 10

No, we get a different result with the step forward AIC. From the step forward AIC result we can see that it considered additional variables are potential significant factors to long landing. Compare with the table 3, it added aircraft, height, and pitch to be included in the model. Even though, pitch is not showing significant, however, the AIC score is lower than when it’s not included.

Step 7. Use the R function “Step” to perform forward variable selection using BIC. Compare the result with that from the previous step.
step_bic <- step(model_null, direction = "forward", scope = ~aircraft_num + no_pasg + speed_ground + speed_air + height + pitch + duration, family = binomial, k = log(nrow(FAA)))
Start:  AIC=275.47
long.landing ~ 1

               Df Deviance    AIC
+ speed_air     1   94.155 104.70
+ speed_ground  1  105.304 115.85
<none>             270.199 275.47
+ aircraft_num  1  266.574 277.12
+ pitch         1  268.570 279.12
+ height        1  269.133 279.68
+ duration      1  269.935 280.48
+ no_pasg       1  270.169 280.71

Step:  AIC=104.7
long.landing ~ speed_air

               Df Deviance     AIC
+ aircraft_num  1   63.206  79.025
+ height        1   83.909  99.728
+ pitch         1   86.314 102.133
<none>              94.155 104.701
+ speed_ground  1   93.673 109.492
+ no_pasg       1   94.107 109.926
+ duration      1   94.153 109.972

Step:  AIC=79.03
long.landing ~ speed_air + aircraft_num

               Df Deviance    AIC
+ height        1   36.798 57.890
<none>              63.206 79.025
+ pitch         1   60.882 81.974
+ speed_ground  1   62.514 83.606
+ duration      1   62.570 83.662
+ no_pasg       1   63.047 84.139

Step:  AIC=57.89
long.landing ~ speed_air + aircraft_num + height

               Df Deviance    AIC
<none>              36.798 57.890
+ pitch         1   34.278 60.643
+ no_pasg       1   35.974 62.339
+ speed_ground  1   36.379 62.744
+ duration      1   36.704 63.069
summary(step_bic)

Call:
glm(formula = long.landing ~ speed_air + aircraft_num + height, 
    family = binomial, data = FAA)

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -143.22264   34.95184  -4.098 4.17e-05 ***
speed_air       1.35748    0.32882   4.128 3.65e-05 ***
aircraft_num   -7.42305    1.97283  -3.763 0.000168 ***
height          0.32871    0.09986   3.292 0.000996 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 270.199  on 194  degrees of freedom
Residual deviance:  36.798  on 191  degrees of freedom
AIC: 44.798

Number of Fisher Scoring iterations: 10

In the BIC result, we can see that it took out the pitch variable. That’s because BIC is more conservative in selecting variables, it applies a heavier penalty for the model complexity.

Step 8. You are scheduled to meet with an FAA agent who wants to know “what are risk factors for long landings and how do they influence its occurrence?”. For your presentation, you are only allowed to show: One model, One table, No more than three figures, No more than five bullet statements. Please use statements that she can understand. The question is: what model/table/figures/statements would you include in your presentation. Be selective!
bic_coeff <- summary(step_bic)$coefficients
bic_odds_ratio <- exp(bic_coeff[, 1])  # Calculate odds ratios from BIC coefficients
bic_direction <- ifelse(bic_coeff[, 1] > 0, "Positive", "Negative")  # Direction based on coefficient sign
bic_p_value <- bic_coeff[, 4]  # P-values from BIC model

table_bic <- data.frame(
  Coefficient = bic_coeff[, 1],    # Coefficients from BIC model
  Odds_Ratio = bic_odds_ratio,     # Odds ratios from BIC model
  Direction = bic_direction,       # Direction (Positive or Negative)
  P_Value = bic_p_value           # P-values from BIC model
)

# Sort the BIC table by absolute value of coefficients (important variables at the top)
table_bic_sorted <- table_bic[order(abs(table_bic$P_Value), decreasing = FALSE), ]

print("BIC Model Table:")
[1] "BIC Model Table:"
print(table_bic_sorted)

The above table displayed a summary of the BIC model, ranking variables by importance. As we can see that the speed_air is the most siginificant factor variable.

The model I chose is based on the BIC: log(P(long.landing = 1) / 1 - P(long.landing=1)) = -143.22 + 1.35 * speed_air - 7.42 * aircraft_num + 0.33 * height.

library(ggplot2)

# Create predicted probabilities for different airspeeds
FAA$predicted_prob <- predict(step_bic, type = "response")

# Scatter plot with logistic regression curve
ggplot(FAA, aes(x = speed_air, y = long.landing)) +
  geom_jitter(height = 0.05, alpha = 0.5) +  # Add jitter for visibility
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "blue") +
  labs(title = "Effect of Airspeed on Long Landing Probability",
       x = "Airspeed",
       y = "Probability of Long Landing") +
  theme_minimal()

Figure 1: displayed the relationship between speed_air and long landing probability. We can see that when the speed_air increases, the probability of long landing increase as well.

ggplot(FAA, aes(x = factor(aircraft), fill = factor(long.landing))) +
  geom_bar(position = "fill") +  
  labs(title = "Long Landing Rate by Aircraft Type, (0 = No, 1 = Yes)",
       x = "Aircraft Type",
       y = "Proportion of Landings",
       fill = "Long Landing") +
  theme_minimal()

Figure 2: displayed aircraft type and long landing rate. I used a bar chart to show the proportion of long landings per aircraft type. We can see that boeing has more long landings than airbus.

ggplot(FAA, aes(x = height, y = long.landing)) +
  geom_jitter(height = 0.05, alpha = 0.5) +  
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "red") +
  labs(title = "Effect of Approach Height on Long Landing Probability",
       x = "Approach Height",
       y = "Probability of Long Landing") +
  theme_minimal()

Figure 3: displayed the relationship between height and probability of long landing. A smoothed curve illustrating how approach height influences long landing probability - when height increases, the probability of long landing increases as well.

To summarize, the 4 bullet points are:

  1. Higher airspeed significantly increases the likelihood of a long landing.

  2. Aircraft type is a strong predictor - some models have much lower risk, such as airbus.

  3. Approach height matters - higher altitudes lead to longer landing.

  4. Reducing airspeed and optimizing approach height can help mitigate long landing.

Identifying important factors using the binary data of “risky.landing”.

Step 9. Repeat Steps 1-7 but using “risky.landing” as the binary response.
#Calculate the frequency distribution of risky.landing
risky_landing_counts <- round(table(risky.landing)/length(risky.landing)*100,1)

# Label the pie chart slices
labels.risky <- paste(names(risky_landing_counts), ": ", risky_landing_counts,"%", sep = "")

# Create the pie chart
pie(
  risky_landing_counts,
  labels = labels.risky,
  main = "Distribution of risky Landing, (0 = No, 1 = Yes)",
  col = c("lightblue", "salmon") # Custom colors for 0 and 1
)

There are 30.8% of risky landing, and 69.2% of non-risky landing.

I have sorted the regression summary by how important each factor is. As we can see, speed_ground and speed_air are the two most significant factors in a risky landing. Aircraft has a P value of 0.073, which is greater than the 0.05 threshold, so it may not be an important factor. The rest of the P values are way larger than 0.05 threshold, so we can say that they are not important factors.

# Jitter plot for speed_ground vs. risky.landing
ggplot(FAA, aes(y = as.factor(risky.landing), x = speed_ground)) +
  geom_jitter(width = 0.2, aes(color = as.factor(risky.landing))) +
  labs(title = "Jitter Plot: Speed_Ground vs Risky Landing",
       x = "Speed Ground)",
       y = "Risky Landing (0 = No, 1 = Yes)") +
  scale_color_manual(values = c("blue", "red"), name = "Risky Landing") +
  theme_minimal()


# Jitter plot for speed_air vs. long.landing
ggplot(FAA, aes(y = as.factor(risky.landing), x = speed_air)) +
  geom_jitter(width = 0.2, aes(color = as.factor(risky.landing))) +
  labs(title = "Jitter Plot: Speed_Air vs Risky Landing",
       x = "Speed Air",
       y = "Risky Landing (0 = No, 1 = Yes)") +
  scale_color_manual(values = c("blue", "red"), name = "Risky Landing") +
  theme_minimal()

Jitter plots to show the relation between Speed_ground, speed_air vs Risky Landing.

# Histogram with density line for speed_ground by risky.landing
ggplot(FAA, aes(x = speed_ground, fill = as.factor(risky.landing), color = as.factor(risky.landing))) +
  geom_histogram(aes(y = ..density..), binwidth = 5, position = "identity", alpha = 0.5) +
  geom_density(alpha = 0.7) +
  labs(title = "Histogram and Density: Speed_Ground by Risky Landing, (0 = No, 1 = Yes)",
       x = "Speed Ground",
       y = "Density",
       fill = "Risky Landing",
       color = "Risky Landing") +
  scale_fill_manual(values = c("blue", "red")) +
  scale_color_manual(values = c("blue", "red")) +
  theme_minimal()


# Histogram with density line for speed_air by risky.landing
ggplot(FAA, aes(x = speed_air, fill = as.factor(risky.landing), color = as.factor(risky.landing))) +
  geom_histogram(aes(y = ..density..), binwidth = 5, position = "identity", alpha = 0.5) +
  geom_density(alpha = 0.7) +
  labs(title = "Histogram and Density: Speed_Air by Risky Landing, (0 = No, 1 = Yes)",
       x = "Speed Air",
       y = "Density",
       fill = "Risky Landing",
       color = "Risky Landing") +
  scale_fill_manual(values = c("blue", "red")) +
  scale_color_manual(values = c("blue", "red")) +
  theme_minimal()

Based on the two different plots above, we can see that when speed ground and speed air increase, the risk of having a long landing increase as well, especially when the speed passes 105-110 MPH.

library(faraway)
# Fit the full logistic regression model with speed_air
full_model2 <- glm(risky.landing ~ speed_air, 
                  data = FAA, 
                  family = binomial)

# View the summary of the model
summary(full_model2)

Call:
glm(formula = risky.landing ~ speed_air, family = binomial, data = FAA)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -91.4819    20.1681  -4.536 5.73e-06 ***
speed_air     0.8512     0.1876   4.536 5.72e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 240.72  on 194  degrees of freedom
Residual deviance:  44.19  on 193  degrees of freedom
AIC: 48.19

Number of Fisher Scoring iterations: 9
odds2 <- exp(coef(full_model2)["speed_air"])
paste("Oddes for a risky landing is ", odds2)
[1] "Oddes for a risky landing is  2.34249672689146"
#visualize fitted model
beta.full.model2 <- coef(full_model2)
plot(jitter(risky.landing, 0.1) ~ jitter(speed_air), FAA, xlab = "Speed Air", ylab = "Risky Landing", pch = ".")
curve(ilogit(beta.full.model2[1]+beta.full.model2[2]*x), add = TRUE)

Based on previous analysis, due to the collinearity, I omitted the speed_ground. The full model can be written as P(risky.landing = 1) = exp(-91.48 + 0.85 * speed_air) / 1 + exp(-91.48 + 0.85 * speed_air). For every 1 unit increase in speed_air, the log-odds of a risky landing increase by 0.85, the higher speed_air is associated with a greater likelihood of a risky landing. The odds ratio is 2.342, for every 1-unit increase in speed_air, the odds of a long landing are multiplied by approx. 2.342, a 134.2% increase in odds.

model_null2 <- glm(risky.landing ~ 1, data = FAA, family = binomial)
step_aic2 <- step(model_null2, direction = "forward", scope = ~aircraft_num + no_pasg + speed_ground + speed_air + height + pitch + duration, family = binomial)
Start:  AIC=242.72
risky.landing ~ 1

               Df Deviance     AIC
+ speed_air     1   44.190  48.190
+ speed_ground  1   57.971  61.971
+ aircraft_num  1  237.389 241.389
+ no_pasg       1  238.687 242.687
<none>             240.724 242.724
+ pitch         1  239.895 243.895
+ duration      1  240.648 244.648
+ height        1  240.657 244.657

Step:  AIC=48.19
risky.landing ~ speed_air

               Df Deviance    AIC
+ aircraft_num  1   26.281 32.281
+ pitch         1   40.006 46.006
<none>              44.190 48.190
+ no_pasg       1   43.512 49.512
+ speed_ground  1   43.591 49.591
+ height        1   43.778 49.778
+ duration      1   44.095 50.095

Step:  AIC=32.28
risky.landing ~ speed_air + aircraft_num

               Df Deviance    AIC
<none>              26.281 32.281
+ no_pasg       1   24.505 32.505
+ height        1   24.765 32.765
+ duration      1   25.252 33.252
+ pitch         1   25.422 33.422
+ speed_ground  1   26.264 34.264
summary(step_aic2)

Call:
glm(formula = risky.landing ~ speed_air + aircraft_num, family = binomial, 
    data = FAA)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -129.1675    32.4018  -3.986 6.71e-05 ***
speed_air       1.2206     0.3064   3.984 6.78e-05 ***
aircraft_num   -4.5499     1.5124  -3.008  0.00263 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 240.724  on 194  degrees of freedom
Residual deviance:  26.281  on 192  degrees of freedom
AIC: 32.281

Number of Fisher Scoring iterations: 9

From the step forward AIC, we see that even though the model we got with only speed_air as a significant factor, the AIC score dropped tremendously from 242 to 48, it seems the aircraft is another significant factor for a risky landing, a small P value shows it’s significance, and has a lower AIC score of 32.

step_bic2 <- step(model_null2, direction = "forward", scope = ~ aircraft_num + no_pasg + speed_ground + speed_air + height + pitch + duration, family = binomial, k = log(nrow(FAA)))
Start:  AIC=246
risky.landing ~ 1

               Df Deviance     AIC
+ speed_air     1   44.190  54.736
+ speed_ground  1   57.971  68.517
<none>             240.724 245.997
+ aircraft_num  1  237.389 247.935
+ no_pasg       1  238.687 249.233
+ pitch         1  239.895 250.441
+ duration      1  240.648 251.194
+ height        1  240.657 251.203

Step:  AIC=54.74
risky.landing ~ speed_air

               Df Deviance    AIC
+ aircraft_num  1   26.281 42.100
<none>              44.190 54.736
+ pitch         1   40.006 55.825
+ no_pasg       1   43.512 59.331
+ speed_ground  1   43.591 59.410
+ height        1   43.778 59.597
+ duration      1   44.095 59.914

Step:  AIC=42.1
risky.landing ~ speed_air + aircraft_num

               Df Deviance    AIC
<none>              26.281 42.100
+ no_pasg       1   24.505 45.597
+ height        1   24.765 45.857
+ duration      1   25.252 46.344
+ pitch         1   25.422 46.514
+ speed_ground  1   26.264 47.356
summary(step_bic2)

Call:
glm(formula = risky.landing ~ speed_air + aircraft_num, family = binomial, 
    data = FAA)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -129.1675    32.4018  -3.986 6.71e-05 ***
speed_air       1.2206     0.3064   3.984 6.78e-05 ***
aircraft_num   -4.5499     1.5124  -3.008  0.00263 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 240.724  on 194  degrees of freedom
Residual deviance:  26.281  on 192  degrees of freedom
AIC: 32.281

Number of Fisher Scoring iterations: 9

The BIC result seems to be the same compare to the AIC result, shows both speed_air and aircraft are the significant factors to a risky landing.

Step 10. You are scheduled to meet with an FAA agent who wants to know “what are risk factors for risky landings and how do they influence its occurrence?”. For your presentation, you are only allowed to show: One model, One table, No more than three figures, No more than five bullet statements. Please use statements that she can understand. The question is: what model/table/figures/statements would you include in your presentation. Be selective!
bic_coeff2 <- summary(step_bic2)$coefficients
bic_odds_ratio2 <- exp(bic_coeff2[, 1])  # Calculate odds ratios from BIC coefficients
bic_direction2 <- ifelse(bic_coeff2[, 1] > 0, "Positive", "Negative")  # Direction based on coefficient sign
bic_p_value2 <- bic_coeff2[, 4]  # P-values from BIC model

table_bic2 <- data.frame(
  Coefficient = bic_coeff2[, 1],    # Coefficients from BIC model
  Odds_Ratio = bic_odds_ratio2,     # Odds ratios from BIC model
  Direction = bic_direction2,       # Direction (Positive or Negative)
  P_Value = bic_p_value2           # P-values from BIC model
)

# Sort the BIC table by absolute value of coefficients (important variables at the top)
table_bic_sorted2 <- table_bic2[order(abs(table_bic2$P_Value), decreasing = FALSE), ]

print("BIC Model Table for Risky Landing:")
[1] "BIC Model Table for Risky Landing:"
print(table_bic_sorted2)

The above table displayed a summary of the BIC model, ranking variables by importance. As we can see that the speed_air is the most significant factor and aircraft is next.

The model I chose is based on the BIC: log(P(long.landing = 1) / 1 - P(long.landing=1)) = -129.17 + 1.22 * speed_air - 4.55 * aircraft_num.

# Create predicted probabilities for different airspeeds
FAA$predicted_prob2 <- predict(step_bic2, type = "response")

# Scatter plot with logistic regression curve
ggplot(FAA, aes(x = speed_air, y = risky.landing)) +
  geom_jitter(height = 0.05, alpha = 0.5) +  # Add jitter for visibility
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "blue") +
  labs(title = "Effect of Airspeed on Risky Landing Probability",
       x = "Airspeed",
       y = "Probability of Risky Landing") +
  theme_minimal()

Figure 1: displayed the relationship between speed_air and risky landing probability. We can see that when the speed_air increases, the probability of risky landing increase significantly.

ggplot(FAA, aes(x = factor(aircraft), fill = factor(risky.landing))) +
  geom_bar(position = "fill") +  
  labs(title = "Risky Landing Rate by Aircraft Type, (0 = No, 1 = Yes)",
       x = "Aircraft Type",
       y = "Proportion of Landings",
       fill = "Risky Landing") +
  theme_minimal()

Figure 2: displayed aircraft type and risky landing rate. I used a bar chart to show the proportion of risky landings per aircraft type. We can see that airbus is quite safer and has less risky landing compared to boeing.

To summarize, the 3 bullet points are:

  1. Faster landings significantly increase the risk of a risky landing.

  2. Certain aircraft types are safer, showing lower risk, such as Airbus.

  3. Reducing airspeed during landing could mitigate risks.

Compare the two models built for “long.landing” and “risky.landing”

Step 11. Use no more than three bullet statements to summarize the difference between the two models.
  1. Significant Factors: The “long landing” model includes three significant factors—speed_air, aircraft, and height—while the “risky landing” model only includes speed_air and aircraft.

  2. Criteria for Risk: A risky landing is always a long landing (i.e., the distance must be over 2500), but a long landing is not necessarily risky, as it requires a distance greater than 2500.

Step 12. Plot the ROC curve (sensitivity versus 1-specificity) for each model (see pp.32-33 in Lecture 4 slides). Draw the two curves in the same plot. Do you have any comment?
library(pROC)

# Fit the final models
final_long <- glm(long.landing ~ speed_air + aircraft_num + height, 
                   family = binomial, data = FAA)

final_risky <- glm(risky.landing ~ speed_air + aircraft_num, 
                    family = binomial, data = FAA)

# Predict probabilities for both models
final_long_pred <- predict(final_long, FAA, type = "response")
final_risky_pred <- predict(final_risky, FAA, type = "response")

# Compute ROC curves for both models
roc_final_long <- roc(FAA$long.landing, final_long_pred)
roc_final_risky <- roc(FAA$risky.landing, final_risky_pred)

# Plot the ROC curves
plot(roc_final_long, col = "blue", main = "ROC Curves for Final Models", lwd = 2)
lines(roc_final_risky, col = "red", lwd = 2)

# Add a legend
legend("bottomright", legend = c("Long Landing Model", "Risky Landing Model"), 
       col = c("blue", "red"), lwd = 2)

# Add AUC to the plot
auc_value_long <- auc(roc_final_long)
auc_value_risky <- auc(roc_final_risky)
legend("bottomleft", legend = c(paste("AUC (Long Landing) =", round(auc_value_long, 3)),
                                paste("AUC (Risky Landing) =", round(auc_value_risky, 3))),
       col = c("blue", "red"), lwd = 2)

The area under curve score is near 1.0, suggests that both models are able to correctly classify observations with high certainty.

Step 13. A commercial airplane is passing over the threshold of the runway, at this moment we have its basic information and measures of its airborne performance (Boeing, duration=200, no_pasg=80, speed_ground=115, speed_air=120, height=40, pitch=4). Predict its probability of being a long landing and a risky landing, respectively. Report the predicted probability as well as its 95% confidence interval.
# Define the input data for the new airplane observation
new_airplane <- data.frame(speed_air = 120,aircraft_num = 0,height = 40,pitch = 4,no_pasg = 80,duration = 200,speed_ground = 115)

# Predict the probability for long landing (final_long)

long_landing_pred <- predict(final_long, new_airplane, type = "response", se.fit = TRUE)

# Predict the probability for risky landing (final_risky)
risky_landing_pred <- predict(final_risky, new_airplane, type = "response", se.fit = TRUE)

# Calculate the 95% confidence intervals for both predictions
#long_landing_ci_lower <- round(ilogit(c(long_landing_pred$fit - 1.96 * long_landing_pred$se.fit)),3)
#long_landing_ci_upper <- round(ilogit(c(long_landing_pred$fit + 1.96 * long_landing_pred$se.fit)),3)
long_landing_ci_lower <- long_landing_pred$fit - 1.96 * long_landing_pred$se.fit
long_landing_ci_upper <- long_landing_pred$fit + 1.96 * long_landing_pred$se.fit

#risky_landing_ci_lower <- round(ilogit(c(risky_landing_pred$fit - 1.96 * risky_landing_pred$se.fit)),3)
#risky_landing_ci_upper <- round(ilogit(c(risky_landing_pred$fit + 1.96 * risky_landing_pred$se.fit)),3)
risky_landing_ci_lower <- risky_landing_pred$fit - 1.96 * risky_landing_pred$se.fit
risky_landing_ci_upper <- risky_landing_pred$fit + 1.96 * risky_landing_pred$se.fit

# Print the predicted probabilities and confidence intervals
cat("Predicted probability for Long Landing:\n")
Predicted probability for Long Landing:
cat("Probability: ", long_landing_pred$fit, "\n")
Probability:  1 
cat("95% CI: [", long_landing_ci_lower, ", ", long_landing_ci_upper, "]\n")
95% CI: [ 1 ,  1 ]
cat("\nPredicted probability for Risky Landing:\n")

Predicted probability for Risky Landing:
cat("Probability: ", risky_landing_pred$fit, "\n")
Probability:  1 
cat("95% CI: [", risky_landing_ci_lower, ", ", risky_landing_ci_upper, "]\n")
95% CI: [ 0.9999997 ,  1 ]

Since the given airplane has a speed_air of 120, which is way higher than 100-110 range, it increased the risk of having a long landing and a risk landing. Based on the analysis, the probability of having a long landing and risky landing is 100%. The 95% confidence interval is at 99.99, almost perfect.

LS0tCnRpdGxlOiAiQkFOQSA3MDQyIE1vZHVsZSAyIFByb2plY3QgUGFydCAyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBOYW1lOiBSdW93ZWkgRmlzY2hlcgoKIyMgVUNJRDogTTE0ODIwOTc0CgojIyBQYXJ0IDJBLiBQcmFjdGljZSBvZiBtb2RlbGluZyBhIGJpbmFyeSByZXNwb25zZSB1c2luZyBsb2dpc3RpYyByZWdyZXNzaW9uLgoKIyMjIENyZWF0ZSBiaW5hcnkgcmVzcG9uc2VzCgojIyMjIyBTdGVwIDEuIEZyb20gbm93IG9uLCBwbGVhc2Ugd29yayBvbiB0aGUgY2xlYW5lZCBGQUEgZGF0YSBzZXQgeW91IHByZXBhcmVkIGJ5IGNhcnJ5aW5nIG91dCBTdGVwcyAxLTkgaW4gUGFydCAxIG9mIHRoZSBwcm9qZWN0LiBDcmVhdGUgdHdvIGJpbmFyeSB2YXJpYWJsZXMgYmVsb3cgYW5kIGF0dGFjaCB0aGVtIHRvIHlvdXIgZGF0YSBzZXQuIGxvbmcubGFuZGluZyA9IDEgaWYgZGlzdGFuY2UgPiAyNTAwOyA9MCBvdGhlcndpc2Ugcmlza3kubGFuZGluZyA9IDEgaWYgZGlzdGFuY2UgPiAzMDAwOyA9MCBvdGhlcndpc2UuIERpc2NhcmQgdGhlIGNvbnRpbnVvdXMgZGF0YSB5b3UgaGF2ZSBmb3Ig4oCcZGlzdGFuY2XigJ0sIGFuZCBhc3N1bWUgd2UgYXJlIGdpdmVuIHRoZSBiaW5hcnkgZGF0YSBvZiDigJxsb25nLmxhbmRpbmfigJ0gYW5kIOKAnHJpc2t5LmxhbmRpbmfigJ0gb25seS4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CkZBQTEgPC0gcmVhZC5jc3YoIkZBQTEuY3N2IiwgaGVhZGVyID0gVFJVRSkKRkFBMiA8LSByZWFkLmNzdigiRkFBMi5jc3YiLCBoZWFkZXIgPSBUUlVFKQpGQUEyIDwtIEZBQTJbLWMoMTUxOjIwMCksIF0KRkFBIDwtIG1lcmdlKEZBQTEsIEZBQTIsIGJ5ID0gYygiYWlyY3JhZnQiLCJub19wYXNnIiwgInNwZWVkX2dyb3VuZCIsInNwZWVkX2FpciIsImhlaWdodCIsICJwaXRjaCIsICJkaXN0YW5jZSIpLCBhbGwgPSBUUlVFKQpGQUEkYWlyY3JhZnRfbnVtIDwtIGlmZWxzZShGQUEkYWlyY3JhZnQgPT0gImFpcmJ1cyIsIDEsIDApCkZBQTwtIHN1YnNldChGQUEsIGR1cmF0aW9uID4gNDApCiNyZW1vdmUgc3BlZWRfZ3JvdW5kIHRoYXQncyBsZXNzIHRoYW4gMzAgb3IgZ3JlYXRlciB0aGFuIDE0MApGQUE8LSBzdWJzZXQoRkFBLCBzcGVlZF9ncm91bmQgPj0zMCAmIHNwZWVkX2dyb3VuZCA8PTE0MCkKI3JlbW92ZSBzcGVlZF9haXIgdGhhdCdzIGxlc3MgdGhhbiAzMCBvciBncmVhdGVyIHRoYW4gMTQwCkZBQTwtIHN1YnNldChGQUEsIHNwZWVkX2FpciA+PTMwICYgc3BlZWRfZ3JvdW5kIDw9MTQwKQojcmVtb3ZlIGhlaWdodCB0aGF0J3MgbGVzcyB0aGFuIDYgbWV0ZXJzCkZBQTwtIHN1YnNldChGQUEsIGhlaWdodCA+PTYpCiNyZW1vdmUgZGlzdGFuY2UgdGhhdCdzIG92ZXIgNjAwMCBmZWV0CkZBQSA8LSBzdWJzZXQoRkFBLCBkaXN0YW5jZSA8IDYwMDApCiNleHBvcnQgdGhlIHdyYW5nbGVkIGRhdGEgdG8gY3N2IGZvcgp3cml0ZS5jc3YoRkFBLCAiRkFBX3dyYW5nbGVkLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQojY3JlYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzCkZBQSRsb25nLmxhbmRpbmcgPC0gaWZlbHNlKEZBQSRkaXN0YW5jZSA+IDI1MDAsIDEsIDApCkZBQSRyaXNreS5sYW5kaW5nIDwtIGlmZWxzZShGQUEkZGlzdGFuY2UgPiAzMDAwLCAxLCAwKQojZGlzY2FyZCB2YXJpYWJsZSBkaXN0YW5jZQpGQUEgPC0gRkFBWywgLTddCmF0dGFjaChGQUEpCmBgYAoKIyMjIElkZW50aWZ5aW5nIGltcG9ydGFudCBmYWN0b3JzIHVzaW5nIHRoZSBiaW5hcnkgZGF0YSBvZiDigJxsb25nLmxhbmRpbmfigJ0uCgojIyMjIyBTdGVwIDIuIFVzZSBhIHBpZSBjaGFydCBvciBhIGhpc3RvZ3JhbSB0byBzaG93IHRoZSBkaXN0cmlidXRpb24gb2Yg4oCcbG9uZy5sYW5kaW5n4oCdLgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBDYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgbG9uZy5sYW5kaW5nCmxvbmdfbGFuZGluZ19jb3VudHMgPC0gcm91bmQodGFibGUobG9uZy5sYW5kaW5nKS9sZW5ndGgobG9uZy5sYW5kaW5nKSoxMDAsMSkKCiMgTGFiZWwgdGhlIHBpZSBjaGFydCBzbGljZXMKbGFiZWxzIDwtIHBhc3RlKG5hbWVzKGxvbmdfbGFuZGluZ19jb3VudHMpLCAiOiAiLCBsb25nX2xhbmRpbmdfY291bnRzLCIlIiwgc2VwID0gIiIpCgojIENyZWF0ZSB0aGUgcGllIGNoYXJ0CnBpZSgKICBsb25nX2xhbmRpbmdfY291bnRzLAogIGxhYmVscyA9IGxhYmVscywKICBtYWluID0gIkRpc3RyaWJ1dGlvbiBvZiBMb25nIExhbmRpbmciLAogIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJzYWxtb24iKSAjIEN1c3RvbSBjb2xvcnMgZm9yIDAgYW5kIDEKKQpgYGAKCiMjIyMjIFN0ZXAgMy4gUGVyZm9ybSBzaW5nbGUtZmFjdG9yIHJlZ3Jlc3Npb24gYW5hbHlzaXMgZm9yIGVhY2ggb2YgdGhlIHBvdGVudGlhbCByaXNrIGZhY3RvcnMsIGluIGEgc2ltaWxhciB3YXkgdG8gd2hhdCB5b3UgZGlkIGluIFN0ZXBzIDEzLTE1IG9mIFBhcnQgMS4gQnV0IGhlcmUgdGhlIHJlc3BvbnNlIOKAnGxvbmcubGFuZGluZ+KAnSBpcyBiaW5hcnkuIFlvdSBtYXkgY29uc2lkZXIgdXNpbmcgbG9naXN0aWMgcmVncmVzc2lvbi4gUHJvdmlkZSBhIHRhYmxlIHRoYXQgcmFua3MgdGhlIGZhY3RvcnMgZnJvbSB0aGUgbW9zdCBpbXBvcnRhbnQgdG8gdGhlIGxlYXN0LiBUaGlzIHRhYmxlIGNvbnRhaW5zIDUgY29sdW1uczogdGhlIG5hbWVzIG9mIHZhcmlhYmxlcywgdGhlIHNpemUgb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQsIHRoZSBvZGRzIHJhdGlvLCB0aGUgZGlyZWN0aW9uIG9mIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSksIGFuZCB0aGUgcC12YWx1ZS4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoZHBseXIpCiMgTGlzdCBvZiBwcmVkaWN0b3JzCnByZWRpY3RvcnMgPC0gYygiYWlyY3JhZnRfbnVtIiwgIm5vX3Bhc2ciLCAic3BlZWRfZ3JvdW5kIiwgInNwZWVkX2FpciIsICJoZWlnaHQiLCAicGl0Y2giLCAiZHVyYXRpb24iKQojIEluaXRpYWxpemUgYW4gZW1wdHkgZGF0YSBmcmFtZSB0byBzdG9yZSByZXN1bHRzCnNpbmdsZV9yZWcgPC0gZGF0YS5mcmFtZSgKICBWYXJpYWJsZSA9IGNoYXJhY3RlcigpLAogIENvZWZmaWNpZW50ID0gbnVtZXJpYygpLAogIE9kZHNfUmF0aW8gPSBudW1lcmljKCksCiAgRGlyZWN0aW9uID0gY2hhcmFjdGVyKCksCiAgUF9WYWx1ZSA9IG51bWVyaWMoKSwKICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKKQojIFBlcmZvcm0gbG9naXN0aWMgcmVncmVzc2lvbiBmb3IgZWFjaCBwcmVkaWN0b3IKZm9yICh2YXIgaW4gcHJlZGljdG9ycykgewogICMgQnVpbGQgdGhlIGZvcm11bGEgZHluYW1pY2FsbHkKICBmb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoImxvbmcubGFuZGluZyB+IiwgdmFyKSkKICAjIEZpdCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsCiAgbW9kZWwgPC0gZ2xtKGZvcm11bGEsIGRhdGEgPSBGQUEsIGZhbWlseSA9IGJpbm9taWFsKQogICMgRXh0cmFjdCBjb2VmZmljaWVudHMgYW5kIHAtdmFsdWUKICBjb2VmX3ZhbHVlIDwtIGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDFdICAgICAgICMgUmVncmVzc2lvbiBjb2VmZmljaWVudAogIHBfdmFsdWUgPC0gKGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDRdKSAgICAgICAjIFAtdmFsdWUKICBvZGRzX3JhdGlvIDwtIHJvdW5kKGV4cChjb2VmX3ZhbHVlKSwgMykgICAgICAgICAgICAgICAgIyBPZGRzIHJhdGlvCiAgZGlyZWN0aW9uIDwtIGlmZWxzZShjb2VmX3ZhbHVlID4gMCwgIlBvc2l0aXZlIiwgIk5lZ2F0aXZlIikKICAjIEFwcGVuZCByZXN1bHRzIHRvIHRoZSBkYXRhIGZyYW1lCiAgc2luZ2xlX3JlZyA8LSByYmluZChzaW5nbGVfcmVnLCBkYXRhLmZyYW1lKAogICAgVmFyaWFibGUgPSB2YXIsCiAgICBDb2VmZmljaWVudCA9IGFicyhjb2VmX3ZhbHVlKSwgIyBVc2UgYWJzb2x1dGUgdmFsdWUgZm9yIHJhbmtpbmcKICAgIE9kZHNfUmF0aW8gPSBvZGRzX3JhdGlvLAogICAgRGlyZWN0aW9uID0gZGlyZWN0aW9uLAogICAgUF9WYWx1ZSA9IHBfdmFsdWUKICApKQp9CiMgUmFuayBmYWN0b3JzIGJ5IHRoZSBzaXplIG9mIHRoZSBjb2VmZmljaWVudApzaW5nbGVfcmVnIDwtIHNpbmdsZV9yZWcgJT4lIGFycmFuZ2UoUF9WYWx1ZSkKCiMgUHJpbnQgdGhlIHJlc3VsdHMKcHJpbnQoc2luZ2xlX3JlZykKYGBgCgpCeSB0aGUgbmF0dXJlIG9mIGxvbmcubGFuZGluZyB2YWx1ZSBhbmQgcmlza3kubGFuZGluZyB2YWx1ZSwgaWYgaXQncyBhIHJpc2t5IGxhbmRpbmcsIGl0IG11c3QgYmUgYSBsb25nIGxhbmRpbmcsIHNvIEkgZGVjaWRlZCBub3QgdG8gaW5jbHVkZSB0aGUgcmlza3kubGFuZGluZyB2YXJpYWJsZSBpbiB0aGlzIHJlZ3Jlc3Npb24gYW5hbHlzaXMuIEJhc2VkIG9uIHRoZSByZWdyZXNzaW9uIHN1bW1hcnkgc3RhdGlzdGljcywgd2UgY2FuIHNlZSB0aGF0IHNwZWVkX2FpciBhbmQgc3BlZWQgZ3JvdW5kIGhhcyBzaWduaWZpY2FudCBpbXBhY3Qgb24gaW5jcmVhc2luZyB0aGUgcmlzayBvZiBiZWluZyBhIGxvbmcgbGFuZGluZy4gQWlyY3JhZnQncyBQIHZhbHVlIGlzIHZlcnkgY2xvc2UgdG8gMC4wNSB0aHJlc2hvbGQsIGJ1dCBpdCBzdGlsbCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBtYXkgbm90IGJlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgoKIyMjIyMgU3RlcCA0LiBGb3IgdGhvc2Ugc2lnbmlmaWNhbnQgZmFjdG9ycyBpZGVudGlmaWVkIGluIFN0ZXAgMywgdmlzdWFsaXplIGl0cyBhc3NvY2lhdGlvbiB3aXRoIOKAnGxvbmcubGFuZGluZ+KAnS4gU2VlIHRoZSBzbGlkZXMgKHBwLiAxMi0yMSkgZm9yIExlY3R1cmUgMy4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnBsb3QobG9uZy5sYW5kaW5nIH4gc3BlZWRfZ3JvdW5kKQpwbG90KGxvbmcubGFuZGluZyB+IHNwZWVkX2FpcikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCgojIEppdHRlciBwbG90IGZvciBzcGVlZF9ncm91bmQgdnMuIGxvbmcubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeSA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpLCB4ID0gc3BlZWRfZ3JvdW5kKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhZXMoY29sb3IgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSkpICsKICBsYWJzKHRpdGxlID0gIkppdHRlciBQbG90OiBTcGVlZF9Hcm91bmQgdnMgTG9uZyBMYW5kaW5nIiwKICAgICAgIHggPSAiU3BlZWQgR3JvdW5kKSIsCiAgICAgICB5ID0gIkxvbmcgTGFuZGluZyAoMCA9IE5vLCAxID0gWWVzKSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSwgbmFtZSA9ICJMb25nIExhbmRpbmciKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIEppdHRlciBwbG90IGZvciBzcGVlZF9haXIgdnMuIGxvbmcubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeSA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpLCB4ID0gc3BlZWRfYWlyKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhZXMoY29sb3IgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSkpICsKICBsYWJzKHRpdGxlID0gIkppdHRlciBQbG90OiBTcGVlZF9BaXIgdnMgTG9uZyBMYW5kaW5nIiwKICAgICAgIHggPSAiU3BlZWQgQWlyIiwKICAgICAgIHkgPSAiTG9uZyBMYW5kaW5nICgwID0gTm8sIDEgPSBZZXMpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpLCBuYW1lID0gIkxvbmcgTGFuZGluZyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIEhpc3RvZ3JhbSB3aXRoIGRlbnNpdHkgbGluZSBmb3Igc3BlZWRfZ3JvdW5kIGJ5IGxvbmcubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeCA9IHNwZWVkX2dyb3VuZCwgZmlsbCA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpLCBjb2xvciA9IGFzLmZhY3Rvcihsb25nLmxhbmRpbmcpKSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IDUsIHBvc2l0aW9uID0gImlkZW50aXR5IiwgYWxwaGEgPSAwLjUpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsKICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBhbmQgRGVuc2l0eTogU3BlZWRfR3JvdW5kIGJ5IExvbmcgTGFuZGluZyIsCiAgICAgICB4ID0gIlNwZWVkIEdyb3VuZCIsCiAgICAgICB5ID0gIkRlbnNpdHkiLAogICAgICAgZmlsbCA9ICJMb25nIExhbmRpbmciLAogICAgICAgY29sb3IgPSAiTG9uZyBMYW5kaW5nIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSkgKwogIHRoZW1lX21pbmltYWwoKQoKIyBIaXN0b2dyYW0gd2l0aCBkZW5zaXR5IGxpbmUgZm9yIHNwZWVkX2FpciBieSBsb25nLmxhbmRpbmcKZ2dwbG90KEZBQSwgYWVzKHggPSBzcGVlZF9haXIsIGZpbGwgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSwgY29sb3IgPSBhcy5mYWN0b3IobG9uZy5sYW5kaW5nKSkpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSA1LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gYW5kIERlbnNpdHk6IFNwZWVkX0FpciBieSBMb25nIExhbmRpbmciLAogICAgICAgeCA9ICJTcGVlZCBBaXIiLAogICAgICAgeSA9ICJEZW5zaXR5IiwKICAgICAgIGZpbGwgPSAiTG9uZyBMYW5kaW5nIiwKICAgICAgIGNvbG9yID0gIkxvbmcgTGFuZGluZyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKQmFzZWQgb24gdGhlIHRocmVlIGRpZmZlcmVudCBwbG90cyBhYm92ZSwgd2UgY2FuIHNlZSB0aGF0IHdoZW4gc3BlZWQgZ3JvdW5kIGFuZCBzcGVlZCBhaXIgaW5jcmVhc2UsIHRoZSByaXNrIG9mIGhhdmluZyBhIGxvbmcgbGFuZGluZyBpbmNyZWFzZSBhcyB3ZWxsLCBlc3BlY2lhbGx5IHdoZW4gdGhlIHNwZWVkIHBhc3NlcyAxMDAtMTA1IE1QSC4KCiMjIyMjIFN0ZXAgNS4gQmFzZWQgb24gdGhlIGFuYWx5c2lzIHJlc3VsdHMgaW4gU3RlcHMgMy00IGFuZCB0aGUgY29sbGluZWFyaXR5IHJlc3VsdCBzZWVuIGluIFN0ZXAgMTYgb2YgUGFydCAxLCBpbml0aWF0ZSBhIOKAnGZ1bGzigJ0gbW9kZWwuIEZpdCB5b3VyIG1vZGVsIHRvIHRoZSBkYXRhIGFuZCBwcmVzZW50IHlvdXIgcmVzdWx0LgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShmYXJhd2F5KQojIEZpdCB0aGUgZnVsbCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdpdGggc3BlZWRfYWlyCmZ1bGxfbW9kZWwgPC0gZ2xtKGxvbmcubGFuZGluZyB+IHNwZWVkX2FpciwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBGQUEsIAogICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCkKCiMgVmlldyB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeShmdWxsX21vZGVsKQpvZGRzIDwtIGV4cChjb2VmKGZ1bGxfbW9kZWwpWyJzcGVlZF9haXIiXSkKcGFzdGUoIk9kZGVzIGlzIGZvciBhIGxvbmcgbGFuZGluZyBpcyAiLCBvZGRzKQoKI3Zpc3VhbGl6ZSBmaXR0ZWQgbW9kZWwKYmV0YS5mdWxsLm1vZGVsIDwtIGNvZWYoZnVsbF9tb2RlbCkKcGxvdChqaXR0ZXIobG9uZy5sYW5kaW5nLCAwLjEpIH4gaml0dGVyKHNwZWVkX2FpciksIEZBQSwgeGxhYiA9ICJTcGVlZCBBaXIiLCB5bGFiID0gIkxvbmcgTGFuZGluZyIsIHBjaCA9ICIuIikKY3VydmUoaWxvZ2l0KGJldGEuZnVsbC5tb2RlbFsxXStiZXRhLmZ1bGwubW9kZWxbMl0qeCksIGFkZCA9IFRSVUUpCmBgYAoKVGhlIGZ1bGwgbW9kZWwgY2FuIGJlIHdyaXR0ZW4gYXMgUChsb25nLmxhbmRpbmcgPSAxKSA9IGV4cCgtNTIuODkgKyAwLjUyICogc3BlZWRfYWlyKSAvIDEgKyBleHAoLTUyLjg5ICsgMC41MiAqIHNwZWVkX2FpcikuIEZvciBldmVyeSAxIHVuaXQgaW5jcmVhc2UgaW4gc3BlZWRfYWlyLCB0aGUgbG9nLW9kZHMgb2YgYSBsb25nIGxhbmRpbmcgaW5jcmVhc2UgYnkgMC41MjIzNCwgdGhlIGhpZ2hlciBzcGVlZF9haXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZ3JlYXRlciBsaWtlbGlob29kIG9mIGEgbG9uZyBsYW5kaW5nLiBUaGUgb2RkcyByYXRpbyBpcyAxLjY4NiwgZm9yIGV2ZXJ5IDEtdW5pdCBpbmNyZWFzZSBpbiBzcGVlZF9haXIsIHRoZSBvZGRzIG9mIGEgbG9uZyBsYW5kaW5nIGFyZSBtdWx0aXBsaWVkIGJ5IGFwcHJveC4gMS42ODYsIGEgNjguNiUgaW5jcmVhc2UgaW4gb2Rkcy4KCiMjIFBhcnQgMkIuIFN0ZXBzIDYgLSAxMyBEYXRhIENsZWFuaW5nIGFuZCBmdXJ0aGVyIGV4cGxvcmF0aW9uCgojIyMjIyBTdGVwIDYuIFVzZSB0aGUgUiBmdW5jdGlvbiDigJxTdGVw4oCdIHRvIHBlcmZvcm0gZm9yd2FyZCB2YXJpYWJsZSBzZWxlY3Rpb24gdXNpbmcgQUlDLiBDb21wYXJlIHRoZSByZXN1bHQgd2l0aCB0aGUgdGFibGUgb2J0YWluZWQgaW4gU3RlcCAzLiBBcmUgdGhlIHJlc3VsdHMgY29uc2lzdGVudD8KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1vZGVsX251bGwgPC0gZ2xtKGxvbmcubGFuZGluZyB+IDEsIGRhdGEgPSBGQUEsIGZhbWlseSA9IGJpbm9taWFsKQpzdGVwX2FpYyA8LSBzdGVwKG1vZGVsX251bGwsIGRpcmVjdGlvbiA9ICJmb3J3YXJkIiwgc2NvcGUgPSB+YWlyY3JhZnRfbnVtICsgbm9fcGFzZyArIHNwZWVkX2dyb3VuZCArIHNwZWVkX2FpciArIGhlaWdodCArIHBpdGNoICsgZHVyYXRpb24sIGZhbWlseSA9IGJpbm9taWFsKQpzdW1tYXJ5KHN0ZXBfYWljKQpgYGAKCk5vLCB3ZSBnZXQgYSBkaWZmZXJlbnQgcmVzdWx0IHdpdGggdGhlIHN0ZXAgZm9yd2FyZCBBSUMuIEZyb20gdGhlIHN0ZXAgZm9yd2FyZCBBSUMgcmVzdWx0IHdlIGNhbiBzZWUgdGhhdCBpdCBjb25zaWRlcmVkIGFkZGl0aW9uYWwgdmFyaWFibGVzIGFyZSBwb3RlbnRpYWwgc2lnbmlmaWNhbnQgZmFjdG9ycyB0byBsb25nIGxhbmRpbmcuIENvbXBhcmUgd2l0aCB0aGUgdGFibGUgMywgaXQgYWRkZWQgYWlyY3JhZnQsIGhlaWdodCwgYW5kIHBpdGNoIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbC4gRXZlbiB0aG91Z2gsIHBpdGNoIGlzIG5vdCBzaG93aW5nIHNpZ25pZmljYW50LCBob3dldmVyLCB0aGUgQUlDIHNjb3JlIGlzIGxvd2VyIHRoYW4gd2hlbiBpdCdzIG5vdCBpbmNsdWRlZC4gCgojIyMjIyBTdGVwIDcuIFVzZSB0aGUgUiBmdW5jdGlvbiDigJxTdGVw4oCdIHRvIHBlcmZvcm0gZm9yd2FyZCB2YXJpYWJsZSBzZWxlY3Rpb24gdXNpbmcgQklDLiBDb21wYXJlIHRoZSByZXN1bHQgd2l0aCB0aGF0IGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdGVwX2JpYyA8LSBzdGVwKG1vZGVsX251bGwsIGRpcmVjdGlvbiA9ICJmb3J3YXJkIiwgc2NvcGUgPSB+YWlyY3JhZnRfbnVtICsgbm9fcGFzZyArIHNwZWVkX2dyb3VuZCArIHNwZWVkX2FpciArIGhlaWdodCArIHBpdGNoICsgZHVyYXRpb24sIGZhbWlseSA9IGJpbm9taWFsLCBrID0gbG9nKG5yb3coRkFBKSkpCnN1bW1hcnkoc3RlcF9iaWMpCmBgYAoKSW4gdGhlIEJJQyByZXN1bHQsIHdlIGNhbiBzZWUgdGhhdCBpdCB0b29rIG91dCB0aGUgcGl0Y2ggdmFyaWFibGUuIFRoYXQncyBiZWNhdXNlIEJJQyBpcyBtb3JlIGNvbnNlcnZhdGl2ZSBpbiBzZWxlY3RpbmcgdmFyaWFibGVzLCBpdCBhcHBsaWVzIGEgaGVhdmllciBwZW5hbHR5IGZvciB0aGUgbW9kZWwgY29tcGxleGl0eS4KCiMjIyMjIFN0ZXAgOC4gWW91IGFyZSBzY2hlZHVsZWQgdG8gbWVldCB3aXRoIGFuIEZBQSBhZ2VudCB3aG8gd2FudHMgdG8ga25vdyDigJx3aGF0IGFyZSByaXNrIGZhY3RvcnMgZm9yIGxvbmcgbGFuZGluZ3MgYW5kIGhvdyBkbyB0aGV5IGluZmx1ZW5jZSBpdHMgb2NjdXJyZW5jZT/igJ0uIEZvciB5b3VyIHByZXNlbnRhdGlvbiwgeW91IGFyZSBvbmx5IGFsbG93ZWQgdG8gc2hvdzogT25lIG1vZGVsLCBPbmUgdGFibGUsIE5vIG1vcmUgdGhhbiB0aHJlZSBmaWd1cmVzLCBObyBtb3JlIHRoYW4gZml2ZSBidWxsZXQgc3RhdGVtZW50cy4gUGxlYXNlIHVzZSBzdGF0ZW1lbnRzIHRoYXQgc2hlIGNhbiB1bmRlcnN0YW5kLiBUaGUgcXVlc3Rpb24gaXM6IHdoYXQgbW9kZWwvdGFibGUvZmlndXJlcy9zdGF0ZW1lbnRzIHdvdWxkIHlvdSBpbmNsdWRlIGluIHlvdXIgcHJlc2VudGF0aW9uLiBCZSBzZWxlY3RpdmUhCgpgYGB7cn0KYmljX2NvZWZmIDwtIHN1bW1hcnkoc3RlcF9iaWMpJGNvZWZmaWNpZW50cwpiaWNfb2Rkc19yYXRpbyA8LSBleHAoYmljX2NvZWZmWywgMV0pICAjIENhbGN1bGF0ZSBvZGRzIHJhdGlvcyBmcm9tIEJJQyBjb2VmZmljaWVudHMKYmljX2RpcmVjdGlvbiA8LSBpZmVsc2UoYmljX2NvZWZmWywgMV0gPiAwLCAiUG9zaXRpdmUiLCAiTmVnYXRpdmUiKSAgIyBEaXJlY3Rpb24gYmFzZWQgb24gY29lZmZpY2llbnQgc2lnbgpiaWNfcF92YWx1ZSA8LSBiaWNfY29lZmZbLCA0XSAgIyBQLXZhbHVlcyBmcm9tIEJJQyBtb2RlbAoKdGFibGVfYmljIDwtIGRhdGEuZnJhbWUoCiAgQ29lZmZpY2llbnQgPSBiaWNfY29lZmZbLCAxXSwgICAgIyBDb2VmZmljaWVudHMgZnJvbSBCSUMgbW9kZWwKICBPZGRzX1JhdGlvID0gYmljX29kZHNfcmF0aW8sICAgICAjIE9kZHMgcmF0aW9zIGZyb20gQklDIG1vZGVsCiAgRGlyZWN0aW9uID0gYmljX2RpcmVjdGlvbiwgICAgICAgIyBEaXJlY3Rpb24gKFBvc2l0aXZlIG9yIE5lZ2F0aXZlKQogIFBfVmFsdWUgPSBiaWNfcF92YWx1ZSAgICAgICAgICAgIyBQLXZhbHVlcyBmcm9tIEJJQyBtb2RlbAopCgojIFNvcnQgdGhlIEJJQyB0YWJsZSBieSBhYnNvbHV0ZSB2YWx1ZSBvZiBjb2VmZmljaWVudHMgKGltcG9ydGFudCB2YXJpYWJsZXMgYXQgdGhlIHRvcCkKdGFibGVfYmljX3NvcnRlZCA8LSB0YWJsZV9iaWNbb3JkZXIoYWJzKHRhYmxlX2JpYyRQX1ZhbHVlKSwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXQoKcHJpbnQoIkJJQyBNb2RlbCBUYWJsZToiKQpwcmludCh0YWJsZV9iaWNfc29ydGVkKQpgYGAKVGhlIGFib3ZlIHRhYmxlIGRpc3BsYXllZCBhIHN1bW1hcnkgb2YgdGhlIEJJQyBtb2RlbCwgcmFua2luZyB2YXJpYWJsZXMgYnkgaW1wb3J0YW5jZS4gQXMgd2UgY2FuIHNlZSB0aGF0IHRoZSBzcGVlZF9haXIgaXMgdGhlIG1vc3Qgc2lnaW5pZmljYW50IGZhY3RvciB2YXJpYWJsZS4KClRoZSBtb2RlbCBJIGNob3NlIGlzIGJhc2VkIG9uIHRoZSBCSUM6IGxvZyhQKGxvbmcubGFuZGluZyA9IDEpIC8gMSAtIFAobG9uZy5sYW5kaW5nPTEpKSA9IC0xNDMuMjIgKyAxLjM1ICogc3BlZWRfYWlyIC0gNy40MiAqIGFpcmNyYWZ0X251bSArIDAuMzMgKiBoZWlnaHQuCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKIyBDcmVhdGUgcHJlZGljdGVkIHByb2JhYmlsaXRpZXMgZm9yIGRpZmZlcmVudCBhaXJzcGVlZHMKRkFBJHByZWRpY3RlZF9wcm9iIDwtIHByZWRpY3Qoc3RlcF9iaWMsIHR5cGUgPSAicmVzcG9uc2UiKQoKIyBTY2F0dGVyIHBsb3Qgd2l0aCBsb2dpc3RpYyByZWdyZXNzaW9uIGN1cnZlCmdncGxvdChGQUEsIGFlcyh4ID0gc3BlZWRfYWlyLCB5ID0gbG9uZy5sYW5kaW5nKSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC41KSArICAjIEFkZCBqaXR0ZXIgZm9yIHZpc2liaWxpdHkKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiRWZmZWN0IG9mIEFpcnNwZWVkIG9uIExvbmcgTGFuZGluZyBQcm9iYWJpbGl0eSIsCiAgICAgICB4ID0gIkFpcnNwZWVkIiwKICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgb2YgTG9uZyBMYW5kaW5nIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCkZpZ3VyZSAxOiBkaXNwbGF5ZWQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNwZWVkX2FpciBhbmQgbG9uZyBsYW5kaW5nIHByb2JhYmlsaXR5LiBXZSBjYW4gc2VlIHRoYXQgd2hlbiB0aGUgc3BlZWRfYWlyIGluY3JlYXNlcywgdGhlIHByb2JhYmlsaXR5IG9mIGxvbmcgbGFuZGluZyBpbmNyZWFzZSBhcyB3ZWxsLgoKYGBge3J9CmdncGxvdChGQUEsIGFlcyh4ID0gZmFjdG9yKGFpcmNyYWZ0KSwgZmlsbCA9IGZhY3Rvcihsb25nLmxhbmRpbmcpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArICAKICBsYWJzKHRpdGxlID0gIkxvbmcgTGFuZGluZyBSYXRlIGJ5IEFpcmNyYWZ0IFR5cGUsICgwID0gTm8sIDEgPSBZZXMpIiwKICAgICAgIHggPSAiQWlyY3JhZnQgVHlwZSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgTGFuZGluZ3MiLAogICAgICAgZmlsbCA9ICJMb25nIExhbmRpbmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKRmlndXJlIDI6IGRpc3BsYXllZCBhaXJjcmFmdCB0eXBlIGFuZCBsb25nIGxhbmRpbmcgcmF0ZS4gSSB1c2VkIGEgYmFyIGNoYXJ0IHRvIHNob3cgdGhlIHByb3BvcnRpb24gb2YgbG9uZyBsYW5kaW5ncyBwZXIgYWlyY3JhZnQgdHlwZS4gV2UgY2FuIHNlZSB0aGF0IGJvZWluZyBoYXMgbW9yZSBsb25nIGxhbmRpbmdzIHRoYW4gYWlyYnVzLgoKYGBge3J9CmdncGxvdChGQUEsIGFlcyh4ID0gaGVpZ2h0LCB5ID0gbG9uZy5sYW5kaW5nKSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC41KSArICAKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJyZWQiKSArCiAgbGFicyh0aXRsZSA9ICJFZmZlY3Qgb2YgQXBwcm9hY2ggSGVpZ2h0IG9uIExvbmcgTGFuZGluZyBQcm9iYWJpbGl0eSIsCiAgICAgICB4ID0gIkFwcHJvYWNoIEhlaWdodCIsCiAgICAgICB5ID0gIlByb2JhYmlsaXR5IG9mIExvbmcgTGFuZGluZyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpGaWd1cmUgMzogZGlzcGxheWVkIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBoZWlnaHQgYW5kIHByb2JhYmlsaXR5IG9mIGxvbmcgbGFuZGluZy4gQSBzbW9vdGhlZCBjdXJ2ZSBpbGx1c3RyYXRpbmcgaG93IGFwcHJvYWNoIGhlaWdodCBpbmZsdWVuY2VzIGxvbmcgbGFuZGluZyBwcm9iYWJpbGl0eSAtIHdoZW4gaGVpZ2h0IGluY3JlYXNlcywgdGhlIHByb2JhYmlsaXR5IG9mIGxvbmcgbGFuZGluZyBpbmNyZWFzZXMgYXMgd2VsbC4KClRvIHN1bW1hcml6ZSwgdGhlIDQgYnVsbGV0IHBvaW50cyBhcmU6CgoxLiBIaWdoZXIgYWlyc3BlZWQgc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgYSBsb25nIGxhbmRpbmcuCgoyLiBBaXJjcmFmdCB0eXBlIGlzIGEgc3Ryb25nIHByZWRpY3RvciAtIHNvbWUgbW9kZWxzIGhhdmUgbXVjaCBsb3dlciByaXNrLCBzdWNoIGFzIGFpcmJ1cy4KCjMuIEFwcHJvYWNoIGhlaWdodCBtYXR0ZXJzIC0gaGlnaGVyIGFsdGl0dWRlcyBsZWFkIHRvIGxvbmdlciBsYW5kaW5nLgoKNC4gUmVkdWNpbmcgYWlyc3BlZWQgYW5kIG9wdGltaXppbmcgYXBwcm9hY2ggaGVpZ2h0IGNhbiBoZWxwIG1pdGlnYXRlIGxvbmcgbGFuZGluZy4KCiMjIyBJZGVudGlmeWluZyBpbXBvcnRhbnQgZmFjdG9ycyB1c2luZyB0aGUgYmluYXJ5IGRhdGEgb2Yg4oCccmlza3kubGFuZGluZ+KAnS4KCiMjIyMjIFN0ZXAgOS4gUmVwZWF0IFN0ZXBzIDEtNyBidXQgdXNpbmcg4oCccmlza3kubGFuZGluZ+KAnSBhcyB0aGUgYmluYXJ5IHJlc3BvbnNlLgoKYGBge3J9CiNDYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2Ygcmlza3kubGFuZGluZwpyaXNreV9sYW5kaW5nX2NvdW50cyA8LSByb3VuZCh0YWJsZShyaXNreS5sYW5kaW5nKS9sZW5ndGgocmlza3kubGFuZGluZykqMTAwLDEpCgojIExhYmVsIHRoZSBwaWUgY2hhcnQgc2xpY2VzCmxhYmVscy5yaXNreSA8LSBwYXN0ZShuYW1lcyhyaXNreV9sYW5kaW5nX2NvdW50cyksICI6ICIsIHJpc2t5X2xhbmRpbmdfY291bnRzLCIlIiwgc2VwID0gIiIpCgojIENyZWF0ZSB0aGUgcGllIGNoYXJ0CnBpZSgKICByaXNreV9sYW5kaW5nX2NvdW50cywKICBsYWJlbHMgPSBsYWJlbHMucmlza3ksCiAgbWFpbiA9ICJEaXN0cmlidXRpb24gb2Ygcmlza3kgTGFuZGluZywgKDAgPSBObywgMSA9IFllcykiLAogIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJzYWxtb24iKSAjIEN1c3RvbSBjb2xvcnMgZm9yIDAgYW5kIDEKKQpgYGAKVGhlcmUgYXJlIDMwLjglIG9mIHJpc2t5IGxhbmRpbmcsIGFuZCA2OS4yJSBvZiBub24tcmlza3kgbGFuZGluZy4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQojIExpc3Qgb2YgcHJlZGljdG9ycwpzaW5nbGVfcmVnMiA8LSBkYXRhLmZyYW1lKAogIFZhcmlhYmxlID0gY2hhcmFjdGVyKCksCiAgQ29lZmZpY2llbnQgPSBudW1lcmljKCksCiAgT2Rkc19SYXRpbyA9IG51bWVyaWMoKSwKICBEaXJlY3Rpb24gPSBjaGFyYWN0ZXIoKSwKICBQX1ZhbHVlID0gbnVtZXJpYygpLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCiMgUGVyZm9ybSBsb2dpc3RpYyByZWdyZXNzaW9uIGZvciBlYWNoIHByZWRpY3Rvcgpmb3IgKHZhciBpbiBwcmVkaWN0b3JzKSB7CiAgIyBCdWlsZCB0aGUgZm9ybXVsYSBkeW5hbWljYWxseQogIGZvcm11bGEyIDwtIGFzLmZvcm11bGEocGFzdGUoInJpc2t5LmxhbmRpbmcgfiIsIHZhcikpCiAgIyBGaXQgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbAogIG1vZGVsMiA8LSBnbG0oZm9ybXVsYTIsIGRhdGEgPSBGQUEsIGZhbWlseSA9IGJpbm9taWFsKQogICMgRXh0cmFjdCBjb2VmZmljaWVudHMgYW5kIHAtdmFsdWUKICBjb2VmX3ZhbHVlMiA8LSBjb2VmKHN1bW1hcnkobW9kZWwyKSlbMiwgMV0gICAgICAgIyBSZWdyZXNzaW9uIGNvZWZmaWNpZW50CiAgcF92YWx1ZTIgPC0gKGNvZWYoc3VtbWFyeShtb2RlbDIpKVsyLCA0XSkgICAgICAgIyBQLXZhbHVlCiAgb2Rkc19yYXRpbzIgPC0gcm91bmQoZXhwKGNvZWZfdmFsdWUyKSwgMykgICAgICAgICAgICAgICAgIyBPZGRzIHJhdGlvCiAgZGlyZWN0aW9uMiA8LSBpZmVsc2UoY29lZl92YWx1ZTIgPiAwLCAiUG9zaXRpdmUiLCAiTmVnYXRpdmUiKQogICMgQXBwZW5kIHJlc3VsdHMgdG8gdGhlIGRhdGEgZnJhbWUKICBzaW5nbGVfcmVnMiA8LSByYmluZChzaW5nbGVfcmVnMiwgZGF0YS5mcmFtZSgKICAgIFZhcmlhYmxlID0gdmFyLAogICAgQ29lZmZpY2llbnQgPSBhYnMoY29lZl92YWx1ZTIpLCAjIFVzZSBhYnNvbHV0ZSB2YWx1ZSBmb3IgcmFua2luZwogICAgT2Rkc19SYXRpbyA9IG9kZHNfcmF0aW8yLAogICAgRGlyZWN0aW9uID0gZGlyZWN0aW9uMiwKICAgIFBfVmFsdWUgPSBwX3ZhbHVlMgogICkpCn0KIyBSYW5rIGZhY3RvcnMgYnkgdGhlIHNpemUgb2YgdGhlIGNvZWZmaWNpZW50CnNpbmdsZV9yZWcyIDwtIHNpbmdsZV9yZWcyICU+JSBhcnJhbmdlKFBfVmFsdWUpCgojIFByaW50IHRoZSByZXN1bHRzCnByaW50KHNpbmdsZV9yZWcyKQpgYGAKCkkgaGF2ZSBzb3J0ZWQgdGhlIHJlZ3Jlc3Npb24gc3VtbWFyeSBieSBob3cgaW1wb3J0YW50IGVhY2ggZmFjdG9yIGlzLiBBcyB3ZSBjYW4gc2VlLCBzcGVlZF9ncm91bmQgYW5kIHNwZWVkX2FpciBhcmUgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGZhY3RvcnMgaW4gYSByaXNreSBsYW5kaW5nLiBBaXJjcmFmdCBoYXMgYSBQIHZhbHVlIG9mIDAuMDczLCB3aGljaCBpcyBncmVhdGVyIHRoYW4gdGhlIDAuMDUgdGhyZXNob2xkLCBzbyBpdCBtYXkgbm90IGJlIGFuIGltcG9ydGFudCBmYWN0b3IuIFRoZSByZXN0IG9mIHRoZSBQIHZhbHVlcyBhcmUgd2F5IGxhcmdlciB0aGFuIDAuMDUgdGhyZXNob2xkLCBzbyB3ZSBjYW4gc2F5IHRoYXQgdGhleSBhcmUgbm90IGltcG9ydGFudCBmYWN0b3JzLgoKYGBge3J9CiMgSml0dGVyIHBsb3QgZm9yIHNwZWVkX2dyb3VuZCB2cy4gcmlza3kubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeSA9IGFzLmZhY3RvcihyaXNreS5sYW5kaW5nKSwgeCA9IHNwZWVkX2dyb3VuZCkpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJpc2t5LmxhbmRpbmcpKSkgKwogIGxhYnModGl0bGUgPSAiSml0dGVyIFBsb3Q6IFNwZWVkX0dyb3VuZCB2cyBSaXNreSBMYW5kaW5nIiwKICAgICAgIHggPSAiU3BlZWQgR3JvdW5kKSIsCiAgICAgICB5ID0gIlJpc2t5IExhbmRpbmcgKDAgPSBObywgMSA9IFllcykiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIiksIG5hbWUgPSAiUmlza3kgTGFuZGluZyIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgSml0dGVyIHBsb3QgZm9yIHNwZWVkX2FpciB2cy4gbG9uZy5sYW5kaW5nCmdncGxvdChGQUEsIGFlcyh5ID0gYXMuZmFjdG9yKHJpc2t5LmxhbmRpbmcpLCB4ID0gc3BlZWRfYWlyKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhZXMoY29sb3IgPSBhcy5mYWN0b3Iocmlza3kubGFuZGluZykpKSArCiAgbGFicyh0aXRsZSA9ICJKaXR0ZXIgUGxvdDogU3BlZWRfQWlyIHZzIFJpc2t5IExhbmRpbmciLAogICAgICAgeCA9ICJTcGVlZCBBaXIiLAogICAgICAgeSA9ICJSaXNreSBMYW5kaW5nICgwID0gTm8sIDEgPSBZZXMpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpLCBuYW1lID0gIlJpc2t5IExhbmRpbmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKSml0dGVyIHBsb3RzIHRvIHNob3cgdGhlIHJlbGF0aW9uIGJldHdlZW4gU3BlZWRfZ3JvdW5kLCBzcGVlZF9haXIgdnMgUmlza3kgTGFuZGluZy4KCmBgYHtyfQojIEhpc3RvZ3JhbSB3aXRoIGRlbnNpdHkgbGluZSBmb3Igc3BlZWRfZ3JvdW5kIGJ5IHJpc2t5LmxhbmRpbmcKZ2dwbG90KEZBQSwgYWVzKHggPSBzcGVlZF9ncm91bmQsIGZpbGwgPSBhcy5mYWN0b3Iocmlza3kubGFuZGluZyksIGNvbG9yID0gYXMuZmFjdG9yKHJpc2t5LmxhbmRpbmcpKSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IDUsIHBvc2l0aW9uID0gImlkZW50aXR5IiwgYWxwaGEgPSAwLjUpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsKICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBhbmQgRGVuc2l0eTogU3BlZWRfR3JvdW5kIGJ5IFJpc2t5IExhbmRpbmcsICgwID0gTm8sIDEgPSBZZXMpIiwKICAgICAgIHggPSAiU3BlZWQgR3JvdW5kIiwKICAgICAgIHkgPSAiRGVuc2l0eSIsCiAgICAgICBmaWxsID0gIlJpc2t5IExhbmRpbmciLAogICAgICAgY29sb3IgPSAiUmlza3kgTGFuZGluZyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgSGlzdG9ncmFtIHdpdGggZGVuc2l0eSBsaW5lIGZvciBzcGVlZF9haXIgYnkgcmlza3kubGFuZGluZwpnZ3Bsb3QoRkFBLCBhZXMoeCA9IHNwZWVkX2FpciwgZmlsbCA9IGFzLmZhY3RvcihyaXNreS5sYW5kaW5nKSwgY29sb3IgPSBhcy5mYWN0b3Iocmlza3kubGFuZGluZykpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGJpbndpZHRoID0gNSwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuNSkgKwogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNykgKwogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtIGFuZCBEZW5zaXR5OiBTcGVlZF9BaXIgYnkgUmlza3kgTGFuZGluZywgKDAgPSBObywgMSA9IFllcykiLAogICAgICAgeCA9ICJTcGVlZCBBaXIiLAogICAgICAgeSA9ICJEZW5zaXR5IiwKICAgICAgIGZpbGwgPSAiUmlza3kgTGFuZGluZyIsCiAgICAgICBjb2xvciA9ICJSaXNreSBMYW5kaW5nIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCAicmVkIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCkJhc2VkIG9uIHRoZSB0d28gZGlmZmVyZW50IHBsb3RzIGFib3ZlLCB3ZSBjYW4gc2VlIHRoYXQgd2hlbiBzcGVlZCBncm91bmQgYW5kIHNwZWVkIGFpciBpbmNyZWFzZSwgdGhlIHJpc2sgb2YgaGF2aW5nIGEgbG9uZyBsYW5kaW5nIGluY3JlYXNlIGFzIHdlbGwsIGVzcGVjaWFsbHkgd2hlbiB0aGUgc3BlZWQgcGFzc2VzIDEwNS0xMTAgTVBILgoKYGBge3J9CmxpYnJhcnkoZmFyYXdheSkKIyBGaXQgdGhlIGZ1bGwgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHNwZWVkX2FpcgpmdWxsX21vZGVsMiA8LSBnbG0ocmlza3kubGFuZGluZyB+IHNwZWVkX2FpciwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBGQUEsIAogICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCkKCiMgVmlldyB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeShmdWxsX21vZGVsMikKCm9kZHMyIDwtIGV4cChjb2VmKGZ1bGxfbW9kZWwyKVsic3BlZWRfYWlyIl0pCnBhc3RlKCJPZGRlcyBmb3IgYSByaXNreSBsYW5kaW5nIGlzICIsIG9kZHMyKQpgYGAKCmBgYHtyfQojdmlzdWFsaXplIGZpdHRlZCBtb2RlbApiZXRhLmZ1bGwubW9kZWwyIDwtIGNvZWYoZnVsbF9tb2RlbDIpCnBsb3Qoaml0dGVyKHJpc2t5LmxhbmRpbmcsIDAuMSkgfiBqaXR0ZXIoc3BlZWRfYWlyKSwgRkFBLCB4bGFiID0gIlNwZWVkIEFpciIsIHlsYWIgPSAiUmlza3kgTGFuZGluZyIsIHBjaCA9ICIuIikKY3VydmUoaWxvZ2l0KGJldGEuZnVsbC5tb2RlbDJbMV0rYmV0YS5mdWxsLm1vZGVsMlsyXSp4KSwgYWRkID0gVFJVRSkKYGBgCgpCYXNlZCBvbiBwcmV2aW91cyBhbmFseXNpcywgZHVlIHRvIHRoZSBjb2xsaW5lYXJpdHksIEkgb21pdHRlZCB0aGUgc3BlZWRfZ3JvdW5kLiBUaGUgZnVsbCBtb2RlbCBjYW4gYmUgd3JpdHRlbiBhcyBQKHJpc2t5LmxhbmRpbmcgPSAxKSA9IGV4cCgtOTEuNDggKyAwLjg1ICogc3BlZWRfYWlyKSAvIDEgKyBleHAoLTkxLjQ4ICsgMC44NSAqIHNwZWVkX2FpcikuIEZvciBldmVyeSAxIHVuaXQgaW5jcmVhc2UgaW4gc3BlZWRfYWlyLCB0aGUgbG9nLW9kZHMgb2YgYSByaXNreSBsYW5kaW5nIGluY3JlYXNlIGJ5IDAuODUsIHRoZSBoaWdoZXIgc3BlZWRfYWlyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGdyZWF0ZXIgbGlrZWxpaG9vZCBvZiBhIHJpc2t5IGxhbmRpbmcuIFRoZSBvZGRzIHJhdGlvIGlzIDIuMzQyLCBmb3IgZXZlcnkgMS11bml0IGluY3JlYXNlIGluIHNwZWVkX2FpciwgdGhlIG9kZHMgb2YgYSBsb25nIGxhbmRpbmcgYXJlIG11bHRpcGxpZWQgYnkgYXBwcm94LiAyLjM0MiwgYSAxMzQuMiUgaW5jcmVhc2UgaW4gb2Rkcy4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1vZGVsX251bGwyIDwtIGdsbShyaXNreS5sYW5kaW5nIH4gMSwgZGF0YSA9IEZBQSwgZmFtaWx5ID0gYmlub21pYWwpCnN0ZXBfYWljMiA8LSBzdGVwKG1vZGVsX251bGwyLCBkaXJlY3Rpb24gPSAiZm9yd2FyZCIsIHNjb3BlID0gfmFpcmNyYWZ0X251bSArIG5vX3Bhc2cgKyBzcGVlZF9ncm91bmQgKyBzcGVlZF9haXIgKyBoZWlnaHQgKyBwaXRjaCArIGR1cmF0aW9uLCBmYW1pbHkgPSBiaW5vbWlhbCkKCnN1bW1hcnkoc3RlcF9haWMyKQpgYGAKCkZyb20gdGhlIHN0ZXAgZm9yd2FyZCBBSUMsIHdlIHNlZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBtb2RlbCB3ZSBnb3Qgd2l0aCBvbmx5IHNwZWVkX2FpciBhcyBhIHNpZ25pZmljYW50IGZhY3RvciwgdGhlIEFJQyBzY29yZSBkcm9wcGVkIHRyZW1lbmRvdXNseSBmcm9tIDI0MiB0byA0OCwgaXQgc2VlbXMgdGhlIGFpcmNyYWZ0IGlzIGFub3RoZXIgc2lnbmlmaWNhbnQgZmFjdG9yIGZvciBhIHJpc2t5IGxhbmRpbmcsIGEgc21hbGwgUCB2YWx1ZSBzaG93cyBpdCdzIHNpZ25pZmljYW5jZSwgYW5kIGhhcyBhIGxvd2VyIEFJQyBzY29yZSBvZiAzMi4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN0ZXBfYmljMiA8LSBzdGVwKG1vZGVsX251bGwyLCBkaXJlY3Rpb24gPSAiZm9yd2FyZCIsIHNjb3BlID0gfiBhaXJjcmFmdF9udW0gKyBub19wYXNnICsgc3BlZWRfZ3JvdW5kICsgc3BlZWRfYWlyICsgaGVpZ2h0ICsgcGl0Y2ggKyBkdXJhdGlvbiwgZmFtaWx5ID0gYmlub21pYWwsIGsgPSBsb2cobnJvdyhGQUEpKSkKCnN1bW1hcnkoc3RlcF9iaWMyKQpgYGAKClRoZSBCSUMgcmVzdWx0IHNlZW1zIHRvIGJlIHRoZSBzYW1lIGNvbXBhcmUgdG8gdGhlIEFJQyByZXN1bHQsIHNob3dzIGJvdGggc3BlZWRfYWlyIGFuZCBhaXJjcmFmdCBhcmUgdGhlIHNpZ25pZmljYW50IGZhY3RvcnMgdG8gYSByaXNreSBsYW5kaW5nLgoKIyMjIyMgU3RlcCAxMC4gWW91IGFyZSBzY2hlZHVsZWQgdG8gbWVldCB3aXRoIGFuIEZBQSBhZ2VudCB3aG8gd2FudHMgdG8ga25vdyDigJx3aGF0IGFyZSByaXNrIGZhY3RvcnMgZm9yIHJpc2t5IGxhbmRpbmdzIGFuZCBob3cgZG8gdGhleSBpbmZsdWVuY2UgaXRzIG9jY3VycmVuY2U/4oCdLiBGb3IgeW91ciBwcmVzZW50YXRpb24sIHlvdSBhcmUgb25seSBhbGxvd2VkIHRvIHNob3c6IE9uZSBtb2RlbCwgT25lIHRhYmxlLCBObyBtb3JlIHRoYW4gdGhyZWUgZmlndXJlcywgTm8gbW9yZSB0aGFuIGZpdmUgYnVsbGV0IHN0YXRlbWVudHMuIFBsZWFzZSB1c2Ugc3RhdGVtZW50cyB0aGF0IHNoZSBjYW4gdW5kZXJzdGFuZC4gVGhlIHF1ZXN0aW9uIGlzOiB3aGF0IG1vZGVsL3RhYmxlL2ZpZ3VyZXMvc3RhdGVtZW50cyB3b3VsZCB5b3UgaW5jbHVkZSBpbiB5b3VyIHByZXNlbnRhdGlvbi4gQmUgc2VsZWN0aXZlIQoKYGBge3J9CmJpY19jb2VmZjIgPC0gc3VtbWFyeShzdGVwX2JpYzIpJGNvZWZmaWNpZW50cwpiaWNfb2Rkc19yYXRpbzIgPC0gZXhwKGJpY19jb2VmZjJbLCAxXSkgICMgQ2FsY3VsYXRlIG9kZHMgcmF0aW9zIGZyb20gQklDIGNvZWZmaWNpZW50cwpiaWNfZGlyZWN0aW9uMiA8LSBpZmVsc2UoYmljX2NvZWZmMlssIDFdID4gMCwgIlBvc2l0aXZlIiwgIk5lZ2F0aXZlIikgICMgRGlyZWN0aW9uIGJhc2VkIG9uIGNvZWZmaWNpZW50IHNpZ24KYmljX3BfdmFsdWUyIDwtIGJpY19jb2VmZjJbLCA0XSAgIyBQLXZhbHVlcyBmcm9tIEJJQyBtb2RlbAoKdGFibGVfYmljMiA8LSBkYXRhLmZyYW1lKAogIENvZWZmaWNpZW50ID0gYmljX2NvZWZmMlssIDFdLCAgICAjIENvZWZmaWNpZW50cyBmcm9tIEJJQyBtb2RlbAogIE9kZHNfUmF0aW8gPSBiaWNfb2Rkc19yYXRpbzIsICAgICAjIE9kZHMgcmF0aW9zIGZyb20gQklDIG1vZGVsCiAgRGlyZWN0aW9uID0gYmljX2RpcmVjdGlvbjIsICAgICAgICMgRGlyZWN0aW9uIChQb3NpdGl2ZSBvciBOZWdhdGl2ZSkKICBQX1ZhbHVlID0gYmljX3BfdmFsdWUyICAgICAgICAgICAjIFAtdmFsdWVzIGZyb20gQklDIG1vZGVsCikKCiMgU29ydCB0aGUgQklDIHRhYmxlIGJ5IGFic29sdXRlIHZhbHVlIG9mIGNvZWZmaWNpZW50cyAoaW1wb3J0YW50IHZhcmlhYmxlcyBhdCB0aGUgdG9wKQp0YWJsZV9iaWNfc29ydGVkMiA8LSB0YWJsZV9iaWMyW29yZGVyKGFicyh0YWJsZV9iaWMyJFBfVmFsdWUpLCBkZWNyZWFzaW5nID0gRkFMU0UpLCBdCgpwcmludCgiQklDIE1vZGVsIFRhYmxlIGZvciBSaXNreSBMYW5kaW5nOiIpCnByaW50KHRhYmxlX2JpY19zb3J0ZWQyKQpgYGAKClRoZSBhYm92ZSB0YWJsZSBkaXNwbGF5ZWQgYSBzdW1tYXJ5IG9mIHRoZSBCSUMgbW9kZWwsIHJhbmtpbmcgdmFyaWFibGVzIGJ5IGltcG9ydGFuY2UuIEFzIHdlIGNhbiBzZWUgdGhhdCB0aGUgc3BlZWRfYWlyIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGZhY3RvciBhbmQgYWlyY3JhZnQgaXMgbmV4dC4KClRoZSBtb2RlbCBJIGNob3NlIGlzIGJhc2VkIG9uIHRoZSBCSUM6IGxvZyhQKGxvbmcubGFuZGluZyA9IDEpIC8gMSAtIFAobG9uZy5sYW5kaW5nPTEpKSA9IC0xMjkuMTcgKyAxLjIyICogc3BlZWRfYWlyIC0gNC41NSAqIGFpcmNyYWZ0X251bS4KCmBgYHtyfQojIENyZWF0ZSBwcmVkaWN0ZWQgcHJvYmFiaWxpdGllcyBmb3IgZGlmZmVyZW50IGFpcnNwZWVkcwpGQUEkcHJlZGljdGVkX3Byb2IyIDwtIHByZWRpY3Qoc3RlcF9iaWMyLCB0eXBlID0gInJlc3BvbnNlIikKCiMgU2NhdHRlciBwbG90IHdpdGggbG9naXN0aWMgcmVncmVzc2lvbiBjdXJ2ZQpnZ3Bsb3QoRkFBLCBhZXMoeCA9IHNwZWVkX2FpciwgeSA9IHJpc2t5LmxhbmRpbmcpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjUpICsgICMgQWRkIGppdHRlciBmb3IgdmlzaWJpbGl0eQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIiksIHNlID0gRkFMU0UsIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJFZmZlY3Qgb2YgQWlyc3BlZWQgb24gUmlza3kgTGFuZGluZyBQcm9iYWJpbGl0eSIsCiAgICAgICB4ID0gIkFpcnNwZWVkIiwKICAgICAgIHkgPSAiUHJvYmFiaWxpdHkgb2YgUmlza3kgTGFuZGluZyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpGaWd1cmUgMTogZGlzcGxheWVkIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzcGVlZF9haXIgYW5kIHJpc2t5IGxhbmRpbmcgcHJvYmFiaWxpdHkuIFdlIGNhbiBzZWUgdGhhdCB3aGVuIHRoZSBzcGVlZF9haXIgaW5jcmVhc2VzLCB0aGUgcHJvYmFiaWxpdHkgb2Ygcmlza3kgbGFuZGluZyBpbmNyZWFzZSBzaWduaWZpY2FudGx5LgoKYGBge3J9CmdncGxvdChGQUEsIGFlcyh4ID0gZmFjdG9yKGFpcmNyYWZ0KSwgZmlsbCA9IGZhY3RvcihyaXNreS5sYW5kaW5nKSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyAgCiAgbGFicyh0aXRsZSA9ICJSaXNreSBMYW5kaW5nIFJhdGUgYnkgQWlyY3JhZnQgVHlwZSwgKDAgPSBObywgMSA9IFllcykiLAogICAgICAgeCA9ICJBaXJjcmFmdCBUeXBlIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiBvZiBMYW5kaW5ncyIsCiAgICAgICBmaWxsID0gIlJpc2t5IExhbmRpbmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKRmlndXJlIDI6IGRpc3BsYXllZCBhaXJjcmFmdCB0eXBlIGFuZCByaXNreSBsYW5kaW5nIHJhdGUuIEkgdXNlZCBhIGJhciBjaGFydCB0byBzaG93IHRoZSBwcm9wb3J0aW9uIG9mIHJpc2t5IGxhbmRpbmdzIHBlciBhaXJjcmFmdCB0eXBlLiBXZSBjYW4gc2VlIHRoYXQgYWlyYnVzIGlzIHF1aXRlIHNhZmVyIGFuZCBoYXMgbGVzcyByaXNreSBsYW5kaW5nIGNvbXBhcmVkIHRvIGJvZWluZy4KClRvIHN1bW1hcml6ZSwgdGhlIDMgYnVsbGV0IHBvaW50cyBhcmU6CgoxLiBGYXN0ZXIgbGFuZGluZ3Mgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgcmlzayBvZiBhIHJpc2t5IGxhbmRpbmcuCgoyLiBDZXJ0YWluIGFpcmNyYWZ0IHR5cGVzIGFyZSBzYWZlciwgc2hvd2luZyBsb3dlciByaXNrLCBzdWNoIGFzIEFpcmJ1cy4KCjMuIFJlZHVjaW5nIGFpcnNwZWVkIGR1cmluZyBsYW5kaW5nIGNvdWxkIG1pdGlnYXRlIHJpc2tzLgoKIyMjIENvbXBhcmUgdGhlIHR3byBtb2RlbHMgYnVpbHQgZm9yIOKAnGxvbmcubGFuZGluZ+KAnSBhbmQg4oCccmlza3kubGFuZGluZ+KAnQoKIyMjIyMgU3RlcCAxMS4gVXNlIG5vIG1vcmUgdGhhbiB0aHJlZSBidWxsZXQgc3RhdGVtZW50cyB0byBzdW1tYXJpemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIG1vZGVscy4KCjEuIFNpZ25pZmljYW50IEZhY3RvcnM6IFRoZSAibG9uZyBsYW5kaW5nIiBtb2RlbCBpbmNsdWRlcyB0aHJlZSBzaWduaWZpY2FudCBmYWN0b3Jz4oCUc3BlZWRfYWlyLCBhaXJjcmFmdCwgYW5kIGhlaWdodOKAlHdoaWxlIHRoZSAicmlza3kgbGFuZGluZyIgbW9kZWwgb25seSBpbmNsdWRlcyBzcGVlZF9haXIgYW5kIGFpcmNyYWZ0LgoKMi4gQ3JpdGVyaWEgZm9yIFJpc2s6IEEgcmlza3kgbGFuZGluZyBpcyBhbHdheXMgYSBsb25nIGxhbmRpbmcgKGkuZS4sIHRoZSBkaXN0YW5jZSBtdXN0IGJlIG92ZXIgMjUwMCksIGJ1dCBhIGxvbmcgbGFuZGluZyBpcyBub3QgbmVjZXNzYXJpbHkgcmlza3ksIGFzIGl0IHJlcXVpcmVzIGEgZGlzdGFuY2UgZ3JlYXRlciB0aGFuIDI1MDAuCgojIyMjIyBTdGVwIDEyLiBQbG90IHRoZSBST0MgY3VydmUgKHNlbnNpdGl2aXR5IHZlcnN1cyAxLXNwZWNpZmljaXR5KSBmb3IgZWFjaCBtb2RlbCAoc2VlIHBwLjMyLTMzIGluIExlY3R1cmUgNCBzbGlkZXMpLiBEcmF3IHRoZSB0d28gY3VydmVzIGluIHRoZSBzYW1lIHBsb3QuIERvIHlvdSBoYXZlIGFueSBjb21tZW50PwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShwUk9DKQoKIyBGaXQgdGhlIGZpbmFsIG1vZGVscwpmaW5hbF9sb25nIDwtIGdsbShsb25nLmxhbmRpbmcgfiBzcGVlZF9haXIgKyBhaXJjcmFmdF9udW0gKyBoZWlnaHQsIAogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwsIGRhdGEgPSBGQUEpCgpmaW5hbF9yaXNreSA8LSBnbG0ocmlza3kubGFuZGluZyB+IHNwZWVkX2FpciArIGFpcmNyYWZ0X251bSwgCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwsIGRhdGEgPSBGQUEpCgojIFByZWRpY3QgcHJvYmFiaWxpdGllcyBmb3IgYm90aCBtb2RlbHMKZmluYWxfbG9uZ19wcmVkIDwtIHByZWRpY3QoZmluYWxfbG9uZywgRkFBLCB0eXBlID0gInJlc3BvbnNlIikKZmluYWxfcmlza3lfcHJlZCA8LSBwcmVkaWN0KGZpbmFsX3Jpc2t5LCBGQUEsIHR5cGUgPSAicmVzcG9uc2UiKQoKIyBDb21wdXRlIFJPQyBjdXJ2ZXMgZm9yIGJvdGggbW9kZWxzCnJvY19maW5hbF9sb25nIDwtIHJvYyhGQUEkbG9uZy5sYW5kaW5nLCBmaW5hbF9sb25nX3ByZWQpCnJvY19maW5hbF9yaXNreSA8LSByb2MoRkFBJHJpc2t5LmxhbmRpbmcsIGZpbmFsX3Jpc2t5X3ByZWQpCgojIFBsb3QgdGhlIFJPQyBjdXJ2ZXMKcGxvdChyb2NfZmluYWxfbG9uZywgY29sID0gImJsdWUiLCBtYWluID0gIlJPQyBDdXJ2ZXMgZm9yIEZpbmFsIE1vZGVscyIsIGx3ZCA9IDIpCmxpbmVzKHJvY19maW5hbF9yaXNreSwgY29sID0gInJlZCIsIGx3ZCA9IDIpCgojIEFkZCBhIGxlZ2VuZApsZWdlbmQoImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gYygiTG9uZyBMYW5kaW5nIE1vZGVsIiwgIlJpc2t5IExhbmRpbmcgTW9kZWwiKSwgCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsd2QgPSAyKQoKIyBBZGQgQVVDIHRvIHRoZSBwbG90CmF1Y192YWx1ZV9sb25nIDwtIGF1Yyhyb2NfZmluYWxfbG9uZykKYXVjX3ZhbHVlX3Jpc2t5IDwtIGF1Yyhyb2NfZmluYWxfcmlza3kpCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMocGFzdGUoIkFVQyAoTG9uZyBMYW5kaW5nKSA9Iiwgcm91bmQoYXVjX3ZhbHVlX2xvbmcsIDMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiQVVDIChSaXNreSBMYW5kaW5nKSA9Iiwgcm91bmQoYXVjX3ZhbHVlX3Jpc2t5LCAzKSkpLAogICAgICAgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHdkID0gMikKYGBgCgpUaGUgYXJlYSB1bmRlciBjdXJ2ZSBzY29yZSBpcyBuZWFyIDEuMCwgc3VnZ2VzdHMgdGhhdCBib3RoIG1vZGVscyBhcmUgYWJsZSB0byBjb3JyZWN0bHkgY2xhc3NpZnkgb2JzZXJ2YXRpb25zIHdpdGggaGlnaCBjZXJ0YWludHkuCgojIyMjIyBTdGVwIDEzLiBBIGNvbW1lcmNpYWwgYWlycGxhbmUgaXMgcGFzc2luZyBvdmVyIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHJ1bndheSwgYXQgdGhpcyBtb21lbnQgd2UgaGF2ZSBpdHMgYmFzaWMgaW5mb3JtYXRpb24gYW5kIG1lYXN1cmVzIG9mIGl0cyBhaXJib3JuZSBwZXJmb3JtYW5jZSAoQm9laW5nLCBkdXJhdGlvbj0yMDAsIG5vX3Bhc2c9ODAsIHNwZWVkX2dyb3VuZD0xMTUsIHNwZWVkX2Fpcj0xMjAsIGhlaWdodD00MCwgcGl0Y2g9NCkuIFByZWRpY3QgaXRzIHByb2JhYmlsaXR5IG9mIGJlaW5nIGEgbG9uZyBsYW5kaW5nIGFuZCBhIHJpc2t5IGxhbmRpbmcsIHJlc3BlY3RpdmVseS4gUmVwb3J0IHRoZSBwcmVkaWN0ZWQgcHJvYmFiaWxpdHkgYXMgd2VsbCBhcyBpdHMgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuCgpgYGB7cn0KIyBEZWZpbmUgdGhlIGlucHV0IGRhdGEgZm9yIHRoZSBuZXcgYWlycGxhbmUgb2JzZXJ2YXRpb24KbmV3X2FpcnBsYW5lIDwtIGRhdGEuZnJhbWUoc3BlZWRfYWlyID0gMTIwLGFpcmNyYWZ0X251bSA9IDAsaGVpZ2h0ID0gNDAscGl0Y2ggPSA0LG5vX3Bhc2cgPSA4MCxkdXJhdGlvbiA9IDIwMCxzcGVlZF9ncm91bmQgPSAxMTUpCgojIFByZWRpY3QgdGhlIHByb2JhYmlsaXR5IGZvciBsb25nIGxhbmRpbmcgKGZpbmFsX2xvbmcpCgpsb25nX2xhbmRpbmdfcHJlZCA8LSBwcmVkaWN0KGZpbmFsX2xvbmcsIG5ld19haXJwbGFuZSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpCgojIFByZWRpY3QgdGhlIHByb2JhYmlsaXR5IGZvciByaXNreSBsYW5kaW5nIChmaW5hbF9yaXNreSkKcmlza3lfbGFuZGluZ19wcmVkIDwtIHByZWRpY3QoZmluYWxfcmlza3ksIG5ld19haXJwbGFuZSwgdHlwZSA9ICJyZXNwb25zZSIsIHNlLmZpdCA9IFRSVUUpCgojIENhbGN1bGF0ZSB0aGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBib3RoIHByZWRpY3Rpb25zCiNsb25nX2xhbmRpbmdfY2lfbG93ZXIgPC0gcm91bmQoaWxvZ2l0KGMobG9uZ19sYW5kaW5nX3ByZWQkZml0IC0gMS45NiAqIGxvbmdfbGFuZGluZ19wcmVkJHNlLmZpdCkpLDMpCiNsb25nX2xhbmRpbmdfY2lfdXBwZXIgPC0gcm91bmQoaWxvZ2l0KGMobG9uZ19sYW5kaW5nX3ByZWQkZml0ICsgMS45NiAqIGxvbmdfbGFuZGluZ19wcmVkJHNlLmZpdCkpLDMpCmxvbmdfbGFuZGluZ19jaV9sb3dlciA8LSBsb25nX2xhbmRpbmdfcHJlZCRmaXQgLSAxLjk2ICogbG9uZ19sYW5kaW5nX3ByZWQkc2UuZml0CmxvbmdfbGFuZGluZ19jaV91cHBlciA8LSBsb25nX2xhbmRpbmdfcHJlZCRmaXQgKyAxLjk2ICogbG9uZ19sYW5kaW5nX3ByZWQkc2UuZml0Cgojcmlza3lfbGFuZGluZ19jaV9sb3dlciA8LSByb3VuZChpbG9naXQoYyhyaXNreV9sYW5kaW5nX3ByZWQkZml0IC0gMS45NiAqIHJpc2t5X2xhbmRpbmdfcHJlZCRzZS5maXQpKSwzKQojcmlza3lfbGFuZGluZ19jaV91cHBlciA8LSByb3VuZChpbG9naXQoYyhyaXNreV9sYW5kaW5nX3ByZWQkZml0ICsgMS45NiAqIHJpc2t5X2xhbmRpbmdfcHJlZCRzZS5maXQpKSwzKQpyaXNreV9sYW5kaW5nX2NpX2xvd2VyIDwtIHJpc2t5X2xhbmRpbmdfcHJlZCRmaXQgLSAxLjk2ICogcmlza3lfbGFuZGluZ19wcmVkJHNlLmZpdApyaXNreV9sYW5kaW5nX2NpX3VwcGVyIDwtIHJpc2t5X2xhbmRpbmdfcHJlZCRmaXQgKyAxLjk2ICogcmlza3lfbGFuZGluZ19wcmVkJHNlLmZpdAoKIyBQcmludCB0aGUgcHJlZGljdGVkIHByb2JhYmlsaXRpZXMgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCmNhdCgiUHJlZGljdGVkIHByb2JhYmlsaXR5IGZvciBMb25nIExhbmRpbmc6XG4iKQpjYXQoIlByb2JhYmlsaXR5OiAiLCBsb25nX2xhbmRpbmdfcHJlZCRmaXQsICJcbiIpCmNhdCgiOTUlIENJOiBbIiwgbG9uZ19sYW5kaW5nX2NpX2xvd2VyLCAiLCAiLCBsb25nX2xhbmRpbmdfY2lfdXBwZXIsICJdXG4iKQoKY2F0KCJcblByZWRpY3RlZCBwcm9iYWJpbGl0eSBmb3IgUmlza3kgTGFuZGluZzpcbiIpCmNhdCgiUHJvYmFiaWxpdHk6ICIsIHJpc2t5X2xhbmRpbmdfcHJlZCRmaXQsICJcbiIpCmNhdCgiOTUlIENJOiBbIiwgcmlza3lfbGFuZGluZ19jaV9sb3dlciwgIiwgIiwgcmlza3lfbGFuZGluZ19jaV91cHBlciwgIl1cbiIpCmBgYAoKU2luY2UgdGhlIGdpdmVuIGFpcnBsYW5lIGhhcyBhIHNwZWVkX2FpciBvZiAxMjAsIHdoaWNoIGlzIHdheSBoaWdoZXIgdGhhbiAxMDAtMTEwIHJhbmdlLCBpdCBpbmNyZWFzZWQgdGhlIHJpc2sgb2YgaGF2aW5nIGEgbG9uZyBsYW5kaW5nIGFuZCBhIHJpc2sgbGFuZGluZy4gQmFzZWQgb24gdGhlIGFuYWx5c2lzLCB0aGUgcHJvYmFiaWxpdHkgb2YgaGF2aW5nIGEgbG9uZyBsYW5kaW5nIGFuZCByaXNreSBsYW5kaW5nIGlzIDEwMCUuIFRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBhdCA5OS45OSwgYWxtb3N0IHBlcmZlY3Qu