Statistical Significance
One-sided Cochran-Armitage trend test:
library(DescTools)
data_table <- matrix(
c(
63, 57, 57, 51, # Row of incorrect answers
13, 19, 19, 25 # Row of correct answers
),
nrow = 2,
byrow = TRUE
)
colnames(data_table) <- c("Difficult_1", "Difficult_2", "Difficult_3", "Difficult_4")
rownames(data_table) <- c("False", "True")
CochranArmitageTest(data_table, alternative = "one.sided")
Cochran-Armitage test for trend
data: data_table
Z = -2.1325, dim = 4, p-value = 0.01648
alternative hypothesis: one.sided
Effect Size
Graph of probabilities predicted by logistic regression (a visual way
to estimate the effect size):
library(dplyr)
library(ggplot2)
library(marginaleffects)
# Data
data <- data.frame(
detail_level = c(rep(1, 76), rep(2, 76), rep(3, 76), rep(4, 76)),
correct = c(
rep(1, 13), rep(0, 63), # Level 1
rep(1, 19), rep(0, 57), # Level 2
rep(1, 19), rep(0, 57), # Level 3
rep(1, 25), rep(0, 51) # Level 4
)
)
# Build logistic regression
model <- glm(correct ~ detail_level, data = data, family = binomial)
# Predict probabilities at each detail level
all_levels <- predictions(
model,
newdata = datagrid(detail_level = 1:4)
)
# Build graph
ggplot(all_levels, aes(x = factor(detail_level), y = estimate)) +
# Dashed line for random guessing
geom_hline(yintercept = 0.25, linetype = "dashed", color = "gray50") +
# Confidence intervals
geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.1, color = "gray30", linewidth = 0.8) +
# Points of predicted probabilities
geom_point(size = 4, color = "gray30") +
# Add a thin line connecting points to emphasize the trend
geom_line(aes(group = 1), linetype = "dotted", color = "gray30") +
# Axis settings
scale_y_continuous(
labels = scales::percent_format(accuracy = 1),
breaks = seq(0.1, 0.5, by = 0.05),
limits = c(0.1, 0.45)
) +
theme_minimal() +
labs(
x = "Answer option detail level",
y = "Probability of correct answer",
) +
theme(text = element_text(size = 16, family = "serif"))

