The Children’s television workshop experiment.

## Data input
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
W <- rep(c(0, 1), 8)
G <- as.vector(rbind(1:8, 1:8))
X <- c(12.9, 12, 15.1, 12.3, 16.8, 17.2, 15.8, 18.9, 13.9, 15.3, 14.5, 16.6, 17, 16, 15.8, 20.1)
Y <- c(54.6, 60.6, 56.5, 55.5, 75.2, 84.8, 75.6, 101.9, 55.3, 70.6, 59.3, 78.4, 87, 84.2, 73.7, 108.6)
data <- data.frame(G, W, X, Y)
data

library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
temp <- data.frame("Control" = data$Y[data$W == 0], "Treatment" = data$Y[data$W == 1])
temp
ggpaired(data = temp, cond1 = "Control", cond2 = "Treatment", fill = "condition", palette = "jco", line.color = "gray", 
         ylab = "Post-test Score")
`gather_()` was deprecated in tidyr 1.2.0.

temp <- data.frame("Control" = data$X[data$W == 0], "Treatment" = data$X[data$W == 1])
ggpaired(data = temp, cond1 = "Control", cond2 = "Treatment", fill = "condition", palette = "jco", line.color = "gray", 
         ylab = "Pre-test Score")


testStat <- function(Y0, Y1, w, pair_idx, method = "mean diff") {
 n <- length(Y0)
 if (method == "mean diff")
   val <- abs(mean(Y0[w == 1]) - mean(Y0[w == 0])) ## replace abs(mean(Y1[w == 1]) - mean(Y0[w == 0])-tau)
 else if (method == "rank diff"){
  r <- rank(Y0)
  val <- abs(mean(r[w == 1]) - mean(r[w == 0]))
 } else if (method == "within-pair rank diff") {
   pairs <- unique(pair_idx)
   v <- sapply(pairs, function(idx) {
     Yt <- Y0[pair_idx == idx & w == 1]
     Yc <- Y0[pair_idx == idx & w == 0]
     return((Yt > Yc) - (Yt < Yc))
   })
   val <- abs(2 * sum(v)/length(Y0))
 }
  return(val)
}

find.p.value <- function(tau, yobs, w, pair_idx, seed = 0, method = "mean diff", 
                         B = 10000, error = 1e-10){
  ## error is to fix our problems with floating point errors
  n <- length(yobs)
  y0 <- rep(NA, n)
  y1 <- rep(NA, n)
  
  y1[w == 1] <- yobs[w == 1]
  y0[w == 0] <- yobs[w == 0]
  
  y1[w == 0] <- yobs[w == 0] + tau
  y0[w == 1] <- yobs[w == 1] - tau
  
  t.obs <-  testStat(y0, y1, w, pair_idx, method = method)
  
  
  set.seed(seed)
  pairs <- unique(pair_idx)
  t.stat <- sapply(1:B, function(i){
    w.iter <- rep(NA, n)
    for (i in 1:length(pairs)) {
      temp.idx <- which(pair_idx == pairs[i])
      w.iter[sample(temp.idx)] <- c(0, 1)
    }
    return(testStat(y0, y1, w.iter, pair_idx, method = method))
  })

  # subtracting error fixes floating point errors
  p.val <- sum(t.stat >= (t.obs - error))/B
  res <- c(t.obs, p.val)
  names(res) <- paste(method, c("test stats", "p-value"))
  return(res)
}


find.p.value(0, data$Y, data$W, data$G)
mean diff test stats    mean diff p-value 
             13.4250               0.0332 
find.p.value(0, data$Y, data$W, data$G, method = "rank diff")
rank diff test stats    rank diff p-value 
              3.7500               0.0332 
find.p.value(0, data$Y, data$W, data$G, method = "within-pair rank diff")
within-pair rank diff test stats    within-pair rank diff p-value 
                             0.5                              0.3 
