1 Getting started

rm (list=ls())

fpackage.check <- function(packages) {
    lapply(packages, FUN = function(x) {
        if (!require(x, character.only = TRUE)) {
            install.packages(x, dependencies = TRUE)
            library(x, character.only = TRUE)
        }
    })
}

fsave <- function(x, file = NULL, location = "./data/processed/") {
    ifelse(!dir.exists("data"), dir.create("data"), FALSE)
    ifelse(!dir.exists("data/processed"), dir.create("data/processed"), FALSE)
    if (is.null(file))
        file = deparse(substitute(x))
    datename <- substr(gsub("[:-]", "", Sys.time()), 1, 8)
    totalname <- paste(location, datename, file, ".rda", sep = "")
    save(x, file = totalname)  #need to fix if file is reloaded as input name, not as x. 
}

fload <- function(filename) {
    load(filename)
    get(ls()[ls() != "filename"])
}

fshowdf <- function(x, ...) {
    knitr::kable(x, digits = 2, "html", ...) %>%
        kableExtra::kable_styling(bootstrap_options = c("striped", "hover")) %>%
        kableExtra::scroll_box(width = "100%", height = "300px")
}

fcolnet <- function(data = scholars, university = "RU", discipline = "sociology", waves = list(c(2015,
    2018), c(2019, 2023)), type = c("first")) {

    # step 1
    demographics <- do.call(rbind.data.frame, data$demographics)
    demographics <- demographics %>%
        mutate(Universiteit1.22 = replace(Universiteit1.22, is.na(Universiteit1.22), ""), Universiteit2.22 = replace(Universiteit2.22,
            is.na(Universiteit2.22), ""), Universiteit1.24 = replace(Universiteit1.24, is.na(Universiteit1.24),
            ""), Universiteit2.24 = replace(Universiteit2.24, is.na(Universiteit2.24), ""), discipline.22 = replace(discipline.22,
            is.na(discipline.22), ""), discipline.24 = replace(discipline.24, is.na(discipline.24), ""))

    sample <- which((demographics$Universiteit1.22 %in% university | demographics$Universiteit2.22 %in%
        university | demographics$Universiteit1.24 %in% university | demographics$Universiteit2.24 %in%
        university) & (demographics$discipline.22 %in% discipline | demographics$discipline.24 %in% discipline))

    demographics_soc <- demographics[sample, ]
    scholars_sel <- lapply(scholars, "[", sample)

    # step 2
    ids <- demographics_soc$au_id
    nwaves <- length(waves)
    nets <- array(0, dim = c(nwaves, length(ids), length(ids)), dimnames = list(wave = 1:nwaves, ids,
        ids))
    dimnames(nets)

    # step 3
    df_works <- tibble(works_id = unlist(lapply(scholars_sel$work, function(l) l$id)), works_author = unlist(lapply(scholars_sel$work,
        function(l) l$author), recursive = FALSE), works_year = unlist(lapply(scholars_sel$work, function(l) l$publication_year),
        recursive = FALSE))

    df_works <- df_works[!duplicated(df_works), ]

    # step 4
    if (type == "first") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                ego <- df_works_w$works_author[i][[1]]$au_id[1]
                alters <- df_works_w$works_author[i][[1]]$au_id[-1]
                if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
                  nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
                }
            }
        }
    }

    if (type == "last") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                ego <- rev(df_works_w$works_author[i][[1]]$au_id)[1]
                alters <- rev(df_works_w$works_author[i][[1]]$au_id)[-1]
                if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
                  nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
                }
            }
        }
    }

    if (type == "all") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                egos <- df_works_w$works_author[i][[1]]$au_id
                if (sum(ids %in% egos) > 0) {
                  nets[j, which(ids %in% egos), which(ids %in% egos)] <- 1
                }
            }
        }
    }
    output <- list()
    output$data <- scholars_sel
    output$nets <- nets
    return(output)
}

packages = c("RSiena", "tidyverse")
fpackage.check(packages)
## [[1]]
## NULL
## 
## [[2]]
## NULL

2 Step 1: define data

scholars <- fload("data/processed/scholars_20240924.rda")

test <- fcolnet(data = scholars, 
                university = c("RU", "UU"), 
                discipline = "sociology", 
                waves = list(c(2015, 2018), c(2019, 2023)), 
                type = c("first"))


wave1 <- test$nets[1,,]
wave2 <- test$nets[2,,]

#some checks
dim(wave1)
## [1] 100 100
dim(wave2)
## [1] 100 100
sum(is.na(wave1))
## [1] 0
sum(diag(wave1)==0)
## [1] 99
sum(wave2>1)
## [1] 0
sum(wave2>0)
## [1] 132
#make array
nets <- array(data = c(wave1, wave2), dim = c(dim(wave1), 2))

# dependent
net <- sienaDependent(nets)

#independent
df<- test$data
df_ego <- do.call(rbind.data.frame, df$demographics)

df_ego$Functie.22[is.na(df_ego$Functie.22)] <- "."
df_ego$Functie.24[is.na(df_ego$Functie.24)] <- "."

df_ego$functie <- ifelse(df_ego$Functie.22=="Hoogleraar", 1, 0)
df_ego$functie <- ifelse(df_ego$Functie.24=="Hoogleraar", 1, df_ego$functie)
df_ego$functie <- ifelse(df_ego$Functie.22=="Bijzonder hoogleraar", 1, df_ego$functie)
df_ego$functie <- ifelse(df_ego$Functie.24=="Bijzonder hoogleraar", 1, df_ego$functie)

table(df_ego$functie, useNA="always")
## 
##    0    1 <NA> 
##   85   15    0
functie <- coCovar(df_ego$functie)

mydata <- sienaDataCreate(net, functie)

3 Effects

myeff <- getEffects(mydata)
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    2.70882   0   
## 2 outdegree (density)      TRUE    FALSE FALSE   -1.62905   0   
## 3 reciprocity              TRUE    FALSE FALSE    0.00000   0

#Inital Description

ifelse(!dir.exists("results"), dir.create("results"), FALSE)
## [1] FALSE
print01Report(mydata, modelname = "./results/firsttest_scholars")

4 Specify model

myeff <- getEffects(mydata)
myeff <- includeEffects(
  myeff, 
  outAct,
  isolateNet
)
##   effectNumber effectName           shortName  include fix   test  initialValue parm
## 1 106          outdegree - activity outAct     TRUE    FALSE FALSE          0   0   
## 2 149          network-isolate      isolateNet TRUE    FALSE FALSE          0   0
myeff <- includeEffects(myeff, egoX, interaction1 = "functie")
##   effectNumber effectName  shortName include fix   test  initialValue parm
## 1 253          functie ego egoX      TRUE    FALSE FALSE          0   0
myeff <- includeEffects(myeff, altX, interaction1 = "functie")
##   effectNumber effectName    shortName include fix   test  initialValue parm
## 1 238          functie alter altX      TRUE    FALSE FALSE          0   0
myeff <- includeEffects(myeff, sameX, interaction1 = "functie")
##   effectNumber effectName   shortName include fix   test  initialValue parm
## 1 309          same functie sameX     TRUE    FALSE FALSE          0   0
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    2.70882   0   
## 2 outdegree (density)      TRUE    FALSE FALSE   -1.62905   0   
## 3 reciprocity              TRUE    FALSE FALSE    0.00000   0   
## 4 outdegree - activity     TRUE    FALSE FALSE    0.00000   0   
## 5 network-isolate          TRUE    FALSE FALSE    0.00000   0   
## 6 functie alter            TRUE    FALSE FALSE    0.00000   0   
## 7 functie ego              TRUE    FALSE FALSE    0.00000   0   
## 8 same functie             TRUE    FALSE FALSE    0.00000   0

5 Estimate

myAlgorithm <- sienaAlgorithmCreate(projname = "scholars")
## If you use this algorithm object, siena07 will create/use an output file scholars.txt .
EstM1 <- siena07(myAlgorithm, data = mydata, effects = myeff, returnDeps = TRUE)

EstM1
## Estimates, standard errors and convergence t-ratios
## 
##                                Estimate   Standard   Convergence 
##                                             Error      t-ratio   
## 
## Rate parameters: 
##   0       Rate parameter        3.6553  ( 0.4893   )             
## 
## Other parameters: 
##   1. eval outdegree (density)  -0.6923  ( 1.3763   )    0.0696   
##   2. eval reciprocity           2.6938  ( 0.3593   )   -0.0229   
##   3. eval outdegree - activity -0.3040  ( 0.2436   )    0.0220   
##   4. eval network-isolate       5.1484  ( 1.7725   )   -0.0538   
##   5. eval functie alter         1.4434  ( 0.3218   )   -0.0005   
##   6. eval functie ego          -3.3458  ( 1.0559   )   -0.0040   
##   7. eval same functie         -0.1756  ( 0.3177   )    0.0341   
## 
## Overall maximum convergence ratio:    0.1190 
## 
## 
## Total of 2750 iteration steps.