print(all_levels)
detail_level Estimate Pr(>|z|) S 2.5 % 97.5 %
1 0.182 <0.001 31.1 0.122 0.263
2 0.223 <0.001 49.8 0.175 0.280
3 0.271 <0.001 39.5 0.220 0.328
4 0.324 <0.001 11.1 0.241 0.420
Type: invlink(link)
Practically interesting effect size (the strategy of choosing the
most detailed answer option allows guessing with a probability 0.0741
higher):
library(marginaleffects)
# Data
data <- data.frame(
detail_level = c(rep(1, 76), rep(2, 76), rep(3, 76), rep(4, 76)),
correct = c(
rep(1, 13), rep(0, 63), # Level 1
rep(1, 19), rep(0, 57), # Level 2
rep(1, 19), rep(0, 57), # Level 3
rep(1, 25), rep(0, 51) # Level 4
)
)
# Build logistic regression
model <- glm(correct ~ detail_level, data = data, family = binomial)
# Calculate the difference in probabilities
results <- predictions(
model,
newdata = datagrid(detail_level = 4),
hypothesis = "b1 - 0.25 = 0",
type = "response"
)
print(results)
Hypothesis Estimate Std. Error z Pr(>|z|) S 2.5 % 97.5 %
b1-0.25=0 0.0741 0.046 1.61 0.107 3.2 -0.016 0.164
Type: response
Power Analysis
Post-hoc Power Analysis
Post-hoc power analysis for the Cochran-Armitage test:
library(multiCA)
power.CA.test(
N = 304, # Sample size (number of answer options)
n.prop = c(0.25, 0.25, 0.25, 0.25), # Proportion of group sizes at each level
pvec = c(0.1711, 0.25, 0.25, 0.3289), # Actual proportions of correct answers at each level
sig.level = 0.05, # Alpha significance level
alternative = "greater" # Direction of testing
)
Cochran-Armitage trend test
n = 304
n.prop = 0.25, 0.25, 0.25, 0.25
p = 0.1711, 0.2500, 0.2500, 0.3289
alternative = greater
sig.level = 0.05
power = 0.6892607
A-priori Power Analysis
A-priori power analysis for the Cochran-Armitage test:
library(multiCA)
power.CA.test(
n.prop = c(0.25, 0.25, 0.25, 0.25), # Proportion of group sizes at each level
pvec = c(0.1711, 0.25, 0.25, 0.3289), # Actual proportions of correct answers at each level
sig.level = 0.05, # Alpha significance level
alternative = "greater", # Direction of testing
power = 0.8 # Required power
)
Cochran-Armitage trend test
n = 409.6055
n.prop = 0.25, 0.25, 0.25, 0.25
p = 0.1711, 0.2500, 0.2500, 0.3289
alternative = greater
sig.level = 0.05
power = 0.8
A-priori power analysis for a practically interesting effect size
using the Monte Carlo method. Statistical power calculation for a sample
size of 172 questions (688 answer options):
library(marginaleffects)
# Function to calculate statistical power by sample size n_per_level
simulate_power_exact <- function(n_per_level, b0, b1, n_sim, alpha) {
success_count <- 0
for (i in 1:n_sim) {
# 1. Generate data
sim_detail_level <- rep(1:4, each = n_per_level)
sim_log_odds <- b0 + b1 * sim_detail_level
sim_probs <- 1 / (1 + exp(-sim_log_odds))
sim_correct <- rbinom(length(sim_detail_level), size = 1, prob = sim_probs)
sim_data <- data.frame(detail_level = sim_detail_level, correct = sim_correct)
# 2. Train model
fit <- glm(correct ~ detail_level, data = sim_data, family = binomial)
# 3. Use marginaleffects to check effect significance
results <- predictions(
fit,
newdata = datagrid(detail_level = 4),
hypothesis = "b1 - 0.25 = 0",
type = "response"
)
# 4. Extract one-sided p-value
# Divide by 2 if the effect is in the expected direction (Estimate > 0)
if (results$estimate > 0) {
p_val_one_sided <- results$p.value / 2
} else {
p_val_one_sided <- 1 - (results$p.value / 2)
}
if (p_val_one_sided < alpha) {
success_count <- success_count + 1
}
}
return(success_count / n_sim)
}
# Calculate statistical power
set.seed(42)
estimated_power <- simulate_power_exact(
n_per_level = 172, # Sample size per level (number of questions)
b0 = coef(model)[1], # Constant (intercept) in regression
b1 = coef(model)[2], # Coefficient for the detail_level variable
n_sim = 1000, # Number of simulations
alpha = 0.05 # Significance level α
)
print(estimated_power)
[1] 0.806
LS0tDQp0aXRsZTogIkhpc3RvcnkgVGVzdHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciwgbWFya2Rvd25fc2V0dGluZ3MsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyLCBpbnN0YWxsaW5nLWxpYnJhcmllcywgaW5jbHVkZSA9IEZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoYygiRGVzY1Rvb2xzIiwgIm11bHRpQ0EiLCAibG10ZXN0IiwgImRwbHlyIiwgIm1hcmdpbmFsZWZmZWN0cyIsICJyc3RhbmFybSIsICJjb2xsYXBzZSIsICJSY3BwIiwgInpvbyIpKQ0KYGBgDQoNCiMjIFN0YXRpc3RpY2FsIFNpZ25pZmljYW5jZQ0KDQpPbmUtc2lkZWQgQ29jaHJhbi1Bcm1pdGFnZSB0cmVuZCB0ZXN0Og0KDQpgYGB7ciwgY29jaHJhbmVfYXJtaXRhZ2UtdGVzdH0NCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KDQpkYXRhX3RhYmxlIDwtIG1hdHJpeCgNCiAgYygNCiAgICA2MywgNTcsIDU3LCA1MSwgIyBSb3cgb2YgaW5jb3JyZWN0IGFuc3dlcnMNCiAgICAxMywgMTksIDE5LCAyNSAjIFJvdyBvZiBjb3JyZWN0IGFuc3dlcnMNCiAgKSwNCiAgbnJvdyA9IDIsDQogIGJ5cm93ID0gVFJVRQ0KKQ0KDQpjb2xuYW1lcyhkYXRhX3RhYmxlKSA8LSBjKCJEaWZmaWN1bHRfMSIsICJEaWZmaWN1bHRfMiIsICJEaWZmaWN1bHRfMyIsICJEaWZmaWN1bHRfNCIpDQpyb3duYW1lcyhkYXRhX3RhYmxlKSA8LSBjKCJGYWxzZSIsICJUcnVlIikNCg0KQ29jaHJhbkFybWl0YWdlVGVzdChkYXRhX3RhYmxlLCBhbHRlcm5hdGl2ZSA9ICJvbmUuc2lkZWQiKQ0KYGBgDQoNCiMjIEVmZmVjdCBTaXplDQoNCkdyYXBoIG9mIHByb2JhYmlsaXRpZXMgcHJlZGljdGVkIGJ5IGxvZ2lzdGljIHJlZ3Jlc3Npb24gKGEgdmlzdWFsIHdheSB0byBlc3RpbWF0ZSB0aGUgZWZmZWN0IHNpemUpOg0KDQpgYGB7ciwgZWZmZWN0X3NpemUtZ3JhcGgsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA1LCBtZXNzYWdlID0gRkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShtYXJnaW5hbGVmZmVjdHMpDQoNCiMgRGF0YQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBkZXRhaWxfbGV2ZWwgPSBjKHJlcCgxLCA3NiksIHJlcCgyLCA3NiksIHJlcCgzLCA3NiksIHJlcCg0LCA3NikpLA0KICBjb3JyZWN0ID0gYygNCiAgICByZXAoMSwgMTMpLCByZXAoMCwgNjMpLCAjIExldmVsIDENCiAgICByZXAoMSwgMTkpLCByZXAoMCwgNTcpLCAjIExldmVsIDINCiAgICByZXAoMSwgMTkpLCByZXAoMCwgNTcpLCAjIExldmVsIDMNCiAgICByZXAoMSwgMjUpLCByZXAoMCwgNTEpICMgTGV2ZWwgNA0KICApDQopDQoNCiMgQnVpbGQgbG9naXN0aWMgcmVncmVzc2lvbg0KbW9kZWwgPC0gZ2xtKGNvcnJlY3QgfiBkZXRhaWxfbGV2ZWwsIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbCkNCg0KIyBQcmVkaWN0IHByb2JhYmlsaXRpZXMgYXQgZWFjaCBkZXRhaWwgbGV2ZWwNCmFsbF9sZXZlbHMgPC0gcHJlZGljdGlvbnMoDQogIG1vZGVsLA0KICBuZXdkYXRhID0gZGF0YWdyaWQoZGV0YWlsX2xldmVsID0gMTo0KQ0KKQ0KDQojIEJ1aWxkIGdyYXBoDQpnZ3Bsb3QoYWxsX2xldmVscywgYWVzKHggPSBmYWN0b3IoZGV0YWlsX2xldmVsKSwgeSA9IGVzdGltYXRlKSkgKw0KICAjIERhc2hlZCBsaW5lIGZvciByYW5kb20gZ3Vlc3NpbmcNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yNSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JheTUwIikgKw0KICAjIENvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCksIHdpZHRoID0gMC4xLCBjb2xvciA9ICJncmF5MzAiLCBsaW5ld2lkdGggPSAwLjgpICsNCiAgIyBQb2ludHMgb2YgcHJlZGljdGVkIHByb2JhYmlsaXRpZXMNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgY29sb3IgPSAiZ3JheTMwIikgKw0KICAjIEFkZCBhIHRoaW4gbGluZSBjb25uZWN0aW5nIHBvaW50cyB0byBlbXBoYXNpemUgdGhlIHRyZW5kDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiZ3JheTMwIikgKw0KICAjIEF4aXMgc2V0dGluZ3MNCiAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwNCiAgICBicmVha3MgPSBzZXEoMC4xLCAwLjUsIGJ5ID0gMC4wNSksDQogICAgbGltaXRzID0gYygwLjEsIDAuNDUpDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHggPSAiQW5zd2VyIG9wdGlvbiBkZXRhaWwgbGV2ZWwiLA0KICAgIHkgPSAiUHJvYmFiaWxpdHkgb2YgY29ycmVjdCBhbnN3ZXIiLA0KICApICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhbWlseSA9ICJzZXJpZiIpKQ0KDQpwcmludChhbGxfbGV2ZWxzKQ0KYGBgDQoNClByYWN0aWNhbGx5IGludGVyZXN0aW5nIGVmZmVjdCBzaXplICh0aGUgc3RyYXRlZ3kgb2YgY2hvb3NpbmcgdGhlIG1vc3QgZGV0YWlsZWQgYW5zd2VyIG9wdGlvbiBhbGxvd3MgZ3Vlc3Npbmcgd2l0aCBhIHByb2JhYmlsaXR5IDAuMDc0MSBoaWdoZXIpOg0KDQpgYGB7ciwgcHJhY3RpY2FsX2VmZmVjdC1zaXplfQ0KbGlicmFyeShtYXJnaW5hbGVmZmVjdHMpDQoNCiMgRGF0YQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBkZXRhaWxfbGV2ZWwgPSBjKHJlcCgxLCA3NiksIHJlcCgyLCA3NiksIHJlcCgzLCA3NiksIHJlcCg0LCA3NikpLA0KICBjb3JyZWN0ID0gYygNCiAgICByZXAoMSwgMTMpLCByZXAoMCwgNjMpLCAjIExldmVsIDENCiAgICByZXAoMSwgMTkpLCByZXAoMCwgNTcpLCAjIExldmVsIDINCiAgICByZXAoMSwgMTkpLCByZXAoMCwgNTcpLCAjIExldmVsIDMNCiAgICByZXAoMSwgMjUpLCByZXAoMCwgNTEpICMgTGV2ZWwgNA0KICApDQopDQoNCiMgQnVpbGQgbG9naXN0aWMgcmVncmVzc2lvbg0KbW9kZWwgPC0gZ2xtKGNvcnJlY3QgfiBkZXRhaWxfbGV2ZWwsIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbCkNCg0KIyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gcHJvYmFiaWxpdGllcw0KcmVzdWx0cyA8LSBwcmVkaWN0aW9ucygNCiAgbW9kZWwsDQogIG5ld2RhdGEgPSBkYXRhZ3JpZChkZXRhaWxfbGV2ZWwgPSA0KSwNCiAgaHlwb3RoZXNpcyA9ICJiMSAtIDAuMjUgPSAwIiwNCiAgdHlwZSA9ICJyZXNwb25zZSINCikNCg0KcHJpbnQocmVzdWx0cykNCmBgYA0KDQojIyBQb3dlciBBbmFseXNpcw0KDQojIyMgUG9zdC1ob2MgUG93ZXIgQW5hbHlzaXMNCg0KUG9zdC1ob2MgcG93ZXIgYW5hbHlzaXMgZm9yIHRoZSBDb2NocmFuLUFybWl0YWdlIHRlc3Q6DQoNCmBgYHtyLCBwb3N0ZXJpb3JfY29jaHJhbmVfYXJtaXRhZ2VfcG93ZXJfYW5hbHlzaXN9DQpsaWJyYXJ5KG11bHRpQ0EpDQoNCnBvd2VyLkNBLnRlc3QoDQogIE4gPSAzMDQsICMgU2FtcGxlIHNpemUgKG51bWJlciBvZiBhbnN3ZXIgb3B0aW9ucykNCiAgbi5wcm9wID0gYygwLjI1LCAwLjI1LCAwLjI1LCAwLjI1KSwgIyBQcm9wb3J0aW9uIG9mIGdyb3VwIHNpemVzIGF0IGVhY2ggbGV2ZWwNCiAgcHZlYyA9IGMoMC4xNzExLCAwLjI1LCAwLjI1LCAwLjMyODkpLCAjIEFjdHVhbCBwcm9wb3J0aW9ucyBvZiBjb3JyZWN0IGFuc3dlcnMgYXQgZWFjaCBsZXZlbA0KICBzaWcubGV2ZWwgPSAwLjA1LCAjIEFscGhhIHNpZ25pZmljYW5jZSBsZXZlbA0KICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiAjIERpcmVjdGlvbiBvZiB0ZXN0aW5nDQopDQpgYGANCg0KIyMjIEEtcHJpb3JpIFBvd2VyIEFuYWx5c2lzDQoNCkEtcHJpb3JpIHBvd2VyIGFuYWx5c2lzIGZvciB0aGUgQ29jaHJhbi1Bcm1pdGFnZSB0ZXN0Og0KDQpgYGB7ciwgcHJpb3JfY29jaHJhbmVfYXJtaXRhZ2VfcG93ZXJfYW5hbHlzaXN9DQpsaWJyYXJ5KG11bHRpQ0EpDQoNCnBvd2VyLkNBLnRlc3QoDQogIG4ucHJvcCA9IGMoMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSksICMgUHJvcG9ydGlvbiBvZiBncm91cCBzaXplcyBhdCBlYWNoIGxldmVsDQogIHB2ZWMgPSBjKDAuMTcxMSwgMC4yNSwgMC4yNSwgMC4zMjg5KSwgIyBBY3R1YWwgcHJvcG9ydGlvbnMgb2YgY29ycmVjdCBhbnN3ZXJzIGF0IGVhY2ggbGV2ZWwNCiAgc2lnLmxldmVsID0gMC4wNSwgIyBBbHBoYSBzaWduaWZpY2FuY2UgbGV2ZWwNCiAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsICMgRGlyZWN0aW9uIG9mIHRlc3RpbmcNCiAgcG93ZXIgPSAwLjggIyBSZXF1aXJlZCBwb3dlcg0KKQ0KYGBgDQoNCkEtcHJpb3JpIHBvd2VyIGFuYWx5c2lzIGZvciBhIHByYWN0aWNhbGx5IGludGVyZXN0aW5nIGVmZmVjdCBzaXplIHVzaW5nIHRoZSBNb250ZSBDYXJsbyBtZXRob2QuIFN0YXRpc3RpY2FsIHBvd2VyIGNhbGN1bGF0aW9uIGZvciBhIHNhbXBsZSBzaXplIG9mIDE3MiBxdWVzdGlvbnMgKDY4OCBhbnN3ZXIgb3B0aW9ucyk6DQoNCmBgYHtyLCBwcmlvcl9wcmFjdGljYWxfcG93ZXJfYW5hbHlzaXN9DQpsaWJyYXJ5KG1hcmdpbmFsZWZmZWN0cykNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljYWwgcG93ZXIgYnkgc2FtcGxlIHNpemUgbl9wZXJfbGV2ZWwNCnNpbXVsYXRlX3Bvd2VyX2V4YWN0IDwtIGZ1bmN0aW9uKG5fcGVyX2xldmVsLCBiMCwgYjEsIG5fc2ltLCBhbHBoYSkgew0KICBzdWNjZXNzX2NvdW50IDwtIDANCg0KICBmb3IgKGkgaW4gMTpuX3NpbSkgew0KICAgICMgMS4gR2VuZXJhdGUgZGF0YQ0KICAgIHNpbV9kZXRhaWxfbGV2ZWwgPC0gcmVwKDE6NCwgZWFjaCA9IG5fcGVyX2xldmVsKQ0KICAgIHNpbV9sb2dfb2RkcyA8LSBiMCArIGIxICogc2ltX2RldGFpbF9sZXZlbA0KICAgIHNpbV9wcm9icyA8LSAxIC8gKDEgKyBleHAoLXNpbV9sb2dfb2RkcykpDQogICAgc2ltX2NvcnJlY3QgPC0gcmJpbm9tKGxlbmd0aChzaW1fZGV0YWlsX2xldmVsKSwgc2l6ZSA9IDEsIHByb2IgPSBzaW1fcHJvYnMpDQoNCiAgICBzaW1fZGF0YSA8LSBkYXRhLmZyYW1lKGRldGFpbF9sZXZlbCA9IHNpbV9kZXRhaWxfbGV2ZWwsIGNvcnJlY3QgPSBzaW1fY29ycmVjdCkNCg0KICAgICMgMi4gVHJhaW4gbW9kZWwNCiAgICBmaXQgPC0gZ2xtKGNvcnJlY3QgfiBkZXRhaWxfbGV2ZWwsIGRhdGEgPSBzaW1fZGF0YSwgZmFtaWx5ID0gYmlub21pYWwpDQoNCiAgICAjIDMuIFVzZSBtYXJnaW5hbGVmZmVjdHMgdG8gY2hlY2sgZWZmZWN0IHNpZ25pZmljYW5jZQ0KICAgIHJlc3VsdHMgPC0gcHJlZGljdGlvbnMoDQogICAgICBmaXQsDQogICAgICBuZXdkYXRhID0gZGF0YWdyaWQoZGV0YWlsX2xldmVsID0gNCksDQogICAgICBoeXBvdGhlc2lzID0gImIxIC0gMC4yNSA9IDAiLA0KICAgICAgdHlwZSA9ICJyZXNwb25zZSINCiAgICApDQoNCiAgICAjIDQuIEV4dHJhY3Qgb25lLXNpZGVkIHAtdmFsdWUNCiAgICAjIERpdmlkZSBieSAyIGlmIHRoZSBlZmZlY3QgaXMgaW4gdGhlIGV4cGVjdGVkIGRpcmVjdGlvbiAoRXN0aW1hdGUgPiAwKQ0KICAgIGlmIChyZXN1bHRzJGVzdGltYXRlID4gMCkgew0KICAgICAgcF92YWxfb25lX3NpZGVkIDwtIHJlc3VsdHMkcC52YWx1ZSAvIDINCiAgICB9IGVsc2Ugew0KICAgICAgcF92YWxfb25lX3NpZGVkIDwtIDEgLSAocmVzdWx0cyRwLnZhbHVlIC8gMikNCiAgICB9DQoNCiAgICBpZiAocF92YWxfb25lX3NpZGVkIDwgYWxwaGEpIHsNCiAgICAgIHN1Y2Nlc3NfY291bnQgPC0gc3VjY2Vzc19jb3VudCArIDENCiAgICB9DQogIH0NCg0KICByZXR1cm4oc3VjY2Vzc19jb3VudCAvIG5fc2ltKQ0KfQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNhbCBwb3dlcg0Kc2V0LnNlZWQoNDIpDQplc3RpbWF0ZWRfcG93ZXIgPC0gc2ltdWxhdGVfcG93ZXJfZXhhY3QoDQogIG5fcGVyX2xldmVsID0gMTcyLCAjIFNhbXBsZSBzaXplIHBlciBsZXZlbCAobnVtYmVyIG9mIHF1ZXN0aW9ucykNCiAgYjAgPSBjb2VmKG1vZGVsKVsxXSwgIyBDb25zdGFudCAoaW50ZXJjZXB0KSBpbiByZWdyZXNzaW9uDQogIGIxID0gY29lZihtb2RlbClbMl0sICMgQ29lZmZpY2llbnQgZm9yIHRoZSBkZXRhaWxfbGV2ZWwgdmFyaWFibGUNCiAgbl9zaW0gPSAxMDAwLCAjIE51bWJlciBvZiBzaW11bGF0aW9ucw0KICBhbHBoYSA9IDAuMDUgIyBTaWduaWZpY2FuY2UgbGV2ZWwgzrENCikNCg0KcHJpbnQoZXN0aW1hdGVkX3Bvd2VyKQ0KYGBgDQo=