find.p.value.wrong <- function(tau, yobs, w, pair_idx, seed = 0, method = "mean diff", 
                         B = 10000, error = 1e-10){
  ## error is to fix our problems with floating point errors
  n <- length(yobs)
  y0 <- rep(NA, n)
  y1 <- rep(NA, n)
  
  y1[w == 1] <- yobs[w == 1]
  y0[w == 0] <- yobs[w == 0]
  
  y1[w == 0] <- yobs[w == 0] + tau
  y0[w == 1] <- yobs[w == 1] - tau
  
  t.obs <-  testStat(y0, y1, w, pair_idx, method)
  
  
  set.seed(seed)
  pairs <- unique(pair_idx)
  t.stat <- sapply(1:B, function(i){
    w.iter <- sample(w)
    return(testStat(y0, y1, w.iter, pair_idx, method = method))
  })

  # subtracting error fixes floating point errors
  p.val <- sum(t.stat >= (t.obs - error))/B
  res <- c(t.obs, p.val)
  names(res) <- paste(method, c("test stats", "p-value"))
  return(res)
}


find.p.value.wrong(0, data$Y, data$W, data$G)
mean diff test stats    mean diff p-value 
             13.4250               0.1058 
find.p.value.wrong(0, data$Y, data$W, data$G, method = "rank diff")
rank diff test stats    rank diff p-value 
              3.7500               0.1282 

We get larger p-values from complete randomization mechanism.

## CI from Fisher
pvals <- sapply(0:30, function(tau) find.p.value(tau, data$Y, data$W, data$G)[2])
names(pvals) <- 0:30
pvals
     0      1      2      3      4      5      6      7      8      9     10     11     12 
0.0332 0.0423 0.0568 0.0740 0.0921 0.1251 0.1618 0.1993 0.3063 0.3722 0.4869 0.6235 0.7679 
    13     14     15     16     17     18     19     20     21     22     23     24     25 
0.9322 0.8945 0.7365 0.5933 0.4632 0.3318 0.2616 0.2060 0.1564 0.1232 0.0909 0.0649 0.0649 
    26     27     28     29     30 
0.0469 0.0329 0.0245 0.0245 0.0245 
LB <- sapply(seq(1, 2, 0.1), function(tau) find.p.value(tau, data$Y, data$W, data$G)[2])
names(LB) <- seq(1, 2, 0.1)
LB
     1    1.1    1.2    1.3    1.4    1.5    1.6    1.7    1.8    1.9      2 
0.0423 0.0423 0.0423 0.0423 0.0423 0.0423 0.0487 0.0487 0.0487 0.0487 0.0568 
UB <- sapply(seq(25, 26, 0.1), function(tau) find.p.value(tau, data$Y, data$W, data$G)[2])
names(UB) <- seq(25, 26, 0.1)
UB
    25   25.1   25.2   25.3   25.4   25.5   25.6   25.7   25.8   25.9     26 
0.0649 0.0649 0.0547 0.0547 0.0547 0.0547 0.0469 0.0469 0.0469 0.0469 0.0469 

The 95% CI from Fisher’s exact p-values is [1.9, 25.6]

## CI from Neyman
pairs <- unique(data$G)
tau_hat_vec <- sapply(pairs, function(idx) {
  Yt <- data$Y[data$G == idx & data$W == 1]
  Yc <- data$Y[data$G == idx & data$W == 0]
  return(Yt - Yc)
})

tau_hat <- mean(tau_hat_vec)
sd_tau_hat <- sd(tau_hat_vec)/sqrt(length(tau_hat_vec))
  
## 95% CI
print(c(tau_hat- 1.96 * sd_tau_hat, tau_hat + 1.96 * sd_tau_hat))
[1]  4.337779 22.512221
## CI from Neyman

tau_hat <- mean(data$Y[data$W == 1]) - mean(data$Y[data$W == 0])

st <- sd(data$Y[data$W == 1])
sc <- sd(data$Y[data$W == 0])
varhat_tauhat <- st^2/sum(data$W == 1) + sc^2/sum(data$W == 0)

