[1] Loading packages

– All analyses were confirmed by the corresponding author and finally conducted at 2023/05/09

Checking the version of R itself and rEDM (v0.6.9)

#remotes::install_github("ha0ye/rEDM")
#install.packages("C:/Users/*****/rEDM_0.6.9.tar.gz", repos = NULL, type = "source")
library(dplyr)

 次のパッケージを付け加えます: ‘dplyr’ 

 以下のオブジェクトは ‘package:stats’ からマスクされています:

    filter, lag

 以下のオブジェクトは ‘package:base’ からマスクされています:

    intersect, setdiff, setequal, union
library(rEDM)
If you're new to the rEDM package, please check out 
                           the tutorial:
> vignette("rEDM-tutorial")
library(ggplot2)
library(ggeffects)
library(MASS)

 次のパッケージを付け加えます: ‘MASS’ 

 以下のオブジェクトは ‘package:dplyr’ からマスクされています:

    select
sessionInfo()
R version 4.2.0 (2022-04-22 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=Japanese_Japan.utf8  LC_CTYPE=Japanese_Japan.utf8   
[3] LC_MONETARY=Japanese_Japan.utf8 LC_NUMERIC=C                   
[5] LC_TIME=Japanese_Japan.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] MuMIn_1.47.5    MASS_7.3-58.3   ggeffects_1.2.1 ggplot2_3.4.1  
[5] rEDM_0.6.9      dplyr_1.1.0    

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.10      rstudioapi_0.14  knitr_1.42       magrittr_2.0.3  
 [5] tidyselect_1.2.0 munsell_0.5.0    lattice_0.20-45  colorspace_2.1-0
 [9] R6_2.5.1         rlang_1.0.6      fansi_1.0.4      tools_4.2.0     
[13] grid_4.2.0       nlme_3.1-157     gtable_0.3.1     xfun_0.37       
[17] utf8_1.2.2       cli_3.6.0        withr_2.5.0      tibble_3.1.8    
[21] lifecycle_1.0.3  Matrix_1.5-3     vctrs_0.5.2      codetools_0.2-18
[25] glue_1.6.2       compiler_4.2.0   pillar_1.8.1     generics_0.1.3  
[29] scales_1.2.1     stats4_4.2.0     pkgconfig_2.0.3 
packageVersion("rEDM")
[1] ‘0.6.9’

[2] Terms defined

– ヨツモンマメゾウムシ = ヨツモン = Yotsumon = Callosobrucbus maculatus = Cm = “Y”

– アズキゾウムシ = アズキ = Azuki = Callosobruchus chinensis = Cc = “A”

[3] Loading raw data

#file from 2022/02/22 reanalysis 
data <- read.csv("data_20230222en.csv", header = T)
#data <- read.csv("data_20230222.csv", header = T)
data

[4] Setting the volumes of cages (Small, Medium, Large, and Huge)

Smallvolume <- 8.5*6*3.5
Mediumvolume <- 13.5*8.5*4.5 
Largevolume <- 18.5*14*6.5
Hugevolume <- 22*15.5*7.5

[5] Preprocessing the raw data

no_replicates <- 64 #the total number of replicates: 16 replicates within a cage size x four cage sizes
#converting the data to list for each cage ID
datalist <- lapply(1:no_replicates, function(i) subset(data,ID == i))
datalist[[10]] #example
NA

[6] Quantifying the coexistence period

[6.1] counting the extinction timing

[6.1.1] For Cm: Counting the number of weeks with zero abundance

#Counting the number of weeks when the abundance is continuously zero , back-calculated from the final week to the first week 
count <- numeric(no_replicates) #numeric vector for 64 samples
weeks <- numeric(no_replicates) #number of weeks for observations, which potentially dependend on replicates
for(j in 1:no_replicates){
  weeks[j] <- nrow(datalist[[j]])
  for(i in weeks[j]:1){
    if(datalist[[j]]$YotsumonTotalL[i] == 0){
      count[j] <- count[j] + 1
    } else{
      break
    }
  }
}
count
 [1]  0  1  0  0  0  0  0  0  0  0  0  0  0  6  0  0  0  0  0  0  0  0  0
[25]  0  3  1  0  6  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  2 15  0
[49]  0  0  0  0  0  0  7  0  0  0  0  0  0  0  2  0

[6.1.2] For Cc: Counting the number of weeks with zero abundance

#Counting the number of weeks when the abundance is continuously zero , back-calculated from the final week to the first week 
count2 <- numeric(no_replicates)  #numeric vector for 64 samples

for(j in 1:no_replicates){
  for(i in weeks[j]:1){
    if(datalist[[j]]$AzukiTotalL[i] == 0){
      count2[j] <- count2[j] + 1
    } else{
      break
    }
  }
}
count2
 [1]  6  6  5  5  5  5  5  5  5  5  5  5  5  0 12  5  5  5  7  5  7  5  5  5
[25]  5  7  5  7  0  7  7  5  5  5  5  5  5  0  5  5  5  5  5  5  5  5  0  5
[49]  5  5  6  0  7 12  1  5  5  5  5  5  5  5  6  5

[6.1.3] Checking the timing of earlier extinction

The code by Miki, it is more natural and simpler.

extinct <- numeric(no_replicates)
for(i in 1:no_replicates){
  if(count[i] >= count2[i]) {
    extinct[i] <- count[i]
  } else {
    extinct[i] <- count2[i]
  }
}
extinct
 [1]  6  6  5  5  5  5  5  5  5  5  5  5  5  6 12  5  5  5  7  5  7  5  5  5
[25]  5  7  5  7  6  7  7  5  5  5  5  5  5  0  5  5  5  5  5  5  5  5 15  5
[49]  5  5  6  0  7 12  7  5  5  5  5  5  5  5  6  5

[6.2] Data rearrangement for further analysis

[6.2.1] Deleting the datapoints from the 2nd week of the extinction to the final week

shavedata <- lapply(1:64, function(i) head(datalist[[i]], n = weeks[i] - extinct[i] + 1))
shavedataframe <- NULL
for(i in 1:64)  shavedataframe <-  rbind.data.frame(shavedataframe, shavedata[[i]])
shavedataframe

[6.2.2] Decomposing the modified data (shavedataframe) into multiple datasets depending on cage size and extracting the replicate ID

#Small 
Smallall <- subset(shavedataframe, Cage.size == "Small")
SmallID <- unique(Smallall$ID)
Small <- list()
for(i in 1:length(SmallID)){
  Small[[i]] <- subset(Smallall, ID == SmallID[i])
}
Small[[2]] #example

#Medium
Mediumall <- subset(shavedataframe, Cage.size == "Medium")
MediumID <- unique(Mediumall$ID)
Medium <- list()
for(i in 1:length(MediumID)){
  Medium[[i]] <- subset(Mediumall, ID == MediumID[i])
}
Medium[[2]] #example

#Large
Largeall <- subset(shavedataframe, Cage.size == "Large")
LargeID <- unique(Largeall$ID)
Large <- list()
for(i in 1:length(LargeID)){
  Large[[i]] <- subset(Largeall, ID == LargeID[i])
}
Large[[2]] #example

#Huge
Hugeall <- subset(shavedataframe, Cage.size == "Huge")
HugeID <- unique(Hugeall$ID)
Huge <- list()
for(i in 1:length(HugeID)){
  Huge[[i]] <-subset(Hugeall, ID == HugeID[i])
}
Huge[[2]] #example

[6.2.3] Assignment of strain ID

#Small
Smallstrain <- NULL
for(i in 1:length(Small)){
  Smallstrain[i] <- unique(Small[[i]]$Strain)
}
Smallstrain
 [1] "jc-F" "msC"  "jc-F" "msC"  "jc-F" "jc-F" "jc-F" "jc-F" "msC"  "msC" 
[11] "msC"  "msC"  "jc-F" "jc-F" "msC"  "msC" 
#Medium
Mediumstrain <- NULL
for(i in 1:length(Medium)){
  Mediumstrain[i] <- unique(Medium[[i]]$Strain)
}
Mediumstrain
 [1] "jc-F" "msC"  "msC"  "jc-F" "jc-F" "jc-F" "jc-F" "jc-F" "msC"  "msC" 
[11] "msC"  "msC"  "jc-F" "jc-F" "msC"  "msC" 
#Large
Largestrain <- NULL
for(i in 1:length(Large)){
  Largestrain[i] <- unique(Large[[i]]$Strain)
}
Largestrain
 [1] "jc-F" "msC"  "msC"  "jc-F" "msC"  "jc-F" "jc-F" "jc-F" "msC"  "msC" 
[11] "msC"  "msC"  "jc-F" "jc-F" "msC"  "msC" 
#Huge
Hugestrain <- NULL
for(i in 1:length(Huge)){
  Hugestrain[i] <- unique(Huge[[i]]$Strain)
}
Hugestrain
 [1] "jc-F" "msC"  "msC"  "jc-F" "jc-F" "jc-F" "jc-F" "jc-F" "msC"  "msC" 
[11] "msC"  "jc-F" "jc-F" "msC"  "msC"  "msC" 

[6.2.4] Generating the CSV file for the data where additional zero weeks data were deleted

write.csv(shavedataframe, "shavedataframe.csv")

[6.3] Calculating the coexistence period (weeks) for each cage size

[6.3.1] Small size

Smallcoweek <- vector()
for(i in 1:length(Small)){
  Smallcoweek[i] <- nrow(Small[[i]]) - 1 #Extinction occurred at the final week
}
cat("The number of replicates for small size cage:", length(Small), "\n")
The number of replicates for small size cage: 16 
Smallcoweek
 [1] 25 13 21  9 12 27 23 18  9 15 12 11 11 11  8  9

[6.3.2] Medium size

Mediumcoweek <- vector()
for(i in 1:length(Medium)){
  Mediumcoweek[i] <- nrow(Medium[[i]]) - 1 #Extinction occurred at the final week
}
cat("The number of replicates for medium size cage:", length(Medium), "\n")
The number of replicates for medium size cage: 16 
Mediumcoweek
 [1] 21 17  9 14 28 31 28 19 15 46 19 15 15 24 11  9

[6.3.3] Large size

Largecoweek <- vector()
for(i in 1:length(Large)){
  Largecoweek[i] <- nrow(Large[[i]]) - 1 #Extinction occurred at the final week
}
cat("The number of replicates for large size cage:", length(Large), "\n")
The number of replicates for large size cage: 16 
Largecoweek
 [1] 33 18 18 36 15 28 27 28 15 19 19 19 42 23 15 15

[6.3.4] Huge size

Hugecoweek <- vector()
for(i in 1:length(Huge)){
  Hugecoweek[i] <- nrow(Huge[[i]]) - 1 #Extinction occurred at the final week
}
cat("The number of replicates for huge size cage:", length(Huge), "\n")
The number of replicates for huge size cage: 16 
Hugecoweek
 [1] 34 15 19 30 30 28 28 27 27 27 32 31 23 15 23 16

[6.4] Evaluating the winner of the competition

– count: Cm Yotsumon, the number of weeks with continuously zero abundance

– count2: Cc Azuki, the number of weeks with continuously zero abundance

competitionwinner <- vector()

for(i in 1:no_replicates){
  if(count[i] < count2[i]){
    competitionwinner[i] <- "C.m"
  } else if (count[i] == count2[i]){
    competitionwinner[i] <- "Coexistence"
  } else{
    competitionwinner[i] <- "C.c"
  }
}
competitionwinner
 [1] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
 [6] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[11] "C.m"         "C.m"         "C.m"         "C.c"         "C.m"        
[16] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[21] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[26] "C.m"         "C.m"         "C.m"         "C.c"         "C.m"        
[31] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[36] "C.m"         "C.m"         "Coexistence" "C.m"         "C.m"        
[41] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[46] "C.m"         "C.c"         "C.m"         "C.m"         "C.m"        
[51] "C.m"         "Coexistence" "C.m"         "C.m"         "C.c"        
[56] "C.m"         "C.m"         "C.m"         "C.m"         "C.m"        
[61] "C.m"         "C.m"         "C.m"         "C.m"        

[6.5] Generating the dataframe listing coexistence week, strain, and the winner of competition

[6.5.1] This is used for Table S1

TableS1 <- data.frame("Cage Size" = c(rep("Small",length(Small)),
                                  rep("Medium",length(Medium)),
                                  rep("Large",length(Large)),
                                  rep("Huge",length(Huge))),
                    "ID" = c(SmallID,MediumID,LargeID,HugeID),
                    "Strain" = c(Smallstrain,Mediumstrain,Largestrain,Hugestrain),
                    "Coexistence_periods" = c(Smallcoweek,Mediumcoweek,Largecoweek,Hugecoweek),
                    "Result_of_competition" = competitionwinner)
TableS1

[6.5.2] Generating the CSV file for TableS1

write.csv(TableS1,"TableS1.csv")

[7] Checking the relationship between the coexistence periods and cage sizes

[7.1] Generatng the dataframe for ggplot & glm analysis

coexist_size_dataframe <- data.frame("Coexistence_periods" = c(Smallcoweek,Mediumcoweek,Largecoweek,Hugecoweek),
"Volume" = c(rep(Smallvolume,length(Smallcoweek)),rep(Mediumvolume,length(Mediumcoweek)),rep(Largevolume,length(Largecoweek)),rep(Hugevolume,length(Hugecoweek))),
"Cage_size" = as.factor(c(rep("Small",length(Smallcoweek)),rep("Medium",length(Mediumcoweek)),rep("Large",length(Largecoweek)),rep("Huge",length(Hugecoweek)))))

#check the class of vectors
class(coexist_size_dataframe$Volume)
[1] "numeric"
class(coexist_size_dataframe$Cage_size)
[1] "factor"
#Change the order of factor levels
coexist_size_dataframe$Cage_size <- factor(coexist_size_dataframe$Cage_size,levels = c("Small","Medium","Large","Huge"))

coexist_size_dataframe$Cage_size
 [1] Small  Small  Small  Small  Small  Small  Small  Small  Small  Small 
[11] Small  Small  Small  Small  Small  Small  Medium Medium Medium Medium
[21] Medium Medium Medium Medium Medium Medium Medium Medium Medium Medium
[31] Medium Medium Large  Large  Large  Large  Large  Large  Large  Large 
[41] Large  Large  Large  Large  Large  Large  Large  Large  Huge   Huge  
[51] Huge   Huge   Huge   Huge   Huge   Huge   Huge   Huge   Huge   Huge  
[61] Huge   Huge   Huge   Huge  
Levels: Small Medium Large Huge
coexist_size_dataframe

[7.2] Drawing Figure 2

[7.2.1] By ggplot2

#With mean
Fig2 <- ggplot(data = coexist_size_dataframe,
               mapping = aes(x = Volume, y= Coexistence_periods, group = Cage_size,fill = Cage_size)) + 
  geom_violin() + 
  geom_boxplot(width = 30, fill = "black", outlier.color = NA) +
  stat_summary(fun = mean, geom = "point", fill = "white", shape = 21, size = 3) + 
  labs(y = "Coexistence periods (week)",x = "Volume (cm³)")
print(Fig2)


#Simpler plot with GLM line
Fig2.1 <- ggplot(data = coexist_size_dataframe, aes(x = Volume, y = Coexistence_periods))
Fig2.1 <- Fig2.1 + geom_point(size = 3, shape = 21)
Fig2.1 <- Fig2.1 + geom_smooth(method = 'glm', method.args = list(family = 'poisson'), se = T, color = 'black')
Fig2.1 <- Fig2.1 + labs(y = "Coexistence periods (week)", x = "Volume (cm3)")
print(Fig2.1)

[7.2.2] Drawing Figure 2 by base package

plot(
  Coexistence_periods ~ Volume,
  data = coexist_size_dataframe,
  xlab = "VOlume (cm3)",
  ylab = "Coexitence period (weeks)"
)

[7.3] GLM (with Poisson dist.)

summary(glm(Coexistence_periods ~ Volume, data = coexist_size_dataframe, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ Volume, family = "poisson", 
    data = coexist_size_dataframe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3948  -1.5124  -0.5415   0.9776   5.5354  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) 2.788e+00  4.871e-02  57.243  < 2e-16 ***
Volume      1.863e-04  2.869e-05   6.492 8.48e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 218.47  on 63  degrees of freedom
Residual deviance: 176.42  on 62  degrees of freedom
AIC: 487.32

Number of Fisher Scoring iterations: 4

[8] Analyses using rEDM package

[8.0] Terms defined again

– ヨツモンマメゾウムシ = ヨツモン = Yotsumon = Callosobrucbus maculatus = Cm = “Y”

– アズキゾウムシ = アズキ = Azuki = Callosobruchus chinensis = Cc = “A”

[8.1] Basic EDM analysis for each replicate individually

[8.1.1] Preprocessing the time series data

– Sorting for each cage size, from longest coexistence period to shortest

#Small 
Smalllength <- subset(TableS1, TableS1$Cage.Size == "Small")
Smalllength[order(Smalllength$Coexistence_periods, decreasing = TRUE),]
#Medium
Mediumlength <- subset(TableS1, TableS1$Cage.Size == "Medium")
Mediumlength[order(Mediumlength$Coexistence_periods, decreasing = TRUE),]
#Large
Largelength <- subset(TableS1, TableS1$Cage.Size == "Large")
Largelength[order(Largelength$Coexistence_periods, decreasing = TRUE),]
#Huge
Hugelength <- subset(TableS1,TableS1$Cage.Size == "Huge")
Hugelength[order(Hugelength$Coexistence_periods, decreasing = TRUE),]

[8.1.2] Simplex projection for each replicate

– The goal is to obtain the optimal embedding dimension E*

– Warning when executing simplex() is expected one so no problems

[8.1.2.1] For small cages
For Cm

Simplex_Small_Y <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Small)){
  Simplex_Small_Y[[i]] <- simplex(Small[[i]]$YotsumonTotalL, lib = c(1, nrow(Small[[i]])), pred = c (1, nrow(Small[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Small_BestE_Y <- vector()
for(i in 1:length(Simplex_Small_Y)){
  Small_BestE_Y[i] <- which.max(Simplex_Small_Y[[i]]$rho)
}
Small_BestE_Y
 [1] 9 4 4 1 2 8 8 5 1 5 4 4 1 4 1 1
#Combining it with replicate ID
Small_ID_BestE_Y <- NULL
for(i in 1:length(Small)){
  Small_ID_BestE_Y <- rbind.data.frame(Small_ID_BestE_Y, cbind(Small[[i]][1, ]$ID, Small_BestE_Y[i]))
}

#adding column names
colnames(Small_ID_BestE_Y) <- c("ID","C.m_E")
Small_ID_BestE_Y
For Cc
Simplex_Small_A <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Small)){
  Simplex_Small_A[[i]] <- simplex(Small[[i]]$AzukiTotalL, lib = c(1, nrow(Small[[i]])), pred = c (1, nrow(Small[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Small_BestE_A <- vector()
for(i in 1:length(Simplex_Small_A)){
  Small_BestE_A[i] <- which.max(Simplex_Small_A[[i]]$rho)
}
Small_BestE_A
 [1] 5 6 4 2 1 5 5 3 3 5 5 1 1 2 1 3
#Combining it with replicate ID
Small_ID_BestE_A <- NULL
for(i in 1:length(Small)){
  Small_ID_BestE_A <- rbind.data.frame(Small_ID_BestE_A, cbind(Small[[i]][1, ]$ID, Small_BestE_A[i]))
}

#adding column names
colnames(Small_ID_BestE_A) <- c("ID","C.c_E")
Small_ID_BestE_A
[8.1.2.2] For Medium cages
For Cm
Simplex_Medium_Y <- list() #list for assigning results


#Executing simplex()
for(i in 1:length(Medium)){
  Simplex_Medium_Y[[i]] <- simplex(Medium[[i]]$YotsumonTotalL, lib = c(1, nrow(Medium[[i]])), pred = c (1, nrow(Medium[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Medium_BestE_Y <- vector()
for(i in 1:length(Simplex_Medium_Y)){
  Medium_BestE_Y[i] <- which.max(Simplex_Medium_Y[[i]]$rho)
}
Medium_BestE_Y
 [1]  4  4  1  4 10  7  5  4  5  7  1  1  4  6  4  1
for(i in 1:length(Medium)){
  Medium_ID_BestE_Y <- rbind.data.frame(Medium_ID_BestE_Y, cbind(Medium[[i]][1, ]$ID, Medium_BestE_Y[i]))
}

#adding column names
colnames(Medium_ID_BestE_Y) <- c("ID","C.m_E")
Medium_ID_BestE_Y
For Cc
Simplex_Medium_A <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Medium)){
  Simplex_Medium_A[[i]] <- simplex(Medium[[i]]$AzukiTotalL, lib = c(1, nrow(Medium[[i]])), pred = c (1, nrow(Medium[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Medium_BestE_A <- vector()
for(i in 1:length(Simplex_Medium_A)){
  Medium_BestE_A[i] <- which.max(Simplex_Medium_A[[i]]$rho)
}
Medium_BestE_A
 [1]  8  5  1  5  8  9  5  3  1  8  1  6  2 10  2  2
#Combining it with replicate ID
Medium_ID_BestE_A <- NULL
for(i in 1:length(Medium)){
  Medium_ID_BestE_A <- rbind.data.frame(Medium_ID_BestE_A, cbind(Medium[[i]][1, ]$ID, Medium_BestE_A[i]))
}

#adding column names
colnames(Medium_ID_BestE_A) <- c("ID","C.c_E")
Medium_ID_BestE_A
[8.1.2.3] For Large cages
For Cm
Simplex_Large_Y <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Large)){
  Simplex_Large_Y[[i]] <- simplex(Large[[i]]$YotsumonTotalL, lib = c(1, nrow(Large[[i]])), pred = c (1, nrow(Large[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Large_BestE_Y <- vector()
for(i in 1:length(Simplex_Large_Y)){
  Large_BestE_Y[i] <- which.max(Simplex_Large_Y[[i]]$rho)
}
Large_BestE_Y
 [1] 8 5 4 9 1 7 6 7 5 4 4 8 8 4 4 4
#Combining it with replicate ID
Large_ID_BestE_Y <- NULL
for(i in 1:length(Large)){
  Large_ID_BestE_Y <- rbind.data.frame(Large_ID_BestE_Y, cbind(Large[[i]][1, ]$ID, Large_BestE_Y[i]))
}

#adding column names
colnames(Large_ID_BestE_Y) <- c("ID","C.m_E")
Large_ID_BestE_Y
For Cc
Simplex_Large_A <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Large)){
  Simplex_Large_A[[i]] <- simplex(Large[[i]]$AzukiTotalL, lib = c(1, nrow(Large[[i]])), pred = c (1, nrow(Large[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Large_BestE_A <- vector()
for(i in 1:length(Simplex_Large_A)){
  Large_BestE_A[i] <- which.max(Simplex_Large_A[[i]]$rho)
}
Large_BestE_A
 [1]  2  2  5  8  6 10  9  6  4  3  5  3  2  9  3  2
#Combining it with replicate ID
Large_ID_BestE_A <- NULL
for(i in 1:length(Large)){
  Large_ID_BestE_A <- rbind.data.frame(Large_ID_BestE_A, cbind(Large[[i]][1, ]$ID, Large_BestE_A[i]))
}

#adding column names
colnames(Large_ID_BestE_A) <- c("ID","C.c_E")
Large_ID_BestE_A
[8.1.2.4] For Huge cages
For Cm
Simplex_Huge_Y <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Huge)){
  Simplex_Huge_Y[[i]] <- simplex(Huge[[i]]$YotsumonTotalL, lib = c(1, nrow(Huge[[i]])), pred = c (1, nrow(Huge[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Huge_BestE_Y <- vector()
for(i in 1:length(Simplex_Huge_Y)){
  Huge_BestE_Y[i] <- which.max(Simplex_Huge_Y[[i]]$rho)
}
Huge_BestE_Y
 [1]  6  1  8  8 10  4  8 10  5 10  6 10  4  4  4  4
#Combining it with replicate ID
Huge_ID_BestE_Y <- NULL
for(i in 1:length(Huge)){
  Huge_ID_BestE_Y <- rbind.data.frame(Huge_ID_BestE_Y, cbind(Huge[[i]][1, ]$ID, Huge_BestE_Y[i]))
}
colnames(Huge_ID_BestE_Y) <- c("ID","C.m_E")
Huge_ID_BestE_Y
For Cc
Simplex_Huge_A <- list() #list for assigning results

#Executing simplex()
for(i in 1:length(Huge)){
  Simplex_Huge_A[[i]] <- simplex(Huge[[i]]$AzukiTotalL, lib = c(1, nrow(Huge[[i]])), pred = c (1, nrow(Huge[[i]])), E = c(1:10))
}

#Picking up the optimal embedding dimension (E*)
Huge_BestE_A <- vector()
for(i in 1:length(Simplex_Huge_A)){
Huge_BestE_A
 [1]  7  5  1  8  1  6 10  9  7  3  5  3  5  5  2  3
#Combining it with replicate ID
Huge_ID_BestE_A <- NULL
for(i in 1:length(Huge)){
  Huge_ID_BestE_A <- rbind.data.frame(Huge_ID_BestE_A, cbind(Huge[[i]][1, ]$ID, Huge_BestE_A[i]))
}

#adding column names
colnames(Huge_ID_BestE_A) <- c("ID","C.c_E")
Huge_ID_BestE_A

[8.1.3] Summarizing simplex projection for each replicate

[8.1.3.1] Summarizing the optimal E
#For Small
Small_ID_BestE <- merge(Small_ID_BestE_Y, Small_ID_BestE_A, by = "ID")
Small_ID_BestE

#For Medium
Medium_ID_BestE <- merge(Medium_ID_BestE_Y, Medium_ID_BestE_A, by = "ID")
Medium_ID_BestE

#For Large
Large_ID_BestE <- merge(Large_ID_BestE_Y, Large_ID_BestE_A, by = "ID")
Large_ID_BestE

#For Huge
Huge_ID_BestE <- merge(Huge_ID_BestE_Y, Huge_ID_BestE_A, by = "ID")
Huge_ID_BestE
NA
[8.1.3.2] Determining the number of NA to be inserted for the subsequence analysis (combining several replicates)
com_Small_E <- apply(Small_ID_BestE[, -1], 1, max)
com_Medium_E <- apply(Medium_ID_BestE[, -1], 1, max)
com_Large_E <- apply(Large_ID_BestE[, -1], 1, max)
com_Huge_E <- apply(Huge_ID_BestE[, -1], 1, max)
com_Small_E
 [1] 9 6 4 2 2 8 8 5 3 5 5 4 1 4 1 3
com_Medium_E
 [1]  8  5  1  5 10  9  5  4  5  8  1  6  4 10  4  2
com_Large_E
 [1]  8  5  5  9  6 10  9  7  5  4  5  8  8  9  4  4
com_Huge_E
 [1]  7  5  8  8 10  6 10 10  7 10  6 10  5  5  4  4
[8.1.3.3] Merging the optimal E and the number of NA,combining with the coexistence periods (from Table S1)
#Merging the optimal E and the number of NA
Small_ID_BestE_NA <- data.frame(Small_ID_BestE, No.NA = com_Small_E)
Medium_ID_BestE_NA <- data.frame(Medium_ID_BestE, No.NA = com_Medium_E)
Large_ID_BestE_NA <- data.frame(Large_ID_BestE, No.NA = com_Large_E)
Huge_ID_BestE_NA <- data.frame(Huge_ID_BestE, No.NA = com_Huge_E)
#example
Huge_ID_BestE_NA

#Merging it with the coexistence period
SmallTable1base <- merge(subset(TableS1,TableS1$Cage.Size == "Small", select = c(ID, Coexistence_periods)), Small_ID_BestE_NA, by = "ID")
MediumTable1base <- merge(subset(TableS1,TableS1$Cage.Size == "Medium", select = c(ID, Coexistence_periods)), Medium_ID_BestE_NA, by = "ID")
LargeTable1base <- merge(subset(TableS1,TableS1$Cage.Size == "Large", select = c(ID, Coexistence_periods)), Large_ID_BestE_NA, by = "ID")
HugeTable1base <- merge(subset(TableS1,TableS1$Cage.Size == "Huge", select = c(ID, Coexistence_periods)), Huge_ID_BestE_NA, by = "ID")
#example 
LargeTable1base

[8.2] EDM analysis for the combined replicates that include >= 35 points

[8.2.1] Determining how to combine each replicate in order to make the combined time series longer than or equal to 35 points

– Noting that the length of each replicate is equal to the coexistence period + 1

– Therefore, 1) when the number of coexistence weeks should be greater than or equal to “34”, the combining with other replicates is not needed, but 2) for the number of the sum of the coexistence period for the combined replicate should be larger than or equal to “33” weeks

[8.2.1.1] For Small
#Descending order & labeling replicates
SmallTable1base_m <- SmallTable1base[order(SmallTable1base$Coexistence_periods,decreasing = TRUE),]
SmallTable1base_m
ID_combined <- c(rep("S1", 2), rep("S2", 2), rep("S3", 2), rep("S4", 3), rep("S5", 3), rep("S6", 4))
SmallTable1base_m <- cbind.data.frame(ID_combined, SmallTable1base_m)
SmallTable1base_m
[8.2.1.2] For Medium
#Descending order & labeling replicates
MediumTable1base_m <- MediumTable1base[order(MediumTable1base$Coexistence_periods,decreasing = TRUE),]
MediumTable1base_m
ID_combined <- c(rep("M1", 1), rep("M2", 2), rep("M3", 2), rep("M4", 2), rep("M5", 2), rep("M6", 3), rep("M7", 4))
MediumTable1base_m <- cbind.data.frame(ID_combined, MediumTable1base_m)
MediumTable1base_m
[8.2.1.3] For Large
#Descending order & labeling replicates
LargeTable1base_m <- LargeTable1base[order(LargeTable1base$Coexistence_periods,decreasing = TRUE),]
LargeTable1base_m
ID_combined <- c(rep("L1", 1), rep("L2", 1), rep("L3", 2), rep("L4", 2), rep("L5", 2), rep("L6", 2), rep("L7", 2), rep("L8", 4))
LargeTable1base_m <- cbind.data.frame(ID_combined, LargeTable1base_m)
LargeTable1base_m
[8.2.1.4] For Huge
#Descending order & labeling replicates
HugeTable1base_m <- HugeTable1base[order(HugeTable1base$Coexistence_periods,decreasing = TRUE),]
HugeTable1base_m
ID_combined <- c(rep("H1", 1), rep("H2", 2), rep("H3", 2), rep("H4", 2), rep("H5", 2), rep("H6", 2), rep("H7", 2), rep("H8", 3))
HugeTable1base_m <- cbind.data.frame(ID_combined, HugeTable1base_m)
HugeTable1base_m

[8.2.2] Combining replicates for EDM analysis

[8.2.2.1] For Small
S_combined_Y <- list()
S_combined_A <- list()
S_id_comb <- c("S1", "S2", "S3", "S4", "S5", "S6")

#S1-S3: combining two replicates
for(i in 1:3) {
 #determining the number of NA to be added  
 no_NA_inserted <- max(subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = No.NA))
 #listing the replicate IDs used for i-th combined replicates
 id_each <- subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = ID)
 
 S_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL)
 
 S_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL)
}
#S4-S5: combining three replicates
for(i in 4:5) {
 no_NA_inserted <- max(subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = No.NA))
 id_each <- subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = ID)
 
 S_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL)
 
 S_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL)
}
#S6: combining four replicates
no_NA_inserted <- max(subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = No.NA))
id_each <- subset(SmallTable1base_m, SmallTable1base_m$ID_combined == S_id_comb[i], select = ID)
 
 S_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$YotsumonTotalL)
 
 S_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$AzukiTotalL)

#example 
 S_combined_Y
[[1]]
 [1]   8   0   0   0  94  16   1  36 180  97   2 138 169 135   6 118 129  53
[19]  10  94  96  54   0  56  78 100   0  53  NA  NA  NA  NA  NA  NA  NA  NA
[37]  NA   8   0   0   0 110   4  12  37 192  21  11 133  55   9  98 197  76
[55]  30 150 141  88 100  91 119  76 130

[[2]]
 [1]   8   0   0   0 110  39   1  41 233  58   3 141 179  82   8 112 106  68
[19]  24  70 120 114  48 100  NA  NA  NA   4
[37] 114  21   0  75 200  14  38 165 106  24 141 180 141  83 143 195 124  91

[[3]]
 [1]   8   0   0   0  98  23   0  35 208  47   2 132 158 128  23 128 112  96
[19]  61  NA  NA  NA  NA  NA   8   0   0   0 111  62   5  51 246  62   4 158
[37] 177 105  72 133

[[4]]
 [1]   8   0   0  16 117   0   0 171  62  18 125 197 139 113  NA  NA  NA  NA
[19]  NA  NA   8   0   0   0  98  14   0 119 195   5 116 175 192  NA  NA  NA
[37]  NA  NA  NA   8   0   0   0 139  33   1  95 214 128  34 199 138

[[5]]
 [1]   8   0   0   0 135  24   0  53 215  87  20 402  NA  NA  NA  NA   8   0
[19]   0   0 107  15   0  59 173   0   3 112  NA  NA  NA  NA   8   0   0   2
[37] 101  10   0  67 151   6   8 246

[[6]]
 [1]   8   0   0   0  88  21   3 109 213  11  NA  NA  NA   8   0   0   0 146
[19]  14   0  72 208  59  NA  NA  NA   8   0   0   0 114  16   1 123 179  12
[37]  NA  NA  NA   8   0   0   0 139  27   0 129 238
[8.2.2.2] For Medium
M_combined_Y <- list()
M_combined_A <- list()
M_id_comb <- c("M1", "M2", "M3", "M4", "M5", "M6", "M7")

#M1: no need for combining
i <- 1
id_each <- subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = ID)

M_combined_Y[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL

M_combined_A[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL

#M2-M5: combining two replicates
for(i in 2:5) {
 no_NA_inserted <- max(subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = No.NA))
 id_each <- subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = ID)
 
 M_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL)
 
 M_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL)
}
#M6: combining three replicates
for(i in 6:6) {
 no_NA_inserted <- max(subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = No.NA))
 id_each <- subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = ID)
 
 M_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL)
 
 M_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL)
}
#M7: combining four replicates
i <- 7
no_NA_inserted <- max(subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = No.NA))
id_each <- subset(MediumTable1base_m, MediumTable1base_m$ID_combined == M_id_comb[i], select = ID)
 
M_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$YotsumonTotalL)
 
M_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$AzukiTotalL)

#example 
M_combined_A
[[1]]
 [1]   8   0   0   0  68   7   0  47  11   0  12  43   0   0 100   2   0   0
[19]  60   5   1   0 131   2   0   0 130   6   0   0   0  20   0   0   0  46
[37]   0   0  16  47   3   1  52   0   0   1   5

[[2]]
 [1]   8   0   0   1  93   2   0 219  32   0 124 218   1  24 195  12   0  15
[19] 100   1   0  34 109   4   0   4  81   5   0   1   1   0  NA  NA  NA  NA
[37]  NA  NA  NA  NA  NA  NA   8   0   0   3 109   4   0 231  42   0 176 150
[55]   1  22 201  65   0   6  79  12   0   0 147   3   0   0 100   4   0

[[3]]
 [1]   8   0   0   4  91   0   0 171  10   0 225 119   0  41 197  17   0  15
[19]  18   1   0   0  12   0   0   0   7   1   0  NA  NA  NA  NA  NA  NA  NA
[37]  NA  NA  NA   8   0   0   1 117   1   0 158   9   0  44 115   1   1  50
[55]  54   0   0  90  14   0   0 198  25   0

[[4]]
 [1]   8   0   0  67  24   2 163 208  19  44 156  10  12 179  21   1  25  48
[19]   0   0  18   0  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 126   0
[37]   0 195  25   0 219  92   1  13 180   8   0  10  12   0

[[5]]
 [1]   8   0   0   4  70  11   0  43  30  10 101  22   1   5  72   0   0   0
[19]  11   0  NA  NA  NA  NA  NA   8   0   0  22  50   0   5   7   1   2   8
[37]   0   1  12   2   0   3   0

[[6]]
 [1]   8   0   0   3  83   2   3  35   9   0  65  10   0   0  22   0  NA  NA
[19]  NA  NA  NA  NA   8   0   0   2  80  22   0  28   9   1  16   7   0   0
[37]   2   0  NA  NA  NA  NA  NA  NA   8   0   0   3  60   2   2 102   3   0
[55]  22   2   0   0  10   0

[[7]]
 [1]   8   0   0  17  63   3   5  97  12   1 100   4   0  27   0  NA  NA  NA
[19]  NA  NA   8   0   0   5  15   0   4   8   0   0  29   0  NA  NA  NA  NA
[37]  NA   8   0   0  15  40   0   0   7   5   0  NA  NA  NA  NA  NA   8   0
[55]   0   1  24   1   0   0   1   0
[8.2.2.3] For Large
L_combined_Y <- list()
L_combined_A <- list()
L_id_comb <- c("L1", "L2", "L3", "L4", "L5", "L6", "L7", "L8")

#L1-L2: no need for combining
for(i in 1:2){
  id_each <- subset(LargeTable1base_m, LargeTable1base_m$ID_combined == L_id_comb[i], select = ID)

  L_combined_Y[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL

  L_combined_A[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL
}

#L3-L7: combining two replicates
for(i in 3:7) {
 no_NA_inserted <- max(subset(LargeTable1base_m, LargeTable1base_m$ID_combined == L_id_comb[i], select = No.NA))
 id_each <- subset(LargeTable1base_m, LargeTable1base_m$ID_combined == L_id_comb[i], select = ID)
 
 L_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL)
 
 L_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL)
}

#L8: combining four replicates
i <- 8
no_NA_inserted <- max(subset(LargeTable1base_m, LargeTable1base_m$ID_combined == L_id_comb[i], select = No.NA))
id_each <- subset(LargeTable1base_m, LargeTable1base_m$ID_combined == L_id_comb[i], select = ID)
 
L_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$YotsumonTotalL)
 
L_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[4,],]$AzukiTotalL)

#example 
L_combined_Y
[[1]]
 [1]   8   0   0   0 104   9   0  31 186   9   0  59 136  20  24  49 137  44
[19]   4  34 113  73   0  50  86  85  26   0   0   0  59   0   0  26 138  19
[37]   0 142 152   5  94 150 204

[[2]]
 [1]   8   0   0   0  77  19   0  36 207  22   4  56 178   8   2 118 140   6
[19]  22 155  67  15  71  97 137   5 110  85  56   5  11  48   1   0  58  52
[37]  96

[[3]]
 [1]   8   0   0  19 111  36   2   2 167  66   8 186  37  15   0 133  52   9
[19] 119 126  16   5 156 106  32  13 112 107  86  25  63  82  97  65  NA  NA
[37]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 121  74   5   9 162 162
[55]  10   4 208 161   5  10  96  56   1   0  82  98   1   0  63  77   1   0
[73]  58

[[4]]
 [1]   8   0   0   0 102  40   0   8 178  59   1  14 172 105   0  21 121  67
[19]   1  14  61  91   2  10  37  71   4   6  16  NA  NA  NA  NA  NA  NA  NA
[37]  NA  NA   8   0   0 109  72   0  72 157  36   0  12 231  92   2  14
[55] 136  76   8   8 126  90   1   0  93  64   4   0

[[5]]
 [1]   8   0   0   0 107  29   0  44 212  20   0  68 110  35  10 143 155 126
[19]  15 130 125 116   5 129  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0
[37]   0 114  41   0  36 243 148  27 172 133  86   7 154 123 101  16 151

[[6]]
 [1]   8   0   0   0 132  50   1  60 146 128  25 201  56 152   6 106  16 129
[19]  10 112  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 142  74   1  31
[37] 223 134  19 119 197 185  13 157  81  86  28  92

[[7]]
 [1]   8   0   0  10 162  31   7 126 176  53 102 163 185 164 113 144 247 148
[19] 140  NA  NA  NA  NA  NA   8   0   0 124  16   0 140 234  33 121 190
[37] 251  72 201 154 242 127 185

[[8]]
 [1]   8   0   0   0 102  21   1 139 206  45  42 241 245 173 119  14  NA  NA
[19]  NA  NA  NA  NA   8   0   0   0 123  50   3  28 231 128  10 133 192 147
[37]  11 165  NA  NA  NA  NA  NA  NA   8   0   0   0 132  44   1  10 234 120
[55]   5 141 110 163   9 135  NA  NA  NA  NA  NA  NA   8   0   0   0 137  27
[73]   0 116 201  25   0 155 141  69  57 106
[8.2.2.4] For Huge
H_combined_Y <- list()
H_combined_A <- list()
H_id_comb <- c("H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8")

#H1: no need for combining
i <- 1
id_each <- subset(HugeTable1base_m, HugeTable1base_m$ID_combined == H_id_comb[i], select = ID)

H_combined_Y[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL

H_combined_A[[i]] <- shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL

#H2-H7: combining two replicates
for(i in 2:7) {
 no_NA_inserted <- max(subset(HugeTable1base_m, HugeTable1base_m$ID_combined == H_id_comb[i], select = No.NA))
 id_each <- subset(HugeTable1base_m, HugeTable1base_m$ID_combined == H_id_comb[i], select = ID)
 
 H_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL)
 
 H_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL)
}
#H8: combining three replicates
for(i in 8:8) {
 no_NA_inserted <- max(subset(HugeTable1base_m, HugeTable1base_m$ID_combined == H_id_comb[i], select = No.NA))
 id_each <- subset(HugeTable1base_m, HugeTable1base_m$ID_combined == H_id_comb[i], select = ID)
 
 H_combined_Y[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$YotsumonTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$YotsumonTotalL)
 
 H_combined_A[[i]] <- c(shavedataframe[shavedataframe$ID == id_each[1,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[2,],]$AzukiTotalL, rep(NA,no_NA_inserted), shavedataframe[shavedataframe$ID == id_each[3,],]$AzukiTotalL)
}
#example 
H_combined_Y
[[1]]
 [1]   8   0   0   1 127  24   1   4 173  59   7  94 189  61   2 157  76  15
[19]  17 165  37   0  40 130  44   0  56 125  70   2  65  86  98   3  69

[[2]]
 [1]   8   0   0   0  98  54   0   9 197 115   6  27 216 187   0  78 133 113
[19]   9  99  99 111   0  74  92  63   4  74 101  41   5   2   0  NA  NA  NA
[37]  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 100  18   0  17 165  56   0
[55]   6 187 188  10   0 103  86   0   0   4 125   0   0   5   5   2   0   0
[73]   1  21   3

[[3]]
 [1]   8   0   0   0  88  18   0  59  33   0   0  29   3   0   0  22  10   0
[19]   0  11   8   0   0   5   4   0   0   1   2   1   0  NA  NA  NA  NA  NA
[37]  NA  NA  NA  NA  NA   8   0   0   0  93  61   1  19 216 103  11   7 188
[55]  15   1   3 121  23   0   3  85   6   0   0  23   6   0   0   2   1   0

[[4]]
 [1]   8   0   0   0  68  44   0   6  97  22   3   1 258 129   0   3 129  98
[19]   1   0 106  73   2   0  76  66   3   0  79  NA  NA  NA  NA  NA  NA  NA
[37]  NA  NA  NA   8   0   0   0  92  57   3  93 111 157  14   0 175 182   4
[55]   0  88  35   1   0  91  77   9   0  48  54   2   0  31

[[5]]
 [1]   8   0   0   0  98  28   1  16 139  82   3  13 228 200   7   6  87  52
[19]   7   0  63  85   5   0 167 147  90   1  NA  NA  NA  NA  NA  NA  NA  NA
[37]  NA  NA   8   0   0   0 135  75   2  15 152 202   7  83 227 104   0 144
[55]  90  89   8 107 124 108   3  53  31  52   4  40

[[6]]
 [1]   8   0   0   0 103  38   0  39 225 117   6 177 212 165   7 139 118 109
[19]  30  42 125 117   8  31  72  40   3  11  NA  NA  NA  NA  NA  NA  NA  NA
[37]  NA  NA   8   0   0   0  94  49   2   6 146  30   0   1 154  68   1   0
[55]  39  97   5   0   0 112   7   0

[[7]]
 [1]   8   0   0   0  73  34   0   7 152  25   0  24 137  37   4  51 114  57
[19]   0 102 132  76   1 138  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0
[37] 111  57   0  52 204 157  11 173 171 156  39 129 117 111 116  82

[[8]]
 [1]   8   0   0   0  77  12   0  20 199 112  14  64 121 141   9  69 108  NA
[19]  NA  NA  NA  NA   8   0   0   0 147  56   2 148 260 102  54 146 130 134
[37] 200 247  NA  NA  NA  NA  NA   8   0   0   0 113  65   1  64 233 109  12
[55] 140 124 147  42 143

[8.2.3] Calculating the mean coexistence week

S_combined_mean_coweek <- tapply(SmallTable1base_m$Coexistence_periods, SmallTable1base_m$ID_combined, mean)
M_combined_mean_coweek <- tapply(MediumTable1base_m$Coexistence_periods, MediumTable1base_m$ID_combined, mean)
L_combined_mean_coweek <- tapply(LargeTable1base_m$Coexistence_periods, LargeTable1base_m$ID_combined, mean)
H_combined_mean_coweek <- tapply(HugeTable1base_m$Coexistence_periods, HugeTable1base_m$ID_combined, mean)

S_combined_mean_coweek
      S1       S2       S3       S4       S5       S6 
26.00000 22.00000 16.50000 12.33333 11.00000  8.75000 
M_combined_mean_coweek
   M1    M2    M3    M4    M5    M6    M7 
46.00 29.50 26.00 20.00 18.00 15.00 10.75 
L_combined_mean_coweek
  L1   L2   L3   L4   L5   L6   L7   L8 
42.0 36.0 30.5 27.5 21.0 19.0 18.0 15.0 
H_combined_mean_coweek
      H1       H2       H3       H4       H5       H6       H7       H8 
34.00000 31.50000 30.00000 28.00000 27.00000 25.00000 21.00000 15.33333 

[8.2.4] Determining the optimal E, optimal theta, and delta-rho for the combined replicates

[8.2.4.1] For Small
For Cm
Small_combined_Y_simplex <- list()
Small_combined_Y_smap <- list()
length(S_id_comb)
[1] 6
#Executing simplex projection
for(i in 1:length(S_id_comb)){
  Small_combined_Y_simplex[[i]] <- simplex(S_combined_Y[[i]],lib = c(1,length(S_combined_Y[[i]])), pred = c(1,length(S_combined_Y[[i]])), E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Small_combined_E_Y <- vector()
for(i in 1:length(S_id_comb)){
  Small_combined_E_Y[i] <- which.max(Small_combined_Y_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(S_id_comb)){
  Small_combined_Y_smap[[i]] <- s_map(S_combined_Y[[i]],lib = c(1,length(S_combined_Y[[i]])), pred = c(1,length(S_combined_Y[[i]])),E = Small_combined_E_Y[i], silent = TRUE)
}

#Calculating optimal theta
Small_combined_theta_Y <- vector()
for(i in 1:length(S_id_comb)){
  Small_combined_theta_Y[i] <- Small_combined_Y_smap[[i]][which.max(Small_combined_Y_smap[[i]]$rho),]$theta
}
#Calculating delta-rho, maximum minus minimum
Small_combined_deltarho_Y <- vector()
for(i in 1:length(S_id_comb)){
  Small_combined_deltarho_Y[i] <- max(Small_combined_Y_smap[[i]]$rho) - Small_combined_Y_smap[[i]]$rho[1]
}

Small_combined_E_Y
[1]  5  4 10  5  3  8
Small_combined_theta_Y
[1] 4.0 2.0 0.0 2.0 8.0 0.1
Small_combined_deltarho_Y
[1] 0.1077679 0.1088690 0.0000000 0.1371399 0.5610443 0.1443142
For Cc
Small_combined_A_simplex <- list()
Small_combined_A_smap <- list()

#Executing simplex projection
for(i in 1:length(S_id_comb)){
  Small_combined_A_simplex[[i]] <- simplex(S_combined_A[[i]],lib = c(1,length(S_combined_A[[i]])), pred = c(1,length(S_combined_A[[i]])), E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Small_combined_E_A <- vector()
  Small_combined_E_A[i] <- which.max(Small_combined_A_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(S_id_comb)){
  Small_combined_A_smap[[i]] <- s_map(S_combined_A[[i]],lib = c(1,length(S_combined_A[[i]])), pred = c(1,length(S_combined_A[[i]])), E = Small_combined_E_A[i], silent = TRUE)
}

#Calculating optimal theta
Small_combined_theta_A <- vector()
for(i in 1:length(S_id_comb)){

#Calculating delta-rho 
Small_combined_deltarho_A <- vector()
for(i in 1:length(S_id_comb)){
  Small_combined_deltarho_A[i] <- max(Small_combined_A_smap[[i]]$rho) - Small_combined_A_smap[[i]]$rho[1]
}
Small_combined_E_A
[1] 10  3  3  7  4  4
Small_combined_theta_A
[1] 1 8 0 0 3 3
Small_combined_deltarho_A
[1] 0.01861431 0.35407409 0.00000000 0.00000000 0.71102585 0.42537821
[8.2.4.2] For Medium
For Cm
Medium_combined_Y_simplex <- list()
Medium_combined_Y_smap <- list()
length(M_id_comb)
[1] 7
#Executing simplex projection
for(i in 1:length(M_id_comb)){
  Medium_combined_Y_simplex[[i]] <- simplex(M_combined_Y[[i]],lib = c(1,length(M_combined_Y[[i]])), pred = c(1,length(M_combined_Y[[i]])), E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Medium_combined_E_Y <- vector()
for(i in 1:length(M_id_comb)){
  Medium_combined_E_Y[i] <- which.max(Medium_combined_Y_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(M_id_comb)){
  Medium_combined_Y_smap[[i]] <- s_map(M_combined_Y[[i]],lib = c(1,length(M_combined_Y[[i]])), pred = c(1,length(M_combined_Y[[i]])), E = Medium_combined_E_Y[i], silent = TRUE)
}

#Calculating optimal theta
Medium_combined_theta_Y <- vector()
for(i in 1:length(M_id_comb)){
  Medium_combined_theta_Y[i] <- Medium_combined_Y_smap[[i]][which.max(Medium_combined_Y_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Medium_combined_deltarho_Y <- vector()
for(i in 1:length(M_id_comb)){
  Medium_combined_deltarho_Y[i] <- max(Medium_combined_Y_smap[[i]]$rho) - Medium_combined_Y_smap[[i]]$rho[1]
}
Medium_combined_E_Y
[1] 7 8 9 5 8 6 8
Medium_combined_theta_Y
[1] 3.00 2.00 1.50 2.00 0.75 3.00 1.00
Medium_combined_deltarho_Y
[1] 0.09693470 0.17438007 0.05197754 0.06097689 0.02553795 0.15239394
[7] 0.01075863
For Cc
Medium_combined_A_simplex <- list()
Medium_combined_A_smap <- list()

#Executing simplex projection
for(i in 1:length(M_id_comb)){
  Medium_combined_A_simplex[[i]] <- simplex(M_combined_A[[i]],lib = c(1,length(M_combined_A[[i]])), pred = c(1,length(M_combined_A[[i]])),E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Medium_combined_E_A <- vector()
for(i in 1:length(M_id_comb)){
  Medium_combined_E_A[i] <- which.max(Medium_combined_A_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(M_id_comb)){
  Medium_combined_A_smap[[i]] <- s_map(M_combined_A[[i]],lib = c(1,length(M_combined_A[[i]])), pred = c(1,length(M_combined_A[[i]])),E = Medium_combined_E_A[i], silent = TRUE)
}

#Calculating optimal theta
Medium_combined_theta_A <- vector()
  Medium_combined_theta_A[i] <- Medium_combined_A_smap[[i]][which.max(Medium_combined_A_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Medium_combined_deltarho_A <- vector()
for(i in 1:length(M_id_comb)){
  Medium_combined_deltarho_A[i] <- max(Medium_combined_A_smap[[i]]$rho) - Medium_combined_A_smap[[i]]$rho[1]
}
Medium_combined_E_A
[1]  8  8  7 10  5  5  5
Medium_combined_theta_A
[1] 0.00 3.00 4.00 0.75 3.00 3.00 8.00
Medium_combined_deltarho_A
[1] 0.00000000 0.14654892 0.06478939 0.02017538 0.18022398 0.08901785
[7] 0.21635228
[8.2.4.3] For Large
For Cm
Large_combined_Y_simplex <- list()
Large_combined_Y_smap <- list()
length(L_id_comb)
[1] 8
#Executing simplex projection
for(i in 1:length(L_id_comb)){
  Large_combined_Y_simplex[[i]] <- simplex(L_combined_Y[[i]],lib = c(1,length(L_combined_Y[[i]])), pred = c(1,length(L_combined_Y[[i]])), E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Large_combined_E_Y <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_E_Y[i] <- which.max(Large_combined_Y_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(L_id_comb)){
  Large_combined_Y_smap[[i]] <- s_map(L_combined_Y[[i]],lib = c(1,length(L_combined_Y[[i]])), pred = c(1,length(L_combined_Y[[i]])), E = Large_combined_E_Y[i], silent = TRUE)
}

#Calculating optimal theta
Large_combined_theta_Y <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_theta_Y[i] <- Large_combined_Y_smap[[i]][which.max(Large_combined_Y_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Large_combined_deltarho_Y <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_deltarho_Y[i] <- max(Large_combined_Y_smap[[i]]$rho) - Large_combined_Y_smap[[i]]$rho[1]
}
Large_combined_E_Y
[1] 8 9 4 9 4 5 5 5
Large_combined_theta_Y
[1] 3.0 4.0 0.0 6.0 2.0 2.0 1.5 2.0
Large_combined_deltarho_Y
[1] 0.16517993 0.10936934 0.00000000 0.07956119 0.10937309 0.24821462
[7] 0.06062738 0.11924754
For Cc
Large_combined_A_simplex <- list()
Large_combined_A_smap <- list()

#Executing simplex projection
for(i in 1:length(L_id_comb)){
  Large_combined_A_simplex[[i]] <- simplex(L_combined_A[[i]],lib = c(1,length(L_combined_A[[i]])), pred = c(1,length(L_combined_A[[i]])),E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Large_combined_E_A <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_E_A[i] <- which.max(Large_combined_A_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(L_id_comb)){
  Large_combined_A_smap[[i]] <- s_map(L_combined_A[[i]],lib = c(1,length(L_combined_A[[i]])), pred = c(1,length(L_combined_A[[i]])),E = Large_combined_E_A[i], silent = TRUE)
}

#Calculating optimal theta
Large_combined_theta_A <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_theta_A[i] <- Large_combined_A_smap[[i]][which.max(Large_combined_A_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Large_combined_deltarho_A <- vector()
for(i in 1:length(L_id_comb)){
  Large_combined_deltarho_A[i] <- max(Large_combined_A_smap[[i]]$rho) - Large_combined_A_smap[[i]]$rho[1]
}
Large_combined_E_A
[1]  2  8 10 10  9  9  1  5
Large_combined_theta_A
[1] 6.0 0.0 0.0 1.5 8.0 1.5 8.0 4.0
Large_combined_deltarho_A
[1] 0.16542098 0.00000000 0.00000000 0.14433095 0.03180342 0.11819601
[7] 0.20139964 0.37881962
[8.2.4.4] For Huge
For Cm
Huge_combined_Y_simplex <- list()
Huge_combined_Y_smap <- list()
length(H_id_comb)
[1] 8
#Executing simplex projection
for(i in 1:length(H_id_comb)){
  Huge_combined_Y_simplex[[i]] <- simplex(H_combined_Y[[i]],lib = c(1,length(H_combined_Y[[i]])), pred = c(1,length(H_combined_Y[[i]])), E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Huge_combined_E_Y <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_E_Y[i] <- which.max(Huge_combined_Y_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(H_id_comb)){
  Huge_combined_Y_smap[[i]] <- s_map(H_combined_Y[[i]],lib = c(1,length(H_combined_Y[[i]])), pred = c(1,length(H_combined_Y[[i]])), E = Huge_combined_E_Y[i], silent = TRUE)
}

#Calculating optimal theta
Huge_combined_theta_Y <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_theta_Y[i] <- Huge_combined_Y_smap[[i]][which.max(Huge_combined_Y_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Huge_combined_deltarho_Y <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_deltarho_Y[i] <- max(Huge_combined_Y_smap[[i]]$rho) - Huge_combined_Y_smap[[i]]$rho[1]
}
Huge_combined_E_Y
[1]  6 10 10  6  5  5  5  4
Huge_combined_theta_Y
[1] 6 2 6 0 2 1 1 2
Huge_combined_deltarho_Y
[1] 0.054355365 0.136859678 0.140825599 0.000000000 0.094501451 0.004716782
[7] 0.027814963 0.143490533
For Cc
Huge_combined_A_simplex <- list()
Huge_combined_A_smap <- list()

#Executing simplex projection
for(i in 1:length(H_id_comb)){
  Huge_combined_A_simplex[[i]] <- simplex(H_combined_A[[i]],lib = c(1,length(H_combined_A[[i]])), pred = c(1,length(H_combined_A[[i]])),E = c(1:10), silent = TRUE)
}

#Calculating optimal E
Huge_combined_E_A <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_E_A[i] <- which.max(Huge_combined_A_simplex[[i]]$rho)
}

#Executing univariate S-map
for(i in 1:length(H_id_comb)){
  Huge_combined_A_smap[[i]] <- s_map(H_combined_A[[i]],lib = c(1,length(H_combined_A[[i]])), pred = c(1,length(H_combined_A[[i]])),E = Huge_combined_E_A[i], silent = TRUE)
}

#Calculating optimal theta
Huge_combined_theta_A <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_theta_A[i] <- Huge_combined_A_smap[[i]][which.max(Huge_combined_A_smap[[i]]$rho),]$theta
}

#Calculating delta-rho 
Huge_combined_deltarho_A <- vector()
for(i in 1:length(H_id_comb)){
  Huge_combined_deltarho_A[i] <- max(Huge_combined_A_smap[[i]]$rho) - Huge_combined_A_smap[[i]]$rho[1]
}
Huge_combined_E_A
[1] 7 4 9 6 8 6 9 5
Huge_combined_theta_A
[1] 1.5 8.0 3.0 3.0 0.0 1.0 6.0 2.0
Huge_combined_deltarho_A
[1] 0.04300393 0.02070305 0.02979581 0.15838825 0.00000000 0.01877942
[7] 0.08699150 0.03294874

[8.2.5] Summarizing results for Table1

Table1Small <- data.frame("ID" = S_id_comb, "average_coexistence_week" = S_combined_mean_coweek, "E_for_C.m" = Small_combined_E_Y, "E_for_C.c" = Small_combined_E_A, "theta_for_C.m" = Small_combined_theta_Y, "theta_for_C.c" = Small_combined_theta_A, "delta-rho_for_C.m" = Small_combined_deltarho_Y, "delta-rho_for_C.c" = Small_combined_deltarho_A)
Table1Medium <- data.frame("ID" = M_id_comb, "average_coexistence_week" = M_combined_mean_coweek, "E_for_C.m" = Medium_combined_E_Y, "E_for_C.c" = Medium_combined_E_A, "theta_for_C.m" = Medium_combined_theta_Y, "theta_for_C.c" = Medium_combined_theta_A, "delta-rho_for_C.m" = Medium_combined_deltarho_Y, "delta-rho_for_C.c" = Medium_combined_deltarho_A)
Table1Large <- data.frame("ID" = L_id_comb, "average_coexistence_week" = L_combined_mean_coweek, "E_for_C.m" = Large_combined_E_Y, "E_for_C.c" = Large_combined_E_A, "theta_for_C.m" = Large_combined_theta_Y, "theta_for_C.c" = Large_combined_theta_A, "delta-rho_for_C.m" = Large_combined_deltarho_Y, "delta-rho_for_C.c" = Large_combined_deltarho_A)
Table1Huge <- data.frame("ID" = H_id_comb, "average_coexistence_week" = H_combined_mean_coweek, "E_for_C.m" = Huge_combined_E_Y, "E_for_C.c" = Huge_combined_E_A, "theta_for_C.m" = Huge_combined_theta_Y, "theta_for_C.c" = Huge_combined_theta_A, "delta-rho_for_C.m" = Huge_combined_deltarho_Y, "delta-rho_for_C.c" = Huge_combined_deltarho_A)


#example
Table1Small

Table1 <- rbind.data.frame(Table1Small, Table1Medium, Table1Large, Table1Huge)
Table1
[8.2.5.1] Saving objectes as CSV files, which are used for Table 1
write.csv(Table1,file="Table1.csv")
write.csv(SmallTable1base_m,file="SmallTable1base_m.csv")
write.csv(MediumTable1base_m,file="MediumTable1base_m.csv")
write.csv(LargeTable1base_m,file="LargeTable1base_m.csv")
write.csv(HugeTable1base_m,file="HugeTable1base_m.csv")

[8.3] Simplex projection, S-map, and CCM analyis when all replicates from each cage size were combined

[8.3.1] Data preprocessing (combining all repcliates)

[8.3.1.1] For Small
#Extracting target the abundance of individuals as list
x_map_target <- Small
Small_Y_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$YotsumonTotalL)
Small_A_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$AzukiTotalL)

#Number of NAs to be added is the maximum of optimal E among all replicates
no_NAs_Small <- max(SmallTable1base_m$No.NA)

#Combining all replicate
Small_Y_allcombined <- unlist(lapply(1:16, function(i) c(Small_Y_each[[i]], rep(NA, no_NAs_Small))))
Small_A_allcombined  <- unlist(lapply(1:16, function(i) c(Small_A_each[[i]], rep(NA, no_NAs_Small))))
Small_Y_allcombined
  [1]   8   0   0   0 110   4  12  37 192  21  11 133  55   9  98 197  76  30
 [19] 150 141  88 100  91 119  76 130  NA  NA  NA  NA  NA  NA  NA  NA  NA   8
 [37]   0   0  16 117   0   0 171  62  18 125 197 139 113  NA  NA  NA  NA  NA
 [55]  NA  NA  NA  NA   8   0   0   4 114  21   0  75 200  14  38 165 106  24
 [73] 141 180 141  83 143 195 124  91  NA  NA  NA  NA  NA  NA  NA  NA  NA   8
 [91]   0   0   0  88  21   3 109 213  11  NA  NA  NA  NA  NA  NA  NA  NA  NA
[109]   8   0   0   0  98  14   0 119 195   5 116 175 192  NA  NA  NA  NA  NA
[127]  NA  NA  NA  NA   8   0   0   0  94  16   1  36 180  97   2 138 169 135
[145]   6 118 129  53  10  94  96  54   0  56  78 100   0  53  NA  NA  NA  NA
[163]  NA  NA  NA  NA  NA   8   0   0   0 110  39   1  41 233  58   3 141 179
[181]  82   8 112 106  68  24  70 120 114  48 100  NA  NA  NA  NA  NA  NA  NA
[199]  NA  NA   8   0   0   0  98  23   0  35 208  47   2 132 158 128  23 128
[217] 112  96  61  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 146  14
[235]   0  72 208  59  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 111
[253]  62   5  51 246  62   4 158 177 105  72 133  NA  NA  NA  NA  NA  NA  NA
[271]  NA  NA   8   0   0   0 139  33   1  95 214 128  34 199 138  NA  NA  NA
[289]  NA  NA  NA  NA  NA  NA   8   0   0   0 135  24   0  53 215  87  20 402
[307]  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 107  15   0  59 173
[325]   0   3 112  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   2 101  10
[343]   0  67 151   6   8 246  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0
[361]   0 139  27   0 129 238  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0
[379]   0 114  16   1 123 179  12  NA  NA  NA  NA  NA  NA  NA  NA  NA
#Visualization
SmallPopDynamics <- data.frame("Time_step" = rep(c(1:length(Small_Y_allcombined)),2), "Population" = c(Small_Y_allcombined, Small_A_allcombined), "Species" = c(rep("C.m",length(Small_Y_allcombined)), rep("C.c",length(Small_A_allcombined))))

PopulationSmall <- ggplot(data = SmallPopDynamics, aes(x = Time_step, y = Population, group = Species, color = Species)) + geom_line()
print(PopulationSmall)

[8.3.1.2] For Medium
#Extracting target the abundance of individuals as list
x_map_target <- Medium
Medium_Y_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$YotsumonTotalL)
Medium_A_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$AzukiTotalL)

#Number of NAs to be added is the maximum of optimal E among all replicates
no_NAs_Medium <- max(MediumTable1base_m$No.NA)

#Combining all replicate
Medium_Y_allcombined <- unlist(lapply(1:16, function(i) c(Medium_Y_each[[i]], rep(NA, no_NAs_Medium))))
Medium_Y_allcombined
  [1]   8   0   0   1  93   9   0  17 175  22  18  97 169   5 124 153 115  36
 [19] 133 157 125  81  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0
 [37] 134  29   2   3 243  42   2 317  97   1  85 113 155  58  NA  NA  NA  NA
 [55]  NA  NA  NA  NA  NA  NA   8   0   0   4 110  22   1 179 215  38  NA  NA
 [73]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   1  74  15   0  79 184  54
 [91]  71 177 160 109 105  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0
[109]   0  98  51   0   2 199  23   0  10 125  72   1  14 119  69   0   6  76
[127] 113   4   7  59   7   0   0  78  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
[145]   8   0   0   0 125  58   0   1 208  30   7   2 134  70   0  11 131  30
[163]   1  12  80  43   0   5  10   5   0   0  18  11   0   0  NA  NA  NA  NA
[181]  NA  NA  NA  NA  NA  NA   8   0   0   0 106  26   1  23 207  60   1  53
[199] 117  75   3  64 112 101  12 123 130 126   6  33   9  59   4  51   1  NA
[217]  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 114  31   0   9 208
[235] 106   1  57 140 142   1 135  99  93   2 143  NA  NA  NA  NA  NA  NA  NA
[253]  NA  NA  NA   8   0   0   0 127  38   0  41 232 139   9 153 180 162  33
[271] 105  NA  NA  NA  NA  NA  NA   8   0   1   0 106  45   2
[289]   2 157 206  25   9 227 137   7  17  70  83  12  12 108 129   0   9 136
[307]  92   1  17  51  34  21  10   6  75  13  10  24  99  61  14 101 226 144  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0
[343]  90  62   1  31 205  95  16 148 181 158  10 157 102  76  13  78  NA  NA
[361]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 110  76   1  52 239  88
[379]   9 207 168 269  24 105  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0
[397]   0   0  99  23   0  41 167  21  13 107 101  61  64 128  NA  NA  NA  NA
[415]  NA  NA  NA  NA  NA  NA   8   0   0   0  75  15   0  92  31   0   0  26
[433]  20   3   0  22  60   5   0  47  78  14   0 110  75  NA  NA  NA  NA  NA
[451]  NA  NA  NA  NA  NA   8   0   0   0 128  20   1  84 191  43   9 153  NA
[469]  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 122   5   0 138 221
[487]  22  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#Visualization
MediumPopDynamics <- data.frame("Time_step" = rep(c(1:length(Medium_Y_allcombined)),2), "Population" = c(Medium_Y_allcombined, Medium_A_allcombined), "Species" = c(rep("C.m",length(Medium_Y_allcombined)), rep("C.c",length(Medium_A_allcombined))))

PopulationMedium <- ggplot(data = MediumPopDynamics, aes(x = Time_step, y = Population, group = Species, color = Species)) + geom_line()
print(PopulationMedium)

[8.3.1.3] For Large
#Extracting target the abundance of individuals as list
x_map_target <- Large
Large_Y_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$YotsumonTotalL)
Large_A_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$AzukiTotalL)
no_NAs_Large <- max(LargeTable1base_m$No.NA)

#Combining all replicate
Large_Y_allcombined <- unlist(lapply(1:16, function(i) c(Large_Y_each[[i]], rep(NA, no_NAs_Large))))
Large_A_allcombined  <- unlist(lapply(1:16, function(i) c(Large_A_each[[i]],rep(NA, no_NAs_Large))))
Large_Y_allcombined
  [1]   8   0   0  19 111  36   2   2 167  66   8 186  37  15   0 133  52   9
 [19] 119 126  16   5 156 106  32  13 112 107  86  25  63  82  97  65  NA  NA
 [37]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0  10 162  31   7 126 176  53
 [55] 102 163 185 164 113 144 247 148 140  NA  NA  NA  NA  NA  NA  NA  NA  NA
 [73]  NA   8   0   0   0 124  16   0 140 234  33 121 190 251  72 201 154 242
 [91] 127 185  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0  77  19
[109]   0  36 207  22   4  56 178   8   2 118 140   6  22 155  67  15  71  97
[127] 137   5 110  85  56   5  NA  NA  NA  NA  NA
[145]  NA  NA  NA  NA  NA   8   0   0   0 102  21   1 139 206  45  42 241 245
[163] 173 119  14  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 121
[181]  74   5   9 162 162  10   4 208 161   5  10  96  56   1   0  82  98   1
[199]   0  63  77   1   0  58  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0
[217]   0   0 109  72   0  72 157  36   0  12 231  92   2  14 136  76   8   8
[235] 126  90   1   0  93  64   4   0  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
[253]   8   0   0   0 102  40   0   8 178  59   1  14 172 105   0  21 121  67
[271]   1  14  61  91   2  10  37  71   4   6  16  NA  NA  NA  NA  NA  NA  NA
[289]  NA  NA  NA   8   0   0   0 123  50   3  28 231 128  10 133 192 147  11
[307] 165  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 114  41   0
[325]  36 243 148  27 172 133  86   7 154 123 101  16 151  NA  NA  NA  NA  NA
[343]  NA  NA  NA  NA  NA   8   0   0   0 132  50   1  60 146 128  25 201  56
[361] 152   6 106  16 129  10 112  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8
[379]   0   0   0 142  74   1  31 223 134  19 119 197 185  13 157  81  86  28
[397]  92  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 104   9   0
[415]  31 186   9   0  59 136  20  24  49 137  44   4  34 113  73   0  50  86
[433]  85  26   0   0   0  59   0   0  26 138  19   0 142 152   5  94 150  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 107  29   0  44
[469] 212  20   0  68 110  35  10 143 155 126  15 130 125 116   5 129  NA  NA
[487]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 132  44   1  10 234 120
[505]   5 141 110 163   9 135  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0
[523]   0   0 137  27   0 116 201  25   0 155 141  69  57 106  NA  NA  NA  NA
[541]  NA  NA  NA  NA  NA  NA
#Visualization

PopulationLarge <- ggplot(data = LargePopDynamics, aes(x = Time_step, y = Population, group = Species, color = Species)) + geom_line()
print(PopulationLarge)

[8.3.1.4] For Huge
#Extracting target the abundance of individuals as list
x_map_target <- Huge
Huge_Y_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$YotsumonTotalL)
Huge_A_each <- lapply(1:length(x_map_target), function(i) x_map_target[[i]]$AzukiTotalL)

#Number of NAs to be added is the maximum of optimal E among all replicates
no_NAs_Huge <- max(HugeTable1base_m$No.NA)

#Combining all replicate
Huge_Y_allcombined <- unlist(lapply(1:16, function(i) c(Huge_Y_each[[i]], rep(NA, no_NAs_Huge))))
Huge_A_allcombined  <- unlist(lapply(1:16, function(i) c(Huge_A_each[[i]],rep(NA, no_NAs_Huge))))
Huge_Y_allcombined
  [1]   8   0   0   1 127  24   1   4 173  59   7  94 189  61   2 157  76  15
 [19]  17 165  37   0  40 130  44   0  56 125  70   2  65  86  98   3  69  NA
 [37]  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 147  56   2 148 260
 [55] 102  54 146 130 134 200 247  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8
 [73]   0   0   0 111  57   0  52 204 157  11 173 171 156  39 129 117 111 116
 [91]  82  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0  88  18   0
[109]  59  33   0   0  29   3   0   0  22  10   0   0  11   8   0   0   5   4
[127]   0   0   1   2   1   0  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0
[145]   0   0  93  61   1  19 216 103  11   7 188  15   1   3 121  23   0   3
[163]  85   6   0   0  23   6   0   0   2   1   0  NA  NA  NA  NA  NA  NA  NA
[181]  NA  NA  NA   8   0   0   0  68  44   0   6  97  22   3   1 258 129   0
[199]   3 129  98   1   0 106  73   2   0  76  66   3   0  79  NA  NA  NA  NA
[217]  NA  NA  NA  NA  NA  NA   8   0   0   0  92  57   3  93 111 157  14   0
[235] 175 182   4   0  88  35   1   0  91  77   9   0  48  54   2   0  31  NA
[253]  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0  98  28   1  16 139
[271]  82   3  13 228 200   7   6  87  52   7   0  63  85   5   0 167 147  90
[289]   1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 135  75   2
[307]  15 152 202   7  83 227 104   0 144  90  89   8 107 124 108   3  53  31
[325]  52   4  40  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 103
[343]  38   0  39 225 117   6 177 212 165   7 139 118 109  30  42 125 117   8
[361]  31  72  40   3  11  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0
[379]   0  98  54   0   9 197 115   6  27 216 187   0  78 133 113   9  99  99
[397] 111   0  74  92  63   4  74 101  41   5   2   0  NA  NA  NA  NA  NA  NA
[415]  NA  NA  NA  NA   8   0   0   0 100  18   0  17 165  56   0   6 187 188
[433]  10   0 103  86   0   0   4 125   0   0   5   5   2   0   0   1  21   3
[451]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0  94  49   2   6
[469] 146  30   0   1 154  68   1   0  39  97   5   0   0 112   7   0  NA  NA
[487]  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0 113  65   1  64 233 109
[505]  12 140 124 147  42 143  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0
[523]   0   0  73  34   0   7 152  25   0  24 137  37   4  51 114  57   0 102
[541] 132  76   1 138  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA   8   0   0   0
[559]  77  12   0  20 199 112  14  64 121 141   9  69 108  NA  NA  NA  NA  NA
[577]  NA  NA  NA  NA  NA
#Visualization
HugePopDynamics <- data.frame("Time_step" = rep(c(1:length(Huge_Y_allcombined)),2), "Population" = c(Huge_Y_allcombined, Huge_A_allcombined), "Species" = c(rep("C.m",length(Huge_Y_allcombined)), rep("C.c",length(Huge_A_allcombined))))

PopulationHuge <- ggplot(data = HugePopDynamics, aes(x = Time_step, y = Population, group = Species, color = Species)) + geom_line()
print(PopulationHuge)

[8.3.2] Simplex projection (optimal E) and univariate S-map (optimal theta)

–The Warning message is an expected one since we set the library and prediction identical.

[8.3.2.1] For Small
#data combined
Small_YA_allcombined <- data.frame("Small_Y" = Small_Y_allcombined, "Small_A" = Small_A_allcombined)


#simplex projection for Y and A, respectively 
Small_simplex_output_Y <- simplex(Small_YA_allcombined$Small_Y,lib = c(1, nrow(Small_YA_allcombined)), pred = c(1, nrow(Small_YA_allcombined)))

Small_simplex_output_A <- simplex(Small_YA_allcombined$Small_A,lib = c(1, nrow(Small_YA_allcombined)), pred = c(1, nrow(Small_YA_allcombined)))

#optimal embedding dimension E*
Small_optE_Y <- which.max(Small_simplex_output_Y$rho)
Small_optE_A <- which.max(Small_simplex_output_A$rho)

#univariate S-map
Small_s_map_outputY <- s_map(Small_YA_allcombined$Small_Y,lib = c(1, nrow(Small_YA_allcombined)), pred = c(1, nrow(Small_YA_allcombined)), E = Small_optE_Y)
Small_s_map_outputA <- s_map(Small_YA_allcombined$Small_A,lib = c(1, nrow(Small_YA_allcombined)), pred = c(1, nrow(Small_YA_allcombined)), E = Small_optE_A)

#optimal theta
Small_opttheta_Y <- Small_s_map_outputY$theta[which.max(Small_s_map_outputY$rho)]
Small_opttheta_A <- Small_s_map_outputA$theta[which.max(Small_s_map_outputA$rho)]
[8.3.2.2] For Medium
#data combined
Medium_YA_allcombined <- data.frame("Medium_Y" = Medium_Y_allcombined, "Medium_A" = Medium_A_allcombined)

#simplex projection for Y and A, respectively 
Medium_simplex_output_Y <- simplex(Medium_YA_allcombined$Medium_Y,lib = c(1, nrow(Medium_YA_allcombined)), pred = c(1, nrow(Medium_YA_allcombined)))

Medium_simplex_output_A <- simplex(Medium_YA_allcombined$Medium_A,lib = c(1, nrow(Medium_YA_allcombined)), pred = c(1, nrow(Medium_YA_allcombined)))

#optimal embedding dimension E*
Medium_optE_Y <- which.max(Medium_simplex_output_Y$rho)
Medium_optE_A <- which.max(Medium_simplex_output_A$rho)

#univariate S-map
Medium_s_map_outputY <- s_map(Medium_YA_allcombined$Medium_Y,lib = c(1, nrow(Medium_YA_allcombined)), pred = c(1, nrow(Medium_YA_allcombined)),E = Medium_optE_Y)
Medium_s_map_outputA <- s_map(Medium_YA_allcombined$Medium_A,lib = c(1, nrow(Medium_YA_allcombined)), pred = c(1, nrow(Medium_YA_allcombined)),E = Medium_optE_A)

#optimal theta
Medium_opttheta_Y <- Medium_s_map_outputY$theta[which.max(Medium_s_map_outputY$rho)]
Medium_opttheta_A <- Medium_s_map_outputA$theta[which.max(Medium_s_map_outputA$rho)]
[8.3.2.3] For Large
#data combined
Large_YA_allcombined <- data.frame("Large_Y" = Large_Y_allcombined, "Large_A" = Large_A_allcombined)


#simplex projection for Y and A, respectively 
Large_simplex_output_Y <- simplex(Large_YA_allcombined$Large_Y,lib = c(1, nrow(Large_YA_allcombined)), pred = c(1, nrow(Large_YA_allcombined)))

Large_simplex_output_A <- simplex(Large_YA_allcombined$Large_A,lib = c(1, nrow(Large_YA_allcombined)), pred = c(1, nrow(Large_YA_allcombined)))

#optimal embedding dimension E*
Large_optE_Y <- which.max(Large_simplex_output_Y$rho)
Large_optE_A <- which.max(Large_simplex_output_A$rho)

#univariate S-map
Large_s_map_outputY <- s_map(Large_YA_allcombined$Large_Y,lib = c(1, nrow(Large_YA_allcombined)), pred = c(1, nrow(Large_YA_allcombined)),E = Large_optE_Y)
Large_s_map_outputA <- s_map(Large_YA_allcombined$Large_A,lib = c(1, nrow(Large_YA_allcombined)), pred = c(1, nrow(Large_YA_allcombined)),E = Large_optE_A)

#optimal theta
Large_opttheta_Y <- Large_s_map_outputY$theta[which.max(Large_s_map_outputY$rho)]
[8.3.2.4] For Huge
#data combined
Huge_YA_allcombined <- data.frame("Huge_Y" = Huge_Y_allcombined, "Huge_A" = Huge_A_allcombined)


#simplex projection for Y and A, respectively 
Huge_simplex_output_Y <- simplex(Huge_YA_allcombined$Huge_Y,lib = c(1, nrow(Huge_YA_allcombined)), pred = c(1, nrow(Huge_YA_allcombined)))

Huge_simplex_output_A <- simplex(Huge_YA_allcombined$Huge_A,lib = c(1, nrow(Huge_YA_allcombined)), pred = c(1, nrow(Huge_YA_allcombined)))

#optimal embedding dimension E*
Huge_optE_Y <- which.max(Huge_simplex_output_Y$rho)
Huge_optE_A <- which.max(Huge_simplex_output_A$rho)

#univariate S-map
Huge_s_map_outputY <- s_map(Huge_YA_allcombined$Huge_Y,lib = c(1, nrow(Huge_YA_allcombined)), pred = c(1, nrow(Huge_YA_allcombined)),E = Huge_optE_Y)
Huge_s_map_outputA <- s_map(Huge_YA_allcombined$Huge_A,lib = c(1, nrow(Huge_YA_allcombined)), pred = c(1, nrow(Huge_YA_allcombined)),E = Huge_optE_A)

#optimal theta
Huge_opttheta_Y <- Huge_s_map_outputY$theta[which.max(Huge_s_map_outputY$rho)]
Huge_opttheta_A <- Huge_s_map_outputA$theta[which.max(Huge_s_map_outputA$rho)]
[8.3.2.5] Visualization for Figure S2 (optimal embedding dimension)
#For Small
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))
plot(Small_simplex_output_Y$E, Small_simplex_output_Y$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.lab = 2, cex.axis = 1,main="(a) C.maculatus")
abline(h = 0, lty = 3, col = "black",lwd = 2)

plot(Small_simplex_output_A$E, Small_simplex_output_A$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(-0.1, 1), cex.axis = 2, cex.axis = 1, main = "(b) C.chinensis")
abline(h = 0, lty = 3, col ="black", lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal Embedding Dimension for Small cages")

#For Medium
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Medium_simplex_output_Y$E, Medium_simplex_output_Y$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.lab = 2, cex.axis = 1,main="(c) C.maculatus")
abline(h = 0, lty = 3, col = "black", lwd = 2)

plot(Medium_simplex_output_A$E, Medium_simplex_output_A$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.axis = 2, cex.axis = 1, main = "(d) C.chinensis")
abline(h = 0, lty = 3, col ="black", lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal Embedding Dimension for Medium cages")

#For Large
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Large_simplex_output_Y$E, Large_simplex_output_Y$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.lab = 2, cex.axis = 1,main="(e) C.maculatus")
abline(h = 0, lty = 3, col = "black", lwd = 2)

plot(Large_simplex_output_A$E, Large_simplex_output_A$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(-0.1, 1), cex.axis = 2, cex.axis = 1, main = "(f) C.chinensis")
abline(h = 0, lty = 3, col ="black", lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal Embedding Dimension for Large cages")

#For Huge
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Huge_simplex_output_Y$E, Huge_simplex_output_Y$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.lab = 2, cex.axis = 1,main="(g) C.maculatus")
abline(h = 0, lty = 3, col = "black", lwd = 2)

plot(Huge_simplex_output_A$E, Huge_simplex_output_A$rho, type = "l", xlab = " ", ylab = "", xlim = c(0, 10), ylim = c(0, 1), cex.axis = 2, cex.axis = 1, main = "(h) C.chinensis")
abline(h = 0, lty = 3, col ="black", lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal Embedding Dimension for Huge cages")

[8.3.2.6] Visualization for Figure S3 (optimal theta (nonlinearity))
#For Small
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))
plot(Small_s_map_outputY$theta, Small_s_map_outputY$rho, type = "l", xlab = "", ylab = "", cex.main = 1,ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(a) C.maculatus")
abline(h = 0,lty = 3, col = "black",lwd = 2)

plot(Small_s_map_outputA$theta, Small_s_map_outputA$rho, type = "l", xlab = "", ylab = "", cex.main = 1, ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(b) C.chinensis")
abline(h = 0,lty = 3, col = "black",lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal theta (nonlinearity) for Small cage")

#For Medium
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Medium_s_map_outputY$theta, Medium_s_map_outputY$rho, type = "l", xlab = "", ylab = "", cex.main = 1,ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(c) C.maculatus")
abline(h = 0,lty = 3, col = "black",lwd = 2)

plot(Medium_s_map_outputA$theta, Medium_s_map_outputA$rho, type = "l", xlab = "", ylab = "", cex.main = 1, ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(d) C.chinensis")
abline(h = 0,lty = 3, col = "black",lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal theta (nonlinearity) for Medium cage")

#For Large
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Large_s_map_outputY$theta, Large_s_map_outputY$rho, type = "l", xlab = "", ylab = "", cex.main = 1,ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(e) C.maculatus")
abline(h = 0,lty = 3, col = "black",lwd = 2)

plot(Large_s_map_outputA$theta, Large_s_map_outputA$rho, type = "l", xlab = "", ylab = "", cex.main = 1, ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(f) C.chinensis")
abline(h = 0,lty = 3, col = "black",lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal theta (nonlinearity) for Large cage")

#For Huge
par(mfrow = c(1, 2), mar = c(4, 4, 1, 1), oma = c(3, 3, 3, 0))

plot(Huge_s_map_outputY$theta, Huge_s_map_outputY$rho, type = "l", xlab = "", ylab = "", cex.main = 1,ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(g) C.maculatus")
abline(h = 0,lty = 3, col = "black",lwd = 2)

plot(Huge_s_map_outputA$theta, Huge_s_map_outputA$rho, type = "l", xlab = "", ylab = "", cex.main = 1, ylim = c(0, 0.9), cex.lab = 2, cex.axis = 2, main = "(h) C.chinensis")
abline(h = 0,lty = 3, col = "black",lwd = 2)

mtext(side = 3, line = 1, outer = TRUE, text = "Optimal theta (nonlinearity) for Huge cage")

[8.3.3] CCM for each cage size

[8.3.3.1] Confirm terminology

– Y_xmap_A represents the causality from A (Azuki Cc) to Y (Yotsumon Cm) #F8766D (red)

– A_xmap_Y represents the causality from Y (Yotsumon Cm) to A (Azuki Cc) #00BFC4 (blue-green)

[8.3.3.2] For Small cage analysis
CCM
Small_lagY_xmap_A <- list()
Small_lagA_xmap_Y <- list()

#not showing warning 

Small_lagY_xmap_A <- lapply(0:-4, function(i) ccm(Small_YA_allcombined, E = Small_optE_Y, lib_column = "Small_Y", target_column = "Small_A", lib_sizes = floor(seq(Small_optE_Y, nrow(Small_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


#example
Small_lagY_xmap_A[[2]]
Calculating means and sds
Small_lagY_xmap_A_means <- list()
Small_lagA_xmap_Y_means <- list()

Small_lagY_xmap_A_means <- lapply(1:5, function(i) ccm_means(Small_lagY_xmap_A[[i]], na.rm = TRUE))
Small_lagA_xmap_Y_means <- lapply(1:5, function(i) ccm_means(Small_lagA_xmap_Y[[i]], na.rm = TRUE))
Small_lagA_xmap_Y_means <- lapply(1:5, function(i) data.frame(Small_lagA_xmap_Y_means[[i]], sd.rho = ccm_means(Small_lagA_xmap_Y[[i]], FUN = sd, na.rm = TRUE)$rho))

#With the maximum library size,since there is not replicate, so SD cannot be calculated and set as zero
for(i in 1:5){
}
for(i in 1:5){
  Small_lagA_xmap_Y_means[[i]]$sd.rho[nrow(Small_lagA_xmap_Y_means[[i]])] <- 0
}

#example
Generating Surrsogate data (ebisuzaki) for each replicate and CCM

–For Yotsumon (Cm)

#Generating Surrogate data; for each replicate of the time series, we generated 100 surrogate data
set.seed(12345)
Small_Y_each_s <- list()

Small_Y_each_s <- lapply(1:length(Small_Y_each), function(i) make_surrogate_data(Small_Y_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Small_Y_each_s <- lapply(1:length(Small_Y_each_s), function(i) rbind.data.frame(Small_Y_each_s[[i]], matrix(rep(NA, 100*(no_NAs_Small)), nrow = no_NAs_Small)))

Small_Y_each_s2 <- NULL

for(i in 1:length(Small_Y_each_s)){
  Small_Y_each_s2 <- rbind.data.frame(Small_Y_each_s2, Small_Y_each_s[[i]])
}
Small_Y_each_s2

#Surrogate Y (Ys) xmap A (CCM)
Small_AYs <- cbind.data.frame(Small_Y_each_s2, "Small_A" = Small_YA_allcombined$Small_A)
Small_lagYs_xmap_A <- list()
 
for(j in 1:5) {
  Small_lagYs_xmap_A[[j]] <- lapply(1:100, function(i) ccm(Small_AYs, E = Small_optE_Y, lib = c(1,nrow(Small_AYs)), pred = c(1,nrow(Small_AYs)), lib_column = paste("V",i,sep=""), target_column = "Small_A", lib_sizes  = floor(seq(Small_optE_Y, length(Small_AYs[, 1]),length = 10)),tp = (1 - j), num_sample = 100, replace = F, silent = T, RNGseed = 1234))
}

#example
Small_lagYs_xmap_A[[4]][[16]]

#mean and sd of surrogate Y xmap A
Small_lagYs_xmap_A_means_list <- list()
for(j in 1:5) {
  Small_lagYs_xmap_A_means_list[[j]] <- lapply(1:length(Small_lagYs_xmap_A[[j]]), function(i) ccm_means(Small_lagYs_xmap_A[[j]][[i]], na.rm = TRUE))
}
#combining the list
Small_lagYs_xmap_A_means <- list()
for(j in 1:5) {
  Small_lagYs_xmap_A_means[[j]] <- Small_lagYs_xmap_A_means_list[[j]][[1]]$rho
  for(i in 2:length(Small_lagYs_xmap_A_means_list[[j]])){
    Small_lagYs_xmap_A_means[[j]] <- cbind.data.frame(Small_lagYs_xmap_A_means[[j]], Small_lagYs_xmap_A_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Small_lagYs_xmap_A_means_sds <- list() 
for(j in 1:5) {
  Small_lagYs_xmap_A_means_means[[j]] <- apply(Small_lagYs_xmap_A_means[[j]], 1, mean)
  Small_lagYs_xmap_A_means_sds[[j]] <- apply(Small_lagYs_xmap_A_means[[j]], 1, sd)
}

#example
Small_lagYs_xmap_A_means_sds[[1]]
[1] 0.02096274 0.06128845 0.07976680 0.09243328 0.10352799 0.10601242
Small_lagYs_xmap_A_summary <- list()
for(j in 1:5) {
  Small_lagYs_xmap_A_summary[[j]] <- data.frame("lib_size" = Small_lagYs_xmap_A_means_list[[j]][[1]]$lib_size, "mean" = Small_lagYs_xmap_A_means_means[[j]], "sd" = Small_lagYs_xmap_A_means_sds[[j]])
}
#example
Small_lagYs_xmap_A_summary[[3]]

–For Azuki (Cc)

#Generating Surrogate data
set.seed(12345)
Small_A_each_s <- list()

Small_A_each_s <- lapply(1:length(Small_A_each), function(i) make_surrogate_data(Small_A_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Small_A_each_s <- lapply(1:length(Small_A_each_s), function(i) rbind.data.frame(Small_A_each_s[[i]], matrix(rep(NA,100*(no_NAs_Small)), nrow = no_NAs_Small)))

Small_A_each_s2 <- NULL

for(i in 1:length(Small_A_each_s)){
}
Small_A_each_s2

#Surrogate A (As) xmap Y (CCM)
Small_YAs <- cbind.data.frame(Small_A_each_s2, "Small_Y" = Small_YA_allcombined$Small_Y)
Small_lagAs_xmap_Y <- list()
 
for(j in 1:5) {
  Small_lagAs_xmap_Y[[j]] <- lapply(1:100, function(i) ccm(Small_YAs, E = Small_optE_A, lib = c(1,nrow(Small_YAs)), pred = c(1,nrow(Small_YAs)), lib_column = paste("V", i, sep = ""), target_column = "Small_Y", lib_sizes  = floor(seq(Small_optE_A, length(Small_YAs[, 1]),length = 10)),tp = (1 - j), num_sample = 100, replace = F, silent = T, RNGseed = 1234))
}

#example
Small_lagAs_xmap_Y[[4]][[16]]

#mean and sd of surrogate A xmap Y
Small_lagAs_xmap_Y_means_list <- list()
for(j in 1:5) {
  Small_lagAs_xmap_Y_means_list[[j]] <- lapply(1:length(Small_lagAs_xmap_Y[[j]]), function(i) ccm_means(Small_lagAs_xmap_Y[[j]][[i]], na.rm = TRUE))
}
#combining the list
Small_lagAs_xmap_Y_means <- list()
for(j in 1:5) {
  Small_lagAs_xmap_Y_means[[j]] <- Small_lagAs_xmap_Y_means_list[[j]][[1]]$rho
  for(i in 2:length(Small_lagAs_xmap_Y_means_list[[j]])){
    Small_lagAs_xmap_Y_means[[j]] <- cbind.data.frame(Small_lagAs_xmap_Y_means[[j]], Small_lagAs_xmap_Y_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Small_lagAs_xmap_Y_means_means <- list() 
Small_lagAs_xmap_Y_means_sds <- list() 
for(j in 1:5) {
  Small_lagAs_xmap_Y_means_means[[j]] <- apply(Small_lagAs_xmap_Y_means[[j]], 1, mean)
  Small_lagAs_xmap_Y_means_sds[[j]] <- apply(Small_lagAs_xmap_Y_means[[j]], 1, sd)
}

#example
Small_lagAs_xmap_Y_means_sds[[1]]
[1] 0.03264759 0.07746794 0.10148603 0.10986380
Small_lagAs_xmap_Y_summary <- list()
for(j in 1:5) {
}
#example
Small_lagAs_xmap_Y_summary[[3]]
[8.3.3.3] For Small cage graphics
Data summary
Small_ccmY_xmap_A_all <- list()

for(i in 1:5){
  Small_ccmY_xmap_A_all[[i]] <- data.frame(
    "Library_size" = Small_lagY_xmap_A_means[[i]]$lib_size,
    "Y_xmap_A_rho" = Small_lagY_xmap_A_means[[i]]$rho,
    "Ys_xmap_A_rho" = Small_lagYs_xmap_A_summary[[i]]$mean,
    "Y_xmap_A_rho_psd" = Small_lagY_xmap_A_means[[i]]$rho + Small_lagY_xmap_A_means[[i]]$sd.rho,
    "Y_xmap_A_rho_msd" = Small_lagY_xmap_A_means[[i]]$rho - Small_lagY_xmap_A_means[[i]]$sd.rho,
    "Ys_xmap_A_rho_psd" = Small_lagYs_xmap_A_summary[[i]]$mean + Small_lagYs_xmap_A_summary[[i]]$sd,
    "Ys_xmap_A_rho_msd" = Small_lagYs_xmap_A_summary[[i]]$mean - Small_lagYs_xmap_A_summary[[i]]$sd
    )
}
#example
Small_ccmY_xmap_A_all[[2]]

Small_ccmA_xmap_Y_all <- list()

for(i in 1:5){
  Small_ccmA_xmap_Y_all[[i]] <- data.frame(
    "Library_size" = Small_lagA_xmap_Y_means[[i]]$lib_size,
    "A_xmap_Y_rho" = Small_lagA_xmap_Y_means[[i]]$rho,
    "As_xmap_Y_rho" = Small_lagAs_xmap_Y_summary[[i]]$mean,
    "A_xmap_Y_rho_psd" = Small_lagA_xmap_Y_means[[i]]$rho + Small_lagA_xmap_Y_means[[i]]$sd.rho,
    "A_xmap_Y_rho_msd" = Small_lagA_xmap_Y_means[[i]]$rho - Small_lagA_xmap_Y_means[[i]]$sd.rho,
    "As_xmap_Y_rho_psd" = Small_lagAs_xmap_Y_summary[[i]]$mean + Small_lagAs_xmap_Y_summary[[i]]$sd,
    )
#example
Small_ccmA_xmap_Y_all[[2]]
Graphics for CCM Small (for Figure S4)
#CCM Smallに関するplot
Small_ccm_ggplot <- list()
Small_subtitle <- c("(a)","(b)","(c)","(d)","(e)")

for(i in 1:5){
#Y_xmap_A:Cm xmap Cc #F8766D (red)
Small_ccm_ggplot[[i]] <- ggplot(data = Small_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Y_xmap_A_rho)) + 
  geom_line(linetype = 1, color = "#F8766D") + 
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(shape = 16, size = 3, color = "#F8766D") +

#A_xmap_Y:Cc xmap Cm #00BFC4 (blue-green)  
  geom_line(data = Small_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Small_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Small_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), shape = 17, size = 3, color = "#00BFC4") +
  
  geom_line(data = Small_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(data = Small_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(data = Small_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), shape = 1, size = 3, color = "#F8766D") +
  
  geom_line(data = Small_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Small_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), shape = 2, size = 3, color = "#00BFC4") +
  
  ylim(-0.1, 1) +
  xlab("") +
  ggtitle(paste(Small_subtitle[i], "Small", "tp =", 1 - i, sep = " "))
}
for(i in 1:5) {
  print(Small_ccm_ggplot[[i]])

[8.3.3.4] For Medium cage analysis
CCM
Medium_lagY_xmap_A <- list()
Medium_lagA_xmap_Y <- list()

#not showing warning 

Medium_lagY_xmap_A <- lapply(0:-4, function(i) ccm(Medium_YA_allcombined, E = Medium_optE_Y, lib_column = "Medium_Y", target_column = "Medium_A", lib_sizes = floor(seq(Medium_optE_Y, nrow(Medium_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))

Medium_lagA_xmap_Y <- lapply(0:-4, function(i) ccm(Medium_YA_allcombined, E = Medium_optE_A, lib_column = "Medium_A", target_column = "Medium_Y", lib_sizes = floor(seq(Medium_optE_A, nrow(Medium_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))
#example
Medium_lagY_xmap_A[[2]]
Calculating means and sds
Medium_lagY_xmap_A_means <- list()
Medium_lagA_xmap_Y_means <- list()

Medium_lagY_xmap_A_means <- lapply(1:5, function(i) ccm_means(Medium_lagY_xmap_A[[i]], na.rm = TRUE))
Medium_lagA_xmap_Y_means <- lapply(1:5, function(i) ccm_means(Medium_lagA_xmap_Y[[i]], na.rm = TRUE))

Medium_lagY_xmap_A_means <- lapply(1:5, function(i) data.frame(Medium_lagY_xmap_A_means[[i]], sd.rho = ccm_means(Medium_lagY_xmap_A[[i]], FUN = sd, na.rm = TRUE)$rho))
Medium_lagA_xmap_Y_means <- lapply(1:5, function(i) data.frame(Medium_lagA_xmap_Y_means[[i]], sd.rho = ccm_means(Medium_lagA_xmap_Y[[i]], FUN = sd, na.rm = TRUE)$rho))

#With the maximum library size,since there is not replicate, so SD cannot be calculated and set as zero
for(i in 1:5){
  Medium_lagY_xmap_A_means[[i]]$sd.rho[nrow(Medium_lagY_xmap_A_means[[i]])] <- 0
for(i in 1:5){
}

#example
Medium_lagA_xmap_Y_means[[3]]
Generating Surrogate data (ebisuzaki) for each replicate and CCM

–For Yotsumon (Cm)

#Generating Surrogate data
set.seed(12345)
Medium_Y_each_s <- list()

Medium_Y_each_s <- lapply(1:length(Medium_Y_each), function(i) make_surrogate_data(Medium_Y_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Medium_Y_each_s <- lapply(1:length(Medium_Y_each_s), function(i) rbind.data.frame(Medium_Y_each_s[[i]], matrix(rep(NA, 100*(no_NAs_Medium)), nrow = no_NAs_Medium)))
Medium_Y_each_s2 <- NULL

for(i in 1:length(Medium_Y_each_s)){
  Medium_Y_each_s2 <- rbind.data.frame(Medium_Y_each_s2, Medium_Y_each_s[[i]])
}
Medium_Y_each_s2

#Surrogate Y (Ys) xmap A (CCM)
Medium_AYs <- cbind.data.frame(Medium_Y_each_s2, "Medium_A" = Medium_YA_allcombined$Medium_A)
Medium_lagYs_xmap_A <- list()
for(j in 1:5) {
  Medium_lagYs_xmap_A[[j]] <- lapply(1:100, function(i) ccm(Medium_AYs, E = Medium_optE_Y, lib = c(1,nrow(Medium_AYs)), pred = c(1,nrow(Medium_AYs)), lib_column = paste("V",i,sep=""), target_column = "Medium_A", lib_sizes  = floor(seq(Medium_optE_Y, length(Medium_AYs[, 1]),length = 10)),tp = (1 - j), num_sample = 100, replace = F, silent = T, RNGseed = 1234))
}

#example
Medium_lagYs_xmap_A[[4]][[16]]

#mean and sd of surrogate Y xmap A
Medium_lagYs_xmap_A_means_list <- list()
for(j in 1:5) {
  Medium_lagYs_xmap_A_means_list[[j]] <- lapply(1:length(Medium_lagYs_xmap_A[[j]]), function(i) ccm_means(Medium_lagYs_xmap_A[[j]][[i]], na.rm = TRUE))
}
#combining the list
Medium_lagYs_xmap_A_means <- list()
for(j in 1:5) {
  Medium_lagYs_xmap_A_means[[j]] <- Medium_lagYs_xmap_A_means_list[[j]][[1]]$rho
  for(i in 2:length(Medium_lagYs_xmap_A_means_list[[j]])){
    Medium_lagYs_xmap_A_means[[j]] <- cbind.data.frame(Medium_lagYs_xmap_A_means[[j]], Medium_lagYs_xmap_A_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Medium_lagYs_xmap_A_means_means <- list() 
Medium_lagYs_xmap_A_means_sds <- list() 
for(j in 1:5) {
  Medium_lagYs_xmap_A_means_means[[j]] <- apply(Medium_lagYs_xmap_A_means[[j]], 1, mean)
}

#example
Medium_lagYs_xmap_A_means_sds[[1]]
[1] 0.03032287 0.07089069 0.08802803 0.09887281 0.10925049
Medium_lagYs_xmap_A_summary <- list()
for(j in 1:5) {
  Medium_lagYs_xmap_A_summary[[j]] <- data.frame("lib_size" = Medium_lagYs_xmap_A_means_list[[j]][[1]]$lib_size, "mean" = Medium_lagYs_xmap_A_means_means[[j]], "sd" = Medium_lagYs_xmap_A_means_sds[[j]])
}
#example
Medium_lagYs_xmap_A_summary[[3]]

–For Azuki (Cc)

#Generating Surrogate data
set.seed(12345)
Medium_A_each_s <- list()

Medium_A_each_s <- lapply(1:length(Medium_A_each), function(i) make_surrogate_data(Medium_A_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Medium_A_each_s <- lapply(1:length(Medium_A_each_s), function(i) rbind.data.frame(Medium_A_each_s[[i]], matrix(rep(NA,100*(no_NAs_Medium)), nrow = no_NAs_Medium)))

for(i in 1:length(Medium_A_each_s)){
Medium_A_each_s2

#Surrogate A (As) xmap Y (CCM)
Medium_YAs <- cbind.data.frame(Medium_A_each_s2, "Medium_Y" = Medium_YA_allcombined$Medium_Y)
Medium_lagAs_xmap_Y <- list()
for(j in 1:5) {
  Medium_lagAs_xmap_Y[[j]] <- lapply(1:100, function(i) ccm(Medium_YAs, E = Medium_optE_A, lib = c(1,nrow(Medium_YAs)), pred = c(1,nrow(Medium_YAs)), lib_column = paste("V", i, sep = ""), target_column = "Medium_Y", lib_sizes  = floor(seq(Medium_optE_A, length(Medium_YAs[, 1]),length = 10)),tp = (1 - j), num_sample = 100, replace = F, silent = T, RNGseed = 1234))
}

#example
Medium_lagAs_xmap_Y[[4]][[16]]

#mean and sd of surrogate A xmap Y
Medium_lagAs_xmap_Y_means_list <- list()
for(j in 1:5) {
  Medium_lagAs_xmap_Y_means_list[[j]] <- lapply(1:length(Medium_lagAs_xmap_Y[[j]]), function(i) ccm_means(Medium_lagAs_xmap_Y[[j]][[i]], na.rm = TRUE))
}
#combining the list
Medium_lagAs_xmap_Y_means <- list()
for(j in 1:5) {
  Medium_lagAs_xmap_Y_means[[j]] <- Medium_lagAs_xmap_Y_means_list[[j]][[1]]$rho
  for(i in 2:length(Medium_lagAs_xmap_Y_means_list[[j]])){
    Medium_lagAs_xmap_Y_means[[j]] <- cbind.data.frame(Medium_lagAs_xmap_Y_means[[j]], Medium_lagAs_xmap_Y_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Medium_lagAs_xmap_Y_means_means <- list() 
Medium_lagAs_xmap_Y_means_sds <- list() 
for(j in 1:5) {
  Medium_lagAs_xmap_Y_means_means[[j]] <- apply(Medium_lagAs_xmap_Y_means[[j]], 1, mean)
  Medium_lagAs_xmap_Y_means_sds[[j]] <- apply(Medium_lagAs_xmap_Y_means[[j]], 1, sd)
}

#example
Medium_lagAs_xmap_Y_means_sds[[1]]
[1] 0.03593354 0.06558470 0.07813127 0.08933782 0.09360111
Medium_lagAs_xmap_Y_summary <- list()
for(j in 1:5) {
  Medium_lagAs_xmap_Y_summary[[j]] <- data.frame("lib_size" = Medium_lagAs_xmap_Y_means_list[[j]][[1]]$lib_size, "mean" = Medium_lagAs_xmap_Y_means_means[[j]], "sd" = Medium_lagAs_xmap_Y_means_sds[[j]])
}
#example
Medium_lagAs_xmap_Y_summary[[3]]
[8.3.3.5] For Medium cage graphics
Data summary
Medium_ccmY_xmap_A_all <- list()

for(i in 1:5){
  Medium_ccmY_xmap_A_all[[i]] <- data.frame(
    "Library_size" = Medium_lagY_xmap_A_means[[i]]$lib_size,
    "Y_xmap_A_rho" = Medium_lagY_xmap_A_means[[i]]$rho,
    "Ys_xmap_A_rho" = Medium_lagYs_xmap_A_summary[[i]]$mean,
    "Y_xmap_A_rho_psd" = Medium_lagY_xmap_A_means[[i]]$rho + Medium_lagY_xmap_A_means[[i]]$sd.rho,
    "Y_xmap_A_rho_msd" = Medium_lagY_xmap_A_means[[i]]$rho - Medium_lagY_xmap_A_means[[i]]$sd.rho,
    "Ys_xmap_A_rho_msd" = Medium_lagYs_xmap_A_summary[[i]]$mean - Medium_lagYs_xmap_A_summary[[i]]$sd
}
#example
Medium_ccmY_xmap_A_all[[2]]

Medium_ccmA_xmap_Y_all <- list()

for(i in 1:5){
  Medium_ccmA_xmap_Y_all[[i]] <- data.frame(
    "Library_size" = Medium_lagA_xmap_Y_means[[i]]$lib_size,
    "A_xmap_Y_rho" = Medium_lagA_xmap_Y_means[[i]]$rho,
    "As_xmap_Y_rho" = Medium_lagAs_xmap_Y_summary[[i]]$mean,
    "A_xmap_Y_rho_psd" = Medium_lagA_xmap_Y_means[[i]]$rho + Medium_lagA_xmap_Y_means[[i]]$sd.rho,
    "A_xmap_Y_rho_msd" = Medium_lagA_xmap_Y_means[[i]]$rho - Medium_lagA_xmap_Y_means[[i]]$sd.rho,
    "As_xmap_Y_rho_psd" = Medium_lagAs_xmap_Y_summary[[i]]$mean + Medium_lagAs_xmap_Y_summary[[i]]$sd,
    "As_xmap_Y_rho_msd" = Medium_lagAs_xmap_Y_summary[[i]]$mean - Medium_lagAs_xmap_Y_summary[[i]]$sd
}
#example
Graphics for CCM Medium (for Figure S4)
#CCM Mediumに関するplot
Medium_ccm_ggplot <- list()
Medium_subtitle <- c("(f)","(g)","(h)","(i)","(j)")

for(i in 1:5){
#Y_xmap_A:Cm xmap Cc #F8766D (red)
Medium_ccm_ggplot[[i]] <- ggplot(data = Medium_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Y_xmap_A_rho)) + 
  geom_line(linetype = 1, color = "#F8766D") + 
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(shape = 16, size = 3, color = "#F8766D") +

#A_xmap_Y:Cc xmap Cm #00BFC4 (blue-green)  
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), shape = 17, size = 3, color = "#00BFC4") +
  
  geom_line(data = Medium_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), linetype = 1, color = "#F8766D") +
  geom_line(data = Medium_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(data = Medium_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(data = Medium_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), shape = 1, size = 3, color = "#F8766D") +
  
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Medium_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), shape = 2, size = 3, color = "#00BFC4") +
 
  ylim(-0.1, 1) +
  ylab("") +
  xlab("") +
  ggtitle(paste(Medium_subtitle[i], "Medium", "tp =", 1 - i, sep = " "))
}
for(i in 1:5) {
  print(Medium_ccm_ggplot[[i]])
}

[8.3.3.6] For Large cage analysis
CCM
Large_lagY_xmap_A <- list()
Large_lagA_xmap_Y <- list()

#not showing warning 

Large_lagY_xmap_A <- lapply(0:-4, function(i) ccm(Large_YA_allcombined, E = Large_optE_Y, lib_column = "Large_Y", target_column = "Large_A", lib_sizes = floor(seq(Large_optE_Y, nrow(Large_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))

Large_lagA_xmap_Y <- lapply(0:-4, function(i) ccm(Large_YA_allcombined, E = Large_optE_A, lib_column = "Large_A", target_column = "Large_Y", lib_sizes = floor(seq(Large_optE_A, nrow(Large_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


#example
Large_lagY_xmap_A[[2]]
Calculating means and sds
Large_lagY_xmap_A_means <- list()
Large_lagA_xmap_Y_means <- list()

Large_lagY_xmap_A_means <- lapply(1:5, function(i) ccm_means(Large_lagY_xmap_A[[i]], na.rm = TRUE))
Large_lagA_xmap_Y_means <- lapply(1:5, function(i) ccm_means(Large_lagA_xmap_Y[[i]], na.rm = TRUE))

Large_lagY_xmap_A_means <- lapply(1:5, function(i) data.frame(Large_lagY_xmap_A_means[[i]], sd.rho = ccm_means(Large_lagY_xmap_A[[i]], FUN = sd, na.rm = TRUE)$rho))
Large_lagA_xmap_Y_means <- lapply(1:5, function(i) data.frame(Large_lagA_xmap_Y_means[[i]], sd.rho = ccm_means(Large_lagA_xmap_Y[[i]], FUN = sd, na.rm = TRUE)$rho))

#With the maximum library size,since there is not replicate, so SD cannot be calculated and set as zero
  Large_lagY_xmap_A_means[[i]]$sd.rho[nrow(Large_lagY_xmap_A_means[[i]])] <- 0
}
for(i in 1:5){
  Large_lagA_xmap_Y_means[[i]]$sd.rho[nrow(Large_lagA_xmap_Y_means[[i]])] <- 0
}

#example
Generating Surrogate data (ebisuzaki) for each replicate and CCM

–For Yotsumon (Cm)

#Generating Surrogate data
set.seed(12345)
Large_Y_each_s <- list()

Large_Y_each_s <- lapply(1:length(Large_Y_each), function(i) make_surrogate_data(Large_Y_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Large_Y_each_s <- lapply(1:length(Large_Y_each_s), function(i) rbind.data.frame(Large_Y_each_s[[i]], matrix(rep(NA, 100*(no_NAs_Large)), nrow = no_NAs_Large)))

Large_Y_each_s2 <- NULL
  Large_Y_each_s2 <- rbind.data.frame(Large_Y_each_s2, Large_Y_each_s[[i]])
}
Large_Y_each_s2

#Surrogate Y (Ys) xmap A (CCM)
Large_AYs <- cbind.data.frame(Large_Y_each_s2, "Large_A" = Large_YA_allcombined$Large_A)
Large_lagYs_xmap_A <- list()
 
for(j in 1:5) {
}

#example
Large_lagYs_xmap_A[[4]][[16]]

#mean and sd of surrogate Y xmap A
Large_lagYs_xmap_A_means_list <- list()
for(j in 1:5) {
  Large_lagYs_xmap_A_means_list[[j]] <- lapply(1:length(Large_lagYs_xmap_A[[j]]), function(i) ccm_means(Large_lagYs_xmap_A[[j]][[i]], na.rm = TRUE))
}
#combining the list
Large_lagYs_xmap_A_means <- list()
for(j in 1:5) {
  Large_lagYs_xmap_A_means[[j]] <- Large_lagYs_xmap_A_means_list[[j]][[1]]$rho
  for(i in 2:length(Large_lagYs_xmap_A_means_list[[j]])){
    Large_lagYs_xmap_A_means[[j]] <- cbind.data.frame(Large_lagYs_xmap_A_means[[j]], Large_lagYs_xmap_A_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Large_lagYs_xmap_A_means_means <- list() 
Large_lagYs_xmap_A_means_sds <- list() 
for(j in 1:5) {
  Large_lagYs_xmap_A_means_means[[j]] <- apply(Large_lagYs_xmap_A_means[[j]], 1, mean)
  Large_lagYs_xmap_A_means_sds[[j]] <- apply(Large_lagYs_xmap_A_means[[j]], 1, sd)
}

#example
Large_lagYs_xmap_A_means_sds[[1]]
[1] 0.01427833 0.04441981 0.06011655 0.07361516 0.08296351 0.09109343
Large_lagYs_xmap_A_summary <- list()
for(j in 1:5) {
  Large_lagYs_xmap_A_summary[[j]] <- data.frame("lib_size" = Large_lagYs_xmap_A_means_list[[j]][[1]]$lib_size, "mean" = Large_lagYs_xmap_A_means_means[[j]], "sd" = Large_lagYs_xmap_A_means_sds[[j]])
#example

–For Azuki (Cc)

#Generating Surrogate data
set.seed(12345)
Large_A_each_s <- list()

Large_A_each_s <- lapply(1:length(Large_A_each), function(i) make_surrogate_data(Large_A_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Large_A_each_s <- lapply(1:length(Large_A_each_s), function(i) rbind.data.frame(Large_A_each_s[[i]], matrix(rep(NA,100*(no_NAs_Large)), nrow = no_NAs_Large)))

Large_A_each_s2 <- NULL

for(i in 1:length(Large_A_each_s)){
  Large_A_each_s2 <- rbind.data.frame(Large_A_each_s2, Large_A_each_s[[i]])
}
Large_A_each_s2

#Surrogate A (As) xmap Y (CCM)
Large_YAs <- cbind.data.frame(Large_A_each_s2, "Large_Y" = Large_YA_allcombined$Large_Y)
Large_lagAs_xmap_Y <- list()

#example
Large_lagAs_xmap_Y[[4]][[16]]

#mean and sd of surrogate A xmap Y
Large_lagAs_xmap_Y_means_list <- list()
for(j in 1:5) {
  Large_lagAs_xmap_Y_means_list[[j]] <- lapply(1:length(Large_lagAs_xmap_Y[[j]]), function(i) ccm_means(Large_lagAs_xmap_Y[[j]][[i]], na.rm = TRUE))
}
#combining the list
Large_lagAs_xmap_Y_means <- list()
for(j in 1:5) {
  Large_lagAs_xmap_Y_means[[j]] <- Large_lagAs_xmap_Y_means_list[[j]][[1]]$rho
  for(i in 2:length(Large_lagAs_xmap_Y_means_list[[j]])){
    Large_lagAs_xmap_Y_means[[j]] <- cbind.data.frame(Large_lagAs_xmap_Y_means[[j]], Large_lagAs_xmap_Y_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Large_lagAs_xmap_Y_means_means <- list() 
Large_lagAs_xmap_Y_means_sds <- list() 
for(j in 1:5) {
  Large_lagAs_xmap_Y_means_means[[j]] <- apply(Large_lagAs_xmap_Y_means[[j]], 1, mean)
  Large_lagAs_xmap_Y_means_sds[[j]] <- apply(Large_lagAs_xmap_Y_means[[j]], 1, sd)
}

#example
Large_lagAs_xmap_Y_means_sds[[1]]
[1] 0.02397913 0.03634388 0.04533728 0.04988835 0.05444542 0.05519462
Large_lagAs_xmap_Y_summary <- list()
for(j in 1:5) {
  Large_lagAs_xmap_Y_summary[[j]] <- data.frame("lib_size" = Large_lagAs_xmap_Y_means_list[[j]][[1]]$lib_size, "mean" = Large_lagAs_xmap_Y_means_means[[j]], "sd" = Large_lagAs_xmap_Y_means_sds[[j]])
}
#example
Large_lagAs_xmap_Y_summary[[3]]
[8.3.3.7] For Large cage graphics
Data summary
Large_ccmY_xmap_A_all <- list()

for(i in 1:5){
  Large_ccmY_xmap_A_all[[i]] <- data.frame(
    "Library_size" = Large_lagY_xmap_A_means[[i]]$lib_size,
    "Y_xmap_A_rho" = Large_lagY_xmap_A_means[[i]]$rho,
    "Ys_xmap_A_rho" = Large_lagYs_xmap_A_summary[[i]]$mean,
    "Y_xmap_A_rho_psd" = Large_lagY_xmap_A_means[[i]]$rho + Large_lagY_xmap_A_means[[i]]$sd.rho,
    "Y_xmap_A_rho_msd" = Large_lagY_xmap_A_means[[i]]$rho - Large_lagY_xmap_A_means[[i]]$sd.rho,
    "Ys_xmap_A_rho_psd" = Large_lagYs_xmap_A_summary[[i]]$mean + Large_lagYs_xmap_A_summary[[i]]$sd,
    "Ys_xmap_A_rho_msd" = Large_lagYs_xmap_A_summary[[i]]$mean - Large_lagYs_xmap_A_summary[[i]]$sd
    )
}
#example
Large_ccmY_xmap_A_all[[2]]

Large_ccmA_xmap_Y_all <- list()

for(i in 1:5){
    "Library_size" = Large_lagA_xmap_Y_means[[i]]$lib_size,
    "A_xmap_Y_rho" = Large_lagA_xmap_Y_means[[i]]$rho,
    "As_xmap_Y_rho" = Large_lagAs_xmap_Y_summary[[i]]$mean,
    "A_xmap_Y_rho_psd" = Large_lagA_xmap_Y_means[[i]]$rho + Large_lagA_xmap_Y_means[[i]]$sd.rho,
    "A_xmap_Y_rho_msd" = Large_lagA_xmap_Y_means[[i]]$rho - Large_lagA_xmap_Y_means[[i]]$sd.rho,
    "As_xmap_Y_rho_psd" = Large_lagAs_xmap_Y_summary[[i]]$mean + Large_lagAs_xmap_Y_summary[[i]]$sd,
    )
}
#example
Large_ccmA_xmap_Y_all[[2]]
Graphics for CCM Large (for Figure S4)
#CCM Largeに関するplot
Large_ccm_ggplot <- list()
Large_subtitle <- c("(k)","(l)","(m)","(n)","(o)")

for(i in 1:5){
#Y_xmap_A:Cm xmap Cc #F8766D (red)
Large_ccm_ggplot[[i]] <- ggplot(data = Large_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Y_xmap_A_rho)) + 
  geom_line(linetype = 1, color = "#F8766D") + 
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(shape = 16, size = 3, color = "#F8766D") +

#A_xmap_Y:Cc xmap Cm #00BFC4 (blue-green)  
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), shape = 17, size = 3, color = "#00BFC4") +
  
  geom_line(data = Large_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), linetype = 1, color = "#F8766D") +
  geom_line(data = Large_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(data = Large_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(data = Large_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), shape = 1, size = 3, color = "#F8766D") +
  
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Large_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), shape = 2, size = 3, color = "#00BFC4") +

  ylim(-0.1, 1) +
  ylab("") +
  xlab("") +
  ggtitle(paste(Large_subtitle[i], "Large", "tp =", 1 - i, sep = " "))
for(i in 1:5) {
  print(Large_ccm_ggplot[[i]])
}

[8.3.3.8] For Huge cage analysis
CCM
Huge_lagY_xmap_A <- list()
Huge_lagA_xmap_Y <- list()

#not showing warning 

Huge_lagY_xmap_A <- lapply(0:-4, function(i) ccm(Huge_YA_allcombined, E = Huge_optE_Y, lib_column = "Huge_Y", target_column = "Huge_A", lib_sizes = floor(seq(Huge_optE_Y, nrow(Huge_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))

Huge_lagA_xmap_Y <- lapply(0:-4, function(i) ccm(Huge_YA_allcombined, E = Huge_optE_A, lib_column = "Huge_A", target_column = "Huge_Y", lib_sizes = floor(seq(Huge_optE_A, nrow(Huge_YA_allcombined), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


#example
Huge_lagY_xmap_A[[2]]
Calculating means and sds
Huge_lagY_xmap_A_means <- list()
Huge_lagA_xmap_Y_means <- list()

Huge_lagY_xmap_A_means <- lapply(1:5, function(i) ccm_means(Huge_lagY_xmap_A[[i]], na.rm = TRUE))
Huge_lagA_xmap_Y_means <- lapply(1:5, function(i) ccm_means(Huge_lagA_xmap_Y[[i]], na.rm = TRUE))

Huge_lagY_xmap_A_means <- lapply(1:5, function(i) data.frame(Huge_lagY_xmap_A_means[[i]], sd.rho = ccm_means(Huge_lagY_xmap_A[[i]], FUN = sd, na.rm = TRUE)$rho))
Huge_lagA_xmap_Y_means <- lapply(1:5, function(i) data.frame(Huge_lagA_xmap_Y_means[[i]], sd.rho = ccm_means(Huge_lagA_xmap_Y[[i]], FUN = sd, na.rm = TRUE)$rho))

#With the maximum library size,since there is not replicate, so SD cannot be calculated and set as zero
for(i in 1:5){
  Huge_lagY_xmap_A_means[[i]]$sd.rho[nrow(Huge_lagY_xmap_A_means[[i]])] <- 0
}
for(i in 1:5){
  Huge_lagA_xmap_Y_means[[i]]$sd.rho[nrow(Huge_lagA_xmap_Y_means[[i]])] <- 0
}

#example
Huge_lagA_xmap_Y_means[[3]]
Generating Surrogate data (ebisuzaki) for each replicate and CCM

–For Yotsumon (Cm)

#Generating Surrogate data
set.seed(12345)
Huge_Y_each_s <- list()

Huge_Y_each_s <- lapply(1:length(Huge_Y_each), function(i) make_surrogate_data(Huge_Y_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Huge_Y_each_s <- lapply(1:length(Huge_Y_each_s), function(i) rbind.data.frame(Huge_Y_each_s[[i]], matrix(rep(NA, 100*(no_NAs_Huge)), nrow = no_NAs_Huge)))

Huge_Y_each_s2 <- NULL

for(i in 1:length(Huge_Y_each_s)){
  Huge_Y_each_s2 <- rbind.data.frame(Huge_Y_each_s2, Huge_Y_each_s[[i]])
}
Huge_Y_each_s2

#Surrogate Y (Ys) xmap A (CCM)
Huge_AYs <- cbind.data.frame(Huge_Y_each_s2, "Huge_A" = Huge_YA_allcombined$Huge_A)
Huge_lagYs_xmap_A <- list()
 
for(j in 1:5) {
}

#example
Huge_lagYs_xmap_A[[4]][[16]]

#mean and sd of surrogate Y xmap A
Huge_lagYs_xmap_A_means_list <- list()
for(j in 1:5) {
  Huge_lagYs_xmap_A_means_list[[j]] <- lapply(1:length(Huge_lagYs_xmap_A[[j]]), function(i) ccm_means(Huge_lagYs_xmap_A[[j]][[i]], na.rm = TRUE))
}
#combining the list
Huge_lagYs_xmap_A_means <- list()
for(j in 1:5) {
  Huge_lagYs_xmap_A_means[[j]] <- Huge_lagYs_xmap_A_means_list[[j]][[1]]$rho
  for(i in 2:length(Huge_lagYs_xmap_A_means_list[[j]])){
    Huge_lagYs_xmap_A_means[[j]] <- cbind.data.frame(Huge_lagYs_xmap_A_means[[j]], Huge_lagYs_xmap_A_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Huge_lagYs_xmap_A_means_means <- list() 
Huge_lagYs_xmap_A_means_sds <- list() 
for(j in 1:5) {
  Huge_lagYs_xmap_A_means_means[[j]] <- apply(Huge_lagYs_xmap_A_means[[j]], 1, mean)
  Huge_lagYs_xmap_A_means_sds[[j]] <- apply(Huge_lagYs_xmap_A_means[[j]], 1, sd)
}

#example
Huge_lagYs_xmap_A_means_sds[[1]]
 0.02726424 0.05057614 0.05527516 0.05871576 0.06292198 0.06850279
Huge_lagYs_xmap_A_summary <- list()
for(j in 1:5) {
  Huge_lagYs_xmap_A_summary[[j]] <- data.frame("lib_size" = Huge_lagYs_xmap_A_means_list[[j]][[1]]$lib_size, "mean" = Huge_lagYs_xmap_A_means_means[[j]], "sd" = Huge_lagYs_xmap_A_means_sds[[j]])
}
#example
Huge_lagYs_xmap_A_summary[[3]]

–For Azuki (Cc)

#Generating Surrogate data
set.seed(12345)
Huge_A_each_s <- list()

Huge_A_each_s <- lapply(1:length(Huge_A_each), function(i) make_surrogate_data(Huge_A_each[[i]], method = c("ebisuzaki"), num_surr = 100))

Huge_A_each_s <- lapply(1:length(Huge_A_each_s), function(i) rbind.data.frame(Huge_A_each_s[[i]], matrix(rep(NA,100*(no_NAs_Huge)), nrow = no_NAs_Huge)))

Huge_A_each_s2 <- NULL

for(i in 1:length(Huge_A_each_s)){
}
Huge_A_each_s2

#Surrogate A (As) xmap Y (CCM)
Huge_YAs <- cbind.data.frame(Huge_A_each_s2, "Huge_Y" = Huge_YA_allcombined$Huge_Y)
Huge_lagAs_xmap_Y <- list()
 
for(j in 1:5) {
}

#example
Huge_lagAs_xmap_Y[[4]][[16]]

#mean and sd of surrogate A xmap Y
Huge_lagAs_xmap_Y_means_list <- list()
for(j in 1:5) {
  Huge_lagAs_xmap_Y_means_list[[j]] <- lapply(1:length(Huge_lagAs_xmap_Y[[j]]), function(i) ccm_means(Huge_lagAs_xmap_Y[[j]][[i]], na.rm = TRUE))
}
#combining the list
Huge_lagAs_xmap_Y_means <- list()
for(j in 1:5) {
  Huge_lagAs_xmap_Y_means[[j]] <- Huge_lagAs_xmap_Y_means_list[[j]][[1]]$rho
  for(i in 2:length(Huge_lagAs_xmap_Y_means_list[[j]])){
    Huge_lagAs_xmap_Y_means[[j]] <- cbind.data.frame(Huge_lagAs_xmap_Y_means[[j]], Huge_lagAs_xmap_Y_means_list[[j]][[i]]$rho)
  }
}

#calculating means and sds of "means"
Huge_lagAs_xmap_Y_means_means <- list() 
Huge_lagAs_xmap_Y_means_sds <- list() 
for(j in 1:5) {
  Huge_lagAs_xmap_Y_means_means[[j]] <- apply(Huge_lagAs_xmap_Y_means[[j]], 1, mean)
  Huge_lagAs_xmap_Y_means_sds[[j]] <- apply(Huge_lagAs_xmap_Y_means[[j]], 1, sd)
}

#example
[1] 0.03000238 0.04001159 0.04301337 0.04740172 0.05334495 0.05620980
Huge_lagAs_xmap_Y_summary <- list()
for(j in 1:5) {
  Huge_lagAs_xmap_Y_summary[[j]] <- data.frame("lib_size" = Huge_lagAs_xmap_Y_means_list[[j]][[1]]$lib_size, "mean" = Huge_lagAs_xmap_Y_means_means[[j]], "sd" = Huge_lagAs_xmap_Y_means_sds[[j]])
}
#example
[8.3.3.9] For Huge cage graphics
Data summary
Huge_ccmY_xmap_A_all <- list()

for(i in 1:5){
  Huge_ccmY_xmap_A_all[[i]] <- data.frame(
    "Library_size" = Huge_lagY_xmap_A_means[[i]]$lib_size,
    "Y_xmap_A_rho" = Huge_lagY_xmap_A_means[[i]]$rho,
    "Ys_xmap_A_rho" = Huge_lagYs_xmap_A_summary[[i]]$mean,
    "Y_xmap_A_rho_psd" = Huge_lagY_xmap_A_means[[i]]$rho + Huge_lagY_xmap_A_means[[i]]$sd.rho,
    "Y_xmap_A_rho_msd" = Huge_lagY_xmap_A_means[[i]]$rho - Huge_lagY_xmap_A_means[[i]]$sd.rho,
    "Ys_xmap_A_rho_psd" = Huge_lagYs_xmap_A_summary[[i]]$mean + Huge_lagYs_xmap_A_summary[[i]]$sd,
    "Ys_xmap_A_rho_msd" = Huge_lagYs_xmap_A_summary[[i]]$mean - Huge_lagYs_xmap_A_summary[[i]]$sd
    )
}
#example
Huge_ccmY_xmap_A_all[[2]]

Huge_ccmA_xmap_Y_all <- list()

for(i in 1:5){
  Huge_ccmA_xmap_Y_all[[i]] <- data.frame(
    "Library_size" = Huge_lagA_xmap_Y_means[[i]]$lib_size,
    "A_xmap_Y_rho" = Huge_lagA_xmap_Y_means[[i]]$rho,
    "As_xmap_Y_rho" = Huge_lagAs_xmap_Y_summary[[i]]$mean,
    "A_xmap_Y_rho_psd" = Huge_lagA_xmap_Y_means[[i]]$rho + Huge_lagA_xmap_Y_means[[i]]$sd.rho,
    "A_xmap_Y_rho_msd" = Huge_lagA_xmap_Y_means[[i]]$rho - Huge_lagA_xmap_Y_means[[i]]$sd.rho,
    "As_xmap_Y_rho_psd" = Huge_lagAs_xmap_Y_summary[[i]]$mean + Huge_lagAs_xmap_Y_summary[[i]]$sd,
    "As_xmap_Y_rho_msd" = Huge_lagAs_xmap_Y_summary[[i]]$mean - Huge_lagAs_xmap_Y_summary[[i]]$sd
    )
}
Huge_ccmA_xmap_Y_all[[2]]
Graphics for CCM Huge (for Figure S4)
#CCM Hugeに関するplot
Huge_ccm_ggplot <- list()
Huge_subtitle <- c("(p)","(q)","(r)","(s)","(t)")

for(i in 1:5){
#Y_xmap_A:Cm xmap Cc #F8766D (red)
Huge_ccm_ggplot[[i]] <- ggplot(data = Huge_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Y_xmap_A_rho)) + 
  geom_line(linetype = 1, color = "#F8766D") + 
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(aes(x = Library_size, y = Y_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(shape = 16, size = 3, color = "#F8766D") +

#A_xmap_Y:Cc xmap Cm #00BFC4 (blue-green)  
  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = A_xmap_Y_rho), shape = 17, size = 3, color = "#00BFC4") +
  
  geom_line(data = Huge_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), linetype = 1, color = "#F8766D") +
  geom_line(data = Huge_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_psd), linetype = 2, color = "#F8766D") +
  geom_line(data = Huge_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho_msd), linetype = 2, color = "#F8766D") +
  geom_point(data = Huge_ccmY_xmap_A_all[[i]], aes(x = Library_size, y = Ys_xmap_A_rho), shape = 1, size = 3, color = "#F8766D") +

  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), linetype = 1, color = "#00BFC4") +
  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_psd), linetype = 2, color = "#00BFC4") +
  geom_line(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho_msd), linetype = 2, color = "#00BFC4") +
  geom_point(data = Huge_ccmA_xmap_Y_all[[i]], aes(x = Library_size, y = As_xmap_Y_rho), shape = 2, size = 3, color = "#00BFC4") +

  ylim(-0.1, 1) +
  ylab("") +
  xlab("") +
  ggtitle(paste(Huge_subtitle[i], "Huge", "tp =", 1 - i, sep = " "))
}
for(i in 1:5) {
  print(Huge_ccm_ggplot[[i]])
}

[8.4] CCM analysis for combined data with >= 35 points

[8.4.1] Confirming the characteristics of time series

#When either C.m or C.c showed linear dynamics, we did not apply CCM to them
subset(Table1, (theta_for_C.m == 0 | theta_for_C.c == 0))
subset(Table1, (theta_for_C.m == 0 | theta_for_C.c == 0))$ID
[1] "S3" "S4" "M1" "L2" "L3" "H4" "H5"

[8.4.2] CCM for Small combined (S1, S2, S5, & S6)

Sk <- c(1, 2, 5, 6) #index for sample ID used for CCM (S1, S2, S5, & S6)
Small_ccmdata_combined <- list()
Small_ccmY_xmap_A_combined <- list()
Small_ccmA_xmap_Y_combined <- list()
Small_ccmY_xmap_Y_combined <- list()
Small_ccmA_xmap_A_combined <- list()

for(j in 1:6) Small_ccmdata_combined[[j]] <- data.frame("Y" = S_combined_Y[[j]], "A" = S_combined_A[[j]])


#Cm (Y) xmap Cc (A)
for(k in 1:4) {
  Small_ccmY_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Small_ccmdata_combined[[Sk[k]]], E = Table1$E_for_C.m[Sk[k]], lib_column = "Y", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.m[Sk[k]], length(Small_ccmdata_combined[[Sk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cm (Y)
for(k in 1:4) {
  Small_ccmA_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Small_ccmdata_combined[[Sk[k]]], E = Table1$E_for_C.c[Sk[k]], lib_column = "A", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.c[Sk[k]], length(Small_ccmdata_combined[[Sk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Small_ccmA_xmap_Y_combined[[3]][[1]] 

#Cm (Y) xmap Cm (Y) for intraspecific density dependence
for(k in 1:4) {
  Small_ccmY_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Small_ccmdata_combined[[Sk[k]]], E = Table1$E_for_C.m[Sk[k]], lib_column = "Y", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.m[Sk[k]], length(Small_ccmdata_combined[[Sk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cc (A)
  Small_ccmA_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Small_ccmdata_combined[[Sk[k]]], E = Table1$E_for_C.c[Sk[k]], lib_column = "A", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.c[Sk[k]], length(Small_ccmdata_combined[[Sk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Small_ccmA_xmap_A_combined[[3]][[1]] 

[8.4.3] CCM for Medium combined (M2 to M7)

Mk <- c(2, 3, 4, 5, 6, 7) #index for sample ID used for CCM (M2 to M7)
Medium_ccmdata_combined <- list()
Medium_ccmY_xmap_A_combined <- list()
Medium_ccmA_xmap_Y_combined <- list()
Medium_ccmY_xmap_Y_combined <- list()
Medium_ccmA_xmap_A_combined <- list()

for(j in 1:7) Medium_ccmdata_combined[[j]] <- data.frame("Y" = M_combined_Y[[j]], "A" = M_combined_A[[j]])


#Cm (Y) xmap Cc (A)
for(k in 1:6) {
  Medium_ccmY_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Medium_ccmdata_combined[[Mk[k]]], E = Table1$E_for_C.m[Mk[k]], lib_column = "Y", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.m[Mk[k]], length(Medium_ccmdata_combined[[Mk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cm (Y)
  Medium_ccmA_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Medium_ccmdata_combined[[Mk[k]]], E = Table1$E_for_C.c[Mk[k]], lib_column = "A", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.c[Mk[k]], length(Medium_ccmdata_combined[[Mk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Medium_ccmA_xmap_Y_combined[[3]][[1]] 

#Cm (Y) xmap Cm (Y) for intraspecific density dependence
for(k in 1:6) {
  Medium_ccmY_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Medium_ccmdata_combined[[Mk[k]]], E = Table1$E_for_C.m[Mk[k]], lib_column = "Y", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.m[Mk[k]], length(Medium_ccmdata_combined[[Mk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cc (A)
for(k in 1:6) {
  Medium_ccmA_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Medium_ccmdata_combined[[Mk[k]]], E = Table1$E_for_C.c[Mk[k]], lib_column = "A", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.c[Mk[k]], length(Medium_ccmdata_combined[[Mk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Medium_ccmA_xmap_A_combined[[3]][[1]] 

[8.4.4] CCM for Large combined (L1, L4 to L8)

Lk <- c(1, 4, 5, 6, 7, 8) #index for sample ID used for CCM (L1, L4 to L8)
Large_ccmdata_combined <- list()
Large_ccmY_xmap_A_combined <- list()
Large_ccmA_xmap_Y_combined <- list()
Large_ccmY_xmap_Y_combined <- list()
Large_ccmA_xmap_A_combined <- list()

for(j in 1:8) Large_ccmdata_combined[[j]] <- data.frame("Y" = L_combined_Y[[j]], "A" = L_combined_A[[j]])


#Cm (Y) xmap Cc (A)
for(k in 1:6) {
  Large_ccmY_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Large_ccmdata_combined[[Lk[k]]], E = Table1$E_for_C.m[Lk[k]], lib_column = "Y", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.m[Lk[k]], length(Large_ccmdata_combined[[Lk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cm (Y)
  Large_ccmA_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Large_ccmdata_combined[[Lk[k]]], E = Table1$E_for_C.c[Lk[k]], lib_column = "A", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.c[Lk[k]], length(Large_ccmdata_combined[[Lk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Large_ccmA_xmap_Y_combined[[3]][[1]] 

#Cm (Y) xmap Cm (Y) for intraspecific density dependence
for(k in 1:6) {
  Large_ccmY_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Large_ccmdata_combined[[Lk[k]]], E = Table1$E_for_C.m[Lk[k]], lib_column = "Y", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.m[Lk[k]], length(Large_ccmdata_combined[[Lk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cc (A)
for(k in 1:6) {
  Large_ccmA_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Large_ccmdata_combined[[Lk[k]]], E = Table1$E_for_C.c[Lk[k]], lib_column = "A", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.c[Lk[k]], length(Large_ccmdata_combined[[Lk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Large_ccmA_xmap_A_combined[[3]][[1]] 

[8.4.5] CCM for Huge combined (H1, H2, H3, H6, H7, H8)

Hk <- c(1, 2, 3, 6, 7, 8) #index for sample ID used for CCM (H1, H2, H3, H6, H7, H8)
Huge_ccmdata_combined <- list()
Huge_ccmY_xmap_A_combined <- list()
Huge_ccmA_xmap_Y_combined <- list()
Huge_ccmY_xmap_Y_combined <- list()
Huge_ccmA_xmap_A_combined <- list()

for(j in 1:8) Huge_ccmdata_combined[[j]] <- data.frame("Y" = H_combined_Y[[j]], "A" = H_combined_A[[j]])


for(k in 1:6) {
  Huge_ccmY_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Huge_ccmdata_combined[[Hk[k]]], E = Table1$E_for_C.m[Hk[k]], lib_column = "Y", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.m[Hk[k]], length(Huge_ccmdata_combined[[Hk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cm (Y)
for(k in 1:6) {
  Huge_ccmA_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Huge_ccmdata_combined[[Hk[k]]], E = Table1$E_for_C.c[Hk[k]], lib_column = "A", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.c[Hk[k]], length(Huge_ccmdata_combined[[Hk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Huge_ccmA_xmap_Y_combined[[3]][[1]] 

#Cm (Y) xmap Cm (Y) for intraspecific density dependence
for(k in 1:6) {
  Huge_ccmY_xmap_Y_combined[[k]] <- lapply(0:-4, function(i) ccm(Huge_ccmdata_combined[[Hk[k]]], E = Table1$E_for_C.m[Hk[k]], lib_column = "Y", target_column = "Y", lib_sizes = floor(seq(Table1$E_for_C.m[Hk[k]], length(Huge_ccmdata_combined[[Hk[k]]]$Y), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#Cc (A) xmap Cc (A)
for(k in 1:6) {
  Huge_ccmA_xmap_A_combined[[k]] <- lapply(0:-4, function(i) ccm(Huge_ccmdata_combined[[Hk[k]]], E = Table1$E_for_C.c[Hk[k]], lib_column = "A", target_column = "A", lib_sizes = floor(seq(Table1$E_for_C.c[Hk[k]], length(Huge_ccmdata_combined[[Hk[k]]]$A), length = 10)), num_samples = 100, replace = F, tp = i, RNGseed = 1234))  
}

#example
Huge_ccmA_xmap_A_combined[[3]][[1]] 

[8.4.6] Saving the results of [8.4] section

saveRDS(Small_ccmY_xmap_A_combined, "Small_ccmY_xmap_A_combined.obj")
saveRDS(Small_ccmY_xmap_Y_combined, "Small_ccmY_xmap_Y_combined.obj")
saveRDS(Small_ccmA_xmap_Y_combined, "Small_ccmA_xmap_Y_combined.obj")
saveRDS(Small_ccmA_xmap_A_combined, "Small_ccmA_xmap_A_combined.obj")

saveRDS(Medium_ccmY_xmap_A_combined, "Medium_ccmY_xmap_A_combined.obj")
saveRDS(Medium_ccmY_xmap_Y_combined, "Medium_ccmY_xmap_Y_combined.obj")
saveRDS(Medium_ccmA_xmap_Y_combined, "Medium_ccmA_xmap_Y_combined.obj")
saveRDS(Medium_ccmA_xmap_A_combined, "Medium_ccmA_xmap_A_combined.obj")

saveRDS(Large_ccmY_xmap_A_combined, "Large_ccmY_xmap_A_combined.obj")
saveRDS(Large_ccmY_xmap_Y_combined, "Large_ccmY_xmap_Y_combined.obj")
saveRDS(Large_ccmA_xmap_Y_combined, "Large_ccmA_xmap_Y_combined.obj")
saveRDS(Large_ccmA_xmap_A_combined, "Large_ccmA_xmap_A_combined.obj")

saveRDS(Huge_ccmY_xmap_A_combined, "Huge_ccmY_xmap_A_combined.obj")
saveRDS(Huge_ccmY_xmap_Y_combined, "Huge_ccmY_xmap_Y_combined.obj")
saveRDS(Huge_ccmA_xmap_Y_combined, "Huge_ccmA_xmap_Y_combined.obj")
saveRDS(Huge_ccmA_xmap_A_combined, "Huge_ccmA_xmap_A_combined.obj")

saveRDS(Table1, "Table1.obj")

[8.5] Calculating the index for interspecific interaction strength

[8.5.0] When starting from this section, load the followings

#Cage volume
Smallvolume <- 8.5*6*3.5
Mediumvolume <- 13.5*8.5*4.5 
Largevolume <- 18.5*14*6.5
Hugevolume <- 22*15.5*7.5
#Table, which include the coexistence week information
Table1 <- readRDS("Table1.obj")
#CCM results for combined time series >= 35 points
Small_ccmY_xmap_A_combined <- readRDS("Small_ccmY_xmap_A_combined.obj")
Small_ccmY_xmap_Y_combined <- readRDS("Small_ccmY_xmap_Y_combined.obj")
Small_ccmA_xmap_Y_combined <- readRDS("Small_ccmA_xmap_Y_combined.obj")
Small_ccmA_xmap_A_combined <- readRDS("Small_ccmA_xmap_A_combined.obj")

Medium_ccmY_xmap_A_combined <- readRDS("Medium_ccmY_xmap_A_combined.obj")
Medium_ccmA_xmap_Y_combined <- readRDS("Medium_ccmA_xmap_Y_combined.obj")
Medium_ccmA_xmap_A_combined <- readRDS("Medium_ccmA_xmap_A_combined.obj")

Large_ccmY_xmap_A_combined <- readRDS("Large_ccmY_xmap_A_combined.obj")
Large_ccmY_xmap_Y_combined <- readRDS("Large_ccmY_xmap_Y_combined.obj")
Large_ccmA_xmap_Y_combined <- readRDS("Large_ccmA_xmap_Y_combined.obj")
Large_ccmA_xmap_A_combined <- readRDS("Large_ccmA_xmap_A_combined.obj")

Huge_ccmY_xmap_A_combined <- readRDS("Huge_ccmY_xmap_A_combined.obj")
Huge_ccmY_xmap_Y_combined <- readRDS("Huge_ccmY_xmap_Y_combined.obj")
Huge_ccmA_xmap_Y_combined <- readRDS("Huge_ccmA_xmap_Y_combined.obj")
Huge_ccmA_xmap_A_combined <- readRDS("Huge_ccmA_xmap_A_combined.obj")

[8.5.1] Preparation for the index of interspecific interaction strength

– There are multiple possibilities to calculate the index of interspecific interaction strength. We finally decided to use the rho value of interspecific CCM with the maximum library length standardized by using the interspecific CCM rho with the minimum library length, and the intraspecific CCM rho with the maximum and minimum library lengths.

– Note that SIZE_ccmU_xmap_V_combined[[k]][[j]] represents the result from the combined time series ID “SIZEk” with delay tp (1 - j). (j from 1 to 5)

For Small
Small_Y_xmap_A_interaction <- list()
Small_Y_xmap_Y_interaction <- list()
Small_A_xmap_Y_interaction <- list()
Small_A_xmap_A_interaction <- list()

for(k in 1:length(Small_ccmY_xmap_A_combined)){
  Small_Y_xmap_A_interaction[[k]] <- list()
  Small_Y_xmap_Y_interaction[[k]] <- list()
  Small_A_xmap_Y_interaction[[k]] <- list()
  Small_A_xmap_A_interaction[[k]] <- list()
  for(j in 1:5) {
    Small_Y_xmap_A_interaction[[k]][[j]] <- subset(Small_ccmY_xmap_A_combined[[k]][[j]]$rho,  Small_ccmY_xmap_A_combined[[k]][[j]]$lib_size == max(Small_ccmY_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Small_ccmY_xmap_A_combined[[k]][[j]]$rho, Small_ccmY_xmap_A_combined[[k]][[j]]$lib_size == min(Small_ccmY_xmap_A_combined[[k]][[j]]$lib_size))
    
    Small_Y_xmap_Y_interaction[[k]][[j]] <- subset(Small_ccmY_xmap_Y_combined[[k]][[j]]$rho,  Small_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == max(Small_ccmY_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Small_ccmY_xmap_Y_combined[[k]][[j]]$rho, Small_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == min(Small_ccmY_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Small_A_xmap_Y_interaction[[k]][[j]] <- subset(Small_ccmA_xmap_Y_combined[[k]][[j]]$rho,  Small_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == max(Small_ccmA_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Small_ccmA_xmap_Y_combined[[k]][[j]]$rho, Small_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == min(Small_ccmA_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Small_A_xmap_A_interaction[[k]][[j]] <- subset(Small_ccmA_xmap_A_combined[[k]][[j]]$rho,  Small_ccmA_xmap_A_combined[[k]][[j]]$lib_size == max(Small_ccmA_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Small_ccmA_xmap_A_combined[[k]][[j]]$rho, Small_ccmA_xmap_A_combined[[k]][[j]]$lib_size == min(Small_ccmA_xmap_A_combined[[k]][[j]]$lib_size))
    
    #convert negative values into zero
    Small_Y_xmap_A_interaction[[k]][[j]][Small_Y_xmap_A_interaction[[k]][[j]] < 0] <- 0
    Small_Y_xmap_Y_interaction[[k]][[j]][Small_Y_xmap_Y_interaction[[k]][[j]] < 0] <- 0
    Small_A_xmap_Y_interaction[[k]][[j]][Small_A_xmap_Y_interaction[[k]][[j]] < 0] <- 0
    Small_A_xmap_A_interaction[[k]][[j]][Small_A_xmap_A_interaction[[k]][[j]] < 0] <- 0
    
  }
}
For Medium
Medium_Y_xmap_A_interaction <- list()
Medium_Y_xmap_Y_interaction <- list()
Medium_A_xmap_Y_interaction <- list()
Medium_A_xmap_A_interaction <- list()

for(k in 1:length(Medium_ccmY_xmap_A_combined)){
  Medium_Y_xmap_A_interaction[[k]] <- list()
  Medium_Y_xmap_Y_interaction[[k]] <- list()
  Medium_A_xmap_Y_interaction[[k]] <- list()
  Medium_A_xmap_A_interaction[[k]] <- list()
  for(j in 1:5) {
    Medium_Y_xmap_A_interaction[[k]][[j]] <- subset(Medium_ccmY_xmap_A_combined[[k]][[j]]$rho,  Medium_ccmY_xmap_A_combined[[k]][[j]]$lib_size == max(Medium_ccmY_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Medium_ccmY_xmap_A_combined[[k]][[j]]$rho, Medium_ccmY_xmap_A_combined[[k]][[j]]$lib_size == min(Medium_ccmY_xmap_A_combined[[k]][[j]]$lib_size))
    
    Medium_Y_xmap_Y_interaction[[k]][[j]] <- subset(Medium_ccmY_xmap_Y_combined[[k]][[j]]$rho,  Medium_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == max(Medium_ccmY_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Medium_ccmY_xmap_Y_combined[[k]][[j]]$rho, Medium_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == min(Medium_ccmY_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Medium_A_xmap_Y_interaction[[k]][[j]] <- subset(Medium_ccmA_xmap_Y_combined[[k]][[j]]$rho,  Medium_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == max(Medium_ccmA_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Medium_ccmA_xmap_Y_combined[[k]][[j]]$rho, Medium_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == min(Medium_ccmA_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Medium_A_xmap_A_interaction[[k]][[j]] <- subset(Medium_ccmA_xmap_A_combined[[k]][[j]]$rho,  Medium_ccmA_xmap_A_combined[[k]][[j]]$lib_size == max(Medium_ccmA_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Medium_ccmA_xmap_A_combined[[k]][[j]]$rho, Medium_ccmA_xmap_A_combined[[k]][[j]]$lib_size == min(Medium_ccmA_xmap_A_combined[[k]][[j]]$lib_size))
    
    #convert negative values into zero
    Medium_Y_xmap_A_interaction[[k]][[j]][Medium_Y_xmap_A_interaction[[k]][[j]] < 0] <- 0
    Medium_Y_xmap_Y_interaction[[k]][[j]][Medium_Y_xmap_Y_interaction[[k]][[j]] < 0] <- 0
    Medium_A_xmap_Y_interaction[[k]][[j]][Medium_A_xmap_Y_interaction[[k]][[j]] < 0] <- 0
    Medium_A_xmap_A_interaction[[k]][[j]][Medium_A_xmap_A_interaction[[k]][[j]] < 0] <- 0
    
  }
}
For Large
Large_Y_xmap_A_interaction <- list()
Large_Y_xmap_Y_interaction <- list()
Large_A_xmap_Y_interaction <- list()
Large_A_xmap_A_interaction <- list()

for(k in 1:length(Large_ccmY_xmap_A_combined)){
  Large_Y_xmap_A_interaction[[k]] <- list()
  Large_Y_xmap_Y_interaction[[k]] <- list()
  Large_A_xmap_Y_interaction[[k]] <- list()
  Large_A_xmap_A_interaction[[k]] <- list()
  for(j in 1:5) {
    Large_Y_xmap_A_interaction[[k]][[j]] <- subset(Large_ccmY_xmap_A_combined[[k]][[j]]$rho,  Large_ccmY_xmap_A_combined[[k]][[j]]$lib_size == max(Large_ccmY_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Large_ccmY_xmap_A_combined[[k]][[j]]$rho, Large_ccmY_xmap_A_combined[[k]][[j]]$lib_size == min(Large_ccmY_xmap_A_combined[[k]][[j]]$lib_size))
    
    Large_Y_xmap_Y_interaction[[k]][[j]] <- subset(Large_ccmY_xmap_Y_combined[[k]][[j]]$rho,  Large_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == max(Large_ccmY_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Large_ccmY_xmap_Y_combined[[k]][[j]]$rho, Large_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == min(Large_ccmY_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Large_A_xmap_Y_interaction[[k]][[j]] <- subset(Large_ccmA_xmap_Y_combined[[k]][[j]]$rho,  Large_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == max(Large_ccmA_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Large_ccmA_xmap_Y_combined[[k]][[j]]$rho, Large_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == min(Large_ccmA_xmap_Y_combined[[k]][[j]]$lib_size))
    
  }
}
For Huge
Huge_Y_xmap_A_interaction <- list()
Huge_Y_xmap_Y_interaction <- list()
Huge_A_xmap_Y_interaction <- list()
Huge_A_xmap_A_interaction <- list()

for(k in 1:length(Huge_ccmY_xmap_A_combined)){
  Huge_Y_xmap_A_interaction[[k]] <- list()
  Huge_Y_xmap_Y_interaction[[k]] <- list()
  Huge_A_xmap_Y_interaction[[k]] <- list()
  Huge_A_xmap_A_interaction[[k]] <- list()
  for(j in 1:5) {
    Huge_Y_xmap_A_interaction[[k]][[j]] <- subset(Huge_ccmY_xmap_A_combined[[k]][[j]]$rho,  Huge_ccmY_xmap_A_combined[[k]][[j]]$lib_size == max(Huge_ccmY_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Huge_ccmY_xmap_A_combined[[k]][[j]]$rho, Huge_ccmY_xmap_A_combined[[k]][[j]]$lib_size == min(Huge_ccmY_xmap_A_combined[[k]][[j]]$lib_size))
    
    Huge_Y_xmap_Y_interaction[[k]][[j]] <- subset(Huge_ccmY_xmap_Y_combined[[k]][[j]]$rho,  Huge_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == max(Huge_ccmY_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Huge_ccmY_xmap_Y_combined[[k]][[j]]$rho, Huge_ccmY_xmap_Y_combined[[k]][[j]]$lib_size == min(Huge_ccmY_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Huge_A_xmap_Y_interaction[[k]][[j]] <- subset(Huge_ccmA_xmap_Y_combined[[k]][[j]]$rho,  Huge_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == max(Huge_ccmA_xmap_Y_combined[[k]][[j]]$lib_size)) - subset(Huge_ccmA_xmap_Y_combined[[k]][[j]]$rho, Huge_ccmA_xmap_Y_combined[[k]][[j]]$lib_size == min(Huge_ccmA_xmap_Y_combined[[k]][[j]]$lib_size))
    
    Huge_A_xmap_A_interaction[[k]][[j]] <- subset(Huge_ccmA_xmap_A_combined[[k]][[j]]$rho,  Huge_ccmA_xmap_A_combined[[k]][[j]]$lib_size == max(Huge_ccmA_xmap_A_combined[[k]][[j]]$lib_size)) - subset(Huge_ccmA_xmap_A_combined[[k]][[j]]$rho, Huge_ccmA_xmap_A_combined[[k]][[j]]$lib_size == min(Huge_ccmA_xmap_A_combined[[k]][[j]]$lib_size))
    
    #convert negative values into zero
    Huge_Y_xmap_Y_interaction[[k]][[j]][Huge_Y_xmap_Y_interaction[[k]][[j]] < 0] <- 0
    Huge_A_xmap_A_interaction[[k]][[j]][Huge_A_xmap_A_interaction[[k]][[j]] < 0] <- 0
    
  }
}

[8.5.2] Calculating the index of interspecific interaction strength

– Note the direction of CCM and that of interaction are opposite. – Relative interaction from U to V is V_xmap_U_interaction/U_xmap_U_interaction ##### For Small

Small_fromYtoA_interaction <- list()
Small_fromAtoY_interaction <- list()

for(k in 1:length(Small_ccmY_xmap_A_combined)){
  Small_fromYtoA_interaction[[k]] <- list()
  Small_fromAtoY_interaction[[k]] <- list()
  for(j in 1:5) {
    Small_fromYtoA_interaction[[k]][[j]] <- Small_A_xmap_Y_interaction[[k]][[j]]/Small_Y_xmap_Y_interaction[[k]][[j]]
    Small_fromAtoY_interaction[[k]][[j]] <- Small_Y_xmap_A_interaction[[k]][[j]]/Small_A_xmap_A_interaction[[k]][[j]]
  }
}
For Medium
Medium_fromYtoA_interaction <- list()
Medium_fromAtoY_interaction <- list()

for(k in 1:length(Medium_ccmY_xmap_A_combined)){
  Medium_fromYtoA_interaction[[k]] <- list()
  Medium_fromAtoY_interaction[[k]] <- list()
  for(j in 1:5) {
    Medium_fromYtoA_interaction[[k]][[j]] <- Medium_A_xmap_Y_interaction[[k]][[j]]/Medium_Y_xmap_Y_interaction[[k]][[j]]
    Medium_fromAtoY_interaction[[k]][[j]] <- Medium_Y_xmap_A_interaction[[k]][[j]]/Medium_A_xmap_A_interaction[[k]][[j]]
  }
}
For Large
Large_fromYtoA_interaction <- list()
Large_fromAtoY_interaction <- list()

for(k in 1:length(Large_ccmY_xmap_A_combined)){
  Large_fromYtoA_interaction[[k]] <- list()
  Large_fromAtoY_interaction[[k]] <- list()
  for(j in 1:5) {
    Large_fromYtoA_interaction[[k]][[j]] <- Large_A_xmap_Y_interaction[[k]][[j]]/Large_Y_xmap_Y_interaction[[k]][[j]]
    Large_fromAtoY_interaction[[k]][[j]] <- Large_Y_xmap_A_interaction[[k]][[j]]/Large_A_xmap_A_interaction[[k]][[j]]
  }
}
For Huge
Huge_fromYtoA_interaction <- list()
Huge_fromAtoY_interaction <- list()

for(k in 1:length(Huge_ccmY_xmap_A_combined)){
  Huge_fromYtoA_interaction[[k]] <- list()
  Huge_fromAtoY_interaction[[k]] <- list()
  for(j in 1:5) {
    Huge_fromYtoA_interaction[[k]][[j]] <- Huge_A_xmap_Y_interaction[[k]][[j]]/Huge_Y_xmap_Y_interaction[[k]][[j]]
    Huge_fromAtoY_interaction[[k]][[j]] <- Huge_Y_xmap_A_interaction[[k]][[j]]/Huge_A_xmap_A_interaction[[k]][[j]]
  }
}

[8.5.3] Calculating averages and SEs

Function for calculating SEs for WLS
#Defining the function of standard error
se <- function(x, na.inf.rm = T) {
  if(na.inf.rm == T) {
    y <- x[!is.na(x)]
    y <- y[!is.infinite(y)]
  } else {
    y <- x
  }
  sd(y)/sqrt(length(y))
}
Calculating averages and SEs with excluding NaN and inf
#For Small
Small_fromYtoA_interaction_mean <- c()
Small_fromAtoY_interaction_mean <- c()
Small_fromYtoA_interaction_se <- c()
Small_fromAtoY_interaction_se <- c()

for(j in 1:5){
  Small_fromYtoA_interaction_mean[[j]] <- list()
  Small_fromAtoY_interaction_mean[[j]] <- list()
  Small_fromYtoA_interaction_se[[j]] <- list()
  Small_fromAtoY_interaction_se[[j]] <- list()

  for(k in 1:length(Small_ccmY_xmap_A_combined)) {
    Small_fromYtoA_interaction_mean[[j]][[k]] <- mean(Small_fromYtoA_interaction[[k]][[j]][!is.infinite(Small_fromYtoA_interaction[[k]][[j]])], na.rm = T)
    Small_fromAtoY_interaction_mean[[j]][[k]] <- mean(Small_fromAtoY_interaction[[k]][[j]][!is.infinite(Small_fromAtoY_interaction[[k]][[j]])], na.rm = T)
    Small_fromYtoA_interaction_se[[j]][[k]] <- se(Small_fromYtoA_interaction[[k]][[j]], na.inf.rm = T)
  }
}

#For Medium
Medium_fromYtoA_interaction_mean <- c()
Medium_fromYtoA_interaction_se <- c()
Medium_fromAtoY_interaction_se <- c()

for(j in 1:5){
  Medium_fromYtoA_interaction_mean[[j]] <- list()
  Medium_fromAtoY_interaction_mean[[j]] <- list()
  Medium_fromYtoA_interaction_se[[j]] <- list()
  Medium_fromAtoY_interaction_se[[j]] <- list()

  for(k in 1:length(Medium_ccmY_xmap_A_combined)) {
    Medium_fromYtoA_interaction_mean[[j]][[k]] <- mean(Medium_fromYtoA_interaction[[k]][[j]][!is.infinite(Medium_fromYtoA_interaction[[k]][[j]])], na.rm = T)
    Medium_fromAtoY_interaction_mean[[j]][[k]] <- mean(Medium_fromAtoY_interaction[[k]][[j]][!is.infinite(Medium_fromAtoY_interaction[[k]][[j]])], na.rm = T)
    Medium_fromYtoA_interaction_se[[j]][[k]] <- se(Medium_fromYtoA_interaction[[k]][[j]], na.inf.rm = T)
    Medium_fromAtoY_interaction_se[[j]][[k]] <- se(Medium_fromAtoY_interaction[[k]][[j]], na.inf.rm = T)
  }

#For Large
Large_fromYtoA_interaction_mean <- c()
Large_fromAtoY_interaction_mean <- c()
Large_fromYtoA_interaction_se <- c()
Large_fromAtoY_interaction_se <- c()

for(j in 1:5){
  Large_fromYtoA_interaction_mean[[j]] <- list()
  Large_fromYtoA_interaction_se[[j]] <- list()
  Large_fromAtoY_interaction_se[[j]] <- list()

  for(k in 1:length(Large_ccmY_xmap_A_combined)) {
    Large_fromYtoA_interaction_mean[[j]][[k]] <- mean(Large_fromYtoA_interaction[[k]][[j]][!is.infinite(Large_fromYtoA_interaction[[k]][[j]])], na.rm = T)
    Large_fromAtoY_interaction_mean[[j]][[k]] <- mean(Large_fromAtoY_interaction[[k]][[j]][!is.infinite(Large_fromAtoY_interaction[[k]][[j]])], na.rm = T)
    Large_fromYtoA_interaction_se[[j]][[k]] <- se(Large_fromYtoA_interaction[[k]][[j]], na.inf.rm = T)
  }
}

#For Huge
Huge_fromAtoY_interaction_mean <- c()
Huge_fromYtoA_interaction_se <- c()
Huge_fromAtoY_interaction_se <- c()

for(j in 1:5){
  Huge_fromYtoA_interaction_mean[[j]] <- list()
  Huge_fromAtoY_interaction_mean[[j]] <- list()
  Huge_fromYtoA_interaction_se[[j]] <- list()
  Huge_fromAtoY_interaction_se[[j]] <- list()

  for(k in 1:length(Huge_ccmY_xmap_A_combined)) {
    Huge_fromYtoA_interaction_mean[[j]][[k]] <- mean(Huge_fromYtoA_interaction[[k]][[j]][!is.infinite(Huge_fromYtoA_interaction[[k]][[j]])], na.rm = T)
    Huge_fromAtoY_interaction_mean[[j]][[k]] <- mean(Huge_fromAtoY_interaction[[k]][[j]][!is.infinite(Huge_fromAtoY_interaction[[k]][[j]])], na.rm = T)
    Huge_fromAtoY_interaction_se[[j]][[k]] <- se(Huge_fromAtoY_interaction[[k]][[j]], na.inf.rm = T)
  }
}

[8.6] Regression analysis for interspecific interactions

[8.6.1] Preprocesing of the results from [8.5]

Total_interaction <- list()
Small_interaction <- list()
Medium_interaction <- list()
Large_interaction <- list()
Huge_interaction <- list()

#Small combined (S1, S2, S5, & S6)
#Medium combined (M2 to M7)
#Large combined (L1, L4 to L8) 
#Huge combined (H1, H2, H3, H6, H7, H8)
total_average_coexistence_week <- subset(Table1, (theta_for_C.m > 0 & theta_for_C.c > 0))$average_coexistence_week

#Generating dataframe for each cage size
for(j in 1:5){
  
 Small_interaction[[j]] <- data.frame(volume = rep(Smallvolume, length(Small_ccmY_xmap_A_combined)),
                                 volume_class = rep("Small", length(Small_ccmY_xmap_A_combined)),
                                 YtoA_mean = unlist(Small_fromYtoA_interaction_mean[[j]]),
                                 AtoY_mean = unlist(Small_fromAtoY_interaction_mean[[j]]),
                                 AtoY_se = unlist(Small_fromAtoY_interaction_se[[j]])
 
 Medium_interaction[[j]] <- data.frame(volume = rep(Mediumvolume, length(Medium_ccmY_xmap_A_combined)),
                                 volume_class = rep("Medium", length(Medium_ccmY_xmap_A_combined)),
                                 YtoA_mean = unlist(Medium_fromYtoA_interaction_mean[[j]]),
                                 AtoY_mean = unlist(Medium_fromAtoY_interaction_mean[[j]]),
                                 YtoA_se = unlist(Medium_fromYtoA_interaction_se[[j]]),
                                 AtoY_se = unlist(Medium_fromAtoY_interaction_se[[j]])
 )
  Large_interaction[[j]] <- data.frame(volume = rep(Largevolume, length(Large_ccmY_xmap_A_combined)),
                                 volume_class = rep("Large", length(Large_ccmY_xmap_A_combined)),
                                 YtoA_mean = unlist(Large_fromYtoA_interaction_mean[[j]]),
                                 AtoY_mean = unlist(Large_fromAtoY_interaction_mean[[j]]),
                                 YtoA_se = unlist(Large_fromYtoA_interaction_se[[j]]),
                                 AtoY_se = unlist(Large_fromAtoY_interaction_se[[j]])
  Huge_interaction[[j]] <- data.frame(volume = rep(Hugevolume, length(Huge_ccmY_xmap_A_combined)),
                                 volume_class = rep("Huge", length(Huge_ccmY_xmap_A_combined)),
                                 YtoA_mean = unlist(Huge_fromYtoA_interaction_mean[[j]]),
                                 AtoY_mean = unlist(Huge_fromAtoY_interaction_mean[[j]]),
                                 AtoY_se = unlist(Huge_fromAtoY_interaction_se[[j]])
 )
}

#Combining all cage size results
for(j in 1:5) {
  Total_interaction[[j]] <- rbind.data.frame(Small_interaction[[j]], Medium_interaction[[j]])
  Total_interaction[[j]] <- rbind.data.frame(Total_interaction[[j]], Large_interaction[[j]])
  Total_interaction[[j]] <- data.frame(coexistence_week = total_average_coexistence_week, Total_interaction[[j]])
}

[8.6.2] OLS and WLS regression for interaction strength by cage size

Effect of Y (Cm) on A (Cc)
#from tp = 0 (j = 1) to tp = -4 (j = 5)
for(j in 1:5) {
  #OLS
  cat("tp = ", 1 - j, "\n")
  print(summary(lm(YtoA_mean ~ volume, data = Total_interaction[[j]]))$coefficients)
  print(summary(lm(YtoA_mean ~ volume, data = Total_interaction[[j]]))$adj.r.squared)
}
tp =  0 
                Estimate  Std. Error   t value   Pr(>|t|)
(Intercept)  4.956516740 2.471470177  2.005493 0.05863042
volume      -0.001867062 0.001522433 -1.226368 0.23430373
[1] 0.02343647
tp =  -1 
                Estimate  Std. Error   t value   Pr(>|t|)
(Intercept)  8.488500152 4.685638659  1.811599 0.08509321
volume      -0.003556826 0.002886367 -1.232285 0.23213374
[1] 0.02409671
tp =  -2 
                 Estimate   Std. Error   t value   Pr(>|t|)
(Intercept)  3.0990408516 1.4175473480  2.186199 0.04086026
volume      -0.0009601758 0.0008732134 -1.099589 0.28457147
[1] 0.009858782
tp =  -3 
               Estimate  Std. Error   t value  Pr(>|t|)
(Intercept) 62.04503631 37.84346091  1.639518 0.1167408
volume      -0.02944008  0.02331168 -1.262889 0.2211548
[1] 0.02754771
tp =  -4 
                Estimate   Std. Error   t value   Pr(>|t|)
(Intercept)  3.299108574 1.3504268264  2.443012 0.02396969
volume      -0.001147594 0.0008318669 -1.379540 0.18295893
[1] 0.04123299
for(j in 1:5) {
  #WLS
  cat("tp = ", 1 - j, "\n")
  print(summary(lm(YtoA_mean ~ volume, weights = 1/YtoA_se, data = Total_interaction[[j]]))$coefficients)
  print(summary(lm(YtoA_mean ~ volume, weights = 1/YtoA_se, data = Total_interaction[[j]]))$adj.r.squared)
}
tp =  0 
                 Estimate   Std. Error   t value    Pr(>|t|)
(Intercept)  9.394569e-01 0.2576228569  3.646636 0.001604627
volume      -4.843997e-05 0.0001643582 -0.294722 0.771243725
[1] -0.04545952
tp =  -1 
                Estimate  Std. Error   t value  Pr(>|t|)
(Intercept) 8.674990e-01 0.353851071 2.4515935 0.0235376
volume      5.861501e-05 0.000232539 0.2520653 0.8035628
[1] -0.04667488
tp =  -2 
                Estimate   Std. Error   t value   Pr(>|t|)
(Intercept) 7.944328e-01 0.3122800624 2.5439755 0.01932516
volume      5.950965e-05 0.0001975242 0.3012777 0.76631277
[1] -0.0452562
tp =  -3 
                 Estimate   Std. Error    t value  Pr(>|t|)
(Intercept)  1.0426898814 0.6050111500  1.7234226 0.1002383
volume      -0.0002314866 0.0003547476 -0.6525388 0.5214840
[1] -0.02811116
tp =  -4 
                 Estimate  Std. Error   t value     Pr(>|t|)
(Intercept)  1.0884033754 0.279558373  3.893296 0.0009028016
volume      -0.0001672836 0.000162685 -1.028267 0.3161005535
[1] 0.002722675
Effect of A (Cc) on Y (Cm)
#from tp = 0 (j = 1) to tp = -4 (j = 5)
for(j in 1:5) {
  #OLS
  cat("tp = ", 1 - j, "\n")
  print(summary(lm(AtoY_mean ~ volume, data = Total_interaction[[j]]))$coefficients)
  print(summary(lm(AtoY_mean ~ volume, data = Total_interaction[[j]]))$adj.r.squared)
}
tp =  0 
                 Estimate   Std. Error    t value     Pr(>|t|)
(Intercept)  8.528796e-01 1.510284e-01  5.6471479 1.583017e-05
volume      -5.946242e-05 9.303393e-05 -0.6391477 5.299798e-01
[1] -0.02898253
tp =  -1 
                 Estimate   Std. Error    t value     Pr(>|t|)
(Intercept)  9.511947e-01 0.1762732625  5.3961374 2.784154e-05
volume      -5.523822e-05 0.0001085849 -0.5087102 6.165214e-01
[1] -0.03658729
tp =  -2 
                Estimate   Std. Error   t value     Pr(>|t|)
(Intercept) 8.134340e-01 0.1695187643 4.7984896 0.0001093882
volume      5.672491e-05 0.0001044241 0.5432168 0.5929839809
[1] -0.03473331
tp =  -3 
                 Estimate   Std. Error    t value   Pr(>|t|)
(Intercept)  2.2912565024 0.9593215587  2.3884134 0.02689643
volume      -0.0003962964 0.0005909449 -0.6706149 0.51013661
[1] -0.02690871
tp =  -4 
               Estimate   Std. Error  t value    Pr(>|t|)
(Intercept) 1.208008954 0.4174694407 2.893646 0.008980455
volume      0.000263145 0.0002571624 1.023264 0.318401643
[1] 0.002236346
for(j in 1:5) {
  #WLS
  cat("tp = ", 1 - j, "\n")
  print(summary(lm(AtoY_mean ~ volume, weights = 1/AtoY_se, data = Total_interaction[[j]]))$coefficients)
  print(summary(lm(AtoY_mean ~ volume, weights = 1/AtoY_se, data = Total_interaction[[j]]))$adj.r.squared)
}
tp =  0 
                Estimate   Std. Error   t value    Pr(>|t|)
(Intercept) 5.397951e-01 1.492400e-01 3.6169613 0.001719239
volume      5.806017e-05 9.540103e-05 0.6085906 0.549646249
[1] -0.03090848
tp =  -1 
                Estimate   Std. Error   t value   Pr(>|t|)
(Intercept) 0.4820636968 0.1760168864 2.7387355 0.01265596
volume      0.0000979778 0.0001143731 0.8566505 0.40178610
[1] -0.01283649
tp =  -2 
                Estimate   Std. Error  t value    Pr(>|t|)
(Intercept) 0.4987991265 0.1571672501 3.173684 0.004774312
volume      0.0001227377 0.0001029975 1.191657 0.247345226
[1] 0.01960996
tp =  -3 
               Estimate   Std. Error  t value   Pr(>|t|)
(Intercept) 0.489166765 0.2096514891 2.333238 0.03018845
volume      0.000219598 0.0001442595 1.522243 0.14360308
[1] 0.05902278
tp =  -4 
                Estimate  Std. Error   t value    Pr(>|t|)
(Intercept) 0.7330156259 0.247194431 2.9653404 0.007649225
volume      0.0001433075 0.000162822 0.8801483 0.389232774
[1] -0.01084682

[8.6.3] Visualization of OLS & WLS for interaction strength by cage size (for Fig.3 & Fig.4)

for(j in 1:5) {
  Fig3 <- ggplot(data = Total_interaction[[j]], aes(x = volume, y = YtoA_mean))
  Fig3 <- Fig3 + geom_point(size = 1 + 0.2/Total_interaction[[j]]$YtoA_se, shape = 21)
  Fig3 <- Fig3 + geom_smooth(method = 'lm', se = F, color = 'black', linetype = "dashed")
  Fig3 <- Fig3 + geom_smooth(method = 'lm', mapping = aes(weight = 1/Total_interaction[[j]]$YtoA_se), se = F, color = 'red', linetype = "dashed")
  Fig3 <- Fig3 + labs(title = paste("From Cm to Cc: tp = ", 1 - j, sep = ""), y = "Relative interaction strength", x = "Volume (cm3)")
  print(Fig3)
}


for(j in 1:5) {
  Fig4 <- ggplot(data = Total_interaction[[j]], aes(x = volume, y = AtoY_mean))
  Fig4 <- Fig4 + geom_point(size = 1 + 0.2/Total_interaction[[j]]$AtoY_se, shape = 21)
  Fig4 <- Fig4 + geom_smooth(method = 'lm', se = F, color = 'black', linetype = "dashed")
  Fig4 <- Fig4 + geom_smooth(method = 'lm', mapping = aes(weight = 1/Total_interaction[[j]]$AtoY_se), se = F, color = 'red', linetype = "dashed")
  Fig4 <- Fig4 + labs(title = paste("From Cc to Cm: tp = ", 1 - j, sep = ""), y = "Relative interaction strength", x = "Volume (cm3)")
  print(Fig4)
}

[8.6.4] Why do we have a outlier in time series from Small cages?

– This is because the optimal embedding dimention (E*) is relatively high (= 8) but the minimum library size is 8 and the maximum library size is 11. The difference between them is too short.

#For S6 CCM results
Small_ccmY_xmap_A_combined[[4]][[1]]

[8.6.5] ANOVA-type analysis for interaction strength by cage size (For Table S2)

for(j in 1:5) {
  #effect of Y (Cm) on A (Cc)
  cat("tp = ", 1 - j, "\n")
  cat("OLS\n")
  print(anova(lm(YtoA_mean ~ volume_class, data = Total_interaction[[j]])))
  cat("\n")
}
tp = 0 
OLS
Analysis of Variance Table

Response: YtoA_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 200.74  66.913  1.6069 0.2228
Residuals    18 749.55  41.642               

tp =  -1 
OLS
Analysis of Variance Table

Response: YtoA_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  718.55  239.52  1.5971  0.225
Residuals    18 2699.48  149.97               

tp =  -2 
OLS
Analysis of Variance Table

Response: YtoA_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  65.625  21.875  1.6223 0.2193
Residuals    18 242.711  13.484               

tp =  -3 
OLS
Analysis of Variance Table

Response: YtoA_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3  48231 16077.0  1.6488 0.2135
Residuals    18 175517  9750.9               

tp =  -4 
OLS
Analysis of Variance Table

Response: YtoA_mean
             Df Sum Sq Mean Sq Pr(>F)
volume_class  3  66.60  22.200  1.7969 0.1839
Residuals    18 222.38  12.355               
for(j in 1:5) {
  #effect of Y (Cm) on A (Cc)
  cat("WLS\n")
  print(anova(lm(YtoA_mean ~ volume_class, weights = 1/YtoA_se, data = Total_interaction[[j]])))
  cat("\n")
  
}
WLS
Analysis of Variance Table

Response: YtoA_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3   7.538  2.5127  0.4034 0.7523
Residuals    18 112.105  6.2281               

WLS
Analysis of Variance Table

Response: YtoA_mean
 Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3   7.346  2.4486  0.1641 0.9191
Residuals    18 268.504 14.9169               

WLS
Analysis of Variance Table

Response: YtoA_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  10.319  3.4395  0.3136 0.8153
Residuals    18 197.435 10.9686               

WLS
Analysis of Variance Table

Response: YtoA_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3  17.70   5.901  0.1603 0.9217
Residuals    18 662.69  36.816               

WLS
Analysis of Variance Table

Response: YtoA_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  12.975  4.3249  0.6923 0.5686
Residuals    18 112.454  6.2474               
for(j in 1:5) {
  #effect of A (Cc) on Y (Cm)
  cat("OLS\n")
  print(anova(lm(AtoY_mean ~ volume_class, data = Total_interaction[[j]])))
  cat("\n")
}
OLS
Analysis of Variance Table

             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3 0.50459 0.16820  1.0574 0.3916
Residuals    18 2.86328 0.15907               

OLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 0.7377 0.24590  1.1597 0.3524
Residuals    18 3.8165 0.21203               

OLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 0.4752 0.15840  0.7615 0.5303
Residuals    18 3.7442 0.20801               

OLS
Analysis of Variance Table

Response: AtoY_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  13.578  4.5261  0.6646 0.5846
Residuals    18 122.579  6.8100               

OLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  1.965 0.65499  0.4798 0.7004
Residuals    18 24.573 1.36516               
for(j in 1:5) {
  #effect of A (Cc) on Y (Cm)
  cat("WLS\n")
  print(anova(lm(AtoY_mean ~ volume_class, weights = 1/AtoY_se, data = Total_interaction[[j]])))
  cat("\n")
}
WLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3  9.116  3.0388  0.8753 0.4722
Residuals    18 62.489  3.4716               

WLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 20.940  6.9799  1.4846 0.2524
Residuals    18 84.625  4.7014               

WLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 11.746  3.9152  1.1233 0.3659
Residuals    18 62.741  3.4856               

WLS
Analysis of Variance Table

Response: AtoY_mean
             Df  Sum Sq Mean Sq F value Pr(>F)
volume_class  3  20.678  6.8925  0.9943 0.4179
Residuals    18 124.771  6.9317               

WLS
Analysis of Variance Table

Response: AtoY_mean
             Df Sum Sq Mean Sq F value Pr(>F)
volume_class  3 16.188  5.3960  1.1479 0.3567
Residuals    18 84.612  4.7007               

[8.6.7] Conclusion for regression analysis (cage size vs interaction strength)

– The regression relationship (and differences between different sizes, indicated by ANOVA) was not statistically significant.

[8.7] GLM analysis for coexistence_week ~ rho*cage size (1):individual effects (for Figs.4 & 5)

  • Why we used the Gamma distribution? – see the following review paper https://www.jstage.jst.go.jp/article/weed/55/4/55_4_268/_pdf

  • The workflow: We started with checking the individual effect of a specific interaction (Cm (Y) -> Cc (A) or Cc (A) -> Cm (Y)) for each tp (in this section) by applying stepAIC() function. Then, we included all of the statistically significant factors into a single model and selected the best model based on AIC/BIC (in the next section).

[8.7.1] The effect of Cm (Y) on Cc (A)

tp = 0, using the object Total_interaction[[1]]
#Although we know the Gamma distribution is more appropriate than gaussian, we also tried to check if there is no substantial difference between them

#GLM with Gamma
glm_YtoA_tp0 <- glm(coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, data = Total_interaction[[1]], family = Gamma(link = identity))

#Get GLM regression lines
glm_YtoA_tp0_predicted <- ggpredict(glm_YtoA_tp0, term = c("YtoA_mean","volume"))

#define linetypes & linewidth
linewidths <- c(0.5, 0.75, 1.0, 1.25)

#ggplot  
glm_YtoA_tp0_fig <- ggplot() + geom_point(data = Total_interaction[[1]], aes(x = YtoA_mean, y = coexistence_week, shape = as.factor(volume_class), size = 3), alpha = 0.5) 
glm_YtoA_tp0_fig <- glm_YtoA_tp0_fig + geom_line(data = glm_YtoA_tp0_predicted, aes(x = x, y = predicted, linewidth = group)) + scale_linewidth_manual(values = linewidths) 
plot(glm_YtoA_tp0_fig)


##With gaussian distribution
glm_YtoA_tp0g <- glm(coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, data = Total_interaction[[1]], family = gaussian(link = identity))

##Compare Gamma and gaussian
summary(glm_YtoA_tp0)

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[1]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56953  -0.24133  -0.02554   0.18817   0.65057  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      19.1487253  2.9087137   6.583 3.49e-06 ***
volume            0.0024261  0.0029965   0.810    0.429    
YtoA_mean        -0.4143180  0.4060919  -1.020    0.321    
volume:YtoA_mean  0.0004502  0.0021277   0.212    0.835    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1202773)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1771  on 18  degrees of freedom
AIC: 154.98

Number of Fisher Scoring iterations: 8
summary(glm_YtoA_tp0g)

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = gaussian(link = identity), data = Total_interaction[[1]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-10.6109   -5.1950   -0.6275    5.2976   18.8217  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      19.1900327  3.2285755   5.944 1.26e-05 ***
volume            0.0022484  0.0028646   0.785    0.443    
YtoA_mean        -0.4477818  0.4535497  -0.987    0.337    
volume:YtoA_mean  0.0006182  0.0019413   0.318    0.754    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 60.77681)

    Null deviance: 1438.1  on 21  degrees of freedom
Residual deviance: 1094.0  on 18  degrees of freedom
AIC: 158.38

Number of Fisher Scoring iterations: 2
##Confirm the best model and significant factors
summary(stepAIC(glm_YtoA_tp0))
Start:  AIC=154.98
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.1842 153.04
<none>                  2.1771 154.99

Step:  AIC=153.06
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.1842 153.06
- volume     1   2.4857 153.72
- YtoA_mean  1   2.6300 155.00

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean, family = Gamma(link = identity), 
    data = Total_interaction[[1]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56700  -0.25474  -0.02682   0.18579   0.62444  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 19.013530   2.767102   6.871 1.48e-06 ***
volume       0.002943   0.001823   1.615   0.1229    
YtoA_mean   -0.331938   0.121350  -2.735   0.0131 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1132062)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1842  on 19  degrees of freedom
AIC: 153.06

Number of Fisher Scoring iterations: 4
GLM from tp = -1 to -4, using the object Total_interaction[[2]] ~ Total_interaction[[5]]]
#Prepare objects to save results
glm_YtoA_tp <- list()
glm_YtoA_tp_predicted <- list()
glm_YtoA_tp_fig <- list()

#assign results from tp = 0
glm_YtoA_tp[[1]] <- glm_YtoA_tp0
glm_YtoA_tp_predicted[[1]] <- glm_YtoA_tp0_predicted
glm_YtoA_tp_fig[[1]] <- glm_YtoA_tp0_fig

#GLM with Gamma and getting GLM regression lines 
for(j in 2:5) {
  glm_YtoA_tp[[j]] <- glm(coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, data = Total_interaction[[j]], family = Gamma(link = identity))
  glm_YtoA_tp_predicted[[j]] <- ggpredict(glm_YtoA_tp[[j]], term = c("YtoA_mean","volume"))

}

##Checking glm results
for(j in 1:5) {
  cat("tp = ", 1 - j, "\n")
  print(summary(glm_YtoA_tp[[j]]))
}
tp =  0 

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[1]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56953  -0.24133  -0.02554   0.18817   0.65057  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      19.1487253  2.9087137   6.583 3.49e-06 ***
volume            0.0024261  0.0029965   0.810    0.429    
YtoA_mean        -0.4143180  0.4060919  -1.020    0.321    
volume:YtoA_mean  0.0004502  0.0021277   0.212    0.835    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1202773)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1771  on 18  degrees of freedom
AIC: 154.98

Number of Fisher Scoring iterations: 8

tp =  -1 

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56270  -0.25173  -0.03036   0.18338   0.62510  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      18.8269291  2.8831247   6.530 3.88e-06 ***
volume            0.0030717  0.0035599   0.863    0.400    
YtoA_mean        -0.1538509  0.4839894  -0.318    0.754    
volume:YtoA_mean -0.0001205  0.0026681  -0.045    0.964    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1187723)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1718  on 18  degrees of freedom
AIC: 154.93

Number of Fisher Scoring iterations: 7

tp =  -2 

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56753  -0.27702  -0.01154   0.22011   0.61204  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      19.0546231  2.9806117   6.393 5.09e-06 ***
volume            0.0036129  0.0032318   1.118    0.278    
YtoA_mean        -0.4831568  0.4590060  -1.053    0.306    
volume:YtoA_mean -0.0005512  0.0021267  -0.259    0.798    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1187819)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1650  on 18  degrees of freedom
AIC: 154.86

Number of Fisher Scoring iterations: 6

tp =  -3 

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56743  -0.26607  -0.05633   0.22742   0.61632  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      18.713520   2.776101   6.741 2.56e-06 ***
volume            0.003616   0.002644   1.368    0.188    
YtoA_mean         0.171660   0.492285   0.349    0.731    
volume:YtoA_mean -0.001084   0.002761  -0.393    0.699    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1193296)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1659  on 18  degrees of freedom
AIC: 154.87

Number of Fisher Scoring iterations: 4

tp =  -4 

Call:
glm(formula = coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.57584  -0.23760  -0.02773   0.18441   0.68569  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      19.556062   3.013417   6.490  4.2e-06 ***
volume            0.001660   0.003033   0.547    0.591    
YtoA_mean        -0.846160   0.542587  -1.559    0.136    
volume:YtoA_mean  0.001356   0.002692   0.504    0.621    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.122981)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.1864  on 18  degrees of freedom
AIC: 155.08

Number of Fisher Scoring iterations: 9
GLM with stepAIC
##Confirm the best model and significant factors
for(j in 1:5) {
  cat("tp = ", 1 - j, "\n")
  print(summary(stepAIC(glm_YtoA_tp[[j]]))$coefficients)
  cat("\n")
}
tp =  0 
Start:  AIC=154.98
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.1842 153.04
<none>                  2.1771 154.99

Step:  AIC=153.06
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.1842 153.06
- volume     1   2.4857 153.72
- YtoA_mean  1   2.6300 155.00
                Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 19.013529677 2.767101953  6.871279 1.483905e-06
volume       0.002943276 0.001822849  1.614657 1.228696e-01
YtoA_mean   -0.331938169 0.121350031 -2.735378 1.314486e-02

tp =  -1 
Start:  AIC=154.93
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.1721 152.93
<none>                  2.1718 154.93

Step:  AIC=152.93
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.1721 152.93
- volume     1   2.4699 153.57
- YtoA_mean  1   2.6300 154.99
                Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 18.868489371 2.725136529  6.923869 1.335421e-06
volume       0.002927838 0.001820163  1.608558 1.242032e-01
YtoA_mean   -0.175652588 0.063553574 -2.763851 1.235798e-02

tp =  -2 
Start:  AIC=154.86
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.1735 152.93
<none>                  2.1650 154.86

Step:  AIC=152.95
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.1735 152.95
- volume     1   2.4822 153.68
- YtoA_mean  1   2.6300 154.99
                Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 19.222023454 2.806067088  6.850165 1.548227e-06
volume       0.002968237 0.001809226  1.640611 1.173288e-01
YtoA_mean   -0.586320536 0.212239304 -2.762545 1.239307e-02

tp =  -3 
Start:  AIC=154.87
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.1837 153.02
<none>                  2.1659 154.87

Step:  AIC=153.05
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.1837 153.05
- volume     1   2.4767 153.63
- YtoA_mean  1   2.6300 154.98
                Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 18.724736327 2.700453036  6.933924 1.308828e-06
volume       0.002914395 0.001828742  1.593661 1.275120e-01
YtoA_mean   -0.021647919 0.007910371 -2.736650 1.310870e-02

tp =  -4 
Start:  AIC=155.08
coexistence_week ~ volume + YtoA_mean + volume:YtoA_mean

                   Df Deviance    AIC
- volume:YtoA_mean  1   2.2300 153.44
<none>                  2.1864 155.08

Step:  AIC=153.52
coexistence_week ~ volume + YtoA_mean

            Df Deviance    AIC
<none>           2.2300 153.52
- volume     1   2.5178 154.02
- YtoA_mean  1   2.6300 154.99
                Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 19.331803605 2.880271831  6.711798 2.047614e-06
volume       0.002895789 0.001852905  1.562837 1.345936e-01
YtoA_mean   -0.598473622 0.228182515 -2.622785 1.674965e-02
GLM conclusions (for the effect of Cm (Y) on Cc (A))

– No statistically significant interactions of cage size and interaction strength

– for all tp, the interaction strength (YtoA_mean) has negative relationship with coexistence

– for all tp, the volume was not statistically significant

GLM Visualization (Fig.5)
#define linetypes & linewidth
linetypes <- c("dashed", "dotted", "dotdash", "longdash")

#ggplot  
for(j in 1:5) {
  glm_YtoA_tp_fig[[j]] <- ggplot() + geom_point(data = Total_interaction[[j]], aes(x = YtoA_mean, y = coexistence_week, shape = as.factor(volume_class), size = 3), alpha = 0.5) 
  glm_YtoA_tp_fig[[j]] <- glm_YtoA_tp_fig[[j]] + geom_line(data = glm_YtoA_tp_predicted[[j]], aes(x = x, y = predicted, linetype = group)) + scale_linetype_manual(values = linetypes) 
  glm_YtoA_tp_fig[[j]] <- glm_YtoA_tp_fig[[j]] + geom_smooth(data = Total_interaction[[j]], aes(x = YtoA_mean, y = coexistence_week), method = 'glm', method.args = list(family = Gamma(link = identity)), se = F, color = 'black')
}

#plot all
for(j in 1:5) {
  glm_YtoA_tp_fig[[j]] <- glm_YtoA_tp_fig[[j]] + ggtitle(paste("Effect of Y (Cm) on A (Cc), tp = ", 1 - j, sep = ""))
  plot(glm_YtoA_tp_fig[[j]])
}


#plot again for tp = -3 for narrower y axis
glm_YtoA_tp_fig[[4]] <- glm_YtoA_tp_fig[[4]] + ylim(c(0, NA))
plot(glm_YtoA_tp_fig[[4]])


#plot again for tp = -4 for narrower y axis
glm_YtoA_tp_fig[[5]] <- glm_YtoA_tp_fig[[5]] + ylim(c(0, 50))
plot(glm_YtoA_tp_fig[[5]])

[8.7.2] The effect of Cc (A) on Cm (Y)

GLM from tp = 0 to -4
#Prepare objects to save results
glm_AtoY_tp <- list()
glm_AtoY_tp_predicted <- list()
glm_AtoY_tp_fig <- list()

#GLM with Gamma * getting GLM regression lines 
for(j in 1:5) {
  glm_AtoY_tp[[j]] <- glm(coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, data = Total_interaction[[j]], family = Gamma(link = identity))
  glm_AtoY_tp_predicted[[j]] <- ggpredict(glm_AtoY_tp[[j]], term = c("AtoY_mean","volume"))

}

##Checking glm results
for(j in 1:5) {
  cat("tp = ", 1 - j, "\n")
  print(summary(glm_AtoY_tp[[j]]))
}
tp =  0 

Call:
glm(formula = coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.48332  -0.22948  -0.08491   0.16138   0.64320  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)       6.963321   3.610635   1.929   0.0697 .
volume            0.009841   0.004156   2.368   0.0293 *
AtoY_mean        11.453596   4.651596   2.462   0.0241 *
volume:AtoY_mean -0.006891   0.005098  -1.352   0.1932  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1204898)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.0584  on 18  degrees of freedom
AIC: 153.73

Number of Fisher Scoring iterations: 6

tp =  -1 

Call:
glm(formula = coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.53760  -0.18667  -0.03739   0.08615   0.75734  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)       7.039627   3.187765   2.208   0.0404 *
volume            0.007681   0.003606   2.130   0.0472 *
AtoY_mean        10.029670   3.725952   2.692   0.0149 *
volume:AtoY_mean -0.003494   0.004002  -0.873   0.3941  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1131852)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 1.8382  on 18  degrees of freedom
AIC: 151.21

Number of Fisher Scoring iterations: 6

tp =  -2 

Call:
glm(formula = coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.51990  -0.22059  -0.00403   0.10655   0.71976  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)       6.790505   3.295742   2.060   0.0541 .
volume            0.008559   0.003386   2.528   0.0211 *
AtoY_mean        11.319107   4.208559   2.690   0.0150 *
volume:AtoY_mean -0.004951   0.003324  -1.489   0.1537  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.11513)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 1.9266  on 18  degrees of freedom
AIC: 152.25

Number of Fisher Scoring iterations: 9

tp =  -3 

Call:
glm(formula = coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.62348  -0.26013  -0.04892   0.17585   0.61966  

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)   
(Intercept)       1.121e+01  3.034e+00   3.696  0.00165 **
volume            4.570e-03  3.001e-03   1.523  0.14517   
AtoY_mean         3.059e+00  1.762e+00   1.736  0.09973 . 
volume:AtoY_mean -6.568e-06  1.978e-03  -0.003  0.99739   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1116182)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.0209  on 18  degrees of freedom
AIC: 153.32

Number of Fisher Scoring iterations: 22

tp =  -4 

Call:
glm(formula = coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean, 
    family = Gamma(link = identity), data = Total_interaction[[j]])

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.54459  -0.33084  -0.04793   0.26828   0.59890  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)       9.906263   4.466563   2.218   0.0397 *
volume            0.008610   0.003550   2.425   0.0260 *
AtoY_mean         5.403578   3.488728   1.549   0.1388  
volume:AtoY_mean -0.003289   0.002127  -1.546   0.1395  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1342207)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 2.3987  on 18  degrees of freedom
AIC: 157.15

Number of Fisher Scoring iterations: 10
GLM with stepAIC
##Confirm the best model and significant factors
for(j in 1:5) {
  cat("tp = ", 1 - j, "\n")
  print(summary(stepAIC(glm_AtoY_tp[[j]]))$coefficients) 
  cat("\n")
}
tp =  0 
Start:  AIC=153.73
coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean

                   Df Deviance    AIC
- volume:AtoY_mean  1   2.2895 153.65
<none>                  2.0584 153.73

Step:  AIC=154.11
coexistence_week ~ volume + AtoY_mean

                Estimate  Std. Error  t value    Pr(>|t|)
(Intercept) 10.570563492 3.665854102 2.883520 0.009516926
volume       0.004896986 0.001886922 2.595224 0.017765295
AtoY_mean    6.676695608 3.965930505 1.683513 0.108634858

tp =  -1 
Start:  AIC=151.21
coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean

                   Df Deviance    AIC
- volume:AtoY_mean  1   1.9308 150.02
<none>                  1.8382 151.21

Step:  AIC=150.3
coexistence_week ~ volume + AtoY_mean

            Df Deviance    AIC
<none>           1.9308 150.30
- AtoY_mean  1   2.6300 154.12
- volume     1   2.7761 155.34
               Estimate Std. Error  t value    Pr(>|t|)
(Intercept) 8.823516067 2.97971854 2.961191 0.008021308
volume      0.004994063 0.00175177 2.850866 0.010222869
AtoY_mean   7.724096295 3.00029654 2.574444 0.018569295

tp =  -2 
Start:  AIC=152.25
coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean

                   Df Deviance    AIC
<none>                  1.9266 152.25
- volume:AtoY_mean  1   2.1990 152.62
                     Estimate  Std. Error   t value   Pr(>|t|)
(Intercept)       6.790505430 3.295742353  2.060387 0.05411742
volume            0.008559064 0.003386359  2.527512 0.02106609
AtoY_mean        11.319107188 4.208558974  2.689545 0.01498047
volume:AtoY_mean -0.004951192 0.003324305 -1.489392 0.15369740

tp =  -3 
Start:  AIC=153.32
coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean

                   Df Deviance    AIC
- volume:AtoY_mean  1   2.0209 151.32
<none>                  2.0209 153.32

Step:  AIC=151.32
coexistence_week ~ volume + AtoY_mean

            Df Deviance    AIC
<none>           2.0209 151.32
- AtoY_mean  1   2.6300 155.08
- volume     1   2.8015 156.70
                Estimate  Std. Error  t value     Pr(>|t|)
(Intercept) 11.220754735 2.450685303 4.578619 0.0002051581
volume       0.004561095 0.001615429 2.823457 0.0108540142
AtoY_mean    3.052954403 1.156210339 2.640484 0.0161266887

tp =  -4 
Start:  AIC=157.15
coexistence_week ~ volume + AtoY_mean + volume:AtoY_mean

                   Df Deviance    AIC
- volume:AtoY_mean  1   2.6292 156.87
<none>                  2.3987 157.15

Step:  AIC=157.21
coexistence_week ~ volume + AtoY_mean

                Estimate  Std. Error    t value     Pr(>|t|)
(Intercept) 17.032196529 3.255919795 5.23114745 4.756549e-05
volume       0.003653972 0.001960856 1.86345754 7.792917e-02
AtoY_mean    0.145022180 1.673824307 0.08664122 9.318633e-01
GLM conclusions (for the effect of Cc (A) on Cm (Y))

– No statistically significant interactions of cage size and interaction strength

– tp = 0 & -4: interaction strength was not significant

– tp = -1, -2, & -3: interaction strength was statistically significant with positive slope

– for all tp (except for tp = -4), the volume was statistically significant with positive slope

GLM Visulization (Fig.6)
#define linetypes & linewidth
linetypes <- c("dashed", "dotted", "dotdash", "longdash")

#ggplot  
for(j in 1:5) {
  glm_AtoY_tp_fig[[j]] <- ggplot() + geom_point(data = Total_interaction[[j]], aes(x = AtoY_mean, y = coexistence_week, shape = as.factor(volume_class), size = 3), alpha = 0.5) 
  glm_AtoY_tp_fig[[j]] <- glm_AtoY_tp_fig[[j]] + geom_line(data = glm_AtoY_tp_predicted[[j]], aes(x = x, y = predicted, linetype = group)) + scale_linetype_manual(values = linetypes) 
}
#adding the overall slopes
glm_AtoY_tp_fig[[1]] <- glm_AtoY_tp_fig[[1]] + geom_smooth(data = Total_interaction[[j]], aes(x = AtoY_mean, y = coexistence_week), method = 'glm', method.args = list(family = Gamma(link = identity)), se = F, color = 'black', linetype = "dashed")
glm_AtoY_tp_fig[[5]] <- glm_AtoY_tp_fig[[5]] + geom_smooth(data = Total_interaction[[j]], aes(x = AtoY_mean, y = coexistence_week), method = 'glm', method.args = list(family = Gamma(link = identity)), se = F, color = 'black', linetype = "dashed")
for(j in 2:4) {
  glm_AtoY_tp_fig[[j]] <- glm_AtoY_tp_fig[[j]] + geom_smooth(data = Total_interaction[[j]], aes(x = AtoY_mean, y = coexistence_week), method = 'glm', method.args = list(family = Gamma(link = identity)), se = F, color = 'black')
}

#plot all
for(j in 1:5) {
  glm_AtoY_tp_fig[[j]] <- glm_AtoY_tp_fig[[j]] + ggtitle(paste("Effect of A (Cc) on Y (Cm), tp = ", 1 - j, sep = ""))
  plot(glm_AtoY_tp_fig[[j]])
}

[8.7.3] Conclusions from each tp

– For the effect from Y to A: there was negative effect for all tp.

– For the effect from A to Y: tp = 0 & -4: interaction strength from A to Y was not significan, while tp = -1, -2, & -3: interaction strength from A to Y was statistically significant with positive slope.

– for all tp (except for tp = -4), the volume was statistically significant with positive slope.

[8.8] Model selection

[8.8.0] Preparing dataframe

selected_data_all <- data.frame(coweek = Total_interaction[[1]]$coexistence_week, volume = Total_interaction[[1]]$volume, fromYtoA_tp0 = Total_interaction[[1]]$YtoA_mean, fromYtoA_tp1 = Total_interaction[[2]]$YtoA_mean, fromYtoA_tp2 = Total_interaction[[3]]$YtoA_mean, fromYtoA_tp3 = Total_interaction[[4]]$YtoA_mean, fromYtoA_tp4 = Total_interaction[[5]]$YtoA_mean, fromAtoY_tp0 = Total_interaction[[1]]$AtoY_mean, fromAtoY_tp1 = Total_interaction[[2]]$AtoY_mean, fromAtoY_tp2 = Total_interaction[[3]]$AtoY_mean, fromAtoY_tp3 = Total_interaction[[4]]$AtoY_mean, fromAtoY_tp4 = Total_interaction[[5]]$AtoY_mean)

[8.8.1] Multi-step way, starting from the full model that included the significant factors from each tp’s stepwise regression (plus one interactive term only)

initial_model <- glm(coweek ~ volume, data = selected_data_all, family = Gamma(link = identity))
selected_model <- stepAIC(initial_model, direction = "both", scope = list(lower = ~ 1, upper = ~ volume + fromYtoA_tp0 + fromYtoA_tp1 + fromYtoA_tp2 + fromYtoA_tp3 + fromYtoA_tp4 + fromAtoY_tp1 + fromAtoY_tp2 + fromAtoY_tp3))
Start:  AIC=155.22
coweek ~ volume

               Df Deviance    AIC
+ fromAtoY_tp1  1   1.9308 151.79
+ fromAtoY_tp3  1   2.0209 152.49
+ fromYtoA_tp1  1   2.1721 153.67
+ fromYtoA_tp2  1   2.1735 153.68
+ fromYtoA_tp3  1   2.1837 153.76
+ fromYtoA_tp0  1   2.1842 153.76
+ fromAtoY_tp2  1   2.1990 153.88
+ fromYtoA_tp4  1   2.2300 154.12
<none>              2.6300 155.22
- volume        1   3.1418 157.19

Step:  AIC=150.3
coweek ~ volume + fromAtoY_tp1

               Df Deviance    AIC
+ fromAtoY_tp3  1   1.5537 149.16
<none>              1.9308 150.30
+ fromAtoY_tp2  1   1.8425 151.57
+ fromYtoA_tp0  1   1.8728 151.82
+ fromYtoA_tp2  1   1.8733 151.82
+ fromYtoA_tp1  1   1.8761 151.85
+ fromYtoA_tp3  1   1.8818 151.89
+ fromYtoA_tp4  1   1.8843 151.91
- fromAtoY_tp1  1   2.6300 154.12
- volume        1   2.7761 155.34

Step:  AIC=147.46
coweek ~ volume + fromAtoY_tp1 + fromAtoY_tp3

               Df Deviance    AIC
<none>              1.5537 147.46
+ fromAtoY_tp2  1   1.5237 149.16
- fromAtoY_tp3  1   1.9308 149.18
+ fromYtoA_tp2  1   1.5474 149.40
+ fromYtoA_tp4  1   1.5489 149.41
+ fromYtoA_tp0  1   1.5495 149.42
+ fromYtoA_tp1  1   1.5501 149.42
+ fromYtoA_tp3  1   1.5513 149.44
- fromAtoY_tp1  1   2.0209 150.07
- volume        1   2.5149 154.94
full_model <- glm(coweek ~ volume + fromYtoA_tp0 + fromYtoA_tp1 + fromYtoA_tp2 + fromYtoA_tp3 + fromYtoA_tp4 + fromAtoY_tp1 + fromAtoY_tp2 + fromAtoY_tp3, data = selected_data_all, family = Gamma(link = identity))

summary(full_model)$coefficients
                 Estimate  Std. Error     t value   Pr(>|t|)
(Intercept)  13.270319682 6.803034136  1.95064723 0.07484329
volume        0.005628476 0.002240214  2.51247296 0.02728368
fromYtoA_tp0  1.903466285 7.712847793  0.24679163 0.80924089
fromYtoA_tp1 -3.606477068 5.719661012 -0.63054035 0.54016374
fromYtoA_tp2 -3.428055623 5.239472859 -0.65427491 0.52527601
fromYtoA_tp3  0.439453895 0.476246352  0.92274491 0.37432115
fromYtoA_tp4  0.172362236 7.428915983  0.02320153 0.98187086
fromAtoY_tp1 10.147933294 9.144140193  1.10977447 0.28884058
fromAtoY_tp2 -5.458304483 9.045245319 -0.60344460 0.55744738
fromAtoY_tp3  1.178939026 1.096043760  1.07563135 0.30324330
summary(selected_model)$coefficients
                Estimate  Std. Error  t value    Pr(>|t|)
(Intercept)  7.668590059 2.534802765 3.025320 0.007273366
volume       0.005097605 0.001565156 3.256930 0.004378047
fromAtoY_tp1 6.142044968 2.786337749 2.204343 0.040754197
fromAtoY_tp3 1.359815404 0.847675698 1.604169 0.126078459

[8.8.2] model selection from all combinations

model02 <- glm(coweek~ volume + fromYtoA_tp0 + fromYtoA_tp1 + fromYtoA_tp2 + fromYtoA_tp3 + fromYtoA_tp4 + fromAtoY_tp1 + fromAtoY_tp2 + fromAtoY_tp3, data = selected_data_all, family = Gamma(link = identity), na.action = "na.fail")
dd2 <- dredge(model02, rank = "AIC")
Fixed term is "(Intercept)"
top.models <- get.models(dd2, cumsum(weight) <= .95)

#topmost model:
summary(top.models[[1]])

Call:
glm(formula = coweek ~ fromAtoY_tp1 + fromAtoY_tp3 + volume + 
    1, family = Gamma(link = identity), data = selected_data_all, 
    na.action = "na.fail")

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.56013  -0.15749  -0.00414   0.07185   0.80370  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept)  7.668590   2.534803   3.025  0.00727 **
fromAtoY_tp1 6.142045   2.786338   2.204  0.04075 * 
fromAtoY_tp3 1.359815   0.847676   1.604  0.12608   
volume       0.005098   0.001565   3.257  0.00438 **
(Dispersion parameter for Gamma family taken to be 0.1014021)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 1.5537  on 18  degrees of freedom
AIC: 147.46

Number of Fisher Scoring iterations: 7
model03 <- glm(coweek~ volume + fromYtoA_tp0 + fromYtoA_tp1 + fromYtoA_tp2 + fromYtoA_tp3 + fromYtoA_tp4 + fromAtoY_tp0 + fromAtoY_tp1 + fromAtoY_tp2 + fromAtoY_tp3 + fromAtoY_tp4 + fromAtoY_tp2:volume, data = selected_data_all, family = Gamma(link = identity), na.action = "na.fail")
dd3 <- dredge(model03, rank = "AIC")
Fixed term is "(Intercept)"
top.models <- get.models(dd3, cumsum(weight) <= .95)

#topmost model:
summary(top.models[[1]])

Call:
glm(formula = coweek ~ fromAtoY_tp0 + fromAtoY_tp1 + fromAtoY_tp3 + 
    fromYtoA_tp2 + fromYtoA_tp3 + volume + 1, family = Gamma(link = identity), 
    data = selected_data_all, na.action = "na.fail")

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.38254  -0.16539  -0.02881   0.11844   0.62597  

Coefficients:
               Estimate Std. Error t value Pr(>|t|)   
(Intercept)   15.291575   4.678264   3.269  0.00518 **
fromAtoY_tp0 -20.673901   9.452274  -2.187  0.04498 * 
fromAtoY_tp1  22.629879   7.997786   2.830  0.01268 * 
fromAtoY_tp3   1.059965   0.697067   1.521  0.14916   
fromYtoA_tp2  -5.091734   2.788474  -1.826  0.08782 . 
fromYtoA_tp3   0.183203   0.103253   1.774  0.09631 . 
volume         0.004647   0.001623   2.863  0.01186 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.07830766)

    Null deviance: 3.1418  on 21  degrees of freedom
Residual deviance: 1.0493  on 15  degrees of freedom
AIC: 144.74

Number of Fisher Scoring iterations: 8

[8.9] Relative interaction strength, evaluated by CCM with the common library length

– When all replicates were combined for each cage size, the minimum of the maximum library length of CCM’s results are 106. Examples from the small cage only.

[8.9.1] CCM with the minimum library length and the common maximum library length (min of max)

Small_Y_xmap_A_supp <- list()
Small_A_xmap_Y_supp <- list()
Small_Y_xmap_Y_supp <- list()
Small_A_xmap_A_supp <- list()


min_max_lib_length <- min(max(Small_lagA_xmap_Y[[1]]$lib_size), max(Small_lagY_xmap_A[[1]]$lib_size))

#not showing warning 

Small_Y_xmap_A_supp <- lapply(0:-4, function(i) ccm(Small_YA_allcombined, E = Small_optE_Y, lib_column = "Small_Y", target_column = "Small_A", lib_sizes = seq(Small_optE_Y, min_max_lib_length, length = 2), num_samples = 100, replace = F, tp = i, RNGseed = 1234))

Small_A_xmap_Y_supp <- lapply(0:-4, function(i) ccm(Small_YA_allcombined, E = Small_optE_A, lib_column = "Small_A", target_column = "Small_Y", lib_sizes = seq(Small_optE_A, min_max_lib_length, length = 2), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


Small_Y_xmap_Y_supp <- lapply(0:-4, function(i) ccm(Small_YA_allcombined, E = Small_optE_Y, lib_column = "Small_Y", target_column = "Small_Y", lib_sizes = seq(Small_optE_Y, min_max_lib_length, length = 2), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


Small_A_xmap_A_supp <- lapply(0:-4, function(i) ccm(Small_YA_allcombined, E = Small_optE_A, lib_column = "Small_A", target_column = "Small_A", lib_sizes = seq(Small_optE_A, min_max_lib_length, length = 2), num_samples = 100, replace = F, tp = i, RNGseed = 1234))


#example
Small_A_xmap_Y_supp[[2]]
NA

[8.9.2] Calculating interaction strength

Small_Y_xmap_A_interaction_supp <- list()
Small_Y_xmap_Y_interaction_supp <- list()
Small_A_xmap_Y_interaction_supp <- list()
Small_A_xmap_A_interaction_supp <- list()
Small_fromYtoA_interaction_supp <- list()
Small_fromAtoY_interaction_supp <- list()

for(j in 1:5) {
  Small_Y_xmap_A_interaction_supp[[j]] <- subset(Small_Y_xmap_A_supp[[j]]$rho,  Small_Y_xmap_A_supp[[j]]$lib_size == max(Small_Y_xmap_A_supp[[j]]$lib_size)) - subset(Small_Y_xmap_A_supp[[j]]$rho, Small_Y_xmap_A_supp[[j]]$lib_size == min(Small_Y_xmap_A_supp[[j]]$lib_size))
  Small_A_xmap_Y_interaction_supp[[j]] <- subset(Small_A_xmap_Y_supp[[j]]$rho,  Small_A_xmap_Y_supp[[j]]$lib_size == max(Small_A_xmap_Y_supp[[j]]$lib_size)) - subset(Small_A_xmap_Y_supp[[j]]$rho, Small_A_xmap_Y_supp[[j]]$lib_size == min(Small_A_xmap_Y_supp[[j]]$lib_size))
  Small_Y_xmap_Y_interaction_supp[[j]] <- subset(Small_Y_xmap_Y_supp[[j]]$rho,  Small_Y_xmap_Y_supp[[j]]$lib_size == max(Small_Y_xmap_Y_supp[[j]]$lib_size)) - subset(Small_Y_xmap_Y_supp[[j]]$rho, Small_Y_xmap_Y_supp[[j]]$lib_size == min(Small_Y_xmap_Y_supp[[j]]$lib_size))
  Small_A_xmap_A_interaction_supp[[j]] <- subset(Small_A_xmap_A_supp[[j]]$rho,  Small_A_xmap_A_supp[[j]]$lib_size == max(Small_A_xmap_A_supp[[j]]$lib_size)) - subset(Small_A_xmap_A_supp[[j]]$rho, Small_A_xmap_A_supp[[j]]$lib_size == min(Small_A_xmap_A_supp[[j]]$lib_size))
  
#convert negative values into zero
  Small_Y_xmap_A_interaction_supp[[j]][Small_Y_xmap_A_interaction_supp[[j]] < 0] <- 0
  Small_A_xmap_Y_interaction_supp[[j]][Small_A_xmap_Y_interaction_supp[[j]] < 0] <- 0
  Small_Y_xmap_Y_interaction_supp[[j]][Small_Y_xmap_Y_interaction_supp[[j]] < 0] <- 0
  Small_A_xmap_A_interaction_supp[[j]][Small_A_xmap_A_interaction_supp[[j]] < 0] <- 0
  
#Standardizing intraspecific effect
  Small_fromYtoA_interaction_supp[[j]] <- Small_A_xmap_Y_interaction_supp[[j]]/Small_Y_xmap_Y_interaction_supp[[j]]
  Small_fromAtoY_interaction_supp[[j]] <- Small_Y_xmap_A_interaction_supp[[j]]/Small_A_xmap_A_interaction_supp[[j]]
  
}

[8.9.3] Visualization of interaction strength (For Fig.S1)

small_interaction_supp <- data.frame(tp = c(rep(0, 100), rep(-1, 100), rep(-2, 100), rep(-3, 100), rep(-4, 100)), fromYtoA = unlist(Small_fromYtoA_interaction_supp), fromAtoY = unlist(Small_fromAtoY_interaction_supp))

boxplot(
  fromYtoA ~ tp, data = small_interaction_supp,
  outline = TRUE,
  main = "from Cm (Y) to Cc (A)"
)


boxplot(
  fromAtoY ~ tp, data = small_interaction_supp,
  outline = TRUE,
  main = "from Cc (A) to Cm (Y)"
)

[9] Additional analysis for revision

[9.1] Relationship between cage size and nonlinear properties (For Fig.S5)

volume_combined <- c(rep(Smallvolume, 6), rep(Mediumvolume, 7), rep(Largevolume, 8), rep(Hugevolume, 8))
forFigS5_data <- data.frame(volume = volume_combined, Table1)

#GLM with Poisson for FigS5a
summary(glm(E_for_C.m ~ volume, data = forFigS5_data, family = poisson(link = "log")))

Call:
glm(formula = E_for_C.m ~ volume, family = poisson(link = "log"), 
    data = forFigS5_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5403  -0.6068  -0.1918   0.5749   1.3519  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  1.876e+00  1.264e-01  14.838   <2e-16 ***
volume      -1.310e-05  7.802e-05  -0.168    0.867    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 19.365  on 28  degrees of freedom
Residual deviance: 19.337  on 27  degrees of freedom
AIC: 129.82

Number of Fisher Scoring iterations: 4
#GLM with Poisson for FigS5b
summary(glm(E_for_C.c ~ volume, data = forFigS5_data, family = poisson(link = "log")))

Call:
glm(formula = E_for_C.c ~ volume, family = poisson(link = "log"), 
    data = forFigS5_data)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-2.71888  -0.77883   0.01921   0.74371   1.49328  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) 1.779e+00  1.302e-01  13.664   <2e-16 ***
volume      6.244e-05  7.767e-05   0.804    0.421    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 32.855  on 28  degrees of freedom
Residual deviance: 32.209  on 27  degrees of freedom
AIC: 141.34

Number of Fisher Scoring iterations: 4
#GLM with Poisson for FigS5c
summary(glm(delta.rho_for_C.m ~ volume, data = forFigS5_data, family = gaussian))

Call:
glm(formula = delta.rho_for_C.m ~ volume, family = gaussian, 
    data = forFigS5_data)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.13638  -0.06703  -0.01951   0.02439   0.42466  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.408e-01  3.417e-02   4.121 0.000321 ***
volume      -2.479e-05  2.096e-05  -1.183 0.247278    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.01126655)

    Null deviance: 0.31995  on 28  degrees of freedom
Residual deviance: 0.30420  on 27  degrees of freedom
AIC: -43.865

Number of Fisher Scoring iterations: 2
#GLM with Poisson for FigS5d
summary(glm(delta.rho_for_C.c ~ volume, data = forFigS5_data, family = gaussian))

Call:
glm(formula = delta.rho_for_C.c ~ volume, family = gaussian, 
    data = forFigS5_data)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.19262  -0.10579  -0.02556   0.04322   0.51840  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.029e-01  5.046e-02   4.021 0.000418 ***
volume      -5.770e-05  3.096e-05  -1.864 0.073260 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.02457561)

    Null deviance: 0.74891  on 28  degrees of freedom
Residual deviance: 0.66354  on 27  degrees of freedom
AIC: -21.248

Number of Fisher Scoring iterations: 2
#GLM with Poisson for FigS5e
summary(glm(theta_for_C.m ~ volume, data = forFigS5_data, family = gaussian))

Call:
glm(formula = theta_for_C.m ~ volume, family = gaussian, data = forFigS5_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5220  -1.3332  -0.4412   0.6668   5.6980  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 2.2854572  0.6515364   3.508   0.0016 **
volume      0.0000925  0.0003997   0.231   0.8187   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 4.096701)

    Null deviance: 110.83  on 28  degrees of freedom
Residual deviance: 110.61  on 27  degrees of freedom
AIC: 127.12

Number of Fisher Scoring iterations: 2
#GLM with Poisson for FigS5f
summary(glm(theta_for_C.c ~ volume, data = forFigS5_data, family = gaussian))

Call:
glm(formula = theta_for_C.c ~ volume, family = gaussian, data = forFigS5_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.3617  -2.1961  -0.3617   1.0539   5.1227  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 2.8409920  0.9154855   3.103  0.00445 **
volume      0.0002036  0.0005616   0.362  0.71980   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 8.088349)

    Null deviance: 219.45  on 28  degrees of freedom
Residual deviance: 218.39  on 27  degrees of freedom
AIC: 146.85

Number of Fisher Scoring iterations: 2
#Simple plot with GLM line for FigS5a
FigS5a <- ggplot(data = forFigS5_data, aes(x = volume, y= E_for_C.m))
FigS5a <- FigS5a + geom_point(size = 3, shape = 21)
FigS5a <- FigS5a + geom_smooth(method = 'glm', method.args = list(family = 'poisson'), se = T, color = 'black', linetype = "dashed")
FigS5a <- FigS5a + labs(y = "E*", x = "Volume (cm3)") + ggtitle("Fig. S5a C.m")

#Simple plot with GLM line for FigS5b
FigS5b <- ggplot(data = forFigS5_data, aes(x = volume, y= E_for_C.c))
FigS5b <- FigS5b + geom_point(size = 3, shape = 21)
FigS5b <- FigS5b + geom_smooth(method = 'glm', method.args = list(family = 'poisson'), se = T, color = 'black', linetype = "dashed")

#Simple plot with GLM line for FigS5c
FigS5c <- ggplot(data = forFigS5_data, aes(x = volume, y= delta.rho_for_C.m))
FigS5c <- FigS5c + geom_smooth(method = 'lm', se = T, color = 'black', linetype = "dashed")
FigS5c <- FigS5c + labs(y = "delta-rho", x = "Volume (cm3)") + ggtitle("Fig. S5c C.m")

#Simple plot with GLM line for FigS5d
FigS5d <- ggplot(data = forFigS5_data, aes(x = volume, y= delta.rho_for_C.c))
FigS5d <- FigS5d + geom_smooth(method = 'lm', se = T, color = 'black', linetype = "dashed")

#Simple plot with GLM line for FigS5e
FigS5e <- ggplot(data = forFigS5_data, aes(x = volume, y= theta_for_C.m))
FigS5e <- FigS5e + geom_point(size = 3, shape = 21)
FigS5e <- FigS5e + geom_smooth(method = 'lm', se = T, color = 'black', linetype = "dashed")
FigS5e <- FigS5e + labs(y = "theta*", x = "Volume (cm3)") + ggtitle("Fig. S5e C.m")

#Simple plot with GLM line for FigS5f
FigS5f <- FigS5f + geom_point(size = 3, shape = 21)
FigS5f <- FigS5f + geom_smooth(method = 'lm', se = T, color = 'black', linetype = "dashed")
FigS5f <- FigS5f + labs(y = "theta*", x = "Volume (cm3)") + ggtitle("Fig. S5f C.c")

print(FigS5a)

print(FigS5b)

print(FigS5c)

print(FigS5d)

print(FigS5e)

print(FigS5f)

[9.2] Time series plot for huge cages (For Fig.S6)

#Data summary
Huge_rep <- list()
for(i in 1:length(Huge)){
  Huge_rep[[i]] <- data.frame("Time_step" = c(1:length(Huge[[i]]$YotsumonTotalL)),
                          "Population_size_C.m" = Huge[[i]]$YotsumonTotalL,
                          "Population_size_C.c" = Huge[[i]]$AzukiTotalL
                          )
}
#Graphics 
FigS6panellabs <- c("(a)", "(b)", "(c)", "(d)", "(e)", "(f)", "(g)", "(h)", "(i)", "(j)", "(k)", "(l)", "(m)", "(n)", "(o)", "(p)")
FigS6 <- list()
for(i in 1:length(Huge_rep)){
  FigS6[[i]] <- ggplot(data = Huge_rep[[i]], aes(x = Time_step, y = Population_size_C.m)) +
  geom_line(lty = 1) + 
  geom_line(data = Huge_rep[[i]], aes(x = Time_step, y = Population_size_C.c), lty = 2) +
  ylab("Population size") +
  ggtitle(FigS6panellabs[i])
  print(FigS6[[i]])
}

[9.3] Relationships between CV and coexistence week (For Fig.S7)

[9.3.1] Calculating CVs

Small_cv_Y <- c()
Small_cv_A <- c()
Medium_cv_Y <- c()
Medium_cv_A <- c()
Large_cv_Y <- c()
Large_cv_A <- c()
Huge_cv_Y <- c()
Huge_cv_A <- c()

for(i in 1:length(Small)){
  Small_cv_Y[i] <- sd(Small[[i]]$YotsumonTotalL, na.rm = T)/mean(Small[[i]]$YotsumonTotalL, na.rm = T)  
  Small_cv_A[i] <- sd(Small[[i]]$AzukiTotalL, na.rm = T)/mean(Small[[i]]$AzukiTotalL, na.rm = T)  
}

for(i in 1:length(Medium)){
  Medium_cv_Y[i] <- sd(Medium[[i]]$YotsumonTotalL, na.rm = T)/mean(Medium[[i]]$YotsumonTotalL, na.rm = T)  
  Medium_cv_A[i] <- sd(Medium[[i]]$AzukiTotalL, na.rm = T)/mean(Medium[[i]]$AzukiTotalL, na.rm = T)  
}

for(i in 1:length(Large)){
  Large_cv_Y[i] <- sd(Large[[i]]$YotsumonTotalL, na.rm = T)/mean(Large[[i]]$YotsumonTotalL, na.rm = T)  
  Large_cv_A[i] <- sd(Large[[i]]$AzukiTotalL, na.rm = T)/mean(Large[[i]]$AzukiTotalL, na.rm = T)  
}

for(i in 1:length(Huge)){
  Huge_cv_Y[i] <- sd(Huge[[i]]$YotsumonTotalL, na.rm = T)/mean(Huge[[i]]$YotsumonTotalL, na.rm = T)  
  Huge_cv_A[i] <- sd(Huge[[i]]$AzukiTotalL, na.rm = T)/mean(Huge[[i]]$AzukiTotalL, na.rm = T)  
}

[9.3.2] GLM and preparing regression lines

–For C.m (Y), slope was significant when Small, Large, and Huge

–For C.c (A), slope was significant when Small and Large

#GLM for each cage size
#for C.m (Y)
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Small") ~ Small_cv_Y, family = "poisson"))$coefficients
             Estimate Std. Error  z value     Pr(>|z|)
(Intercept)  4.165355  0.2865541 14.53601 7.164409e-48
Small_cv_Y  -1.283970  0.2516943 -5.10131 3.373112e-07
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Medium") ~ Medium_cv_Y, family = "poisson"))$coefficients
              Estimate Std. Error    z value     Pr(>|z|)
(Intercept)  3.1117072  0.3194051  9.7421975 1.991994e-22
Medium_cv_Y -0.0956626  0.2670559 -0.3582119 7.201847e-01
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Large") ~ Large_cv_Y, family = "poisson"))$coefficients
             Estimate Std. Error  z value     Pr(>|z|)
(Intercept) 2.2033482  0.4027249 5.471099 4.472522e-08
Large_cv_Y  0.9040723  0.3819684 2.366877 1.793889e-02
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Huge") ~ Huge_cv_Y, family = "poisson"))$coefficients
             Estimate Std. Error   z value    Pr(>|z|)
(Intercept) 2.8271170  0.1856177 15.230858 2.20678e-52
Huge_cv_Y   0.3243216  0.1412992  2.295283 2.17169e-02
#for C.c (A)
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Small") ~ Small_cv_A, family = "poisson"))$coefficients
              Estimate Std. Error   z value     Pr(>|z|)
(Intercept)  4.0018796  0.4561198  8.773747 1.728173e-18
Small_cv_A  -0.7369437  0.2556813 -2.882274 3.948157e-03
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Medium") ~ Medium_cv_A, family = "poisson"))$coefficients
               Estimate Std. Error    z value     Pr(>|z|)
(Intercept)  3.10902401  0.4563374  6.8129934 9.558855e-12
Medium_cv_A -0.06392303  0.2630055 -0.2430483 8.079680e-01
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Large") ~ Large_cv_A, family = "poisson"))$coefficients
             Estimate Std. Error  z value     Pr(>|z|)
(Intercept) 2.1418655  0.3670250 5.835749 5.354957e-09
Large_cv_A  0.5798425  0.2087438 2.777771 5.473315e-03
summary(glm(subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Huge") ~ Huge_cv_A, family = "poisson"))$coefficients
              Estimate Std. Error    z value     Pr(>|z|)
(Intercept)  3.4606243  0.3208369 10.7862421 3.998052e-27
Huge_cv_A   -0.1433893  0.1987414 -0.7214868 4.706100e-01
#GLM for all cage sizes and prediction for each cage
cv_Y_all <- c(Small_cv_Y, Medium_cv_Y, Large_cv_Y, Huge_cv_Y)
cv_A_all <- c(Small_cv_A, Medium_cv_A, Large_cv_A, Huge_cv_A)
cv_data_all <- data.frame(Coexistence_periods = TableS1$Coexistence_periods, volume = TableS1$Cage.Size, cv_Y = cv_Y_all, cv_A = cv_A_all)

cv_coexistence_model_Y <- glm(Coexistence_periods ~ volume*cv_Y, data = cv_data_all, family = "poisson")
cv_coexistence_model_Y_predicted <- ggpredict(cv_coexistence_model_Y, term = c("cv_Y","volume"))

cv_coexistence_model_A <- glm(Coexistence_periods ~ volume*cv_A, data = cv_data_all, family = "poisson")
cv_coexistence_model_A_predicted <- ggpredict(cv_coexistence_model_A, term = c("cv_A","volume"))

[9.3.4] Visualization

#define linetypes & linewidth
linetypes_Y <- c("solid", "dashed", "solid", "solid")
linewidths_Y <- c(0.5, 0.5, 0.75, 1)
linetypes_A <- c("solid", "dashed", "solid", "dotted")
linewidths_A <- c(0.5, 0.5, 1, 0.5)

#ggplot  
cv_coexist_Y_fig <- ggplot() + geom_point(data = cv_data_all, aes(x = cv_Y, y = Coexistence_periods, shape = as.factor(volume)), size = 3, alpha = 0.5) 
cv_coexist_Y_fig <- cv_coexist_Y_fig + geom_line(data = cv_coexistence_model_Y_predicted, aes(x = x, y = predicted, linetype = group, linewidth = group)) + scale_linetype_manual(values = linetypes_Y) 
cv_coexist_Y_fig <- cv_coexist_Y_fig + scale_linewidth_manual(values = linewidths_Y)
cv_coexist_Y_fig <- cv_coexist_Y_fig + ggtitle("CV vs coexistence for C.m (Y)")
plot(cv_coexist_Y_fig)


cv_coexist_A_fig <- ggplot() + geom_point(data = cv_data_all, aes(x = cv_A, y = Coexistence_periods, shape = as.factor(volume)), size = 3, alpha = 0.5) 
cv_coexist_A_fig <- cv_coexist_A_fig + geom_line(data = cv_coexistence_model_A_predicted, aes(x = x, y = predicted, linetype = group, linewidth = group)) + scale_linetype_manual(values = linetypes_A) 
cv_coexist_A_fig <- cv_coexist_A_fig + scale_linewidth_manual(values = linewidths_A)
cv_coexist_A_fig <- cv_coexist_A_fig + ggtitle("CV vs coexistence for C.c (A)")
plot(cv_coexist_A_fig)

NA

[9.4] Relationship between early week population size vs coexistence period (for Fig.S8)

[9.4.1] Selecting the population size at 5th week (4 weeks later)

Small_5th_Y <- c()
Small_5th_A <- c()
Medium_5th_Y <- c()
Medium_5th_A <- c()
Large_5th_Y <- c()
Large_5th_A <- c()
Huge_5th_Y <- c()
Huge_5th_A <- c()

for(i in 1:16) {
  Small_5th_Y[i] <- Small[[i]]$YotsumonTotalL[5]
  Small_5th_A[i] <- Small[[i]]$AzukiTotalL[5]
  Medium_5th_Y[i] <- Medium[[i]]$YotsumonTotalL[5]
  Medium_5th_A[i] <- Medium[[i]]$AzukiTotalL[5]
  Large_5th_Y[i] <- Large[[i]]$YotsumonTotalL[5]
  Large_5th_A[i] <- Large[[i]]$AzukiTotalL[5]
  Huge_5th_Y[i] <- Huge[[i]]$YotsumonTotalL[5]
  Huge_5th_A[i] <- Huge[[i]]$AzukiTotalL[5]
}

Small_5th_coexist <- data.frame(Coexistence_periods = subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Small"), Y_5th = Small_5th_Y, A_5th = Small_5th_A)
Medium_5th_coexist <- data.frame(Coexistence_periods = subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Medium"), Y_5th = Medium_5th_Y, A_5th = Medium_5th_A)
Large_5th_coexist <- data.frame(Coexistence_periods = subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Large"), Y_5th = Large_5th_Y, A_5th = Large_5th_A)
Huge_5th_coexist <- data.frame(Coexistence_periods = subset(TableS1$Coexistence_periods, TableS1$Cage.Size == "Huge"), Y_5th = Huge_5th_Y, A_5th = Huge_5th_A)

[9.4.2] GLM for early week population size vs coexistence period

summary(glm(Coexistence_periods ~ Y_5th, data = Small_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ Y_5th, family = "poisson", 
    data = Small_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4496  -1.1968  -0.2544   0.6242   2.3607  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.755182   0.455821   8.238   <2e-16 ***
Y_5th       -0.009534   0.004056  -2.350   0.0188 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 36.944  on 15  degrees of freedom
Residual deviance: 31.229  on 14  degrees of freedom
AIC: 106.54

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ A_5th, data = Small_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ A_5th, family = "poisson", 
    data = Small_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2116  -0.9607  -0.3643   1.1848   2.2719  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) 2.023925   0.202592   9.990  < 2e-16 ***
A_5th       0.014068   0.003931   3.579 0.000345 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 36.944  on 15  degrees of freedom
Residual deviance: 24.094  on 14  degrees of freedom
AIC: 99.403

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ Y_5th, data = Medium_5th_coexist, family = "poisson"))
glm(formula = Coexistence_periods ~ Y_5th, family = "poisson", 
    data = Medium_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.7181  -1.4484  -0.3840   0.5927   4.9394  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.408069   0.337243  10.106   <2e-16 ***
Y_5th       -0.003848   0.003145  -1.223    0.221    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 63.081  on 15  degrees of freedom
Residual deviance: 61.594  on 14  degrees of freedom
AIC: 141.59

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ A_5th, data = Medium_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ A_5th, family = "poisson", 
    data = Medium_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9681  -1.4000  -0.6540   0.6791   5.1097  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) 2.533221   0.144071  17.583  < 2e-16 ***
A_5th       0.006387   0.001743   3.665 0.000247 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 63.081  on 15  degrees of freedom
Residual deviance: 49.496  on 14  degrees of freedom
AIC: 129.49

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ Y_5th, data = Large_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ Y_5th, family = "poisson", 
    data = Large_5th_coexist)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-2.56714  -0.86804  -0.05889   0.55035   2.74155  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  4.451380   0.316252  14.075  < 2e-16 ***
Y_5th       -0.011238   0.002723  -4.127 3.68e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 42.624  on 15  degrees of freedom
Residual deviance: 25.466  on 14  degrees of freedom
AIC: 108.36

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ A_5th, data = Large_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ A_5th, family = "poisson", 
    data = Large_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0574  -0.9449  -0.5074   0.3003   3.9059  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) 2.889068   0.125974  22.934   <2e-16 ***
A_5th       0.003887   0.001724   2.254   0.0242 *  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 family taken to be 1)

    Null deviance: 42.624  on 15  degrees of freedom
Residual deviance: 37.584  on 14  degrees of freedom
AIC: 120.48

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ Y_5th, data = Huge_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ Y_5th, family = "poisson", 
    data = Huge_5th_coexist)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1849  -0.8404   0.3302   0.7996   1.8855  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.409885   0.245346   13.90   <2e-16 ***
Y_5th       -0.001774   0.002396   -0.74    0.459    
---
Signif. codes:  poisson family taken to be 1)

    Null deviance: 23.991  on 15  degrees of freedom
Residual deviance: 23.439  on 14  degrees of freedom
AIC: 108.14

Number of Fisher Scoring iterations: 4
summary(glm(Coexistence_periods ~ A_5th, data = Huge_5th_coexist, family = "poisson"))

Call:
glm(formula = Coexistence_periods ~ A_5th, family = "poisson", 
    data = Huge_5th_coexist)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-2.06108  -0.46498  -0.04061   0.83194   1.87350  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) 3.009259   0.151495  19.864   <2e-16 ***
A_5th       0.003172   0.002017   1.573    0.116    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1Residual deviance: 21.550  on 14  degrees of freedom
AIC: 106.25

Number of Fisher Scoring iterations: 4

[9.4.3] Visualization

#Small
coexist_5th_Small_fig <- ggplot() + geom_point(data = Small_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), shape = 1, size = 3, alpha = 0.5) + geom_point(data = Small_5th_coexist, aes(x = A_5th, y = Coexistence_periods), shape = 2, size = 3, alpha = 0.5) + geom_smooth(data = Small_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", se = T) + geom_smooth(data = Small_5th_coexist, aes(x = A_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", se = T)
coexist_5th_Small_fig <- coexist_5th_Small_fig + xlab("population size") + ggtitle("Early poplation size vs coexistence (Small)")

#Medium
coexist_5th_Medium_fig <- ggplot() + geom_point(data = Medium_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), shape = 1, size = 3, alpha = 0.5) + geom_point(data = Medium_5th_coexist, aes(x = A_5th, y = Coexistence_periods), shape = 2, size = 3, alpha = 0.5) + geom_smooth(data = Medium_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", linetype = "dashed", se = T) + geom_smooth(data = Medium_5th_coexist, aes(x = A_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", se = T)
coexist_5th_Medium_fig <- coexist_5th_Medium_fig + xlab("population size") + ggtitle("Early poplation size vs coexistence (Medium)")

#Large
coexist_5th_Large_fig <- ggplot() + geom_point(data = Large_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), shape = 1, size = 3, alpha = 0.5) + geom_point(data = Large_5th_coexist, aes(x = A_5th, y = Coexistence_periods), shape = 2, size = 3, alpha = 0.5) + geom_smooth(data = Large_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", se = T) + geom_smooth(data = Large_5th_coexist, aes(x = A_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", se = T)
coexist_5th_Large_fig <- coexist_5th_Large_fig + xlab("population size") + ggtitle("Early poplation size vs coexistence (Large)")

#Huge
coexist_5th_Huge_fig <- ggplot() + geom_point(data = Huge_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), shape = 1, size = 3, alpha = 0.5) + geom_point(data = Huge_5th_coexist, aes(x = A_5th, y = Coexistence_periods), shape = 2, size = 3, alpha = 0.5) + geom_smooth(data = Huge_5th_coexist, aes(x = Y_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", linetype = "dashed", se = T) + geom_smooth(data = Huge_5th_coexist, aes(x = A_5th, y = Coexistence_periods), method = 'glm', method.args = list(family = 'poisson'), color = "black", linetype = "dashed", se = T)
coexist_5th_Huge_fig <- coexist_5th_Huge_fig + xlab("population size") + ggtitle("Early poplation size vs coexistence (Huge)")


print(coexist_5th_Small_fig)

print(coexist_5th_Medium_fig)

print(coexist_5th_Large_fig)

print(coexist_5th_Huge_fig)

LS0tDQp0aXRsZTogIkRhdGEgKHJlKWFuYWx5c2lzIGNvbmZpcm1lZCBQb3B1bGF0aW9uIEVjb2xvZ3kgbWFudXNjcmlwdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIFsxXSBMb2FkaW5nIHBhY2thZ2VzDQotLSBBbGwgYW5hbHlzZXMgd2VyZSBjb25maXJtZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYXV0aG9yIGFuZCBmaW5hbGx5IGNvbmR1Y3RlZCBhdCAyMDIzLzA1LzA5DQoNCkNoZWNraW5nIHRoZSB2ZXJzaW9uIG9mIFIgaXRzZWxmIGFuZCByRURNICh2MC42LjkpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImhhMHllL3JFRE0iKQ0KI2luc3RhbGwucGFja2FnZXMoIkM6L1VzZXJzLyoqKioqL3JFRE1fMC42LjkudGFyLmd6IiwgcmVwb3MgPSBOVUxMLCB0eXBlID0gInNvdXJjZSIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyRURNKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ2VmZmVjdHMpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KE11TUluKQ0Kc2Vzc2lvbkluZm8oKQ0KcGFja2FnZVZlcnNpb24oInJFRE0iKQ0KYGBgDQoNCiMjIFsyXSBUZXJtcyBkZWZpbmVkDQoNCi0tIOODqOODhOODouODs+ODnuODoeOCvuOCpuODoOOCtyA9IOODqOODhOODouODsyA9IFlvdHN1bW9uID0gQ2FsbG9zb2JydWNidXMgbWFjdWxhdHVzID0gQ20gPSAiWSINCg0KLS0g44Ki44K644Kt44K+44Km44Og44K3ID0g44Ki44K644KtID0gQXp1a2kgPSBDYWxsb3NvYnJ1Y2h1cyBjaGluZW5zaXMgPSBDYyA9ICJBIg0KDQojIyBbM10gTG9hZGluZyByYXcgZGF0YQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI2ZpbGUgZnJvbSAyMDIyLzAyLzIyIHJlYW5hbHlzaXMgDQpkYXRhIDwtIHJlYWQuY3N2KCJkYXRhXzIwMjMwMjIyZW4uY3N2IiwgaGVhZGVyID0gVCkNCiNkYXRhIDwtIHJlYWQuY3N2KCJkYXRhXzIwMjMwMjIyLmNzdiIsIGhlYWRlciA9IFQpDQpkYXRhDQpgYGANCg0KIyMgWzRdIFNldHRpbmcgdGhlIHZvbHVtZXMgb2YgY2FnZXMgKFNtYWxsLCBNZWRpdW0sIExhcmdlLCBhbmQgSHVnZSkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NClNtYWxsdm9sdW1lIDwtIDguNSo2KjMuNQ0KTWVkaXVtdm9sdW1lIDwtIDEzLjUqOC41KjQuNSANCkxhcmdldm9sdW1lIDwtIDE4LjUqMTQqNi41DQpIdWdldm9sdW1lIDwtIDIyKjE1LjUqNy41DQpgYGANCg0KIyMgWzVdIFByZXByb2Nlc3NpbmcgdGhlIHJhdyBkYXRhDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpub19yZXBsaWNhdGVzIDwtIDY0ICN0aGUgdG90YWwgbnVtYmVyIG9mIHJlcGxpY2F0ZXM6IDE2IHJlcGxpY2F0ZXMgd2l0aGluIGEgY2FnZSBzaXplIHggZm91ciBjYWdlIHNpemVzDQojY29udmVydGluZyB0aGUgZGF0YSB0byBsaXN0IGZvciBlYWNoIGNhZ2UgSUQNCmRhdGFsaXN0IDwtIGxhcHBseSgxOm5vX3JlcGxpY2F0ZXMsIGZ1bmN0aW9uKGkpIHN1YnNldChkYXRhLElEID09IGkpKQ0KZGF0YWxpc3RbWzEwXV0gI2V4YW1wbGUNCg0KYGBgDQoNCiMjIFs2XSBRdWFudGlmeWluZyB0aGUgY29leGlzdGVuY2UgcGVyaW9kDQoNCiMjIyBbNi4xXSBjb3VudGluZyB0aGUgZXh0aW5jdGlvbiB0aW1pbmcNCg0KIyMjIyBbNi4xLjFdIEZvciBDbTogQ291bnRpbmcgdGhlIG51bWJlciBvZiB3ZWVrcyB3aXRoIHplcm8gYWJ1bmRhbmNlDQoNCmBgYHtyfQ0KI0NvdW50aW5nIHRoZSBudW1iZXIgb2Ygd2Vla3Mgd2hlbiB0aGUgYWJ1bmRhbmNlIGlzIGNvbnRpbnVvdXNseSB6ZXJvICwgYmFjay1jYWxjdWxhdGVkIGZyb20gdGhlIGZpbmFsIHdlZWsgdG8gdGhlIGZpcnN0IHdlZWsgDQpjb3VudCA8LSBudW1lcmljKG5vX3JlcGxpY2F0ZXMpICNudW1lcmljIHZlY3RvciBmb3IgNjQgc2FtcGxlcw0Kd2Vla3MgPC0gbnVtZXJpYyhub19yZXBsaWNhdGVzKSAjbnVtYmVyIG9mIHdlZWtzIGZvciBvYnNlcnZhdGlvbnMsIHdoaWNoIHBvdGVudGlhbGx5IGRlcGVuZGVuZCBvbiByZXBsaWNhdGVzDQpmb3IoaiBpbiAxOm5vX3JlcGxpY2F0ZXMpew0KICB3ZWVrc1tqXSA8LSBucm93KGRhdGFsaXN0W1tqXV0pDQogIGZvcihpIGluIHdlZWtzW2pdOjEpew0KICAgIGlmKGRhdGFsaXN0W1tqXV0kWW90c3Vtb25Ub3RhbExbaV0gPT0gMCl7DQogICAgICBjb3VudFtqXSA8LSBjb3VudFtqXSArIDENCiAgICB9IGVsc2V7DQogICAgICBicmVhaw0KICAgIH0NCiAgfQ0KfQ0KY291bnQNCmBgYA0KDQojIyMjIFs2LjEuMl0gRm9yIENjOiBDb3VudGluZyB0aGUgbnVtYmVyIG9mIHdlZWtzIHdpdGggemVybyBhYnVuZGFuY2UNCg0KYGBge3J9DQojQ291bnRpbmcgdGhlIG51bWJlciBvZiB3ZWVrcyB3aGVuIHRoZSBhYnVuZGFuY2UgaXMgY29udGludW91c2x5IHplcm8gLCBiYWNrLWNhbGN1bGF0ZWQgZnJvbSB0aGUgZmluYWwgd2VlayB0byB0aGUgZmlyc3Qgd2VlayANCmNvdW50MiA8LSBudW1lcmljKG5vX3JlcGxpY2F0ZXMpICAjbnVtZXJpYyB2ZWN0b3IgZm9yIDY0IHNhbXBsZXMNCg0KZm9yKGogaW4gMTpub19yZXBsaWNhdGVzKXsNCiAgZm9yKGkgaW4gd2Vla3Nbal06MSl7DQogICAgaWYoZGF0YWxpc3RbW2pdXSRBenVraVRvdGFsTFtpXSA9PSAwKXsNCiAgICAgIGNvdW50MltqXSA8LSBjb3VudDJbal0gKyAxDQogICAgfSBlbHNlew0KICAgICAgYnJlYWsNCiAgICB9DQogIH0NCn0NCmNvdW50Mg0KYGBgDQoNCiMjIyMgWzYuMS4zXSBDaGVja2luZyB0aGUgdGltaW5nIG9mIGVhcmxpZXIgZXh0aW5jdGlvbg0KDQpUaGUgY29kZSBieSBNaWtpLCBpdCBpcyBtb3JlIG5hdHVyYWwgYW5kIHNpbXBsZXIuDQoNCmBgYHtyfQ0KZXh0aW5jdCA8LSBudW1lcmljKG5vX3JlcGxpY2F0ZXMpDQpmb3IoaSBpbiAxOm5vX3JlcGxpY2F0ZXMpew0KICBpZihjb3VudFtpXSA+PSBjb3VudDJbaV0pIHsNCiAgICBleHRpbmN0W2ldIDwtIGNvdW50W2ldDQogIH0gZWxzZSB7DQogICAgZXh0aW5jdFtpXSA8LSBjb3VudDJbaV0NCiAgfQ0KfQ0KZXh0aW5jdA0KYGBgDQoNCiMjIyBbNi4yXSBEYXRhIHJlYXJyYW5nZW1lbnQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMNCg0KIyMjIyBbNi4yLjFdIERlbGV0aW5nIHRoZSBkYXRhcG9pbnRzIGZyb20gdGhlIDJuZCB3ZWVrIG9mIHRoZSBleHRpbmN0aW9uIHRvIHRoZSBmaW5hbCB3ZWVrDQoNCmBgYHtyfQ0Kc2hhdmVkYXRhIDwtIGxhcHBseSgxOjY0LCBmdW5jdGlvbihpKSBoZWFkKGRhdGFsaXN0W1tpXV0sIG4gPSB3ZWVrc1tpXSAtIGV4dGluY3RbaV0gKyAxKSkNCnNoYXZlZGF0YWZyYW1lIDwtIE5VTEwNCmZvcihpIGluIDE6NjQpICBzaGF2ZWRhdGFmcmFtZSA8LSAgcmJpbmQuZGF0YS5mcmFtZShzaGF2ZWRhdGFmcmFtZSwgc2hhdmVkYXRhW1tpXV0pDQpzaGF2ZWRhdGFmcmFtZQ0KYGBgDQoNCiMjIyMgWzYuMi4yXSBEZWNvbXBvc2luZyB0aGUgbW9kaWZpZWQgZGF0YSAoc2hhdmVkYXRhZnJhbWUpIGludG8gbXVsdGlwbGUgZGF0YXNldHMgZGVwZW5kaW5nIG9uIGNhZ2Ugc2l6ZSBhbmQgZXh0cmFjdGluZyB0aGUgcmVwbGljYXRlIElEDQoNCmBgYHtyfQ0KI1NtYWxsIA0KU21hbGxhbGwgPC0gc3Vic2V0KHNoYXZlZGF0YWZyYW1lLCBDYWdlLnNpemUgPT0gIlNtYWxsIikNClNtYWxsSUQgPC0gdW5pcXVlKFNtYWxsYWxsJElEKQ0KU21hbGwgPC0gbGlzdCgpDQpmb3IoaSBpbiAxOmxlbmd0aChTbWFsbElEKSl7DQogIFNtYWxsW1tpXV0gPC0gc3Vic2V0KFNtYWxsYWxsLCBJRCA9PSBTbWFsbElEW2ldKQ0KfQ0KU21hbGxbWzJdXSAjZXhhbXBsZQ0KDQojTWVkaXVtDQpNZWRpdW1hbGwgPC0gc3Vic2V0KHNoYXZlZGF0YWZyYW1lLCBDYWdlLnNpemUgPT0gIk1lZGl1bSIpDQpNZWRpdW1JRCA8LSB1bmlxdWUoTWVkaXVtYWxsJElEKQ0KTWVkaXVtIDwtIGxpc3QoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTWVkaXVtSUQpKXsNCiAgTWVkaXVtW1tpXV0gPC0gc3Vic2V0KE1lZGl1bWFsbCwgSUQgPT0gTWVkaXVtSURbaV0pDQp9DQpNZWRpdW1bWzJdXSAjZXhhbXBsZQ0KDQojTGFyZ2UNCkxhcmdlYWxsIDwtIHN1YnNldChzaGF2ZWRhdGFmcmFtZSwgQ2FnZS5zaXplID09ICJMYXJnZSIpDQpMYXJnZUlEIDwtIHVuaXF1ZShMYXJnZWFsbCRJRCkNCkxhcmdlIDwtIGxpc3QoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2VJRCkpew0KICBMYXJnZVtbaV1dIDwtIHN1YnNldChMYXJnZWFsbCwgSUQgPT0gTGFyZ2VJRFtpXSkNCn0NCkxhcmdlW1syXV0gI2V4YW1wbGUNCg0KI0h1Z2UNCkh1Z2VhbGwgPC0gc3Vic2V0KHNoYXZlZGF0YWZyYW1lLCBDYWdlLnNpemUgPT0gIkh1Z2UiKQ0KSHVnZUlEIDwtIHVuaXF1ZShIdWdlYWxsJElEKQ0KSHVnZSA8LSBsaXN0KCkNCmZvcihpIGluIDE6bGVuZ3RoKEh1Z2VJRCkpew0KICBIdWdlW1tpXV0gPC1zdWJzZXQoSHVnZWFsbCwgSUQgPT0gSHVnZUlEW2ldKQ0KfQ0KSHVnZVtbMl1dICNleGFtcGxlDQpgYGANCg0KIyMjIyBbNi4yLjNdIEFzc2lnbm1lbnQgb2Ygc3RyYWluIElEDQoNCmBgYHtyfQ0KI1NtYWxsDQpTbWFsbHN0cmFpbiA8LSBOVUxMDQpmb3IoaSBpbiAxOmxlbmd0aChTbWFsbCkpew0KICBTbWFsbHN0cmFpbltpXSA8LSB1bmlxdWUoU21hbGxbW2ldXSRTdHJhaW4pDQp9DQpTbWFsbHN0cmFpbg0KDQojTWVkaXVtDQpNZWRpdW1zdHJhaW4gPC0gTlVMTA0KZm9yKGkgaW4gMTpsZW5ndGgoTWVkaXVtKSl7DQogIE1lZGl1bXN0cmFpbltpXSA8LSB1bmlxdWUoTWVkaXVtW1tpXV0kU3RyYWluKQ0KfQ0KTWVkaXVtc3RyYWluDQoNCiNMYXJnZQ0KTGFyZ2VzdHJhaW4gPC0gTlVMTA0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2UpKXsNCiAgTGFyZ2VzdHJhaW5baV0gPC0gdW5pcXVlKExhcmdlW1tpXV0kU3RyYWluKQ0KfQ0KTGFyZ2VzdHJhaW4NCg0KI0h1Z2UNCkh1Z2VzdHJhaW4gPC0gTlVMTA0KZm9yKGkgaW4gMTpsZW5ndGgoSHVnZSkpew0KICBIdWdlc3RyYWluW2ldIDwtIHVuaXF1ZShIdWdlW1tpXV0kU3RyYWluKQ0KfQ0KSHVnZXN0cmFpbg0KDQpgYGANCg0KIyMjIyBbNi4yLjRdIEdlbmVyYXRpbmcgdGhlIENTViBmaWxlIGZvciB0aGUgZGF0YSB3aGVyZSBhZGRpdGlvbmFsIHplcm8gd2Vla3MgZGF0YSB3ZXJlIGRlbGV0ZWQNCg0KYGBge3J9DQp3cml0ZS5jc3Yoc2hhdmVkYXRhZnJhbWUsICJzaGF2ZWRhdGFmcmFtZS5jc3YiKQ0KYGBgDQoNCiMjIyBbNi4zXSBDYWxjdWxhdGluZyB0aGUgY29leGlzdGVuY2UgcGVyaW9kICh3ZWVrcykgZm9yIGVhY2ggY2FnZSBzaXplDQoNCiMjIyMgWzYuMy4xXSBTbWFsbCBzaXplDQoNCmBgYHtyfQ0KU21hbGxjb3dlZWsgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNtYWxsY293ZWVrW2ldIDwtIG5yb3coU21hbGxbW2ldXSkgLSAxICNFeHRpbmN0aW9uIG9jY3VycmVkIGF0IHRoZSBmaW5hbCB3ZWVrDQp9DQpjYXQoIlRoZSBudW1iZXIgb2YgcmVwbGljYXRlcyBmb3Igc21hbGwgc2l6ZSBjYWdlOiIsIGxlbmd0aChTbWFsbCksICJcbiIpDQpTbWFsbGNvd2Vlaw0KYGBgDQoNCiMjIyMgWzYuMy4yXSBNZWRpdW0gc2l6ZQ0KDQpgYGB7cn0NCk1lZGl1bWNvd2VlayA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTWVkaXVtKSl7DQogIE1lZGl1bWNvd2Vla1tpXSA8LSBucm93KE1lZGl1bVtbaV1dKSAtIDEgI0V4dGluY3Rpb24gb2NjdXJyZWQgYXQgdGhlIGZpbmFsIHdlZWsNCn0NCmNhdCgiVGhlIG51bWJlciBvZiByZXBsaWNhdGVzIGZvciBtZWRpdW0gc2l6ZSBjYWdlOiIsIGxlbmd0aChNZWRpdW0pLCAiXG4iKQ0KTWVkaXVtY293ZWVrDQpgYGANCg0KIyMjIyBbNi4zLjNdIExhcmdlIHNpemUNCg0KYGBge3J9DQpMYXJnZWNvd2VlayA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2UpKXsNCiAgTGFyZ2Vjb3dlZWtbaV0gPC0gbnJvdyhMYXJnZVtbaV1dKSAtIDEgI0V4dGluY3Rpb24gb2NjdXJyZWQgYXQgdGhlIGZpbmFsIHdlZWsNCn0NCmNhdCgiVGhlIG51bWJlciBvZiByZXBsaWNhdGVzIGZvciBsYXJnZSBzaXplIGNhZ2U6IiwgbGVuZ3RoKExhcmdlKSwgIlxuIikNCkxhcmdlY293ZWVrDQpgYGANCg0KIyMjIyBbNi4zLjRdIEh1Z2Ugc2l6ZQ0KDQpgYGB7cn0NCkh1Z2Vjb3dlZWsgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKEh1Z2UpKXsNCiAgSHVnZWNvd2Vla1tpXSA8LSBucm93KEh1Z2VbW2ldXSkgLSAxICNFeHRpbmN0aW9uIG9jY3VycmVkIGF0IHRoZSBmaW5hbCB3ZWVrDQp9DQpjYXQoIlRoZSBudW1iZXIgb2YgcmVwbGljYXRlcyBmb3IgaHVnZSBzaXplIGNhZ2U6IiwgbGVuZ3RoKEh1Z2UpLCAiXG4iKQ0KSHVnZWNvd2Vlaw0KYGBgDQoNCiMjIyBbNi40XSBFdmFsdWF0aW5nIHRoZSB3aW5uZXIgb2YgdGhlIGNvbXBldGl0aW9uDQoNCi0tIGNvdW50OiBDbSBZb3RzdW1vbiwgdGhlIG51bWJlciBvZiB3ZWVrcyB3aXRoIGNvbnRpbnVvdXNseSB6ZXJvIGFidW5kYW5jZQ0KDQotLSBjb3VudDI6IENj44CAQXp1a2ksIHRoZSBudW1iZXIgb2Ygd2Vla3Mgd2l0aCBjb250aW51b3VzbHkgemVybyBhYnVuZGFuY2UNCg0KYGBge3J9DQpjb21wZXRpdGlvbndpbm5lcuOAgDwt44CAdmVjdG9yKCkNCg0KZm9yKGkgaW4gMTpub19yZXBsaWNhdGVzKXsNCiAgaWYoY291bnRbaV0gPCBjb3VudDJbaV0pew0KICAgIGNvbXBldGl0aW9ud2lubmVyW2ldIDwtICJDLm0iDQogIH0gZWxzZSBpZiAoY291bnRbaV0gPT0gY291bnQyW2ldKXsNCiAgICBjb21wZXRpdGlvbndpbm5lcltpXSA8LSAiQ29leGlzdGVuY2UiDQogIH0gZWxzZXsNCiAgICBjb21wZXRpdGlvbndpbm5lcltpXSA8LSAiQy5jIg0KICB9DQp9DQpjb21wZXRpdGlvbndpbm5lcg0KYGBgDQoNCiMjIyBbNi41XSBHZW5lcmF0aW5nIHRoZSBkYXRhZnJhbWUgbGlzdGluZyBjb2V4aXN0ZW5jZSB3ZWVrLCBzdHJhaW4sIGFuZCB0aGUgd2lubmVyIG9mIGNvbXBldGl0aW9uDQoNCiMjIyMgWzYuNS4xXSBUaGlzIGlzIHVzZWQgZm9yIFRhYmxlIFMxDQoNCmBgYHtyfQ0KVGFibGVTMSA8LSBkYXRhLmZyYW1lKCJDYWdlIFNpemUiID0gYyhyZXAoIlNtYWxsIixsZW5ndGgoU21hbGwpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIk1lZGl1bSIsbGVuZ3RoKE1lZGl1bSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiTGFyZ2UiLGxlbmd0aChMYXJnZSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiSHVnZSIsbGVuZ3RoKEh1Z2UpKSksDQogICAgICAgICAgICAgICAgICAgICJJRCIgPSBjKFNtYWxsSUQsTWVkaXVtSUQsTGFyZ2VJRCxIdWdlSUQpLA0KICAgICAgICAgICAgICAgICAgICAiU3RyYWluIiA9IGMoU21hbGxzdHJhaW4sTWVkaXVtc3RyYWluLExhcmdlc3RyYWluLEh1Z2VzdHJhaW4pLA0KICAgICAgICAgICAgICAgICAgICAiQ29leGlzdGVuY2VfcGVyaW9kcyIgPSBjKFNtYWxsY293ZWVrLE1lZGl1bWNvd2VlayxMYXJnZWNvd2VlayxIdWdlY293ZWVrKSwNCiAgICAgICAgICAgICAgICAgICAgIlJlc3VsdF9vZl9jb21wZXRpdGlvbiIgPSBjb21wZXRpdGlvbndpbm5lcikNClRhYmxlUzENCmBgYA0KDQojIyMjIFs2LjUuMl0gR2VuZXJhdGluZyB0aGUgQ1NWIGZpbGUgZm9yIFRhYmxlUzENCg0KYGBge3J9DQp3cml0ZS5jc3YoVGFibGVTMSwiVGFibGVTMS5jc3YiKQ0KYGBgDQoNCiMjIFs3XSBDaGVja2luZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGNvZXhpc3RlbmNlIHBlcmlvZHMgYW5kIGNhZ2Ugc2l6ZXMNCg0KIyMjIFs3LjFdIEdlbmVyYXRuZyB0aGUgZGF0YWZyYW1lIGZvciBnZ3Bsb3QgJiBnbG0gYW5hbHlzaXMNCg0KYGBge3J9DQpjb2V4aXN0X3NpemVfZGF0YWZyYW1lIDwtIGRhdGEuZnJhbWUoIkNvZXhpc3RlbmNlX3BlcmlvZHMiID0gYyhTbWFsbGNvd2VlayxNZWRpdW1jb3dlZWssTGFyZ2Vjb3dlZWssSHVnZWNvd2VlayksDQoiVm9sdW1lIiA9IGMocmVwKFNtYWxsdm9sdW1lLGxlbmd0aChTbWFsbGNvd2VlaykpLHJlcChNZWRpdW12b2x1bWUsbGVuZ3RoKE1lZGl1bWNvd2VlaykpLHJlcChMYXJnZXZvbHVtZSxsZW5ndGgoTGFyZ2Vjb3dlZWspKSxyZXAoSHVnZXZvbHVtZSxsZW5ndGgoSHVnZWNvd2VlaykpKSwNCiJDYWdlX3NpemUiID0gYXMuZmFjdG9yKGMocmVwKCJTbWFsbCIsbGVuZ3RoKFNtYWxsY293ZWVrKSkscmVwKCJNZWRpdW0iLGxlbmd0aChNZWRpdW1jb3dlZWspKSxyZXAoIkxhcmdlIixsZW5ndGgoTGFyZ2Vjb3dlZWspKSxyZXAoIkh1Z2UiLGxlbmd0aChIdWdlY293ZWVrKSkpKSkNCg0KI2NoZWNrIHRoZSBjbGFzcyBvZiB2ZWN0b3JzDQpjbGFzcyhjb2V4aXN0X3NpemVfZGF0YWZyYW1lJFZvbHVtZSkNCmNsYXNzKGNvZXhpc3Rfc2l6ZV9kYXRhZnJhbWUkQ2FnZV9zaXplKQ0KDQojQ2hhbmdlIHRoZSBvcmRlciBvZiBmYWN0b3IgbGV2ZWxzDQpjb2V4aXN0X3NpemVfZGF0YWZyYW1lJENhZ2Vfc2l6ZSA8LSBmYWN0b3IoY29leGlzdF9zaXplX2RhdGFmcmFtZSRDYWdlX3NpemUsbGV2ZWxzID0gYygiU21hbGwiLCJNZWRpdW0iLCJMYXJnZSIsIkh1Z2UiKSkNCg0KY29leGlzdF9zaXplX2RhdGFmcmFtZSRDYWdlX3NpemUNCg0KY29leGlzdF9zaXplX2RhdGFmcmFtZQ0KYGBgDQoNCiMjIyBbNy4yXSBEcmF3aW5nIEZpZ3VyZSAyDQoNCiMjIyMgWzcuMi4xXSBCeSBnZ3Bsb3QyDQoNCmBgYHtyfQ0KI1dpdGggbWVhbg0KRmlnMiA8LSBnZ3Bsb3QoZGF0YSA9IGNvZXhpc3Rfc2l6ZV9kYXRhZnJhbWUsDQogICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBWb2x1bWUsIHk9IENvZXhpc3RlbmNlX3BlcmlvZHMsIGdyb3VwID0gQ2FnZV9zaXplLGZpbGwgPSBDYWdlX3NpemUpKSArIA0KICBnZW9tX3Zpb2xpbigpICsgDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDMwLCBmaWxsID0gImJsYWNrIiwgb3V0bGllci5jb2xvciA9IE5BKSArDQogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50IiwgZmlsbCA9ICJ3aGl0ZSIsIHNoYXBlID0gMjEsIHNpemUgPSAzKSArIA0KICBsYWJzKHkgPSAiQ29leGlzdGVuY2UgcGVyaW9kcyAod2VlaykiLHggPSAiVm9sdW1lIChjbcKzKSIpDQpwcmludChGaWcyKQ0KDQojU2ltcGxlciBwbG90IHdpdGggR0xNIGxpbmUNCkZpZzIuMSA8LSBnZ3Bsb3QoZGF0YSA9IGNvZXhpc3Rfc2l6ZV9kYXRhZnJhbWUsIGFlcyh4ID0gVm9sdW1lLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcykpDQpGaWcyLjEgPC0gRmlnMi4xICsgZ2VvbV9wb2ludChzaXplID0gMywgc2hhcGUgPSAyMSkNCkZpZzIuMSA8LSBGaWcyLjEgKyBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2xtJywgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICdwb2lzc29uJyksIHNlID0gVCwgY29sb3IgPSAnYmxhY2snKQ0KRmlnMi4xIDwtIEZpZzIuMSArIGxhYnMoeSA9ICJDb2V4aXN0ZW5jZSBwZXJpb2RzICh3ZWVrKSIsIHggPSAiVm9sdW1lIChjbTMpIikNCnByaW50KEZpZzIuMSkNCmBgYA0KDQojIyMjIFs3LjIuMl0gRHJhd2luZyBGaWd1cmUgMiBieSBiYXNlIHBhY2thZ2UNCg0KYGBge3J9DQpwbG90KA0KICBDb2V4aXN0ZW5jZV9wZXJpb2RzIH4gVm9sdW1lLA0KICBkYXRhID0gY29leGlzdF9zaXplX2RhdGFmcmFtZSwNCiAgeGxhYiA9ICJWT2x1bWUgKGNtMykiLA0KICB5bGFiID0gIkNvZXhpdGVuY2UgcGVyaW9kICh3ZWVrcykiDQopDQpgYGANCg0KIyMjIFs3LjNdIEdMTSAod2l0aCBQb2lzc29uIGRpc3QuKQ0KDQpgYGB7cn0NCnN1bW1hcnkoZ2xtKENvZXhpc3RlbmNlX3BlcmlvZHMgfiBWb2x1bWUsIGRhdGEgPSBjb2V4aXN0X3NpemVfZGF0YWZyYW1lLCBmYW1pbHkgPSAicG9pc3NvbiIpKQ0KYGBgDQoNCiMjIFs4XSBBbmFseXNlcyB1c2luZyByRURNIHBhY2thZ2UNCg0KIyMjIFs4LjBdIFRlcm1zIGRlZmluZWQgYWdhaW4NCg0KLS0g44Oo44OE44Oi44Oz44Oe44Oh44K+44Km44Og44K3ID0g44Oo44OE44Oi44OzID0gWW90c3Vtb24gPSBDYWxsb3NvYnJ1Y2J1cyBtYWN1bGF0dXMgPSBDbSA9ICJZIg0KDQotLSDjgqLjgrrjgq3jgr7jgqbjg6DjgrcgPSDjgqLjgrrjgq0gPSBBenVraSA9IENhbGxvc29icnVjaHVzIGNoaW5lbnNpcyA9IENjID0gIkEiDQoNCiMjIyBbOC4xXSBCYXNpYyBFRE0gYW5hbHlzaXMgZm9yIGVhY2ggcmVwbGljYXRlIGluZGl2aWR1YWxseQ0KDQojIyMjIFs4LjEuMV0gUHJlcHJvY2Vzc2luZyB0aGUgdGltZSBzZXJpZXMgZGF0YQ0KDQotLSBTb3J0aW5nIGZvciBlYWNoIGNhZ2Ugc2l6ZSwgZnJvbSBsb25nZXN0IGNvZXhpc3RlbmNlIHBlcmlvZCB0byBzaG9ydGVzdA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI1NtYWxsIA0KU21hbGxsZW5ndGggPC0gc3Vic2V0KFRhYmxlUzEsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJTbWFsbCIpDQpTbWFsbGxlbmd0aFtvcmRlcihTbWFsbGxlbmd0aCRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KI01lZGl1bQ0KTWVkaXVtbGVuZ3RoIDwtIHN1YnNldChUYWJsZVMxLCBUYWJsZVMxJENhZ2UuU2l6ZSA9PSAiTWVkaXVtIikNCk1lZGl1bWxlbmd0aFtvcmRlcihNZWRpdW1sZW5ndGgkQ29leGlzdGVuY2VfcGVyaW9kcywgZGVjcmVhc2luZyA9IFRSVUUpLF0NCiNMYXJnZQ0KTGFyZ2VsZW5ndGggPC0gc3Vic2V0KFRhYmxlUzEsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJMYXJnZSIpDQpMYXJnZWxlbmd0aFtvcmRlcihMYXJnZWxlbmd0aCRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KI0h1Z2UNCkh1Z2VsZW5ndGggPC0gc3Vic2V0KFRhYmxlUzEsVGFibGVTMSRDYWdlLlNpemUgPT0gIkh1Z2UiKQ0KSHVnZWxlbmd0aFtvcmRlcihIdWdlbGVuZ3RoJENvZXhpc3RlbmNlX3BlcmlvZHMsIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpgYGANCg0KIyMjIyBbOC4xLjJdIFNpbXBsZXggcHJvamVjdGlvbiBmb3IgZWFjaCByZXBsaWNhdGUNCg0KLS0gVGhlIGdvYWwgaXMgdG8gb2J0YWluIHRoZSBvcHRpbWFsIGVtYmVkZGluZyBkaW1lbnNpb24gRVwqDQoNCi0tIFdhcm5pbmcgd2hlbiBleGVjdXRpbmcgc2ltcGxleCgpIGlzIGV4cGVjdGVkIG9uZSBzbyBubyBwcm9ibGVtcw0KDQojIyMjIyBbOC4xLjIuMV0gRm9yIHNtYWxsIGNhZ2VzDQoNCiMjIyMjIyBGb3IgQ20NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KU2ltcGxleF9TbWFsbF9ZIDwtIGxpc3QoKSAjbGlzdCBmb3IgYXNzaWduaW5nIHJlc3VsdHMNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNpbXBsZXhfU21hbGxfWVtbaV1dIDwtIHNpbXBsZXgoU21hbGxbW2ldXSRZb3RzdW1vblRvdGFsTCwgbGliID0gYygxLCBucm93KFNtYWxsW1tpXV0pKSwgcHJlZCA9IGMgKDEsIG5yb3coU21hbGxbW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpTbWFsbF9CZXN0RV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X1NtYWxsX1kpKXsNCiAgU21hbGxfQmVzdEVfWVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9TbWFsbF9ZW1tpXV0kcmhvKQ0KfQ0KU21hbGxfQmVzdEVfWQ0KDQojQ29tYmluaW5nIGl0IHdpdGggcmVwbGljYXRlIElEDQpTbWFsbF9JRF9CZXN0RV9ZIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNtYWxsX0lEX0Jlc3RFX1kgPC0gcmJpbmQuZGF0YS5mcmFtZShTbWFsbF9JRF9CZXN0RV9ZLCBjYmluZChTbWFsbFtbaV1dWzEsIF0kSUQsIFNtYWxsX0Jlc3RFX1lbaV0pKQ0KfQ0KDQojYWRkaW5nIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoU21hbGxfSURfQmVzdEVfWSkgPC0gYygiSUQiLCJDLm1fRSIpDQpTbWFsbF9JRF9CZXN0RV9ZDQpgYGANCg0KIyMjIyMjIEZvciBDYw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9TbWFsbF9BIDwtIGxpc3QoKSAjbGlzdCBmb3IgYXNzaWduaW5nIHJlc3VsdHMNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNpbXBsZXhfU21hbGxfQVtbaV1dIDwtIHNpbXBsZXgoU21hbGxbW2ldXSRBenVraVRvdGFsTCwgbGliID0gYygxLCBucm93KFNtYWxsW1tpXV0pKSwgcHJlZCA9IGMgKDEsIG5yb3coU21hbGxbW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpTbWFsbF9CZXN0RV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X1NtYWxsX0EpKXsNCiAgU21hbGxfQmVzdEVfQVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9TbWFsbF9BW1tpXV0kcmhvKQ0KfQ0KU21hbGxfQmVzdEVfQQ0KDQojQ29tYmluaW5nIGl0IHdpdGggcmVwbGljYXRlIElEDQpTbWFsbF9JRF9CZXN0RV9BIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNtYWxsX0lEX0Jlc3RFX0EgPC0gcmJpbmQuZGF0YS5mcmFtZShTbWFsbF9JRF9CZXN0RV9BLCBjYmluZChTbWFsbFtbaV1dWzEsIF0kSUQsIFNtYWxsX0Jlc3RFX0FbaV0pKQ0KfQ0KDQojYWRkaW5nIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoU21hbGxfSURfQmVzdEVfQSkgPC0gYygiSUQiLCJDLmNfRSIpDQpTbWFsbF9JRF9CZXN0RV9BDQpgYGANCg0KIyMjIyMgWzguMS4yLjJdIEZvciBNZWRpdW0gY2FnZXMNCg0KIyMjIyMjIEZvciBDbQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9NZWRpdW1fWSA8LSBsaXN0KCkgI2xpc3QgZm9yIGFzc2lnbmluZyByZXN1bHRzDQoNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKE1lZGl1bSkpew0KICBTaW1wbGV4X01lZGl1bV9ZW1tpXV0gPC0gc2ltcGxleChNZWRpdW1bW2ldXSRZb3RzdW1vblRvdGFsTCwgbGliID0gYygxLCBucm93KE1lZGl1bVtbaV1dKSksIHByZWQgPSBjICgxLCBucm93KE1lZGl1bVtbaV1dKSksIEUgPSBjKDE6MTApKQ0KfQ0KDQojUGlja2luZyB1cCB0aGUgb3B0aW1hbCBlbWJlZGRpbmcgZGltZW5zaW9uIChFKikNCk1lZGl1bV9CZXN0RV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X01lZGl1bV9ZKSl7DQogIE1lZGl1bV9CZXN0RV9ZW2ldIDwtIHdoaWNoLm1heChTaW1wbGV4X01lZGl1bV9ZW1tpXV0kcmhvKQ0KfQ0KTWVkaXVtX0Jlc3RFX1kNCg0KI0NvbWJpbmluZyBpdCB3aXRoIHJlcGxpY2F0ZSBJRA0KTWVkaXVtX0lEX0Jlc3RFX1kgPC0gTlVMTA0KZm9yKGkgaW4gMTpsZW5ndGgoTWVkaXVtKSl7DQogIE1lZGl1bV9JRF9CZXN0RV9ZIDwtIHJiaW5kLmRhdGEuZnJhbWUoTWVkaXVtX0lEX0Jlc3RFX1ksIGNiaW5kKE1lZGl1bVtbaV1dWzEsIF0kSUQsIE1lZGl1bV9CZXN0RV9ZW2ldKSkNCn0NCg0KI2FkZGluZyBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKE1lZGl1bV9JRF9CZXN0RV9ZKSA8LSBjKCJJRCIsIkMubV9FIikNCk1lZGl1bV9JRF9CZXN0RV9ZDQpgYGANCg0KIyMjIyMjIEZvciBDYw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9NZWRpdW1fQSA8LSBsaXN0KCkgI2xpc3QgZm9yIGFzc2lnbmluZyByZXN1bHRzDQoNCiNFeGVjdXRpbmcgc2ltcGxleCgpDQpmb3IoaSBpbiAxOmxlbmd0aChNZWRpdW0pKXsNCiAgU2ltcGxleF9NZWRpdW1fQVtbaV1dIDwtIHNpbXBsZXgoTWVkaXVtW1tpXV0kQXp1a2lUb3RhbEwsIGxpYiA9IGMoMSwgbnJvdyhNZWRpdW1bW2ldXSkpLCBwcmVkID0gYyAoMSwgbnJvdyhNZWRpdW1bW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpNZWRpdW1fQmVzdEVfQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoU2ltcGxleF9NZWRpdW1fQSkpew0KICBNZWRpdW1fQmVzdEVfQVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9NZWRpdW1fQVtbaV1dJHJobykNCn0NCk1lZGl1bV9CZXN0RV9BDQoNCiNDb21iaW5pbmcgaXQgd2l0aCByZXBsaWNhdGUgSUQNCk1lZGl1bV9JRF9CZXN0RV9BIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKE1lZGl1bSkpew0KICBNZWRpdW1fSURfQmVzdEVfQSA8LSByYmluZC5kYXRhLmZyYW1lKE1lZGl1bV9JRF9CZXN0RV9BLCBjYmluZChNZWRpdW1bW2ldXVsxLCBdJElELCBNZWRpdW1fQmVzdEVfQVtpXSkpDQp9DQoNCiNhZGRpbmcgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhNZWRpdW1fSURfQmVzdEVfQSkgPC0gYygiSUQiLCJDLmNfRSIpDQpNZWRpdW1fSURfQmVzdEVfQQ0KYGBgDQoNCiMjIyMjIFs4LjEuMi4zXSBGb3IgTGFyZ2UgY2FnZXMNCg0KIyMjIyMjIEZvciBDbQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9MYXJnZV9ZIDwtIGxpc3QoKSAjbGlzdCBmb3IgYXNzaWduaW5nIHJlc3VsdHMNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKExhcmdlKSl7DQogIFNpbXBsZXhfTGFyZ2VfWVtbaV1dIDwtIHNpbXBsZXgoTGFyZ2VbW2ldXSRZb3RzdW1vblRvdGFsTCwgbGliID0gYygxLCBucm93KExhcmdlW1tpXV0pKSwgcHJlZCA9IGMgKDEsIG5yb3coTGFyZ2VbW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpMYXJnZV9CZXN0RV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X0xhcmdlX1kpKXsNCiAgTGFyZ2VfQmVzdEVfWVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9MYXJnZV9ZW1tpXV0kcmhvKQ0KfQ0KTGFyZ2VfQmVzdEVfWQ0KDQojQ29tYmluaW5nIGl0IHdpdGggcmVwbGljYXRlIElEDQpMYXJnZV9JRF9CZXN0RV9ZIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKExhcmdlKSl7DQogIExhcmdlX0lEX0Jlc3RFX1kgPC0gcmJpbmQuZGF0YS5mcmFtZShMYXJnZV9JRF9CZXN0RV9ZLCBjYmluZChMYXJnZVtbaV1dWzEsIF0kSUQsIExhcmdlX0Jlc3RFX1lbaV0pKQ0KfQ0KDQojYWRkaW5nIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoTGFyZ2VfSURfQmVzdEVfWSkgPC0gYygiSUQiLCJDLm1fRSIpDQpMYXJnZV9JRF9CZXN0RV9ZDQpgYGANCg0KIyMjIyMjIEZvciBDYw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9MYXJnZV9BIDwtIGxpc3QoKSAjbGlzdCBmb3IgYXNzaWduaW5nIHJlc3VsdHMNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKExhcmdlKSl7DQogIFNpbXBsZXhfTGFyZ2VfQVtbaV1dIDwtIHNpbXBsZXgoTGFyZ2VbW2ldXSRBenVraVRvdGFsTCwgbGliID0gYygxLCBucm93KExhcmdlW1tpXV0pKSwgcHJlZCA9IGMgKDEsIG5yb3coTGFyZ2VbW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpMYXJnZV9CZXN0RV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X0xhcmdlX0EpKXsNCiAgTGFyZ2VfQmVzdEVfQVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9MYXJnZV9BW1tpXV0kcmhvKQ0KfQ0KTGFyZ2VfQmVzdEVfQQ0KDQojQ29tYmluaW5nIGl0IHdpdGggcmVwbGljYXRlIElEDQpMYXJnZV9JRF9CZXN0RV9BIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKExhcmdlKSl7DQogIExhcmdlX0lEX0Jlc3RFX0EgPC0gcmJpbmQuZGF0YS5mcmFtZShMYXJnZV9JRF9CZXN0RV9BLCBjYmluZChMYXJnZVtbaV1dWzEsIF0kSUQsIExhcmdlX0Jlc3RFX0FbaV0pKQ0KfQ0KDQojYWRkaW5nIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoTGFyZ2VfSURfQmVzdEVfQSkgPC0gYygiSUQiLCJDLmNfRSIpDQpMYXJnZV9JRF9CZXN0RV9BDQpgYGANCg0KIyMjIyMgWzguMS4yLjRdIEZvciBIdWdlIGNhZ2VzDQoNCiMjIyMjIyBGb3IgQ20NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NClNpbXBsZXhfSHVnZV9ZIDwtIGxpc3QoKSAjbGlzdCBmb3IgYXNzaWduaW5nIHJlc3VsdHMNCg0KI0V4ZWN1dGluZyBzaW1wbGV4KCkNCmZvcihpIGluIDE6bGVuZ3RoKEh1Z2UpKXsNCiAgU2ltcGxleF9IdWdlX1lbW2ldXSA8LSBzaW1wbGV4KEh1Z2VbW2ldXSRZb3RzdW1vblRvdGFsTCwgbGliID0gYygxLCBucm93KEh1Z2VbW2ldXSkpLCBwcmVkID0gYyAoMSwgbnJvdyhIdWdlW1tpXV0pKSwgRSA9IGMoMToxMCkpDQp9DQoNCiNQaWNraW5nIHVwIHRoZSBvcHRpbWFsIGVtYmVkZGluZyBkaW1lbnNpb24gKEUqKQ0KSHVnZV9CZXN0RV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTaW1wbGV4X0h1Z2VfWSkpew0KICBIdWdlX0Jlc3RFX1lbaV0gPC0gd2hpY2gubWF4KFNpbXBsZXhfSHVnZV9ZW1tpXV0kcmhvKQ0KfQ0KSHVnZV9CZXN0RV9ZDQoNCiNDb21iaW5pbmcgaXQgd2l0aCByZXBsaWNhdGUgSUQNCkh1Z2VfSURfQmVzdEVfWSA8LSBOVUxMDQpmb3IoaSBpbiAxOmxlbmd0aChIdWdlKSl7DQogIEh1Z2VfSURfQmVzdEVfWSA8LSByYmluZC5kYXRhLmZyYW1lKEh1Z2VfSURfQmVzdEVfWSwgY2JpbmQoSHVnZVtbaV1dWzEsIF0kSUQsIEh1Z2VfQmVzdEVfWVtpXSkpDQp9DQoNCiNhZGRpbmcgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhIdWdlX0lEX0Jlc3RFX1kpIDwtIGMoIklEIiwiQy5tX0UiKQ0KSHVnZV9JRF9CZXN0RV9ZDQpgYGANCg0KIyMjIyMjIEZvciBDYw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU2ltcGxleF9IdWdlX0EgPC0gbGlzdCgpICNsaXN0IGZvciBhc3NpZ25pbmcgcmVzdWx0cw0KDQojRXhlY3V0aW5nIHNpbXBsZXgoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoSHVnZSkpew0KICBTaW1wbGV4X0h1Z2VfQVtbaV1dIDwtIHNpbXBsZXgoSHVnZVtbaV1dJEF6dWtpVG90YWxMLCBsaWIgPSBjKDEsIG5yb3coSHVnZVtbaV1dKSksIHByZWQgPSBjICgxLCBucm93KEh1Z2VbW2ldXSkpLCBFID0gYygxOjEwKSkNCn0NCg0KI1BpY2tpbmcgdXAgdGhlIG9wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiAoRSopDQpIdWdlX0Jlc3RFX0EgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKFNpbXBsZXhfSHVnZV9BKSl7DQogIEh1Z2VfQmVzdEVfQVtpXSA8LSB3aGljaC5tYXgoU2ltcGxleF9IdWdlX0FbW2ldXSRyaG8pDQp9DQpIdWdlX0Jlc3RFX0ENCg0KI0NvbWJpbmluZyBpdCB3aXRoIHJlcGxpY2F0ZSBJRA0KSHVnZV9JRF9CZXN0RV9BIDwtIE5VTEwNCmZvcihpIGluIDE6bGVuZ3RoKEh1Z2UpKXsNCiAgSHVnZV9JRF9CZXN0RV9BIDwtIHJiaW5kLmRhdGEuZnJhbWUoSHVnZV9JRF9CZXN0RV9BLCBjYmluZChIdWdlW1tpXV1bMSwgXSRJRCwgSHVnZV9CZXN0RV9BW2ldKSkNCn0NCg0KI2FkZGluZyBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKEh1Z2VfSURfQmVzdEVfQSkgPC0gYygiSUQiLCJDLmNfRSIpDQpIdWdlX0lEX0Jlc3RFX0ENCmBgYA0KDQojIyMjIFs4LjEuM10gU3VtbWFyaXppbmcgc2ltcGxleCBwcm9qZWN0aW9uIGZvciBlYWNoIHJlcGxpY2F0ZQ0KDQojIyMjIyBbOC4xLjMuMV0gU3VtbWFyaXppbmcgdGhlIG9wdGltYWwgRQ0KDQpgYGB7cn0NCiNGb3IgU21hbGwNClNtYWxsX0lEX0Jlc3RFIDwtIG1lcmdlKFNtYWxsX0lEX0Jlc3RFX1ksIFNtYWxsX0lEX0Jlc3RFX0EsIGJ5ID0gIklEIikNClNtYWxsX0lEX0Jlc3RFDQoNCiNGb3IgTWVkaXVtDQpNZWRpdW1fSURfQmVzdEUgPC0gbWVyZ2UoTWVkaXVtX0lEX0Jlc3RFX1ksIE1lZGl1bV9JRF9CZXN0RV9BLCBieSA9ICJJRCIpDQpNZWRpdW1fSURfQmVzdEUNCg0KI0ZvciBMYXJnZQ0KTGFyZ2VfSURfQmVzdEUgPC0gbWVyZ2UoTGFyZ2VfSURfQmVzdEVfWSwgTGFyZ2VfSURfQmVzdEVfQSwgYnkgPSAiSUQiKQ0KTGFyZ2VfSURfQmVzdEUNCg0KI0ZvciBIdWdlDQpIdWdlX0lEX0Jlc3RFIDwtIG1lcmdlKEh1Z2VfSURfQmVzdEVfWSwgSHVnZV9JRF9CZXN0RV9BLCBieSA9ICJJRCIpDQpIdWdlX0lEX0Jlc3RFDQoNCmBgYA0KDQojIyMjIyBbOC4xLjMuMl0gRGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBOQSB0byBiZSBpbnNlcnRlZCBmb3IgdGhlIHN1YnNlcXVlbmNlIGFuYWx5c2lzIChjb21iaW5pbmcgc2V2ZXJhbCByZXBsaWNhdGVzKQ0KDQpgYGB7cn0NCmNvbV9TbWFsbF9FIDwtIGFwcGx5KFNtYWxsX0lEX0Jlc3RFWywgLTFdLCAxLCBtYXgpDQpjb21fTWVkaXVtX0UgPC0gYXBwbHkoTWVkaXVtX0lEX0Jlc3RFWywgLTFdLCAxLCBtYXgpDQpjb21fTGFyZ2VfRSA8LSBhcHBseShMYXJnZV9JRF9CZXN0RVssIC0xXSwgMSwgbWF4KQ0KY29tX0h1Z2VfRSA8LSBhcHBseShIdWdlX0lEX0Jlc3RFWywgLTFdLCAxLCBtYXgpDQpjb21fU21hbGxfRQ0KY29tX01lZGl1bV9FDQpjb21fTGFyZ2VfRQ0KY29tX0h1Z2VfRQ0KYGBgDQoNCiMjIyMjIFs4LjEuMy4zXSBNZXJnaW5nIHRoZSBvcHRpbWFsIEUgYW5kIHRoZSBudW1iZXIgb2YgTkEsY29tYmluaW5nIHdpdGggdGhlIGNvZXhpc3RlbmNlIHBlcmlvZHMgKGZyb20gVGFibGUgUzEpDQoNCmBgYHtyfQ0KI01lcmdpbmcgdGhlIG9wdGltYWwgRSBhbmQgdGhlIG51bWJlciBvZiBOQQ0KU21hbGxfSURfQmVzdEVfTkEgPC0gZGF0YS5mcmFtZShTbWFsbF9JRF9CZXN0RSwgTm8uTkEgPSBjb21fU21hbGxfRSkNCk1lZGl1bV9JRF9CZXN0RV9OQSA8LSBkYXRhLmZyYW1lKE1lZGl1bV9JRF9CZXN0RSwgTm8uTkEgPSBjb21fTWVkaXVtX0UpDQpMYXJnZV9JRF9CZXN0RV9OQSA8LSBkYXRhLmZyYW1lKExhcmdlX0lEX0Jlc3RFLCBOby5OQSA9IGNvbV9MYXJnZV9FKQ0KSHVnZV9JRF9CZXN0RV9OQSA8LSBkYXRhLmZyYW1lKEh1Z2VfSURfQmVzdEUsIE5vLk5BID0gY29tX0h1Z2VfRSkNCiNleGFtcGxlDQpIdWdlX0lEX0Jlc3RFX05BDQoNCiNNZXJnaW5nIGl0IHdpdGggdGhlIGNvZXhpc3RlbmNlIHBlcmlvZA0KU21hbGxUYWJsZTFiYXNlIDwtIG1lcmdlKHN1YnNldChUYWJsZVMxLFRhYmxlUzEkQ2FnZS5TaXplID09ICJTbWFsbCIsIHNlbGVjdCA9IGMoSUQsIENvZXhpc3RlbmNlX3BlcmlvZHMpKSwgU21hbGxfSURfQmVzdEVfTkEsIGJ5ID0gIklEIikNCk1lZGl1bVRhYmxlMWJhc2UgPC0gbWVyZ2Uoc3Vic2V0KFRhYmxlUzEsVGFibGVTMSRDYWdlLlNpemUgPT0gIk1lZGl1bSIsIHNlbGVjdCA9IGMoSUQsIENvZXhpc3RlbmNlX3BlcmlvZHMpKSwgTWVkaXVtX0lEX0Jlc3RFX05BLCBieSA9ICJJRCIpDQpMYXJnZVRhYmxlMWJhc2UgPC0gbWVyZ2Uoc3Vic2V0KFRhYmxlUzEsVGFibGVTMSRDYWdlLlNpemUgPT0gIkxhcmdlIiwgc2VsZWN0ID0gYyhJRCwgQ29leGlzdGVuY2VfcGVyaW9kcykpLCBMYXJnZV9JRF9CZXN0RV9OQSwgYnkgPSAiSUQiKQ0KSHVnZVRhYmxlMWJhc2UgPC0gbWVyZ2Uoc3Vic2V0KFRhYmxlUzEsVGFibGVTMSRDYWdlLlNpemUgPT0gIkh1Z2UiLCBzZWxlY3QgPSBjKElELCBDb2V4aXN0ZW5jZV9wZXJpb2RzKSksIEh1Z2VfSURfQmVzdEVfTkEsIGJ5ID0gIklEIikNCiNleGFtcGxlIA0KTGFyZ2VUYWJsZTFiYXNlDQpgYGANCg0KIyMjIFs4LjJdIEVETSBhbmFseXNpcyBmb3IgdGhlIGNvbWJpbmVkIHJlcGxpY2F0ZXMgdGhhdCBpbmNsdWRlIFw+PSAzNSBwb2ludHMNCg0KIyMjIyBbOC4yLjFdIERldGVybWluaW5nIGhvdyB0byBjb21iaW5lIGVhY2ggcmVwbGljYXRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIGNvbWJpbmVkIHRpbWUgc2VyaWVzIGxvbmdlciB0aGFuIG9yIGVxdWFsIHRvIDM1IHBvaW50cw0KDQotLSBOb3RpbmcgdGhhdCB0aGUgbGVuZ3RoIG9mIGVhY2ggcmVwbGljYXRlIGlzIGVxdWFsIHRvIHRoZSBjb2V4aXN0ZW5jZSBwZXJpb2QgKyAxDQoNCi0tIFRoZXJlZm9yZSwgMSkgd2hlbiB0aGUgbnVtYmVyIG9mIGNvZXhpc3RlbmNlIHdlZWtzIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjM0IiwgdGhlIGNvbWJpbmluZyB3aXRoIG90aGVyIHJlcGxpY2F0ZXMgaXMgbm90IG5lZWRlZCwgYnV0IDIpIGZvciB0aGUgbnVtYmVyIG9mIHRoZSBzdW0gb2YgdGhlIGNvZXhpc3RlbmNlIHBlcmlvZCBmb3IgdGhlIGNvbWJpbmVkIHJlcGxpY2F0ZSBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gIjMzIiB3ZWVrcw0KDQojIyMjIyBbOC4yLjEuMV0gRm9yIFNtYWxsDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojRGVzY2VuZGluZyBvcmRlciAmIGxhYmVsaW5nIHJlcGxpY2F0ZXMNClNtYWxsVGFibGUxYmFzZV9tIDwtIFNtYWxsVGFibGUxYmFzZVtvcmRlcihTbWFsbFRhYmxlMWJhc2UkQ29leGlzdGVuY2VfcGVyaW9kcyxkZWNyZWFzaW5nID0gVFJVRSksXQ0KU21hbGxUYWJsZTFiYXNlX20NCklEX2NvbWJpbmVkIDwtIGMocmVwKCJTMSIsIDIpLCByZXAoIlMyIiwgMiksIHJlcCgiUzMiLCAyKSwgcmVwKCJTNCIsIDMpLCByZXAoIlM1IiwgMyksIHJlcCgiUzYiLCA0KSkNClNtYWxsVGFibGUxYmFzZV9tIDwtIGNiaW5kLmRhdGEuZnJhbWUoSURfY29tYmluZWQsIFNtYWxsVGFibGUxYmFzZV9tKQ0KU21hbGxUYWJsZTFiYXNlX20NCmBgYA0KDQojIyMjIyBbOC4yLjEuMl0gRm9yIE1lZGl1bQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0Rlc2NlbmRpbmcgb3JkZXIgJiBsYWJlbGluZyByZXBsaWNhdGVzDQpNZWRpdW1UYWJsZTFiYXNlX20gPC0gTWVkaXVtVGFibGUxYmFzZVtvcmRlcihNZWRpdW1UYWJsZTFiYXNlJENvZXhpc3RlbmNlX3BlcmlvZHMsZGVjcmVhc2luZyA9IFRSVUUpLF0NCk1lZGl1bVRhYmxlMWJhc2VfbQ0KSURfY29tYmluZWQgPC0gYyhyZXAoIk0xIiwgMSksIHJlcCgiTTIiLCAyKSwgcmVwKCJNMyIsIDIpLCByZXAoIk00IiwgMiksIHJlcCgiTTUiLCAyKSwgcmVwKCJNNiIsIDMpLCByZXAoIk03IiwgNCkpDQpNZWRpdW1UYWJsZTFiYXNlX20gPC0gY2JpbmQuZGF0YS5mcmFtZShJRF9jb21iaW5lZCwgTWVkaXVtVGFibGUxYmFzZV9tKQ0KTWVkaXVtVGFibGUxYmFzZV9tDQpgYGANCg0KIyMjIyMgWzguMi4xLjNdIEZvciBMYXJnZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0Rlc2NlbmRpbmcgb3JkZXIgJiBsYWJlbGluZyByZXBsaWNhdGVzDQpMYXJnZVRhYmxlMWJhc2VfbSA8LSBMYXJnZVRhYmxlMWJhc2Vbb3JkZXIoTGFyZ2VUYWJsZTFiYXNlJENvZXhpc3RlbmNlX3BlcmlvZHMsZGVjcmVhc2luZyA9IFRSVUUpLF0NCkxhcmdlVGFibGUxYmFzZV9tDQpJRF9jb21iaW5lZCA8LSBjKHJlcCgiTDEiLCAxKSwgcmVwKCJMMiIsIDEpLCByZXAoIkwzIiwgMiksIHJlcCgiTDQiLCAyKSwgcmVwKCJMNSIsIDIpLCByZXAoIkw2IiwgMiksIHJlcCgiTDciLCAyKSwgcmVwKCJMOCIsIDQpKQ0KTGFyZ2VUYWJsZTFiYXNlX20gPC0gY2JpbmQuZGF0YS5mcmFtZShJRF9jb21iaW5lZCwgTGFyZ2VUYWJsZTFiYXNlX20pDQpMYXJnZVRhYmxlMWJhc2VfbQ0KYGBgDQoNCiMjIyMjIFs4LjIuMS40XSBGb3IgSHVnZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0Rlc2NlbmRpbmcgb3JkZXIgJiBsYWJlbGluZyByZXBsaWNhdGVzDQpIdWdlVGFibGUxYmFzZV9tIDwtIEh1Z2VUYWJsZTFiYXNlW29yZGVyKEh1Z2VUYWJsZTFiYXNlJENvZXhpc3RlbmNlX3BlcmlvZHMsZGVjcmVhc2luZyA9IFRSVUUpLF0NCkh1Z2VUYWJsZTFiYXNlX20NCklEX2NvbWJpbmVkIDwtIGMocmVwKCJIMSIsIDEpLCByZXAoIkgyIiwgMiksIHJlcCgiSDMiLCAyKSwgcmVwKCJINCIsIDIpLCByZXAoIkg1IiwgMiksIHJlcCgiSDYiLCAyKSwgcmVwKCJINyIsIDIpLCByZXAoIkg4IiwgMykpDQpIdWdlVGFibGUxYmFzZV9tIDwtIGNiaW5kLmRhdGEuZnJhbWUoSURfY29tYmluZWQsIEh1Z2VUYWJsZTFiYXNlX20pDQpIdWdlVGFibGUxYmFzZV9tDQpgYGANCg0KIyMjIyBbOC4yLjJdIENvbWJpbmluZyByZXBsaWNhdGVzIGZvciBFRE0gYW5hbHlzaXMNCg0KIyMjIyMgWzguMi4yLjFdIEZvciBTbWFsbA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU19jb21iaW5lZF9ZIDwtIGxpc3QoKQ0KU19jb21iaW5lZF9BIDwtIGxpc3QoKQ0KU19pZF9jb21iIDwtIGMoIlMxIiwgIlMyIiwgIlMzIiwgIlM0IiwgIlM1IiwgIlM2IikNCg0KI1MxLVMzOiBjb21iaW5pbmcgdHdvIHJlcGxpY2F0ZXMNCmZvcihpIGluIDE6Mykgew0KICNkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIE5BIHRvIGJlIGFkZGVkICANCiBub19OQV9pbnNlcnRlZCA8LSBtYXgoc3Vic2V0KFNtYWxsVGFibGUxYmFzZV9tLCBTbWFsbFRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBTX2lkX2NvbWJbaV0sIHNlbGVjdCA9IE5vLk5BKSkNCiAjbGlzdGluZyB0aGUgcmVwbGljYXRlIElEcyB1c2VkIGZvciBpLXRoIGNvbWJpbmVkIHJlcGxpY2F0ZXMNCiBpZF9lYWNoIDwtIHN1YnNldChTbWFsbFRhYmxlMWJhc2VfbSwgU21hbGxUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gU19pZF9jb21iW2ldLCBzZWxlY3QgPSBJRCkNCiANCiBTX2NvbWJpbmVkX1lbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kWW90c3Vtb25Ub3RhbEwpDQogDQogU19jb21iaW5lZF9BW1tpXV0gPC0gYyhzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJEF6dWtpVG90YWxMLCByZXAoTkEsbm9fTkFfaW5zZXJ0ZWQpLCBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzIsXSxdJEF6dWtpVG90YWxMKQ0KfQ0KI1M0LVM1OiBjb21iaW5pbmcgdGhyZWUgcmVwbGljYXRlcw0KZm9yKGkgaW4gNDo1KSB7DQogbm9fTkFfaW5zZXJ0ZWQgPC0gbWF4KHN1YnNldChTbWFsbFRhYmxlMWJhc2VfbSwgU21hbGxUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gU19pZF9jb21iW2ldLCBzZWxlY3QgPSBOby5OQSkpDQogaWRfZWFjaCA8LSBzdWJzZXQoU21hbGxUYWJsZTFiYXNlX20sIFNtYWxsVGFibGUxYmFzZV9tJElEX2NvbWJpbmVkID09IFNfaWRfY29tYltpXSwgc2VsZWN0ID0gSUQpDQogDQogU19jb21iaW5lZF9ZW1tpXV0gPC0gYyhzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJFlvdHN1bW9uVG90YWxMLCByZXAoTkEsbm9fTkFfaW5zZXJ0ZWQpLCBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzIsXSxdJFlvdHN1bW9uVG90YWxMLCByZXAoTkEsbm9fTkFfaW5zZXJ0ZWQpLCBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzMsXSxdJFlvdHN1bW9uVG90YWxMKQ0KIA0KIFNfY29tYmluZWRfQVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRBenVraVRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRBenVraVRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRBenVraVRvdGFsTCkNCn0NCiNTNjogY29tYmluaW5nIGZvdXIgcmVwbGljYXRlcw0KaSA8LSA2DQpub19OQV9pbnNlcnRlZCA8LSBtYXgoc3Vic2V0KFNtYWxsVGFibGUxYmFzZV9tLCBTbWFsbFRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBTX2lkX2NvbWJbaV0sIHNlbGVjdCA9IE5vLk5BKSkNCmlkX2VhY2ggPC0gc3Vic2V0KFNtYWxsVGFibGUxYmFzZV9tLCBTbWFsbFRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBTX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KIA0KIFNfY29tYmluZWRfWVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFs0LF0sXSRZb3RzdW1vblRvdGFsTCkNCiANCiBTX2NvbWJpbmVkX0FbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMyxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbNCxdLF0kQXp1a2lUb3RhbEwpDQoNCiNleGFtcGxlIA0KIFNfY29tYmluZWRfWQ0KYGBgDQoNCiMjIyMjIFs4LjIuMi4yXSBGb3IgTWVkaXVtDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpNX2NvbWJpbmVkX1kgPC0gbGlzdCgpDQpNX2NvbWJpbmVkX0EgPC0gbGlzdCgpDQpNX2lkX2NvbWIgPC0gYygiTTEiLCAiTTIiLCAiTTMiLCAiTTQiLCAiTTUiLCAiTTYiLCAiTTciKQ0KDQojTTE6IG5vIG5lZWQgZm9yIGNvbWJpbmluZw0KaSA8LSAxDQppZF9lYWNoIDwtIHN1YnNldChNZWRpdW1UYWJsZTFiYXNlX20sIE1lZGl1bVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBNX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KDQpNX2NvbWJpbmVkX1lbW2ldXSA8LSBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJFlvdHN1bW9uVG90YWxMDQoNCk1fY29tYmluZWRfQVtbaV1dIDwtIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwNCg0KI00yLU01OiBjb21iaW5pbmcgdHdvIHJlcGxpY2F0ZXMNCmZvcihpIGluIDI6NSkgew0KIG5vX05BX2luc2VydGVkIDwtIG1heChzdWJzZXQoTWVkaXVtVGFibGUxYmFzZV9tLCBNZWRpdW1UYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gTV9pZF9jb21iW2ldLCBzZWxlY3QgPSBOby5OQSkpDQogaWRfZWFjaCA8LSBzdWJzZXQoTWVkaXVtVGFibGUxYmFzZV9tLCBNZWRpdW1UYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gTV9pZF9jb21iW2ldLCBzZWxlY3QgPSBJRCkNCiANCiBNX2NvbWJpbmVkX1lbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kWW90c3Vtb25Ub3RhbEwpDQogDQogTV9jb21iaW5lZF9BW1tpXV0gPC0gYyhzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJEF6dWtpVG90YWxMLCByZXAoTkEsbm9fTkFfaW5zZXJ0ZWQpLCBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzIsXSxdJEF6dWtpVG90YWxMKQ0KfQ0KI002OiBjb21iaW5pbmcgdGhyZWUgcmVwbGljYXRlcw0KZm9yKGkgaW4gNjo2KSB7DQogbm9fTkFfaW5zZXJ0ZWQgPC0gbWF4KHN1YnNldChNZWRpdW1UYWJsZTFiYXNlX20sIE1lZGl1bVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBNX2lkX2NvbWJbaV0sIHNlbGVjdCA9IE5vLk5BKSkNCiBpZF9lYWNoIDwtIHN1YnNldChNZWRpdW1UYWJsZTFiYXNlX20sIE1lZGl1bVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBNX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KIA0KIE1fY29tYmluZWRfWVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRZb3RzdW1vblRvdGFsTCkNCiANCiBNX2NvbWJpbmVkX0FbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMyxdLF0kQXp1a2lUb3RhbEwpDQp9DQojTTc6IGNvbWJpbmluZyBmb3VyIHJlcGxpY2F0ZXMNCmkgPC0gNw0Kbm9fTkFfaW5zZXJ0ZWQgPC0gbWF4KHN1YnNldChNZWRpdW1UYWJsZTFiYXNlX20sIE1lZGl1bVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBNX2lkX2NvbWJbaV0sIHNlbGVjdCA9IE5vLk5BKSkNCmlkX2VhY2ggPC0gc3Vic2V0KE1lZGl1bVRhYmxlMWJhc2VfbSwgTWVkaXVtVGFibGUxYmFzZV9tJElEX2NvbWJpbmVkID09IE1faWRfY29tYltpXSwgc2VsZWN0ID0gSUQpDQogDQpNX2NvbWJpbmVkX1lbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMyxdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbNCxdLF0kWW90c3Vtb25Ub3RhbEwpDQogDQpNX2NvbWJpbmVkX0FbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMyxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbNCxdLF0kQXp1a2lUb3RhbEwpDQoNCiNleGFtcGxlIA0KTV9jb21iaW5lZF9BDQpgYGANCg0KIyMjIyMgWzguMi4yLjNdIEZvciBMYXJnZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTF9jb21iaW5lZF9ZIDwtIGxpc3QoKQ0KTF9jb21iaW5lZF9BIDwtIGxpc3QoKQ0KTF9pZF9jb21iIDwtIGMoIkwxIiwgIkwyIiwgIkwzIiwgIkw0IiwgIkw1IiwgIkw2IiwgIkw3IiwgIkw4IikNCg0KI0wxLUwyOiBubyBuZWVkIGZvciBjb21iaW5pbmcNCmZvcihpIGluIDE6Mil7DQogIGlkX2VhY2ggPC0gc3Vic2V0KExhcmdlVGFibGUxYmFzZV9tLCBMYXJnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBMX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KDQogIExfY29tYmluZWRfWVtbaV1dIDwtIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kWW90c3Vtb25Ub3RhbEwNCg0KICBMX2NvbWJpbmVkX0FbW2ldXSA8LSBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJEF6dWtpVG90YWxMDQp9DQoNCiNMMy1MNzogY29tYmluaW5nIHR3byByZXBsaWNhdGVzDQpmb3IoaSBpbiAzOjcpIHsNCiBub19OQV9pbnNlcnRlZCA8LSBtYXgoc3Vic2V0KExhcmdlVGFibGUxYmFzZV9tLCBMYXJnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBMX2lkX2NvbWJbaV0sIHNlbGVjdCA9IE5vLk5BKSkNCiBpZF9lYWNoIDwtIHN1YnNldChMYXJnZVRhYmxlMWJhc2VfbSwgTGFyZ2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gTF9pZF9jb21iW2ldLCBzZWxlY3QgPSBJRCkNCiANCiBMX2NvbWJpbmVkX1lbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kWW90c3Vtb25Ub3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kWW90c3Vtb25Ub3RhbEwpDQogDQogTF9jb21iaW5lZF9BW1tpXV0gPC0gYyhzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJEF6dWtpVG90YWxMLCByZXAoTkEsbm9fTkFfaW5zZXJ0ZWQpLCBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzIsXSxdJEF6dWtpVG90YWxMKQ0KfQ0KDQojTDg6IGNvbWJpbmluZyBmb3VyIHJlcGxpY2F0ZXMNCmkgPC0gOA0Kbm9fTkFfaW5zZXJ0ZWQgPC0gbWF4KHN1YnNldChMYXJnZVRhYmxlMWJhc2VfbSwgTGFyZ2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gTF9pZF9jb21iW2ldLCBzZWxlY3QgPSBOby5OQSkpDQppZF9lYWNoIDwtIHN1YnNldChMYXJnZVRhYmxlMWJhc2VfbSwgTGFyZ2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gTF9pZF9jb21iW2ldLCBzZWxlY3QgPSBJRCkNCiANCkxfY29tYmluZWRfWVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFs0LF0sXSRZb3RzdW1vblRvdGFsTCkNCiANCkxfY29tYmluZWRfQVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRBenVraVRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRBenVraVRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRBenVraVRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFs0LF0sXSRBenVraVRvdGFsTCkNCg0KI2V4YW1wbGUgDQpMX2NvbWJpbmVkX1kNCmBgYA0KDQojIyMjIyBbOC4yLjIuNF0gRm9yIEh1Z2UNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkhfY29tYmluZWRfWSA8LSBsaXN0KCkNCkhfY29tYmluZWRfQSA8LSBsaXN0KCkNCkhfaWRfY29tYiA8LSBjKCJIMSIsICJIMiIsICJIMyIsICJINCIsICJINSIsICJINiIsICJINyIsICJIOCIpDQoNCiNIMTogbm8gbmVlZCBmb3IgY29tYmluaW5nDQppIDwtIDENCmlkX2VhY2ggPC0gc3Vic2V0KEh1Z2VUYWJsZTFiYXNlX20sIEh1Z2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gSF9pZF9jb21iW2ldLCBzZWxlY3QgPSBJRCkNCg0KSF9jb21iaW5lZF9ZW1tpXV0gPC0gc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTA0KDQpIX2NvbWJpbmVkX0FbW2ldXSA8LSBzaGF2ZWRhdGFmcmFtZVtzaGF2ZWRhdGFmcmFtZSRJRCA9PSBpZF9lYWNoWzEsXSxdJEF6dWtpVG90YWxMDQoNCiNIMi1INzogY29tYmluaW5nIHR3byByZXBsaWNhdGVzDQpmb3IoaSBpbiAyOjcpIHsNCiBub19OQV9pbnNlcnRlZCA8LSBtYXgoc3Vic2V0KEh1Z2VUYWJsZTFiYXNlX20sIEh1Z2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gSF9pZF9jb21iW2ldLCBzZWxlY3QgPSBOby5OQSkpDQogaWRfZWFjaCA8LSBzdWJzZXQoSHVnZVRhYmxlMWJhc2VfbSwgSHVnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBIX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KIA0KIEhfY29tYmluZWRfWVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRZb3RzdW1vblRvdGFsTCkNCiANCiBIX2NvbWJpbmVkX0FbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kQXp1a2lUb3RhbEwpDQp9DQojSDg6IGNvbWJpbmluZyB0aHJlZSByZXBsaWNhdGVzDQpmb3IoaSBpbiA4OjgpIHsNCiBub19OQV9pbnNlcnRlZCA8LSBtYXgoc3Vic2V0KEh1Z2VUYWJsZTFiYXNlX20sIEh1Z2VUYWJsZTFiYXNlX20kSURfY29tYmluZWQgPT0gSF9pZF9jb21iW2ldLCBzZWxlY3QgPSBOby5OQSkpDQogaWRfZWFjaCA8LSBzdWJzZXQoSHVnZVRhYmxlMWJhc2VfbSwgSHVnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCA9PSBIX2lkX2NvbWJbaV0sIHNlbGVjdCA9IElEKQ0KIA0KIEhfY29tYmluZWRfWVtbaV1dIDwtIGMoc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsxLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFsyLF0sXSRZb3RzdW1vblRvdGFsTCwgcmVwKE5BLG5vX05BX2luc2VydGVkKSwgc2hhdmVkYXRhZnJhbWVbc2hhdmVkYXRhZnJhbWUkSUQgPT0gaWRfZWFjaFszLF0sXSRZb3RzdW1vblRvdGFsTCkNCiANCiBIX2NvbWJpbmVkX0FbW2ldXSA8LSBjKHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMSxdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMixdLF0kQXp1a2lUb3RhbEwsIHJlcChOQSxub19OQV9pbnNlcnRlZCksIHNoYXZlZGF0YWZyYW1lW3NoYXZlZGF0YWZyYW1lJElEID09IGlkX2VhY2hbMyxdLF0kQXp1a2lUb3RhbEwpDQp9DQojZXhhbXBsZSANCkhfY29tYmluZWRfWQ0KYGBgDQoNCiMjIyMgWzguMi4zXSBDYWxjdWxhdGluZyB0aGUgbWVhbiBjb2V4aXN0ZW5jZSB3ZWVrDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTX2NvbWJpbmVkX21lYW5fY293ZWVrIDwtIHRhcHBseShTbWFsbFRhYmxlMWJhc2VfbSRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBTbWFsbFRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCwgbWVhbikNCk1fY29tYmluZWRfbWVhbl9jb3dlZWsgPC0gdGFwcGx5KE1lZGl1bVRhYmxlMWJhc2VfbSRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBNZWRpdW1UYWJsZTFiYXNlX20kSURfY29tYmluZWQsIG1lYW4pDQpMX2NvbWJpbmVkX21lYW5fY293ZWVrIDwtIHRhcHBseShMYXJnZVRhYmxlMWJhc2VfbSRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBMYXJnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCwgbWVhbikNCkhfY29tYmluZWRfbWVhbl9jb3dlZWsgPC0gdGFwcGx5KEh1Z2VUYWJsZTFiYXNlX20kQ29leGlzdGVuY2VfcGVyaW9kcywgSHVnZVRhYmxlMWJhc2VfbSRJRF9jb21iaW5lZCwgbWVhbikNCg0KU19jb21iaW5lZF9tZWFuX2Nvd2Vlaw0KTV9jb21iaW5lZF9tZWFuX2Nvd2Vlaw0KTF9jb21iaW5lZF9tZWFuX2Nvd2Vlaw0KSF9jb21iaW5lZF9tZWFuX2Nvd2Vlaw0KYGBgDQoNCiMjIyMgWzguMi40XSBEZXRlcm1pbmluZyB0aGUgb3B0aW1hbCBFLCBvcHRpbWFsIHRoZXRhLCBhbmQgZGVsdGEtcmhvIGZvciB0aGUgY29tYmluZWQgcmVwbGljYXRlcw0KDQojIyMjIyBbOC4yLjQuMV0gRm9yIFNtYWxsDQoNCiMjIyMjIyBGb3IgQ20NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NClNtYWxsX2NvbWJpbmVkX1lfc2ltcGxleCA8LSBsaXN0KCkNClNtYWxsX2NvbWJpbmVkX1lfc21hcCA8LSBsaXN0KCkNCmxlbmd0aChTX2lkX2NvbWIpDQojRXhlY3V0aW5nIHNpbXBsZXggcHJvamVjdGlvbg0KZm9yKGkgaW4gMTpsZW5ndGgoU19pZF9jb21iKSl7DQogIFNtYWxsX2NvbWJpbmVkX1lfc2ltcGxleFtbaV1dIDwtIHNpbXBsZXgoU19jb21iaW5lZF9ZW1tpXV0sbGliID0gYygxLGxlbmd0aChTX2NvbWJpbmVkX1lbW2ldXSkpLCBwcmVkID0gYygxLGxlbmd0aChTX2NvbWJpbmVkX1lbW2ldXSkpLCBFID0gYygxOjEwKSwgc2lsZW50ID0gVFJVRSkNCn0NCg0KI0NhbGN1bGF0aW5nIG9wdGltYWwgRQ0KU21hbGxfY29tYmluZWRfRV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTX2lkX2NvbWIpKXsNCiAgU21hbGxfY29tYmluZWRfRV9ZW2ldIDwtIHdoaWNoLm1heChTbWFsbF9jb21iaW5lZF9ZX3NpbXBsZXhbW2ldXSRyaG8pDQp9DQoNCiNFeGVjdXRpbmcgdW5pdmFyaWF0ZSBTLW1hcA0KZm9yKGkgaW4gMTpsZW5ndGgoU19pZF9jb21iKSl7DQogIFNtYWxsX2NvbWJpbmVkX1lfc21hcFtbaV1dIDwtIHNfbWFwKFNfY29tYmluZWRfWVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoU19jb21iaW5lZF9ZW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoU19jb21iaW5lZF9ZW1tpXV0pKSxFID0gU21hbGxfY29tYmluZWRfRV9ZW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KU21hbGxfY29tYmluZWRfdGhldGFfWSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoU19pZF9jb21iKSl7DQogIFNtYWxsX2NvbWJpbmVkX3RoZXRhX1lbaV0gPC0gU21hbGxfY29tYmluZWRfWV9zbWFwW1tpXV1bd2hpY2gubWF4KFNtYWxsX2NvbWJpbmVkX1lfc21hcFtbaV1dJHJobyksXSR0aGV0YQ0KfQ0KI0NhbGN1bGF0aW5nIGRlbHRhLXJobywgbWF4aW11bSBtaW51cyBtaW5pbXVtDQpTbWFsbF9jb21iaW5lZF9kZWx0YXJob19ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChTX2lkX2NvbWIpKXsNCiAgU21hbGxfY29tYmluZWRfZGVsdGFyaG9fWVtpXSA8LSBtYXgoU21hbGxfY29tYmluZWRfWV9zbWFwW1tpXV0kcmhvKSAtIFNtYWxsX2NvbWJpbmVkX1lfc21hcFtbaV1dJHJob1sxXQ0KfQ0KDQpTbWFsbF9jb21iaW5lZF9FX1kNClNtYWxsX2NvbWJpbmVkX3RoZXRhX1kNClNtYWxsX2NvbWJpbmVkX2RlbHRhcmhvX1kNCmBgYA0KDQojIyMjIyMgRm9yIENjDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTbWFsbF9jb21iaW5lZF9BX3NpbXBsZXggPC0gbGlzdCgpDQpTbWFsbF9jb21iaW5lZF9BX3NtYXAgPC0gbGlzdCgpDQoNCiNFeGVjdXRpbmcgc2ltcGxleCBwcm9qZWN0aW9uDQpmb3IoaSBpbiAxOmxlbmd0aChTX2lkX2NvbWIpKXsNCiAgU21hbGxfY29tYmluZWRfQV9zaW1wbGV4W1tpXV0gPC0gc2ltcGxleChTX2NvbWJpbmVkX0FbW2ldXSxsaWIgPSBjKDEsbGVuZ3RoKFNfY29tYmluZWRfQVtbaV1dKSksIHByZWQgPSBjKDEsbGVuZ3RoKFNfY29tYmluZWRfQVtbaV1dKSksIEUgPSBjKDE6MTApLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCBFDQpTbWFsbF9jb21iaW5lZF9FX0EgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKFNfaWRfY29tYikpew0KICBTbWFsbF9jb21iaW5lZF9FX0FbaV0gPC0gd2hpY2gubWF4KFNtYWxsX2NvbWJpbmVkX0Ffc2ltcGxleFtbaV1dJHJobykNCn0NCg0KI0V4ZWN1dGluZyB1bml2YXJpYXRlIFMtbWFwDQpmb3IoaSBpbiAxOmxlbmd0aChTX2lkX2NvbWIpKXsNCiAgU21hbGxfY29tYmluZWRfQV9zbWFwW1tpXV0gPC0gc19tYXAoU19jb21iaW5lZF9BW1tpXV0sbGliID0gYygxLGxlbmd0aChTX2NvbWJpbmVkX0FbW2ldXSkpLCBwcmVkID0gYygxLGxlbmd0aChTX2NvbWJpbmVkX0FbW2ldXSkpLCBFID0gU21hbGxfY29tYmluZWRfRV9BW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KU21hbGxfY29tYmluZWRfdGhldGFfQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoU19pZF9jb21iKSl7DQogIFNtYWxsX2NvbWJpbmVkX3RoZXRhX0FbaV0gPC0gU21hbGxfY29tYmluZWRfQV9zbWFwW1tpXV1bd2hpY2gubWF4KFNtYWxsX2NvbWJpbmVkX0Ffc21hcFtbaV1dJHJobyksXSR0aGV0YQ0KfQ0KDQojQ2FsY3VsYXRpbmcgZGVsdGEtcmhvIA0KU21hbGxfY29tYmluZWRfZGVsdGFyaG9fQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoU19pZF9jb21iKSl7DQogIFNtYWxsX2NvbWJpbmVkX2RlbHRhcmhvX0FbaV0gPC0gbWF4KFNtYWxsX2NvbWJpbmVkX0Ffc21hcFtbaV1dJHJobykgLSBTbWFsbF9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG9bMV0NCn0NClNtYWxsX2NvbWJpbmVkX0VfQQ0KU21hbGxfY29tYmluZWRfdGhldGFfQQ0KU21hbGxfY29tYmluZWRfZGVsdGFyaG9fQQ0KYGBgDQoNCiMjIyMjIFs4LjIuNC4yXSBGb3IgTWVkaXVtDQoNCiMjIyMjIyBGb3IgQ20NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCk1lZGl1bV9jb21iaW5lZF9ZX3NpbXBsZXggPC0gbGlzdCgpDQpNZWRpdW1fY29tYmluZWRfWV9zbWFwIDwtIGxpc3QoKQ0KbGVuZ3RoKE1faWRfY29tYikNCiNFeGVjdXRpbmcgc2ltcGxleCBwcm9qZWN0aW9uDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX1lfc2ltcGxleFtbaV1dIDwtIHNpbXBsZXgoTV9jb21iaW5lZF9ZW1tpXV0sbGliID0gYygxLGxlbmd0aChNX2NvbWJpbmVkX1lbW2ldXSkpLCBwcmVkID0gYygxLGxlbmd0aChNX2NvbWJpbmVkX1lbW2ldXSkpLCBFID0gYygxOjEwKSwgc2lsZW50ID0gVFJVRSkNCn0NCg0KI0NhbGN1bGF0aW5nIG9wdGltYWwgRQ0KTWVkaXVtX2NvbWJpbmVkX0VfWSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTV9pZF9jb21iKSl7DQogIE1lZGl1bV9jb21iaW5lZF9FX1lbaV0gPC0gd2hpY2gubWF4KE1lZGl1bV9jb21iaW5lZF9ZX3NpbXBsZXhbW2ldXSRyaG8pDQp9DQoNCiNFeGVjdXRpbmcgdW5pdmFyaWF0ZSBTLW1hcA0KZm9yKGkgaW4gMTpsZW5ndGgoTV9pZF9jb21iKSl7DQogIE1lZGl1bV9jb21iaW5lZF9ZX3NtYXBbW2ldXSA8LSBzX21hcChNX2NvbWJpbmVkX1lbW2ldXSxsaWIgPSBjKDEsbGVuZ3RoKE1fY29tYmluZWRfWVtbaV1dKSksIHByZWQgPSBjKDEsbGVuZ3RoKE1fY29tYmluZWRfWVtbaV1dKSksIEUgPSBNZWRpdW1fY29tYmluZWRfRV9ZW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KTWVkaXVtX2NvbWJpbmVkX3RoZXRhX1kgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKE1faWRfY29tYikpew0KICBNZWRpdW1fY29tYmluZWRfdGhldGFfWVtpXSA8LSBNZWRpdW1fY29tYmluZWRfWV9zbWFwW1tpXV1bd2hpY2gubWF4KE1lZGl1bV9jb21iaW5lZF9ZX3NtYXBbW2ldXSRyaG8pLF0kdGhldGENCn0NCg0KI0NhbGN1bGF0aW5nIGRlbHRhLXJobyANCk1lZGl1bV9jb21iaW5lZF9kZWx0YXJob19ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX2RlbHRhcmhvX1lbaV0gPC0gbWF4KE1lZGl1bV9jb21iaW5lZF9ZX3NtYXBbW2ldXSRyaG8pIC0gTWVkaXVtX2NvbWJpbmVkX1lfc21hcFtbaV1dJHJob1sxXQ0KfQ0KTWVkaXVtX2NvbWJpbmVkX0VfWQ0KTWVkaXVtX2NvbWJpbmVkX3RoZXRhX1kNCk1lZGl1bV9jb21iaW5lZF9kZWx0YXJob19ZDQpgYGANCg0KIyMjIyMjIEZvciBDYw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTWVkaXVtX2NvbWJpbmVkX0Ffc2ltcGxleCA8LSBsaXN0KCkNCk1lZGl1bV9jb21iaW5lZF9BX3NtYXAgPC0gbGlzdCgpDQoNCiNFeGVjdXRpbmcgc2ltcGxleCBwcm9qZWN0aW9uDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX0Ffc2ltcGxleFtbaV1dIDwtIHNpbXBsZXgoTV9jb21iaW5lZF9BW1tpXV0sbGliID0gYygxLGxlbmd0aChNX2NvbWJpbmVkX0FbW2ldXSkpLCBwcmVkID0gYygxLGxlbmd0aChNX2NvbWJpbmVkX0FbW2ldXSkpLEUgPSBjKDE6MTApLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCBFDQpNZWRpdW1fY29tYmluZWRfRV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX0VfQVtpXSA8LSB3aGljaC5tYXgoTWVkaXVtX2NvbWJpbmVkX0Ffc2ltcGxleFtbaV1dJHJobykNCn0NCg0KI0V4ZWN1dGluZyB1bml2YXJpYXRlIFMtbWFwDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX0Ffc21hcFtbaV1dIDwtIHNfbWFwKE1fY29tYmluZWRfQVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoTV9jb21iaW5lZF9BW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoTV9jb21iaW5lZF9BW1tpXV0pKSxFID0gTWVkaXVtX2NvbWJpbmVkX0VfQVtpXSwgc2lsZW50ID0gVFJVRSkNCn0NCg0KI0NhbGN1bGF0aW5nIG9wdGltYWwgdGhldGENCk1lZGl1bV9jb21iaW5lZF90aGV0YV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChNX2lkX2NvbWIpKXsNCiAgTWVkaXVtX2NvbWJpbmVkX3RoZXRhX0FbaV0gPC0gTWVkaXVtX2NvbWJpbmVkX0Ffc21hcFtbaV1dW3doaWNoLm1heChNZWRpdW1fY29tYmluZWRfQV9zbWFwW1tpXV0kcmhvKSxdJHRoZXRhDQp9DQoNCiNDYWxjdWxhdGluZyBkZWx0YS1yaG8gDQpNZWRpdW1fY29tYmluZWRfZGVsdGFyaG9fQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTV9pZF9jb21iKSl7DQogIE1lZGl1bV9jb21iaW5lZF9kZWx0YXJob19BW2ldIDwtIG1heChNZWRpdW1fY29tYmluZWRfQV9zbWFwW1tpXV0kcmhvKSAtIE1lZGl1bV9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG9bMV0NCn0NCk1lZGl1bV9jb21iaW5lZF9FX0ENCk1lZGl1bV9jb21iaW5lZF90aGV0YV9BDQpNZWRpdW1fY29tYmluZWRfZGVsdGFyaG9fQQ0KYGBgDQoNCiMjIyMjIFs4LjIuNC4zXSBGb3IgTGFyZ2UNCg0KIyMjIyMjIEZvciBDbQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTGFyZ2VfY29tYmluZWRfWV9zaW1wbGV4IDwtIGxpc3QoKQ0KTGFyZ2VfY29tYmluZWRfWV9zbWFwIDwtIGxpc3QoKQ0KbGVuZ3RoKExfaWRfY29tYikNCiNFeGVjdXRpbmcgc2ltcGxleCBwcm9qZWN0aW9uDQpmb3IoaSBpbiAxOmxlbmd0aChMX2lkX2NvbWIpKXsNCiAgTGFyZ2VfY29tYmluZWRfWV9zaW1wbGV4W1tpXV0gPC0gc2ltcGxleChMX2NvbWJpbmVkX1lbW2ldXSxsaWIgPSBjKDEsbGVuZ3RoKExfY29tYmluZWRfWVtbaV1dKSksIHByZWQgPSBjKDEsbGVuZ3RoKExfY29tYmluZWRfWVtbaV1dKSksIEUgPSBjKDE6MTApLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCBFDQpMYXJnZV9jb21iaW5lZF9FX1kgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKExfaWRfY29tYikpew0KICBMYXJnZV9jb21iaW5lZF9FX1lbaV0gPC0gd2hpY2gubWF4KExhcmdlX2NvbWJpbmVkX1lfc2ltcGxleFtbaV1dJHJobykNCn0NCg0KI0V4ZWN1dGluZyB1bml2YXJpYXRlIFMtbWFwDQpmb3IoaSBpbiAxOmxlbmd0aChMX2lkX2NvbWIpKXsNCiAgTGFyZ2VfY29tYmluZWRfWV9zbWFwW1tpXV0gPC0gc19tYXAoTF9jb21iaW5lZF9ZW1tpXV0sbGliID0gYygxLGxlbmd0aChMX2NvbWJpbmVkX1lbW2ldXSkpLCBwcmVkID0gYygxLGxlbmd0aChMX2NvbWJpbmVkX1lbW2ldXSkpLCBFID0gTGFyZ2VfY29tYmluZWRfRV9ZW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KTGFyZ2VfY29tYmluZWRfdGhldGFfWSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTF9pZF9jb21iKSl7DQogIExhcmdlX2NvbWJpbmVkX3RoZXRhX1lbaV0gPC0gTGFyZ2VfY29tYmluZWRfWV9zbWFwW1tpXV1bd2hpY2gubWF4KExhcmdlX2NvbWJpbmVkX1lfc21hcFtbaV1dJHJobyksXSR0aGV0YQ0KfQ0KDQojQ2FsY3VsYXRpbmcgZGVsdGEtcmhvIA0KTGFyZ2VfY29tYmluZWRfZGVsdGFyaG9fWSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTF9pZF9jb21iKSl7DQogIExhcmdlX2NvbWJpbmVkX2RlbHRhcmhvX1lbaV0gPC0gbWF4KExhcmdlX2NvbWJpbmVkX1lfc21hcFtbaV1dJHJobykgLSBMYXJnZV9jb21iaW5lZF9ZX3NtYXBbW2ldXSRyaG9bMV0NCn0NCkxhcmdlX2NvbWJpbmVkX0VfWQ0KTGFyZ2VfY29tYmluZWRfdGhldGFfWQ0KTGFyZ2VfY29tYmluZWRfZGVsdGFyaG9fWQ0KYGBgDQoNCiMjIyMjIyBGb3IgQ2MNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkxhcmdlX2NvbWJpbmVkX0Ffc2ltcGxleCA8LSBsaXN0KCkNCkxhcmdlX2NvbWJpbmVkX0Ffc21hcCA8LSBsaXN0KCkNCg0KI0V4ZWN1dGluZyBzaW1wbGV4IHByb2plY3Rpb24NCmZvcihpIGluIDE6bGVuZ3RoKExfaWRfY29tYikpew0KICBMYXJnZV9jb21iaW5lZF9BX3NpbXBsZXhbW2ldXSA8LSBzaW1wbGV4KExfY29tYmluZWRfQVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoTF9jb21iaW5lZF9BW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoTF9jb21iaW5lZF9BW1tpXV0pKSxFID0gYygxOjEwKSwgc2lsZW50ID0gVFJVRSkNCn0NCg0KI0NhbGN1bGF0aW5nIG9wdGltYWwgRQ0KTGFyZ2VfY29tYmluZWRfRV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChMX2lkX2NvbWIpKXsNCiAgTGFyZ2VfY29tYmluZWRfRV9BW2ldIDwtIHdoaWNoLm1heChMYXJnZV9jb21iaW5lZF9BX3NpbXBsZXhbW2ldXSRyaG8pDQp9DQoNCiNFeGVjdXRpbmcgdW5pdmFyaWF0ZSBTLW1hcA0KZm9yKGkgaW4gMTpsZW5ndGgoTF9pZF9jb21iKSl7DQogIExhcmdlX2NvbWJpbmVkX0Ffc21hcFtbaV1dIDwtIHNfbWFwKExfY29tYmluZWRfQVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoTF9jb21iaW5lZF9BW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoTF9jb21iaW5lZF9BW1tpXV0pKSxFID0gTGFyZ2VfY29tYmluZWRfRV9BW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KTGFyZ2VfY29tYmluZWRfdGhldGFfQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTF9pZF9jb21iKSl7DQogIExhcmdlX2NvbWJpbmVkX3RoZXRhX0FbaV0gPC0gTGFyZ2VfY29tYmluZWRfQV9zbWFwW1tpXV1bd2hpY2gubWF4KExhcmdlX2NvbWJpbmVkX0Ffc21hcFtbaV1dJHJobyksXSR0aGV0YQ0KfQ0KDQojQ2FsY3VsYXRpbmcgZGVsdGEtcmhvIA0KTGFyZ2VfY29tYmluZWRfZGVsdGFyaG9fQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoTF9pZF9jb21iKSl7DQogIExhcmdlX2NvbWJpbmVkX2RlbHRhcmhvX0FbaV0gPC0gbWF4KExhcmdlX2NvbWJpbmVkX0Ffc21hcFtbaV1dJHJobykgLSBMYXJnZV9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG9bMV0NCn0NCkxhcmdlX2NvbWJpbmVkX0VfQQ0KTGFyZ2VfY29tYmluZWRfdGhldGFfQQ0KTGFyZ2VfY29tYmluZWRfZGVsdGFyaG9fQQ0KYGBgDQoNCiMjIyMjIFs4LjIuNC40XSBGb3IgSHVnZQ0KDQojIyMjIyMgRm9yIENtDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpIdWdlX2NvbWJpbmVkX1lfc2ltcGxleCA8LSBsaXN0KCkNCkh1Z2VfY29tYmluZWRfWV9zbWFwIDwtIGxpc3QoKQ0KbGVuZ3RoKEhfaWRfY29tYikNCiNFeGVjdXRpbmcgc2ltcGxleCBwcm9qZWN0aW9uDQpmb3IoaSBpbiAxOmxlbmd0aChIX2lkX2NvbWIpKXsNCiAgSHVnZV9jb21iaW5lZF9ZX3NpbXBsZXhbW2ldXSA8LSBzaW1wbGV4KEhfY29tYmluZWRfWVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9ZW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9ZW1tpXV0pKSwgRSA9IGMoMToxMCksIHNpbGVudCA9IFRSVUUpDQp9DQoNCiNDYWxjdWxhdGluZyBvcHRpbWFsIEUNCkh1Z2VfY29tYmluZWRfRV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChIX2lkX2NvbWIpKXsNCiAgSHVnZV9jb21iaW5lZF9FX1lbaV0gPC0gd2hpY2gubWF4KEh1Z2VfY29tYmluZWRfWV9zaW1wbGV4W1tpXV0kcmhvKQ0KfQ0KDQojRXhlY3V0aW5nIHVuaXZhcmlhdGUgUy1tYXANCmZvcihpIGluIDE6bGVuZ3RoKEhfaWRfY29tYikpew0KICBIdWdlX2NvbWJpbmVkX1lfc21hcFtbaV1dIDwtIHNfbWFwKEhfY29tYmluZWRfWVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9ZW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9ZW1tpXV0pKSwgRSA9IEh1Z2VfY29tYmluZWRfRV9ZW2ldLCBzaWxlbnQgPSBUUlVFKQ0KfQ0KDQojQ2FsY3VsYXRpbmcgb3B0aW1hbCB0aGV0YQ0KSHVnZV9jb21iaW5lZF90aGV0YV9ZIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChIX2lkX2NvbWIpKXsNCiAgSHVnZV9jb21iaW5lZF90aGV0YV9ZW2ldIDwtIEh1Z2VfY29tYmluZWRfWV9zbWFwW1tpXV1bd2hpY2gubWF4KEh1Z2VfY29tYmluZWRfWV9zbWFwW1tpXV0kcmhvKSxdJHRoZXRhDQp9DQoNCiNDYWxjdWxhdGluZyBkZWx0YS1yaG8gDQpIdWdlX2NvbWJpbmVkX2RlbHRhcmhvX1kgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKEhfaWRfY29tYikpew0KICBIdWdlX2NvbWJpbmVkX2RlbHRhcmhvX1lbaV0gPC0gbWF4KEh1Z2VfY29tYmluZWRfWV9zbWFwW1tpXV0kcmhvKSAtIEh1Z2VfY29tYmluZWRfWV9zbWFwW1tpXV0kcmhvWzFdDQp9DQpIdWdlX2NvbWJpbmVkX0VfWQ0KSHVnZV9jb21iaW5lZF90aGV0YV9ZDQpIdWdlX2NvbWJpbmVkX2RlbHRhcmhvX1kNCmBgYA0KDQojIyMjIyMgRm9yIENjDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpIdWdlX2NvbWJpbmVkX0Ffc2ltcGxleCA8LSBsaXN0KCkNCkh1Z2VfY29tYmluZWRfQV9zbWFwIDwtIGxpc3QoKQ0KDQojRXhlY3V0aW5nIHNpbXBsZXggcHJvamVjdGlvbg0KZm9yKGkgaW4gMTpsZW5ndGgoSF9pZF9jb21iKSl7DQogIEh1Z2VfY29tYmluZWRfQV9zaW1wbGV4W1tpXV0gPC0gc2ltcGxleChIX2NvbWJpbmVkX0FbW2ldXSxsaWIgPSBjKDEsbGVuZ3RoKEhfY29tYmluZWRfQVtbaV1dKSksIHByZWQgPSBjKDEsbGVuZ3RoKEhfY29tYmluZWRfQVtbaV1dKSksRSA9IGMoMToxMCksIHNpbGVudCA9IFRSVUUpDQp9DQoNCiNDYWxjdWxhdGluZyBvcHRpbWFsIEUNCkh1Z2VfY29tYmluZWRfRV9BIDwtIHZlY3RvcigpDQpmb3IoaSBpbiAxOmxlbmd0aChIX2lkX2NvbWIpKXsNCiAgSHVnZV9jb21iaW5lZF9FX0FbaV0gPC0gd2hpY2gubWF4KEh1Z2VfY29tYmluZWRfQV9zaW1wbGV4W1tpXV0kcmhvKQ0KfQ0KDQojRXhlY3V0aW5nIHVuaXZhcmlhdGUgUy1tYXANCmZvcihpIGluIDE6bGVuZ3RoKEhfaWRfY29tYikpew0KICBIdWdlX2NvbWJpbmVkX0Ffc21hcFtbaV1dIDwtIHNfbWFwKEhfY29tYmluZWRfQVtbaV1dLGxpYiA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9BW1tpXV0pKSwgcHJlZCA9IGMoMSxsZW5ndGgoSF9jb21iaW5lZF9BW1tpXV0pKSxFID0gSHVnZV9jb21iaW5lZF9FX0FbaV0sIHNpbGVudCA9IFRSVUUpDQp9DQoNCiNDYWxjdWxhdGluZyBvcHRpbWFsIHRoZXRhDQpIdWdlX2NvbWJpbmVkX3RoZXRhX0EgPC0gdmVjdG9yKCkNCmZvcihpIGluIDE6bGVuZ3RoKEhfaWRfY29tYikpew0KICBIdWdlX2NvbWJpbmVkX3RoZXRhX0FbaV0gPC0gSHVnZV9jb21iaW5lZF9BX3NtYXBbW2ldXVt3aGljaC5tYXgoSHVnZV9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG8pLF0kdGhldGENCn0NCg0KI0NhbGN1bGF0aW5nIGRlbHRhLXJobyANCkh1Z2VfY29tYmluZWRfZGVsdGFyaG9fQSA8LSB2ZWN0b3IoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoSF9pZF9jb21iKSl7DQogIEh1Z2VfY29tYmluZWRfZGVsdGFyaG9fQVtpXSA8LSBtYXgoSHVnZV9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG8pIC0gSHVnZV9jb21iaW5lZF9BX3NtYXBbW2ldXSRyaG9bMV0NCn0NCkh1Z2VfY29tYmluZWRfRV9BDQpIdWdlX2NvbWJpbmVkX3RoZXRhX0ENCkh1Z2VfY29tYmluZWRfZGVsdGFyaG9fQQ0KYGBgDQoNCiMjIyMgWzguMi41XSBTdW1tYXJpemluZyByZXN1bHRzIGZvciBUYWJsZTENCg0KYGBge3Igd2FybmluZz1GQUxTRX0NClRhYmxlMVNtYWxsIDwtIGRhdGEuZnJhbWUoIklEIiA9IFNfaWRfY29tYiwgImF2ZXJhZ2VfY29leGlzdGVuY2Vfd2VlayIgPSBTX2NvbWJpbmVkX21lYW5fY293ZWVrLCAiRV9mb3JfQy5tIiA9IFNtYWxsX2NvbWJpbmVkX0VfWSwgIkVfZm9yX0MuYyIgPSBTbWFsbF9jb21iaW5lZF9FX0EsICJ0aGV0YV9mb3JfQy5tIiA9IFNtYWxsX2NvbWJpbmVkX3RoZXRhX1ksICJ0aGV0YV9mb3JfQy5jIiA9IFNtYWxsX2NvbWJpbmVkX3RoZXRhX0EsICJkZWx0YS1yaG9fZm9yX0MubSIgPSBTbWFsbF9jb21iaW5lZF9kZWx0YXJob19ZLCAiZGVsdGEtcmhvX2Zvcl9DLmMiID0gU21hbGxfY29tYmluZWRfZGVsdGFyaG9fQSkNClRhYmxlMU1lZGl1bSA8LSBkYXRhLmZyYW1lKCJJRCIgPSBNX2lkX2NvbWIsICJhdmVyYWdlX2NvZXhpc3RlbmNlX3dlZWsiID0gTV9jb21iaW5lZF9tZWFuX2Nvd2VlaywgIkVfZm9yX0MubSIgPSBNZWRpdW1fY29tYmluZWRfRV9ZLCAiRV9mb3JfQy5jIiA9IE1lZGl1bV9jb21iaW5lZF9FX0EsICJ0aGV0YV9mb3JfQy5tIiA9IE1lZGl1bV9jb21iaW5lZF90aGV0YV9ZLCAidGhldGFfZm9yX0MuYyIgPSBNZWRpdW1fY29tYmluZWRfdGhldGFfQSwgImRlbHRhLXJob19mb3JfQy5tIiA9IE1lZGl1bV9jb21iaW5lZF9kZWx0YXJob19ZLCAiZGVsdGEtcmhvX2Zvcl9DLmMiID0gTWVkaXVtX2NvbWJpbmVkX2RlbHRhcmhvX0EpDQpUYWJsZTFMYXJnZSA8LSBkYXRhLmZyYW1lKCJJRCIgPSBMX2lkX2NvbWIsICJhdmVyYWdlX2NvZXhpc3RlbmNlX3dlZWsiID0gTF9jb21iaW5lZF9tZWFuX2Nvd2VlaywgIkVfZm9yX0MubSIgPSBMYXJnZV9jb21iaW5lZF9FX1ksICJFX2Zvcl9DLmMiID0gTGFyZ2VfY29tYmluZWRfRV9BLCAidGhldGFfZm9yX0MubSIgPSBMYXJnZV9jb21iaW5lZF90aGV0YV9ZLCAidGhldGFfZm9yX0MuYyIgPSBMYXJnZV9jb21iaW5lZF90aGV0YV9BLCAiZGVsdGEtcmhvX2Zvcl9DLm0iID0gTGFyZ2VfY29tYmluZWRfZGVsdGFyaG9fWSwgImRlbHRhLXJob19mb3JfQy5jIiA9IExhcmdlX2NvbWJpbmVkX2RlbHRhcmhvX0EpDQpUYWJsZTFIdWdlIDwtIGRhdGEuZnJhbWUoIklEIiA9IEhfaWRfY29tYiwgImF2ZXJhZ2VfY29leGlzdGVuY2Vfd2VlayIgPSBIX2NvbWJpbmVkX21lYW5fY293ZWVrLCAiRV9mb3JfQy5tIiA9IEh1Z2VfY29tYmluZWRfRV9ZLCAiRV9mb3JfQy5jIiA9IEh1Z2VfY29tYmluZWRfRV9BLCAidGhldGFfZm9yX0MubSIgPSBIdWdlX2NvbWJpbmVkX3RoZXRhX1ksICJ0aGV0YV9mb3JfQy5jIiA9IEh1Z2VfY29tYmluZWRfdGhldGFfQSwgImRlbHRhLXJob19mb3JfQy5tIiA9IEh1Z2VfY29tYmluZWRfZGVsdGFyaG9fWSwgImRlbHRhLXJob19mb3JfQy5jIiA9IEh1Z2VfY29tYmluZWRfZGVsdGFyaG9fQSkNCg0KDQojZXhhbXBsZQ0KVGFibGUxU21hbGwNCg0KVGFibGUxIDwtIHJiaW5kLmRhdGEuZnJhbWUoVGFibGUxU21hbGwsIFRhYmxlMU1lZGl1bSwgVGFibGUxTGFyZ2UsIFRhYmxlMUh1Z2UpDQpUYWJsZTENCmBgYA0KDQojIyMjIyBbOC4yLjUuMV0gU2F2aW5nIG9iamVjdGVzIGFzIENTViBmaWxlcywgd2hpY2ggYXJlIHVzZWQgZm9yIFRhYmxlIDENCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCndyaXRlLmNzdihUYWJsZTEsZmlsZT0iVGFibGUxLmNzdiIpDQp3cml0ZS5jc3YoU21hbGxUYWJsZTFiYXNlX20sZmlsZT0iU21hbGxUYWJsZTFiYXNlX20uY3N2IikNCndyaXRlLmNzdihNZWRpdW1UYWJsZTFiYXNlX20sZmlsZT0iTWVkaXVtVGFibGUxYmFzZV9tLmNzdiIpDQp3cml0ZS5jc3YoTGFyZ2VUYWJsZTFiYXNlX20sZmlsZT0iTGFyZ2VUYWJsZTFiYXNlX20uY3N2IikNCndyaXRlLmNzdihIdWdlVGFibGUxYmFzZV9tLGZpbGU9Ikh1Z2VUYWJsZTFiYXNlX20uY3N2IikNCmBgYA0KDQojIyMgWzguM10gU2ltcGxleCBwcm9qZWN0aW9uLCBTLW1hcCwgYW5kIENDTSBhbmFseWlzIHdoZW4gYWxsIHJlcGxpY2F0ZXMgZnJvbSBlYWNoIGNhZ2Ugc2l6ZSB3ZXJlIGNvbWJpbmVkDQoNCiMjIyMgWzguMy4xXSBEYXRhIHByZXByb2Nlc3NpbmcgKGNvbWJpbmluZyBhbGwgcmVwY2xpYXRlcykNCg0KIyMjIyMgWzguMy4xLjFdIEZvciBTbWFsbA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0V4dHJhY3RpbmcgdGFyZ2V0IHRoZSBhYnVuZGFuY2Ugb2YgaW5kaXZpZHVhbHMgYXMgbGlzdA0KeF9tYXBfdGFyZ2V0IDwtIFNtYWxsDQpTbWFsbF9ZX2VhY2ggPC0gbGFwcGx5KDE6bGVuZ3RoKHhfbWFwX3RhcmdldCksIGZ1bmN0aW9uKGkpIHhfbWFwX3RhcmdldFtbaV1dJFlvdHN1bW9uVG90YWxMKQ0KU21hbGxfQV9lYWNoIDwtIGxhcHBseSgxOmxlbmd0aCh4X21hcF90YXJnZXQpLCBmdW5jdGlvbihpKSB4X21hcF90YXJnZXRbW2ldXSRBenVraVRvdGFsTCkNCg0KI051bWJlciBvZiBOQXMgdG8gYmUgYWRkZWQgaXMgdGhlIG1heGltdW0gb2Ygb3B0aW1hbCBFIGFtb25nIGFsbCByZXBsaWNhdGVzDQpub19OQXNfU21hbGwgPC0gbWF4KFNtYWxsVGFibGUxYmFzZV9tJE5vLk5BKQ0KDQojQ29tYmluaW5nIGFsbCByZXBsaWNhdGUNClNtYWxsX1lfYWxsY29tYmluZWQgPC0gdW5saXN0KGxhcHBseSgxOjE2LCBmdW5jdGlvbihpKSBjKFNtYWxsX1lfZWFjaFtbaV1dLCByZXAoTkEsIG5vX05Bc19TbWFsbCkpKSkNClNtYWxsX0FfYWxsY29tYmluZWQgIDwtIHVubGlzdChsYXBwbHkoMToxNiwgZnVuY3Rpb24oaSkgYyhTbWFsbF9BX2VhY2hbW2ldXSwgcmVwKE5BLCBub19OQXNfU21hbGwpKSkpDQpTbWFsbF9ZX2FsbGNvbWJpbmVkDQoNCiNWaXN1YWxpemF0aW9uDQpTbWFsbFBvcER5bmFtaWNzIDwtIGRhdGEuZnJhbWUoIlRpbWVfc3RlcCIgPSByZXAoYygxOmxlbmd0aChTbWFsbF9ZX2FsbGNvbWJpbmVkKSksMiksICJQb3B1bGF0aW9uIiA9IGMoU21hbGxfWV9hbGxjb21iaW5lZCwgU21hbGxfQV9hbGxjb21iaW5lZCksICJTcGVjaWVzIiA9IGMocmVwKCJDLm0iLGxlbmd0aChTbWFsbF9ZX2FsbGNvbWJpbmVkKSksIHJlcCgiQy5jIixsZW5ndGgoU21hbGxfQV9hbGxjb21iaW5lZCkpKSkNCg0KUG9wdWxhdGlvblNtYWxsIDwtIGdncGxvdChkYXRhID0gU21hbGxQb3BEeW5hbWljcywgYWVzKHggPSBUaW1lX3N0ZXAsIHkgPSBQb3B1bGF0aW9uLCBncm91cCA9IFNwZWNpZXMsIGNvbG9yID0gU3BlY2llcykpICsgZ2VvbV9saW5lKCkNCnByaW50KFBvcHVsYXRpb25TbWFsbCkNCmBgYA0KDQojIyMjIyBbOC4zLjEuMl0gRm9yIE1lZGl1bQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0V4dHJhY3RpbmcgdGFyZ2V0IHRoZSBhYnVuZGFuY2Ugb2YgaW5kaXZpZHVhbHMgYXMgbGlzdA0KeF9tYXBfdGFyZ2V0IDwtIE1lZGl1bQ0KTWVkaXVtX1lfZWFjaCA8LSBsYXBwbHkoMTpsZW5ndGgoeF9tYXBfdGFyZ2V0KSwgZnVuY3Rpb24oaSkgeF9tYXBfdGFyZ2V0W1tpXV0kWW90c3Vtb25Ub3RhbEwpDQpNZWRpdW1fQV9lYWNoIDwtIGxhcHBseSgxOmxlbmd0aCh4X21hcF90YXJnZXQpLCBmdW5jdGlvbihpKSB4X21hcF90YXJnZXRbW2ldXSRBenVraVRvdGFsTCkNCg0KI051bWJlciBvZiBOQXMgdG8gYmUgYWRkZWQgaXMgdGhlIG1heGltdW0gb2Ygb3B0aW1hbCBFIGFtb25nIGFsbCByZXBsaWNhdGVzDQpub19OQXNfTWVkaXVtIDwtIG1heChNZWRpdW1UYWJsZTFiYXNlX20kTm8uTkEpDQoNCiNDb21iaW5pbmcgYWxsIHJlcGxpY2F0ZQ0KTWVkaXVtX1lfYWxsY29tYmluZWQgPC0gdW5saXN0KGxhcHBseSgxOjE2LCBmdW5jdGlvbihpKSBjKE1lZGl1bV9ZX2VhY2hbW2ldXSwgcmVwKE5BLCBub19OQXNfTWVkaXVtKSkpKQ0KTWVkaXVtX0FfYWxsY29tYmluZWQgIDwtIHVubGlzdChsYXBwbHkoMToxNiwgZnVuY3Rpb24oaSkgYyhNZWRpdW1fQV9lYWNoW1tpXV0scmVwKE5BLCBub19OQXNfTWVkaXVtKSkpKQ0KTWVkaXVtX1lfYWxsY29tYmluZWQNCg0KI1Zpc3VhbGl6YXRpb24NCk1lZGl1bVBvcER5bmFtaWNzIDwtIGRhdGEuZnJhbWUoIlRpbWVfc3RlcCIgPSByZXAoYygxOmxlbmd0aChNZWRpdW1fWV9hbGxjb21iaW5lZCkpLDIpLCAiUG9wdWxhdGlvbiIgPSBjKE1lZGl1bV9ZX2FsbGNvbWJpbmVkLCBNZWRpdW1fQV9hbGxjb21iaW5lZCksICJTcGVjaWVzIiA9IGMocmVwKCJDLm0iLGxlbmd0aChNZWRpdW1fWV9hbGxjb21iaW5lZCkpLCByZXAoIkMuYyIsbGVuZ3RoKE1lZGl1bV9BX2FsbGNvbWJpbmVkKSkpKQ0KDQpQb3B1bGF0aW9uTWVkaXVtIDwtIGdncGxvdChkYXRhID0gTWVkaXVtUG9wRHluYW1pY3MsIGFlcyh4ID0gVGltZV9zdGVwLCB5ID0gUG9wdWxhdGlvbiwgZ3JvdXAgPSBTcGVjaWVzLCBjb2xvciA9IFNwZWNpZXMpKSArIGdlb21fbGluZSgpDQpwcmludChQb3B1bGF0aW9uTWVkaXVtKQ0KYGBgDQoNCiMjIyMjIFs4LjMuMS4zXSBGb3IgTGFyZ2UNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNFeHRyYWN0aW5nIHRhcmdldCB0aGUgYWJ1bmRhbmNlIG9mIGluZGl2aWR1YWxzIGFzIGxpc3QNCnhfbWFwX3RhcmdldCA8LSBMYXJnZQ0KTGFyZ2VfWV9lYWNoIDwtIGxhcHBseSgxOmxlbmd0aCh4X21hcF90YXJnZXQpLCBmdW5jdGlvbihpKSB4X21hcF90YXJnZXRbW2ldXSRZb3RzdW1vblRvdGFsTCkNCkxhcmdlX0FfZWFjaCA8LSBsYXBwbHkoMTpsZW5ndGgoeF9tYXBfdGFyZ2V0KSwgZnVuY3Rpb24oaSkgeF9tYXBfdGFyZ2V0W1tpXV0kQXp1a2lUb3RhbEwpDQoNCiNOdW1iZXIgb2YgTkFzIHRvIGJlIGFkZGVkIGlzIHRoZSBtYXhpbXVtIG9mIG9wdGltYWwgRSBhbW9uZyBhbGwgcmVwbGljYXRlcw0Kbm9fTkFzX0xhcmdlIDwtIG1heChMYXJnZVRhYmxlMWJhc2VfbSROby5OQSkNCg0KI0NvbWJpbmluZyBhbGwgcmVwbGljYXRlDQpMYXJnZV9ZX2FsbGNvbWJpbmVkIDwtIHVubGlzdChsYXBwbHkoMToxNiwgZnVuY3Rpb24oaSkgYyhMYXJnZV9ZX2VhY2hbW2ldXSwgcmVwKE5BLCBub19OQXNfTGFyZ2UpKSkpDQpMYXJnZV9BX2FsbGNvbWJpbmVkICA8LSB1bmxpc3QobGFwcGx5KDE6MTYsIGZ1bmN0aW9uKGkpIGMoTGFyZ2VfQV9lYWNoW1tpXV0scmVwKE5BLCBub19OQXNfTGFyZ2UpKSkpDQpMYXJnZV9ZX2FsbGNvbWJpbmVkDQoNCiNWaXN1YWxpemF0aW9uDQpMYXJnZVBvcER5bmFtaWNzIDwtIGRhdGEuZnJhbWUoIlRpbWVfc3RlcCIgPSByZXAoYygxOmxlbmd0aChMYXJnZV9ZX2FsbGNvbWJpbmVkKSksMiksICJQb3B1bGF0aW9uIiA9IGMoTGFyZ2VfWV9hbGxjb21iaW5lZCwgTGFyZ2VfQV9hbGxjb21iaW5lZCksICJTcGVjaWVzIiA9IGMocmVwKCJDLm0iLGxlbmd0aChMYXJnZV9ZX2FsbGNvbWJpbmVkKSksIHJlcCgiQy5jIixsZW5ndGgoTGFyZ2VfQV9hbGxjb21iaW5lZCkpKSkNCg0KUG9wdWxhdGlvbkxhcmdlIDwtIGdncGxvdChkYXRhID0gTGFyZ2VQb3BEeW5hbWljcywgYWVzKHggPSBUaW1lX3N0ZXAsIHkgPSBQb3B1bGF0aW9uLCBncm91cCA9IFNwZWNpZXMsIGNvbG9yID0gU3BlY2llcykpICsgZ2VvbV9saW5lKCkNCnByaW50KFBvcHVsYXRpb25MYXJnZSkNCmBgYA0KDQojIyMjIyBbOC4zLjEuNF0gRm9yIEh1Z2UNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNFeHRyYWN0aW5nIHRhcmdldCB0aGUgYWJ1bmRhbmNlIG9mIGluZGl2aWR1YWxzIGFzIGxpc3QNCnhfbWFwX3RhcmdldCA8LSBIdWdlDQpIdWdlX1lfZWFjaCA8LSBsYXBwbHkoMTpsZW5ndGgoeF9tYXBfdGFyZ2V0KSwgZnVuY3Rpb24oaSkgeF9tYXBfdGFyZ2V0W1tpXV0kWW90c3Vtb25Ub3RhbEwpDQpIdWdlX0FfZWFjaCA8LSBsYXBwbHkoMTpsZW5ndGgoeF9tYXBfdGFyZ2V0KSwgZnVuY3Rpb24oaSkgeF9tYXBfdGFyZ2V0W1tpXV0kQXp1a2lUb3RhbEwpDQoNCiNOdW1iZXIgb2YgTkFzIHRvIGJlIGFkZGVkIGlzIHRoZSBtYXhpbXVtIG9mIG9wdGltYWwgRSBhbW9uZyBhbGwgcmVwbGljYXRlcw0Kbm9fTkFzX0h1Z2UgPC0gbWF4KEh1Z2VUYWJsZTFiYXNlX20kTm8uTkEpDQoNCiNDb21iaW5pbmcgYWxsIHJlcGxpY2F0ZQ0KSHVnZV9ZX2FsbGNvbWJpbmVkIDwtIHVubGlzdChsYXBwbHkoMToxNiwgZnVuY3Rpb24oaSkgYyhIdWdlX1lfZWFjaFtbaV1dLCByZXAoTkEsIG5vX05Bc19IdWdlKSkpKQ0KSHVnZV9BX2FsbGNvbWJpbmVkICA8LSB1bmxpc3QobGFwcGx5KDE6MTYsIGZ1bmN0aW9uKGkpIGMoSHVnZV9BX2VhY2hbW2ldXSxyZXAoTkEsIG5vX05Bc19IdWdlKSkpKQ0KSHVnZV9ZX2FsbGNvbWJpbmVkDQoNCiNWaXN1YWxpemF0aW9uDQpIdWdlUG9wRHluYW1pY3MgPC0gZGF0YS5mcmFtZSgiVGltZV9zdGVwIiA9IHJlcChjKDE6bGVuZ3RoKEh1Z2VfWV9hbGxjb21iaW5lZCkpLDIpLCAiUG9wdWxhdGlvbiIgPSBjKEh1Z2VfWV9hbGxjb21iaW5lZCwgSHVnZV9BX2FsbGNvbWJpbmVkKSwgIlNwZWNpZXMiID0gYyhyZXAoIkMubSIsbGVuZ3RoKEh1Z2VfWV9hbGxjb21iaW5lZCkpLCByZXAoIkMuYyIsbGVuZ3RoKEh1Z2VfQV9hbGxjb21iaW5lZCkpKSkNCg0KUG9wdWxhdGlvbkh1Z2UgPC0gZ2dwbG90KGRhdGEgPSBIdWdlUG9wRHluYW1pY3MsIGFlcyh4ID0gVGltZV9zdGVwLCB5ID0gUG9wdWxhdGlvbiwgZ3JvdXAgPSBTcGVjaWVzLCBjb2xvciA9IFNwZWNpZXMpKSArIGdlb21fbGluZSgpDQpwcmludChQb3B1bGF0aW9uSHVnZSkNCmBgYA0KDQojIyMjIFs4LjMuMl0gU2ltcGxleCBwcm9qZWN0aW9uIChvcHRpbWFsIEUpIGFuZCB1bml2YXJpYXRlIFMtbWFwIChvcHRpbWFsIHRoZXRhKQ0KDQotLVRoZSBXYXJuaW5nIG1lc3NhZ2UgaXMgYW4gZXhwZWN0ZWQgb25lIHNpbmNlIHdlIHNldCB0aGUgbGlicmFyeSBhbmQgcHJlZGljdGlvbiBpZGVudGljYWwuDQoNCiMjIyMjIFs4LjMuMi4xXSBGb3IgU21hbGwNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNkYXRhIGNvbWJpbmVkDQpTbWFsbF9ZQV9hbGxjb21iaW5lZCA8LSBkYXRhLmZyYW1lKCJTbWFsbF9ZIiA9IFNtYWxsX1lfYWxsY29tYmluZWQsICJTbWFsbF9BIiA9IFNtYWxsX0FfYWxsY29tYmluZWQpDQoNCg0KI3NpbXBsZXggcHJvamVjdGlvbiBmb3IgWSBhbmQgQSwgcmVzcGVjdGl2ZWx5IA0KU21hbGxfc2ltcGxleF9vdXRwdXRfWSA8LSBzaW1wbGV4KFNtYWxsX1lBX2FsbGNvbWJpbmVkJFNtYWxsX1ksbGliID0gYygxLCBucm93KFNtYWxsX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coU21hbGxfWUFfYWxsY29tYmluZWQpKSkNCg0KU21hbGxfc2ltcGxleF9vdXRwdXRfQSA8LSBzaW1wbGV4KFNtYWxsX1lBX2FsbGNvbWJpbmVkJFNtYWxsX0EsbGliID0gYygxLCBucm93KFNtYWxsX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coU21hbGxfWUFfYWxsY29tYmluZWQpKSkNCg0KI29wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiBFKg0KU21hbGxfb3B0RV9ZIDwtIHdoaWNoLm1heChTbWFsbF9zaW1wbGV4X291dHB1dF9ZJHJobykNClNtYWxsX29wdEVfQSA8LSB3aGljaC5tYXgoU21hbGxfc2ltcGxleF9vdXRwdXRfQSRyaG8pDQoNCiN1bml2YXJpYXRlIFMtbWFwDQpTbWFsbF9zX21hcF9vdXRwdXRZIDwtIHNfbWFwKFNtYWxsX1lBX2FsbGNvbWJpbmVkJFNtYWxsX1ksbGliID0gYygxLCBucm93KFNtYWxsX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coU21hbGxfWUFfYWxsY29tYmluZWQpKSwgRSA9IFNtYWxsX29wdEVfWSkNClNtYWxsX3NfbWFwX291dHB1dEEgPC0gc19tYXAoU21hbGxfWUFfYWxsY29tYmluZWQkU21hbGxfQSxsaWIgPSBjKDEsIG5yb3coU21hbGxfWUFfYWxsY29tYmluZWQpKSwgcHJlZCA9IGMoMSwgbnJvdyhTbWFsbF9ZQV9hbGxjb21iaW5lZCkpLCBFID0gU21hbGxfb3B0RV9BKQ0KDQojb3B0aW1hbCB0aGV0YQ0KU21hbGxfb3B0dGhldGFfWSA8LSBTbWFsbF9zX21hcF9vdXRwdXRZJHRoZXRhW3doaWNoLm1heChTbWFsbF9zX21hcF9vdXRwdXRZJHJobyldDQpTbWFsbF9vcHR0aGV0YV9BIDwtIFNtYWxsX3NfbWFwX291dHB1dEEkdGhldGFbd2hpY2gubWF4KFNtYWxsX3NfbWFwX291dHB1dEEkcmhvKV0NCmBgYA0KDQojIyMjIyBbOC4zLjIuMl0gRm9yIE1lZGl1bQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI2RhdGEgY29tYmluZWQNCk1lZGl1bV9ZQV9hbGxjb21iaW5lZCA8LSBkYXRhLmZyYW1lKCJNZWRpdW1fWSIgPSBNZWRpdW1fWV9hbGxjb21iaW5lZCwgIk1lZGl1bV9BIiA9IE1lZGl1bV9BX2FsbGNvbWJpbmVkKQ0KDQojc2ltcGxleCBwcm9qZWN0aW9uIGZvciBZIGFuZCBBLCByZXNwZWN0aXZlbHkgDQpNZWRpdW1fc2ltcGxleF9vdXRwdXRfWSA8LSBzaW1wbGV4KE1lZGl1bV9ZQV9hbGxjb21iaW5lZCRNZWRpdW1fWSxsaWIgPSBjKDEsIG5yb3coTWVkaXVtX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coTWVkaXVtX1lBX2FsbGNvbWJpbmVkKSkpDQoNCk1lZGl1bV9zaW1wbGV4X291dHB1dF9BIDwtIHNpbXBsZXgoTWVkaXVtX1lBX2FsbGNvbWJpbmVkJE1lZGl1bV9BLGxpYiA9IGMoMSwgbnJvdyhNZWRpdW1fWUFfYWxsY29tYmluZWQpKSwgcHJlZCA9IGMoMSwgbnJvdyhNZWRpdW1fWUFfYWxsY29tYmluZWQpKSkNCg0KI29wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiBFKg0KTWVkaXVtX29wdEVfWSA8LSB3aGljaC5tYXgoTWVkaXVtX3NpbXBsZXhfb3V0cHV0X1kkcmhvKQ0KTWVkaXVtX29wdEVfQSA8LSB3aGljaC5tYXgoTWVkaXVtX3NpbXBsZXhfb3V0cHV0X0EkcmhvKQ0KDQojdW5pdmFyaWF0ZSBTLW1hcA0KTWVkaXVtX3NfbWFwX291dHB1dFkgPC0gc19tYXAoTWVkaXVtX1lBX2FsbGNvbWJpbmVkJE1lZGl1bV9ZLGxpYiA9IGMoMSwgbnJvdyhNZWRpdW1fWUFfYWxsY29tYmluZWQpKSwgcHJlZCA9IGMoMSwgbnJvdyhNZWRpdW1fWUFfYWxsY29tYmluZWQpKSxFID0gTWVkaXVtX29wdEVfWSkNCk1lZGl1bV9zX21hcF9vdXRwdXRBIDwtIHNfbWFwKE1lZGl1bV9ZQV9hbGxjb21iaW5lZCRNZWRpdW1fQSxsaWIgPSBjKDEsIG5yb3coTWVkaXVtX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coTWVkaXVtX1lBX2FsbGNvbWJpbmVkKSksRSA9IE1lZGl1bV9vcHRFX0EpDQoNCiNvcHRpbWFsIHRoZXRhDQpNZWRpdW1fb3B0dGhldGFfWSA8LSBNZWRpdW1fc19tYXBfb3V0cHV0WSR0aGV0YVt3aGljaC5tYXgoTWVkaXVtX3NfbWFwX291dHB1dFkkcmhvKV0NCk1lZGl1bV9vcHR0aGV0YV9BIDwtIE1lZGl1bV9zX21hcF9vdXRwdXRBJHRoZXRhW3doaWNoLm1heChNZWRpdW1fc19tYXBfb3V0cHV0QSRyaG8pXQ0KYGBgDQoNCiMjIyMjIFs4LjMuMi4zXSBGb3IgTGFyZ2UNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNkYXRhIGNvbWJpbmVkDQpMYXJnZV9ZQV9hbGxjb21iaW5lZCA8LSBkYXRhLmZyYW1lKCJMYXJnZV9ZIiA9IExhcmdlX1lfYWxsY29tYmluZWQsICJMYXJnZV9BIiA9IExhcmdlX0FfYWxsY29tYmluZWQpDQoNCg0KI3NpbXBsZXggcHJvamVjdGlvbiBmb3IgWSBhbmQgQSwgcmVzcGVjdGl2ZWx5IA0KTGFyZ2Vfc2ltcGxleF9vdXRwdXRfWSA8LSBzaW1wbGV4KExhcmdlX1lBX2FsbGNvbWJpbmVkJExhcmdlX1ksbGliID0gYygxLCBucm93KExhcmdlX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coTGFyZ2VfWUFfYWxsY29tYmluZWQpKSkNCg0KTGFyZ2Vfc2ltcGxleF9vdXRwdXRfQSA8LSBzaW1wbGV4KExhcmdlX1lBX2FsbGNvbWJpbmVkJExhcmdlX0EsbGliID0gYygxLCBucm93KExhcmdlX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coTGFyZ2VfWUFfYWxsY29tYmluZWQpKSkNCg0KI29wdGltYWwgZW1iZWRkaW5nIGRpbWVuc2lvbiBFKg0KTGFyZ2Vfb3B0RV9ZIDwtIHdoaWNoLm1heChMYXJnZV9zaW1wbGV4X291dHB1dF9ZJHJobykNCkxhcmdlX29wdEVfQSA8LSB3aGljaC5tYXgoTGFyZ2Vfc2ltcGxleF9vdXRwdXRfQSRyaG8pDQoNCiN1bml2YXJpYXRlIFMtbWFwDQpMYXJnZV9zX21hcF9vdXRwdXRZIDwtIHNfbWFwKExhcmdlX1lBX2FsbGNvbWJpbmVkJExhcmdlX1ksbGliID0gYygxLCBucm93KExhcmdlX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coTGFyZ2VfWUFfYWxsY29tYmluZWQpKSxFID0gTGFyZ2Vfb3B0RV9ZKQ0KTGFyZ2Vfc19tYXBfb3V0cHV0QSA8LSBzX21hcChMYXJnZV9ZQV9hbGxjb21iaW5lZCRMYXJnZV9BLGxpYiA9IGMoMSwgbnJvdyhMYXJnZV9ZQV9hbGxjb21iaW5lZCkpLCBwcmVkID0gYygxLCBucm93KExhcmdlX1lBX2FsbGNvbWJpbmVkKSksRSA9IExhcmdlX29wdEVfQSkNCg0KI29wdGltYWwgdGhldGENCkxhcmdlX29wdHRoZXRhX1kgPC0gTGFyZ2Vfc19tYXBfb3V0cHV0WSR0aGV0YVt3aGljaC5tYXgoTGFyZ2Vfc19tYXBfb3V0cHV0WSRyaG8pXQ0KTGFyZ2Vfb3B0dGhldGFfQSA8LSBMYXJnZV9zX21hcF9vdXRwdXRBJHRoZXRhW3doaWNoLm1heChMYXJnZV9zX21hcF9vdXRwdXRBJHJobyldDQpgYGANCg0KIyMjIyMgWzguMy4yLjRdIEZvciBIdWdlDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojZGF0YSBjb21iaW5lZA0KSHVnZV9ZQV9hbGxjb21iaW5lZCA8LSBkYXRhLmZyYW1lKCJIdWdlX1kiID0gSHVnZV9ZX2FsbGNvbWJpbmVkLCAiSHVnZV9BIiA9IEh1Z2VfQV9hbGxjb21iaW5lZCkNCg0KDQojc2ltcGxleCBwcm9qZWN0aW9uIGZvciBZIGFuZCBBLCByZXNwZWN0aXZlbHkgDQpIdWdlX3NpbXBsZXhfb3V0cHV0X1kgPC0gc2ltcGxleChIdWdlX1lBX2FsbGNvbWJpbmVkJEh1Z2VfWSxsaWIgPSBjKDEsIG5yb3coSHVnZV9ZQV9hbGxjb21iaW5lZCkpLCBwcmVkID0gYygxLCBucm93KEh1Z2VfWUFfYWxsY29tYmluZWQpKSkNCg0KSHVnZV9zaW1wbGV4X291dHB1dF9BIDwtIHNpbXBsZXgoSHVnZV9ZQV9hbGxjb21iaW5lZCRIdWdlX0EsbGliID0gYygxLCBucm93KEh1Z2VfWUFfYWxsY29tYmluZWQpKSwgcHJlZCA9IGMoMSwgbnJvdyhIdWdlX1lBX2FsbGNvbWJpbmVkKSkpDQoNCiNvcHRpbWFsIGVtYmVkZGluZyBkaW1lbnNpb24gRSoNCkh1Z2Vfb3B0RV9ZIDwtIHdoaWNoLm1heChIdWdlX3NpbXBsZXhfb3V0cHV0X1kkcmhvKQ0KSHVnZV9vcHRFX0EgPC0gd2hpY2gubWF4KEh1Z2Vfc2ltcGxleF9vdXRwdXRfQSRyaG8pDQoNCiN1bml2YXJpYXRlIFMtbWFwDQpIdWdlX3NfbWFwX291dHB1dFkgPC0gc19tYXAoSHVnZV9ZQV9hbGxjb21iaW5lZCRIdWdlX1ksbGliID0gYygxLCBucm93KEh1Z2VfWUFfYWxsY29tYmluZWQpKSwgcHJlZCA9IGMoMSwgbnJvdyhIdWdlX1lBX2FsbGNvbWJpbmVkKSksRSA9IEh1Z2Vfb3B0RV9ZKQ0KSHVnZV9zX21hcF9vdXRwdXRBIDwtIHNfbWFwKEh1Z2VfWUFfYWxsY29tYmluZWQkSHVnZV9BLGxpYiA9IGMoMSwgbnJvdyhIdWdlX1lBX2FsbGNvbWJpbmVkKSksIHByZWQgPSBjKDEsIG5yb3coSHVnZV9ZQV9hbGxjb21iaW5lZCkpLEUgPSBIdWdlX29wdEVfQSkNCg0KI29wdGltYWwgdGhldGENCkh1Z2Vfb3B0dGhldGFfWSA8LSBIdWdlX3NfbWFwX291dHB1dFkkdGhldGFbd2hpY2gubWF4KEh1Z2Vfc19tYXBfb3V0cHV0WSRyaG8pXQ0KSHVnZV9vcHR0aGV0YV9BIDwtIEh1Z2Vfc19tYXBfb3V0cHV0QSR0aGV0YVt3aGljaC5tYXgoSHVnZV9zX21hcF9vdXRwdXRBJHJobyldDQpgYGANCg0KIyMjIyMgWzguMy4yLjVdIFZpc3VhbGl6YXRpb24gZm9yIEZpZ3VyZSBTMiAob3B0aW1hbCBlbWJlZGRpbmcgZGltZW5zaW9uKQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0ZvciBTbWFsbA0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYyg0LCA0LCAxLCAxKSwgb21hID0gYygzLCAzLCAzLCAwKSkNCnBsb3QoU21hbGxfc2ltcGxleF9vdXRwdXRfWSRFLCBTbWFsbF9zaW1wbGV4X291dHB1dF9ZJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIgIiwgeWxhYiA9ICIiLCB4bGltID0gYygwLCAxMCksIHlsaW0gPSBjKDAsIDEpLCBjZXgubGFiID0gMiwgY2V4LmF4aXMgPSAxLG1haW49IihhKSBDLm1hY3VsYXR1cyIpDQphYmxpbmUoaCA9IDAsIGx0eSA9IDMsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChTbWFsbF9zaW1wbGV4X291dHB1dF9BJEUsIFNtYWxsX3NpbXBsZXhfb3V0cHV0X0EkcmhvLCB0eXBlID0gImwiLCB4bGFiID0gIiAiLCB5bGFiID0gIiIsIHhsaW0gPSBjKDAsIDEwKSwgeWxpbSA9IGMoLTAuMSwgMSksIGNleC5heGlzID0gMiwgY2V4LmF4aXMgPSAxLCBtYWluID0gIihiKSBDLmNoaW5lbnNpcyIpDQphYmxpbmUoaCA9IDAsIGx0eSA9IDMsIGNvbCA9ImJsYWNrIiwgbHdkID0gMikNCg0KbXRleHQoc2lkZSA9IDMsIGxpbmUgPSAxLCBvdXRlciA9IFRSVUUsIHRleHQgPSAiT3B0aW1hbCBFbWJlZGRpbmcgRGltZW5zaW9uIGZvciBTbWFsbCBjYWdlcyIpDQoNCiNGb3IgTWVkaXVtDQpwYXIobWZyb3cgPSBjKDEsIDIpLCBtYXIgPSBjKDQsIDQsIDEsIDEpLCBvbWEgPSBjKDMsIDMsIDMsIDApKQ0KcGxvdChNZWRpdW1fc2ltcGxleF9vdXRwdXRfWSRFLCBNZWRpdW1fc2ltcGxleF9vdXRwdXRfWSRyaG8sIHR5cGUgPSAibCIsIHhsYWIgPSAiICIsIHlsYWIgPSAiIiwgeGxpbSA9IGMoMCwgMTApLCB5bGltID0gYygwLCAxKSwgY2V4LmxhYiA9IDIsIGNleC5heGlzID0gMSxtYWluPSIoYykgQy5tYWN1bGF0dXMiKQ0KYWJsaW5lKGggPSAwLCBsdHkgPSAzLCBjb2wgPSAiYmxhY2siLCBsd2QgPSAyKQ0KDQpwbG90KE1lZGl1bV9zaW1wbGV4X291dHB1dF9BJEUsIE1lZGl1bV9zaW1wbGV4X291dHB1dF9BJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIgIiwgeWxhYiA9ICIiLCB4bGltID0gYygwLCAxMCksIHlsaW0gPSBjKDAsIDEpLCBjZXguYXhpcyA9IDIsIGNleC5heGlzID0gMSwgbWFpbiA9ICIoZCkgQy5jaGluZW5zaXMiKQ0KYWJsaW5lKGggPSAwLCBsdHkgPSAzLCBjb2wgPSJibGFjayIsIGx3ZCA9IDIpDQoNCm10ZXh0KHNpZGUgPSAzLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCB0ZXh0ID0gIk9wdGltYWwgRW1iZWRkaW5nIERpbWVuc2lvbiBmb3IgTWVkaXVtIGNhZ2VzIikNCg0KI0ZvciBMYXJnZQ0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYyg0LCA0LCAxLCAxKSwgb21hID0gYygzLCAzLCAzLCAwKSkNCnBsb3QoTGFyZ2Vfc2ltcGxleF9vdXRwdXRfWSRFLCBMYXJnZV9zaW1wbGV4X291dHB1dF9ZJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIgIiwgeWxhYiA9ICIiLCB4bGltID0gYygwLCAxMCksIHlsaW0gPSBjKDAsIDEpLCBjZXgubGFiID0gMiwgY2V4LmF4aXMgPSAxLG1haW49IihlKSBDLm1hY3VsYXR1cyIpDQphYmxpbmUoaCA9IDAsIGx0eSA9IDMsIGNvbCA9ICJibGFjayIsIGx3ZCA9IDIpDQoNCnBsb3QoTGFyZ2Vfc2ltcGxleF9vdXRwdXRfQSRFLCBMYXJnZV9zaW1wbGV4X291dHB1dF9BJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIgIiwgeWxhYiA9ICIiLCB4bGltID0gYygwLCAxMCksIHlsaW0gPSBjKC0wLjEsIDEpLCBjZXguYXhpcyA9IDIsIGNleC5heGlzID0gMSwgbWFpbiA9ICIoZikgQy5jaGluZW5zaXMiKQ0KYWJsaW5lKGggPSAwLCBsdHkgPSAzLCBjb2wgPSJibGFjayIsIGx3ZCA9IDIpDQoNCm10ZXh0KHNpZGUgPSAzLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCB0ZXh0ID0gIk9wdGltYWwgRW1iZWRkaW5nIERpbWVuc2lvbiBmb3IgTGFyZ2UgY2FnZXMiKQ0KDQojRm9yIEh1Z2UNCnBhcihtZnJvdyA9IGMoMSwgMiksIG1hciA9IGMoNCwgNCwgMSwgMSksIG9tYSA9IGMoMywgMywgMywgMCkpDQpwbG90KEh1Z2Vfc2ltcGxleF9vdXRwdXRfWSRFLCBIdWdlX3NpbXBsZXhfb3V0cHV0X1kkcmhvLCB0eXBlID0gImwiLCB4bGFiID0gIiAiLCB5bGFiID0gIiIsIHhsaW0gPSBjKDAsIDEwKSwgeWxpbSA9IGMoMCwgMSksIGNleC5sYWIgPSAyLCBjZXguYXhpcyA9IDEsbWFpbj0iKGcpIEMubWFjdWxhdHVzIikNCmFibGluZShoID0gMCwgbHR5ID0gMywgY29sID0gImJsYWNrIiwgbHdkID0gMikNCg0KcGxvdChIdWdlX3NpbXBsZXhfb3V0cHV0X0EkRSwgSHVnZV9zaW1wbGV4X291dHB1dF9BJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIgIiwgeWxhYiA9ICIiLCB4bGltID0gYygwLCAxMCksIHlsaW0gPSBjKDAsIDEpLCBjZXguYXhpcyA9IDIsIGNleC5heGlzID0gMSwgbWFpbiA9ICIoaCkgQy5jaGluZW5zaXMiKQ0KYWJsaW5lKGggPSAwLCBsdHkgPSAzLCBjb2wgPSJibGFjayIsIGx3ZCA9IDIpDQoNCm10ZXh0KHNpZGUgPSAzLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCB0ZXh0ID0gIk9wdGltYWwgRW1iZWRkaW5nIERpbWVuc2lvbiBmb3IgSHVnZSBjYWdlcyIpDQpgYGANCg0KIyMjIyMgWzguMy4yLjZdIFZpc3VhbGl6YXRpb24gZm9yIEZpZ3VyZSBTMyAob3B0aW1hbCB0aGV0YSAobm9ubGluZWFyaXR5KSkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNGb3IgU21hbGwNCnBhcihtZnJvdyA9IGMoMSwgMiksIG1hciA9IGMoNCwgNCwgMSwgMSksIG9tYSA9IGMoMywgMywgMywgMCkpDQpwbG90KFNtYWxsX3NfbWFwX291dHB1dFkkdGhldGEsIFNtYWxsX3NfbWFwX291dHB1dFkkcmhvLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgY2V4Lm1haW4gPSAxLHlsaW0gPSBjKDAsIDAuOSksIGNleC5sYWIgPSAyLCBjZXguYXhpcyA9IDIsIG1haW4gPSAiKGEpIEMubWFjdWxhdHVzIikNCmFibGluZShoID0gMCxsdHkgPSAzLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoU21hbGxfc19tYXBfb3V0cHV0QSR0aGV0YSwgU21hbGxfc19tYXBfb3V0cHV0QSRyaG8sIHR5cGUgPSAibCIsIHhsYWIgPSAiIiwgeWxhYiA9ICIiLCBjZXgubWFpbiA9IDEsIHlsaW0gPSBjKDAsIDAuOSksIGNleC5sYWIgPSAyLCBjZXguYXhpcyA9IDIsIG1haW4gPSAiKGIpIEMuY2hpbmVuc2lzIikNCmFibGluZShoID0gMCxsdHkgPSAzLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCm10ZXh0KHNpZGUgPSAzLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCB0ZXh0ID0gIk9wdGltYWwgdGhldGEgKG5vbmxpbmVhcml0eSkgZm9yIFNtYWxsIGNhZ2UiKQ0KDQojRm9yIE1lZGl1bQ0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYyg0LCA0LCAxLCAxKSwgb21hID0gYygzLCAzLCAzLCAwKSkNCnBsb3QoTWVkaXVtX3NfbWFwX291dHB1dFkkdGhldGEsIE1lZGl1bV9zX21hcF9vdXRwdXRZJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIGNleC5tYWluID0gMSx5bGltID0gYygwLCAwLjkpLCBjZXgubGFiID0gMiwgY2V4LmF4aXMgPSAyLCBtYWluID0gIihjKSBDLm1hY3VsYXR1cyIpDQphYmxpbmUoaCA9IDAsbHR5ID0gMywgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQpwbG90KE1lZGl1bV9zX21hcF9vdXRwdXRBJHRoZXRhLCBNZWRpdW1fc19tYXBfb3V0cHV0QSRyaG8sIHR5cGUgPSAibCIsIHhsYWIgPSAiIiwgeWxhYiA9ICIiLCBjZXgubWFpbiA9IDEsIHlsaW0gPSBjKDAsIDAuOSksIGNleC5sYWIgPSAyLCBjZXguYXhpcyA9IDIsIG1haW4gPSAiKGQpIEMuY2hpbmVuc2lzIikNCmFibGluZShoID0gMCxsdHkgPSAzLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCm10ZXh0KHNpZGUgPSAzLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCB0ZXh0ID0gIk9wdGltYWwgdGhldGEgKG5vbmxpbmVhcml0eSkgZm9yIE1lZGl1bSBjYWdlIikNCg0KI0ZvciBMYXJnZQ0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYyg0LCA0LCAxLCAxKSwgb21hID0gYygzLCAzLCAzLCAwKSkNCnBsb3QoTGFyZ2Vfc19tYXBfb3V0cHV0WSR0aGV0YSwgTGFyZ2Vfc19tYXBfb3V0cHV0WSRyaG8sIHR5cGUgPSAibCIsIHhsYWIgPSAiIiwgeWxhYiA9ICIiLCBjZXgubWFpbiA9IDEseWxpbSA9IGMoMCwgMC45KSwgY2V4LmxhYiA9IDIsIGNleC5heGlzID0gMiwgbWFpbiA9ICIoZSkgQy5tYWN1bGF0dXMiKQ0KYWJsaW5lKGggPSAwLGx0eSA9IDMsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KcGxvdChMYXJnZV9zX21hcF9vdXRwdXRBJHRoZXRhLCBMYXJnZV9zX21hcF9vdXRwdXRBJHJobywgdHlwZSA9ICJsIiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIGNleC5tYWluID0gMSwgeWxpbSA9IGMoMCwgMC45KSwgY2V4LmxhYiA9IDIsIGNleC5heGlzID0gMiwgbWFpbiA9ICIoZikgQy5jaGluZW5zaXMiKQ0KYWJsaW5lKGggPSAwLGx0eSA9IDMsIGNvbCA9ICJibGFjayIsbHdkID0gMikNCg0KbXRleHQoc2lkZSA9IDMsIGxpbmUgPSAxLCBvdXRlciA9IFRSVUUsIHRleHQgPSAiT3B0aW1hbCB0aGV0YSAobm9ubGluZWFyaXR5KSBmb3IgTGFyZ2UgY2FnZSIpDQoNCiNGb3IgSHVnZQ0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYyg0LCA0LCAxLCAxKSwgb21hID0gYygzLCAzLCAzLCAwKSkNCnBsb3QoSHVnZV9zX21hcF9vdXRwdXRZJHRoZXRhLCBIdWdlX3NfbWFwX291dHB1dFkkcmhvLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgY2V4Lm1haW4gPSAxLHlsaW0gPSBjKDAsIDAuOSksIGNleC5sYWIgPSAyLCBjZXguYXhpcyA9IDIsIG1haW4gPSAiKGcpIEMubWFjdWxhdHVzIikNCmFibGluZShoID0gMCxsdHkgPSAzLCBjb2wgPSAiYmxhY2siLGx3ZCA9IDIpDQoNCnBsb3QoSHVnZV9zX21hcF9vdXRwdXRBJHRoZXRhLCBIdWdlX3NfbWFwX291dHB1dEEkcmhvLCB0eXBlID0gImwiLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgY2V4Lm1haW4gPSAxLCB5bGltID0gYygwLCAwLjkpLCBjZXgubGFiID0gMiwgY2V4LmF4aXMgPSAyLCBtYWluID0gIihoKSBDLmNoaW5lbnNpcyIpDQphYmxpbmUoaCA9IDAsbHR5ID0gMywgY29sID0gImJsYWNrIixsd2QgPSAyKQ0KDQptdGV4dChzaWRlID0gMywgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgdGV4dCA9ICJPcHRpbWFsIHRoZXRhIChub25saW5lYXJpdHkpIGZvciBIdWdlIGNhZ2UiKQ0KYGBgDQoNCiMjIyMgWzguMy4zXSBDQ00gZm9yIGVhY2ggY2FnZSBzaXplDQoNCiMjIyMjIFs4LjMuMy4xXSBDb25maXJtIHRlcm1pbm9sb2d5DQoNCi0tIFlfeG1hcF9BIHJlcHJlc2VudHMgdGhlIGNhdXNhbGl0eSBmcm9tIEEgKEF6dWtpIENjKSB0byBZIChZb3RzdW1vbiBDbSkgI0Y4NzY2RCAocmVkKSANCg0KLS0gQV94bWFwX1kgcmVwcmVzZW50cyB0aGUgY2F1c2FsaXR5IGZyb20gWSAoWW90c3Vtb24gQ20pIHRvIEEgKEF6dWtpIENjKSAjMDBCRkM0IChibHVlLWdyZWVuKQ0KDQojIyMjIyBbOC4zLjMuMl0gRm9yIFNtYWxsIGNhZ2UgYW5hbHlzaXMNCg0KIyMjIyMjIENDTQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU21hbGxfbGFnWV94bWFwX0EgPC0gbGlzdCgpDQpTbWFsbF9sYWdBX3htYXBfWSA8LSBsaXN0KCkNCg0KI25vdCBzaG93aW5nIHdhcm5pbmcgDQoNClNtYWxsX2xhZ1lfeG1hcF9BIDwtIGxhcHBseSgwOi00LCBmdW5jdGlvbihpKSBjY20oU21hbGxfWUFfYWxsY29tYmluZWQsIEUgPSBTbWFsbF9vcHRFX1ksIGxpYl9jb2x1bW4gPSAiU21hbGxfWSIsIHRhcmdldF9jb2x1bW4gPSAiU21hbGxfQSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShTbWFsbF9vcHRFX1ksIG5yb3coU21hbGxfWUFfYWxsY29tYmluZWQpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKQ0KDQpTbWFsbF9sYWdBX3htYXBfWSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKFNtYWxsX1lBX2FsbGNvbWJpbmVkLCBFID0gU21hbGxfb3B0RV9BLCBsaWJfY29sdW1uID0gIlNtYWxsX0EiLCB0YXJnZXRfY29sdW1uID0gIlNtYWxsX1kiLCBsaWJfc2l6ZXMgPSBmbG9vcihzZXEoU21hbGxfb3B0RV9BLCBucm93KFNtYWxsX1lBX2FsbGNvbWJpbmVkKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkNCg0KDQojZXhhbXBsZQ0KU21hbGxfbGFnWV94bWFwX0FbWzJdXQ0KYGBgDQoNCiMjIyMjIyBDYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTbWFsbF9sYWdZX3htYXBfQV9tZWFucyA8LSBsaXN0KCkNClNtYWxsX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxpc3QoKQ0KDQpTbWFsbF9sYWdZX3htYXBfQV9tZWFucyA8LSBsYXBwbHkoMTo1LCBmdW5jdGlvbihpKSBjY21fbWVhbnMoU21hbGxfbGFnWV94bWFwX0FbW2ldXSwgbmEucm0gPSBUUlVFKSkNClNtYWxsX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhTbWFsbF9sYWdBX3htYXBfWVtbaV1dLCBuYS5ybSA9IFRSVUUpKQ0KDQpTbWFsbF9sYWdZX3htYXBfQV9tZWFucyA8LSBsYXBwbHkoMTo1LCBmdW5jdGlvbihpKSBkYXRhLmZyYW1lKFNtYWxsX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0sIHNkLnJobyA9IGNjbV9tZWFucyhTbWFsbF9sYWdZX3htYXBfQVtbaV1dLCBGVU4gPSBzZCwgbmEucm0gPSBUUlVFKSRyaG8pKQ0KU21hbGxfbGFnQV94bWFwX1lfbWVhbnMgPC0gbGFwcGx5KDE6NSwgZnVuY3Rpb24oaSkgZGF0YS5mcmFtZShTbWFsbF9sYWdBX3htYXBfWV9tZWFuc1tbaV1dLCBzZC5yaG8gPSBjY21fbWVhbnMoU21hbGxfbGFnQV94bWFwX1lbW2ldXSwgRlVOID0gc2QsIG5hLnJtID0gVFJVRSkkcmhvKSkNCg0KI1dpdGggdGhlIG1heGltdW0gbGlicmFyeSBzaXplLHNpbmNlIHRoZXJlIGlzIG5vdCByZXBsaWNhdGUsIHNvIFNEIGNhbm5vdCBiZSBjYWxjdWxhdGVkIGFuZCBzZXQgYXMgemVybw0KZm9yKGkgaW4gMTo1KXsNCiAgU21hbGxfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG9bbnJvdyhTbWFsbF9sYWdZX3htYXBfQV9tZWFuc1tbaV1dKV0gPC0gMA0KfQ0KZm9yKGkgaW4gMTo1KXsNCiAgU21hbGxfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRzZC5yaG9bbnJvdyhTbWFsbF9sYWdBX3htYXBfWV9tZWFuc1tbaV1dKV0gPC0gMA0KfQ0KDQojZXhhbXBsZQ0KU21hbGxfbGFnQV94bWFwX1lfbWVhbnNbWzNdXQ0KYGBgDQoNCiMjIyMjIyBHZW5lcmF0aW5nIFN1cnJzb2dhdGUgZGF0YSAoZWJpc3V6YWtpKSBmb3IgZWFjaCByZXBsaWNhdGUgYW5kIENDTQ0KDQotLUZvciBZb3RzdW1vbiAoQ20pDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojR2VuZXJhdGluZyBTdXJyb2dhdGUgZGF0YTsgZm9yIGVhY2ggcmVwbGljYXRlIG9mIHRoZSB0aW1lIHNlcmllcywgd2UgZ2VuZXJhdGVkIDEwMCBzdXJyb2dhdGUgZGF0YQ0Kc2V0LnNlZWQoMTIzNDUpDQpTbWFsbF9ZX2VhY2hfcyA8LSBsaXN0KCkNCg0KU21hbGxfWV9lYWNoX3MgPC0gbGFwcGx5KDE6bGVuZ3RoKFNtYWxsX1lfZWFjaCksIGZ1bmN0aW9uKGkpIG1ha2Vfc3Vycm9nYXRlX2RhdGEoU21hbGxfWV9lYWNoW1tpXV0sIG1ldGhvZCA9IGMoImViaXN1emFraSIpLCBudW1fc3VyciA9IDEwMCkpDQoNClNtYWxsX1lfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChTbWFsbF9ZX2VhY2hfcyksIGZ1bmN0aW9uKGkpIHJiaW5kLmRhdGEuZnJhbWUoU21hbGxfWV9lYWNoX3NbW2ldXSwgbWF0cml4KHJlcChOQSwgMTAwKihub19OQXNfU21hbGwpKSwgbnJvdyA9IG5vX05Bc19TbWFsbCkpKQ0KDQpTbWFsbF9ZX2VhY2hfczIgPC0gTlVMTA0KDQpmb3IoaSBpbiAxOmxlbmd0aChTbWFsbF9ZX2VhY2hfcykpew0KICBTbWFsbF9ZX2VhY2hfczIgPC0gcmJpbmQuZGF0YS5mcmFtZShTbWFsbF9ZX2VhY2hfczIsIFNtYWxsX1lfZWFjaF9zW1tpXV0pDQp9DQpTbWFsbF9ZX2VhY2hfczINCg0KI1N1cnJvZ2F0ZSBZIChZcykgeG1hcCBBIChDQ00pDQpTbWFsbF9BWXMgPC0gY2JpbmQuZGF0YS5mcmFtZShTbWFsbF9ZX2VhY2hfczIsICJTbWFsbF9BIiA9IFNtYWxsX1lBX2FsbGNvbWJpbmVkJFNtYWxsX0EpDQpTbWFsbF9sYWdZc194bWFwX0EgPC0gbGlzdCgpDQogDQpmb3IoaiBpbiAxOjUpIHsNCiAgU21hbGxfbGFnWXNfeG1hcF9BW1tqXV0gPC0gbGFwcGx5KDE6MTAwLCBmdW5jdGlvbihpKSBjY20oU21hbGxfQVlzLCBFID0gU21hbGxfb3B0RV9ZLCBsaWIgPSBjKDEsbnJvdyhTbWFsbF9BWXMpKSwgcHJlZCA9IGMoMSxucm93KFNtYWxsX0FZcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLGksc2VwPSIiKSwgdGFyZ2V0X2NvbHVtbiA9ICJTbWFsbF9BIiwgbGliX3NpemVzICA9IGZsb29yKHNlcShTbWFsbF9vcHRFX1ksIGxlbmd0aChTbWFsbF9BWXNbLCAxXSksbGVuZ3RoID0gMTApKSx0cCA9ICgxIC0gaiksIG51bV9zYW1wbGUgPSAxMDAsIHJlcGxhY2UgPSBGLCBzaWxlbnQgPSBULCBSTkdzZWVkID0gMTIzNCkpDQp9DQoNCiNleGFtcGxlDQpTbWFsbF9sYWdZc194bWFwX0FbWzRdXVtbMTZdXQ0KDQojbWVhbiBhbmQgc2Qgb2Ygc3Vycm9nYXRlIFkgeG1hcCBBDQpTbWFsbF9sYWdZc194bWFwX0FfbWVhbnNfbGlzdCA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBTbWFsbF9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dIDwtIGxhcHBseSgxOmxlbmd0aChTbWFsbF9sYWdZc194bWFwX0FbW2pdXSksIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhTbWFsbF9sYWdZc194bWFwX0FbW2pdXVtbaV1dLCBuYS5ybSA9IFRSVUUpKQ0KfQ0KI2NvbWJpbmluZyB0aGUgbGlzdA0KU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zIDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dIDwtIFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bWzFdXSRyaG8NCiAgZm9yKGkgaW4gMjpsZW5ndGgoU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXSkpew0KICAgIFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dIDwtIGNiaW5kLmRhdGEuZnJhbWUoU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0sIFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bW2ldXSRyaG8pDQogIH0NCn0NCg0KI2NhbGN1bGF0aW5nIG1lYW5zIGFuZCBzZHMgb2YgIm1lYW5zIg0KU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zX21lYW5zIDwtIGxpc3QoKSANClNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc19zZHMgPC0gbGlzdCgpIA0KZm9yKGogaW4gMTo1KSB7DQogIFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFuc1tbal1dIDwtIGFwcGx5KFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dLCAxLCBtZWFuKQ0KICBTbWFsbF9sYWdZc194bWFwX0FfbWVhbnNfc2RzW1tqXV0gPC0gYXBwbHkoU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0sIDEsIHNkKQ0KfQ0KDQojZXhhbXBsZQ0KU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zX3Nkc1tbMV1dDQoNClNtYWxsX2xhZ1lzX3htYXBfQV9zdW1tYXJ5IDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIFNtYWxsX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tqXV0gPC0gZGF0YS5mcmFtZSgibGliX3NpemUiID0gU21hbGxfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXVtbMV1dJGxpYl9zaXplLCAibWVhbiIgPSBTbWFsbF9sYWdZc194bWFwX0FfbWVhbnNfbWVhbnNbW2pdXSwgInNkIiA9IFNtYWxsX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbW2pdXSkNCn0NCiNleGFtcGxlDQpTbWFsbF9sYWdZc194bWFwX0Ffc3VtbWFyeVtbM11dDQpgYGANCg0KLS1Gb3IgQXp1a2kgKENjKQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0dlbmVyYXRpbmcgU3Vycm9nYXRlIGRhdGENCnNldC5zZWVkKDEyMzQ1KQ0KU21hbGxfQV9lYWNoX3MgPC0gbGlzdCgpDQoNClNtYWxsX0FfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChTbWFsbF9BX2VhY2gpLCBmdW5jdGlvbihpKSBtYWtlX3N1cnJvZ2F0ZV9kYXRhKFNtYWxsX0FfZWFjaFtbaV1dLCBtZXRob2QgPSBjKCJlYmlzdXpha2kiKSwgbnVtX3N1cnIgPSAxMDApKQ0KDQpTbWFsbF9BX2VhY2hfcyA8LSBsYXBwbHkoMTpsZW5ndGgoU21hbGxfQV9lYWNoX3MpLCBmdW5jdGlvbihpKSByYmluZC5kYXRhLmZyYW1lKFNtYWxsX0FfZWFjaF9zW1tpXV0sIG1hdHJpeChyZXAoTkEsMTAwKihub19OQXNfU21hbGwpKSwgbnJvdyA9IG5vX05Bc19TbWFsbCkpKQ0KDQpTbWFsbF9BX2VhY2hfczIgPC0gTlVMTA0KDQpmb3IoaSBpbiAxOmxlbmd0aChTbWFsbF9BX2VhY2hfcykpew0KICBTbWFsbF9BX2VhY2hfczIgPC0gcmJpbmQuZGF0YS5mcmFtZShTbWFsbF9BX2VhY2hfczIsIFNtYWxsX0FfZWFjaF9zW1tpXV0pDQp9DQpTbWFsbF9BX2VhY2hfczINCg0KI1N1cnJvZ2F0ZSBBIChBcykgeG1hcCBZIChDQ00pDQpTbWFsbF9ZQXMgPC0gY2JpbmQuZGF0YS5mcmFtZShTbWFsbF9BX2VhY2hfczIsICJTbWFsbF9ZIiA9IFNtYWxsX1lBX2FsbGNvbWJpbmVkJFNtYWxsX1kpDQpTbWFsbF9sYWdBc194bWFwX1kgPC0gbGlzdCgpDQogDQpmb3IoaiBpbiAxOjUpIHsNCiAgU21hbGxfbGFnQXNfeG1hcF9ZW1tqXV0gPC0gbGFwcGx5KDE6MTAwLCBmdW5jdGlvbihpKSBjY20oU21hbGxfWUFzLCBFID0gU21hbGxfb3B0RV9BLCBsaWIgPSBjKDEsbnJvdyhTbWFsbF9ZQXMpKSwgcHJlZCA9IGMoMSxucm93KFNtYWxsX1lBcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLCBpLCBzZXAgPSAiIiksIHRhcmdldF9jb2x1bW4gPSAiU21hbGxfWSIsIGxpYl9zaXplcyAgPSBmbG9vcihzZXEoU21hbGxfb3B0RV9BLCBsZW5ndGgoU21hbGxfWUFzWywgMV0pLGxlbmd0aCA9IDEwKSksdHAgPSAoMSAtIGopLCBudW1fc2FtcGxlID0gMTAwLCByZXBsYWNlID0gRiwgc2lsZW50ID0gVCwgUk5Hc2VlZCA9IDEyMzQpKQ0KfQ0KDQojZXhhbXBsZQ0KU21hbGxfbGFnQXNfeG1hcF9ZW1s0XV1bWzE2XV0NCg0KI21lYW4gYW5kIHNkIG9mIHN1cnJvZ2F0ZSBBIHhtYXAgWQ0KU21hbGxfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3QgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgU21hbGxfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXSA8LSBsYXBwbHkoMTpsZW5ndGgoU21hbGxfbGFnQXNfeG1hcF9ZW1tqXV0pLCBmdW5jdGlvbihpKSBjY21fbWVhbnMoU21hbGxfbGFnQXNfeG1hcF9ZW1tqXV1bW2ldXSwgbmEucm0gPSBUUlVFKSkNCn0NCiNjb21iaW5pbmcgdGhlIGxpc3QNClNtYWxsX2xhZ0FzX3htYXBfWV9tZWFucyA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSA8LSBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1sxXV0kcmhvDQogIGZvcihpIGluIDI6bGVuZ3RoKFNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV0pKXsNCiAgICBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSA8LSBjYmluZC5kYXRhLmZyYW1lKFNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dLCBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1tpXV0kcmhvKQ0KICB9DQp9DQoNCiNjYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzIG9mICJtZWFucyINClNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc19tZWFucyA8LSBsaXN0KCkgDQpTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNfc2RzIDwtIGxpc3QoKSANCmZvcihqIGluIDE6NSkgew0KICBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnNbW2pdXSA8LSBhcHBseShTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSwgMSwgbWVhbikNCiAgU21hbGxfbGFnQXNfeG1hcF9ZX21lYW5zX3Nkc1tbal1dIDwtIGFwcGx5KFNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dLCAxLCBzZCkNCn0NCg0KI2V4YW1wbGUNClNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc19zZHNbWzFdXQ0KDQpTbWFsbF9sYWdBc194bWFwX1lfc3VtbWFyeSA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBTbWFsbF9sYWdBc194bWFwX1lfc3VtbWFyeVtbal1dIDwtIGRhdGEuZnJhbWUoImxpYl9zaXplIiA9IFNtYWxsX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV1bWzFdXSRsaWJfc2l6ZSwgIm1lYW4iID0gU21hbGxfbGFnQXNfeG1hcF9ZX21lYW5zX21lYW5zW1tqXV0sICJzZCIgPSBTbWFsbF9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1tqXV0pDQp9DQojZXhhbXBsZQ0KU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbWzNdXQ0KYGBgDQoNCiMjIyMjIFs4LjMuMy4zXSBGb3IgU21hbGwgY2FnZSBncmFwaGljcw0KDQojIyMjIyMgRGF0YSBzdW1tYXJ5DQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTbWFsbF9jY21ZX3htYXBfQV9hbGwgPC0gbGlzdCgpDQoNCmZvcihpIGluIDE6NSl7DQogIFNtYWxsX2NjbVlfeG1hcF9BX2FsbFtbaV1dIDwtIGRhdGEuZnJhbWUoDQogICAgIkxpYnJhcnlfc2l6ZSIgPSBTbWFsbF9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJGxpYl9zaXplLA0KICAgICJZX3htYXBfQV9yaG8iID0gU21hbGxfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRyaG8sDQogICAgIllzX3htYXBfQV9yaG8iID0gU21hbGxfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRtZWFuLA0KICAgICJZX3htYXBfQV9yaG9fcHNkIiA9IFNtYWxsX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kcmhvICsgU21hbGxfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIllfeG1hcF9BX3Job19tc2QiID0gU21hbGxfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRyaG8gLSBTbWFsbF9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJHNkLnJobywNCiAgICAiWXNfeG1hcF9BX3Job19wc2QiID0gU21hbGxfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRtZWFuICsgU21hbGxfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRzZCwNCiAgICAiWXNfeG1hcF9BX3Job19tc2QiID0gU21hbGxfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRtZWFuIC0gU21hbGxfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRzZA0KICAgICkNCn0NCiNleGFtcGxlDQpTbWFsbF9jY21ZX3htYXBfQV9hbGxbWzJdXQ0KDQpTbWFsbF9jY21BX3htYXBfWV9hbGwgPC0gbGlzdCgpDQoNCmZvcihpIGluIDE6NSl7DQogIFNtYWxsX2NjbUFfeG1hcF9ZX2FsbFtbaV1dIDwtIGRhdGEuZnJhbWUoDQogICAgIkxpYnJhcnlfc2l6ZSIgPSBTbWFsbF9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJGxpYl9zaXplLA0KICAgICJBX3htYXBfWV9yaG8iID0gU21hbGxfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRyaG8sDQogICAgIkFzX3htYXBfWV9yaG8iID0gU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRtZWFuLA0KICAgICJBX3htYXBfWV9yaG9fcHNkIiA9IFNtYWxsX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kcmhvICsgU21hbGxfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIkFfeG1hcF9ZX3Job19tc2QiID0gU21hbGxfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRyaG8gLSBTbWFsbF9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHNkLnJobywNCiAgICAiQXNfeG1hcF9ZX3Job19wc2QiID0gU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRtZWFuICsgU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRzZCwNCiAgICAiQXNfeG1hcF9ZX3Job19tc2QiID0gU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRtZWFuIC0gU21hbGxfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRzZA0KICAgICkNCn0NCiNleGFtcGxlDQpTbWFsbF9jY21BX3htYXBfWV9hbGxbWzJdXQ0KYGBgDQoNCiMjIyMjIyBHcmFwaGljcyBmb3IgQ0NNIFNtYWxsIChmb3IgRmlndXJlIFM0KQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0NDTSBTbWFsbOOBq+mWouOBmeOCi3Bsb3QNClNtYWxsX2NjbV9nZ3Bsb3QgPC0gbGlzdCgpDQpTbWFsbF9zdWJ0aXRsZSA8LSBjKCIoYSkiLCIoYikiLCIoYykiLCIoZCkiLCIoZSkiKQ0KDQpmb3IoaSBpbiAxOjUpew0KI1lfeG1hcF9BOkNtIHhtYXAgQ2MgI0Y4NzY2RCAocmVkKQ0KU21hbGxfY2NtX2dncGxvdFtbaV1dIDwtIGdncGxvdChkYXRhID0gU21hbGxfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWV94bWFwX0FfcmhvKSkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlID0gMSwgY29sb3IgPSAiI0Y4NzY2RCIpICsgDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gIiNGODc2NkQiKSArDQoNCiNBX3htYXBfWTpDYyB4bWFwIENtICMwMEJGQzQgKGJsdWUtZ3JlZW4pICANCiAgZ2VvbV9saW5lKGRhdGEgPSBTbWFsbF9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG8pLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gU21hbGxfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvX3BzZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBTbWFsbF9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBTbWFsbF9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG8pLCBzaGFwZSA9IDE3LCBzaXplID0gMywgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgDQogIGdlb21fbGluZShkYXRhID0gU21hbGxfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWXNfeG1hcF9BX3JobyksIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBTbWFsbF9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvX3BzZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBTbWFsbF9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvX21zZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gU21hbGxfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWXNfeG1hcF9BX3JobyksIHNoYXBlID0gMSwgc2l6ZSA9IDMsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIA0KICBnZW9tX2xpbmUoZGF0YSA9IFNtYWxsX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG8pLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gU21hbGxfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQXNfeG1hcF9ZX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gU21hbGxfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQXNfeG1hcF9ZX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IFNtYWxsX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG8pLCBzaGFwZSA9IDIsIHNpemUgPSAzLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICANCiAgeWxpbSgtMC4xLCAxKSArDQogIHlsYWIoIiIpICsNCiAgeGxhYigiIikgKw0KICBnZ3RpdGxlKHBhc3RlKFNtYWxsX3N1YnRpdGxlW2ldLCAiU21hbGwiLCAidHAgPSIsIDEgLSBpLCBzZXAgPSAiICIpKQ0KfQ0KZm9yKGkgaW4gMTo1KSB7DQogIHByaW50KFNtYWxsX2NjbV9nZ3Bsb3RbW2ldXSkNCn0NCmBgYA0KDQojIyMjIyBbOC4zLjMuNF0gRm9yIE1lZGl1bSBjYWdlIGFuYWx5c2lzDQoNCiMjIyMjIyBDQ00NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCk1lZGl1bV9sYWdZX3htYXBfQSA8LSBsaXN0KCkNCk1lZGl1bV9sYWdBX3htYXBfWSA8LSBsaXN0KCkNCg0KI25vdCBzaG93aW5nIHdhcm5pbmcgDQoNCk1lZGl1bV9sYWdZX3htYXBfQSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKE1lZGl1bV9ZQV9hbGxjb21iaW5lZCwgRSA9IE1lZGl1bV9vcHRFX1ksIGxpYl9jb2x1bW4gPSAiTWVkaXVtX1kiLCB0YXJnZXRfY29sdW1uID0gIk1lZGl1bV9BIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKE1lZGl1bV9vcHRFX1ksIG5yb3coTWVkaXVtX1lBX2FsbGNvbWJpbmVkKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkNCg0KTWVkaXVtX2xhZ0FfeG1hcF9ZIDwtIGxhcHBseSgwOi00LCBmdW5jdGlvbihpKSBjY20oTWVkaXVtX1lBX2FsbGNvbWJpbmVkLCBFID0gTWVkaXVtX29wdEVfQSwgbGliX2NvbHVtbiA9ICJNZWRpdW1fQSIsIHRhcmdldF9jb2x1bW4gPSAiTWVkaXVtX1kiLCBsaWJfc2l6ZXMgPSBmbG9vcihzZXEoTWVkaXVtX29wdEVfQSwgbnJvdyhNZWRpdW1fWUFfYWxsY29tYmluZWQpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKQ0KDQoNCiNleGFtcGxlDQpNZWRpdW1fbGFnWV94bWFwX0FbWzJdXQ0KYGBgDQoNCiMjIyMjIyBDYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnMgPC0gbGlzdCgpDQpNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnMgPC0gbGlzdCgpDQoNCk1lZGl1bV9sYWdZX3htYXBfQV9tZWFucyA8LSBsYXBwbHkoMTo1LCBmdW5jdGlvbihpKSBjY21fbWVhbnMoTWVkaXVtX2xhZ1lfeG1hcF9BW1tpXV0sIG5hLnJtID0gVFJVRSkpDQpNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnMgPC0gbGFwcGx5KDE6NSwgZnVuY3Rpb24oaSkgY2NtX21lYW5zKE1lZGl1bV9sYWdBX3htYXBfWVtbaV1dLCBuYS5ybSA9IFRSVUUpKQ0KDQpNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnMgPC0gbGFwcGx5KDE6NSwgZnVuY3Rpb24oaSkgZGF0YS5mcmFtZShNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnNbW2ldXSwgc2QucmhvID0gY2NtX21lYW5zKE1lZGl1bV9sYWdZX3htYXBfQVtbaV1dLCBGVU4gPSBzZCwgbmEucm0gPSBUUlVFKSRyaG8pKQ0KTWVkaXVtX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGRhdGEuZnJhbWUoTWVkaXVtX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0sIHNkLnJobyA9IGNjbV9tZWFucyhNZWRpdW1fbGFnQV94bWFwX1lbW2ldXSwgRlVOID0gc2QsIG5hLnJtID0gVFJVRSkkcmhvKSkNCg0KI1dpdGggdGhlIG1heGltdW0gbGlicmFyeSBzaXplLHNpbmNlIHRoZXJlIGlzIG5vdCByZXBsaWNhdGUsIHNvIFNEIGNhbm5vdCBiZSBjYWxjdWxhdGVkIGFuZCBzZXQgYXMgemVybw0KZm9yKGkgaW4gMTo1KXsNCiAgTWVkaXVtX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kc2QucmhvW25yb3coTWVkaXVtX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0pXSA8LSAwDQp9DQpmb3IoaSBpbiAxOjUpew0KICBNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRzZC5yaG9bbnJvdyhNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnNbW2ldXSldIDwtIDANCn0NCg0KI2V4YW1wbGUNCk1lZGl1bV9sYWdBX3htYXBfWV9tZWFuc1tbM11dDQpgYGANCg0KIyMjIyMjIEdlbmVyYXRpbmcgU3Vycm9nYXRlIGRhdGEgKGViaXN1emFraSkgZm9yIGVhY2ggcmVwbGljYXRlIGFuZCBDQ00NCg0KLS1Gb3IgWW90c3Vtb24gKENtKQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0dlbmVyYXRpbmcgU3Vycm9nYXRlIGRhdGENCnNldC5zZWVkKDEyMzQ1KQ0KTWVkaXVtX1lfZWFjaF9zIDwtIGxpc3QoKQ0KDQpNZWRpdW1fWV9lYWNoX3MgPC0gbGFwcGx5KDE6bGVuZ3RoKE1lZGl1bV9ZX2VhY2gpLCBmdW5jdGlvbihpKSBtYWtlX3N1cnJvZ2F0ZV9kYXRhKE1lZGl1bV9ZX2VhY2hbW2ldXSwgbWV0aG9kID0gYygiZWJpc3V6YWtpIiksIG51bV9zdXJyID0gMTAwKSkNCg0KTWVkaXVtX1lfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChNZWRpdW1fWV9lYWNoX3MpLCBmdW5jdGlvbihpKSByYmluZC5kYXRhLmZyYW1lKE1lZGl1bV9ZX2VhY2hfc1tbaV1dLCBtYXRyaXgocmVwKE5BLCAxMDAqKG5vX05Bc19NZWRpdW0pKSwgbnJvdyA9IG5vX05Bc19NZWRpdW0pKSkNCg0KTWVkaXVtX1lfZWFjaF9zMiA8LSBOVUxMDQoNCmZvcihpIGluIDE6bGVuZ3RoKE1lZGl1bV9ZX2VhY2hfcykpew0KICBNZWRpdW1fWV9lYWNoX3MyIDwtIHJiaW5kLmRhdGEuZnJhbWUoTWVkaXVtX1lfZWFjaF9zMiwgTWVkaXVtX1lfZWFjaF9zW1tpXV0pDQp9DQpNZWRpdW1fWV9lYWNoX3MyDQoNCiNTdXJyb2dhdGUgWSAoWXMpIHhtYXAgQSAoQ0NNKQ0KTWVkaXVtX0FZcyA8LSBjYmluZC5kYXRhLmZyYW1lKE1lZGl1bV9ZX2VhY2hfczIsICJNZWRpdW1fQSIgPSBNZWRpdW1fWUFfYWxsY29tYmluZWQkTWVkaXVtX0EpDQpNZWRpdW1fbGFnWXNfeG1hcF9BIDwtIGxpc3QoKQ0KIA0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdZc194bWFwX0FbW2pdXSA8LSBsYXBwbHkoMToxMDAsIGZ1bmN0aW9uKGkpIGNjbShNZWRpdW1fQVlzLCBFID0gTWVkaXVtX29wdEVfWSwgbGliID0gYygxLG5yb3coTWVkaXVtX0FZcykpLCBwcmVkID0gYygxLG5yb3coTWVkaXVtX0FZcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLGksc2VwPSIiKSwgdGFyZ2V0X2NvbHVtbiA9ICJNZWRpdW1fQSIsIGxpYl9zaXplcyAgPSBmbG9vcihzZXEoTWVkaXVtX29wdEVfWSwgbGVuZ3RoKE1lZGl1bV9BWXNbLCAxXSksbGVuZ3RoID0gMTApKSx0cCA9ICgxIC0gaiksIG51bV9zYW1wbGUgPSAxMDAsIHJlcGxhY2UgPSBGLCBzaWxlbnQgPSBULCBSTkdzZWVkID0gMTIzNCkpDQp9DQoNCiNleGFtcGxlDQpNZWRpdW1fbGFnWXNfeG1hcF9BW1s0XV1bWzE2XV0NCg0KI21lYW4gYW5kIHNkIG9mIHN1cnJvZ2F0ZSBZIHhtYXAgQQ0KTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0IDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dIDwtIGxhcHBseSgxOmxlbmd0aChNZWRpdW1fbGFnWXNfeG1hcF9BW1tqXV0pLCBmdW5jdGlvbihpKSBjY21fbWVhbnMoTWVkaXVtX2xhZ1lzX3htYXBfQVtbal1dW1tpXV0sIG5hLnJtID0gVFJVRSkpDQp9DQojY29tYmluaW5nIHRoZSBsaXN0DQpNZWRpdW1fbGFnWXNfeG1hcF9BX21lYW5zIDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSA8LSBNZWRpdW1fbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXVtbMV1dJHJobw0KICBmb3IoaSBpbiAyOmxlbmd0aChNZWRpdW1fbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXSkpew0KICAgIE1lZGl1bV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSA8LSBjYmluZC5kYXRhLmZyYW1lKE1lZGl1bV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSwgTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bW2ldXSRyaG8pDQogIH0NCn0NCg0KI2NhbGN1bGF0aW5nIG1lYW5zIGFuZCBzZHMgb2YgIm1lYW5zIg0KTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFucyA8LSBsaXN0KCkgDQpNZWRpdW1fbGFnWXNfeG1hcF9BX21lYW5zX3NkcyA8LSBsaXN0KCkgDQpmb3IoaiBpbiAxOjUpIHsNCiAgTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFuc1tbal1dIDwtIGFwcGx5KE1lZGl1bV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSwgMSwgbWVhbikNCiAgTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbW2pdXSA8LSBhcHBseShNZWRpdW1fbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0sIDEsIHNkKQ0KfQ0KDQojZXhhbXBsZQ0KTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbWzFdXQ0KDQpNZWRpdW1fbGFnWXNfeG1hcF9BX3N1bW1hcnkgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgTWVkaXVtX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tqXV0gPC0gZGF0YS5mcmFtZSgibGliX3NpemUiID0gTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bWzFdXSRsaWJfc2l6ZSwgIm1lYW4iID0gTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFuc1tbal1dLCAic2QiID0gTWVkaXVtX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbW2pdXSkNCn0NCiNleGFtcGxlDQpNZWRpdW1fbGFnWXNfeG1hcF9BX3N1bW1hcnlbWzNdXQ0KYGBgDQoNCi0tRm9yIEF6dWtpIChDYykNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNHZW5lcmF0aW5nIFN1cnJvZ2F0ZSBkYXRhDQpzZXQuc2VlZCgxMjM0NSkNCk1lZGl1bV9BX2VhY2hfcyA8LSBsaXN0KCkNCg0KTWVkaXVtX0FfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChNZWRpdW1fQV9lYWNoKSwgZnVuY3Rpb24oaSkgbWFrZV9zdXJyb2dhdGVfZGF0YShNZWRpdW1fQV9lYWNoW1tpXV0sIG1ldGhvZCA9IGMoImViaXN1emFraSIpLCBudW1fc3VyciA9IDEwMCkpDQoNCk1lZGl1bV9BX2VhY2hfcyA8LSBsYXBwbHkoMTpsZW5ndGgoTWVkaXVtX0FfZWFjaF9zKSwgZnVuY3Rpb24oaSkgcmJpbmQuZGF0YS5mcmFtZShNZWRpdW1fQV9lYWNoX3NbW2ldXSwgbWF0cml4KHJlcChOQSwxMDAqKG5vX05Bc19NZWRpdW0pKSwgbnJvdyA9IG5vX05Bc19NZWRpdW0pKSkNCg0KTWVkaXVtX0FfZWFjaF9zMiA8LSBOVUxMDQoNCmZvcihpIGluIDE6bGVuZ3RoKE1lZGl1bV9BX2VhY2hfcykpew0KICBNZWRpdW1fQV9lYWNoX3MyIDwtIHJiaW5kLmRhdGEuZnJhbWUoTWVkaXVtX0FfZWFjaF9zMiwgTWVkaXVtX0FfZWFjaF9zW1tpXV0pDQp9DQpNZWRpdW1fQV9lYWNoX3MyDQoNCiNTdXJyb2dhdGUgQSAoQXMpIHhtYXAgWSAoQ0NNKQ0KTWVkaXVtX1lBcyA8LSBjYmluZC5kYXRhLmZyYW1lKE1lZGl1bV9BX2VhY2hfczIsICJNZWRpdW1fWSIgPSBNZWRpdW1fWUFfYWxsY29tYmluZWQkTWVkaXVtX1kpDQpNZWRpdW1fbGFnQXNfeG1hcF9ZIDwtIGxpc3QoKQ0KIA0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdBc194bWFwX1lbW2pdXSA8LSBsYXBwbHkoMToxMDAsIGZ1bmN0aW9uKGkpIGNjbShNZWRpdW1fWUFzLCBFID0gTWVkaXVtX29wdEVfQSwgbGliID0gYygxLG5yb3coTWVkaXVtX1lBcykpLCBwcmVkID0gYygxLG5yb3coTWVkaXVtX1lBcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLCBpLCBzZXAgPSAiIiksIHRhcmdldF9jb2x1bW4gPSAiTWVkaXVtX1kiLCBsaWJfc2l6ZXMgID0gZmxvb3Ioc2VxKE1lZGl1bV9vcHRFX0EsIGxlbmd0aChNZWRpdW1fWUFzWywgMV0pLGxlbmd0aCA9IDEwKSksdHAgPSAoMSAtIGopLCBudW1fc2FtcGxlID0gMTAwLCByZXBsYWNlID0gRiwgc2lsZW50ID0gVCwgUk5Hc2VlZCA9IDEyMzQpKQ0KfQ0KDQojZXhhbXBsZQ0KTWVkaXVtX2xhZ0FzX3htYXBfWVtbNF1dW1sxNl1dDQoNCiNtZWFuIGFuZCBzZCBvZiBzdXJyb2dhdGUgQSB4bWFwIFkNCk1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdCA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBNZWRpdW1fbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXSA8LSBsYXBwbHkoMTpsZW5ndGgoTWVkaXVtX2xhZ0FzX3htYXBfWVtbal1dKSwgZnVuY3Rpb24oaSkgY2NtX21lYW5zKE1lZGl1bV9sYWdBc194bWFwX1lbW2pdXVtbaV1dLCBuYS5ybSA9IFRSVUUpKQ0KfQ0KI2NvbWJpbmluZyB0aGUgbGlzdA0KTWVkaXVtX2xhZ0FzX3htYXBfWV9tZWFucyA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBNZWRpdW1fbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0gPC0gTWVkaXVtX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV1bWzFdXSRyaG8NCiAgZm9yKGkgaW4gMjpsZW5ndGgoTWVkaXVtX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV0pKXsNCiAgICBNZWRpdW1fbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0gPC0gY2JpbmQuZGF0YS5mcmFtZShNZWRpdW1fbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0sIE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1tpXV0kcmhvKQ0KICB9DQp9DQoNCiNjYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzIG9mICJtZWFucyINCk1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnMgPC0gbGlzdCgpIA0KTWVkaXVtX2xhZ0FzX3htYXBfWV9tZWFuc19zZHMgPC0gbGlzdCgpIA0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnNbW2pdXSA8LSBhcHBseShNZWRpdW1fbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0sIDEsIG1lYW4pDQogIE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1tqXV0gPC0gYXBwbHkoTWVkaXVtX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dLCAxLCBzZCkNCn0NCg0KI2V4YW1wbGUNCk1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1sxXV0NCg0KTWVkaXVtX2xhZ0FzX3htYXBfWV9zdW1tYXJ5IDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIE1lZGl1bV9sYWdBc194bWFwX1lfc3VtbWFyeVtbal1dIDwtIGRhdGEuZnJhbWUoImxpYl9zaXplIiA9IE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1sxXV0kbGliX3NpemUsICJtZWFuIiA9IE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnNbW2pdXSwgInNkIiA9IE1lZGl1bV9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1tqXV0pDQp9DQojZXhhbXBsZQ0KTWVkaXVtX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1szXV0NCmBgYA0KDQojIyMjIyBbOC4zLjMuNV0gRm9yIE1lZGl1bSBjYWdlIGdyYXBoaWNzDQoNCiMjIyMjIyBEYXRhIHN1bW1hcnkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCk1lZGl1bV9jY21ZX3htYXBfQV9hbGwgPC0gbGlzdCgpDQoNCmZvcihpIGluIDE6NSl7DQogIE1lZGl1bV9jY21ZX3htYXBfQV9hbGxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgICJMaWJyYXJ5X3NpemUiID0gTWVkaXVtX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kbGliX3NpemUsDQogICAgIllfeG1hcF9BX3JobyIgPSBNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRyaG8sDQogICAgIllzX3htYXBfQV9yaG8iID0gTWVkaXVtX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kbWVhbiwNCiAgICAiWV94bWFwX0FfcmhvX3BzZCIgPSBNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRyaG8gKyBNZWRpdW1fbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIllfeG1hcF9BX3Job19tc2QiID0gTWVkaXVtX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kcmhvIC0gTWVkaXVtX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kc2QucmhvLA0KICAgICJZc194bWFwX0FfcmhvX3BzZCIgPSBNZWRpdW1fbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRtZWFuICsgTWVkaXVtX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kc2QsDQogICAgIllzX3htYXBfQV9yaG9fbXNkIiA9IE1lZGl1bV9sYWdZc194bWFwX0Ffc3VtbWFyeVtbaV1dJG1lYW4gLSBNZWRpdW1fbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRzZA0KICAgICkNCn0NCiNleGFtcGxlDQpNZWRpdW1fY2NtWV94bWFwX0FfYWxsW1syXV0NCg0KTWVkaXVtX2NjbUFfeG1hcF9ZX2FsbCA8LSBsaXN0KCkNCg0KZm9yKGkgaW4gMTo1KXsNCiAgTWVkaXVtX2NjbUFfeG1hcF9ZX2FsbFtbaV1dIDwtIGRhdGEuZnJhbWUoDQogICAgIkxpYnJhcnlfc2l6ZSIgPSBNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRsaWJfc2l6ZSwNCiAgICAiQV94bWFwX1lfcmhvIiA9IE1lZGl1bV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHJobywNCiAgICAiQXNfeG1hcF9ZX3JobyIgPSBNZWRpdW1fbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRtZWFuLA0KICAgICJBX3htYXBfWV9yaG9fcHNkIiA9IE1lZGl1bV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHJobyArIE1lZGl1bV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHNkLnJobywNCiAgICAiQV94bWFwX1lfcmhvX21zZCIgPSBNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRyaG8gLSBNZWRpdW1fbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIkFzX3htYXBfWV9yaG9fcHNkIiA9IE1lZGl1bV9sYWdBc194bWFwX1lfc3VtbWFyeVtbaV1dJG1lYW4gKyBNZWRpdW1fbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRzZCwNCiAgICAiQXNfeG1hcF9ZX3Job19tc2QiID0gTWVkaXVtX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kbWVhbiAtIE1lZGl1bV9sYWdBc194bWFwX1lfc3VtbWFyeVtbaV1dJHNkDQogICAgKQ0KfQ0KI2V4YW1wbGUNCk1lZGl1bV9jY21BX3htYXBfWV9hbGxbWzJdXQ0KYGBgDQoNCiMjIyMjIyBHcmFwaGljcyBmb3IgQ0NNIE1lZGl1bSAoZm9yIEZpZ3VyZSBTNCkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNDQ00gTWVkaXVt44Gr6Zai44GZ44KLcGxvdA0KTWVkaXVtX2NjbV9nZ3Bsb3QgPC0gbGlzdCgpDQpNZWRpdW1fc3VidGl0bGUgPC0gYygiKGYpIiwiKGcpIiwiKGgpIiwiKGkpIiwiKGopIikNCg0KZm9yKGkgaW4gMTo1KXsNCiNZX3htYXBfQTpDbSB4bWFwIENjICNGODc2NkQgKHJlZCkNCk1lZGl1bV9jY21fZ2dwbG90W1tpXV0gPC0gZ2dwbG90KGRhdGEgPSBNZWRpdW1fY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWV94bWFwX0FfcmhvKSkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlID0gMSwgY29sb3IgPSAiI0Y4NzY2RCIpICsgDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gIiNGODc2NkQiKSArDQoNCiNBX3htYXBfWTpDYyB4bWFwIENtICMwMEJGQzQgKGJsdWUtZ3JlZW4pICANCiAgZ2VvbV9saW5lKGRhdGEgPSBNZWRpdW1fY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvKSwgbGluZXR5cGUgPSAxLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IE1lZGl1bV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG9fcHNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IE1lZGl1bV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBNZWRpdW1fY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvKSwgc2hhcGUgPSAxNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIA0KICBnZW9tX2xpbmUoZGF0YSA9IE1lZGl1bV9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvKSwgbGluZXR5cGUgPSAxLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IE1lZGl1bV9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvX3BzZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBNZWRpdW1fY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWXNfeG1hcF9BX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IE1lZGl1bV9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvKSwgc2hhcGUgPSAxLCBzaXplID0gMywgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgDQogIGdlb21fbGluZShkYXRhID0gTWVkaXVtX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG8pLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gTWVkaXVtX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG9fcHNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IE1lZGl1bV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvX21zZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gTWVkaXVtX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG8pLCBzaGFwZSA9IDIsIHNpemUgPSAzLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KIA0KICB5bGltKC0wLjEsIDEpICsNCiAgeWxhYigiIikgKw0KICB4bGFiKCIiKSArDQogIGdndGl0bGUocGFzdGUoTWVkaXVtX3N1YnRpdGxlW2ldLCAiTWVkaXVtIiwgInRwID0iLCAxIC0gaSwgc2VwID0gIiAiKSkNCn0NCmZvcihpIGluIDE6NSkgew0KICBwcmludChNZWRpdW1fY2NtX2dncGxvdFtbaV1dKQ0KfQ0KYGBgDQoNCiMjIyMjIFs4LjMuMy42XSBGb3IgTGFyZ2UgY2FnZSBhbmFseXNpcw0KDQojIyMjIyMgQ0NNDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpMYXJnZV9sYWdZX3htYXBfQSA8LSBsaXN0KCkNCkxhcmdlX2xhZ0FfeG1hcF9ZIDwtIGxpc3QoKQ0KDQojbm90IHNob3dpbmcgd2FybmluZyANCg0KTGFyZ2VfbGFnWV94bWFwX0EgPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShMYXJnZV9ZQV9hbGxjb21iaW5lZCwgRSA9IExhcmdlX29wdEVfWSwgbGliX2NvbHVtbiA9ICJMYXJnZV9ZIiwgdGFyZ2V0X2NvbHVtbiA9ICJMYXJnZV9BIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKExhcmdlX29wdEVfWSwgbnJvdyhMYXJnZV9ZQV9hbGxjb21iaW5lZCksIGxlbmd0aCA9IDEwKSksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpDQoNCkxhcmdlX2xhZ0FfeG1hcF9ZIDwtIGxhcHBseSgwOi00LCBmdW5jdGlvbihpKSBjY20oTGFyZ2VfWUFfYWxsY29tYmluZWQsIEUgPSBMYXJnZV9vcHRFX0EsIGxpYl9jb2x1bW4gPSAiTGFyZ2VfQSIsIHRhcmdldF9jb2x1bW4gPSAiTGFyZ2VfWSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShMYXJnZV9vcHRFX0EsIG5yb3coTGFyZ2VfWUFfYWxsY29tYmluZWQpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKQ0KDQoNCiNleGFtcGxlDQpMYXJnZV9sYWdZX3htYXBfQVtbMl1dDQpgYGANCg0KIyMjIyMjIENhbGN1bGF0aW5nIG1lYW5zIGFuZCBzZHMNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkxhcmdlX2xhZ1lfeG1hcF9BX21lYW5zIDwtIGxpc3QoKQ0KTGFyZ2VfbGFnQV94bWFwX1lfbWVhbnMgPC0gbGlzdCgpDQoNCkxhcmdlX2xhZ1lfeG1hcF9BX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhMYXJnZV9sYWdZX3htYXBfQVtbaV1dLCBuYS5ybSA9IFRSVUUpKQ0KTGFyZ2VfbGFnQV94bWFwX1lfbWVhbnMgPC0gbGFwcGx5KDE6NSwgZnVuY3Rpb24oaSkgY2NtX21lYW5zKExhcmdlX2xhZ0FfeG1hcF9ZW1tpXV0sIG5hLnJtID0gVFJVRSkpDQoNCkxhcmdlX2xhZ1lfeG1hcF9BX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGRhdGEuZnJhbWUoTGFyZ2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSwgc2QucmhvID0gY2NtX21lYW5zKExhcmdlX2xhZ1lfeG1hcF9BW1tpXV0sIEZVTiA9IHNkLCBuYS5ybSA9IFRSVUUpJHJobykpDQpMYXJnZV9sYWdBX3htYXBfWV9tZWFucyA8LSBsYXBwbHkoMTo1LCBmdW5jdGlvbihpKSBkYXRhLmZyYW1lKExhcmdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0sIHNkLnJobyA9IGNjbV9tZWFucyhMYXJnZV9sYWdBX3htYXBfWVtbaV1dLCBGVU4gPSBzZCwgbmEucm0gPSBUUlVFKSRyaG8pKQ0KDQojV2l0aCB0aGUgbWF4aW11bSBsaWJyYXJ5IHNpemUsc2luY2UgdGhlcmUgaXMgbm90IHJlcGxpY2F0ZSwgc28gU0QgY2Fubm90IGJlIGNhbGN1bGF0ZWQgYW5kIHNldCBhcyB6ZXJvDQpmb3IoaSBpbiAxOjUpew0KICBMYXJnZV9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJHNkLnJob1tucm93KExhcmdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0pXSA8LSAwDQp9DQpmb3IoaSBpbiAxOjUpew0KICBMYXJnZV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHNkLnJob1tucm93KExhcmdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0pXSA8LSAwDQp9DQoNCiNleGFtcGxlDQpMYXJnZV9sYWdBX3htYXBfWV9tZWFuc1tbM11dDQpgYGANCg0KIyMjIyMjIEdlbmVyYXRpbmcgU3Vycm9nYXRlIGRhdGEgKGViaXN1emFraSkgZm9yIGVhY2ggcmVwbGljYXRlIGFuZCBDQ00NCg0KLS1Gb3IgWW90c3Vtb24gKENtKQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0dlbmVyYXRpbmcgU3Vycm9nYXRlIGRhdGENCnNldC5zZWVkKDEyMzQ1KQ0KTGFyZ2VfWV9lYWNoX3MgPC0gbGlzdCgpDQoNCkxhcmdlX1lfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChMYXJnZV9ZX2VhY2gpLCBmdW5jdGlvbihpKSBtYWtlX3N1cnJvZ2F0ZV9kYXRhKExhcmdlX1lfZWFjaFtbaV1dLCBtZXRob2QgPSBjKCJlYmlzdXpha2kiKSwgbnVtX3N1cnIgPSAxMDApKQ0KDQpMYXJnZV9ZX2VhY2hfcyA8LSBsYXBwbHkoMTpsZW5ndGgoTGFyZ2VfWV9lYWNoX3MpLCBmdW5jdGlvbihpKSByYmluZC5kYXRhLmZyYW1lKExhcmdlX1lfZWFjaF9zW1tpXV0sIG1hdHJpeChyZXAoTkEsIDEwMCoobm9fTkFzX0xhcmdlKSksIG5yb3cgPSBub19OQXNfTGFyZ2UpKSkNCg0KTGFyZ2VfWV9lYWNoX3MyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2VfWV9lYWNoX3MpKXsNCiAgTGFyZ2VfWV9lYWNoX3MyIDwtIHJiaW5kLmRhdGEuZnJhbWUoTGFyZ2VfWV9lYWNoX3MyLCBMYXJnZV9ZX2VhY2hfc1tbaV1dKQ0KfQ0KTGFyZ2VfWV9lYWNoX3MyDQoNCiNTdXJyb2dhdGUgWSAoWXMpIHhtYXAgQSAoQ0NNKQ0KTGFyZ2VfQVlzIDwtIGNiaW5kLmRhdGEuZnJhbWUoTGFyZ2VfWV9lYWNoX3MyLCAiTGFyZ2VfQSIgPSBMYXJnZV9ZQV9hbGxjb21iaW5lZCRMYXJnZV9BKQ0KTGFyZ2VfbGFnWXNfeG1hcF9BIDwtIGxpc3QoKQ0KIA0KZm9yKGogaW4gMTo1KSB7DQogIExhcmdlX2xhZ1lzX3htYXBfQVtbal1dIDwtIGxhcHBseSgxOjEwMCwgZnVuY3Rpb24oaSkgY2NtKExhcmdlX0FZcywgRSA9IExhcmdlX29wdEVfWSwgbGliID0gYygxLG5yb3coTGFyZ2VfQVlzKSksIHByZWQgPSBjKDEsbnJvdyhMYXJnZV9BWXMpKSwgbGliX2NvbHVtbiA9IHBhc3RlKCJWIixpLHNlcD0iIiksIHRhcmdldF9jb2x1bW4gPSAiTGFyZ2VfQSIsIGxpYl9zaXplcyAgPSBmbG9vcihzZXEoTGFyZ2Vfb3B0RV9ZLCBsZW5ndGgoTGFyZ2VfQVlzWywgMV0pLGxlbmd0aCA9IDEwKSksdHAgPSAoMSAtIGopLCBudW1fc2FtcGxlID0gMTAwLCByZXBsYWNlID0gRiwgc2lsZW50ID0gVCwgUk5Hc2VlZCA9IDEyMzQpKQ0KfQ0KDQojZXhhbXBsZQ0KTGFyZ2VfbGFnWXNfeG1hcF9BW1s0XV1bWzE2XV0NCg0KI21lYW4gYW5kIHNkIG9mIHN1cnJvZ2F0ZSBZIHhtYXAgQQ0KTGFyZ2VfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3QgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgTGFyZ2VfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXSA8LSBsYXBwbHkoMTpsZW5ndGgoTGFyZ2VfbGFnWXNfeG1hcF9BW1tqXV0pLCBmdW5jdGlvbihpKSBjY21fbWVhbnMoTGFyZ2VfbGFnWXNfeG1hcF9BW1tqXV1bW2ldXSwgbmEucm0gPSBUUlVFKSkNCn0NCiNjb21iaW5pbmcgdGhlIGxpc3QNCkxhcmdlX2xhZ1lzX3htYXBfQV9tZWFucyA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSA8LSBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dW1sxXV0kcmhvDQogIGZvcihpIGluIDI6bGVuZ3RoKExhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV0pKXsNCiAgICBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSA8LSBjYmluZC5kYXRhLmZyYW1lKExhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dLCBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dW1tpXV0kcmhvKQ0KICB9DQp9DQoNCiNjYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzIG9mICJtZWFucyINCkxhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFucyA8LSBsaXN0KCkgDQpMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNfc2RzIDwtIGxpc3QoKSANCmZvcihqIGluIDE6NSkgew0KICBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNfbWVhbnNbW2pdXSA8LSBhcHBseShMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNbW2pdXSwgMSwgbWVhbikNCiAgTGFyZ2VfbGFnWXNfeG1hcF9BX21lYW5zX3Nkc1tbal1dIDwtIGFwcGx5KExhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dLCAxLCBzZCkNCn0NCg0KI2V4YW1wbGUNCkxhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbWzFdXQ0KDQpMYXJnZV9sYWdZc194bWFwX0Ffc3VtbWFyeSA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBMYXJnZV9sYWdZc194bWFwX0Ffc3VtbWFyeVtbal1dIDwtIGRhdGEuZnJhbWUoImxpYl9zaXplIiA9IExhcmdlX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bWzFdXSRsaWJfc2l6ZSwgIm1lYW4iID0gTGFyZ2VfbGFnWXNfeG1hcF9BX21lYW5zX21lYW5zW1tqXV0sICJzZCIgPSBMYXJnZV9sYWdZc194bWFwX0FfbWVhbnNfc2RzW1tqXV0pDQp9DQojZXhhbXBsZQ0KTGFyZ2VfbGFnWXNfeG1hcF9BX3N1bW1hcnlbWzNdXQ0KYGBgDQoNCi0tRm9yIEF6dWtpIChDYykNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNHZW5lcmF0aW5nIFN1cnJvZ2F0ZSBkYXRhDQpzZXQuc2VlZCgxMjM0NSkNCkxhcmdlX0FfZWFjaF9zIDwtIGxpc3QoKQ0KDQpMYXJnZV9BX2VhY2hfcyA8LSBsYXBwbHkoMTpsZW5ndGgoTGFyZ2VfQV9lYWNoKSwgZnVuY3Rpb24oaSkgbWFrZV9zdXJyb2dhdGVfZGF0YShMYXJnZV9BX2VhY2hbW2ldXSwgbWV0aG9kID0gYygiZWJpc3V6YWtpIiksIG51bV9zdXJyID0gMTAwKSkNCg0KTGFyZ2VfQV9lYWNoX3MgPC0gbGFwcGx5KDE6bGVuZ3RoKExhcmdlX0FfZWFjaF9zKSwgZnVuY3Rpb24oaSkgcmJpbmQuZGF0YS5mcmFtZShMYXJnZV9BX2VhY2hfc1tbaV1dLCBtYXRyaXgocmVwKE5BLDEwMCoobm9fTkFzX0xhcmdlKSksIG5yb3cgPSBub19OQXNfTGFyZ2UpKSkNCg0KTGFyZ2VfQV9lYWNoX3MyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2VfQV9lYWNoX3MpKXsNCiAgTGFyZ2VfQV9lYWNoX3MyIDwtIHJiaW5kLmRhdGEuZnJhbWUoTGFyZ2VfQV9lYWNoX3MyLCBMYXJnZV9BX2VhY2hfc1tbaV1dKQ0KfQ0KTGFyZ2VfQV9lYWNoX3MyDQoNCiNTdXJyb2dhdGUgQSAoQXMpIHhtYXAgWSAoQ0NNKQ0KTGFyZ2VfWUFzIDwtIGNiaW5kLmRhdGEuZnJhbWUoTGFyZ2VfQV9lYWNoX3MyLCAiTGFyZ2VfWSIgPSBMYXJnZV9ZQV9hbGxjb21iaW5lZCRMYXJnZV9ZKQ0KTGFyZ2VfbGFnQXNfeG1hcF9ZIDwtIGxpc3QoKQ0KIA0KZm9yKGogaW4gMTo1KSB7DQogIExhcmdlX2xhZ0FzX3htYXBfWVtbal1dIDwtIGxhcHBseSgxOjEwMCwgZnVuY3Rpb24oaSkgY2NtKExhcmdlX1lBcywgRSA9IExhcmdlX29wdEVfQSwgbGliID0gYygxLG5yb3coTGFyZ2VfWUFzKSksIHByZWQgPSBjKDEsbnJvdyhMYXJnZV9ZQXMpKSwgbGliX2NvbHVtbiA9IHBhc3RlKCJWIiwgaSwgc2VwID0gIiIpLCB0YXJnZXRfY29sdW1uID0gIkxhcmdlX1kiLCBsaWJfc2l6ZXMgID0gZmxvb3Ioc2VxKExhcmdlX29wdEVfQSwgbGVuZ3RoKExhcmdlX1lBc1ssIDFdKSxsZW5ndGggPSAxMCkpLHRwID0gKDEgLSBqKSwgbnVtX3NhbXBsZSA9IDEwMCwgcmVwbGFjZSA9IEYsIHNpbGVudCA9IFQsIFJOR3NlZWQgPSAxMjM0KSkNCn0NCg0KI2V4YW1wbGUNCkxhcmdlX2xhZ0FzX3htYXBfWVtbNF1dW1sxNl1dDQoNCiNtZWFuIGFuZCBzZCBvZiBzdXJyb2dhdGUgQSB4bWFwIFkNCkxhcmdlX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0IDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIExhcmdlX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV0gPC0gbGFwcGx5KDE6bGVuZ3RoKExhcmdlX2xhZ0FzX3htYXBfWVtbal1dKSwgZnVuY3Rpb24oaSkgY2NtX21lYW5zKExhcmdlX2xhZ0FzX3htYXBfWVtbal1dW1tpXV0sIG5hLnJtID0gVFJVRSkpDQp9DQojY29tYmluaW5nIHRoZSBsaXN0DQpMYXJnZV9sYWdBc194bWFwX1lfbWVhbnMgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0gPC0gTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXVtbMV1dJHJobw0KICBmb3IoaSBpbiAyOmxlbmd0aChMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dKSl7DQogICAgTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0gPC0gY2JpbmQuZGF0YS5mcmFtZShMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSwgTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXVtbaV1dJHJobykNCiAgfQ0KfQ0KDQojY2FsY3VsYXRpbmcgbWVhbnMgYW5kIHNkcyBvZiAibWVhbnMiDQpMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnMgPC0gbGlzdCgpIA0KTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zX3NkcyA8LSBsaXN0KCkgDQpmb3IoaiBpbiAxOjUpIHsNCiAgTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zX21lYW5zW1tqXV0gPC0gYXBwbHkoTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zW1tqXV0sIDEsIG1lYW4pDQogIExhcmdlX2xhZ0FzX3htYXBfWV9tZWFuc19zZHNbW2pdXSA8LSBhcHBseShMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSwgMSwgc2QpDQp9DQoNCiNleGFtcGxlDQpMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1sxXV0NCg0KTGFyZ2VfbGFnQXNfeG1hcF9ZX3N1bW1hcnkgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgTGFyZ2VfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2pdXSA8LSBkYXRhLmZyYW1lKCJsaWJfc2l6ZSIgPSBMYXJnZV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1sxXV0kbGliX3NpemUsICJtZWFuIiA9IExhcmdlX2xhZ0FzX3htYXBfWV9tZWFuc19tZWFuc1tbal1dLCAic2QiID0gTGFyZ2VfbGFnQXNfeG1hcF9ZX21lYW5zX3Nkc1tbal1dKQ0KfQ0KI2V4YW1wbGUNCkxhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1szXV0NCmBgYA0KDQojIyMjIyBbOC4zLjMuN10gRm9yIExhcmdlIGNhZ2UgZ3JhcGhpY3MNCg0KIyMjIyMjIERhdGEgc3VtbWFyeQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTGFyZ2VfY2NtWV94bWFwX0FfYWxsIDwtIGxpc3QoKQ0KDQpmb3IoaSBpbiAxOjUpew0KICBMYXJnZV9jY21ZX3htYXBfQV9hbGxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgICJMaWJyYXJ5X3NpemUiID0gTGFyZ2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRsaWJfc2l6ZSwNCiAgICAiWV94bWFwX0FfcmhvIiA9IExhcmdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kcmhvLA0KICAgICJZc194bWFwX0FfcmhvIiA9IExhcmdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kbWVhbiwNCiAgICAiWV94bWFwX0FfcmhvX3BzZCIgPSBMYXJnZV9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJHJobyArIExhcmdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kc2QucmhvLA0KICAgICJZX3htYXBfQV9yaG9fbXNkIiA9IExhcmdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kcmhvIC0gTGFyZ2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIllzX3htYXBfQV9yaG9fcHNkIiA9IExhcmdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kbWVhbiArIExhcmdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kc2QsDQogICAgIllzX3htYXBfQV9yaG9fbXNkIiA9IExhcmdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kbWVhbiAtIExhcmdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kc2QNCiAgICApDQp9DQojZXhhbXBsZQ0KTGFyZ2VfY2NtWV94bWFwX0FfYWxsW1syXV0NCg0KTGFyZ2VfY2NtQV94bWFwX1lfYWxsIDwtIGxpc3QoKQ0KDQpmb3IoaSBpbiAxOjUpew0KICBMYXJnZV9jY21BX3htYXBfWV9hbGxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgICJMaWJyYXJ5X3NpemUiID0gTGFyZ2VfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRsaWJfc2l6ZSwNCiAgICAiQV94bWFwX1lfcmhvIiA9IExhcmdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kcmhvLA0KICAgICJBc194bWFwX1lfcmhvIiA9IExhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kbWVhbiwNCiAgICAiQV94bWFwX1lfcmhvX3BzZCIgPSBMYXJnZV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHJobyArIExhcmdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kc2QucmhvLA0KICAgICJBX3htYXBfWV9yaG9fbXNkIiA9IExhcmdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kcmhvIC0gTGFyZ2VfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIkFzX3htYXBfWV9yaG9fcHNkIiA9IExhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kbWVhbiArIExhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kc2QsDQogICAgIkFzX3htYXBfWV9yaG9fbXNkIiA9IExhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kbWVhbiAtIExhcmdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kc2QNCiAgICApDQp9DQojZXhhbXBsZQ0KTGFyZ2VfY2NtQV94bWFwX1lfYWxsW1syXV0NCmBgYA0KDQojIyMjIyMgR3JhcGhpY3MgZm9yIENDTSBMYXJnZSAoZm9yIEZpZ3VyZSBTNCkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNDQ00gTGFyZ2XjgavplqLjgZnjgotwbG90DQpMYXJnZV9jY21fZ2dwbG90IDwtIGxpc3QoKQ0KTGFyZ2Vfc3VidGl0bGUgPC0gYygiKGspIiwiKGwpIiwiKG0pIiwiKG4pIiwiKG8pIikNCg0KZm9yKGkgaW4gMTo1KXsNCiNZX3htYXBfQTpDbSB4bWFwIENjICNGODc2NkQgKHJlZCkNCkxhcmdlX2NjbV9nZ3Bsb3RbW2ldXSA8LSBnZ3Bsb3QoZGF0YSA9IExhcmdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3JobykpICsgDQogIGdlb21fbGluZShsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiNGODc2NkQiKSArIA0KICBnZW9tX2xpbmUoYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZX3htYXBfQV9yaG9fcHNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KICBnZW9tX2xpbmUoYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZX3htYXBfQV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMTYsIHNpemUgPSAzLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KDQojQV94bWFwX1k6Q2MgeG1hcCBDbSAjMDBCRkM0IChibHVlLWdyZWVuKSAgDQogIGdlb21fbGluZShkYXRhID0gTGFyZ2VfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvKSwgbGluZXR5cGUgPSAxLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IExhcmdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFfeG1hcF9ZX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gTGFyZ2VfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvX21zZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gTGFyZ2VfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQV94bWFwX1lfcmhvKSwgc2hhcGUgPSAxNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIA0KICBnZW9tX2xpbmUoZGF0YSA9IExhcmdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlzX3htYXBfQV9yaG8pLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShkYXRhID0gTGFyZ2VfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWXNfeG1hcF9BX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShkYXRhID0gTGFyZ2VfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWXNfeG1hcF9BX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IExhcmdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlzX3htYXBfQV9yaG8pLCBzaGFwZSA9IDEsIHNpemUgPSAzLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KICANCiAgZ2VvbV9saW5lKGRhdGEgPSBMYXJnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvKSwgbGluZXR5cGUgPSAxLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IExhcmdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG9fcHNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IExhcmdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFzX3htYXBfWV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBMYXJnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvKSwgc2hhcGUgPSAyLCBzaXplID0gMywgY29sb3IgPSAiIzAwQkZDNCIpICsNCg0KICB5bGltKC0wLjEsIDEpICsNCiAgeWxhYigiIikgKw0KICB4bGFiKCIiKSArDQogIGdndGl0bGUocGFzdGUoTGFyZ2Vfc3VidGl0bGVbaV0sICJMYXJnZSIsICJ0cCA9IiwgMSAtIGksIHNlcCA9ICIgIikpDQp9DQpmb3IoaSBpbiAxOjUpIHsNCiAgcHJpbnQoTGFyZ2VfY2NtX2dncGxvdFtbaV1dKQ0KfQ0KYGBgDQoNCiMjIyMjIFs4LjMuMy44XSBGb3IgSHVnZSBjYWdlIGFuYWx5c2lzDQoNCiMjIyMjIyBDQ00NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkh1Z2VfbGFnWV94bWFwX0EgPC0gbGlzdCgpDQpIdWdlX2xhZ0FfeG1hcF9ZIDwtIGxpc3QoKQ0KDQojbm90IHNob3dpbmcgd2FybmluZyANCg0KSHVnZV9sYWdZX3htYXBfQSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKEh1Z2VfWUFfYWxsY29tYmluZWQsIEUgPSBIdWdlX29wdEVfWSwgbGliX2NvbHVtbiA9ICJIdWdlX1kiLCB0YXJnZXRfY29sdW1uID0gIkh1Z2VfQSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShIdWdlX29wdEVfWSwgbnJvdyhIdWdlX1lBX2FsbGNvbWJpbmVkKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkNCg0KSHVnZV9sYWdBX3htYXBfWSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKEh1Z2VfWUFfYWxsY29tYmluZWQsIEUgPSBIdWdlX29wdEVfQSwgbGliX2NvbHVtbiA9ICJIdWdlX0EiLCB0YXJnZXRfY29sdW1uID0gIkh1Z2VfWSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShIdWdlX29wdEVfQSwgbnJvdyhIdWdlX1lBX2FsbGNvbWJpbmVkKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkNCg0KDQojZXhhbXBsZQ0KSHVnZV9sYWdZX3htYXBfQVtbMl1dDQpgYGANCg0KIyMjIyMjIENhbGN1bGF0aW5nIG1lYW5zIGFuZCBzZHMNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkh1Z2VfbGFnWV94bWFwX0FfbWVhbnMgPC0gbGlzdCgpDQpIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxpc3QoKQ0KDQpIdWdlX2xhZ1lfeG1hcF9BX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhIdWdlX2xhZ1lfeG1hcF9BW1tpXV0sIG5hLnJtID0gVFJVRSkpDQpIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhIdWdlX2xhZ0FfeG1hcF9ZW1tpXV0sIG5hLnJtID0gVFJVRSkpDQoNCkh1Z2VfbGFnWV94bWFwX0FfbWVhbnMgPC0gbGFwcGx5KDE6NSwgZnVuY3Rpb24oaSkgZGF0YS5mcmFtZShIdWdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0sIHNkLnJobyA9IGNjbV9tZWFucyhIdWdlX2xhZ1lfeG1hcF9BW1tpXV0sIEZVTiA9IHNkLCBuYS5ybSA9IFRSVUUpJHJobykpDQpIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zIDwtIGxhcHBseSgxOjUsIGZ1bmN0aW9uKGkpIGRhdGEuZnJhbWUoSHVnZV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dLCBzZC5yaG8gPSBjY21fbWVhbnMoSHVnZV9sYWdBX3htYXBfWVtbaV1dLCBGVU4gPSBzZCwgbmEucm0gPSBUUlVFKSRyaG8pKQ0KDQojV2l0aCB0aGUgbWF4aW11bSBsaWJyYXJ5IHNpemUsc2luY2UgdGhlcmUgaXMgbm90IHJlcGxpY2F0ZSwgc28gU0QgY2Fubm90IGJlIGNhbGN1bGF0ZWQgYW5kIHNldCBhcyB6ZXJvDQpmb3IoaSBpbiAxOjUpew0KICBIdWdlX2xhZ1lfeG1hcF9BX21lYW5zW1tpXV0kc2QucmhvW25yb3coSHVnZV9sYWdZX3htYXBfQV9tZWFuc1tbaV1dKV0gPC0gMA0KfQ0KZm9yKGkgaW4gMTo1KXsNCiAgSHVnZV9sYWdBX3htYXBfWV9tZWFuc1tbaV1dJHNkLnJob1tucm93KEh1Z2VfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSldIDwtIDANCn0NCg0KI2V4YW1wbGUNCkh1Z2VfbGFnQV94bWFwX1lfbWVhbnNbWzNdXQ0KYGBgDQoNCiMjIyMjIyBHZW5lcmF0aW5nIFN1cnJvZ2F0ZSBkYXRhIChlYmlzdXpha2kpIGZvciBlYWNoIHJlcGxpY2F0ZSBhbmQgQ0NNDQoNCi0tRm9yIFlvdHN1bW9uIChDbSkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNHZW5lcmF0aW5nIFN1cnJvZ2F0ZSBkYXRhDQpzZXQuc2VlZCgxMjM0NSkNCkh1Z2VfWV9lYWNoX3MgPC0gbGlzdCgpDQoNCkh1Z2VfWV9lYWNoX3MgPC0gbGFwcGx5KDE6bGVuZ3RoKEh1Z2VfWV9lYWNoKSwgZnVuY3Rpb24oaSkgbWFrZV9zdXJyb2dhdGVfZGF0YShIdWdlX1lfZWFjaFtbaV1dLCBtZXRob2QgPSBjKCJlYmlzdXpha2kiKSwgbnVtX3N1cnIgPSAxMDApKQ0KDQpIdWdlX1lfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChIdWdlX1lfZWFjaF9zKSwgZnVuY3Rpb24oaSkgcmJpbmQuZGF0YS5mcmFtZShIdWdlX1lfZWFjaF9zW1tpXV0sIG1hdHJpeChyZXAoTkEsIDEwMCoobm9fTkFzX0h1Z2UpKSwgbnJvdyA9IG5vX05Bc19IdWdlKSkpDQoNCkh1Z2VfWV9lYWNoX3MyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpsZW5ndGgoSHVnZV9ZX2VhY2hfcykpew0KICBIdWdlX1lfZWFjaF9zMiA8LSByYmluZC5kYXRhLmZyYW1lKEh1Z2VfWV9lYWNoX3MyLCBIdWdlX1lfZWFjaF9zW1tpXV0pDQp9DQpIdWdlX1lfZWFjaF9zMg0KDQojU3Vycm9nYXRlIFkgKFlzKSB4bWFwIEEgKENDTSkNCkh1Z2VfQVlzIDwtIGNiaW5kLmRhdGEuZnJhbWUoSHVnZV9ZX2VhY2hfczIsICJIdWdlX0EiID0gSHVnZV9ZQV9hbGxjb21iaW5lZCRIdWdlX0EpDQpIdWdlX2xhZ1lzX3htYXBfQSA8LSBsaXN0KCkNCiANCmZvcihqIGluIDE6NSkgew0KICBIdWdlX2xhZ1lzX3htYXBfQVtbal1dIDwtIGxhcHBseSgxOjEwMCwgZnVuY3Rpb24oaSkgY2NtKEh1Z2VfQVlzLCBFID0gSHVnZV9vcHRFX1ksIGxpYiA9IGMoMSxucm93KEh1Z2VfQVlzKSksIHByZWQgPSBjKDEsbnJvdyhIdWdlX0FZcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLGksc2VwPSIiKSwgdGFyZ2V0X2NvbHVtbiA9ICJIdWdlX0EiLCBsaWJfc2l6ZXMgID0gZmxvb3Ioc2VxKEh1Z2Vfb3B0RV9ZLCBsZW5ndGgoSHVnZV9BWXNbLCAxXSksbGVuZ3RoID0gMTApKSx0cCA9ICgxIC0gaiksIG51bV9zYW1wbGUgPSAxMDAsIHJlcGxhY2UgPSBGLCBzaWxlbnQgPSBULCBSTkdzZWVkID0gMTIzNCkpDQp9DQoNCiNleGFtcGxlDQpIdWdlX2xhZ1lzX3htYXBfQVtbNF1dW1sxNl1dDQoNCiNtZWFuIGFuZCBzZCBvZiBzdXJyb2dhdGUgWSB4bWFwIEENCkh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3QgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dIDwtIGxhcHBseSgxOmxlbmd0aChIdWdlX2xhZ1lzX3htYXBfQVtbal1dKSwgZnVuY3Rpb24oaSkgY2NtX21lYW5zKEh1Z2VfbGFnWXNfeG1hcF9BW1tqXV1bW2ldXSwgbmEucm0gPSBUUlVFKSkNCn0NCiNjb21iaW5pbmcgdGhlIGxpc3QNCkh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zIDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0gPC0gSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dW1sxXV0kcmhvDQogIGZvcihpIGluIDI6bGVuZ3RoKEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zX2xpc3RbW2pdXSkpew0KICAgIEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0gPC0gY2JpbmQuZGF0YS5mcmFtZShIdWdlX2xhZ1lzX3htYXBfQV9tZWFuc1tbal1dLCBIdWdlX2xhZ1lzX3htYXBfQV9tZWFuc19saXN0W1tqXV1bW2ldXSRyaG8pDQogIH0NCn0NCg0KI2NhbGN1bGF0aW5nIG1lYW5zIGFuZCBzZHMgb2YgIm1lYW5zIg0KSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfbWVhbnMgPC0gbGlzdCgpIA0KSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfc2RzIDwtIGxpc3QoKSANCmZvcihqIGluIDE6NSkgew0KICBIdWdlX2xhZ1lzX3htYXBfQV9tZWFuc19tZWFuc1tbal1dIDwtIGFwcGx5KEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0sIDEsIG1lYW4pDQogIEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zX3Nkc1tbal1dIDwtIGFwcGx5KEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zW1tqXV0sIDEsIHNkKQ0KfQ0KDQojZXhhbXBsZQ0KSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfc2RzW1sxXV0NCg0KSHVnZV9sYWdZc194bWFwX0Ffc3VtbWFyeSA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBIdWdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tqXV0gPC0gZGF0YS5mcmFtZSgibGliX3NpemUiID0gSHVnZV9sYWdZc194bWFwX0FfbWVhbnNfbGlzdFtbal1dW1sxXV0kbGliX3NpemUsICJtZWFuIiA9IEh1Z2VfbGFnWXNfeG1hcF9BX21lYW5zX21lYW5zW1tqXV0sICJzZCIgPSBIdWdlX2xhZ1lzX3htYXBfQV9tZWFuc19zZHNbW2pdXSkNCn0NCiNleGFtcGxlDQpIdWdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1szXV0NCmBgYA0KDQotLUZvciBBenVraSAoQ2MpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojR2VuZXJhdGluZyBTdXJyb2dhdGUgZGF0YQ0Kc2V0LnNlZWQoMTIzNDUpDQpIdWdlX0FfZWFjaF9zIDwtIGxpc3QoKQ0KDQpIdWdlX0FfZWFjaF9zIDwtIGxhcHBseSgxOmxlbmd0aChIdWdlX0FfZWFjaCksIGZ1bmN0aW9uKGkpIG1ha2Vfc3Vycm9nYXRlX2RhdGEoSHVnZV9BX2VhY2hbW2ldXSwgbWV0aG9kID0gYygiZWJpc3V6YWtpIiksIG51bV9zdXJyID0gMTAwKSkNCg0KSHVnZV9BX2VhY2hfcyA8LSBsYXBwbHkoMTpsZW5ndGgoSHVnZV9BX2VhY2hfcyksIGZ1bmN0aW9uKGkpIHJiaW5kLmRhdGEuZnJhbWUoSHVnZV9BX2VhY2hfc1tbaV1dLCBtYXRyaXgocmVwKE5BLDEwMCoobm9fTkFzX0h1Z2UpKSwgbnJvdyA9IG5vX05Bc19IdWdlKSkpDQoNCkh1Z2VfQV9lYWNoX3MyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpsZW5ndGgoSHVnZV9BX2VhY2hfcykpew0KICBIdWdlX0FfZWFjaF9zMiA8LSByYmluZC5kYXRhLmZyYW1lKEh1Z2VfQV9lYWNoX3MyLCBIdWdlX0FfZWFjaF9zW1tpXV0pDQp9DQpIdWdlX0FfZWFjaF9zMg0KDQojU3Vycm9nYXRlIEEgKEFzKSB4bWFwIFkgKENDTSkNCkh1Z2VfWUFzIDwtIGNiaW5kLmRhdGEuZnJhbWUoSHVnZV9BX2VhY2hfczIsICJIdWdlX1kiID0gSHVnZV9ZQV9hbGxjb21iaW5lZCRIdWdlX1kpDQpIdWdlX2xhZ0FzX3htYXBfWSA8LSBsaXN0KCkNCiANCmZvcihqIGluIDE6NSkgew0KICBIdWdlX2xhZ0FzX3htYXBfWVtbal1dIDwtIGxhcHBseSgxOjEwMCwgZnVuY3Rpb24oaSkgY2NtKEh1Z2VfWUFzLCBFID0gSHVnZV9vcHRFX0EsIGxpYiA9IGMoMSxucm93KEh1Z2VfWUFzKSksIHByZWQgPSBjKDEsbnJvdyhIdWdlX1lBcykpLCBsaWJfY29sdW1uID0gcGFzdGUoIlYiLCBpLCBzZXAgPSAiIiksIHRhcmdldF9jb2x1bW4gPSAiSHVnZV9ZIiwgbGliX3NpemVzICA9IGZsb29yKHNlcShIdWdlX29wdEVfQSwgbGVuZ3RoKEh1Z2VfWUFzWywgMV0pLGxlbmd0aCA9IDEwKSksdHAgPSAoMSAtIGopLCBudW1fc2FtcGxlID0gMTAwLCByZXBsYWNlID0gRiwgc2lsZW50ID0gVCwgUk5Hc2VlZCA9IDEyMzQpKQ0KfQ0KDQojZXhhbXBsZQ0KSHVnZV9sYWdBc194bWFwX1lbWzRdXVtbMTZdXQ0KDQojbWVhbiBhbmQgc2Qgb2Ygc3Vycm9nYXRlIEEgeG1hcCBZDQpIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0IDwtIGxpc3QoKQ0KZm9yKGogaW4gMTo1KSB7DQogIEh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXSA8LSBsYXBwbHkoMTpsZW5ndGgoSHVnZV9sYWdBc194bWFwX1lbW2pdXSksIGZ1bmN0aW9uKGkpIGNjbV9tZWFucyhIdWdlX2xhZ0FzX3htYXBfWVtbal1dW1tpXV0sIG5hLnJtID0gVFJVRSkpDQp9DQojY29tYmluaW5nIHRoZSBsaXN0DQpIdWdlX2xhZ0FzX3htYXBfWV9tZWFucyA8LSBsaXN0KCkNCmZvcihqIGluIDE6NSkgew0KICBIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dIDwtIEh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXVtbMV1dJHJobw0KICBmb3IoaSBpbiAyOmxlbmd0aChIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc19saXN0W1tqXV0pKXsNCiAgICBIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dIDwtIGNiaW5kLmRhdGEuZnJhbWUoSHVnZV9sYWdBc194bWFwX1lfbWVhbnNbW2pdXSwgSHVnZV9sYWdBc194bWFwX1lfbWVhbnNfbGlzdFtbal1dW1tpXV0kcmhvKQ0KICB9DQp9DQoNCiNjYWxjdWxhdGluZyBtZWFucyBhbmQgc2RzIG9mICJtZWFucyINCkh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX21lYW5zIDwtIGxpc3QoKSANCkh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX3NkcyA8LSBsaXN0KCkgDQpmb3IoaiBpbiAxOjUpIHsNCiAgSHVnZV9sYWdBc194bWFwX1lfbWVhbnNfbWVhbnNbW2pdXSA8LSBhcHBseShIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dLCAxLCBtZWFuKQ0KICBIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc19zZHNbW2pdXSA8LSBhcHBseShIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc1tbal1dLCAxLCBzZCkNCn0NCg0KI2V4YW1wbGUNCkh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX3Nkc1tbMV1dDQoNCkh1Z2VfbGFnQXNfeG1hcF9ZX3N1bW1hcnkgPC0gbGlzdCgpDQpmb3IoaiBpbiAxOjUpIHsNCiAgSHVnZV9sYWdBc194bWFwX1lfc3VtbWFyeVtbal1dIDwtIGRhdGEuZnJhbWUoImxpYl9zaXplIiA9IEh1Z2VfbGFnQXNfeG1hcF9ZX21lYW5zX2xpc3RbW2pdXVtbMV1dJGxpYl9zaXplLCAibWVhbiIgPSBIdWdlX2xhZ0FzX3htYXBfWV9tZWFuc19tZWFuc1tbal1dLCAic2QiID0gSHVnZV9sYWdBc194bWFwX1lfbWVhbnNfc2RzW1tqXV0pDQp9DQojZXhhbXBsZQ0KSHVnZV9sYWdBc194bWFwX1lfc3VtbWFyeVtbM11dDQpgYGANCg0KIyMjIyMgWzguMy4zLjldIEZvciBIdWdlIGNhZ2UgZ3JhcGhpY3MNCg0KIyMjIyMjIERhdGEgc3VtbWFyeQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KSHVnZV9jY21ZX3htYXBfQV9hbGwgPC0gbGlzdCgpDQoNCmZvcihpIGluIDE6NSl7DQogIEh1Z2VfY2NtWV94bWFwX0FfYWxsW1tpXV0gPC0gZGF0YS5mcmFtZSgNCiAgICAiTGlicmFyeV9zaXplIiA9IEh1Z2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRsaWJfc2l6ZSwNCiAgICAiWV94bWFwX0FfcmhvIiA9IEh1Z2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRyaG8sDQogICAgIllzX3htYXBfQV9yaG8iID0gSHVnZV9sYWdZc194bWFwX0Ffc3VtbWFyeVtbaV1dJG1lYW4sDQogICAgIllfeG1hcF9BX3Job19wc2QiID0gSHVnZV9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJHJobyArIEh1Z2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIllfeG1hcF9BX3Job19tc2QiID0gSHVnZV9sYWdZX3htYXBfQV9tZWFuc1tbaV1dJHJobyAtIEh1Z2VfbGFnWV94bWFwX0FfbWVhbnNbW2ldXSRzZC5yaG8sDQogICAgIllzX3htYXBfQV9yaG9fcHNkIiA9IEh1Z2VfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRtZWFuICsgSHVnZV9sYWdZc194bWFwX0Ffc3VtbWFyeVtbaV1dJHNkLA0KICAgICJZc194bWFwX0FfcmhvX21zZCIgPSBIdWdlX2xhZ1lzX3htYXBfQV9zdW1tYXJ5W1tpXV0kbWVhbiAtIEh1Z2VfbGFnWXNfeG1hcF9BX3N1bW1hcnlbW2ldXSRzZA0KICAgICkNCn0NCiNleGFtcGxlDQpIdWdlX2NjbVlfeG1hcF9BX2FsbFtbMl1dDQoNCkh1Z2VfY2NtQV94bWFwX1lfYWxsIDwtIGxpc3QoKQ0KDQpmb3IoaSBpbiAxOjUpew0KICBIdWdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dIDwtIGRhdGEuZnJhbWUoDQogICAgIkxpYnJhcnlfc2l6ZSIgPSBIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kbGliX3NpemUsDQogICAgIkFfeG1hcF9ZX3JobyIgPSBIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kcmhvLA0KICAgICJBc194bWFwX1lfcmhvIiA9IEh1Z2VfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRtZWFuLA0KICAgICJBX3htYXBfWV9yaG9fcHNkIiA9IEh1Z2VfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRyaG8gKyBIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kc2QucmhvLA0KICAgICJBX3htYXBfWV9yaG9fbXNkIiA9IEh1Z2VfbGFnQV94bWFwX1lfbWVhbnNbW2ldXSRyaG8gLSBIdWdlX2xhZ0FfeG1hcF9ZX21lYW5zW1tpXV0kc2QucmhvLA0KICAgICJBc194bWFwX1lfcmhvX3BzZCIgPSBIdWdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kbWVhbiArIEh1Z2VfbGFnQXNfeG1hcF9ZX3N1bW1hcnlbW2ldXSRzZCwNCiAgICAiQXNfeG1hcF9ZX3Job19tc2QiID0gSHVnZV9sYWdBc194bWFwX1lfc3VtbWFyeVtbaV1dJG1lYW4gLSBIdWdlX2xhZ0FzX3htYXBfWV9zdW1tYXJ5W1tpXV0kc2QNCiAgICApDQp9DQojZXhhbXBsZQ0KSHVnZV9jY21BX3htYXBfWV9hbGxbWzJdXQ0KYGBgDQoNCiMjIyMjIyBHcmFwaGljcyBmb3IgQ0NNIEh1Z2UgKGZvciBGaWd1cmUgUzQpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojQ0NNIEh1Z2XjgavplqLjgZnjgotwbG90DQpIdWdlX2NjbV9nZ3Bsb3QgPC0gbGlzdCgpDQpIdWdlX3N1YnRpdGxlIDwtIGMoIihwKSIsIihxKSIsIihyKSIsIihzKSIsIih0KSIpDQoNCmZvcihpIGluIDE6NSl7DQojWV94bWFwX0E6Q20geG1hcCBDYyAjRjg3NjZEIChyZWQpDQpIdWdlX2NjbV9nZ3Bsb3RbW2ldXSA8LSBnZ3Bsb3QoZGF0YSA9IEh1Z2VfY2NtWV94bWFwX0FfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gWV94bWFwX0FfcmhvKSkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlID0gMSwgY29sb3IgPSAiI0Y4NzY2RCIpICsgDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlfeG1hcF9BX3Job19tc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gIiNGODc2NkQiKSArDQoNCiNBX3htYXBfWTpDYyB4bWFwIENtICMwMEJGQzQgKGJsdWUtZ3JlZW4pICANCiAgZ2VvbV9saW5lKGRhdGEgPSBIdWdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFfeG1hcF9ZX3JobyksIGxpbmV0eXBlID0gMSwgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBIdWdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFfeG1hcF9ZX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gSHVnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBX3htYXBfWV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBIdWdlX2NjbUFfeG1hcF9ZX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IEFfeG1hcF9ZX3JobyksIHNoYXBlID0gMTcsIHNpemUgPSAzLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICANCiAgZ2VvbV9saW5lKGRhdGEgPSBIdWdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlzX3htYXBfQV9yaG8pLCBsaW5ldHlwZSA9IDEsIGNvbG9yID0gIiNGODc2NkQiKSArDQogIGdlb21fbGluZShkYXRhID0gSHVnZV9jY21ZX3htYXBfQV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBZc194bWFwX0FfcmhvX3BzZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiI0Y4NzY2RCIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBIdWdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlzX3htYXBfQV9yaG9fbXNkKSwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBIdWdlX2NjbVlfeG1hcF9BX2FsbFtbaV1dLCBhZXMoeCA9IExpYnJhcnlfc2l6ZSwgeSA9IFlzX3htYXBfQV9yaG8pLCBzaGFwZSA9IDEsIHNpemUgPSAzLCBjb2xvciA9ICIjRjg3NjZEIikgKw0KDQogIGdlb21fbGluZShkYXRhID0gSHVnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvKSwgbGluZXR5cGUgPSAxLCBjb2xvciA9ICIjMDBCRkM0IikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IEh1Z2VfY2NtQV94bWFwX1lfYWxsW1tpXV0sIGFlcyh4ID0gTGlicmFyeV9zaXplLCB5ID0gQXNfeG1hcF9ZX3Job19wc2QpLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gIiMwMEJGQzQiKSArDQogIGdlb21fbGluZShkYXRhID0gSHVnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvX21zZCksIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiIzAwQkZDNCIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gSHVnZV9jY21BX3htYXBfWV9hbGxbW2ldXSwgYWVzKHggPSBMaWJyYXJ5X3NpemUsIHkgPSBBc194bWFwX1lfcmhvKSwgc2hhcGUgPSAyLCBzaXplID0gMywgY29sb3IgPSAiIzAwQkZDNCIpICsNCg0KICB5bGltKC0wLjEsIDEpICsNCiAgeWxhYigiIikgKw0KICB4bGFiKCIiKSArDQogIGdndGl0bGUocGFzdGUoSHVnZV9zdWJ0aXRsZVtpXSwgIkh1Z2UiLCAidHAgPSIsIDEgLSBpLCBzZXAgPSAiICIpKQ0KfQ0KZm9yKGkgaW4gMTo1KSB7DQogIHByaW50KEh1Z2VfY2NtX2dncGxvdFtbaV1dKQ0KfQ0KYGBgDQoNCiMjIyBbOC40XSBDQ00gYW5hbHlzaXMgZm9yIGNvbWJpbmVkIGRhdGEgd2l0aCA+PSAzNSBwb2ludHMNCg0KIyMjIyBbOC40LjFdIENvbmZpcm1pbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aW1lIHNlcmllcw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI1doZW4gZWl0aGVyIEMubSBvciBDLmMgc2hvd2VkIGxpbmVhciBkeW5hbWljcywgd2UgZGlkIG5vdCBhcHBseSBDQ00gdG8gdGhlbQ0Kc3Vic2V0KFRhYmxlMSwgKHRoZXRhX2Zvcl9DLm0gPT0gMCB8IHRoZXRhX2Zvcl9DLmMgPT0gMCkpDQpzdWJzZXQoVGFibGUxLCAodGhldGFfZm9yX0MubSA9PSAwIHwgdGhldGFfZm9yX0MuYyA9PSAwKSkkSUQNCmBgYA0KDQojIyMjIFs4LjQuMl0gQ0NNIGZvciBTbWFsbCBjb21iaW5lZCAoUzEsIFMyLCBTNSwgJiBTNikNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NClNrIDwtIGMoMSwgMiwgNSwgNikgI2luZGV4IGZvciBzYW1wbGUgSUQgdXNlZCBmb3IgQ0NNIChTMSwgUzIsIFM1LCAmIFM2KQ0KU21hbGxfY2NtZGF0YV9jb21iaW5lZCA8LSBsaXN0KCkNClNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWQgPC0gbGlzdCgpDQpTbWFsbF9jY21ZX3htYXBfWV9jb21iaW5lZCA8LSBsaXN0KCkNClNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KDQpmb3IoaiBpbiAxOjYpIFNtYWxsX2NjbWRhdGFfY29tYmluZWRbW2pdXSA8LSBkYXRhLmZyYW1lKCJZIiA9IFNfY29tYmluZWRfWVtbal1dLCAiQSIgPSBTX2NvbWJpbmVkX0FbW2pdXSkNCg0KDQojQ20gKFkpIHhtYXAgQ2MgKEEpDQpmb3IoayBpbiAxOjQpIHsNCiAgU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKFNtYWxsX2NjbWRhdGFfY29tYmluZWRbW1NrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5tW1NrW2tdXSwgbGliX2NvbHVtbiA9ICJZIiwgdGFyZ2V0X2NvbHVtbiA9ICJBIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLm1bU2tba11dLCBsZW5ndGgoU21hbGxfY2NtZGF0YV9jb21iaW5lZFtbU2tba11dXSRZKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojQ2MgKEEpIHhtYXAgQ20gKFkpDQpmb3IoayBpbiAxOjQpIHsNCiAgU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKFNtYWxsX2NjbWRhdGFfY29tYmluZWRbW1NrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5jW1NrW2tdXSwgbGliX2NvbHVtbiA9ICJBIiwgdGFyZ2V0X2NvbHVtbiA9ICJZIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLmNbU2tba11dLCBsZW5ndGgoU21hbGxfY2NtZGF0YV9jb21iaW5lZFtbU2tba11dXSRBKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojZXhhbXBsZQ0KU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbWzNdXVtbMV1dIA0KDQojQ20gKFkpIHhtYXAgQ20gKFkpIGZvciBpbnRyYXNwZWNpZmljIGRlbnNpdHkgZGVwZW5kZW5jZQ0KZm9yKGsgaW4gMTo0KSB7DQogIFNtYWxsX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShTbWFsbF9jY21kYXRhX2NvbWJpbmVkW1tTa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MubVtTa1trXV0sIGxpYl9jb2x1bW4gPSAiWSIsIHRhcmdldF9jb2x1bW4gPSAiWSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5tW1NrW2tdXSwgbGVuZ3RoKFNtYWxsX2NjbWRhdGFfY29tYmluZWRbW1NrW2tdXV0kWSksIGxlbmd0aCA9IDEwKSksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpICANCn0NCg0KI0NjIChBKSB4bWFwIENjIChBKQ0KZm9yKGsgaW4gMTo0KSB7DQogIFNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShTbWFsbF9jY21kYXRhX2NvbWJpbmVkW1tTa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MuY1tTa1trXV0sIGxpYl9jb2x1bW4gPSAiQSIsIHRhcmdldF9jb2x1bW4gPSAiQSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5jW1NrW2tdXSwgbGVuZ3RoKFNtYWxsX2NjbWRhdGFfY29tYmluZWRbW1NrW2tdXV0kQSksIGxlbmd0aCA9IDEwKSksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpICANCn0NCg0KI2V4YW1wbGUNClNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1szXV1bWzFdXSANCmBgYA0KDQojIyMjIFs4LjQuM10gQ0NNIGZvciBNZWRpdW0gY29tYmluZWQgKE0yIHRvIE03KQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTWsgPC0gYygyLCAzLCA0LCA1LCA2LCA3KSAjaW5kZXggZm9yIHNhbXBsZSBJRCB1c2VkIGZvciBDQ00gKE0yIHRvIE03KQ0KTWVkaXVtX2NjbWRhdGFfY29tYmluZWQgPC0gbGlzdCgpDQpNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWQgPC0gbGlzdCgpDQpNZWRpdW1fY2NtQV94bWFwX1lfY29tYmluZWQgPC0gbGlzdCgpDQpNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWQgPC0gbGlzdCgpDQpNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWQgPC0gbGlzdCgpDQoNCmZvcihqIGluIDE6NykgTWVkaXVtX2NjbWRhdGFfY29tYmluZWRbW2pdXSA8LSBkYXRhLmZyYW1lKCJZIiA9IE1fY29tYmluZWRfWVtbal1dLCAiQSIgPSBNX2NvbWJpbmVkX0FbW2pdXSkNCg0KDQojQ20gKFkpIHhtYXAgQ2MgKEEpDQpmb3IoayBpbiAxOjYpIHsNCiAgTWVkaXVtX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShNZWRpdW1fY2NtZGF0YV9jb21iaW5lZFtbTWtba11dXSwgRSA9IFRhYmxlMSRFX2Zvcl9DLm1bTWtba11dLCBsaWJfY29sdW1uID0gIlkiLCB0YXJnZXRfY29sdW1uID0gIkEiLCBsaWJfc2l6ZXMgPSBmbG9vcihzZXEoVGFibGUxJEVfZm9yX0MubVtNa1trXV0sIGxlbmd0aChNZWRpdW1fY2NtZGF0YV9jb21iaW5lZFtbTWtba11dXSRZKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojQ2MgKEEpIHhtYXAgQ20gKFkpDQpmb3IoayBpbiAxOjYpIHsNCiAgTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShNZWRpdW1fY2NtZGF0YV9jb21iaW5lZFtbTWtba11dXSwgRSA9IFRhYmxlMSRFX2Zvcl9DLmNbTWtba11dLCBsaWJfY29sdW1uID0gIkEiLCB0YXJnZXRfY29sdW1uID0gIlkiLCBsaWJfc2l6ZXMgPSBmbG9vcihzZXEoVGFibGUxJEVfZm9yX0MuY1tNa1trXV0sIGxlbmd0aChNZWRpdW1fY2NtZGF0YV9jb21iaW5lZFtbTWtba11dXSRBKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojZXhhbXBsZQ0KTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1szXV1bWzFdXSANCg0KI0NtIChZKSB4bWFwIENtIChZKSBmb3IgaW50cmFzcGVjaWZpYyBkZW5zaXR5IGRlcGVuZGVuY2UNCmZvcihrIGluIDE6Nikgew0KICBNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKE1lZGl1bV9jY21kYXRhX2NvbWJpbmVkW1tNa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MubVtNa1trXV0sIGxpYl9jb2x1bW4gPSAiWSIsIHRhcmdldF9jb2x1bW4gPSAiWSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5tW01rW2tdXSwgbGVuZ3RoKE1lZGl1bV9jY21kYXRhX2NvbWJpbmVkW1tNa1trXV1dJFkpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNDYyAoQSkgeG1hcCBDYyAoQSkNCmZvcihrIGluIDE6Nikgew0KICBNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKE1lZGl1bV9jY21kYXRhX2NvbWJpbmVkW1tNa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MuY1tNa1trXV0sIGxpYl9jb2x1bW4gPSAiQSIsIHRhcmdldF9jb2x1bW4gPSAiQSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5jW01rW2tdXSwgbGVuZ3RoKE1lZGl1bV9jY21kYXRhX2NvbWJpbmVkW1tNa1trXV1dJEEpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNleGFtcGxlDQpNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWRbWzNdXVtbMV1dIA0KYGBgDQoNCiMjIyMgWzguNC40XSBDQ00gZm9yIExhcmdlIGNvbWJpbmVkIChMMSwgTDQgdG8gTDgpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpMayA8LSBjKDEsIDQsIDUsIDYsIDcsIDgpICNpbmRleCBmb3Igc2FtcGxlIElEIHVzZWQgZm9yIENDTSAoTDEsIEw0IHRvIEw4KQ0KTGFyZ2VfY2NtZGF0YV9jb21iaW5lZCA8LSBsaXN0KCkNCkxhcmdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KTGFyZ2VfY2NtQV94bWFwX1lfY29tYmluZWQgPC0gbGlzdCgpDQpMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZCA8LSBsaXN0KCkNCkxhcmdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KDQpmb3IoaiBpbiAxOjgpIExhcmdlX2NjbWRhdGFfY29tYmluZWRbW2pdXSA8LSBkYXRhLmZyYW1lKCJZIiA9IExfY29tYmluZWRfWVtbal1dLCAiQSIgPSBMX2NvbWJpbmVkX0FbW2pdXSkNCg0KDQojQ20gKFkpIHhtYXAgQ2MgKEEpDQpmb3IoayBpbiAxOjYpIHsNCiAgTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKExhcmdlX2NjbWRhdGFfY29tYmluZWRbW0xrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5tW0xrW2tdXSwgbGliX2NvbHVtbiA9ICJZIiwgdGFyZ2V0X2NvbHVtbiA9ICJBIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLm1bTGtba11dLCBsZW5ndGgoTGFyZ2VfY2NtZGF0YV9jb21iaW5lZFtbTGtba11dXSRZKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojQ2MgKEEpIHhtYXAgQ20gKFkpDQpmb3IoayBpbiAxOjYpIHsNCiAgTGFyZ2VfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXSA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKExhcmdlX2NjbWRhdGFfY29tYmluZWRbW0xrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5jW0xrW2tdXSwgbGliX2NvbHVtbiA9ICJBIiwgdGFyZ2V0X2NvbHVtbiA9ICJZIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLmNbTGtba11dLCBsZW5ndGgoTGFyZ2VfY2NtZGF0YV9jb21iaW5lZFtbTGtba11dXSRBKSwgbGVuZ3RoID0gMTApKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkgIA0KfQ0KDQojZXhhbXBsZQ0KTGFyZ2VfY2NtQV94bWFwX1lfY29tYmluZWRbWzNdXVtbMV1dIA0KDQojQ20gKFkpIHhtYXAgQ20gKFkpIGZvciBpbnRyYXNwZWNpZmljIGRlbnNpdHkgZGVwZW5kZW5jZQ0KZm9yKGsgaW4gMTo2KSB7DQogIExhcmdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShMYXJnZV9jY21kYXRhX2NvbWJpbmVkW1tMa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MubVtMa1trXV0sIGxpYl9jb2x1bW4gPSAiWSIsIHRhcmdldF9jb2x1bW4gPSAiWSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5tW0xrW2tdXSwgbGVuZ3RoKExhcmdlX2NjbWRhdGFfY29tYmluZWRbW0xrW2tdXV0kWSksIGxlbmd0aCA9IDEwKSksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpICANCn0NCg0KI0NjIChBKSB4bWFwIENjIChBKQ0KZm9yKGsgaW4gMTo2KSB7DQogIExhcmdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShMYXJnZV9jY21kYXRhX2NvbWJpbmVkW1tMa1trXV1dLCBFID0gVGFibGUxJEVfZm9yX0MuY1tMa1trXV0sIGxpYl9jb2x1bW4gPSAiQSIsIHRhcmdldF9jb2x1bW4gPSAiQSIsIGxpYl9zaXplcyA9IGZsb29yKHNlcShUYWJsZTEkRV9mb3JfQy5jW0xrW2tdXSwgbGVuZ3RoKExhcmdlX2NjbWRhdGFfY29tYmluZWRbW0xrW2tdXV0kQSksIGxlbmd0aCA9IDEwKSksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpICANCn0NCg0KI2V4YW1wbGUNCkxhcmdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1szXV1bWzFdXSANCmBgYA0KDQojIyMjIFs4LjQuNV0gQ0NNIGZvciBIdWdlIGNvbWJpbmVkIChIMSwgSDIsIEgzLCBINiwgSDcsIEg4KQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KSGsgPC0gYygxLCAyLCAzLCA2LCA3LCA4KSAjaW5kZXggZm9yIHNhbXBsZSBJRCB1c2VkIGZvciBDQ00gKEgxLCBIMiwgSDMsIEg2LCBINywgSDgpDQpIdWdlX2NjbWRhdGFfY29tYmluZWQgPC0gbGlzdCgpDQpIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZCA8LSBsaXN0KCkNCkh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWQgPC0gbGlzdCgpDQpIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkIDwtIGxpc3QoKQ0KDQpmb3IoaiBpbiAxOjgpIEh1Z2VfY2NtZGF0YV9jb21iaW5lZFtbal1dIDwtIGRhdGEuZnJhbWUoIlkiID0gSF9jb21iaW5lZF9ZW1tqXV0sICJBIiA9IEhfY29tYmluZWRfQVtbal1dKQ0KDQoNCiNDbSAoWSkgeG1hcCBDYyAoQSkNCmZvcihrIGluIDE6Nikgew0KICBIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShIdWdlX2NjbWRhdGFfY29tYmluZWRbW0hrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5tW0hrW2tdXSwgbGliX2NvbHVtbiA9ICJZIiwgdGFyZ2V0X2NvbHVtbiA9ICJBIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLm1bSGtba11dLCBsZW5ndGgoSHVnZV9jY21kYXRhX2NvbWJpbmVkW1tIa1trXV1dJFkpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNDYyAoQSkgeG1hcCBDbSAoWSkNCmZvcihrIGluIDE6Nikgew0KICBIdWdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShIdWdlX2NjbWRhdGFfY29tYmluZWRbW0hrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5jW0hrW2tdXSwgbGliX2NvbHVtbiA9ICJBIiwgdGFyZ2V0X2NvbHVtbiA9ICJZIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLmNbSGtba11dLCBsZW5ndGgoSHVnZV9jY21kYXRhX2NvbWJpbmVkW1tIa1trXV1dJEEpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNleGFtcGxlDQpIdWdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1szXV1bWzFdXSANCg0KI0NtIChZKSB4bWFwIENtIChZKSBmb3IgaW50cmFzcGVjaWZpYyBkZW5zaXR5IGRlcGVuZGVuY2UNCmZvcihrIGluIDE6Nikgew0KICBIdWdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShIdWdlX2NjbWRhdGFfY29tYmluZWRbW0hrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5tW0hrW2tdXSwgbGliX2NvbHVtbiA9ICJZIiwgdGFyZ2V0X2NvbHVtbiA9ICJZIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLm1bSGtba11dLCBsZW5ndGgoSHVnZV9jY21kYXRhX2NvbWJpbmVkW1tIa1trXV1dJFkpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNDYyAoQSkgeG1hcCBDYyAoQSkNCmZvcihrIGluIDE6Nikgew0KICBIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV0gPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShIdWdlX2NjbWRhdGFfY29tYmluZWRbW0hrW2tdXV0sIEUgPSBUYWJsZTEkRV9mb3JfQy5jW0hrW2tdXSwgbGliX2NvbHVtbiA9ICJBIiwgdGFyZ2V0X2NvbHVtbiA9ICJBIiwgbGliX3NpemVzID0gZmxvb3Ioc2VxKFRhYmxlMSRFX2Zvcl9DLmNbSGtba11dLCBsZW5ndGgoSHVnZV9jY21kYXRhX2NvbWJpbmVkW1tIa1trXV1dJEEpLCBsZW5ndGggPSAxMCkpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKSAgDQp9DQoNCiNleGFtcGxlDQpIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1szXV1bWzFdXSANCmBgYA0KDQojIyMjIFs4LjQuNl0gU2F2aW5nIHRoZSByZXN1bHRzIG9mIFs4LjRdIHNlY3Rpb24NCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCnNhdmVSRFMoU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWQsICJTbWFsbF9jY21ZX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhTbWFsbF9jY21ZX3htYXBfWV9jb21iaW5lZCwgIlNtYWxsX2NjbVlfeG1hcF9ZX2NvbWJpbmVkLm9iaiIpDQpzYXZlUkRTKFNtYWxsX2NjbUFfeG1hcF9ZX2NvbWJpbmVkLCAiU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWQub2JqIikNCnNhdmVSRFMoU21hbGxfY2NtQV94bWFwX0FfY29tYmluZWQsICJTbWFsbF9jY21BX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0KDQpzYXZlUkRTKE1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZCwgIk1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWQsICJNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWQub2JqIikNCnNhdmVSRFMoTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkLCAiTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkLm9iaiIpDQpzYXZlUkRTKE1lZGl1bV9jY21BX3htYXBfQV9jb21iaW5lZCwgIk1lZGl1bV9jY21BX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0KDQpzYXZlUkRTKExhcmdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkLCAiTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQub2JqIikNCnNhdmVSRFMoTGFyZ2VfY2NtWV94bWFwX1lfY29tYmluZWQsICJMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZCwgIkxhcmdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkLm9iaiIpDQpzYXZlUkRTKExhcmdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkLCAiTGFyZ2VfY2NtQV94bWFwX0FfY29tYmluZWQub2JqIikNCg0Kc2F2ZVJEUyhIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkLCAiSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhIdWdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkLCAiSHVnZV9jY21ZX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhIdWdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkLCAiSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0Kc2F2ZVJEUyhIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkLCAiSHVnZV9jY21BX3htYXBfQV9jb21iaW5lZC5vYmoiKQ0KDQpzYXZlUkRTKFRhYmxlMSwgIlRhYmxlMS5vYmoiKQ0KYGBgDQoNCiMjIyBbOC41XSBDYWxjdWxhdGluZyB0aGUgaW5kZXggZm9yIGludGVyc3BlY2lmaWMgaW50ZXJhY3Rpb24gc3RyZW5ndGgNCg0KIyMjIyBbOC41LjBdIFdoZW4gc3RhcnRpbmcgZnJvbSB0aGlzIHNlY3Rpb24sIGxvYWQgdGhlIGZvbGxvd2luZ3MNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNDYWdlIHZvbHVtZQ0KU21hbGx2b2x1bWUgPC0gOC41KjYqMy41DQpNZWRpdW12b2x1bWUgPC0gMTMuNSo4LjUqNC41IA0KTGFyZ2V2b2x1bWUgPC0gMTguNSoxNCo2LjUNCkh1Z2V2b2x1bWUgPC0gMjIqMTUuNSo3LjUNCiNUYWJsZSwgd2hpY2ggaW5jbHVkZSB0aGUgY29leGlzdGVuY2Ugd2VlayBpbmZvcm1hdGlvbg0KVGFibGUxIDwtIHJlYWRSRFMoIlRhYmxlMS5vYmoiKQ0KI0NDTSByZXN1bHRzIGZvciBjb21iaW5lZCB0aW1lIHNlcmllcyA+PSAzNSBwb2ludHMNClNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkIDwtIHJlYWRSRFMoIlNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkLm9iaiIpDQpTbWFsbF9jY21ZX3htYXBfWV9jb21iaW5lZCA8LSByZWFkUkRTKCJTbWFsbF9jY21ZX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0KU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWQgPC0gcmVhZFJEUygiU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWQub2JqIikNClNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkIDwtIHJlYWRSRFMoIlNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkLm9iaiIpDQoNCk1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZCA8LSByZWFkUkRTKCJNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWQub2JqIikNCk1lZGl1bV9jY21ZX3htYXBfWV9jb21iaW5lZCA8LSByZWFkUkRTKCJNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWQub2JqIikNCk1lZGl1bV9jY21BX3htYXBfWV9jb21iaW5lZCA8LSByZWFkUkRTKCJNZWRpdW1fY2NtQV94bWFwX1lfY29tYmluZWQub2JqIikNCk1lZGl1bV9jY21BX3htYXBfQV9jb21iaW5lZCA8LSByZWFkUkRTKCJNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWQub2JqIikNCg0KTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQgPC0gcmVhZFJEUygiTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQub2JqIikNCkxhcmdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkIDwtIHJlYWRSRFMoIkxhcmdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkLm9iaiIpDQpMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZCA8LSByZWFkUkRTKCJMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0KTGFyZ2VfY2NtQV94bWFwX0FfY29tYmluZWQgPC0gcmVhZFJEUygiTGFyZ2VfY2NtQV94bWFwX0FfY29tYmluZWQub2JqIikNCg0KSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZCA8LSByZWFkUkRTKCJIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkLm9iaiIpDQpIdWdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkIDwtIHJlYWRSRFMoIkh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWQub2JqIikNCkh1Z2VfY2NtQV94bWFwX1lfY29tYmluZWQgPC0gcmVhZFJEUygiSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZC5vYmoiKQ0KSHVnZV9jY21BX3htYXBfQV9jb21iaW5lZCA8LSByZWFkUkRTKCJIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkLm9iaiIpDQoNCmBgYA0KDQojIyMjIFs4LjUuMV0gUHJlcGFyYXRpb24gZm9yIHRoZSBpbmRleCBvZiBpbnRlcnNwZWNpZmljIGludGVyYWN0aW9uIHN0cmVuZ3RoDQoNCi0tIFRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzIHRvIGNhbGN1bGF0ZSB0aGUgaW5kZXggb2YgaW50ZXJzcGVjaWZpYyBpbnRlcmFjdGlvbiBzdHJlbmd0aC4gV2UgZmluYWxseSBkZWNpZGVkIHRvIHVzZSB0aGUgcmhvIHZhbHVlIG9mIGludGVyc3BlY2lmaWMgQ0NNIHdpdGggdGhlIG1heGltdW0gbGlicmFyeSBsZW5ndGggc3RhbmRhcmRpemVkIGJ5IHVzaW5nIHRoZSBpbnRlcnNwZWNpZmljIENDTSByaG8gd2l0aCB0aGUgbWluaW11bSBsaWJyYXJ5IGxlbmd0aCwgYW5kIHRoZSBpbnRyYXNwZWNpZmljIENDTSByaG8gd2l0aCB0aGUgbWF4aW11bSBhbmQgbWluaW11bSBsaWJyYXJ5IGxlbmd0aHMuDQoNCi0tIE5vdGUgdGhhdCBTSVpFX2NjbVVfeG1hcF9WX2NvbWJpbmVkW1trXV1bW2pdXSByZXByZXNlbnRzIHRoZSByZXN1bHQgZnJvbSB0aGUgY29tYmluZWQgdGltZSBzZXJpZXMgSUQgIlNJWkVrIiB3aXRoIGRlbGF5IHRwICgxIC0gaikuIChqIGZyb20gMSB0byA1KSANCg0KIyMjIyMgRm9yIFNtYWxsDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU21hbGxfWV94bWFwX0FfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQpTbWFsbF9ZX3htYXBfWV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNClNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KU21hbGxfQV94bWFwX0FfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQoNCmZvcihrIGluIDE6bGVuZ3RoKFNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkKSl7DQogIFNtYWxsX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIFNtYWxsX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIFNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIFNtYWxsX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIGZvcihqIGluIDE6NSkgew0KICAgIFNtYWxsX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJHJobywgIFNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJHJobywgU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihTbWFsbF9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgIFNtYWxsX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoU21hbGxfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgIFNtYWxsX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoU21hbGxfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoU21hbGxfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgU21hbGxfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihTbWFsbF9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgIFNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgIFNtYWxsX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgU21hbGxfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihTbWFsbF9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgIFNtYWxsX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoU21hbGxfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJHJobywgIFNtYWxsX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoU21hbGxfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoU21hbGxfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJHJobywgU21hbGxfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihTbWFsbF9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgICNjb252ZXJ0IG5lZ2F0aXZlIHZhbHVlcyBpbnRvIHplcm8NCiAgICBTbWFsbF9ZX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV1bU21hbGxfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIFNtYWxsX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXVtTbWFsbF9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0gPCAwXSA8LSAwDQogICAgU21hbGxfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dW1NtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8IDBdIDwtIDANCiAgICBTbWFsbF9BX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV1bU21hbGxfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIA0KICB9DQp9DQpgYGANCg0KIyMjIyMgRm9yIE1lZGl1bQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTWVkaXVtX1lfeG1hcF9BX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTWVkaXVtX1lfeG1hcF9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTWVkaXVtX0FfeG1hcF9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTWVkaXVtX0FfeG1hcF9BX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KDQpmb3IoayBpbiAxOmxlbmd0aChNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWQpKXsNCiAgTWVkaXVtX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIE1lZGl1bV9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dIDwtIGxpc3QoKQ0KICBNZWRpdW1fQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgTWVkaXVtX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIGZvcihqIGluIDE6NSkgew0KICAgIE1lZGl1bV9ZX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gc3Vic2V0KE1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTWVkaXVtX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoTWVkaXVtX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpIC0gc3Vic2V0KE1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkNCiAgICANCiAgICBNZWRpdW1fWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgIE1lZGl1bV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWF4KE1lZGl1bV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChNZWRpdW1fY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgTWVkaXVtX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtaW4oTWVkaXVtX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgTWVkaXVtX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sICBNZWRpdW1fY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChNZWRpdW1fY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoTWVkaXVtX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sIE1lZGl1bV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKE1lZGl1bV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgIE1lZGl1bV9BX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gc3Vic2V0KE1lZGl1bV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTWVkaXVtX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoTWVkaXVtX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpIC0gc3Vic2V0KE1lZGl1bV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihNZWRpdW1fY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkNCiAgICANCiAgICAjY29udmVydCBuZWdhdGl2ZSB2YWx1ZXMgaW50byB6ZXJvDQogICAgTWVkaXVtX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVtNZWRpdW1fWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIE1lZGl1bV9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV1bTWVkaXVtX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8IDBdIDwtIDANCiAgICBNZWRpdW1fQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dW01lZGl1bV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0gPCAwXSA8LSAwDQogICAgTWVkaXVtX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVtNZWRpdW1fQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIA0KICB9DQp9DQpgYGANCg0KIyMjIyMgRm9yIExhcmdlDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpMYXJnZV9ZX3htYXBfQV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCkxhcmdlX1lfeG1hcF9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTGFyZ2VfQV94bWFwX1lfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQpMYXJnZV9BX3htYXBfQV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCg0KZm9yKGsgaW4gMTpsZW5ndGgoTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQpKXsNCiAgTGFyZ2VfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgTGFyZ2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgTGFyZ2VfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgTGFyZ2VfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgZm9yKGogaW4gMTo1KSB7DQogICAgTGFyZ2VfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChMYXJnZV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChMYXJnZV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChMYXJnZV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBMYXJnZV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKExhcmdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgTGFyZ2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTGFyZ2VfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBMYXJnZV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKExhcmdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgTGFyZ2VfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTGFyZ2VfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBMYXJnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKExhcmdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgTGFyZ2VfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChMYXJnZV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgTGFyZ2VfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChMYXJnZV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChMYXJnZV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBMYXJnZV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKExhcmdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgI2NvbnZlcnQgbmVnYXRpdmUgdmFsdWVzIGludG8gemVybw0KICAgIExhcmdlX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVtMYXJnZV9ZX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV0gPCAwXSA8LSAwDQogICAgTGFyZ2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dW0xhcmdlX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8IDBdIDwtIDANCiAgICBMYXJnZV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV1bTGFyZ2VfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIExhcmdlX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVtMYXJnZV9BX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV0gPCAwXSA8LSAwDQogICAgDQogIH0NCn0NCmBgYA0KDQojIyMjIyBGb3IgSHVnZQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KSHVnZV9ZX3htYXBfQV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCkh1Z2VfWV94bWFwX1lfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQpIdWdlX0FfeG1hcF9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KSHVnZV9BX3htYXBfQV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCg0KZm9yKGsgaW4gMTpsZW5ndGgoSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZCkpew0KICBIdWdlX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIEh1Z2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgSHVnZV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dIDwtIGxpc3QoKQ0KICBIdWdlX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIGZvcihqIGluIDE6NSkgew0KICAgIEh1Z2VfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sICBIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sIEh1Z2VfY2NtWV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgSHVnZV9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gc3Vic2V0KEh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgIEh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1heChIdWdlX2NjbVlfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpIC0gc3Vic2V0KEh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJHJobywgSHVnZV9jY21ZX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWluKEh1Z2VfY2NtWV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkNCiAgICANCiAgICBIdWdlX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBzdWJzZXQoSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCAgSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUgPT0gbWF4KEh1Z2VfY2NtQV94bWFwX1lfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kcmhvLCBIdWdlX2NjbUFfeG1hcF9ZX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtaW4oSHVnZV9jY21BX3htYXBfWV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKQ0KICAgIA0KICAgIEh1Z2VfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIHN1YnNldChIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sICBIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSA9PSBtYXgoSHVnZV9jY21BX3htYXBfQV9jb21iaW5lZFtba11dW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRyaG8sIEh1Z2VfY2NtQV94bWFwX0FfY29tYmluZWRbW2tdXVtbal1dJGxpYl9zaXplID09IG1pbihIdWdlX2NjbUFfeG1hcF9BX2NvbWJpbmVkW1trXV1bW2pdXSRsaWJfc2l6ZSkpDQogICAgDQogICAgI2NvbnZlcnQgbmVnYXRpdmUgdmFsdWVzIGludG8gemVybw0KICAgIEh1Z2VfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dW0h1Z2VfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIEh1Z2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dW0h1Z2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIEh1Z2VfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dW0h1Z2VfQV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIEh1Z2VfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dW0h1Z2VfQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwgMF0gPC0gMA0KICAgIA0KICB9DQp9DQpgYGANCg0KIyMjIyBbOC41LjJdIENhbGN1bGF0aW5nIHRoZSBpbmRleCBvZiBpbnRlcnNwZWNpZmljIGludGVyYWN0aW9uIHN0cmVuZ3RoDQoNCi0tIE5vdGUgdGhlIGRpcmVjdGlvbiBvZiBDQ00gYW5kIHRoYXQgb2YgaW50ZXJhY3Rpb24gYXJlIG9wcG9zaXRlLiAtLSBSZWxhdGl2ZSBpbnRlcmFjdGlvbiBmcm9tIFUgdG8gViBpcyBWX3htYXBfVV9pbnRlcmFjdGlvbi9VX3htYXBfVV9pbnRlcmFjdGlvbiANCiMjIyMjIEZvciBTbWFsbA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQpTbWFsbF9mcm9tQXRvWV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCg0KZm9yKGsgaW4gMTpsZW5ndGgoU21hbGxfY2NtWV94bWFwX0FfY29tYmluZWQpKXsNCiAgU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgZm9yKGogaW4gMTo1KSB7DQogICAgU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIFNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXS9TbWFsbF9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0NCiAgICBTbWFsbF9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gU21hbGxfWV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dL1NtYWxsX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXQ0KICB9DQp9DQpgYGANCg0KIyMjIyMgRm9yIE1lZGl1bQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KDQpmb3IoayBpbiAxOmxlbmd0aChNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWQpKXsNCiAgTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIE1lZGl1bV9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dIDwtIGxpc3QoKQ0KICBmb3IoaiBpbiAxOjUpIHsNCiAgICBNZWRpdW1fZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIE1lZGl1bV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0vTWVkaXVtX1lfeG1hcF9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXQ0KICAgIE1lZGl1bV9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gTWVkaXVtX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXS9NZWRpdW1fQV94bWFwX0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dDQogIH0NCn0NCmBgYA0KDQojIyMjIyBGb3IgTGFyZ2UNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCkxhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQoNCmZvcihrIGluIDE6bGVuZ3RoKExhcmdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkKSl7DQogIExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIExhcmdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIGZvcihqIGluIDE6NSkgew0KICAgIExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBMYXJnZV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0vTGFyZ2VfWV94bWFwX1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dDQogICAgTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dIDwtIExhcmdlX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXS9MYXJnZV9BX3htYXBfQV9pbnRlcmFjdGlvbltba11dW1tqXV0NCiAgfQ0KfQ0KYGBgDQoNCiMjIyMjIEZvciBIdWdlDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpIdWdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNCg0KZm9yKGsgaW4gMTpsZW5ndGgoSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZCkpew0KICBIdWdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV0gPC0gbGlzdCgpDQogIEh1Z2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXSA8LSBsaXN0KCkNCiAgZm9yKGogaW4gMTo1KSB7DQogICAgSHVnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbltba11dW1tqXV0gPC0gSHVnZV9BX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0vSHVnZV9ZX3htYXBfWV9pbnRlcmFjdGlvbltba11dW1tqXV0NCiAgICBIdWdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSA8LSBIdWdlX1lfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXS9IdWdlX0FfeG1hcF9BX2ludGVyYWN0aW9uW1trXV1bW2pdXQ0KICB9DQp9DQpgYGANCg0KIyMjIyBbOC41LjNdIENhbGN1bGF0aW5nIGF2ZXJhZ2VzIGFuZCBTRXMNCg0KIyMjIyMgRnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIFNFcyBmb3IgV0xTDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojRGVmaW5pbmcgdGhlIGZ1bmN0aW9uIG9mIHN0YW5kYXJkIGVycm9yDQpzZSA8LSBmdW5jdGlvbih4LCBuYS5pbmYucm0gPSBUKSB7DQogIGlmKG5hLmluZi5ybSA9PSBUKSB7DQogICAgeSA8LSB4WyFpcy5uYSh4KV0NCiAgICB5IDwtIHlbIWlzLmluZmluaXRlKHkpXQ0KICB9IGVsc2Ugew0KICAgIHkgPC0geA0KICB9DQogIHNkKHkpL3NxcnQobGVuZ3RoKHkpKQ0KfQ0KDQpgYGANCg0KIyMjIyMgQ2FsY3VsYXRpbmcgYXZlcmFnZXMgYW5kIFNFcyB3aXRoIGV4Y2x1ZGluZyBOYU4gYW5kIGluZg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0ZvciBTbWFsbA0KU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25fbWVhbiA8LSBjKCkNClNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW4gPC0gYygpDQpTbWFsbF9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZSA8LSBjKCkNClNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3NlIDwtIGMoKQ0KDQpmb3IoaiBpbiAxOjUpew0KICBTbWFsbF9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuW1tqXV0gPC0gbGlzdCgpDQogIFNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXSA8LSBsaXN0KCkNCiAgU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2VbW2pdXSA8LSBsaXN0KCkNCiAgU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2VbW2pdXSA8LSBsaXN0KCkNCg0KICBmb3IoayBpbiAxOmxlbmd0aChTbWFsbF9jY21ZX3htYXBfQV9jb21iaW5lZCkpIHsNCiAgICBTbWFsbF9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuW1tqXV1bW2tdXSA8LSBtZWFuKFNtYWxsX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVshaXMuaW5maW5pdGUoU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dKV0sIG5hLnJtID0gVCkNCiAgICBTbWFsbF9mcm9tQXRvWV9pbnRlcmFjdGlvbl9tZWFuW1tqXV1bW2tdXSA8LSBtZWFuKFNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXVshaXMuaW5maW5pdGUoU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dKV0sIG5hLnJtID0gVCkNCiAgICBTbWFsbF9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZVtbal1dW1trXV0gPC0gc2UoU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dLCBuYS5pbmYucm0gPSBUKQ0KICAgIFNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3NlW1tqXV1bW2tdXSA8LSBzZShTbWFsbF9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dW1tqXV0sIG5hLmluZi5ybSA9IFQpDQogIH0NCn0NCg0KI0ZvciBNZWRpdW0NCk1lZGl1bV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuIDwtIGMoKQ0KTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW4gPC0gYygpDQpNZWRpdW1fZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2UgPC0gYygpDQpNZWRpdW1fZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2UgPC0gYygpDQoNCmZvcihqIGluIDE6NSl7DQogIE1lZGl1bV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuW1tqXV0gPC0gbGlzdCgpDQogIE1lZGl1bV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9tZWFuW1tqXV0gPC0gbGlzdCgpDQogIE1lZGl1bV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZVtbal1dIDwtIGxpc3QoKQ0KICBNZWRpdW1fZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2VbW2pdXSA8LSBsaXN0KCkNCg0KICBmb3IoayBpbiAxOmxlbmd0aChNZWRpdW1fY2NtWV94bWFwX0FfY29tYmluZWQpKSB7DQogICAgTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXVtba11dIDwtIG1lYW4oTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV1bW2pdXVshaXMuaW5maW5pdGUoTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV1bW2pdXSldLCBuYS5ybSA9IFQpDQogICAgTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXVtba11dIDwtIG1lYW4oTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXVshaXMuaW5maW5pdGUoTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSldLCBuYS5ybSA9IFQpDQogICAgTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uX3NlW1tqXV1bW2tdXSA8LSBzZShNZWRpdW1fZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dLCBuYS5pbmYucm0gPSBUKQ0KICAgIE1lZGl1bV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9zZVtbal1dW1trXV0gPC0gc2UoTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSwgbmEuaW5mLnJtID0gVCkNCiAgfQ0KfQ0KDQojRm9yIExhcmdlDQpMYXJnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuIDwtIGMoKQ0KTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fbWVhbiA8LSBjKCkNCkxhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX3NlIDwtIGMoKQ0KTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2UgPC0gYygpDQoNCmZvcihqIGluIDE6NSl7DQogIExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXSA8LSBsaXN0KCkNCiAgTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fbWVhbltbal1dIDwtIGxpc3QoKQ0KICBMYXJnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZVtbal1dIDwtIGxpc3QoKQ0KICBMYXJnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9zZVtbal1dIDwtIGxpc3QoKQ0KDQogIGZvcihrIGluIDE6bGVuZ3RoKExhcmdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkKSkgew0KICAgIExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXVtba11dIDwtIG1lYW4oTGFyZ2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dWyFpcy5pbmZpbml0ZShMYXJnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbltba11dW1tqXV0pXSwgbmEucm0gPSBUKQ0KICAgIExhcmdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXVtba11dIDwtIG1lYW4oTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dWyFpcy5pbmZpbml0ZShMYXJnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dW1tqXV0pXSwgbmEucm0gPSBUKQ0KICAgIExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX3NlW1tqXV1bW2tdXSA8LSBzZShMYXJnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbltba11dW1tqXV0sIG5hLmluZi5ybSA9IFQpDQogICAgTGFyZ2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2VbW2pdXVtba11dIDwtIHNlKExhcmdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSwgbmEuaW5mLnJtID0gVCkNCiAgfQ0KfQ0KDQojRm9yIEh1Z2UNCkh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25fbWVhbiA8LSBjKCkNCkh1Z2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fbWVhbiA8LSBjKCkNCkh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2UgPC0gYygpDQpIdWdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3NlIDwtIGMoKQ0KDQpmb3IoaiBpbiAxOjUpew0KICBIdWdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXSA8LSBsaXN0KCkNCiAgSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9tZWFuW1tqXV0gPC0gbGlzdCgpDQogIEh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2VbW2pdXSA8LSBsaXN0KCkNCiAgSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9zZVtbal1dIDwtIGxpc3QoKQ0KDQogIGZvcihrIGluIDE6bGVuZ3RoKEh1Z2VfY2NtWV94bWFwX0FfY29tYmluZWQpKSB7DQogICAgSHVnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuW1tqXV1bW2tdXSA8LSBtZWFuKEh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25bW2tdXVtbal1dWyFpcy5pbmZpbml0ZShIdWdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uW1trXV1bW2pdXSldLCBuYS5ybSA9IFQpDQogICAgSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9tZWFuW1tqXV1bW2tdXSA8LSBtZWFuKEh1Z2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25bW2tdXVtbal1dWyFpcy5pbmZpbml0ZShIdWdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uW1trXV1bW2pdXSldLCBuYS5ybSA9IFQpDQogICAgSHVnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZVtbal1dW1trXV0gPC0gc2UoSHVnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbltba11dW1tqXV0sIG5hLmluZi5ybSA9IFQpDQogICAgSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9zZVtbal1dW1trXV0gPC0gc2UoSHVnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbltba11dW1tqXV0sIG5hLmluZi5ybSA9IFQpDQogIH0NCn0NCmBgYA0KDQojIyMgWzguNl0gUmVncmVzc2lvbiBhbmFseXNpcyBmb3IgaW50ZXJzcGVjaWZpYyBpbnRlcmFjdGlvbnMNCg0KIyMjIyBbOC42LjFdIFByZXByb2Nlc2luZyBvZiB0aGUgcmVzdWx0cyBmcm9tIFs4LjVdDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpUb3RhbF9pbnRlcmFjdGlvbiA8LSBsaXN0KCkNClNtYWxsX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTWVkaXVtX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KTGFyZ2VfaW50ZXJhY3Rpb24gPC0gbGlzdCgpDQpIdWdlX2ludGVyYWN0aW9uIDwtIGxpc3QoKQ0KDQojU21hbGwgY29tYmluZWQgKFMxLCBTMiwgUzUsICYgUzYpDQojTWVkaXVtIGNvbWJpbmVkIChNMiB0byBNNykNCiNMYXJnZSBjb21iaW5lZCAoTDEsIEw0IHRvIEw4KSANCiNIdWdlIGNvbWJpbmVkIChIMSwgSDIsIEgzLCBINiwgSDcsIEg4KQ0KdG90YWxfYXZlcmFnZV9jb2V4aXN0ZW5jZV93ZWVrIDwtIHN1YnNldChUYWJsZTEsICh0aGV0YV9mb3JfQy5tID4gMCAmIHRoZXRhX2Zvcl9DLmMgPiAwKSkkYXZlcmFnZV9jb2V4aXN0ZW5jZV93ZWVrDQoNCiNHZW5lcmF0aW5nIGRhdGFmcmFtZSBmb3IgZWFjaCBjYWdlIHNpemUNCmZvcihqIGluIDE6NSl7DQogIA0KIFNtYWxsX2ludGVyYWN0aW9uW1tqXV0gPC0gZGF0YS5mcmFtZSh2b2x1bWUgPSByZXAoU21hbGx2b2x1bWUsIGxlbmd0aChTbWFsbF9jY21ZX3htYXBfQV9jb21iaW5lZCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2NsYXNzID0gcmVwKCJTbWFsbCIsIGxlbmd0aChTbWFsbF9jY21ZX3htYXBfQV9jb21iaW5lZCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWXRvQV9tZWFuID0gdW5saXN0KFNtYWxsX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9ZX21lYW4gPSB1bmxpc3QoU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25fbWVhbltbal1dKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFl0b0Ffc2UgPSB1bmxpc3QoU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2VbW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9ZX3NlID0gdW5saXN0KFNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3NlW1tqXV0pDQogKQ0KIA0KIE1lZGl1bV9pbnRlcmFjdGlvbltbal1dIDwtIGRhdGEuZnJhbWUodm9sdW1lID0gcmVwKE1lZGl1bXZvbHVtZSwgbGVuZ3RoKE1lZGl1bV9jY21ZX3htYXBfQV9jb21iaW5lZCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2NsYXNzID0gcmVwKCJNZWRpdW0iLCBsZW5ndGgoTWVkaXVtX2NjbVlfeG1hcF9BX2NvbWJpbmVkKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdG9BX21lYW4gPSB1bmxpc3QoTWVkaXVtX2Zyb21ZdG9BX2ludGVyYWN0aW9uX21lYW5bW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9ZX21lYW4gPSB1bmxpc3QoTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdG9BX3NlID0gdW5saXN0KE1lZGl1bV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zZVtbal1dKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b1lfc2UgPSB1bmxpc3QoTWVkaXVtX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3NlW1tqXV0pDQogKQ0KICBMYXJnZV9pbnRlcmFjdGlvbltbal1dIDwtIGRhdGEuZnJhbWUodm9sdW1lID0gcmVwKExhcmdldm9sdW1lLCBsZW5ndGgoTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9jbGFzcyA9IHJlcCgiTGFyZ2UiLCBsZW5ndGgoTGFyZ2VfY2NtWV94bWFwX0FfY29tYmluZWQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFl0b0FfbWVhbiA9IHVubGlzdChMYXJnZV9mcm9tWXRvQV9pbnRlcmFjdGlvbl9tZWFuW1tqXV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvWV9tZWFuID0gdW5saXN0KExhcmdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdG9BX3NlID0gdW5saXN0KExhcmdlX2Zyb21ZdG9BX2ludGVyYWN0aW9uX3NlW1tqXV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvWV9zZSA9IHVubGlzdChMYXJnZV9mcm9tQXRvWV9pbnRlcmFjdGlvbl9zZVtbal1dKQ0KICkNCiAgSHVnZV9pbnRlcmFjdGlvbltbal1dIDwtIGRhdGEuZnJhbWUodm9sdW1lID0gcmVwKEh1Z2V2b2x1bWUsIGxlbmd0aChIdWdlX2NjbVlfeG1hcF9BX2NvbWJpbmVkKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfY2xhc3MgPSByZXAoIkh1Z2UiLCBsZW5ndGgoSHVnZV9jY21ZX3htYXBfQV9jb21iaW5lZCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWXRvQV9tZWFuID0gdW5saXN0KEh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25fbWVhbltbal1dKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b1lfbWVhbiA9IHVubGlzdChIdWdlX2Zyb21BdG9ZX2ludGVyYWN0aW9uX21lYW5bW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdG9BX3NlID0gdW5saXN0KEh1Z2VfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc2VbW2pdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9ZX3NlID0gdW5saXN0KEh1Z2VfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc2VbW2pdXSkNCiApDQp9DQoNCiNDb21iaW5pbmcgYWxsIGNhZ2Ugc2l6ZSByZXN1bHRzDQpmb3IoaiBpbiAxOjUpIHsNCiAgVG90YWxfaW50ZXJhY3Rpb25bW2pdXSA8LSByYmluZC5kYXRhLmZyYW1lKFNtYWxsX2ludGVyYWN0aW9uW1tqXV0sIE1lZGl1bV9pbnRlcmFjdGlvbltbal1dKQ0KICBUb3RhbF9pbnRlcmFjdGlvbltbal1dIDwtIHJiaW5kLmRhdGEuZnJhbWUoVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgTGFyZ2VfaW50ZXJhY3Rpb25bW2pdXSkNCiAgVG90YWxfaW50ZXJhY3Rpb25bW2pdXSA8LSByYmluZC5kYXRhLmZyYW1lKFRvdGFsX2ludGVyYWN0aW9uW1tqXV0sIEh1Z2VfaW50ZXJhY3Rpb25bW2pdXSkNCiAgVG90YWxfaW50ZXJhY3Rpb25bW2pdXSA8LSBkYXRhLmZyYW1lKGNvZXhpc3RlbmNlX3dlZWsgPSB0b3RhbF9hdmVyYWdlX2NvZXhpc3RlbmNlX3dlZWssIFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pDQp9DQoNCmBgYA0KDQojIyMjIFs4LjYuMl0gT0xTIGFuZCBXTFMgcmVncmVzc2lvbiBmb3IgaW50ZXJhY3Rpb24gc3RyZW5ndGggYnkgY2FnZSBzaXplDQoNCiMjIyMjIEVmZmVjdCBvZiBZIChDbSkgb24gQSAoQ2MpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojZnJvbSB0cCA9IDAgKGogPSAxKSB0byB0cCA9IC00IChqID0gNSkNCmZvcihqIGluIDE6NSkgew0KICAjT0xTDQogIGNhdCgidHAgPSAiLCAxIC0gaiwgIlxuIikNCiAgcHJpbnQoc3VtbWFyeShsbShZdG9BX21lYW4gfiB2b2x1bWUsIGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbal1dKSkkY29lZmZpY2llbnRzKQ0KICBwcmludChzdW1tYXJ5KGxtKFl0b0FfbWVhbiB+IHZvbHVtZSwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pKSRhZGouci5zcXVhcmVkKQ0KfQ0KZm9yKGogaW4gMTo1KSB7DQogICNXTFMNCiAgY2F0KCJ0cCA9ICIsIDEgLSBqLCAiXG4iKQ0KICBwcmludChzdW1tYXJ5KGxtKFl0b0FfbWVhbiB+IHZvbHVtZSwgd2VpZ2h0cyA9IDEvWXRvQV9zZSwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pKSRjb2VmZmljaWVudHMpDQogIHByaW50KHN1bW1hcnkobG0oWXRvQV9tZWFuIH4gdm9sdW1lLCB3ZWlnaHRzID0gMS9ZdG9BX3NlLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSkpJGFkai5yLnNxdWFyZWQpDQp9DQpgYGANCg0KIyMjIyMgRWZmZWN0IG9mIEEgKENjKSBvbiBZIChDbSkNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNmcm9tIHRwID0gMCAoaiA9IDEpIHRvIHRwID0gLTQgKGogPSA1KQ0KZm9yKGogaW4gMTo1KSB7DQogICNPTFMNCiAgY2F0KCJ0cCA9ICIsIDEgLSBqLCAiXG4iKQ0KICBwcmludChzdW1tYXJ5KGxtKEF0b1lfbWVhbiB+IHZvbHVtZSwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pKSRjb2VmZmljaWVudHMpDQogIHByaW50KHN1bW1hcnkobG0oQXRvWV9tZWFuIH4gdm9sdW1lLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSkpJGFkai5yLnNxdWFyZWQpDQp9DQpmb3IoaiBpbiAxOjUpIHsNCiAgI1dMUw0KICBjYXQoInRwID0gIiwgMSAtIGosICJcbiIpDQogIHByaW50KHN1bW1hcnkobG0oQXRvWV9tZWFuIH4gdm9sdW1lLCB3ZWlnaHRzID0gMS9BdG9ZX3NlLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSkpJGNvZWZmaWNpZW50cykNCiAgcHJpbnQoc3VtbWFyeShsbShBdG9ZX21lYW4gfiB2b2x1bWUsIHdlaWdodHMgPSAxL0F0b1lfc2UsIGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbal1dKSkkYWRqLnIuc3F1YXJlZCkNCn0NCmBgYA0KDQojIyMjIFs4LjYuM10gVmlzdWFsaXphdGlvbiBvZiBPTFMgJiBXTFMgZm9yIGludGVyYWN0aW9uIHN0cmVuZ3RoIGJ5IGNhZ2Ugc2l6ZSAoZm9yIEZpZy4zICYgRmlnLjQpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpmb3IoaiBpbiAxOjUpIHsNCiAgRmlnMyA8LSBnZ3Bsb3QoZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0sIGFlcyh4ID0gdm9sdW1lLCB5ID0gWXRvQV9tZWFuKSkNCiAgRmlnMyA8LSBGaWczICsgZ2VvbV9wb2ludChzaXplID0gMSArIDAuMi9Ub3RhbF9pbnRlcmFjdGlvbltbal1dJFl0b0Ffc2UsIHNoYXBlID0gMjEpDQogIEZpZzMgPC0gRmlnMyArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRiwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KICBGaWczIDwtIEZpZzMgKyBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBtYXBwaW5nID0gYWVzKHdlaWdodCA9IDEvVG90YWxfaW50ZXJhY3Rpb25bW2pdXSRZdG9BX3NlKSwgc2UgPSBGLCBjb2xvciA9ICdyZWQnLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KICBGaWczIDwtIEZpZzMgKyBsYWJzKHRpdGxlID0gcGFzdGUoIkZyb20gQ20gdG8gQ2M6IHRwID0gIiwgMSAtIGosIHNlcCA9ICIiKSwgeSA9ICJSZWxhdGl2ZSBpbnRlcmFjdGlvbiBzdHJlbmd0aCIsIHggPSAiVm9sdW1lIChjbTMpIikNCiAgcHJpbnQoRmlnMykNCn0NCg0KZm9yKGogaW4gMTo1KSB7DQogIEZpZzQgPC0gZ2dwbG90KGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbal1dLCBhZXMoeCA9IHZvbHVtZSwgeSA9IEF0b1lfbWVhbikpDQogIEZpZzQgPC0gRmlnNCArIGdlb21fcG9pbnQoc2l6ZSA9IDEgKyAwLjIvVG90YWxfaW50ZXJhY3Rpb25bW2pdXSRBdG9ZX3NlLCBzaGFwZSA9IDIxKQ0KICBGaWc0IDwtIEZpZzQgKyBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAiZGFzaGVkIikNCiAgRmlnNCA8LSBGaWc0ICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgbWFwcGluZyA9IGFlcyh3ZWlnaHQgPSAxL1RvdGFsX2ludGVyYWN0aW9uW1tqXV0kQXRvWV9zZSksIHNlID0gRiwgY29sb3IgPSAncmVkJywgbGluZXR5cGUgPSAiZGFzaGVkIikNCiAgRmlnNCA8LSBGaWc0ICsgbGFicyh0aXRsZSA9IHBhc3RlKCJGcm9tIENjIHRvIENtOiB0cCA9ICIsIDEgLSBqLCBzZXAgPSAiIiksIHkgPSAiUmVsYXRpdmUgaW50ZXJhY3Rpb24gc3RyZW5ndGgiLCB4ID0gIlZvbHVtZSAoY20zKSIpDQogIHByaW50KEZpZzQpDQp9DQpgYGANCg0KIyMjIyBbOC42LjRdIFdoeSBkbyB3ZSBoYXZlIGEgb3V0bGllciBpbiB0aW1lIHNlcmllcyBmcm9tIFNtYWxsIGNhZ2VzPw0KLS0gVGhpcyBpcyBiZWNhdXNlIHRoZSBvcHRpbWFsIGVtYmVkZGluZyBkaW1lbnRpb24gKEUqKSBpcyByZWxhdGl2ZWx5IGhpZ2ggKD0gOCkgYnV0IHRoZSBtaW5pbXVtIGxpYnJhcnkgc2l6ZSBpcyA4IGFuZCB0aGUgbWF4aW11bSBsaWJyYXJ5IHNpemUgaXMgMTEuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0b28gc2hvcnQuIA0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNGb3IgUzYgQ0NNIHJlc3VsdHMNClNtYWxsX2NjbVlfeG1hcF9BX2NvbWJpbmVkW1s0XV1bWzFdXQ0KYGBgDQoNCiMjIyMgWzguNi41XSBBTk9WQS10eXBlIGFuYWx5c2lzIGZvciBpbnRlcmFjdGlvbiBzdHJlbmd0aCBieSBjYWdlIHNpemUgKEZvciBUYWJsZSBTMikNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCmZvcihqIGluIDE6NSkgew0KICAjZWZmZWN0IG9mIFkgKENtKSBvbiBBIChDYykNCiAgY2F0KCJ0cCA9ICIsIDEgLSBqLCAiXG4iKQ0KICBjYXQoIk9MU1xuIikNCiAgcHJpbnQoYW5vdmEobG0oWXRvQV9tZWFuIH4gdm9sdW1lX2NsYXNzLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSkpKQ0KICBjYXQoIlxuIikNCn0NCmZvcihqIGluIDE6NSkgew0KICAjZWZmZWN0IG9mIFkgKENtKSBvbiBBIChDYykNCiAgY2F0KCJXTFNcbiIpDQogIHByaW50KGFub3ZhKGxtKFl0b0FfbWVhbiB+IHZvbHVtZV9jbGFzcywgd2VpZ2h0cyA9IDEvWXRvQV9zZSwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pKSkNCiAgY2F0KCJcbiIpDQogIA0KfQ0KZm9yKGogaW4gMTo1KSB7DQogICNlZmZlY3Qgb2YgQSAoQ2MpIG9uIFkgKENtKQ0KICBjYXQoIk9MU1xuIikNCiAgcHJpbnQoYW5vdmEobG0oQXRvWV9tZWFuIH4gdm9sdW1lX2NsYXNzLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSkpKQ0KICBjYXQoIlxuIikNCn0NCmZvcihqIGluIDE6NSkgew0KICAjZWZmZWN0IG9mIEEgKENjKSBvbiBZIChDbSkNCiAgY2F0KCJXTFNcbiIpDQogIHByaW50KGFub3ZhKGxtKEF0b1lfbWVhbiB+IHZvbHVtZV9jbGFzcywgd2VpZ2h0cyA9IDEvQXRvWV9zZSwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0pKSkNCiAgY2F0KCJcbiIpDQp9DQpgYGANCiMjIyMgWzguNi43XSBDb25jbHVzaW9uIGZvciByZWdyZXNzaW9uIGFuYWx5c2lzIChjYWdlIHNpemUgdnMgaW50ZXJhY3Rpb24gc3RyZW5ndGgpDQotLSBUaGUgcmVncmVzc2lvbiByZWxhdGlvbnNoaXAgKGFuZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpZmZlcmVudCBzaXplcywgaW5kaWNhdGVkIGJ5IEFOT1ZBKSB3YXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuDQoNCiMjIyBbOC43XSBHTE0gYW5hbHlzaXMgZm9yIGNvZXhpc3RlbmNlX3dlZWsgfiByaG8qY2FnZSBzaXplICgxKTppbmRpdmlkdWFsIGVmZmVjdHMgKGZvciBGaWdzLjQgJiA1KQ0KLSBXaHkgd2UgdXNlZCB0aGUgR2FtbWEgZGlzdHJpYnV0aW9uPyDigJMgc2VlIHRoZSBmb2xsb3dpbmcgcmV2aWV3IHBhcGVyDQpodHRwczovL3d3dy5qc3RhZ2UuanN0LmdvLmpwL2FydGljbGUvd2VlZC81NS80LzU1XzRfMjY4L19wZGYNCg0KLSBUaGUgd29ya2Zsb3c6IFdlIHN0YXJ0ZWQgd2l0aCBjaGVja2luZyB0aGUgaW5kaXZpZHVhbCBlZmZlY3Qgb2YgYSBzcGVjaWZpYyBpbnRlcmFjdGlvbiAoQ20gKFkpIC0+IENjIChBKSBvciBDYyAoQSkgLT4gQ20gKFkpKSBmb3IgZWFjaCB0cCAoaW4gdGhpcyBzZWN0aW9uKSBieSBhcHBseWluZyBzdGVwQUlDKCkgZnVuY3Rpb24uIFRoZW4sIHdlIGluY2x1ZGVkIGFsbCBvZiB0aGUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmYWN0b3JzIGludG8gYSBzaW5nbGUgbW9kZWwgYW5kIHNlbGVjdGVkIHRoZSBiZXN0IG1vZGVsIGJhc2VkIG9uIEFJQy9CSUMgKGluIHRoZSBuZXh0IHNlY3Rpb24pLg0KDQojIyMjIFs4LjcuMV0gVGhlIGVmZmVjdCBvZiBDbSAoWSkgb24gQ2MgKEEpDQojIyMjIyB0cCA9IDAsIHVzaW5nIHRoZSBvYmplY3QgVG90YWxfaW50ZXJhY3Rpb25bWzFdXQ0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNBbHRob3VnaCB3ZSBrbm93IHRoZSBHYW1tYSBkaXN0cmlidXRpb24gaXMgbW9yZSBhcHByb3ByaWF0ZSB0aGFuIGdhdXNzaWFuLCB3ZSBhbHNvIHRyaWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHN1YnN0YW50aWFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtDQoNCiNHTE0gd2l0aCBHYW1tYQ0KZ2xtX1l0b0FfdHAwIDwtIGdsbShjb2V4aXN0ZW5jZV93ZWVrIH4gdm9sdW1lICsgWXRvQV9tZWFuICsgdm9sdW1lOll0b0FfbWVhbiwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1sxXV0sIGZhbWlseSA9IEdhbW1hKGxpbmsgPSBpZGVudGl0eSkpDQoNCiNHZXQgR0xNIHJlZ3Jlc3Npb24gbGluZXMNCmdsbV9ZdG9BX3RwMF9wcmVkaWN0ZWQgPC0gZ2dwcmVkaWN0KGdsbV9ZdG9BX3RwMCwgdGVybSA9IGMoIll0b0FfbWVhbiIsInZvbHVtZSIpKQ0KDQojZGVmaW5lIGxpbmV0eXBlcyAmIGxpbmV3aWR0aA0KbGluZXdpZHRocyA8LSBjKDAuNSwgMC43NSwgMS4wLCAxLjI1KQ0KDQojZ2dwbG90ICANCmdsbV9ZdG9BX3RwMF9maWcgPC0gZ2dwbG90KCkgKyBnZW9tX3BvaW50KGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbMV1dLCBhZXMoeCA9IFl0b0FfbWVhbiwgeSA9IGNvZXhpc3RlbmNlX3dlZWssIHNoYXBlID0gYXMuZmFjdG9yKHZvbHVtZV9jbGFzcyksIHNpemUgPSAzKSwgYWxwaGEgPSAwLjUpIA0KZ2xtX1l0b0FfdHAwX2ZpZyA8LSBnbG1fWXRvQV90cDBfZmlnICsgZ2VvbV9saW5lKGRhdGEgPSBnbG1fWXRvQV90cDBfcHJlZGljdGVkLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQsIGxpbmV3aWR0aCA9IGdyb3VwKSkgKyBzY2FsZV9saW5ld2lkdGhfbWFudWFsKHZhbHVlcyA9IGxpbmV3aWR0aHMpIA0KcGxvdChnbG1fWXRvQV90cDBfZmlnKQ0KDQojI1dpdGggZ2F1c3NpYW4gZGlzdHJpYnV0aW9uDQpnbG1fWXRvQV90cDBnIDwtIGdsbShjb2V4aXN0ZW5jZV93ZWVrIH4gdm9sdW1lICsgWXRvQV9tZWFuICsgdm9sdW1lOll0b0FfbWVhbiwgZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1sxXV0sIGZhbWlseSA9IGdhdXNzaWFuKGxpbmsgPSBpZGVudGl0eSkpDQoNCiMjQ29tcGFyZSBHYW1tYSBhbmQgZ2F1c3NpYW4NCnN1bW1hcnkoZ2xtX1l0b0FfdHAwKQ0Kc3VtbWFyeShnbG1fWXRvQV90cDBnKQ0KDQojI0NvbmZpcm0gdGhlIGJlc3QgbW9kZWwgYW5kIHNpZ25pZmljYW50IGZhY3RvcnMNCnN1bW1hcnkoc3RlcEFJQyhnbG1fWXRvQV90cDApKQ0KYGBgDQojIyMjIyBHTE0gZnJvbSB0cCA9IC0xIHRvIC00LCB1c2luZyB0aGUgb2JqZWN0IFRvdGFsX2ludGVyYWN0aW9uW1syXV0gfiBUb3RhbF9pbnRlcmFjdGlvbltbNV1dXQ0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNQcmVwYXJlIG9iamVjdHMgdG8gc2F2ZSByZXN1bHRzDQpnbG1fWXRvQV90cCA8LSBsaXN0KCkNCmdsbV9ZdG9BX3RwX3ByZWRpY3RlZCA8LSBsaXN0KCkNCmdsbV9ZdG9BX3RwX2ZpZyA8LSBsaXN0KCkNCg0KI2Fzc2lnbiByZXN1bHRzIGZyb20gdHAgPSAwDQpnbG1fWXRvQV90cFtbMV1dIDwtIGdsbV9ZdG9BX3RwMA0KZ2xtX1l0b0FfdHBfcHJlZGljdGVkW1sxXV0gPC0gZ2xtX1l0b0FfdHAwX3ByZWRpY3RlZA0KZ2xtX1l0b0FfdHBfZmlnW1sxXV0gPC0gZ2xtX1l0b0FfdHAwX2ZpZw0KDQojR0xNIHdpdGggR2FtbWEgYW5kIGdldHRpbmcgR0xNIHJlZ3Jlc3Npb24gbGluZXMgDQpmb3IoaiBpbiAyOjUpIHsNCiAgZ2xtX1l0b0FfdHBbW2pdXSA8LSBnbG0oY29leGlzdGVuY2Vfd2VlayB+IHZvbHVtZSArIFl0b0FfbWVhbiArIHZvbHVtZTpZdG9BX21lYW4sIGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbal1dLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gaWRlbnRpdHkpKQ0KICBnbG1fWXRvQV90cF9wcmVkaWN0ZWRbW2pdXSA8LSBnZ3ByZWRpY3QoZ2xtX1l0b0FfdHBbW2pdXSwgdGVybSA9IGMoIll0b0FfbWVhbiIsInZvbHVtZSIpKQ0KDQp9DQoNCiMjQ2hlY2tpbmcgZ2xtIHJlc3VsdHMNCmZvcihqIGluIDE6NSkgew0KICBjYXQoInRwID0gIiwgMSAtIGosICJcbiIpDQogIHByaW50KHN1bW1hcnkoZ2xtX1l0b0FfdHBbW2pdXSkpDQp9DQpgYGANCiMjIyMjIEdMTSB3aXRoIHN0ZXBBSUMNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojI0NvbmZpcm0gdGhlIGJlc3QgbW9kZWwgYW5kIHNpZ25pZmljYW50IGZhY3RvcnMNCmZvcihqIGluIDE6NSkgew0KICBjYXQoInRwID0gIiwgMSAtIGosICJcbiIpDQogIHByaW50KHN1bW1hcnkoc3RlcEFJQyhnbG1fWXRvQV90cFtbal1dKSkkY29lZmZpY2llbnRzKQ0KICBjYXQoIlxuIikNCn0NCmBgYA0KIyMjIyMgR0xNIGNvbmNsdXNpb25zIChmb3IgdGhlIGVmZmVjdCBvZiBDbSAoWSkgb24gQ2MgKEEpKQ0KLS0gTm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgb2YgY2FnZSBzaXplIGFuZCBpbnRlcmFjdGlvbiBzdHJlbmd0aA0KDQotLSBmb3IgYWxsIHRwLCB0aGUgaW50ZXJhY3Rpb24gc3RyZW5ndGggKFl0b0FfbWVhbikgaGFzIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCB3aXRoIGNvZXhpc3RlbmNlDQoNCi0tIGZvciBhbGwgdHAsIHRoZSB2b2x1bWUgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50DQoNCiMjIyMjIEdMTSBWaXN1YWxpemF0aW9uIChGaWcuNSkNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojZGVmaW5lIGxpbmV0eXBlcyAmIGxpbmV3aWR0aA0KbGluZXR5cGVzIDwtIGMoImRhc2hlZCIsICJkb3R0ZWQiLCAiZG90ZGFzaCIsICJsb25nZGFzaCIpDQoNCiNnZ3Bsb3QgIA0KZm9yKGogaW4gMTo1KSB7DQogIGdsbV9ZdG9BX3RwX2ZpZ1tbal1dIDwtIGdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgYWVzKHggPSBZdG9BX21lYW4sIHkgPSBjb2V4aXN0ZW5jZV93ZWVrLCBzaGFwZSA9IGFzLmZhY3Rvcih2b2x1bWVfY2xhc3MpLCBzaXplID0gMyksIGFscGhhID0gMC41KSANCiAgZ2xtX1l0b0FfdHBfZmlnW1tqXV0gPC0gZ2xtX1l0b0FfdHBfZmlnW1tqXV0gKyBnZW9tX2xpbmUoZGF0YSA9IGdsbV9ZdG9BX3RwX3ByZWRpY3RlZFtbal1dLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQsIGxpbmV0eXBlID0gZ3JvdXApKSArIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBsaW5ldHlwZXMpIA0KICBnbG1fWXRvQV90cF9maWdbW2pdXSA8LSBnbG1fWXRvQV90cF9maWdbW2pdXSArIGdlb21fc21vb3RoKGRhdGEgPSBUb3RhbF9pbnRlcmFjdGlvbltbal1dLCBhZXMoeCA9IFl0b0FfbWVhbiwgeSA9IGNvZXhpc3RlbmNlX3dlZWspLCBtZXRob2QgPSAnZ2xtJywgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9IEdhbW1hKGxpbmsgPSBpZGVudGl0eSkpLCBzZSA9IEYsIGNvbG9yID0gJ2JsYWNrJykNCn0NCg0KI3Bsb3QgYWxsDQpmb3IoaiBpbiAxOjUpIHsNCiAgZ2xtX1l0b0FfdHBfZmlnW1tqXV0gPC0gZ2xtX1l0b0FfdHBfZmlnW1tqXV0gKyBnZ3RpdGxlKHBhc3RlKCJFZmZlY3Qgb2YgWSAoQ20pIG9uIEEgKENjKSwgdHAgPSAiLCAxIC0gaiwgc2VwID0gIiIpKQ0KICBwbG90KGdsbV9ZdG9BX3RwX2ZpZ1tbal1dKQ0KfQ0KDQojcGxvdCBhZ2FpbiBmb3IgdHAgPSAtMyBmb3IgbmFycm93ZXIgeSBheGlzDQpnbG1fWXRvQV90cF9maWdbWzRdXSA8LSBnbG1fWXRvQV90cF9maWdbWzRdXSArIHlsaW0oYygwLCBOQSkpDQpwbG90KGdsbV9ZdG9BX3RwX2ZpZ1tbNF1dKQ0KDQojcGxvdCBhZ2FpbiBmb3IgdHAgPSAtNCBmb3IgbmFycm93ZXIgeSBheGlzDQpnbG1fWXRvQV90cF9maWdbWzVdXSA8LSBnbG1fWXRvQV90cF9maWdbWzVdXSArIHlsaW0oYygwLCA1MCkpDQpwbG90KGdsbV9ZdG9BX3RwX2ZpZ1tbNV1dKQ0KDQpgYGANCg0KIyMjIyBbOC43LjJdIFRoZSBlZmZlY3Qgb2YgQ2MgKEEpIG9uIENtIChZKQ0KIyMjIyMgR0xNIGZyb20gdHAgPSAwIHRvIC00DQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI1ByZXBhcmUgb2JqZWN0cyB0byBzYXZlIHJlc3VsdHMNCmdsbV9BdG9ZX3RwIDwtIGxpc3QoKQ0KZ2xtX0F0b1lfdHBfcHJlZGljdGVkIDwtIGxpc3QoKQ0KZ2xtX0F0b1lfdHBfZmlnIDwtIGxpc3QoKQ0KDQojR0xNIHdpdGggR2FtbWEgKiBnZXR0aW5nIEdMTSByZWdyZXNzaW9uIGxpbmVzIA0KZm9yKGogaW4gMTo1KSB7DQogIGdsbV9BdG9ZX3RwW1tqXV0gPC0gZ2xtKGNvZXhpc3RlbmNlX3dlZWsgfiB2b2x1bWUgKyBBdG9ZX21lYW4gKyB2b2x1bWU6QXRvWV9tZWFuLCBkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgZmFtaWx5ID0gR2FtbWEobGluayA9IGlkZW50aXR5KSkNCiAgZ2xtX0F0b1lfdHBfcHJlZGljdGVkW1tqXV0gPC0gZ2dwcmVkaWN0KGdsbV9BdG9ZX3RwW1tqXV0sIHRlcm0gPSBjKCJBdG9ZX21lYW4iLCJ2b2x1bWUiKSkNCg0KfQ0KDQojI0NoZWNraW5nIGdsbSByZXN1bHRzDQpmb3IoaiBpbiAxOjUpIHsNCiAgY2F0KCJ0cCA9ICIsIDEgLSBqLCAiXG4iKQ0KICBwcmludChzdW1tYXJ5KGdsbV9BdG9ZX3RwW1tqXV0pKQ0KfQ0KYGBgDQojIyMjIyBHTE0gd2l0aCBzdGVwQUlDDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KIyNDb25maXJtIHRoZSBiZXN0IG1vZGVsIGFuZCBzaWduaWZpY2FudCBmYWN0b3JzDQpmb3IoaiBpbiAxOjUpIHsNCiAgY2F0KCJ0cCA9ICIsIDEgLSBqLCAiXG4iKQ0KICBwcmludChzdW1tYXJ5KHN0ZXBBSUMoZ2xtX0F0b1lfdHBbW2pdXSkpJGNvZWZmaWNpZW50cykgDQogIGNhdCgiXG4iKQ0KfQ0KYGBgDQojIyMjIyBHTE0gY29uY2x1c2lvbnMgKGZvciB0aGUgZWZmZWN0IG9mIENjIChBKSBvbiBDbSAoWSkpDQotLSBObyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGludGVyYWN0aW9ucyBvZiBjYWdlIHNpemUgYW5kIGludGVyYWN0aW9uIHN0cmVuZ3RoDQoNCi0tIHRwID0gMCAmIC00OiBpbnRlcmFjdGlvbiBzdHJlbmd0aCB3YXMgbm90IHNpZ25pZmljYW50DQoNCi0tIHRwID0gLTEsIC0yLCAmIC0zOiBpbnRlcmFjdGlvbiBzdHJlbmd0aCB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB3aXRoIHBvc2l0aXZlIHNsb3BlDQoNCi0tIGZvciBhbGwgdHAgKGV4Y2VwdCBmb3IgdHAgPSAtNCksIHRoZSB2b2x1bWUgd2FzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2l0aCBwb3NpdGl2ZSBzbG9wZQ0KDQojIyMjIyBHTE0gVmlzdWxpemF0aW9uIChGaWcuNikNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojZGVmaW5lIGxpbmV0eXBlcyAmIGxpbmV3aWR0aA0KbGluZXR5cGVzIDwtIGMoImRhc2hlZCIsICJkb3R0ZWQiLCAiZG90ZGFzaCIsICJsb25nZGFzaCIpDQoNCiNnZ3Bsb3QgIA0KZm9yKGogaW4gMTo1KSB7DQogIGdsbV9BdG9ZX3RwX2ZpZ1tbal1dIDwtIGdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgYWVzKHggPSBBdG9ZX21lYW4sIHkgPSBjb2V4aXN0ZW5jZV93ZWVrLCBzaGFwZSA9IGFzLmZhY3Rvcih2b2x1bWVfY2xhc3MpLCBzaXplID0gMyksIGFscGhhID0gMC41KSANCiAgZ2xtX0F0b1lfdHBfZmlnW1tqXV0gPC0gZ2xtX0F0b1lfdHBfZmlnW1tqXV0gKyBnZW9tX2xpbmUoZGF0YSA9IGdsbV9BdG9ZX3RwX3ByZWRpY3RlZFtbal1dLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQsIGxpbmV0eXBlID0gZ3JvdXApKSArIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBsaW5ldHlwZXMpIA0KfQ0KI2FkZGluZyB0aGUgb3ZlcmFsbCBzbG9wZXMNCmdsbV9BdG9ZX3RwX2ZpZ1tbMV1dIDwtIGdsbV9BdG9ZX3RwX2ZpZ1tbMV1dICsgZ2VvbV9zbW9vdGgoZGF0YSA9IFRvdGFsX2ludGVyYWN0aW9uW1tqXV0sIGFlcyh4ID0gQXRvWV9tZWFuLCB5ID0gY29leGlzdGVuY2Vfd2VlayksIG1ldGhvZCA9ICdnbG0nLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gR2FtbWEobGluayA9IGlkZW50aXR5KSksIHNlID0gRiwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KZ2xtX0F0b1lfdHBfZmlnW1s1XV0gPC0gZ2xtX0F0b1lfdHBfZmlnW1s1XV0gKyBnZW9tX3Ntb290aChkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgYWVzKHggPSBBdG9ZX21lYW4sIHkgPSBjb2V4aXN0ZW5jZV93ZWVrKSwgbWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSBHYW1tYShsaW5rID0gaWRlbnRpdHkpKSwgc2UgPSBGLCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gImRhc2hlZCIpDQpmb3IoaiBpbiAyOjQpIHsNCiAgZ2xtX0F0b1lfdHBfZmlnW1tqXV0gPC0gZ2xtX0F0b1lfdHBfZmlnW1tqXV0gKyBnZW9tX3Ntb290aChkYXRhID0gVG90YWxfaW50ZXJhY3Rpb25bW2pdXSwgYWVzKHggPSBBdG9ZX21lYW4sIHkgPSBjb2V4aXN0ZW5jZV93ZWVrKSwgbWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSBHYW1tYShsaW5rID0gaWRlbnRpdHkpKSwgc2UgPSBGLCBjb2xvciA9ICdibGFjaycpDQp9DQoNCiNwbG90IGFsbA0KZm9yKGogaW4gMTo1KSB7DQogIGdsbV9BdG9ZX3RwX2ZpZ1tbal1dIDwtIGdsbV9BdG9ZX3RwX2ZpZ1tbal1dICsgZ2d0aXRsZShwYXN0ZSgiRWZmZWN0IG9mIEEgKENjKSBvbiBZIChDbSksIHRwID0gIiwgMSAtIGosIHNlcCA9ICIiKSkNCiAgcGxvdChnbG1fQXRvWV90cF9maWdbW2pdXSkNCn0NCg0KYGBgDQoNCiMjIyMgWzguNy4zXSBDb25jbHVzaW9ucyBmcm9tIGVhY2ggdHANCi0tIEZvciB0aGUgZWZmZWN0IGZyb20gWSB0byBBOiB0aGVyZSB3YXMgbmVnYXRpdmUgZWZmZWN0IGZvciBhbGwgdHAuIA0KDQotLSBGb3IgdGhlIGVmZmVjdCBmcm9tIEEgdG8gWTogdHAgPSAwICYgLTQ6IGludGVyYWN0aW9uIHN0cmVuZ3RoIGZyb20gQSB0byBZIHdhcyBub3Qgc2lnbmlmaWNhbiwgd2hpbGUgdHAgPSAtMSwgLTIsICYgLTM6IGludGVyYWN0aW9uIHN0cmVuZ3RoIGZyb20gQSB0byBZIHdhcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdpdGggcG9zaXRpdmUgc2xvcGUuDQoNCi0tIGZvciBhbGwgdHAgKGV4Y2VwdCBmb3IgdHAgPSAtNCksIHRoZSB2b2x1bWUgd2FzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2l0aCBwb3NpdGl2ZSBzbG9wZS4NCg0KDQojIyMgWzguOF0gTW9kZWwgc2VsZWN0aW9uIA0KIyMjIyBbOC44LjBdIFByZXBhcmluZyBkYXRhZnJhbWUNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpzZWxlY3RlZF9kYXRhX2FsbCA8LSBkYXRhLmZyYW1lKGNvd2VlayA9IFRvdGFsX2ludGVyYWN0aW9uW1sxXV0kY29leGlzdGVuY2Vfd2Vlaywgdm9sdW1lID0gVG90YWxfaW50ZXJhY3Rpb25bWzFdXSR2b2x1bWUsIGZyb21ZdG9BX3RwMCA9IFRvdGFsX2ludGVyYWN0aW9uW1sxXV0kWXRvQV9tZWFuLCBmcm9tWXRvQV90cDEgPSBUb3RhbF9pbnRlcmFjdGlvbltbMl1dJFl0b0FfbWVhbiwgZnJvbVl0b0FfdHAyID0gVG90YWxfaW50ZXJhY3Rpb25bWzNdXSRZdG9BX21lYW4sIGZyb21ZdG9BX3RwMyA9IFRvdGFsX2ludGVyYWN0aW9uW1s0XV0kWXRvQV9tZWFuLCBmcm9tWXRvQV90cDQgPSBUb3RhbF9pbnRlcmFjdGlvbltbNV1dJFl0b0FfbWVhbiwgZnJvbUF0b1lfdHAwID0gVG90YWxfaW50ZXJhY3Rpb25bWzFdXSRBdG9ZX21lYW4sIGZyb21BdG9ZX3RwMSA9IFRvdGFsX2ludGVyYWN0aW9uW1syXV0kQXRvWV9tZWFuLCBmcm9tQXRvWV90cDIgPSBUb3RhbF9pbnRlcmFjdGlvbltbM11dJEF0b1lfbWVhbiwgZnJvbUF0b1lfdHAzID0gVG90YWxfaW50ZXJhY3Rpb25bWzRdXSRBdG9ZX21lYW4sIGZyb21BdG9ZX3RwNCA9IFRvdGFsX2ludGVyYWN0aW9uW1s1XV0kQXRvWV9tZWFuKQ0KYGBgDQoNCiMjIyMgWzguOC4xXSBNdWx0aS1zdGVwIHdheSwgc3RhcnRpbmcgZnJvbSB0aGUgZnVsbCBtb2RlbCB0aGF0IGluY2x1ZGVkIHRoZSBzaWduaWZpY2FudCBmYWN0b3JzIGZyb20gZWFjaCB0cCdzIHN0ZXB3aXNlIHJlZ3Jlc3Npb24gKHBsdXMgb25lIGludGVyYWN0aXZlIHRlcm0gb25seSkNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQppbml0aWFsX21vZGVsIDwtIGdsbShjb3dlZWsgfiB2b2x1bWUsIGRhdGEgPSBzZWxlY3RlZF9kYXRhX2FsbCwgZmFtaWx5ID0gR2FtbWEobGluayA9IGlkZW50aXR5KSkNCnNlbGVjdGVkX21vZGVsIDwtIHN0ZXBBSUMoaW5pdGlhbF9tb2RlbCwgZGlyZWN0aW9uID0gImJvdGgiLCBzY29wZSA9IGxpc3QobG93ZXIgPSB+IDEsIHVwcGVyID0gfiB2b2x1bWUgKyBmcm9tWXRvQV90cDAgKyBmcm9tWXRvQV90cDEgKyBmcm9tWXRvQV90cDIgKyBmcm9tWXRvQV90cDMgKyBmcm9tWXRvQV90cDQgKyBmcm9tQXRvWV90cDEgKyBmcm9tQXRvWV90cDIgKyBmcm9tQXRvWV90cDMpKQ0KDQoNCmZ1bGxfbW9kZWwgPC0gZ2xtKGNvd2VlayB+IHZvbHVtZSArIGZyb21ZdG9BX3RwMCArIGZyb21ZdG9BX3RwMSArIGZyb21ZdG9BX3RwMiArIGZyb21ZdG9BX3RwMyArIGZyb21ZdG9BX3RwNCArIGZyb21BdG9ZX3RwMSArIGZyb21BdG9ZX3RwMiArIGZyb21BdG9ZX3RwMywgZGF0YSA9IHNlbGVjdGVkX2RhdGFfYWxsLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gaWRlbnRpdHkpKQ0KDQpzdW1tYXJ5KGZ1bGxfbW9kZWwpJGNvZWZmaWNpZW50cw0Kc3VtbWFyeShzZWxlY3RlZF9tb2RlbCkkY29lZmZpY2llbnRzDQpgYGANCiMjIyMgWzguOC4yXSBtb2RlbCBzZWxlY3Rpb24gZnJvbSBhbGwgY29tYmluYXRpb25zDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbW9kZWwwMiA8LSBnbG0oY293ZWVrfiB2b2x1bWUgKyBmcm9tWXRvQV90cDAgKyBmcm9tWXRvQV90cDEgKyBmcm9tWXRvQV90cDIgKyBmcm9tWXRvQV90cDMgKyBmcm9tWXRvQV90cDQgKyBmcm9tQXRvWV90cDEgKyBmcm9tQXRvWV90cDIgKyBmcm9tQXRvWV90cDMsIGRhdGEgPSBzZWxlY3RlZF9kYXRhX2FsbCwgZmFtaWx5ID0gR2FtbWEobGluayA9IGlkZW50aXR5KSwgbmEuYWN0aW9uID0gIm5hLmZhaWwiKQ0KZGQyIDwtIGRyZWRnZShtb2RlbDAyLCByYW5rID0gIkFJQyIpDQp0b3AubW9kZWxzIDwtIGdldC5tb2RlbHMoZGQyLCBjdW1zdW0od2VpZ2h0KSA8PSAuOTUpDQoNCiN0b3Btb3N0IG1vZGVsOg0Kc3VtbWFyeSh0b3AubW9kZWxzW1sxXV0pDQoNCm1vZGVsMDMgPC0gZ2xtKGNvd2Vla34gdm9sdW1lICsgZnJvbVl0b0FfdHAwICsgZnJvbVl0b0FfdHAxICsgZnJvbVl0b0FfdHAyICsgZnJvbVl0b0FfdHAzICsgZnJvbVl0b0FfdHA0ICsgZnJvbUF0b1lfdHAwICsgZnJvbUF0b1lfdHAxICsgZnJvbUF0b1lfdHAyICsgZnJvbUF0b1lfdHAzICsgZnJvbUF0b1lfdHA0ICsgZnJvbUF0b1lfdHAyOnZvbHVtZSwgZGF0YSA9IHNlbGVjdGVkX2RhdGFfYWxsLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gaWRlbnRpdHkpLCBuYS5hY3Rpb24gPSAibmEuZmFpbCIpDQpkZDMgPC0gZHJlZGdlKG1vZGVsMDMsIHJhbmsgPSAiQUlDIikNCnRvcC5tb2RlbHMgPC0gZ2V0Lm1vZGVscyhkZDMsIGN1bXN1bSh3ZWlnaHQpIDw9IC45NSkNCg0KI3RvcG1vc3QgbW9kZWw6DQpzdW1tYXJ5KHRvcC5tb2RlbHNbWzFdXSkNCg0KYGBgDQoNCiMjIyBbOC45XSBSZWxhdGl2ZSBpbnRlcmFjdGlvbiBzdHJlbmd0aCwgZXZhbHVhdGVkIGJ5IENDTSB3aXRoIHRoZSBjb21tb24gbGlicmFyeSBsZW5ndGgNCi0tIFdoZW4gYWxsIHJlcGxpY2F0ZXMgd2VyZSBjb21iaW5lZCBmb3IgZWFjaCBjYWdlIHNpemUsIHRoZSBtaW5pbXVtIG9mIHRoZSBtYXhpbXVtIGxpYnJhcnkgbGVuZ3RoIG9mIENDTSdzIHJlc3VsdHMgYXJlIDEwNi4gRXhhbXBsZXMgZnJvbSB0aGUgc21hbGwgY2FnZSBvbmx5Lg0KDQojIyMjIFs4LjkuMV0gQ0NNIHdpdGggdGhlIG1pbmltdW0gbGlicmFyeSBsZW5ndGggYW5kIHRoZSBjb21tb24gbWF4aW11bSBsaWJyYXJ5IGxlbmd0aCAobWluIG9mIG1heCkNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTbWFsbF9ZX3htYXBfQV9zdXBwIDwtIGxpc3QoKQ0KU21hbGxfQV94bWFwX1lfc3VwcCA8LSBsaXN0KCkNClNtYWxsX1lfeG1hcF9ZX3N1cHAgPC0gbGlzdCgpDQpTbWFsbF9BX3htYXBfQV9zdXBwIDwtIGxpc3QoKQ0KDQoNCm1pbl9tYXhfbGliX2xlbmd0aCA8LSBtaW4obWF4KFNtYWxsX2xhZ0FfeG1hcF9ZW1sxXV0kbGliX3NpemUpLCBtYXgoU21hbGxfbGFnWV94bWFwX0FbWzFdXSRsaWJfc2l6ZSkpDQoNCiNub3Qgc2hvd2luZyB3YXJuaW5nIA0KDQpTbWFsbF9ZX3htYXBfQV9zdXBwIDwtIGxhcHBseSgwOi00LCBmdW5jdGlvbihpKSBjY20oU21hbGxfWUFfYWxsY29tYmluZWQsIEUgPSBTbWFsbF9vcHRFX1ksIGxpYl9jb2x1bW4gPSAiU21hbGxfWSIsIHRhcmdldF9jb2x1bW4gPSAiU21hbGxfQSIsIGxpYl9zaXplcyA9IHNlcShTbWFsbF9vcHRFX1ksIG1pbl9tYXhfbGliX2xlbmd0aCwgbGVuZ3RoID0gMiksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpDQoNClNtYWxsX0FfeG1hcF9ZX3N1cHAgPC0gbGFwcGx5KDA6LTQsIGZ1bmN0aW9uKGkpIGNjbShTbWFsbF9ZQV9hbGxjb21iaW5lZCwgRSA9IFNtYWxsX29wdEVfQSwgbGliX2NvbHVtbiA9ICJTbWFsbF9BIiwgdGFyZ2V0X2NvbHVtbiA9ICJTbWFsbF9ZIiwgbGliX3NpemVzID0gc2VxKFNtYWxsX29wdEVfQSwgbWluX21heF9saWJfbGVuZ3RoLCBsZW5ndGggPSAyKSwgbnVtX3NhbXBsZXMgPSAxMDAsIHJlcGxhY2UgPSBGLCB0cCA9IGksIFJOR3NlZWQgPSAxMjM0KSkNCg0KDQpTbWFsbF9ZX3htYXBfWV9zdXBwIDwtIGxhcHBseSgwOi00LCBmdW5jdGlvbihpKSBjY20oU21hbGxfWUFfYWxsY29tYmluZWQsIEUgPSBTbWFsbF9vcHRFX1ksIGxpYl9jb2x1bW4gPSAiU21hbGxfWSIsIHRhcmdldF9jb2x1bW4gPSAiU21hbGxfWSIsIGxpYl9zaXplcyA9IHNlcShTbWFsbF9vcHRFX1ksIG1pbl9tYXhfbGliX2xlbmd0aCwgbGVuZ3RoID0gMiksIG51bV9zYW1wbGVzID0gMTAwLCByZXBsYWNlID0gRiwgdHAgPSBpLCBSTkdzZWVkID0gMTIzNCkpDQoNCg0KU21hbGxfQV94bWFwX0Ffc3VwcCA8LSBsYXBwbHkoMDotNCwgZnVuY3Rpb24oaSkgY2NtKFNtYWxsX1lBX2FsbGNvbWJpbmVkLCBFID0gU21hbGxfb3B0RV9BLCBsaWJfY29sdW1uID0gIlNtYWxsX0EiLCB0YXJnZXRfY29sdW1uID0gIlNtYWxsX0EiLCBsaWJfc2l6ZXMgPSBzZXEoU21hbGxfb3B0RV9BLCBtaW5fbWF4X2xpYl9sZW5ndGgsIGxlbmd0aCA9IDIpLCBudW1fc2FtcGxlcyA9IDEwMCwgcmVwbGFjZSA9IEYsIHRwID0gaSwgUk5Hc2VlZCA9IDEyMzQpKQ0KDQoNCiNleGFtcGxlDQpTbWFsbF9BX3htYXBfWV9zdXBwW1syXV0NCg0KYGBgDQojIyMjIFs4LjkuMl0gQ2FsY3VsYXRpbmcgaW50ZXJhY3Rpb24gc3RyZW5ndGgNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpTbWFsbF9ZX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwIDwtIGxpc3QoKQ0KU21hbGxfWV94bWFwX1lfaW50ZXJhY3Rpb25fc3VwcCA8LSBsaXN0KCkNClNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uX3N1cHAgPC0gbGlzdCgpDQpTbWFsbF9BX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwIDwtIGxpc3QoKQ0KU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc3VwcCA8LSBsaXN0KCkNClNtYWxsX2Zyb21BdG9ZX2ludGVyYWN0aW9uX3N1cHAgPC0gbGlzdCgpDQoNCmZvcihqIGluIDE6NSkgew0KICBTbWFsbF9ZX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPC0gc3Vic2V0KFNtYWxsX1lfeG1hcF9BX3N1cHBbW2pdXSRyaG8sICBTbWFsbF9ZX3htYXBfQV9zdXBwW1tqXV0kbGliX3NpemUgPT0gbWF4KFNtYWxsX1lfeG1hcF9BX3N1cHBbW2pdXSRsaWJfc2l6ZSkpIC0gc3Vic2V0KFNtYWxsX1lfeG1hcF9BX3N1cHBbW2pdXSRyaG8sIFNtYWxsX1lfeG1hcF9BX3N1cHBbW2pdXSRsaWJfc2l6ZSA9PSBtaW4oU21hbGxfWV94bWFwX0Ffc3VwcFtbal1dJGxpYl9zaXplKSkNCiAgU21hbGxfQV94bWFwX1lfaW50ZXJhY3Rpb25fc3VwcFtbal1dIDwtIHN1YnNldChTbWFsbF9BX3htYXBfWV9zdXBwW1tqXV0kcmhvLCAgU21hbGxfQV94bWFwX1lfc3VwcFtbal1dJGxpYl9zaXplID09IG1heChTbWFsbF9BX3htYXBfWV9zdXBwW1tqXV0kbGliX3NpemUpKSAtIHN1YnNldChTbWFsbF9BX3htYXBfWV9zdXBwW1tqXV0kcmhvLCBTbWFsbF9BX3htYXBfWV9zdXBwW1tqXV0kbGliX3NpemUgPT0gbWluKFNtYWxsX0FfeG1hcF9ZX3N1cHBbW2pdXSRsaWJfc2l6ZSkpDQogIFNtYWxsX1lfeG1hcF9ZX2ludGVyYWN0aW9uX3N1cHBbW2pdXSA8LSBzdWJzZXQoU21hbGxfWV94bWFwX1lfc3VwcFtbal1dJHJobywgIFNtYWxsX1lfeG1hcF9ZX3N1cHBbW2pdXSRsaWJfc2l6ZSA9PSBtYXgoU21hbGxfWV94bWFwX1lfc3VwcFtbal1dJGxpYl9zaXplKSkgLSBzdWJzZXQoU21hbGxfWV94bWFwX1lfc3VwcFtbal1dJHJobywgU21hbGxfWV94bWFwX1lfc3VwcFtbal1dJGxpYl9zaXplID09IG1pbihTbWFsbF9ZX3htYXBfWV9zdXBwW1tqXV0kbGliX3NpemUpKQ0KICBTbWFsbF9BX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPC0gc3Vic2V0KFNtYWxsX0FfeG1hcF9BX3N1cHBbW2pdXSRyaG8sICBTbWFsbF9BX3htYXBfQV9zdXBwW1tqXV0kbGliX3NpemUgPT0gbWF4KFNtYWxsX0FfeG1hcF9BX3N1cHBbW2pdXSRsaWJfc2l6ZSkpIC0gc3Vic2V0KFNtYWxsX0FfeG1hcF9BX3N1cHBbW2pdXSRyaG8sIFNtYWxsX0FfeG1hcF9BX3N1cHBbW2pdXSRsaWJfc2l6ZSA9PSBtaW4oU21hbGxfQV94bWFwX0Ffc3VwcFtbal1dJGxpYl9zaXplKSkNCiAgDQojY29udmVydCBuZWdhdGl2ZSB2YWx1ZXMgaW50byB6ZXJvDQogIFNtYWxsX1lfeG1hcF9BX2ludGVyYWN0aW9uX3N1cHBbW2pdXVtTbWFsbF9ZX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPCAwXSA8LSAwDQogIFNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uX3N1cHBbW2pdXVtTbWFsbF9BX3htYXBfWV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPCAwXSA8LSAwDQogIFNtYWxsX1lfeG1hcF9ZX2ludGVyYWN0aW9uX3N1cHBbW2pdXVtTbWFsbF9ZX3htYXBfWV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPCAwXSA8LSAwDQogIFNtYWxsX0FfeG1hcF9BX2ludGVyYWN0aW9uX3N1cHBbW2pdXVtTbWFsbF9BX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0gPCAwXSA8LSAwDQogIA0KI1N0YW5kYXJkaXppbmcgaW50cmFzcGVjaWZpYyBlZmZlY3QNCiAgU21hbGxfZnJvbVl0b0FfaW50ZXJhY3Rpb25fc3VwcFtbal1dIDwtIFNtYWxsX0FfeG1hcF9ZX2ludGVyYWN0aW9uX3N1cHBbW2pdXS9TbWFsbF9ZX3htYXBfWV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0NCiAgU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc3VwcFtbal1dIDwtIFNtYWxsX1lfeG1hcF9BX2ludGVyYWN0aW9uX3N1cHBbW2pdXS9TbWFsbF9BX3htYXBfQV9pbnRlcmFjdGlvbl9zdXBwW1tqXV0NCiAgDQp9DQpgYGANCiMjIyMgWzguOS4zXSBWaXN1YWxpemF0aW9uIG9mICBpbnRlcmFjdGlvbiBzdHJlbmd0aCAoRm9yIEZpZy5TMSkNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpzbWFsbF9pbnRlcmFjdGlvbl9zdXBwIDwtIGRhdGEuZnJhbWUodHAgPSBjKHJlcCgwLCAxMDApLCByZXAoLTEsIDEwMCksIHJlcCgtMiwgMTAwKSwgcmVwKC0zLCAxMDApLCByZXAoLTQsIDEwMCkpLCBmcm9tWXRvQSA9IHVubGlzdChTbWFsbF9mcm9tWXRvQV9pbnRlcmFjdGlvbl9zdXBwKSwgZnJvbUF0b1kgPSB1bmxpc3QoU21hbGxfZnJvbUF0b1lfaW50ZXJhY3Rpb25fc3VwcCkpDQoNCmJveHBsb3QoDQogIGZyb21ZdG9BIH4gdHAsIGRhdGEgPSBzbWFsbF9pbnRlcmFjdGlvbl9zdXBwLA0KICBvdXRsaW5lID0gVFJVRSwNCiAgbWFpbiA9ICJmcm9tIENtIChZKSB0byBDYyAoQSkiDQopDQoNCmJveHBsb3QoDQogIGZyb21BdG9ZIH4gdHAsIGRhdGEgPSBzbWFsbF9pbnRlcmFjdGlvbl9zdXBwLA0KICBvdXRsaW5lID0gVFJVRSwNCiAgbWFpbiA9ICJmcm9tIENjIChBKSB0byBDbSAoWSkiDQopDQpgYGANCg0KDQojIyBbOV0gQWRkaXRpb25hbCBhbmFseXNpcyBmb3IgcmV2aXNpb24NCiMjIyBbOS4xXSBSZWxhdGlvbnNoaXAgYmV0d2VlbiBjYWdlIHNpemUgYW5kIG5vbmxpbmVhciBwcm9wZXJ0aWVzIChGb3IgRmlnLlM1KQ0KYGBge3Igd2FybmluZz1GQUxTRX0NCnZvbHVtZV9jb21iaW5lZCA8LSBjKHJlcChTbWFsbHZvbHVtZSwgNiksIHJlcChNZWRpdW12b2x1bWUsIDcpLCByZXAoTGFyZ2V2b2x1bWUsIDgpLCByZXAoSHVnZXZvbHVtZSwgOCkpDQpmb3JGaWdTNV9kYXRhIDwtIGRhdGEuZnJhbWUodm9sdW1lID0gdm9sdW1lX2NvbWJpbmVkLCBUYWJsZTEpDQoNCiNHTE0gd2l0aCBQb2lzc29uIGZvciBGaWdTNWENCnN1bW1hcnkoZ2xtKEVfZm9yX0MubSB+IHZvbHVtZSwgZGF0YSA9IGZvckZpZ1M1X2RhdGEsIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSkpDQojR0xNIHdpdGggUG9pc3NvbiBmb3IgRmlnUzViDQpzdW1tYXJ5KGdsbShFX2Zvcl9DLmMgfiB2b2x1bWUsIGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIikpKQ0KI0dMTSB3aXRoIFBvaXNzb24gZm9yIEZpZ1M1Yw0Kc3VtbWFyeShnbG0oZGVsdGEucmhvX2Zvcl9DLm0gfiB2b2x1bWUsIGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBmYW1pbHkgPSBnYXVzc2lhbikpDQojR0xNIHdpdGggUG9pc3NvbiBmb3IgRmlnUzVkDQpzdW1tYXJ5KGdsbShkZWx0YS5yaG9fZm9yX0MuYyB+IHZvbHVtZSwgZGF0YSA9IGZvckZpZ1M1X2RhdGEsIGZhbWlseSA9IGdhdXNzaWFuKSkNCiNHTE0gd2l0aCBQb2lzc29uIGZvciBGaWdTNWUNCnN1bW1hcnkoZ2xtKHRoZXRhX2Zvcl9DLm0gfiB2b2x1bWUsIGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBmYW1pbHkgPSBnYXVzc2lhbikpDQojR0xNIHdpdGggUG9pc3NvbiBmb3IgRmlnUzVmDQpzdW1tYXJ5KGdsbSh0aGV0YV9mb3JfQy5jIH4gdm9sdW1lLCBkYXRhID0gZm9yRmlnUzVfZGF0YSwgZmFtaWx5ID0gZ2F1c3NpYW4pKQ0KDQoNCiNTaW1wbGUgcGxvdCB3aXRoIEdMTSBsaW5lIGZvciBGaWdTNWENCkZpZ1M1YSA8LSBnZ3Bsb3QoZGF0YSA9IGZvckZpZ1M1X2RhdGEsIGFlcyh4ID0gdm9sdW1lLCB5PSBFX2Zvcl9DLm0pKQ0KRmlnUzVhIDwtIEZpZ1M1YSArIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHNoYXBlID0gMjEpDQpGaWdTNWEgPC0gRmlnUzVhICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAncG9pc3NvbicpLCBzZSA9IFQsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAiZGFzaGVkIikNCkZpZ1M1YSA8LSBGaWdTNWEgKyBsYWJzKHkgPSAiRSoiLCB4ID0gIlZvbHVtZSAoY20zKSIpICsgZ2d0aXRsZSgiRmlnLiBTNWEgQy5tIikNCg0KI1NpbXBsZSBwbG90IHdpdGggR0xNIGxpbmUgZm9yIEZpZ1M1Yg0KRmlnUzViIDwtIGdncGxvdChkYXRhID0gZm9yRmlnUzVfZGF0YSwgYWVzKHggPSB2b2x1bWUsIHk9IEVfZm9yX0MuYykpDQpGaWdTNWIgPC0gRmlnUzViICsgZ2VvbV9wb2ludChzaXplID0gMywgc2hhcGUgPSAyMSkNCkZpZ1M1YiA8LSBGaWdTNWIgKyBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2xtJywgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICdwb2lzc29uJyksIHNlID0gVCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KRmlnUzViIDwtIEZpZ1M1YiArIGxhYnMoeSA9ICJFKiIsIHggPSAiVm9sdW1lIChjbTMpIikgKyBnZ3RpdGxlKCJGaWcuIFM1YiBDLmMiKQ0KDQojU2ltcGxlIHBsb3Qgd2l0aCBHTE0gbGluZSBmb3IgRmlnUzVjDQpGaWdTNWMgPC0gZ2dwbG90KGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBhZXMoeCA9IHZvbHVtZSwgeT0gZGVsdGEucmhvX2Zvcl9DLm0pKQ0KRmlnUzVjIDwtIEZpZ1M1YyArIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHNoYXBlID0gMjEpDQpGaWdTNWMgPC0gRmlnUzVjICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBULCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gImRhc2hlZCIpDQpGaWdTNWMgPC0gRmlnUzVjICsgbGFicyh5ID0gImRlbHRhLXJobyIsIHggPSAiVm9sdW1lIChjbTMpIikgKyBnZ3RpdGxlKCJGaWcuIFM1YyBDLm0iKQ0KDQojU2ltcGxlIHBsb3Qgd2l0aCBHTE0gbGluZSBmb3IgRmlnUzVkDQpGaWdTNWQgPC0gZ2dwbG90KGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBhZXMoeCA9IHZvbHVtZSwgeT0gZGVsdGEucmhvX2Zvcl9DLmMpKQ0KRmlnUzVkIDwtIEZpZ1M1ZCArIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHNoYXBlID0gMjEpDQpGaWdTNWQgPC0gRmlnUzVkICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBULCBjb2xvciA9ICdibGFjaycsIGxpbmV0eXBlID0gImRhc2hlZCIpDQpGaWdTNWQgPC0gRmlnUzVkICsgbGFicyh5ID0gImRlbHRhLXJobyIsIHggPSAiVm9sdW1lIChjbTMpIikgKyBnZ3RpdGxlKCJGaWcuIFM1ZCBDLmMiKQ0KDQojU2ltcGxlIHBsb3Qgd2l0aCBHTE0gbGluZSBmb3IgRmlnUzVlDQpGaWdTNWUgPC0gZ2dwbG90KGRhdGEgPSBmb3JGaWdTNV9kYXRhLCBhZXMoeCA9IHZvbHVtZSwgeT0gdGhldGFfZm9yX0MubSkpDQpGaWdTNWUgPC0gRmlnUzVlICsgZ2VvbV9wb2ludChzaXplID0gMywgc2hhcGUgPSAyMSkNCkZpZ1M1ZSA8LSBGaWdTNWUgKyBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IFQsIGNvbG9yID0gJ2JsYWNrJywgbGluZXR5cGUgPSAiZGFzaGVkIikNCkZpZ1M1ZSA8LSBGaWdTNWUgKyBsYWJzKHkgPSAidGhldGEqIiwgeCA9ICJWb2x1bWUgKGNtMykiKSArIGdndGl0bGUoIkZpZy4gUzVlIEMubSIpDQoNCiNTaW1wbGUgcGxvdCB3aXRoIEdMTSBsaW5lIGZvciBGaWdTNWYNCkZpZ1M1ZiA8LSBnZ3Bsb3QoZGF0YSA9IGZvckZpZ1M1X2RhdGEsIGFlcyh4ID0gdm9sdW1lLCB5PSB0aGV0YV9mb3JfQy5tKSkNCkZpZ1M1ZiA8LSBGaWdTNWYgKyBnZW9tX3BvaW50KHNpemUgPSAzLCBzaGFwZSA9IDIxKQ0KRmlnUzVmIDwtIEZpZ1M1ZiArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gVCwgY29sb3IgPSAnYmxhY2snLCBsaW5ldHlwZSA9ICJkYXNoZWQiKQ0KRmlnUzVmIDwtIEZpZ1M1ZiArIGxhYnMoeSA9ICJ0aGV0YSoiLCB4ID0gIlZvbHVtZSAoY20zKSIpICsgZ2d0aXRsZSgiRmlnLiBTNWYgQy5jIikNCg0KcHJpbnQoRmlnUzVhKQ0KcHJpbnQoRmlnUzViKQ0KcHJpbnQoRmlnUzVjKQ0KcHJpbnQoRmlnUzVkKQ0KcHJpbnQoRmlnUzVlKQ0KcHJpbnQoRmlnUzVmKQ0KYGBgDQojIyMgWzkuMl0gVGltZSBzZXJpZXMgcGxvdCBmb3IgaHVnZSBjYWdlcyAoRm9yIEZpZy5TNikNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojRGF0YSBzdW1tYXJ5DQpIdWdlX3JlcCA8LSBsaXN0KCkNCmZvcihpIGluIDE6bGVuZ3RoKEh1Z2UpKXsNCiAgSHVnZV9yZXBbW2ldXSA8LSBkYXRhLmZyYW1lKCJUaW1lX3N0ZXAiID0gYygxOmxlbmd0aChIdWdlW1tpXV0kWW90c3Vtb25Ub3RhbEwpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb25fc2l6ZV9DLm0iID0gSHVnZVtbaV1dJFlvdHN1bW9uVG90YWxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbl9zaXplX0MuYyIgPSBIdWdlW1tpXV0kQXp1a2lUb3RhbEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KfQ0KI0dyYXBoaWNzIA0KRmlnUzZwYW5lbGxhYnMgPC0gYygiKGEpIiwgIihiKSIsICIoYykiLCAiKGQpIiwgIihlKSIsICIoZikiLCAiKGcpIiwgIihoKSIsICIoaSkiLCAiKGopIiwgIihrKSIsICIobCkiLCAiKG0pIiwgIihuKSIsICIobykiLCAiKHApIikNCkZpZ1M2IDwtIGxpc3QoKQ0KZm9yKGkgaW4gMTpsZW5ndGgoSHVnZV9yZXApKXsNCiAgRmlnUzZbW2ldXSA8LSBnZ3Bsb3QoZGF0YSA9IEh1Z2VfcmVwW1tpXV0sIGFlcyh4ID0gVGltZV9zdGVwLCB5ID0gUG9wdWxhdGlvbl9zaXplX0MubSkpICsNCiAgZ2VvbV9saW5lKGx0eSA9IDEpICsgDQogIGdlb21fbGluZShkYXRhID0gSHVnZV9yZXBbW2ldXSwgYWVzKHggPSBUaW1lX3N0ZXAsIHkgPSBQb3B1bGF0aW9uX3NpemVfQy5jKSwgbHR5ID0gMikgKw0KICB5bGFiKCJQb3B1bGF0aW9uIHNpemUiKSArDQogIGdndGl0bGUoRmlnUzZwYW5lbGxhYnNbaV0pDQogIHByaW50KEZpZ1M2W1tpXV0pDQp9DQpgYGANCiMjIyBbOS4zXSBSZWxhdGlvbnNoaXBzIGJldHdlZW4gQ1YgYW5kIGNvZXhpc3RlbmNlIHdlZWsgKEZvciBGaWcuUzcpDQojIyMjIFs5LjMuMV0gQ2FsY3VsYXRpbmcgQ1ZzDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KU21hbGxfY3ZfWSA8LSBjKCkNClNtYWxsX2N2X0EgPC0gYygpDQpNZWRpdW1fY3ZfWSA8LSBjKCkNCk1lZGl1bV9jdl9BIDwtIGMoKQ0KTGFyZ2VfY3ZfWSA8LSBjKCkNCkxhcmdlX2N2X0EgPC0gYygpDQpIdWdlX2N2X1kgPC0gYygpDQpIdWdlX2N2X0EgPC0gYygpDQoNCmZvcihpIGluIDE6bGVuZ3RoKFNtYWxsKSl7DQogIFNtYWxsX2N2X1lbaV0gPC0gc2QoU21hbGxbW2ldXSRZb3RzdW1vblRvdGFsTCwgbmEucm0gPSBUKS9tZWFuKFNtYWxsW1tpXV0kWW90c3Vtb25Ub3RhbEwsIG5hLnJtID0gVCkgIA0KICBTbWFsbF9jdl9BW2ldIDwtIHNkKFNtYWxsW1tpXV0kQXp1a2lUb3RhbEwsIG5hLnJtID0gVCkvbWVhbihTbWFsbFtbaV1dJEF6dWtpVG90YWxMLCBuYS5ybSA9IFQpICANCn0NCg0KZm9yKGkgaW4gMTpsZW5ndGgoTWVkaXVtKSl7DQogIE1lZGl1bV9jdl9ZW2ldIDwtIHNkKE1lZGl1bVtbaV1dJFlvdHN1bW9uVG90YWxMLCBuYS5ybSA9IFQpL21lYW4oTWVkaXVtW1tpXV0kWW90c3Vtb25Ub3RhbEwsIG5hLnJtID0gVCkgIA0KICBNZWRpdW1fY3ZfQVtpXSA8LSBzZChNZWRpdW1bW2ldXSRBenVraVRvdGFsTCwgbmEucm0gPSBUKS9tZWFuKE1lZGl1bVtbaV1dJEF6dWtpVG90YWxMLCBuYS5ybSA9IFQpICANCn0NCg0KZm9yKGkgaW4gMTpsZW5ndGgoTGFyZ2UpKXsNCiAgTGFyZ2VfY3ZfWVtpXSA8LSBzZChMYXJnZVtbaV1dJFlvdHN1bW9uVG90YWxMLCBuYS5ybSA9IFQpL21lYW4oTGFyZ2VbW2ldXSRZb3RzdW1vblRvdGFsTCwgbmEucm0gPSBUKSAgDQogIExhcmdlX2N2X0FbaV0gPC0gc2QoTGFyZ2VbW2ldXSRBenVraVRvdGFsTCwgbmEucm0gPSBUKS9tZWFuKExhcmdlW1tpXV0kQXp1a2lUb3RhbEwsIG5hLnJtID0gVCkgIA0KfQ0KDQpmb3IoaSBpbiAxOmxlbmd0aChIdWdlKSl7DQogIEh1Z2VfY3ZfWVtpXSA8LSBzZChIdWdlW1tpXV0kWW90c3Vtb25Ub3RhbEwsIG5hLnJtID0gVCkvbWVhbihIdWdlW1tpXV0kWW90c3Vtb25Ub3RhbEwsIG5hLnJtID0gVCkgIA0KICBIdWdlX2N2X0FbaV0gPC0gc2QoSHVnZVtbaV1dJEF6dWtpVG90YWxMLCBuYS5ybSA9IFQpL21lYW4oSHVnZVtbaV1dJEF6dWtpVG90YWxMLCBuYS5ybSA9IFQpICANCn0NCmBgYA0KIyMjIyBbOS4zLjJdIEdMTSBhbmQgcHJlcGFyaW5nIHJlZ3Jlc3Npb24gbGluZXMNCi0tRm9yIEMubSAoWSksIHNsb3BlIHdhcyBzaWduaWZpY2FudCB3aGVuIFNtYWxsLCBMYXJnZSwgYW5kIEh1Z2UNCg0KLS1Gb3IgQy5jIChBKSwgc2xvcGUgd2FzIHNpZ25pZmljYW50IHdoZW4gU21hbGwgYW5kIExhcmdlDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI0dMTSBmb3IgZWFjaCBjYWdlIHNpemUNCiNmb3IgQy5tIChZKQ0Kc3VtbWFyeShnbG0oc3Vic2V0KFRhYmxlUzEkQ29leGlzdGVuY2VfcGVyaW9kcywgVGFibGVTMSRDYWdlLlNpemUgPT0gIlNtYWxsIikgfiBTbWFsbF9jdl9ZLCBmYW1pbHkgPSAicG9pc3NvbiIpKSRjb2VmZmljaWVudHMNCnN1bW1hcnkoZ2xtKHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJNZWRpdW0iKSB+IE1lZGl1bV9jdl9ZLCBmYW1pbHkgPSAicG9pc3NvbiIpKSRjb2VmZmljaWVudHMNCnN1bW1hcnkoZ2xtKHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJMYXJnZSIpIH4gTGFyZ2VfY3ZfWSwgZmFtaWx5ID0gInBvaXNzb24iKSkkY29lZmZpY2llbnRzDQpzdW1tYXJ5KGdsbShzdWJzZXQoVGFibGVTMSRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBUYWJsZVMxJENhZ2UuU2l6ZSA9PSAiSHVnZSIpIH4gSHVnZV9jdl9ZLCBmYW1pbHkgPSAicG9pc3NvbiIpKSRjb2VmZmljaWVudHMNCg0KI2ZvciBDLmMgKEEpDQpzdW1tYXJ5KGdsbShzdWJzZXQoVGFibGVTMSRDb2V4aXN0ZW5jZV9wZXJpb2RzLCBUYWJsZVMxJENhZ2UuU2l6ZSA9PSAiU21hbGwiKSB+IFNtYWxsX2N2X0EsIGZhbWlseSA9ICJwb2lzc29uIikpJGNvZWZmaWNpZW50cw0Kc3VtbWFyeShnbG0oc3Vic2V0KFRhYmxlUzEkQ29leGlzdGVuY2VfcGVyaW9kcywgVGFibGVTMSRDYWdlLlNpemUgPT0gIk1lZGl1bSIpIH4gTWVkaXVtX2N2X0EsIGZhbWlseSA9ICJwb2lzc29uIikpJGNvZWZmaWNpZW50cw0Kc3VtbWFyeShnbG0oc3Vic2V0KFRhYmxlUzEkQ29leGlzdGVuY2VfcGVyaW9kcywgVGFibGVTMSRDYWdlLlNpemUgPT0gIkxhcmdlIikgfiBMYXJnZV9jdl9BLCBmYW1pbHkgPSAicG9pc3NvbiIpKSRjb2VmZmljaWVudHMNCnN1bW1hcnkoZ2xtKHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJIdWdlIikgfiBIdWdlX2N2X0EsIGZhbWlseSA9ICJwb2lzc29uIikpJGNvZWZmaWNpZW50cw0KDQojR0xNIGZvciBhbGwgY2FnZSBzaXplcyBhbmQgcHJlZGljdGlvbiBmb3IgZWFjaCBjYWdlDQpjdl9ZX2FsbCA8LSBjKFNtYWxsX2N2X1ksIE1lZGl1bV9jdl9ZLCBMYXJnZV9jdl9ZLCBIdWdlX2N2X1kpDQpjdl9BX2FsbCA8LSBjKFNtYWxsX2N2X0EsIE1lZGl1bV9jdl9BLCBMYXJnZV9jdl9BLCBIdWdlX2N2X0EpDQpjdl9kYXRhX2FsbCA8LSBkYXRhLmZyYW1lKENvZXhpc3RlbmNlX3BlcmlvZHMgPSBUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIHZvbHVtZSA9IFRhYmxlUzEkQ2FnZS5TaXplLCBjdl9ZID0gY3ZfWV9hbGwsIGN2X0EgPSBjdl9BX2FsbCkNCg0KY3ZfY29leGlzdGVuY2VfbW9kZWxfWSA8LSBnbG0oQ29leGlzdGVuY2VfcGVyaW9kcyB+IHZvbHVtZSpjdl9ZLCBkYXRhID0gY3ZfZGF0YV9hbGwsIGZhbWlseSA9ICJwb2lzc29uIikNCmN2X2NvZXhpc3RlbmNlX21vZGVsX1lfcHJlZGljdGVkIDwtIGdncHJlZGljdChjdl9jb2V4aXN0ZW5jZV9tb2RlbF9ZLCB0ZXJtID0gYygiY3ZfWSIsInZvbHVtZSIpKQ0KDQpjdl9jb2V4aXN0ZW5jZV9tb2RlbF9BIDwtIGdsbShDb2V4aXN0ZW5jZV9wZXJpb2RzIH4gdm9sdW1lKmN2X0EsIGRhdGEgPSBjdl9kYXRhX2FsbCwgZmFtaWx5ID0gInBvaXNzb24iKQ0KY3ZfY29leGlzdGVuY2VfbW9kZWxfQV9wcmVkaWN0ZWQgPC0gZ2dwcmVkaWN0KGN2X2NvZXhpc3RlbmNlX21vZGVsX0EsIHRlcm0gPSBjKCJjdl9BIiwidm9sdW1lIikpDQoNCmBgYA0KIyMjIyBbOS4zLjRdIFZpc3VhbGl6YXRpb24NCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojZGVmaW5lIGxpbmV0eXBlcyAmIGxpbmV3aWR0aA0KbGluZXR5cGVzX1kgPC0gYygic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIiwgInNvbGlkIikNCmxpbmV3aWR0aHNfWSA8LSBjKDAuNSwgMC41LCAwLjc1LCAxKQ0KbGluZXR5cGVzX0EgPC0gYygic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIiwgImRvdHRlZCIpDQpsaW5ld2lkdGhzX0EgPC0gYygwLjUsIDAuNSwgMSwgMC41KQ0KDQojZ2dwbG90ICANCmN2X2NvZXhpc3RfWV9maWcgPC0gZ2dwbG90KCkgKyBnZW9tX3BvaW50KGRhdGEgPSBjdl9kYXRhX2FsbCwgYWVzKHggPSBjdl9ZLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcywgc2hhcGUgPSBhcy5mYWN0b3Iodm9sdW1lKSksIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgDQpjdl9jb2V4aXN0X1lfZmlnIDwtIGN2X2NvZXhpc3RfWV9maWcgKyBnZW9tX2xpbmUoZGF0YSA9IGN2X2NvZXhpc3RlbmNlX21vZGVsX1lfcHJlZGljdGVkLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQsIGxpbmV0eXBlID0gZ3JvdXAsIGxpbmV3aWR0aCA9IGdyb3VwKSkgKyBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbGluZXR5cGVzX1kpIA0KY3ZfY29leGlzdF9ZX2ZpZyA8LSBjdl9jb2V4aXN0X1lfZmlnICsgc2NhbGVfbGluZXdpZHRoX21hbnVhbCh2YWx1ZXMgPSBsaW5ld2lkdGhzX1kpDQpjdl9jb2V4aXN0X1lfZmlnIDwtIGN2X2NvZXhpc3RfWV9maWcgKyBnZ3RpdGxlKCJDViB2cyBjb2V4aXN0ZW5jZSBmb3IgQy5tIChZKSIpDQpwbG90KGN2X2NvZXhpc3RfWV9maWcpDQoNCmN2X2NvZXhpc3RfQV9maWcgPC0gZ2dwbG90KCkgKyBnZW9tX3BvaW50KGRhdGEgPSBjdl9kYXRhX2FsbCwgYWVzKHggPSBjdl9BLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcywgc2hhcGUgPSBhcy5mYWN0b3Iodm9sdW1lKSksIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgDQpjdl9jb2V4aXN0X0FfZmlnIDwtIGN2X2NvZXhpc3RfQV9maWcgKyBnZW9tX2xpbmUoZGF0YSA9IGN2X2NvZXhpc3RlbmNlX21vZGVsX0FfcHJlZGljdGVkLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQsIGxpbmV0eXBlID0gZ3JvdXAsIGxpbmV3aWR0aCA9IGdyb3VwKSkgKyBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbGluZXR5cGVzX0EpIA0KY3ZfY29leGlzdF9BX2ZpZyA8LSBjdl9jb2V4aXN0X0FfZmlnICsgc2NhbGVfbGluZXdpZHRoX21hbnVhbCh2YWx1ZXMgPSBsaW5ld2lkdGhzX0EpDQpjdl9jb2V4aXN0X0FfZmlnIDwtIGN2X2NvZXhpc3RfQV9maWcgKyBnZ3RpdGxlKCJDViB2cyBjb2V4aXN0ZW5jZSBmb3IgQy5jIChBKSIpDQpwbG90KGN2X2NvZXhpc3RfQV9maWcpDQogIA0KYGBgDQojIyMgWzkuNF0gUmVsYXRpb25zaGlwIGJldHdlZW4gZWFybHkgd2VlayBwb3B1bGF0aW9uIHNpemUgdnMgY29leGlzdGVuY2UgcGVyaW9kIChmb3IgRmlnLlM4KQ0KIyMjIyBbOS40LjFdIFNlbGVjdGluZyB0aGUgcG9wdWxhdGlvbiBzaXplIGF0IDV0aCB3ZWVrICg0IHdlZWtzIGxhdGVyKQ0KYGBge3Igd2FybmluZz1GQUxTRX0NClNtYWxsXzV0aF9ZIDwtIGMoKQ0KU21hbGxfNXRoX0EgPC0gYygpDQpNZWRpdW1fNXRoX1kgPC0gYygpDQpNZWRpdW1fNXRoX0EgPC0gYygpDQpMYXJnZV81dGhfWSA8LSBjKCkNCkxhcmdlXzV0aF9BIDwtIGMoKQ0KSHVnZV81dGhfWSA8LSBjKCkNCkh1Z2VfNXRoX0EgPC0gYygpDQoNCmZvcihpIGluIDE6MTYpIHsNCiAgU21hbGxfNXRoX1lbaV0gPC0gU21hbGxbW2ldXSRZb3RzdW1vblRvdGFsTFs1XQ0KICBTbWFsbF81dGhfQVtpXSA8LSBTbWFsbFtbaV1dJEF6dWtpVG90YWxMWzVdDQogIE1lZGl1bV81dGhfWVtpXSA8LSBNZWRpdW1bW2ldXSRZb3RzdW1vblRvdGFsTFs1XQ0KICBNZWRpdW1fNXRoX0FbaV0gPC0gTWVkaXVtW1tpXV0kQXp1a2lUb3RhbExbNV0NCiAgTGFyZ2VfNXRoX1lbaV0gPC0gTGFyZ2VbW2ldXSRZb3RzdW1vblRvdGFsTFs1XQ0KICBMYXJnZV81dGhfQVtpXSA8LSBMYXJnZVtbaV1dJEF6dWtpVG90YWxMWzVdDQogIEh1Z2VfNXRoX1lbaV0gPC0gSHVnZVtbaV1dJFlvdHN1bW9uVG90YWxMWzVdDQogIEh1Z2VfNXRoX0FbaV0gPC0gSHVnZVtbaV1dJEF6dWtpVG90YWxMWzVdDQp9DQoNClNtYWxsXzV0aF9jb2V4aXN0IDwtIGRhdGEuZnJhbWUoQ29leGlzdGVuY2VfcGVyaW9kcyA9IHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJTbWFsbCIpLCBZXzV0aCA9IFNtYWxsXzV0aF9ZLCBBXzV0aCA9IFNtYWxsXzV0aF9BKQ0KTWVkaXVtXzV0aF9jb2V4aXN0IDwtIGRhdGEuZnJhbWUoQ29leGlzdGVuY2VfcGVyaW9kcyA9IHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJNZWRpdW0iKSwgWV81dGggPSBNZWRpdW1fNXRoX1ksIEFfNXRoID0gTWVkaXVtXzV0aF9BKQ0KTGFyZ2VfNXRoX2NvZXhpc3QgPC0gZGF0YS5mcmFtZShDb2V4aXN0ZW5jZV9wZXJpb2RzID0gc3Vic2V0KFRhYmxlUzEkQ29leGlzdGVuY2VfcGVyaW9kcywgVGFibGVTMSRDYWdlLlNpemUgPT0gIkxhcmdlIiksIFlfNXRoID0gTGFyZ2VfNXRoX1ksIEFfNXRoID0gTGFyZ2VfNXRoX0EpDQpIdWdlXzV0aF9jb2V4aXN0IDwtIGRhdGEuZnJhbWUoQ29leGlzdGVuY2VfcGVyaW9kcyA9IHN1YnNldChUYWJsZVMxJENvZXhpc3RlbmNlX3BlcmlvZHMsIFRhYmxlUzEkQ2FnZS5TaXplID09ICJIdWdlIiksIFlfNXRoID0gSHVnZV81dGhfWSwgQV81dGggPSBIdWdlXzV0aF9BKQ0KYGBgDQojIyMjIFs5LjQuMl0gR0xNIGZvciBlYXJseSB3ZWVrIHBvcHVsYXRpb24gc2l6ZSB2cyBjb2V4aXN0ZW5jZSBwZXJpb2QNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpzdW1tYXJ5KGdsbShDb2V4aXN0ZW5jZV9wZXJpb2RzIH4gWV81dGgsIGRhdGEgPSBTbWFsbF81dGhfY29leGlzdCwgZmFtaWx5ID0gInBvaXNzb24iKSkNCnN1bW1hcnkoZ2xtKENvZXhpc3RlbmNlX3BlcmlvZHMgfiBBXzV0aCwgZGF0YSA9IFNtYWxsXzV0aF9jb2V4aXN0LCBmYW1pbHkgPSAicG9pc3NvbiIpKQ0Kc3VtbWFyeShnbG0oQ29leGlzdGVuY2VfcGVyaW9kcyB+IFlfNXRoLCBkYXRhID0gTWVkaXVtXzV0aF9jb2V4aXN0LCBmYW1pbHkgPSAicG9pc3NvbiIpKQ0Kc3VtbWFyeShnbG0oQ29leGlzdGVuY2VfcGVyaW9kcyB+IEFfNXRoLCBkYXRhID0gTWVkaXVtXzV0aF9jb2V4aXN0LCBmYW1pbHkgPSAicG9pc3NvbiIpKQ0Kc3VtbWFyeShnbG0oQ29leGlzdGVuY2VfcGVyaW9kcyB+IFlfNXRoLCBkYXRhID0gTGFyZ2VfNXRoX2NvZXhpc3QsIGZhbWlseSA9ICJwb2lzc29uIikpDQpzdW1tYXJ5KGdsbShDb2V4aXN0ZW5jZV9wZXJpb2RzIH4gQV81dGgsIGRhdGEgPSBMYXJnZV81dGhfY29leGlzdCwgZmFtaWx5ID0gInBvaXNzb24iKSkNCnN1bW1hcnkoZ2xtKENvZXhpc3RlbmNlX3BlcmlvZHMgfiBZXzV0aCwgZGF0YSA9IEh1Z2VfNXRoX2NvZXhpc3QsIGZhbWlseSA9ICJwb2lzc29uIikpDQpzdW1tYXJ5KGdsbShDb2V4aXN0ZW5jZV9wZXJpb2RzIH4gQV81dGgsIGRhdGEgPSBIdWdlXzV0aF9jb2V4aXN0LCBmYW1pbHkgPSAicG9pc3NvbiIpKQ0KDQpgYGANCiMjIyMgWzkuNC4zXSBWaXN1YWxpemF0aW9uDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KI1NtYWxsDQpjb2V4aXN0XzV0aF9TbWFsbF9maWcgPC0gZ2dwbG90KCkgKyBnZW9tX3BvaW50KGRhdGEgPSBTbWFsbF81dGhfY29leGlzdCwgYWVzKHggPSBZXzV0aCwgeSA9IENvZXhpc3RlbmNlX3BlcmlvZHMpLCBzaGFwZSA9IDEsIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3BvaW50KGRhdGEgPSBTbWFsbF81dGhfY29leGlzdCwgYWVzKHggPSBBXzV0aCwgeSA9IENvZXhpc3RlbmNlX3BlcmlvZHMpLCBzaGFwZSA9IDIsIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3Ntb290aChkYXRhID0gU21hbGxfNXRoX2NvZXhpc3QsIGFlcyh4ID0gWV81dGgsIHkgPSBDb2V4aXN0ZW5jZV9wZXJpb2RzKSwgbWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAncG9pc3NvbicpLCBjb2xvciA9ICJibGFjayIsIHNlID0gVCkgKyBnZW9tX3Ntb290aChkYXRhID0gU21hbGxfNXRoX2NvZXhpc3QsIGFlcyh4ID0gQV81dGgsIHkgPSBDb2V4aXN0ZW5jZV9wZXJpb2RzKSwgbWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAncG9pc3NvbicpLCBjb2xvciA9ICJibGFjayIsIHNlID0gVCkNCmNvZXhpc3RfNXRoX1NtYWxsX2ZpZyA8LSBjb2V4aXN0XzV0aF9TbWFsbF9maWcgKyB4bGFiKCJwb3B1bGF0aW9uIHNpemUiKSArIGdndGl0bGUoIkVhcmx5IHBvcGxhdGlvbiBzaXplIHZzIGNvZXhpc3RlbmNlIChTbWFsbCkiKQ0KDQojTWVkaXVtDQpjb2V4aXN0XzV0aF9NZWRpdW1fZmlnIDwtIGdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhID0gTWVkaXVtXzV0aF9jb2V4aXN0LCBhZXMoeCA9IFlfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIHNoYXBlID0gMSwgc2l6ZSA9IDMsIGFscGhhID0gMC41KSArIGdlb21fcG9pbnQoZGF0YSA9IE1lZGl1bV81dGhfY29leGlzdCwgYWVzKHggPSBBXzV0aCwgeSA9IENvZXhpc3RlbmNlX3BlcmlvZHMpLCBzaGFwZSA9IDIsIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3Ntb290aChkYXRhID0gTWVkaXVtXzV0aF9jb2V4aXN0LCBhZXMoeCA9IFlfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIG1ldGhvZCA9ICdnbG0nLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gJ3BvaXNzb24nKSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzZSA9IFQpICsgZ2VvbV9zbW9vdGgoZGF0YSA9IE1lZGl1bV81dGhfY29leGlzdCwgYWVzKHggPSBBXzV0aCwgeSA9IENvZXhpc3RlbmNlX3BlcmlvZHMpLCBtZXRob2QgPSAnZ2xtJywgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICdwb2lzc29uJyksIGNvbG9yID0gImJsYWNrIiwgc2UgPSBUKQ0KY29leGlzdF81dGhfTWVkaXVtX2ZpZyA8LSBjb2V4aXN0XzV0aF9NZWRpdW1fZmlnICsgeGxhYigicG9wdWxhdGlvbiBzaXplIikgKyBnZ3RpdGxlKCJFYXJseSBwb3BsYXRpb24gc2l6ZSB2cyBjb2V4aXN0ZW5jZSAoTWVkaXVtKSIpDQoNCiNMYXJnZQ0KY29leGlzdF81dGhfTGFyZ2VfZmlnIDwtIGdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhID0gTGFyZ2VfNXRoX2NvZXhpc3QsIGFlcyh4ID0gWV81dGgsIHkgPSBDb2V4aXN0ZW5jZV9wZXJpb2RzKSwgc2hhcGUgPSAxLCBzaXplID0gMywgYWxwaGEgPSAwLjUpICsgZ2VvbV9wb2ludChkYXRhID0gTGFyZ2VfNXRoX2NvZXhpc3QsIGFlcyh4ID0gQV81dGgsIHkgPSBDb2V4aXN0ZW5jZV9wZXJpb2RzKSwgc2hhcGUgPSAyLCBzaXplID0gMywgYWxwaGEgPSAwLjUpICsgZ2VvbV9zbW9vdGgoZGF0YSA9IExhcmdlXzV0aF9jb2V4aXN0LCBhZXMoeCA9IFlfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIG1ldGhvZCA9ICdnbG0nLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gJ3BvaXNzb24nKSwgY29sb3IgPSAiYmxhY2siLCBzZSA9IFQpICsgZ2VvbV9zbW9vdGgoZGF0YSA9IExhcmdlXzV0aF9jb2V4aXN0LCBhZXMoeCA9IEFfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIG1ldGhvZCA9ICdnbG0nLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gJ3BvaXNzb24nKSwgY29sb3IgPSAiYmxhY2siLCBzZSA9IFQpDQpjb2V4aXN0XzV0aF9MYXJnZV9maWcgPC0gY29leGlzdF81dGhfTGFyZ2VfZmlnICsgeGxhYigicG9wdWxhdGlvbiBzaXplIikgKyBnZ3RpdGxlKCJFYXJseSBwb3BsYXRpb24gc2l6ZSB2cyBjb2V4aXN0ZW5jZSAoTGFyZ2UpIikNCg0KI0h1Z2UNCmNvZXhpc3RfNXRoX0h1Z2VfZmlnIDwtIGdncGxvdCgpICsgZ2VvbV9wb2ludChkYXRhID0gSHVnZV81dGhfY29leGlzdCwgYWVzKHggPSBZXzV0aCwgeSA9IENvZXhpc3RlbmNlX3BlcmlvZHMpLCBzaGFwZSA9IDEsIHNpemUgPSAzLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3BvaW50KGRhdGEgPSBIdWdlXzV0aF9jb2V4aXN0LCBhZXMoeCA9IEFfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIHNoYXBlID0gMiwgc2l6ZSA9IDMsIGFscGhhID0gMC41KSArIGdlb21fc21vb3RoKGRhdGEgPSBIdWdlXzV0aF9jb2V4aXN0LCBhZXMoeCA9IFlfNXRoLCB5ID0gQ29leGlzdGVuY2VfcGVyaW9kcyksIG1ldGhvZCA9ICdnbG0nLCBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gJ3BvaXNzb24nKSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzZSA9IFQpICsgZ2VvbV9zbW9vdGgoZGF0YSA9IEh1Z2VfNXRoX2NvZXhpc3QsIGFlcyh4ID0gQV81dGgsIHkgPSBDb2V4aXN0ZW5jZV9wZXJpb2RzKSwgbWV0aG9kID0gJ2dsbScsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAncG9pc3NvbicpLCBjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNlID0gVCkNCmNvZXhpc3RfNXRoX0h1Z2VfZmlnIDwtIGNvZXhpc3RfNXRoX0h1Z2VfZmlnICsgeGxhYigicG9wdWxhdGlvbiBzaXplIikgKyBnZ3RpdGxlKCJFYXJseSBwb3BsYXRpb24gc2l6ZSB2cyBjb2V4aXN0ZW5jZSAoSHVnZSkiKQ0KDQoNCnByaW50KGNvZXhpc3RfNXRoX1NtYWxsX2ZpZykNCnByaW50KGNvZXhpc3RfNXRoX01lZGl1bV9maWcpDQpwcmludChjb2V4aXN0XzV0aF9MYXJnZV9maWcpDQpwcmludChjb2V4aXN0XzV0aF9IdWdlX2ZpZykNCmBgYA0KDQo=