6 Homework

Read manual, pick one relevant statistics in chapter 12. Present. Make data ready.

#start clean
rm(list=ls())
#Custom functions
fpackage.check <- function(packages) {
    lapply(packages, FUN = function(x) {
        if (!require(x, character.only = TRUE)) {
            install.packages(x, dependencies = TRUE)
            library(x, character.only = TRUE)
        }
    })
}

fsave <- function(x, file = NULL, location = "./data/processed/") {
    ifelse(!dir.exists("data"), dir.create("data"), FALSE)
    ifelse(!dir.exists("data/processed"), dir.create("data/processed"), FALSE)
    if (is.null(file))
        file = deparse(substitute(x))
    datename <- substr(gsub("[:-]", "", Sys.time()), 1, 8)
    totalname <- paste(location, datename, file, ".rda", sep = "")
    save(x, file = totalname)  #need to fix if file is reloaded as input name, not as x. 
}

fload <- function(filename) {
    load(filename)
    get(ls()[ls() != "filename"])
}

fshowdf <- function(x, ...) {
    knitr::kable(x, digits = 2, "html", ...) %>%
        kableExtra::kable_styling(bootstrap_options = c("striped", "hover")) %>%
        kableExtra::scroll_box(width = "100%", height = "300px")
}

colorize <- function(x, color) {
    sprintf("<span style='color: %s;'>%s</span>", color, x)
}

#the big one
fcolnet <- function(data = scholars, university = "RU", discipline = "sociology", waves = list(c(2015,
    2018), c(2019, 2023)), type = c("first")) {

    # step 1
    demographics <- do.call(rbind.data.frame, data$demographics)
    demographics <- demographics %>%
        mutate(Universiteit1.22 = replace(Universiteit1.22, is.na(Universiteit1.22), ""), Universiteit2.22 = replace(Universiteit2.22,
            is.na(Universiteit2.22), ""), Universiteit1.24 = replace(Universiteit1.24, is.na(Universiteit1.24),
            ""), Universiteit2.24 = replace(Universiteit2.24, is.na(Universiteit2.24), ""), discipline.22 = replace(discipline.22,
            is.na(discipline.22), ""), discipline.24 = replace(discipline.24, is.na(discipline.24), ""))

    sample <- which((demographics$Universiteit1.22 %in% university | demographics$Universiteit2.22 %in%
        university | demographics$Universiteit1.24 %in% university | demographics$Universiteit2.24 %in%
        university) & (demographics$discipline.22 %in% discipline | demographics$discipline.24 %in% discipline))

    demographics_soc <- demographics[sample, ]
    scholars_sel <- lapply(scholars, "[", sample)

    # step 2
    ids <- demographics_soc$au_id
    nwaves <- length(waves)
    nets <- array(0, dim = c(nwaves, length(ids), length(ids)), dimnames = list(wave = 1:nwaves, ids,
        ids))
    dimnames(nets)

    # step 3
    df_works <- tibble(works_id = unlist(lapply(scholars_sel$work, function(l) l$id)), works_author = unlist(lapply(scholars_sel$work,
        function(l) l$author), recursive = FALSE), works_year = unlist(lapply(scholars_sel$work, function(l) l$publication_year),
        recursive = FALSE))

    df_works <- df_works[!duplicated(df_works), ]

    # step 4
    if (type == "first") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                ego <- df_works_w$works_author[i][[1]]$au_id[1]
                alters <- df_works_w$works_author[i][[1]]$au_id[-1]
                if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
                  nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
                }
            }
        }
    }

    if (type == "last") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                ego <- rev(df_works_w$works_author[i][[1]]$au_id)[1]
                alters <- rev(df_works_w$works_author[i][[1]]$au_id)[-1]
                if (sum(ids %in% ego) > 0 & sum(ids %in% alters) > 0) {
                  nets[j, which(ids %in% ego), which(ids %in% alters)] <- 1
                }
            }
        }
    }

    if (type == "all") {
        for (j in 1:nwaves) {
            df_works_w <- df_works[df_works$works_year >= waves[[j]][1] & df_works$works_year <= waves[[j]][2],
                ]
            for (i in 1:nrow(df_works_w)) {
                egos <- df_works_w$works_author[i][[1]]$au_id
                if (sum(ids %in% egos) > 0) {
                  nets[j, which(ids %in% egos), which(ids %in% egos)] <- 1
                }
            }
        }
    }
    output <- list()
    output$data <- scholars_sel
    output$nets <- nets
    return(output)
}

fpackage.check(c("tidyverse", "RSiena"))
## [[1]]
## NULL
## 
## [[2]]
## NULL

7 Add citations to the data

scholars <- fload("C:/Users/kalle/OneDrive/Documenten/REMA/Jaar 2/Social Networks/KS_labjournal/data/processed/scholars_20240924.rda")


scholars_net <- fcolnet(data = scholars, 
                university = c("RU", "UU", "RUG", "UvA", "VU", "EUR", "Leiden", "UvT"), 
                discipline = c("sociology", "political science"), 
                waves = list(c(2015, 2018), c(2019, 2023)), 
                type = c("all"))

df_ego <- do.call(rbind.data.frame, scholars_net$data$demographics)

df_citations <-  fload("C:/Users/kalle/OneDrive/Documenten/REMA/Jaar 2/Social Networks/KS_labjournal/data/processed/df_20250929.rda")

#merging
df_ego <- df_ego |>
  left_join(df_citations |> select(Naam, citations_w1, citations_w2),
            by = "Naam")

8 make ordinal variable function

table(df_ego$Functie.24, useNA = "always")
## 
##                                                                                             ? 
##                                                                                             1 
##                                                                            Adjunct hoogleraar 
##                                                                                             1 
##                                                                          Associate researcher 
##                                                                                             1 
##                                                                          Bijzonder hoogleraar 
##                                                                                            14 
##                                                                          Bijzonder Hoogleraar 
##                                                                                             2 
##                                                                                   Datamanager 
##                                                                                             1 
##                                                                                 Directeur SoG 
##                                                                                             1 
##                                                                                        Docent 
##                                                                                            24 
##                                                                        Docent (gepensioneerd) 
##                                                                                             1 
##                                                                                   Docent, phd 
##                                                                                             1 
##                                                                            Docent/PhD student 
##                                                                                             1 
##                                                                                       Docent? 
##                                                                                             1 
##                                                                           Doctoral Researcher 
##                                                                                             2 
##                                                                              Doctoral student 
##                                                                                             1 
## Does project at UvA, has worked as professor, lecturer, and research fellow at different unis 
##                                                                                             1 
##                                                                           Emeritus hoogleraar 
##                                                                                            12 
##                                                                   Emeritus hoogleraar (gast?) 
##                                                                                             1 
##                                                                                  External Phd 
##                                                                                             6 
##                                                                                  External PhD 
##                                                                                             1 
##                                                                                        Fellow 
##                                                                                             1 
##                                                                             Gast/ Onderzoeker 
##                                                                                             1 
##                                                        Gast/Emeritus universitair hoofddocent 
##                                                                                             1 
##                                                                               Gastonderzoeker 
##                                                                                             1 
##                                                               Gepensioneerd docent sociologie 
##                                                                                             1 
##                                                                             Gepensioneerd UHD 
##                                                                                             1 
##                                                                              Guest Researcher 
##                                                                                             2 
##                                                                            Honorary professor 
##                                                                                             2 
##                                                                              Hoofdonderzoeker 
##                                                                                             1 
##                                                                                    Hoogleraar 
##                                                                                            83 
##                                                                             Hoogleraar (gast) 
##                                                                                             1 
##                                                                         Hoogleraar (visiting) 
##                                                                                             1 
##                                                         Hoogleraar + Universitair hoofddocent 
##                                                                                             1 
##                                                                Hoogleraar/Afdelingsvoorzitter 
##                                                                                             1 
##                                                                                 Junior docent 
##                                                                                             1 
##                                                                            Junior onderzoeker 
##                                                                                             1 
##                                                                                      Lecturer 
##                                                                                             9 
##                                                                       Lecturer and Researcher 
##                                                                                             1 
##                                                                           Lecturer/researcher 
##                                                                                             1 
##                                                       Managing director/co-founder SocioQuest 
##                                                                                             1 
##                                                                                    Medewerker 
##                                                                                             1 
##                                                                         Onderwijsontwikkelaar 
##                                                                                             1 
##                                                                                   Onderzoeker 
##                                                                                            34 
##                                                                          Onderzoeker/Lecturer 
##                                                                                             1 
##                                                                              Onderzoeksfellow 
##                                                                                             1 
##                                                                          Onderzoeksmedewerker 
##                                                                                             1 
##                                                                              Other researcher 
##                                                                                             1 
##                                                                 part-time doctoral researcher 
##                                                                                             1 
##                                                                                 Phd & postdoc 
##                                                                                             1 
##                                                                                   Phd Student 
##                                                                                             1 
##                                                                                   PhD student 
##                                                                                            42 
##                                                                                   PhD Student 
##                                                                                           112 
##                                                                     PhD Student anthropologie 
##                                                                                             1 
##                                                                    PhD student, Junior Docent 
##                                                                                             2 
##                                                                              PhD student/Gast 
##                                                                                             2 
##                                                                                  PhD studentt 
##                                                                                             1 
##                                                                                       Postdoc 
##                                                                                            22 
##                                                                  Postdoctoral Research Fellow 
##                                                                                             1 
##                                                                                   Promovendus 
##                                                                                             1 
##                                                                               Research fellow 
##                                                                                             1 
##                                                                           Scholarship student 
##                                                                                             1 
##                                                                               Senior lecturer 
##                                                                                             3 
##                                                                            Senior Onderzoeker 
##                                                                                             1 
##                                                                        Senior Research Fellow 
##                                                                                             1 
##                                                                             Senior researcher 
##                                                                                             1 
##                                                                             Senior Researcher 
##                                                                                             1 
##                                                                   Senior researcher part-time 
##                                                                                             1 
##                                                                           Universitair docent 
##                                                                                           154 
##                                                                           Universitair Docent 
##                                                                                             3 
##                                                                      Universitair hoofddocent 
##                                                                                            84 
##                                                   Universitair hoofddocent/Onderwijsdirecteur 
##                                                                                             1 
##                                                                        Unversitair docent GPM 
##                                                                                             1 
##                                                                    Wetenschappelijk directeur 
##                                                                                             1 
##                                                                                          <NA> 
##                                                                                             8
#categories:
#(bijzonder) hoogleraar, UHD, UD, postdoc/senior/docent/researcher, PhD (external).