print(c(tau_hat - 1.96 * sqrt(varhat_tauhat), tau_hat + 1.96 * sqrt(varhat_tauhat)))
[1] -1.957377 28.807377
## need to create pair-level data
pairs <- unique(data$G)
X_bar <- mean(data$X)
group_data <- sapply(pairs, function(idx) {
  Yt <- data$Y[data$G == idx & data$W == 1]
  Yc <- data$Y[data$G == idx & data$W == 0]
  Xt <- data$X[data$G == idx & data$W == 1]
  Xc <- data$X[data$G == idx & data$W == 0]
  Y_diff <- Yt - Yc
  X_diff <- Xt - Xc
  X_mean <- (Xt + Xc)/2 - X_bar
  return(c(X_mean, X_diff, Y_diff))
})
group_data
        [,1]    [,2]   [,3]    [,4]    [,5]    [,6]    [,7]    [,8]
[1,] -3.1875 -1.9375 1.3625  1.7125 -1.0375 -0.0875  0.8625  2.3125
[2,] -0.9000 -2.8000 0.4000  3.1000  1.4000  2.1000 -1.0000  4.3000
[3,]  6.0000 -1.0000 9.6000 26.3000 15.3000 19.1000 -2.8000 34.9000
group_data <- data.frame(t(group_data))
colnames(group_data) <- c("X_mean", "X_diff", "Y_diff")
group_data

lm_result1 <- lm(Y_diff ~ X_diff, data =group_data)
summary(lm_result1) ## substantially smaller sd of the estimate