df_ego <- df_ego |>
  mutate(functie_level =
           case_when(
             grepl("hoogleraar|professor", tolower(Functie.24)) ~ 5,
             grepl("universitair hoofddocent|uhd", tolower(Functie.24)) ~ 4,
             grepl("universitair docent|unversitair docent", tolower(Functie.24)) ~ 3,
             grepl("postdoc|senior|fellow", tolower(Functie.24)) ~ 2,
             tolower(Functie.24) %in% c(
               "docent", "lecturer", "onderzoeker", "onderzoeker/lecturer", 
               "lecturer and researcher", "lecturer/researcher", 
               "docent (gepensioneerd)", "docent?", "gast/ onderzoeker", 
               "gastonderzoeker", "gepensioneerd docent sociologie", 
               "guest researcher"
             ) ~ 2,
             tolower(Functie.24) %in% c("doctoral researcher", "doctoral student", "part-time doctoral researcher") ~ 1,
             grepl("phd|junior|promovendus", tolower(Functie.24)) ~ 1,
             .default = NA
           )
         )


table(df_ego$functie_level, df_ego$Functie.24, useNA="always")
##       
##          ? Adjunct hoogleraar Associate researcher Bijzonder hoogleraar Bijzonder Hoogleraar
##   1      0                  0                    0                    0                    0
##   2      0                  0                    0                    0                    0
##   3      0                  0                    0                    0                    0
##   4      0                  0                    0                    0                    0
##   5      0                  1                    0                   14                    2
##   <NA>   1                  0                    1                    0                    0
##       
##        Datamanager Directeur SoG Docent Docent (gepensioneerd) Docent, phd Docent/PhD student
##   1              0             0      0                      0           1                  1
##   2              0             0     24                      1           0                  0
##   3              0             0      0                      0           0                  0
##   4              0             0      0                      0           0                  0
##   5              0             0      0                      0           0                  0
##   <NA>           1             1      0                      0           0                  0
##       
##        Docent? Doctoral Researcher Doctoral student
##   1          0                   2                1
##   2          1                   0                0
##   3          0                   0                0
##   4          0                   0                0
##   5          0                   0                0
##   <NA>       0                   0                0
##       
##        Does project at UvA, has worked as professor, lecturer, and research fellow at different unis
##   1                                                                                                0
##   2                                                                                                0
##   3                                                                                                0
##   4                                                                                                0
##   5                                                                                                1
##   <NA>                                                                                             0
##       
##        Emeritus hoogleraar Emeritus hoogleraar (gast?) External Phd External PhD Fellow
##   1                      0                           0            6            1      0
##   2                      0                           0            0            0      1
##   3                      0                           0            0            0      0
##   4                      0                           0            0            0      0
##   5                     12                           1            0            0      0
##   <NA>                   0                           0            0            0      0
##       
##        Gast/ Onderzoeker Gast/Emeritus universitair hoofddocent Gastonderzoeker
##   1                    0                                      0               0
##   2                    1                                      0               1
##   3                    0                                      0               0
##   4                    0                                      1               0
##   5                    0                                      0               0
##   <NA>                 0                                      0               0
##       
##        Gepensioneerd docent sociologie Gepensioneerd UHD Guest Researcher Honorary professor
##   1                                  0                 0                0                  0
##   2                                  1                 0                2                  0
##   3                                  0                 0                0                  0
##   4                                  0                 1                0                  0
##   5                                  0                 0                0                  2
##   <NA>                               0                 0                0                  0
##       
##        Hoofdonderzoeker Hoogleraar Hoogleraar (gast) Hoogleraar (visiting)
##   1                   0          0                 0                     0
##   2                   0          0                 0                     0
##   3                   0          0                 0                     0
##   4                   0          0                 0                     0
##   5                   0         83                 1                     1
##   <NA>                1          0                 0                     0
##       
##        Hoogleraar + Universitair hoofddocent Hoogleraar/Afdelingsvoorzitter Junior docent
##   1                                        0                              0             1
##   2                                        0                              0             0
##   3                                        0                              0             0
##   4                                        0                              0             0
##   5                                        1                              1             0
##   <NA>                                     0                              0             0
##       
##        Junior onderzoeker Lecturer Lecturer and Researcher Lecturer/researcher
##   1                     1        0                       0                   0
##   2                     0        9                       1                   1
##   3                     0        0                       0                   0
##   4                     0        0                       0                   0
##   5                     0        0                       0                   0
##   <NA>                  0        0                       0                   0
##       
##        Managing director/co-founder SocioQuest Medewerker Onderwijsontwikkelaar Onderzoeker
##   1                                          0          0                     0           0
##   2                                          0          0                     0          34
##   3                                          0          0                     0           0
##   4                                          0          0                     0           0
##   5                                          0          0                     0           0
##   <NA>                                       1          1                     1           0
##       
##        Onderzoeker/Lecturer Onderzoeksfellow Onderzoeksmedewerker Other researcher
##   1                       0                0                    0                0
##   2                       1                1                    0                0
##   3                       0                0                    0                0
##   4                       0                0                    0                0
##   5                       0                0                    0                0
##   <NA>                    0                0                    1                1
##       
##        part-time doctoral researcher Phd & postdoc Phd Student PhD student PhD Student
##   1                                1             0           1          42         112
##   2                                0             1           0           0           0
##   3                                0             0           0           0           0
##   4                                0             0           0           0           0
##   5                                0             0           0           0           0
##   <NA>                             0             0           0           0           0
##       
##        PhD Student anthropologie PhD student, Junior Docent PhD student/Gast PhD studentt Postdoc
##   1                            1                          2                2            1       0
##   2                            0                          0                0            0      22
##   3                            0                          0                0            0       0
##   4                            0                          0                0            0       0
##   5                            0                          0                0            0       0
##   <NA>                         0                          0                0            0       0
##       
##        Postdoctoral Research Fellow Promovendus Research fellow Scholarship student Senior lecturer
##   1                               0           1               0                   0               0
##   2                               1           0               1                   0               3
##   3                               0           0               0                   0               0
##   4                               0           0               0                   0               0
##   5                               0           0               0                   0               0
##   <NA>                            0           0               0                   1               0
##       
##        Senior Onderzoeker Senior Research Fellow Senior researcher Senior Researcher
##   1                     0                      0                 0                 0
##   2                     1                      1                 1                 1
##   3                     0                      0                 0                 0
##   4                     0                      0                 0                 0
##   5                     0                      0                 0                 0
##   <NA>                  0                      0                 0                 0
##       
##        Senior researcher part-time Universitair docent Universitair Docent Universitair hoofddocent
##   1                              0                   0                   0                        0
##   2                              1                   0                   0                        0
##   3                              0                 154                   3                        0
##   4                              0                   0                   0                       84
##   5                              0                   0                   0                        0
##   <NA>                           0                   0                   0                        0
##       
##        Universitair hoofddocent/Onderwijsdirecteur Unversitair docent GPM
##   1                                              0                      0
##   2                                              0                      0
##   3                                              0                      1
##   4                                              1                      0
##   5                                              0                      0
##   <NA>                                           0                      0
##       
##        Wetenschappelijk directeur <NA>
##   1                             0    0
##   2                             0    0
##   3                             0    0
##   4                             0    0
##   5                             0    0
##   <NA>                          1    8
table(df_ego$functie_level, useNA = "always")
## 
##    1    2    3    4    5 <NA> 
##  177  112  158   87  120   20
fsave(df_ego)

9 First analyses (undirected network)

9.1 Homophily?

#Step 1: define data

wave1 <- scholars_net$nets[1,,]
wave2 <- scholars_net$nets[2,,]

##some checks
dim(wave1)
## [1] 674 674
dim(wave2)
## [1] 674 674
#should be 0
sum(is.na(wave1))
## [1] 0
#set diagonal to 0
sum(diag(wave2)==0)
## [1] 26
diag(wave1) <- 0
diag(wave2) <- 0

#only 1s and 0s
sum(wave1>1)
## [1] 0
#at least some 1s
sum(wave1>0)
## [1] 940
#make array
nets <- array(data = c(wave1, wave2), dim = c(dim(wave1), 2))

# dependent
net <- sienaDependent(nets)

#independent

functie <- coCovar(df_ego$functie_level)

mydata <- sienaDataCreate(net, functie)
#Step 2: effects
myeff <- getEffects(mydata)
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    4.52955   0   
## 2 degree (density)         TRUE    FALSE FALSE   -1.66572   0
#Step 3: initial description

print01Report(mydata, modelname = "./results/secondtest_scholars")
#step 4: specify model
myeff <- getEffects(mydata)
myeff <- includeEffects(myeff, gwesp, outAct)
##   effectNumber effectName    shortName include fix   test  initialValue parm
## 1 21           GWESP (#)     gwesp     TRUE    FALSE FALSE          0   69  
## 2 39           degree of ego outAct    TRUE    FALSE FALSE          0    0
myeff <- includeEffects(myeff, simX, interaction1 = "functie")
##   effectNumber effectName         shortName include fix   test  initialValue parm
## 1 153          functie similarity simX      TRUE    FALSE FALSE          0   0
myeff
##   effectName               include fix   test  initialValue parm
## 1 basic rate parameter net TRUE    FALSE FALSE    4.52955    0  
## 2 degree (density)         TRUE    FALSE FALSE   -1.66572    0  
## 3 GWESP (#)                TRUE    FALSE FALSE    0.00000   69  
## 4 degree of ego            TRUE    FALSE FALSE    0.00000    0  
## 5 functie similarity       TRUE    FALSE FALSE    0.00000    0
#Estimate
myAlgorithm <- sienaAlgorithmCreate(projname = "scholars")
EstM1 <- siena07(myAlgorithm, data = mydata, effects = myeff, returnDeps = TRUE)