Call:
lm(formula = Y_diff ~ X_diff, data = group_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.4238 -1.2954 -0.2577  2.0825  5.0432 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   8.9943     1.4096   6.381 0.000697 ***
X_diff        5.3705     0.5992   8.964 0.000108 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.734 on 6 degrees of freedom
Multiple R-squared:  0.9305,    Adjusted R-squared:  0.9189 
F-statistic: 80.34 on 1 and 6 DF,  p-value: 0.0001077
lm_result2 <- lm(Y_diff ~ X_diff + X_mean, data =group_data)
summary(lm_result2) 

Call:
lm(formula = Y_diff ~ X_diff + X_mean, data = group_data)

Residuals:
      1       2       3       4       5       6       7       8 
-0.4555  5.1236  0.1038  1.1179 -2.6106 -1.9925 -4.4907  3.2041 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   8.5220     1.4745   5.780 0.002181 ** 
X_diff        5.9431     0.8138   7.303 0.000754 ***
X_mean       -1.0298     0.9969  -1.033 0.348978    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.713 on 5 degrees of freedom
Multiple R-squared:  0.9427,    Adjusted R-squared:  0.9198 
F-statistic: 41.15 on 2 and 5 DF,  p-value: 0.0007848
LS0tCnRpdGxlOiAiUiBleGFtcGxlIDQ6IHRoZSBDaGlsZHJlbuKAmXMgdGVsZXZpc2lvbiB3b3Jrc2hvcCBleHBlcmltZW50LiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhlIENoaWxkcmVu4oCZcyB0ZWxldmlzaW9uIHdvcmtzaG9wIGV4cGVyaW1lbnQuICAKCmBgYHtyfQojIyBEYXRhIGlucHV0CgpXIDwtIHJlcChjKDAsIDEpLCA4KQpHIDwtIGFzLnZlY3RvcihyYmluZCgxOjgsIDE6OCkpClggPC0gYygxMi45LCAxMiwgMTUuMSwgMTIuMywgMTYuOCwgMTcuMiwgMTUuOCwgMTguOSwgMTMuOSwgMTUuMywgMTQuNSwgMTYuNiwgMTcsIDE2LCAxNS44LCAyMC4xKQpZIDwtIGMoNTQuNiwgNjAuNiwgNTYuNSwgNTUuNSwgNzUuMiwgODQuOCwgNzUuNiwgMTAxLjksIDU1LjMsIDcwLjYsIDU5LjMsIDc4LjQsIDg3LCA4NC4yLCA3My43LCAxMDguNikKZGF0YSA8LSBkYXRhLmZyYW1lKEcsIFcsIFgsIFkpCmRhdGEKCmxpYnJhcnkoZ2dwdWJyKQoKdGVtcCA8LSBkYXRhLmZyYW1lKCJDb250cm9sIiA9IGRhdGEkWVtkYXRhJFcgPT0gMF0sICJUcmVhdG1lbnQiID0gZGF0YSRZW2RhdGEkVyA9PSAxXSkKdGVtcApnZ3BhaXJlZChkYXRhID0gdGVtcCwgY29uZDEgPSAiQ29udHJvbCIsIGNvbmQyID0gIlRyZWF0bWVudCIsIGZpbGwgPSAiY29uZGl0aW9uIiwgcGFsZXR0ZSA9ICJqY28iLCBsaW5lLmNvbG9yID0gImdyYXkiLCAKICAgICAgICAgeWxhYiA9ICJQb3N0LXRlc3QgU2NvcmUiKQoKdGVtcCA8LSBkYXRhLmZyYW1lKCJDb250cm9sIiA9IGRhdGEkWFtkYXRhJFcgPT0gMF0sICJUcmVhdG1lbnQiID0gZGF0YSRYW2RhdGEkVyA9PSAxXSkKZ2dwYWlyZWQoZGF0YSA9IHRlbXAsIGNvbmQxID0gIkNvbnRyb2wiLCBjb25kMiA9ICJUcmVhdG1lbnQiLCBmaWxsID0gImNvbmRpdGlvbiIsIHBhbGV0dGUgPSAiamNvIiwgbGluZS5jb2xvciA9ICJncmF5IiwgCiAgICAgICAgIHlsYWIgPSAiUHJlLXRlc3QgU2NvcmUiKQpgYGAKCgotIENvbXB1dGUgRmlzaGVyJ3MgZXhhY3QgcC12YWx1ZQoKYGBge3J9Cgp0ZXN0U3RhdCA8LSBmdW5jdGlvbihZMCwgWTEsIHcsIHBhaXJfaWR4LCBtZXRob2QgPSAibWVhbiBkaWZmIikgewogbiA8LSBsZW5ndGgoWTApCiBpZiAobWV0aG9kID09ICJtZWFuIGRpZmYiKQogICB2YWwgPC0gYWJzKG1lYW4oWTBbdyA9PSAxXSkgLSBtZWFuKFkwW3cgPT0gMF0pKSAjIyByZXBsYWNlIGFicyhtZWFuKFkxW3cgPT0gMV0pIC0gbWVhbihZMFt3ID09IDBdKS10YXUpCiBlbHNlIGlmIChtZXRob2QgPT0gInJhbmsgZGlmZiIpewogIHIgPC0gcmFuayhZMCkKICB2YWwgPC0gYWJzKG1lYW4oclt3ID09IDFdKSAtIG1lYW4oclt3ID09IDBdKSkKIH0gZWxzZSBpZiAobWV0aG9kID09ICJ3aXRoaW4tcGFpciByYW5rIGRpZmYiKSB7CiAgIHBhaXJzIDwtIHVuaXF1ZShwYWlyX2lkeCkKICAgdiA8LSBzYXBwbHkocGFpcnMsIGZ1bmN0aW9uKGlkeCkgewogICAgIFl0IDwtIFkwW3BhaXJfaWR4ID09IGlkeCAmIHcgPT0gMV0KICAgICBZYyA8LSBZMFtwYWlyX2lkeCA9PSBpZHggJiB3ID09IDBdCiAgICAgcmV0dXJuKChZdCA+IFljKSAtIChZdCA8IFljKSkKICAgfSkKICAgdmFsIDwtIGFicygyICogc3VtKHYpL2xlbmd0aChZMCkpCiB9CiAgcmV0dXJuKHZhbCkKfQoKZmluZC5wLnZhbHVlIDwtIGZ1bmN0aW9uKHRhdSwgeW9icywgdywgcGFpcl9pZHgsIHNlZWQgPSAwLCBtZXRob2QgPSAibWVhbiBkaWZmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBCID0gMTAwMDAsIGVycm9yID0gMWUtMTApewogICMjIGVycm9yIGlzIHRvIGZpeCBvdXIgcHJvYmxlbXMgd2l0aCBmbG9hdGluZyBwb2ludCBlcnJvcnMKICBuIDwtIGxlbmd0aCh5b2JzKQogIHkwIDwtIHJlcChOQSwgbikKICB5MSA8LSByZXAoTkEsIG4pCiAgCiAgeTFbdyA9PSAxXSA8LSB5b2JzW3cgPT0gMV0KICB5MFt3ID09IDBdIDwtIHlvYnNbdyA9PSAwXQogIAogIHkxW3cgPT0gMF0gPC0geW9ic1t3ID09IDBdICsgdGF1CiAgeTBbdyA9PSAxXSA8LSB5b2JzW3cgPT0gMV0gLSB0YXUKICAKICB0Lm9icyA8LSAgdGVzdFN0YXQoeTAsIHkxLCB3LCBwYWlyX2lkeCwgbWV0aG9kID0gbWV0aG9kKQogIAogIAogIHNldC5zZWVkKHNlZWQpCiAgcGFpcnMgPC0gdW5pcXVlKHBhaXJfaWR4KQogIHQuc3RhdCA8LSBzYXBwbHkoMTpCLCBmdW5jdGlvbihpKXsKICAgIHcuaXRlciA8LSByZXAoTkEsIG4pCiAgICBmb3IgKGkgaW4gMTpsZW5ndGgocGFpcnMpKSB7CiAgICAgIHRlbXAuaWR4IDwtIHdoaWNoKHBhaXJfaWR4ID09IHBhaXJzW2ldKQogICAgICB3Lml0ZXJbc2FtcGxlKHRlbXAuaWR4KV0gPC0gYygwLCAxKQogICAgfQogICAgcmV0dXJuKHRlc3RTdGF0KHkwLCB5MSwgdy5pdGVyLCBwYWlyX2lkeCwgbWV0aG9kID0gbWV0aG9kKSkKICB9KQoKICAjIHN1YnRyYWN0aW5nIGVycm9yIGZpeGVzIGZsb2F0aW5nIHBvaW50IGVycm9ycwogIHAudmFsIDwtIHN1bSh0LnN0YXQgPj0gKHQub2JzIC0gZXJyb3IpKS9CCiAgcmVzIDwtIGModC5vYnMsIHAudmFsKQogIG5hbWVzKHJlcykgPC0gcGFzdGUobWV0aG9kLCBjKCJ0ZXN0IHN0YXRzIiwgInAtdmFsdWUiKSkKICByZXR1cm4ocmVzKQp9CgoKZmluZC5wLnZhbHVlKDAsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcpCmZpbmQucC52YWx1ZSgwLCBkYXRhJFksIGRhdGEkVywgZGF0YSRHLCBtZXRob2QgPSAicmFuayBkaWZmIikKZmluZC5wLnZhbHVlKDAsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcsIG1ldGhvZCA9ICJ3aXRoaW4tcGFpciByYW5rIGRpZmYiKQoKYGBgCgoKLSBXaGF0IGlmIHdlIHVzZSBpZ25vcmUgdGhlIHBhaXJ3aXNlIHJhbmRvbWl6YXRpb24gbWVjaGFuaXNtIGFuZCB0cmVhdCBpdCBhcyBjb21wbGV0ZSByYW5kb21pemF0aW9uPwoKYGBge3J9CmZpbmQucC52YWx1ZS53cm9uZyA8LSBmdW5jdGlvbih0YXUsIHlvYnMsIHcsIHBhaXJfaWR4LCBzZWVkID0gMCwgbWV0aG9kID0gIm1lYW4gZGlmZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgQiA9IDEwMDAwLCBlcnJvciA9IDFlLTEwKXsKICAjIyBlcnJvciBpcyB0byBmaXggb3VyIHByb2JsZW1zIHdpdGggZmxvYXRpbmcgcG9pbnQgZXJyb3JzCiAgbiA8LSBsZW5ndGgoeW9icykKICB5MCA8LSByZXAoTkEsIG4pCiAgeTEgPC0gcmVwKE5BLCBuKQogIAogIHkxW3cgPT0gMV0gPC0geW9ic1t3ID09IDFdCiAgeTBbdyA9PSAwXSA8LSB5b2JzW3cgPT0gMF0KICAKICB5MVt3ID09IDBdIDwtIHlvYnNbdyA9PSAwXSArIHRhdQogIHkwW3cgPT0gMV0gPC0geW9ic1t3ID09IDFdIC0gdGF1CiAgCiAgdC5vYnMgPC0gIHRlc3RTdGF0KHkwLCB5MSwgdywgcGFpcl9pZHgsIG1ldGhvZCkKICAKICAKICBzZXQuc2VlZChzZWVkKQogIHBhaXJzIDwtIHVuaXF1ZShwYWlyX2lkeCkKICB0LnN0YXQgPC0gc2FwcGx5KDE6QiwgZnVuY3Rpb24oaSl7CiAgICB3Lml0ZXIgPC0gc2FtcGxlKHcpCiAgICByZXR1cm4odGVzdFN0YXQoeTAsIHkxLCB3Lml0ZXIsIHBhaXJfaWR4LCBtZXRob2QgPSBtZXRob2QpKQogIH0pCgogICMgc3VidHJhY3RpbmcgZXJyb3IgZml4ZXMgZmxvYXRpbmcgcG9pbnQgZXJyb3JzCiAgcC52YWwgPC0gc3VtKHQuc3RhdCA+PSAodC5vYnMgLSBlcnJvcikpL0IKICByZXMgPC0gYyh0Lm9icywgcC52YWwpCiAgbmFtZXMocmVzKSA8LSBwYXN0ZShtZXRob2QsIGMoInRlc3Qgc3RhdHMiLCAicC12YWx1ZSIpKQogIHJldHVybihyZXMpCn0KCgpmaW5kLnAudmFsdWUud3JvbmcoMCwgZGF0YSRZLCBkYXRhJFcsIGRhdGEkRykKZmluZC5wLnZhbHVlLndyb25nKDAsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcsIG1ldGhvZCA9ICJyYW5rIGRpZmYiKQpgYGAKIFdlIGdldCBsYXJnZXIgcC12YWx1ZXMgZnJvbSBjb21wbGV0ZSByYW5kb21pemF0aW9uIG1lY2hhbmlzbS4KIAogLSBDb21wYXJlIDk1XCUgQ0kgb2YgRmlzaGVyIFYuUy4gTmV5bWFuCiAKYGBge3J9CiMjIENJIGZyb20gRmlzaGVyCnB2YWxzIDwtIHNhcHBseSgwOjMwLCBmdW5jdGlvbih0YXUpIGZpbmQucC52YWx1ZSh0YXUsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcpWzJdKQpuYW1lcyhwdmFscykgPC0gMDozMApwdmFscwoKTEIgPC0gc2FwcGx5KHNlcSgxLCAyLCAwLjEpLCBmdW5jdGlvbih0YXUpIGZpbmQucC52YWx1ZSh0YXUsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcpWzJdKQpuYW1lcyhMQikgPC0gc2VxKDEsIDIsIDAuMSkKTEIKClVCIDwtIHNhcHBseShzZXEoMjUsIDI2LCAwLjEpLCBmdW5jdGlvbih0YXUpIGZpbmQucC52YWx1ZSh0YXUsIGRhdGEkWSwgZGF0YSRXLCBkYXRhJEcpWzJdKQpuYW1lcyhVQikgPC0gc2VxKDI1LCAyNiwgMC4xKQpVQgpgYGAKIFRoZSA5NVwlIENJIGZyb20gRmlzaGVyJ3MgZXhhY3QgcC12YWx1ZXMgaXMgWzEuOSwgMjUuNl0KIAoKYGBge3J9CiMjIENJIGZyb20gTmV5bWFuCnBhaXJzIDwtIHVuaXF1ZShkYXRhJEcpCnRhdV9oYXRfdmVjIDwtIHNhcHBseShwYWlycywgZnVuY3Rpb24oaWR4KSB7CiAgWXQgPC0gZGF0YSRZW2RhdGEkRyA9PSBpZHggJiBkYXRhJFcgPT0gMV0KICBZYyA8LSBkYXRhJFlbZGF0YSRHID09IGlkeCAmIGRhdGEkVyA9PSAwXQogIHJldHVybihZdCAtIFljKQp9KQoKdGF1X2hhdCA8LSBtZWFuKHRhdV9oYXRfdmVjKQpzZF90YXVfaGF0IDwtIHNkKHRhdV9oYXRfdmVjKS9zcXJ0KGxlbmd0aCh0YXVfaGF0X3ZlYykpCiAgCiMjIDk1JSBDSQpwcmludChjKHRhdV9oYXQtIDEuOTYgKiBzZF90YXVfaGF0LCB0YXVfaGF0ICsgMS45NiAqIHNkX3RhdV9oYXQpKQpgYGAKCi0gV2hhdCBkb2VzIE5leW1hbidzIENJIGxvb2sgbGlrZSBpZiB3ZSB0cmVhdCB0aGUgZGF0YSBhcyBmcm9tIGNvbXBsZXRlbHkgcmFuZG9taXplZCBleHBlcmltZW50CgpgYGB7cn0KIyMgQ0kgZnJvbSBOZXltYW4KCnRhdV9oYXQgPC0gbWVhbihkYXRhJFlbZGF0YSRXID09IDFdKSAtIG1lYW4oZGF0YSRZW2RhdGEkVyA9PSAwXSkKCnN0IDwtIHNkKGRhdGEkWVtkYXRhJFcgPT0gMV0pCnNjIDwtIHNkKGRhdGEkWVtkYXRhJFcgPT0gMF0pCnZhcmhhdF90YXVoYXQgPC0gc3ReMi9zdW0oZGF0YSRXID09IDEpICsgc2NeMi9zdW0oZGF0YSRXID09IDApCgpwcmludChjKHRhdV9oYXQgLSAxLjk2ICogc3FydCh2YXJoYXRfdGF1aGF0KSwgdGF1X2hhdCArIDEuOTYgKiBzcXJ0KHZhcmhhdF90YXVoYXQpKSkKYGBgCgotIExpbmVhciByZWdyZXNzaW9uIHJlc3VsdHMKCmBgYHtyfQojIyBuZWVkIHRvIGNyZWF0ZSBwYWlyLWxldmVsIGRhdGEKcGFpcnMgPC0gdW5pcXVlKGRhdGEkRykKWF9iYXIgPC0gbWVhbihkYXRhJFgpCmdyb3VwX2RhdGEgPC0gc2FwcGx5KHBhaXJzLCBmdW5jdGlvbihpZHgpIHsKICBZdCA8LSBkYXRhJFlbZGF0YSRHID09IGlkeCAmIGRhdGEkVyA9PSAxXQogIFljIDwtIGRhdGEkWVtkYXRhJEcgPT0gaWR4ICYgZGF0YSRXID09IDBdCiAgWHQgPC0gZGF0YSRYW2RhdGEkRyA9PSBpZHggJiBkYXRhJFcgPT0gMV0KICBYYyA8LSBkYXRhJFhbZGF0YSRHID09IGlkeCAmIGRhdGEkVyA9PSAwXQogIFlfZGlmZiA8LSBZdCAtIFljCiAgWF9kaWZmIDwtIFh0IC0gWGMKICBYX21lYW4gPC0gKFh0ICsgWGMpLzIgLSBYX2JhcgogIHJldHVybihjKFhfbWVhbiwgWF9kaWZmLCBZX2RpZmYpKQp9KQpncm91cF9kYXRhCgpncm91cF9kYXRhIDwtIGRhdGEuZnJhbWUodChncm91cF9kYXRhKSkKY29sbmFtZXMoZ3JvdXBfZGF0YSkgPC0gYygiWF9tZWFuIiwgIlhfZGlmZiIsICJZX2RpZmYiKQpncm91cF9kYXRhCgpsbV9yZXN1bHQxIDwtIGxtKFlfZGlmZiB+IFhfZGlmZiwgZGF0YSA9Z3JvdXBfZGF0YSkKc3VtbWFyeShsbV9yZXN1bHQxKSAjIyBzdWJzdGFudGlhbGx5IHNtYWxsZXIgc2Qgb2YgdGhlIGVzdGltYXRlCgpsbV9yZXN1bHQyIDwtIGxtKFlfZGlmZiB+IFhfZGlmZiArIFhfbWVhbiwgZGF0YSA9Z3JvdXBfZGF0YSkKc3VtbWFyeShsbV9yZXN1bHQyKSAKYGBg