EstM1
LS0tDQp0aXRsZTogIldlZWsgNSINCmF1dGhvcjogIkthbGxlIFN0b2ZmZXJzIg0KZGF0ZTogIjIwMjUtMTAtMDMiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIEdldHRpbmcgc3RhcnRlZA0KDQpgYGB7cn0NCnJtIChsaXN0PWxzKCkpDQoNCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7DQogICAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7DQogICAgICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICAgICAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgICAgICAgfQ0KICAgIH0pDQp9DQoNCmZzYXZlIDwtIGZ1bmN0aW9uKHgsIGZpbGUgPSBOVUxMLCBsb2NhdGlvbiA9ICIuL2RhdGEvcHJvY2Vzc2VkLyIpIHsNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEiKSwgZGlyLmNyZWF0ZSgiZGF0YSIpLCBGQUxTRSkNCiAgICBpZmVsc2UoIWRpci5leGlzdHMoImRhdGEvcHJvY2Vzc2VkIiksIGRpci5jcmVhdGUoImRhdGEvcHJvY2Vzc2VkIiksIEZBTFNFKQ0KICAgIGlmIChpcy5udWxsKGZpbGUpKQ0KICAgICAgICBmaWxlID0gZGVwYXJzZShzdWJzdGl0dXRlKHgpKQ0KICAgIGRhdGVuYW1lIDwtIHN1YnN0cihnc3ViKCJbOi1dIiwgIiIsIFN5cy50aW1lKCkpLCAxLCA4KQ0KICAgIHRvdGFsbmFtZSA8LSBwYXN0ZShsb2NhdGlvbiwgZGF0ZW5hbWUsIGZpbGUsICIucmRhIiwgc2VwID0gIiIpDQogICAgc2F2ZSh4LCBmaWxlID0gdG90YWxuYW1lKSAgI25lZWQgdG8gZml4IGlmIGZpbGUgaXMgcmVsb2FkZWQgYXMgaW5wdXQgbmFtZSwgbm90IGFzIHguIA0KfQ0KDQpmbG9hZCA8LSBmdW5jdGlvbihmaWxlbmFtZSkgew0KICAgIGxvYWQoZmlsZW5hbWUpDQogICAgZ2V0KGxzKClbbHMoKSAhPSAiZmlsZW5hbWUiXSkNCn0NCg0KZnNob3dkZiA8LSBmdW5jdGlvbih4LCAuLi4pIHsNCiAgICBrbml0cjo6a2FibGUoeCwgZGlnaXRzID0gMiwgImh0bWwiLCAuLi4pICU+JQ0KICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6c2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjMwMHB4IikNCn0NCg0KZmNvbG5ldCA8LSBmdW5jdGlvbihkYXRhID0gc2Nob2xhcnMsIHVuaXZlcnNpdHkgPSAiUlUiLCBkaXNjaXBsaW5lID0gInNvY2lvbG9neSIsIHdhdmVzID0gbGlzdChjKDIwMTUsDQogICAgMjAxOCksIGMoMjAxOSwgMjAyMykpLCB0eXBlID0gYygiZmlyc3QiKSkgew0KDQogICAgIyBzdGVwIDENCiAgICBkZW1vZ3JhcGhpY3MgPC0gZG8uY2FsbChyYmluZC5kYXRhLmZyYW1lLCBkYXRhJGRlbW9ncmFwaGljcykNCiAgICBkZW1vZ3JhcGhpY3MgPC0gZGVtb2dyYXBoaWNzICU+JQ0KICAgICAgICBtdXRhdGUoVW5pdmVyc2l0ZWl0MS4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0MS4yMiwgaXMubmEoVW5pdmVyc2l0ZWl0MS4yMiksICIiKSwgVW5pdmVyc2l0ZWl0Mi4yMiA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0Mi4yMiwNCiAgICAgICAgICAgIGlzLm5hKFVuaXZlcnNpdGVpdDIuMjIpLCAiIiksIFVuaXZlcnNpdGVpdDEuMjQgPSByZXBsYWNlKFVuaXZlcnNpdGVpdDEuMjQsIGlzLm5hKFVuaXZlcnNpdGVpdDEuMjQpLA0KICAgICAgICAgICAgIiIpLCBVbml2ZXJzaXRlaXQyLjI0ID0gcmVwbGFjZShVbml2ZXJzaXRlaXQyLjI0LCBpcy5uYShVbml2ZXJzaXRlaXQyLjI0KSwgIiIpLCBkaXNjaXBsaW5lLjIyID0gcmVwbGFjZShkaXNjaXBsaW5lLjIyLA0KICAgICAgICAgICAgaXMubmEoZGlzY2lwbGluZS4yMiksICIiKSwgZGlzY2lwbGluZS4yNCA9IHJlcGxhY2UoZGlzY2lwbGluZS4yNCwgaXMubmEoZGlzY2lwbGluZS4yNCksICIiKSkNCg0KICAgIHNhbXBsZSA8LSB3aGljaCgoZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjIgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjIgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDEuMjQgJWluJSB1bml2ZXJzaXR5IHwgZGVtb2dyYXBoaWNzJFVuaXZlcnNpdGVpdDIuMjQgJWluJQ0KICAgICAgICB1bml2ZXJzaXR5KSAmIChkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yMiAlaW4lIGRpc2NpcGxpbmUgfCBkZW1vZ3JhcGhpY3MkZGlzY2lwbGluZS4yNCAlaW4lIGRpc2NpcGxpbmUpKQ0KDQogICAgZGVtb2dyYXBoaWNzX3NvYyA8LSBkZW1vZ3JhcGhpY3Nbc2FtcGxlLCBdDQogICAgc2Nob2xhcnNfc2VsIDwtIGxhcHBseShzY2hvbGFycywgIlsiLCBzYW1wbGUpDQoNCiAgICAjIHN0ZXAgMg0KICAgIGlkcyA8LSBkZW1vZ3JhcGhpY3Nfc29jJGF1X2lkDQogICAgbndhdmVzIDwtIGxlbmd0aCh3YXZlcykNCiAgICBuZXRzIDwtIGFycmF5KDAsIGRpbSA9IGMobndhdmVzLCBsZW5ndGgoaWRzKSwgbGVuZ3RoKGlkcykpLCBkaW1uYW1lcyA9IGxpc3Qod2F2ZSA9IDE6bndhdmVzLCBpZHMsDQogICAgICAgIGlkcykpDQogICAgZGltbmFtZXMobmV0cykNCg0KICAgICMgc3RlcCAzDQogICAgZGZfd29ya3MgPC0gdGliYmxlKHdvcmtzX2lkID0gdW5saXN0KGxhcHBseShzY2hvbGFyc19zZWwkd29yaywgZnVuY3Rpb24obCkgbCRpZCkpLCB3b3Jrc19hdXRob3IgPSB1bmxpc3QobGFwcGx5KHNjaG9sYXJzX3NlbCR3b3JrLA0KICAgICAgICBmdW5jdGlvbihsKSBsJGF1dGhvciksIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgd29ya3NfeWVhciA9IHVubGlzdChsYXBwbHkoc2Nob2xhcnNfc2VsJHdvcmssIGZ1bmN0aW9uKGwpIGwkcHVibGljYXRpb25feWVhciksDQogICAgICAgIHJlY3Vyc2l2ZSA9IEZBTFNFKSkNCg0KICAgIGRmX3dvcmtzIDwtIGRmX3dvcmtzWyFkdXBsaWNhdGVkKGRmX3dvcmtzKSwgXQ0KDQogICAgIyBzdGVwIDQNCiAgICBpZiAodHlwZSA9PSAiZmlyc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSBkZl93b3Jrc193JHdvcmtzX2F1dGhvcltpXVtbMV1dJGF1X2lkWzFdDQogICAgICAgICAgICAgICAgYWx0ZXJzIDwtIGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWRbLTFdDQogICAgICAgICAgICAgICAgaWYgKHN1bShpZHMgJWluJSBlZ28pID4gMCAmIHN1bShpZHMgJWluJSBhbHRlcnMpID4gMCkgew0KICAgICAgICAgICAgICAgICAgbmV0c1tqLCB3aGljaChpZHMgJWluJSBlZ28pLCB3aGljaChpZHMgJWluJSBhbHRlcnMpXSA8LSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHR5cGUgPT0gImxhc3QiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnbyA8LSByZXYoZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZClbMV0NCiAgICAgICAgICAgICAgICBhbHRlcnMgPC0gcmV2KGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWQpWy0xXQ0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvKSA+IDAgJiBzdW0oaWRzICVpbiUgYWx0ZXJzKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgIG5ldHNbaiwgd2hpY2goaWRzICVpbiUgZWdvKSwgd2hpY2goaWRzICVpbiUgYWx0ZXJzKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmICh0eXBlID09ICJhbGwiKSB7DQogICAgICAgIGZvciAoaiBpbiAxOm53YXZlcykgew0KICAgICAgICAgICAgZGZfd29ya3NfdyA8LSBkZl93b3Jrc1tkZl93b3JrcyR3b3Jrc195ZWFyID49IHdhdmVzW1tqXV1bMV0gJiBkZl93b3JrcyR3b3Jrc195ZWFyIDw9IHdhdmVzW1tqXV1bMl0sDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgZm9yIChpIGluIDE6bnJvdyhkZl93b3Jrc193KSkgew0KICAgICAgICAgICAgICAgIGVnb3MgPC0gZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZA0KICAgICAgICAgICAgICAgIGlmIChzdW0oaWRzICVpbiUgZWdvcykgPiAwKSB7DQogICAgICAgICAgICAgICAgICBuZXRzW2osIHdoaWNoKGlkcyAlaW4lIGVnb3MpLCB3aGljaChpZHMgJWluJSBlZ29zKV0gPC0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBvdXRwdXQgPC0gbGlzdCgpDQogICAgb3V0cHV0JGRhdGEgPC0gc2Nob2xhcnNfc2VsDQogICAgb3V0cHV0JG5ldHMgPC0gbmV0cw0KICAgIHJldHVybihvdXRwdXQpDQp9DQoNCnBhY2thZ2VzID0gYygiUlNpZW5hIiwgInRpZHl2ZXJzZSIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCg0KYGBgDQoNCiMgU3RlcCAxOiBkZWZpbmUgZGF0YQ0KDQpgYGB7cn0NCg0Kc2Nob2xhcnMgPC0gZmxvYWQoImRhdGEvcHJvY2Vzc2VkL3NjaG9sYXJzXzIwMjQwOTI0LnJkYSIpDQoNCnRlc3QgPC0gZmNvbG5ldChkYXRhID0gc2Nob2xhcnMsIA0KICAgICAgICAgICAgICAgIHVuaXZlcnNpdHkgPSBjKCJSVSIsICJVVSIpLCANCiAgICAgICAgICAgICAgICBkaXNjaXBsaW5lID0gInNvY2lvbG9neSIsIA0KICAgICAgICAgICAgICAgIHdhdmVzID0gbGlzdChjKDIwMTUsIDIwMTgpLCBjKDIwMTksIDIwMjMpKSwgDQogICAgICAgICAgICAgICAgdHlwZSA9IGMoImZpcnN0IikpDQoNCg0Kd2F2ZTEgPC0gdGVzdCRuZXRzWzEsLF0NCndhdmUyIDwtIHRlc3QkbmV0c1syLCxdDQoNCiNzb21lIGNoZWNrcw0KZGltKHdhdmUxKQ0KZGltKHdhdmUyKQ0KDQpzdW0oaXMubmEod2F2ZTEpKQ0KDQpzdW0oZGlhZyh3YXZlMSk9PTApDQoNCnN1bSh3YXZlMj4xKQ0KDQpzdW0od2F2ZTI+MCkNCg0KDQojbWFrZSBhcnJheQ0KbmV0cyA8LSBhcnJheShkYXRhID0gYyh3YXZlMSwgd2F2ZTIpLCBkaW0gPSBjKGRpbSh3YXZlMSksIDIpKQ0KDQojIGRlcGVuZGVudA0KbmV0IDwtIHNpZW5hRGVwZW5kZW50KG5ldHMpDQoNCiNpbmRlcGVuZGVudA0KZGY8LSB0ZXN0JGRhdGENCmRmX2VnbyA8LSBkby5jYWxsKHJiaW5kLmRhdGEuZnJhbWUsIGRmJGRlbW9ncmFwaGljcykNCg0KZGZfZWdvJEZ1bmN0aWUuMjJbaXMubmEoZGZfZWdvJEZ1bmN0aWUuMjIpXSA8LSAiLiINCmRmX2VnbyRGdW5jdGllLjI0W2lzLm5hKGRmX2VnbyRGdW5jdGllLjI0KV0gPC0gIi4iDQoNCmRmX2VnbyRmdW5jdGllIDwtIGlmZWxzZShkZl9lZ28kRnVuY3RpZS4yMj09Ikhvb2dsZXJhYXIiLCAxLCAwKQ0KZGZfZWdvJGZ1bmN0aWUgPC0gaWZlbHNlKGRmX2VnbyRGdW5jdGllLjI0PT0iSG9vZ2xlcmFhciIsIDEsIGRmX2VnbyRmdW5jdGllKQ0KZGZfZWdvJGZ1bmN0aWUgPC0gaWZlbHNlKGRmX2VnbyRGdW5jdGllLjIyPT0iQmlqem9uZGVyIGhvb2dsZXJhYXIiLCAxLCBkZl9lZ28kZnVuY3RpZSkNCmRmX2VnbyRmdW5jdGllIDwtIGlmZWxzZShkZl9lZ28kRnVuY3RpZS4yND09IkJpanpvbmRlciBob29nbGVyYWFyIiwgMSwgZGZfZWdvJGZ1bmN0aWUpDQoNCnRhYmxlKGRmX2VnbyRmdW5jdGllLCB1c2VOQT0iYWx3YXlzIikNCg0KZnVuY3RpZSA8LSBjb0NvdmFyKGRmX2VnbyRmdW5jdGllKQ0KDQpteWRhdGEgPC0gc2llbmFEYXRhQ3JlYXRlKG5ldCwgZnVuY3RpZSkNCg0KYGBgDQoNCiMgRWZmZWN0cw0KDQpgYGB7cn0NCm15ZWZmIDwtIGdldEVmZmVjdHMobXlkYXRhKQ0KbXllZmYNCg0KDQpgYGANCg0KI0luaXRhbCBEZXNjcmlwdGlvbg0KDQpgYGB7cn0NCmlmZWxzZSghZGlyLmV4aXN0cygicmVzdWx0cyIpLCBkaXIuY3JlYXRlKCJyZXN1bHRzIiksIEZBTFNFKQ0KDQpwcmludDAxUmVwb3J0KG15ZGF0YSwgbW9kZWxuYW1lID0gIi4vcmVzdWx0cy9maXJzdHRlc3Rfc2Nob2xhcnMiKQ0KDQpgYGANCg0KIyBTcGVjaWZ5IG1vZGVsDQoNCmBgYHtyfQ0KbXllZmYgPC0gZ2V0RWZmZWN0cyhteWRhdGEpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cygNCiAgbXllZmYsIA0KICBvdXRBY3QsDQogIGlzb2xhdGVOZXQNCikNCg0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGVnb1gsIGludGVyYWN0aW9uMSA9ICJmdW5jdGllIikNCg0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGFsdFgsIGludGVyYWN0aW9uMSA9ICJmdW5jdGllIikNCg0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIHNhbWVYLCBpbnRlcmFjdGlvbjEgPSAiZnVuY3RpZSIpDQogIA0KbXllZmYNCmBgYA0KDQojIEVzdGltYXRlDQoNCmBgYHtyfQ0KDQpteUFsZ29yaXRobSA8LSBzaWVuYUFsZ29yaXRobUNyZWF0ZShwcm9qbmFtZSA9ICJzY2hvbGFycyIpDQpFc3RNMSA8LSBzaWVuYTA3KG15QWxnb3JpdGhtLCBkYXRhID0gbXlkYXRhLCBlZmZlY3RzID0gbXllZmYsIHJldHVybkRlcHMgPSBUUlVFKQ0KDQpFc3RNMQ0KDQpgYGANCg0KIyBIb21ld29yaw0KDQpSZWFkIG1hbnVhbCwgcGljayBvbmUgcmVsZXZhbnQgc3RhdGlzdGljcyBpbiBjaGFwdGVyIDEyLiBQcmVzZW50LiBNYWtlIGRhdGEgcmVhZHkuDQoNCiFbXShpbWFnZXMvU2ltWCUyMC5qcGcpDQoNCmBgYHtyfQ0KI3N0YXJ0IGNsZWFuDQpybShsaXN0PWxzKCkpDQpgYGANCg0KYGBge3J9DQojQ3VzdG9tIGZ1bmN0aW9ucw0KZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsNCiAgICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgICAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgICAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgICAgICB9DQogICAgfSkNCn0NCg0KZnNhdmUgPC0gZnVuY3Rpb24oeCwgZmlsZSA9IE5VTEwsIGxvY2F0aW9uID0gIi4vZGF0YS9wcm9jZXNzZWQvIikgew0KICAgIGlmZWxzZSghZGlyLmV4aXN0cygiZGF0YSIpLCBkaXIuY3JlYXRlKCJkYXRhIiksIEZBTFNFKQ0KICAgIGlmZWxzZSghZGlyLmV4aXN0cygiZGF0YS9wcm9jZXNzZWQiKSwgZGlyLmNyZWF0ZSgiZGF0YS9wcm9jZXNzZWQiKSwgRkFMU0UpDQogICAgaWYgKGlzLm51bGwoZmlsZSkpDQogICAgICAgIGZpbGUgPSBkZXBhcnNlKHN1YnN0aXR1dGUoeCkpDQogICAgZGF0ZW5hbWUgPC0gc3Vic3RyKGdzdWIoIls6LV0iLCAiIiwgU3lzLnRpbWUoKSksIDEsIDgpDQogICAgdG90YWxuYW1lIDwtIHBhc3RlKGxvY2F0aW9uLCBkYXRlbmFtZSwgZmlsZSwgIi5yZGEiLCBzZXAgPSAiIikNCiAgICBzYXZlKHgsIGZpbGUgPSB0b3RhbG5hbWUpICAjbmVlZCB0byBmaXggaWYgZmlsZSBpcyByZWxvYWRlZCBhcyBpbnB1dCBuYW1lLCBub3QgYXMgeC4gDQp9DQoNCmZsb2FkIDwtIGZ1bmN0aW9uKGZpbGVuYW1lKSB7DQogICAgbG9hZChmaWxlbmFtZSkNCiAgICBnZXQobHMoKVtscygpICE9ICJmaWxlbmFtZSJdKQ0KfQ0KDQpmc2hvd2RmIDwtIGZ1bmN0aW9uKHgsIC4uLikgew0KICAgIGtuaXRyOjprYWJsZSh4LCBkaWdpdHMgPSAyLCAiaHRtbCIsIC4uLikgJT4lDQogICAgICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpICU+JQ0KICAgICAgICBrYWJsZUV4dHJhOjpzY3JvbGxfYm94KHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMzAwcHgiKQ0KfQ0KDQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikgew0KICAgIHNwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgeCkNCn0NCg0KI3RoZSBiaWcgb25lDQpmY29sbmV0IDwtIGZ1bmN0aW9uKGRhdGEgPSBzY2hvbGFycywgdW5pdmVyc2l0eSA9ICJSVSIsIGRpc2NpcGxpbmUgPSAic29jaW9sb2d5Iiwgd2F2ZXMgPSBsaXN0KGMoMjAxNSwNCiAgICAyMDE4KSwgYygyMDE5LCAyMDIzKSksIHR5cGUgPSBjKCJmaXJzdCIpKSB7DQoNCiAgICAjIHN0ZXAgMQ0KICAgIGRlbW9ncmFwaGljcyA8LSBkby5jYWxsKHJiaW5kLmRhdGEuZnJhbWUsIGRhdGEkZGVtb2dyYXBoaWNzKQ0KICAgIGRlbW9ncmFwaGljcyA8LSBkZW1vZ3JhcGhpY3MgJT4lDQogICAgICAgIG11dGF0ZShVbml2ZXJzaXRlaXQxLjIyID0gcmVwbGFjZShVbml2ZXJzaXRlaXQxLjIyLCBpcy5uYShVbml2ZXJzaXRlaXQxLjIyKSwgIiIpLCBVbml2ZXJzaXRlaXQyLjIyID0gcmVwbGFjZShVbml2ZXJzaXRlaXQyLjIyLA0KICAgICAgICAgICAgaXMubmEoVW5pdmVyc2l0ZWl0Mi4yMiksICIiKSwgVW5pdmVyc2l0ZWl0MS4yNCA9IHJlcGxhY2UoVW5pdmVyc2l0ZWl0MS4yNCwgaXMubmEoVW5pdmVyc2l0ZWl0MS4yNCksDQogICAgICAgICAgICAiIiksIFVuaXZlcnNpdGVpdDIuMjQgPSByZXBsYWNlKFVuaXZlcnNpdGVpdDIuMjQsIGlzLm5hKFVuaXZlcnNpdGVpdDIuMjQpLCAiIiksIGRpc2NpcGxpbmUuMjIgPSByZXBsYWNlKGRpc2NpcGxpbmUuMjIsDQogICAgICAgICAgICBpcy5uYShkaXNjaXBsaW5lLjIyKSwgIiIpLCBkaXNjaXBsaW5lLjI0ID0gcmVwbGFjZShkaXNjaXBsaW5lLjI0LCBpcy5uYShkaXNjaXBsaW5lLjI0KSwgIiIpKQ0KDQogICAgc2FtcGxlIDwtIHdoaWNoKChkZW1vZ3JhcGhpY3MkVW5pdmVyc2l0ZWl0MS4yMiAlaW4lIHVuaXZlcnNpdHkgfCBkZW1vZ3JhcGhpY3MkVW5pdmVyc2l0ZWl0Mi4yMiAlaW4lDQogICAgICAgIHVuaXZlcnNpdHkgfCBkZW1vZ3JhcGhpY3MkVW5pdmVyc2l0ZWl0MS4yNCAlaW4lIHVuaXZlcnNpdHkgfCBkZW1vZ3JhcGhpY3MkVW5pdmVyc2l0ZWl0Mi4yNCAlaW4lDQogICAgICAgIHVuaXZlcnNpdHkpICYgKGRlbW9ncmFwaGljcyRkaXNjaXBsaW5lLjIyICVpbiUgZGlzY2lwbGluZSB8IGRlbW9ncmFwaGljcyRkaXNjaXBsaW5lLjI0ICVpbiUgZGlzY2lwbGluZSkpDQoNCiAgICBkZW1vZ3JhcGhpY3Nfc29jIDwtIGRlbW9ncmFwaGljc1tzYW1wbGUsIF0NCiAgICBzY2hvbGFyc19zZWwgPC0gbGFwcGx5KHNjaG9sYXJzLCAiWyIsIHNhbXBsZSkNCg0KICAgICMgc3RlcCAyDQogICAgaWRzIDwtIGRlbW9ncmFwaGljc19zb2MkYXVfaWQNCiAgICBud2F2ZXMgPC0gbGVuZ3RoKHdhdmVzKQ0KICAgIG5ldHMgPC0gYXJyYXkoMCwgZGltID0gYyhud2F2ZXMsIGxlbmd0aChpZHMpLCBsZW5ndGgoaWRzKSksIGRpbW5hbWVzID0gbGlzdCh3YXZlID0gMTpud2F2ZXMsIGlkcywNCiAgICAgICAgaWRzKSkNCiAgICBkaW1uYW1lcyhuZXRzKQ0KDQogICAgIyBzdGVwIDMNCiAgICBkZl93b3JrcyA8LSB0aWJibGUod29ya3NfaWQgPSB1bmxpc3QobGFwcGx5KHNjaG9sYXJzX3NlbCR3b3JrLCBmdW5jdGlvbihsKSBsJGlkKSksIHdvcmtzX2F1dGhvciA9IHVubGlzdChsYXBwbHkoc2Nob2xhcnNfc2VsJHdvcmssDQogICAgICAgIGZ1bmN0aW9uKGwpIGwkYXV0aG9yKSwgcmVjdXJzaXZlID0gRkFMU0UpLCB3b3Jrc195ZWFyID0gdW5saXN0KGxhcHBseShzY2hvbGFyc19zZWwkd29yaywgZnVuY3Rpb24obCkgbCRwdWJsaWNhdGlvbl95ZWFyKSwNCiAgICAgICAgcmVjdXJzaXZlID0gRkFMU0UpKQ0KDQogICAgZGZfd29ya3MgPC0gZGZfd29ya3NbIWR1cGxpY2F0ZWQoZGZfd29ya3MpLCBdDQoNCiAgICAjIHN0ZXAgNA0KICAgIGlmICh0eXBlID09ICJmaXJzdCIpIHsNCiAgICAgICAgZm9yIChqIGluIDE6bndhdmVzKSB7DQogICAgICAgICAgICBkZl93b3Jrc193IDwtIGRmX3dvcmtzW2RmX3dvcmtzJHdvcmtzX3llYXIgPj0gd2F2ZXNbW2pdXVsxXSAmIGRmX3dvcmtzJHdvcmtzX3llYXIgPD0gd2F2ZXNbW2pdXVsyXSwNCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBmb3IgKGkgaW4gMTpucm93KGRmX3dvcmtzX3cpKSB7DQogICAgICAgICAgICAgICAgZWdvIDwtIGRmX3dvcmtzX3ckd29ya3NfYXV0aG9yW2ldW1sxXV0kYXVfaWRbMV0NCiAgICAgICAgICAgICAgICBhbHRlcnMgPC0gZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZFstMV0NCiAgICAgICAgICAgICAgICBpZiAoc3VtKGlkcyAlaW4lIGVnbykgPiAwICYgc3VtKGlkcyAlaW4lIGFsdGVycykgPiAwKSB7DQogICAgICAgICAgICAgICAgICBuZXRzW2osIHdoaWNoKGlkcyAlaW4lIGVnbyksIHdoaWNoKGlkcyAlaW4lIGFsdGVycyldIDwtIDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAodHlwZSA9PSAibGFzdCIpIHsNCiAgICAgICAgZm9yIChqIGluIDE6bndhdmVzKSB7DQogICAgICAgICAgICBkZl93b3Jrc193IDwtIGRmX3dvcmtzW2RmX3dvcmtzJHdvcmtzX3llYXIgPj0gd2F2ZXNbW2pdXVsxXSAmIGRmX3dvcmtzJHdvcmtzX3llYXIgPD0gd2F2ZXNbW2pdXVsyXSwNCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBmb3IgKGkgaW4gMTpucm93KGRmX3dvcmtzX3cpKSB7DQogICAgICAgICAgICAgICAgZWdvIDwtIHJldihkZl93b3Jrc193JHdvcmtzX2F1dGhvcltpXVtbMV1dJGF1X2lkKVsxXQ0KICAgICAgICAgICAgICAgIGFsdGVycyA8LSByZXYoZGZfd29ya3NfdyR3b3Jrc19hdXRob3JbaV1bWzFdXSRhdV9pZClbLTFdDQogICAgICAgICAgICAgICAgaWYgKHN1bShpZHMgJWluJSBlZ28pID4gMCAmIHN1bShpZHMgJWluJSBhbHRlcnMpID4gMCkgew0KICAgICAgICAgICAgICAgICAgbmV0c1tqLCB3aGljaChpZHMgJWluJSBlZ28pLCB3aGljaChpZHMgJWluJSBhbHRlcnMpXSA8LSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHR5cGUgPT0gImFsbCIpIHsNCiAgICAgICAgZm9yIChqIGluIDE6bndhdmVzKSB7DQogICAgICAgICAgICBkZl93b3Jrc193IDwtIGRmX3dvcmtzW2RmX3dvcmtzJHdvcmtzX3llYXIgPj0gd2F2ZXNbW2pdXVsxXSAmIGRmX3dvcmtzJHdvcmtzX3llYXIgPD0gd2F2ZXNbW2pdXVsyXSwNCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBmb3IgKGkgaW4gMTpucm93KGRmX3dvcmtzX3cpKSB7DQogICAgICAgICAgICAgICAgZWdvcyA8LSBkZl93b3Jrc193JHdvcmtzX2F1dGhvcltpXVtbMV1dJGF1X2lkDQogICAgICAgICAgICAgICAgaWYgKHN1bShpZHMgJWluJSBlZ29zKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgIG5ldHNbaiwgd2hpY2goaWRzICVpbiUgZWdvcyksIHdoaWNoKGlkcyAlaW4lIGVnb3MpXSA8LSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIG91dHB1dCA8LSBsaXN0KCkNCiAgICBvdXRwdXQkZGF0YSA8LSBzY2hvbGFyc19zZWwNCiAgICBvdXRwdXQkbmV0cyA8LSBuZXRzDQogICAgcmV0dXJuKG91dHB1dCkNCn0NCg0KZnBhY2thZ2UuY2hlY2soYygidGlkeXZlcnNlIiwgIlJTaWVuYSIpKQ0KDQpgYGANCg0KIyBBZGQgY2l0YXRpb25zIHRvIHRoZSBkYXRhDQoNCmBgYHtyfQ0Kc2Nob2xhcnMgPC0gZmxvYWQoIkM6L1VzZXJzL2thbGxlL09uZURyaXZlL0RvY3VtZW50ZW4vUkVNQS9KYWFyIDIvU29jaWFsIE5ldHdvcmtzL0tTX2xhYmpvdXJuYWwvZGF0YS9wcm9jZXNzZWQvc2Nob2xhcnNfMjAyNDA5MjQucmRhIikNCg0KDQpzY2hvbGFyc19uZXQgPC0gZmNvbG5ldChkYXRhID0gc2Nob2xhcnMsIA0KICAgICAgICAgICAgICAgIHVuaXZlcnNpdHkgPSBjKCJSVSIsICJVVSIsICJSVUciLCAiVXZBIiwgIlZVIiwgIkVVUiIsICJMZWlkZW4iLCAiVXZUIiksIA0KICAgICAgICAgICAgICAgIGRpc2NpcGxpbmUgPSBjKCJzb2Npb2xvZ3kiLCAicG9saXRpY2FsIHNjaWVuY2UiKSwgDQogICAgICAgICAgICAgICAgd2F2ZXMgPSBsaXN0KGMoMjAxNSwgMjAxOCksIGMoMjAxOSwgMjAyMykpLCANCiAgICAgICAgICAgICAgICB0eXBlID0gYygiYWxsIikpDQoNCmRmX2VnbyA8LSBkby5jYWxsKHJiaW5kLmRhdGEuZnJhbWUsIHNjaG9sYXJzX25ldCRkYXRhJGRlbW9ncmFwaGljcykNCg0KZGZfY2l0YXRpb25zIDwtICBmbG9hZCgiQzovVXNlcnMva2FsbGUvT25lRHJpdmUvRG9jdW1lbnRlbi9SRU1BL0phYXIgMi9Tb2NpYWwgTmV0d29ya3MvS1NfbGFiam91cm5hbC9kYXRhL3Byb2Nlc3NlZC9kZl8yMDI1MDkyOS5yZGEiKQ0KDQojbWVyZ2luZw0KZGZfZWdvIDwtIGRmX2VnbyB8Pg0KICBsZWZ0X2pvaW4oZGZfY2l0YXRpb25zIHw+IHNlbGVjdChOYWFtLCBjaXRhdGlvbnNfdzEsIGNpdGF0aW9uc193MiksDQogICAgICAgICAgICBieSA9ICJOYWFtIikNCg0KYGBgDQoNCiMgbWFrZSBvcmRpbmFsIHZhcmlhYmxlIGZ1bmN0aW9uDQoNCmBgYHtyfQ0KDQp0YWJsZShkZl9lZ28kRnVuY3RpZS4yNCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KI2NhdGVnb3JpZXM6DQojKGJpanpvbmRlcikgaG9vZ2xlcmFhciwgVUhELCBVRCwgcG9zdGRvYy9zZW5pb3IvZG9jZW50L3Jlc2VhcmNoZXIsIFBoRCAoZXh0ZXJuYWwpLg0KDQoNCmRmX2VnbyA8LSBkZl9lZ28gfD4NCiAgbXV0YXRlKGZ1bmN0aWVfbGV2ZWwgPQ0KICAgICAgICAgICBjYXNlX3doZW4oDQogICAgICAgICAgICAgZ3JlcGwoImhvb2dsZXJhYXJ8cHJvZmVzc29yIiwgdG9sb3dlcihGdW5jdGllLjI0KSkgfiA1LA0KICAgICAgICAgICAgIGdyZXBsKCJ1bml2ZXJzaXRhaXIgaG9vZmRkb2NlbnR8dWhkIiwgdG9sb3dlcihGdW5jdGllLjI0KSkgfiA0LA0KICAgICAgICAgICAgIGdyZXBsKCJ1bml2ZXJzaXRhaXIgZG9jZW50fHVudmVyc2l0YWlyIGRvY2VudCIsIHRvbG93ZXIoRnVuY3RpZS4yNCkpIH4gMywNCiAgICAgICAgICAgICBncmVwbCgicG9zdGRvY3xzZW5pb3J8ZmVsbG93IiwgdG9sb3dlcihGdW5jdGllLjI0KSkgfiAyLA0KICAgICAgICAgICAgIHRvbG93ZXIoRnVuY3RpZS4yNCkgJWluJSBjKA0KICAgICAgICAgICAgICAgImRvY2VudCIsICJsZWN0dXJlciIsICJvbmRlcnpvZWtlciIsICJvbmRlcnpvZWtlci9sZWN0dXJlciIsIA0KICAgICAgICAgICAgICAgImxlY3R1cmVyIGFuZCByZXNlYXJjaGVyIiwgImxlY3R1cmVyL3Jlc2VhcmNoZXIiLCANCiAgICAgICAgICAgICAgICJkb2NlbnQgKGdlcGVuc2lvbmVlcmQpIiwgImRvY2VudD8iLCAiZ2FzdC8gb25kZXJ6b2VrZXIiLCANCiAgICAgICAgICAgICAgICJnYXN0b25kZXJ6b2VrZXIiLCAiZ2VwZW5zaW9uZWVyZCBkb2NlbnQgc29jaW9sb2dpZSIsIA0KICAgICAgICAgICAgICAgImd1ZXN0IHJlc2VhcmNoZXIiDQogICAgICAgICAgICAgKSB+IDIsDQogICAgICAgICAgICAgdG9sb3dlcihGdW5jdGllLjI0KSAlaW4lIGMoImRvY3RvcmFsIHJlc2VhcmNoZXIiLCAiZG9jdG9yYWwgc3R1ZGVudCIsICJwYXJ0LXRpbWUgZG9jdG9yYWwgcmVzZWFyY2hlciIpIH4gMSwNCiAgICAgICAgICAgICBncmVwbCgicGhkfGp1bmlvcnxwcm9tb3ZlbmR1cyIsIHRvbG93ZXIoRnVuY3RpZS4yNCkpIH4gMSwNCiAgICAgICAgICAgICAuZGVmYXVsdCA9IE5BDQogICAgICAgICAgICkNCiAgICAgICAgICkNCg0KDQp0YWJsZShkZl9lZ28kZnVuY3RpZV9sZXZlbCwgZGZfZWdvJEZ1bmN0aWUuMjQsIHVzZU5BPSJhbHdheXMiKQ0KdGFibGUoZGZfZWdvJGZ1bmN0aWVfbGV2ZWwsIHVzZU5BID0gImFsd2F5cyIpDQoNCmZzYXZlKGRmX2VnbykNCg0KYGBgDQoNCiMgRmlyc3QgYW5hbHlzZXMgKHVuZGlyZWN0ZWQgbmV0d29yaykNCg0KIyMgSG9tb3BoaWx5Pw0KDQpgYGB7cn0NCiNTdGVwIDE6IGRlZmluZSBkYXRhDQoNCndhdmUxIDwtIHNjaG9sYXJzX25ldCRuZXRzWzEsLF0NCndhdmUyIDwtIHNjaG9sYXJzX25ldCRuZXRzWzIsLF0NCg0KIyNzb21lIGNoZWNrcw0KZGltKHdhdmUxKQ0KZGltKHdhdmUyKQ0KDQojc2hvdWxkIGJlIDANCnN1bShpcy5uYSh3YXZlMSkpDQoNCiNzZXQgZGlhZ29uYWwgdG8gMA0Kc3VtKGRpYWcod2F2ZTIpPT0wKQ0KDQpkaWFnKHdhdmUxKSA8LSAwDQpkaWFnKHdhdmUyKSA8LSAwDQoNCiNvbmx5IDFzIGFuZCAwcw0Kc3VtKHdhdmUxPjEpDQoNCiNhdCBsZWFzdCBzb21lIDFzDQpzdW0od2F2ZTE+MCkNCg0KDQojbWFrZSBhcnJheQ0KbmV0cyA8LSBhcnJheShkYXRhID0gYyh3YXZlMSwgd2F2ZTIpLCBkaW0gPSBjKGRpbSh3YXZlMSksIDIpKQ0KDQojIGRlcGVuZGVudA0KbmV0IDwtIHNpZW5hRGVwZW5kZW50KG5ldHMpDQoNCiNpbmRlcGVuZGVudA0KDQpmdW5jdGllIDwtIGNvQ292YXIoZGZfZWdvJGZ1bmN0aWVfbGV2ZWwpDQoNCm15ZGF0YSA8LSBzaWVuYURhdGFDcmVhdGUobmV0LCBmdW5jdGllKQ0KDQpgYGANCg0KYGBge3J9DQojU3RlcCAyOiBlZmZlY3RzDQpteWVmZiA8LSBnZXRFZmZlY3RzKG15ZGF0YSkNCm15ZWZmDQoNCmBgYA0KDQpgYGB7cn0NCiNTdGVwIDM6IGluaXRpYWwgZGVzY3JpcHRpb24NCg0KcHJpbnQwMVJlcG9ydChteWRhdGEsIG1vZGVsbmFtZSA9ICIuL3Jlc3VsdHMvc2Vjb25kdGVzdF9zY2hvbGFycyIpDQoNCmBgYA0KDQpgYGB7cn0NCiNzdGVwIDQ6IHNwZWNpZnkgbW9kZWwNCm15ZWZmIDwtIGdldEVmZmVjdHMobXlkYXRhKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGd3ZXNwLCBvdXRBY3QpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgc2ltWCwgaW50ZXJhY3Rpb24xID0gImZ1bmN0aWUiKQ0KDQpteWVmZg0KYGBgDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPVRSVUV9DQojRXN0aW1hdGUNCm15QWxnb3JpdGhtIDwtIHNpZW5hQWxnb3JpdGhtQ3JlYXRlKHByb2puYW1lID0gInNjaG9sYXJzIikNCkVzdE0xIDwtIHNpZW5hMDcobXlBbGdvcml0aG0sIGRhdGEgPSBteWRhdGEsIGVmZmVjdHMgPSBteWVmZiwgcmV0dXJuRGVwcyA9IFRSVUUpDQoNCkVzdE0xDQoNCmBgYA0K