1 Relatório criado por

2 Luis Anunciação, Lucas Barrozo, Julia swerts e Carina Dana

3 Não é permitido reproduzir sem autorização

pacman::p_load(tidyverse)

4 Simone

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) #get all sheet names
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets #get names only
    x #return
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Desktop/Matriz de competências - Itens para professores - versao luis - respostas Simone (1).xlsx")

list2env(setNames(excel_list, #list
                  paste0("est1_",janitor::make_clean_names(names(excel_list)))),  #fixing different names and other patterns
         envir=.GlobalEnv) #where?

#list2env(excel_list, .GlobalEnv)

4.1 Fix 1 (row names to columns)

colnames(est1_x1_autoconhecimento) <- est1_x1_autoconhecimento[1, ]
est1_x1_autoconhecimento = est1_x1_autoconhecimento[-1, ]

4.2 Fix 2 (Clean names)

est1_x1_autoconhecimento <- janitor::clean_names(est1_x1_autoconhecimento)

4.3 Fix 3 (get only focal variables)

est1_x1_autoconhecimento <- est1_x1_autoconhecimento %>% 
  select(5:9)

4.4 Fix 4 (Insert main name and specialist)

est1_x1_autoconhecimento <- est1_x1_autoconhecimento %>% 
  mutate(habilidade = "autoconhecimento") %>% 
  mutate(specialist = "simone") %>% 
  select(habilidade, specialist, everything())

4.5 Fix 5 (cerfify factor level)

est1_x1_autoconhecimento <- est1_x1_autoconhecimento %>% 
  mutate(across(starts_with("voce_julga"), as.numeric))

5 fix 6 (add item number)

Estamos assumindo que ninguém mudou a ordem das linhas

est1_x1_autoconhecimento <- est1_x1_autoconhecimento %>% 
  mutate(item_number = row_number())

5.1 Check

est1_x1_autoconhecimento

6 Olga

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) #get all sheet names
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets #get names only
    x #return
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Desktop/Matriz de competências - Itens para professores - versao luis (1) - olga.xlsx")

list2env(setNames(excel_list, #list
                  paste0("est1_olga_",janitor::make_clean_names(names(excel_list)))),  #fixing different names and other patterns
         envir=.GlobalEnv) #where?

#list2env(excel_list, .GlobalEnv)

6.1 Fix 1 (row names to columns)

colnames(est1_olga_x1_autoconhecimento) <- est1_olga_x1_autoconhecimento[1, ]
est1_olga_x1_autoconhecimento = est1_olga_x1_autoconhecimento[-1, ]

6.2 Fix 2 (Clean names)

est1_olga_x1_autoconhecimento <- janitor::clean_names(est1_olga_x1_autoconhecimento)

6.3 Fix 3 (get only focal variables)

est1_olga_x1_autoconhecimento <- est1_olga_x1_autoconhecimento %>% 
  select(5:9)

6.4 Fix 4 (Insert main name and specialist)

est1_olga_x1_autoconhecimento <- est1_olga_x1_autoconhecimento %>% 
  mutate(habilidade = "autoconhecimento") %>% 
  mutate(specialist = "Olga") %>% 
  select(habilidade, specialist, everything())

6.5 Fix 5 (cerfify factor level)

est1_olga_x1_autoconhecimento <- est1_olga_x1_autoconhecimento %>% 
  mutate(across(starts_with("voce_julga"), as.numeric))

7 fix 6 (add item number)

Estamos assumindo que ninguém mudou a ordem das linhas

est1_olga_x1_autoconhecimento <- est1_olga_x1_autoconhecimento %>% 
  mutate(item_number = row_number())

7.1 Check

est1_olga_x1_autoconhecimento

8 Carmen

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) #get all sheet names
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets #get names only
    x #return
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Desktop/Matriz de competências - Itens para professores - versao carmen (1).xlsx")

list2env(setNames(excel_list, #list
                  paste0("est1_carmem_",janitor::make_clean_names(names(excel_list)))),  #fixing different names and other patterns
         envir=.GlobalEnv) #where?

#list2env(excel_list, .GlobalEnv)

8.1 Fix 1 (row names to columns)

colnames(est1_carmem_x1_autoconhecimento) <- est1_carmem_x1_autoconhecimento[1, ]
est1_carmem_x1_autoconhecimento = est1_carmem_x1_autoconhecimento[-1, ]

8.2 Fix 2 (Clean names)

est1_carmem_x1_autoconhecimento <- janitor::clean_names(est1_carmem_x1_autoconhecimento)

8.3 Fix 3 (get only focal variables)

est1_carmem_x1_autoconhecimento <- est1_carmem_x1_autoconhecimento %>% 
  select(5:9)

8.4 Fix 4 (Insert main name and specialist)

est1_carmem_x1_autoconhecimento <- est1_carmem_x1_autoconhecimento %>% 
  mutate(habilidade = "autoconhecimento") %>% 
  mutate(specialist = "Carmem") %>% 
  select(habilidade, specialist, everything())

8.5 Fix 5 (cerfify factor level)

est1_carmem_x1_autoconhecimento <- est1_carmem_x1_autoconhecimento %>% 
  mutate(across(starts_with("voce_julga"), as.numeric))

9 fix 6 (add item number)

Estamos assumindo que ninguém mudou a ordem das linhas

est1_carmem_x1_autoconhecimento <- est1_carmem_x1_autoconhecimento %>% 
  mutate(item_number = row_number())

9.1 Check

est1_carmem_x1_autoconhecimento

10 Josi

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) #get all sheet names
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets #get names only
    x #return
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Desktop/Matriz de competências - Itens para professores - versao luis (2) josi.xlsx")

list2env(setNames(excel_list, #list
                  paste0("est1_josi_",janitor::make_clean_names(names(excel_list)))),  #fixing different names and other patterns
         envir=.GlobalEnv) #where?

#list2env(excel_list, .GlobalEnv)

10.1 Fix 1 (row names to columns)

colnames(est1_josi_x1_autoconhecimento) <- est1_josi_x1_autoconhecimento[1, ]
est1_josi_x1_autoconhecimento = est1_josi_x1_autoconhecimento[-1, ]

10.2 Fix 2 (Clean names)

est1_josi_x1_autoconhecimento <- janitor::clean_names(est1_josi_x1_autoconhecimento)

10.3 Fix 3 (get only focal variables)

est1_josi_x1_autoconhecimento <- est1_josi_x1_autoconhecimento %>% 
  select(5:9)

10.4 Fix 4 (Insert main name and specialist)

est1_josi_x1_autoconhecimento <- est1_josi_x1_autoconhecimento %>% 
  mutate(habilidade = "autoconhecimento") %>% 
  mutate(specialist = "Josi") %>% 
  select(habilidade, specialist, everything())

10.5 Fix 5 (cerfify factor level)

est1_josi_x1_autoconhecimento <- est1_josi_x1_autoconhecimento %>% 
  mutate(across(starts_with("voce_julga"), as.numeric))

11 fix 6 (add item number)

Estamos assumindo que ninguém mudou a ordem das linhas

est1_josi_x1_autoconhecimento <- est1_josi_x1_autoconhecimento %>% 
  mutate(item_number = row_number())

11.1 Check

est1_josi_x1_autoconhecimento

12 Murilo

read_excel_allsheets <- function(filename) {
    sheets <- readxl::excel_sheets(filename) #get all sheet names
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    names(x) <- sheets #get names only
    x #return
}

excel_list <- read_excel_allsheets("C:/Users/luisf/Desktop/Matriz de competências - Itens para professores - Notras Murillo.xlsx")

list2env(setNames(excel_list, #list
                  paste0("est1_murilo_",janitor::make_clean_names(names(excel_list)))),  #fixing different names and other patterns
         envir=.GlobalEnv) #where?

#list2env(excel_list, .GlobalEnv)

12.1 Fix 1 (row names to columns)

colnames(est1_murilo_x1_autoconhecimento) <- est1_murilo_x1_autoconhecimento[1, ]
est1_murilo_x1_autoconhecimento = est1_murilo_x1_autoconhecimento[-1, ]

12.2 Fix 2 (Clean names)

est1_murilo_x1_autoconhecimento <- janitor::clean_names(est1_murilo_x1_autoconhecimento)

12.3 Fix 3 (get only focal variables)

est1_murilo_x1_autoconhecimento <- est1_murilo_x1_autoconhecimento %>% 
  select(5:9)

12.4 Fix 4 (Insert main name and specialist)

est1_murilo_x1_autoconhecimento <- est1_murilo_x1_autoconhecimento %>% 
  mutate(habilidade = "autoconhecimento") %>% 
  mutate(specialist = "Murilo") %>% 
  select(habilidade, specialist, everything())

12.5 Fix 5 (cerfify factor level)

est1_murilo_x1_autoconhecimento <- est1_murilo_x1_autoconhecimento %>% 
  mutate(across(starts_with("voce_julga"), as.numeric))

13 fix 6 (add item number)

Estamos assumindo que ninguém mudou a ordem das linhas

est1_murilo_x1_autoconhecimento <- est1_murilo_x1_autoconhecimento %>% 
  mutate(item_number = row_number())

13.1 Check

est1_murilo_x1_autoconhecimento

14 Merge autoconhecimento

base_autoconhecimento <- bind_rows(
  est1_x1_autoconhecimento, #simone
  est1_olga_x1_autoconhecimento)

base_autoconhecimento <- bind_rows(base_autoconhecimento,
                                   est1_carmem_x1_autoconhecimento)

base_autoconhecimento <- bind_rows(base_autoconhecimento,
                                   est1_josi_x1_autoconhecimento)

base_autoconhecimento <- bind_rows(base_autoconhecimento,
                                   est1_murilo_x1_autoconhecimento)

14.1 Check

base_autoconhecimento %>% 
  arrange(item_number) %>%
  select(item_number, specialist, conteudo, everything()) %>% 
  utils::View(.)

14.2 Média da clareza para Criança

mean(base_autoconhecimento$voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca, na.rm=T)
[1] 3.784969

14.3 Média da clareza para Adolescente

mean(base_autoconhecimento$voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente, na.rm=T)
[1] 4.649269

14.4 Média da pertinencia

mean(base_autoconhecimento$voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento, na.rm=T)
[1] 4.206681

15 Resultado Geral

base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(., na.rm=T)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  arrange(desc(crianca)) %>% 
  #left_join(., base_autoconhecimento %>% select(item_number, conteudo)) %>% 
  #rownames_to_column("posicao") %>% 
  #select(-posicao) %>% 
  #distinct(., .keep_all = TRUE) %>% 
    DT::datatable()

16 Resultado Media 3

base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(., na.rm=T)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  filter(crianca > 3 & adolescente > 3 & pertinencia > 3) %>% 
  #left_join(., base_autoconhecimento %>% select(item_number, conteudo)) %>% 
  #rownames_to_column("posicao") %>% 
  #select(-posicao) %>% 
  #distinct(., .keep_all = TRUE) %>% 
   DT::datatable()

17 Resultado Media 3 com conteudo

base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(., na.rm=T)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  filter(crianca > 3 & adolescente > 3 & pertinencia > 3) %>% 
  left_join(., base_autoconhecimento %>% select(item_number, conteudo)) %>% 
  rownames_to_column("posicao") %>% 
  select(-posicao) %>% 
  distinct(., .keep_all = TRUE) %>% 
    DT::datatable()
Joining, by = "item_number"

18 Criancas! Resultado Media 3 para crianca e pertinencia 3

base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(., na.rm=T)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  filter(crianca > 3 & pertinencia > 3) %>% 
  left_join(., base_autoconhecimento %>% select(item_number, conteudo)) %>% 
  rownames_to_column("posicao") %>% 
  select(-posicao) %>% 
  distinct(., .keep_all = TRUE) %>% 
  select(-adolescente) %>% 
    DT::datatable()
Joining, by = "item_number"

19 Adolescentes! Resultado Media 3 para adolescentes e pertinencia 3

base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(., na.rm=T)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  filter(adolescente > 3 & pertinencia > 3) %>% 
  left_join(., base_autoconhecimento %>% select(item_number, conteudo)) %>% 
  rownames_to_column("posicao") %>% 
  select(-posicao) %>% 
  distinct(., .keep_all = TRUE) %>% 
  select(-crianca) %>% 
    DT::datatable()
Joining, by = "item_number"
base_autoconhecimento %>% 
  group_by(item_number) %>% 
  summarise_at(vars(voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca:voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento),
               ~mean(.)) %>% 
  rename(crianca = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_uma_crianca) %>% 
  rename(adolescente = voce_julgas_que_este_item_e_claro_para_ser_entendido_por_um_adolescente) %>% 
  rename(pertinencia = voce_julga_que_este_item_e_pertinente_para_medir_o_que_se_propoe_por_exemplo_autoconhecimento) %>% 
  pivot_longer(item_number) %>% 
  ggplot(., aes(x = fct_inorder(factor(value), crianca), y = crianca)) +
  geom_bar(stat = "summary") + 
  coord_flip()
LS0tDQp0aXRsZTogIkVzY29sYSBkYSBJbnRlbGlnw6puY2lhIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQojIFJlbGF0w7NyaW8gY3JpYWRvIHBvcg0KIyBMdWlzIEFudW5jaWHDp8OjbywgTHVjYXMgQmFycm96bywgSnVsaWEgc3dlcnRzIGUgQ2FyaW5hIERhbmENCiMgTsOjbyDDqSBwZXJtaXRpZG8gcmVwcm9kdXppciBzZW0gYXV0b3JpemHDp8Ojbw0KDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSkNCmBgYA0KDQoNCiMgU2ltb25lIA0KYGBge3J9DQpyZWFkX2V4Y2VsX2FsbHNoZWV0cyA8LSBmdW5jdGlvbihmaWxlbmFtZSkgew0KICAgIHNoZWV0cyA8LSByZWFkeGw6OmV4Y2VsX3NoZWV0cyhmaWxlbmFtZSkgI2dldCBhbGwgc2hlZXQgbmFtZXMNCiAgICB4IDwtIGxhcHBseShzaGVldHMsIGZ1bmN0aW9uKFgpIHJlYWR4bDo6cmVhZF9leGNlbChmaWxlbmFtZSwgc2hlZXQgPSBYKSkNCiAgICBuYW1lcyh4KSA8LSBzaGVldHMgI2dldCBuYW1lcyBvbmx5DQogICAgeCAjcmV0dXJuDQp9DQoNCmV4Y2VsX2xpc3QgPC0gcmVhZF9leGNlbF9hbGxzaGVldHMoIkM6L1VzZXJzL2x1aXNmL0Rlc2t0b3AvTWF0cml6IGRlIGNvbXBldMOqbmNpYXMgLSBJdGVucyBwYXJhIHByb2Zlc3NvcmVzIC0gdmVyc2FvIGx1aXMgLSByZXNwb3N0YXMgU2ltb25lICgxKS54bHN4IikNCg0KbGlzdDJlbnYoc2V0TmFtZXMoZXhjZWxfbGlzdCwgI2xpc3QNCiAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZXN0MV8iLGphbml0b3I6Om1ha2VfY2xlYW5fbmFtZXMobmFtZXMoZXhjZWxfbGlzdCkpKSksICAjZml4aW5nIGRpZmZlcmVudCBuYW1lcyBhbmQgb3RoZXIgcGF0dGVybnMNCiAgICAgICAgIGVudmlyPS5HbG9iYWxFbnYpICN3aGVyZT8NCg0KI2xpc3QyZW52KGV4Y2VsX2xpc3QsIC5HbG9iYWxFbnYpDQpgYGANCg0KDQojIyBGaXggMSAocm93IG5hbWVzIHRvIGNvbHVtbnMpDQoNCmBgYHtyfQ0KY29sbmFtZXMoZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvKSA8LSBlc3QxX3gxX2F1dG9jb25oZWNpbWVudG9bMSwgXQ0KZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvID0gZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvWy0xLCBdDQpgYGANCg0KIyMgRml4IDIgKENsZWFuIG5hbWVzKQ0KDQpgYGB7cn0NCmVzdDFfeDFfYXV0b2NvbmhlY2ltZW50byA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhlc3QxX3gxX2F1dG9jb25oZWNpbWVudG8pDQpgYGANCg0KIyMgRml4IDMgKGdldCBvbmx5IGZvY2FsIHZhcmlhYmxlcykNCg0KYGBge3J9DQplc3QxX3gxX2F1dG9jb25oZWNpbWVudG8gPC0gZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgc2VsZWN0KDU6OSkNCmBgYA0KDQojIyBGaXggNCAoSW5zZXJ0IG1haW4gbmFtZSBhbmQgc3BlY2lhbGlzdCkNCg0KYGBge3J9DQplc3QxX3gxX2F1dG9jb25oZWNpbWVudG8gPC0gZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGhhYmlsaWRhZGUgPSAiYXV0b2NvbmhlY2ltZW50byIpICU+JSANCiAgbXV0YXRlKHNwZWNpYWxpc3QgPSAic2ltb25lIikgJT4lIA0KICBzZWxlY3QoaGFiaWxpZGFkZSwgc3BlY2lhbGlzdCwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIEZpeCA1IChjZXJmaWZ5IGZhY3RvciBsZXZlbCkNCg0KDQpgYGB7cn0NCmVzdDFfeDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJ2b2NlX2p1bGdhIiksIGFzLm51bWVyaWMpKQ0KYGBgDQoNCiMgZml4IDYgKGFkZCBpdGVtIG51bWJlcikNCg0KPiBFc3RhbW9zIGFzc3VtaW5kbyBxdWUgbmluZ3XDqW0gbXVkb3UgYSBvcmRlbSBkYXMgbGluaGFzDQoNCmBgYHtyfQ0KZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfeDFfYXV0b2NvbmhlY2ltZW50byAlPiUgDQogIG11dGF0ZShpdGVtX251bWJlciA9IHJvd19udW1iZXIoKSkNCmBgYA0KDQoNCiMjIENoZWNrDQoNCmBgYHtyfQ0KZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvDQpgYGANCg0KIyBPbGdhDQoNCmBgYHtyfQ0KcmVhZF9leGNlbF9hbGxzaGVldHMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpIHsNCiAgICBzaGVldHMgPC0gcmVhZHhsOjpleGNlbF9zaGVldHMoZmlsZW5hbWUpICNnZXQgYWxsIHNoZWV0IG5hbWVzDQogICAgeCA8LSBsYXBwbHkoc2hlZXRzLCBmdW5jdGlvbihYKSByZWFkeGw6OnJlYWRfZXhjZWwoZmlsZW5hbWUsIHNoZWV0ID0gWCkpDQogICAgbmFtZXMoeCkgPC0gc2hlZXRzICNnZXQgbmFtZXMgb25seQ0KICAgIHggI3JldHVybg0KfQ0KDQpleGNlbF9saXN0IDwtIHJlYWRfZXhjZWxfYWxsc2hlZXRzKCJDOi9Vc2Vycy9sdWlzZi9EZXNrdG9wL01hdHJpeiBkZSBjb21wZXTDqm5jaWFzIC0gSXRlbnMgcGFyYSBwcm9mZXNzb3JlcyAtIHZlcnNhbyBsdWlzICgxKSAtIG9sZ2EueGxzeCIpDQoNCmxpc3QyZW52KHNldE5hbWVzKGV4Y2VsX2xpc3QsICNsaXN0DQogICAgICAgICAgICAgICAgICBwYXN0ZTAoImVzdDFfb2xnYV8iLGphbml0b3I6Om1ha2VfY2xlYW5fbmFtZXMobmFtZXMoZXhjZWxfbGlzdCkpKSksICAjZml4aW5nIGRpZmZlcmVudCBuYW1lcyBhbmQgb3RoZXIgcGF0dGVybnMNCiAgICAgICAgIGVudmlyPS5HbG9iYWxFbnYpICN3aGVyZT8NCg0KI2xpc3QyZW52KGV4Y2VsX2xpc3QsIC5HbG9iYWxFbnYpDQpgYGANCg0KIyMgRml4IDEgKHJvdyBuYW1lcyB0byBjb2x1bW5zKQ0KDQpgYGB7cn0NCmNvbG5hbWVzKGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvKSA8LSBlc3QxX29sZ2FfeDFfYXV0b2NvbmhlY2ltZW50b1sxLCBdDQplc3QxX29sZ2FfeDFfYXV0b2NvbmhlY2ltZW50byA9IGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvWy0xLCBdDQpgYGANCg0KDQojIyBGaXggMiAoQ2xlYW4gbmFtZXMpDQoNCmBgYHtyfQ0KZXN0MV9vbGdhX3gxX2F1dG9jb25oZWNpbWVudG8gPC0gamFuaXRvcjo6Y2xlYW5fbmFtZXMoZXN0MV9vbGdhX3gxX2F1dG9jb25oZWNpbWVudG8pDQpgYGANCg0KDQojIyBGaXggMyAoZ2V0IG9ubHkgZm9jYWwgdmFyaWFibGVzKQ0KDQpgYGB7cn0NCmVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgc2VsZWN0KDU6OSkNCmBgYA0KDQoNCiMjIEZpeCA0IChJbnNlcnQgbWFpbiBuYW1lIGFuZCBzcGVjaWFsaXN0KQ0KDQpgYGB7cn0NCmVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGhhYmlsaWRhZGUgPSAiYXV0b2NvbmhlY2ltZW50byIpICU+JSANCiAgbXV0YXRlKHNwZWNpYWxpc3QgPSAiT2xnYSIpICU+JSANCiAgc2VsZWN0KGhhYmlsaWRhZGUsIHNwZWNpYWxpc3QsIGV2ZXJ5dGhpbmcoKSkNCmBgYA0KDQoNCiMjIEZpeCA1IChjZXJmaWZ5IGZhY3RvciBsZXZlbCkNCg0KYGBge3J9DQplc3QxX29sZ2FfeDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX29sZ2FfeDFfYXV0b2NvbmhlY2ltZW50byAlPiUgDQogIG11dGF0ZShhY3Jvc3Moc3RhcnRzX3dpdGgoInZvY2VfanVsZ2EiKSwgYXMubnVtZXJpYykpDQpgYGANCg0KDQojIGZpeCA2IChhZGQgaXRlbSBudW1iZXIpDQoNCj4gRXN0YW1vcyBhc3N1bWluZG8gcXVlIG5pbmd1w6ltIG11ZG91IGEgb3JkZW0gZGFzIGxpbmhhcw0KDQpgYGB7cn0NCmVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGl0ZW1fbnVtYmVyID0gcm93X251bWJlcigpKQ0KYGBgDQoNCg0KDQojIyBDaGVjaw0KDQpgYGB7cn0NCmVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvDQpgYGANCg0KDQoNCiMgQ2FybWVuDQoNCmBgYHtyfQ0KcmVhZF9leGNlbF9hbGxzaGVldHMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpIHsNCiAgICBzaGVldHMgPC0gcmVhZHhsOjpleGNlbF9zaGVldHMoZmlsZW5hbWUpICNnZXQgYWxsIHNoZWV0IG5hbWVzDQogICAgeCA8LSBsYXBwbHkoc2hlZXRzLCBmdW5jdGlvbihYKSByZWFkeGw6OnJlYWRfZXhjZWwoZmlsZW5hbWUsIHNoZWV0ID0gWCkpDQogICAgbmFtZXMoeCkgPC0gc2hlZXRzICNnZXQgbmFtZXMgb25seQ0KICAgIHggI3JldHVybg0KfQ0KDQpleGNlbF9saXN0IDwtIHJlYWRfZXhjZWxfYWxsc2hlZXRzKCJDOi9Vc2Vycy9sdWlzZi9EZXNrdG9wL01hdHJpeiBkZSBjb21wZXTDqm5jaWFzIC0gSXRlbnMgcGFyYSBwcm9mZXNzb3JlcyAtIHZlcnNhbyBjYXJtZW4gKDEpLnhsc3giKQ0KDQpsaXN0MmVudihzZXROYW1lcyhleGNlbF9saXN0LCAjbGlzdA0KICAgICAgICAgICAgICAgICAgcGFzdGUwKCJlc3QxX2Nhcm1lbV8iLGphbml0b3I6Om1ha2VfY2xlYW5fbmFtZXMobmFtZXMoZXhjZWxfbGlzdCkpKSksICAjZml4aW5nIGRpZmZlcmVudCBuYW1lcyBhbmQgb3RoZXIgcGF0dGVybnMNCiAgICAgICAgIGVudmlyPS5HbG9iYWxFbnYpICN3aGVyZT8NCg0KI2xpc3QyZW52KGV4Y2VsX2xpc3QsIC5HbG9iYWxFbnYpDQpgYGANCg0KIyMgRml4IDEgKHJvdyBuYW1lcyB0byBjb2x1bW5zKQ0KDQpgYGB7cn0NCmNvbG5hbWVzKGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG8pIDwtIGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG9bMSwgXQ0KZXN0MV9jYXJtZW1feDFfYXV0b2NvbmhlY2ltZW50byA9IGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG9bLTEsIF0NCmBgYA0KDQoNCiMjIEZpeCAyIChDbGVhbiBuYW1lcykNCg0KYGBge3J9DQplc3QxX2Nhcm1lbV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG8pDQpgYGANCg0KIyMgRml4IDMgKGdldCBvbmx5IGZvY2FsIHZhcmlhYmxlcykNCg0KYGBge3J9DQplc3QxX2Nhcm1lbV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBzZWxlY3QoNTo5KQ0KYGBgDQoNCg0KIyMgRml4IDQgKEluc2VydCBtYWluIG5hbWUgYW5kIHNwZWNpYWxpc3QpDQoNCmBgYHtyfQ0KZXN0MV9jYXJtZW1feDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX2Nhcm1lbV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGhhYmlsaWRhZGUgPSAiYXV0b2NvbmhlY2ltZW50byIpICU+JSANCiAgbXV0YXRlKHNwZWNpYWxpc3QgPSAiQ2FybWVtIikgJT4lIA0KICBzZWxlY3QoaGFiaWxpZGFkZSwgc3BlY2lhbGlzdCwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIEZpeCA1IChjZXJmaWZ5IGZhY3RvciBsZXZlbCkNCg0KYGBge3J9DQplc3QxX2Nhcm1lbV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJ2b2NlX2p1bGdhIiksIGFzLm51bWVyaWMpKQ0KYGBgDQoNCiMgZml4IDYgKGFkZCBpdGVtIG51bWJlcikNCg0KPiBFc3RhbW9zIGFzc3VtaW5kbyBxdWUgbmluZ3XDqW0gbXVkb3UgYSBvcmRlbSBkYXMgbGluaGFzDQoNCmBgYHtyfQ0KZXN0MV9jYXJtZW1feDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX2Nhcm1lbV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGl0ZW1fbnVtYmVyID0gcm93X251bWJlcigpKQ0KYGBgDQoNCg0KDQojIyBDaGVjaw0KDQpgYGB7cn0NCmVzdDFfY2FybWVtX3gxX2F1dG9jb25oZWNpbWVudG8NCmBgYA0KDQoNCg0KIyBKb3NpDQoNCmBgYHtyfQ0KcmVhZF9leGNlbF9hbGxzaGVldHMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpIHsNCiAgICBzaGVldHMgPC0gcmVhZHhsOjpleGNlbF9zaGVldHMoZmlsZW5hbWUpICNnZXQgYWxsIHNoZWV0IG5hbWVzDQogICAgeCA8LSBsYXBwbHkoc2hlZXRzLCBmdW5jdGlvbihYKSByZWFkeGw6OnJlYWRfZXhjZWwoZmlsZW5hbWUsIHNoZWV0ID0gWCkpDQogICAgbmFtZXMoeCkgPC0gc2hlZXRzICNnZXQgbmFtZXMgb25seQ0KICAgIHggI3JldHVybg0KfQ0KDQpleGNlbF9saXN0IDwtIHJlYWRfZXhjZWxfYWxsc2hlZXRzKCJDOi9Vc2Vycy9sdWlzZi9EZXNrdG9wL01hdHJpeiBkZSBjb21wZXTDqm5jaWFzIC0gSXRlbnMgcGFyYSBwcm9mZXNzb3JlcyAtIHZlcnNhbyBsdWlzICgyKSBqb3NpLnhsc3giKQ0KDQpsaXN0MmVudihzZXROYW1lcyhleGNlbF9saXN0LCAjbGlzdA0KICAgICAgICAgICAgICAgICAgcGFzdGUwKCJlc3QxX2pvc2lfIixqYW5pdG9yOjptYWtlX2NsZWFuX25hbWVzKG5hbWVzKGV4Y2VsX2xpc3QpKSkpLCAgI2ZpeGluZyBkaWZmZXJlbnQgbmFtZXMgYW5kIG90aGVyIHBhdHRlcm5zDQogICAgICAgICBlbnZpcj0uR2xvYmFsRW52KSAjd2hlcmU/DQoNCiNsaXN0MmVudihleGNlbF9saXN0LCAuR2xvYmFsRW52KQ0KYGBgDQoNCiMjIEZpeCAxIChyb3cgbmFtZXMgdG8gY29sdW1ucykNCg0KYGBge3J9DQpjb2xuYW1lcyhlc3QxX2pvc2lfeDFfYXV0b2NvbmhlY2ltZW50bykgPC0gZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG9bMSwgXQ0KZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG8gPSBlc3QxX2pvc2lfeDFfYXV0b2NvbmhlY2ltZW50b1stMSwgXQ0KYGBgDQoNCg0KIyMgRml4IDIgKENsZWFuIG5hbWVzKQ0KDQpgYGB7cn0NCmVzdDFfam9zaV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzdDFfam9zaV94MV9hdXRvY29uaGVjaW1lbnRvKQ0KYGBgDQoNCiMjIEZpeCAzIChnZXQgb25seSBmb2NhbCB2YXJpYWJsZXMpDQoNCmBgYHtyfQ0KZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG8gPC0gZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBzZWxlY3QoNTo5KQ0KYGBgDQoNCg0KIyMgRml4IDQgKEluc2VydCBtYWluIG5hbWUgYW5kIHNwZWNpYWxpc3QpDQoNCmBgYHtyfQ0KZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG8gPC0gZXN0MV9qb3NpX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBtdXRhdGUoaGFiaWxpZGFkZSA9ICJhdXRvY29uaGVjaW1lbnRvIikgJT4lIA0KICBtdXRhdGUoc3BlY2lhbGlzdCA9ICJKb3NpIikgJT4lIA0KICBzZWxlY3QoaGFiaWxpZGFkZSwgc3BlY2lhbGlzdCwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIEZpeCA1IChjZXJmaWZ5IGZhY3RvciBsZXZlbCkNCg0KYGBge3J9DQplc3QxX2pvc2lfeDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX2pvc2lfeDFfYXV0b2NvbmhlY2ltZW50byAlPiUgDQogIG11dGF0ZShhY3Jvc3Moc3RhcnRzX3dpdGgoInZvY2VfanVsZ2EiKSwgYXMubnVtZXJpYykpDQpgYGANCg0KDQojIGZpeCA2IChhZGQgaXRlbSBudW1iZXIpDQoNCj4gRXN0YW1vcyBhc3N1bWluZG8gcXVlIG5pbmd1w6ltIG11ZG91IGEgb3JkZW0gZGFzIGxpbmhhcw0KDQpgYGB7cn0NCmVzdDFfam9zaV94MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfam9zaV94MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGl0ZW1fbnVtYmVyID0gcm93X251bWJlcigpKQ0KYGBgDQoNCg0KIyMgQ2hlY2sNCg0KYGBge3J9DQplc3QxX2pvc2lfeDFfYXV0b2NvbmhlY2ltZW50bw0KYGBgDQoNCg0KDQoNCiMgTXVyaWxvDQoNCmBgYHtyfQ0KcmVhZF9leGNlbF9hbGxzaGVldHMgPC0gZnVuY3Rpb24oZmlsZW5hbWUpIHsNCiAgICBzaGVldHMgPC0gcmVhZHhsOjpleGNlbF9zaGVldHMoZmlsZW5hbWUpICNnZXQgYWxsIHNoZWV0IG5hbWVzDQogICAgeCA8LSBsYXBwbHkoc2hlZXRzLCBmdW5jdGlvbihYKSByZWFkeGw6OnJlYWRfZXhjZWwoZmlsZW5hbWUsIHNoZWV0ID0gWCkpDQogICAgbmFtZXMoeCkgPC0gc2hlZXRzICNnZXQgbmFtZXMgb25seQ0KICAgIHggI3JldHVybg0KfQ0KDQpleGNlbF9saXN0IDwtIHJlYWRfZXhjZWxfYWxsc2hlZXRzKCJDOi9Vc2Vycy9sdWlzZi9EZXNrdG9wL01hdHJpeiBkZSBjb21wZXTDqm5jaWFzIC0gSXRlbnMgcGFyYSBwcm9mZXNzb3JlcyAtIE5vdHJhcyBNdXJpbGxvLnhsc3giKQ0KDQpsaXN0MmVudihzZXROYW1lcyhleGNlbF9saXN0LCAjbGlzdA0KICAgICAgICAgICAgICAgICAgcGFzdGUwKCJlc3QxX211cmlsb18iLGphbml0b3I6Om1ha2VfY2xlYW5fbmFtZXMobmFtZXMoZXhjZWxfbGlzdCkpKSksICAjZml4aW5nIGRpZmZlcmVudCBuYW1lcyBhbmQgb3RoZXIgcGF0dGVybnMNCiAgICAgICAgIGVudmlyPS5HbG9iYWxFbnYpICN3aGVyZT8NCg0KI2xpc3QyZW52KGV4Y2VsX2xpc3QsIC5HbG9iYWxFbnYpDQpgYGANCg0KIyMgRml4IDEgKHJvdyBuYW1lcyB0byBjb2x1bW5zKQ0KDQpgYGB7cn0NCmNvbG5hbWVzKGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG8pIDwtIGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG9bMSwgXQ0KZXN0MV9tdXJpbG9feDFfYXV0b2NvbmhlY2ltZW50byA9IGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG9bLTEsIF0NCmBgYA0KDQoNCiMjIEZpeCAyIChDbGVhbiBuYW1lcykNCg0KYGBge3J9DQplc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG8pDQpgYGANCg0KIyMgRml4IDMgKGdldCBvbmx5IGZvY2FsIHZhcmlhYmxlcykNCg0KYGBge3J9DQplc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBzZWxlY3QoNTo5KQ0KYGBgDQoNCg0KIyMgRml4IDQgKEluc2VydCBtYWluIG5hbWUgYW5kIHNwZWNpYWxpc3QpDQoNCmBgYHtyfQ0KZXN0MV9tdXJpbG9feDFfYXV0b2NvbmhlY2ltZW50byA8LSBlc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgbXV0YXRlKGhhYmlsaWRhZGUgPSAiYXV0b2NvbmhlY2ltZW50byIpICU+JSANCiAgbXV0YXRlKHNwZWNpYWxpc3QgPSAiTXVyaWxvIikgJT4lIA0KICBzZWxlY3QoaGFiaWxpZGFkZSwgc3BlY2lhbGlzdCwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIEZpeCA1IChjZXJmaWZ5IGZhY3RvciBsZXZlbCkNCg0KYGBge3J9DQplc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJ2b2NlX2p1bGdhIiksIGFzLm51bWVyaWMpKQ0KYGBgDQoNCg0KIyBmaXggNiAoYWRkIGl0ZW0gbnVtYmVyKQ0KDQo+IEVzdGFtb3MgYXNzdW1pbmRvIHF1ZSBuaW5ndcOpbSBtdWRvdSBhIG9yZGVtIGRhcyBsaW5oYXMNCg0KYGBge3J9DQplc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvIDwtIGVzdDFfbXVyaWxvX3gxX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBtdXRhdGUoaXRlbV9udW1iZXIgPSByb3dfbnVtYmVyKCkpDQpgYGANCg0KIyMgQ2hlY2sNCg0KYGBge3J9DQplc3QxX211cmlsb194MV9hdXRvY29uaGVjaW1lbnRvDQpgYGANCg0KDQoNCiMgTWVyZ2UgYXV0b2NvbmhlY2ltZW50bw0KDQoNCmBgYHtyfQ0KYmFzZV9hdXRvY29uaGVjaW1lbnRvIDwtIGJpbmRfcm93cygNCiAgZXN0MV94MV9hdXRvY29uaGVjaW1lbnRvLCAjc2ltb25lDQogIGVzdDFfb2xnYV94MV9hdXRvY29uaGVjaW1lbnRvKQ0KDQpiYXNlX2F1dG9jb25oZWNpbWVudG8gPC0gYmluZF9yb3dzKGJhc2VfYXV0b2NvbmhlY2ltZW50bywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0MV9jYXJtZW1feDFfYXV0b2NvbmhlY2ltZW50bykNCg0KYmFzZV9hdXRvY29uaGVjaW1lbnRvIDwtIGJpbmRfcm93cyhiYXNlX2F1dG9jb25oZWNpbWVudG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdDFfam9zaV94MV9hdXRvY29uaGVjaW1lbnRvKQ0KDQpiYXNlX2F1dG9jb25oZWNpbWVudG8gPC0gYmluZF9yb3dzKGJhc2VfYXV0b2NvbmhlY2ltZW50bywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0MV9tdXJpbG9feDFfYXV0b2NvbmhlY2ltZW50bykNCg0KYGBgDQoNCg0KIyMgQ2hlY2sNCg0KYGBge3J9DQpiYXNlX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBhcnJhbmdlKGl0ZW1fbnVtYmVyKSAlPiUNCiAgc2VsZWN0KGl0ZW1fbnVtYmVyLCBzcGVjaWFsaXN0LCBjb250ZXVkbywgZXZlcnl0aGluZygpKSAlPiUgDQogIHV0aWxzOjpWaWV3KC4pDQpgYGANCg0KDQojIyBNw6lkaWEgZGEgY2xhcmV6YSBwYXJhIENyaWFuw6dhDQoNCmBgYHtyfQ0KbWVhbihiYXNlX2F1dG9jb25oZWNpbWVudG8kdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2EsIG5hLnJtPVQpDQpgYGANCg0KIyMgTcOpZGlhIGRhIGNsYXJlemEgcGFyYSBBZG9sZXNjZW50ZQ0KDQpgYGB7cn0NCm1lYW4oYmFzZV9hdXRvY29uaGVjaW1lbnRvJHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtX2Fkb2xlc2NlbnRlLCBuYS5ybT1UKQ0KYGBgDQoNCiMjIE3DqWRpYSBkYSBwZXJ0aW5lbmNpYQ0KDQpgYGB7cn0NCm1lYW4oYmFzZV9hdXRvY29uaGVjaW1lbnRvJHZvY2VfanVsZ2FfcXVlX2VzdGVfaXRlbV9lX3BlcnRpbmVudGVfcGFyYV9tZWRpcl9vX3F1ZV9zZV9wcm9wb2VfcG9yX2V4ZW1wbG9fYXV0b2NvbmhlY2ltZW50bywgbmEucm09VCkNCmBgYA0KDQojIFJlc3VsdGFkbyBHZXJhbA0KDQpgYGB7cn0NCmJhc2VfYXV0b2NvbmhlY2ltZW50byAlPiUgDQogIGdyb3VwX2J5KGl0ZW1fbnVtYmVyKSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtYV9jcmlhbmNhOnZvY2VfanVsZ2FfcXVlX2VzdGVfaXRlbV9lX3BlcnRpbmVudGVfcGFyYV9tZWRpcl9vX3F1ZV9zZV9wcm9wb2VfcG9yX2V4ZW1wbG9fYXV0b2NvbmhlY2ltZW50byksDQogICAgICAgICAgICAgICB+bWVhbiguLCBuYS5ybT1UKSkgJT4lIA0KICByZW5hbWUoY3JpYW5jYSA9IHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtYV9jcmlhbmNhKSAlPiUgDQogIHJlbmFtZShhZG9sZXNjZW50ZSA9IHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtX2Fkb2xlc2NlbnRlKSAlPiUgDQogIHJlbmFtZShwZXJ0aW5lbmNpYSA9IHZvY2VfanVsZ2FfcXVlX2VzdGVfaXRlbV9lX3BlcnRpbmVudGVfcGFyYV9tZWRpcl9vX3F1ZV9zZV9wcm9wb2VfcG9yX2V4ZW1wbG9fYXV0b2NvbmhlY2ltZW50bykgJT4lIA0KICBhcnJhbmdlKGRlc2MoY3JpYW5jYSkpICU+JSANCiAgI2xlZnRfam9pbiguLCBiYXNlX2F1dG9jb25oZWNpbWVudG8gJT4lIHNlbGVjdChpdGVtX251bWJlciwgY29udGV1ZG8pKSAlPiUgDQogICNyb3duYW1lc190b19jb2x1bW4oInBvc2ljYW8iKSAlPiUgDQogICNzZWxlY3QoLXBvc2ljYW8pICU+JSANCiAgI2Rpc3RpbmN0KC4sIC5rZWVwX2FsbCA9IFRSVUUpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKCkNCmBgYA0KDQojIFJlc3VsdGFkbyBNZWRpYSAzDQoNCmBgYHtyfQ0KYmFzZV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgZ3JvdXBfYnkoaXRlbV9udW1iZXIpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnModm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2E6dm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSwNCiAgICAgICAgICAgICAgIH5tZWFuKC4sIG5hLnJtPVQpKSAlPiUgDQogIHJlbmFtZShjcmlhbmNhID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2EpICU+JSANCiAgcmVuYW1lKGFkb2xlc2NlbnRlID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1fYWRvbGVzY2VudGUpICU+JSANCiAgcmVuYW1lKHBlcnRpbmVuY2lhID0gdm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSAlPiUgDQogIGZpbHRlcihjcmlhbmNhID4gMyAmIGFkb2xlc2NlbnRlID4gMyAmIHBlcnRpbmVuY2lhID4gMykgJT4lIA0KICAjbGVmdF9qb2luKC4sIGJhc2VfYXV0b2NvbmhlY2ltZW50byAlPiUgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjb250ZXVkbykpICU+JSANCiAgI3Jvd25hbWVzX3RvX2NvbHVtbigicG9zaWNhbyIpICU+JSANCiAgI3NlbGVjdCgtcG9zaWNhbykgJT4lIA0KICAjZGlzdGluY3QoLiwgLmtlZXBfYWxsID0gVFJVRSkgJT4lIA0KICAgRFQ6OmRhdGF0YWJsZSgpDQpgYGANCg0KIyBSZXN1bHRhZG8gTWVkaWEgMyBjb20gY29udGV1ZG8NCg0KDQpgYGB7cn0NCmJhc2VfYXV0b2NvbmhlY2ltZW50byAlPiUgDQogIGdyb3VwX2J5KGl0ZW1fbnVtYmVyKSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtYV9jcmlhbmNhOnZvY2VfanVsZ2FfcXVlX2VzdGVfaXRlbV9lX3BlcnRpbmVudGVfcGFyYV9tZWRpcl9vX3F1ZV9zZV9wcm9wb2VfcG9yX2V4ZW1wbG9fYXV0b2NvbmhlY2ltZW50byksDQogICAgICAgICAgICAgICB+bWVhbiguLCBuYS5ybT1UKSkgJT4lIA0KICByZW5hbWUoY3JpYW5jYSA9IHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtYV9jcmlhbmNhKSAlPiUgDQogIHJlbmFtZShhZG9sZXNjZW50ZSA9IHZvY2VfanVsZ2FzX3F1ZV9lc3RlX2l0ZW1fZV9jbGFyb19wYXJhX3Nlcl9lbnRlbmRpZG9fcG9yX3VtX2Fkb2xlc2NlbnRlKSAlPiUgDQogIHJlbmFtZShwZXJ0aW5lbmNpYSA9IHZvY2VfanVsZ2FfcXVlX2VzdGVfaXRlbV9lX3BlcnRpbmVudGVfcGFyYV9tZWRpcl9vX3F1ZV9zZV9wcm9wb2VfcG9yX2V4ZW1wbG9fYXV0b2NvbmhlY2ltZW50bykgJT4lIA0KICBmaWx0ZXIoY3JpYW5jYSA+IDMgJiBhZG9sZXNjZW50ZSA+IDMgJiBwZXJ0aW5lbmNpYSA+IDMpICU+JSANCiAgbGVmdF9qb2luKC4sIGJhc2VfYXV0b2NvbmhlY2ltZW50byAlPiUgc2VsZWN0KGl0ZW1fbnVtYmVyLCBjb250ZXVkbykpICU+JSANCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwb3NpY2FvIikgJT4lIA0KICBzZWxlY3QoLXBvc2ljYW8pICU+JSANCiAgZGlzdGluY3QoLiwgLmtlZXBfYWxsID0gVFJVRSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUoKQ0KYGBgDQoNCg0KIyBDcmlhbmNhcyEgUmVzdWx0YWRvIE1lZGlhIDMgcGFyYSBjcmlhbmNhIGUgcGVydGluZW5jaWEgMw0KDQoNCmBgYHtyfQ0KYmFzZV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgZ3JvdXBfYnkoaXRlbV9udW1iZXIpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnModm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2E6dm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSwNCiAgICAgICAgICAgICAgIH5tZWFuKC4sIG5hLnJtPVQpKSAlPiUgDQogIHJlbmFtZShjcmlhbmNhID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2EpICU+JSANCiAgcmVuYW1lKGFkb2xlc2NlbnRlID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1fYWRvbGVzY2VudGUpICU+JSANCiAgcmVuYW1lKHBlcnRpbmVuY2lhID0gdm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSAlPiUgDQogIGZpbHRlcihjcmlhbmNhID4gMyAmIHBlcnRpbmVuY2lhID4gMykgJT4lIA0KICBsZWZ0X2pvaW4oLiwgYmFzZV9hdXRvY29uaGVjaW1lbnRvICU+JSBzZWxlY3QoaXRlbV9udW1iZXIsIGNvbnRldWRvKSkgJT4lIA0KICByb3duYW1lc190b19jb2x1bW4oInBvc2ljYW8iKSAlPiUgDQogIHNlbGVjdCgtcG9zaWNhbykgJT4lIA0KICBkaXN0aW5jdCguLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgDQogIHNlbGVjdCgtYWRvbGVzY2VudGUpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKCkNCmBgYA0KDQoNCg0KDQojIEFkb2xlc2NlbnRlcyEgUmVzdWx0YWRvIE1lZGlhIDMgcGFyYSBhZG9sZXNjZW50ZXMgZSBwZXJ0aW5lbmNpYSAzDQoNCg0KYGBge3J9DQpiYXNlX2F1dG9jb25oZWNpbWVudG8gJT4lIA0KICBncm91cF9ieShpdGVtX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyh2b2NlX2p1bGdhc19xdWVfZXN0ZV9pdGVtX2VfY2xhcm9fcGFyYV9zZXJfZW50ZW5kaWRvX3Bvcl91bWFfY3JpYW5jYTp2b2NlX2p1bGdhX3F1ZV9lc3RlX2l0ZW1fZV9wZXJ0aW5lbnRlX3BhcmFfbWVkaXJfb19xdWVfc2VfcHJvcG9lX3Bvcl9leGVtcGxvX2F1dG9jb25oZWNpbWVudG8pLA0KICAgICAgICAgICAgICAgfm1lYW4oLiwgbmEucm09VCkpICU+JSANCiAgcmVuYW1lKGNyaWFuY2EgPSB2b2NlX2p1bGdhc19xdWVfZXN0ZV9pdGVtX2VfY2xhcm9fcGFyYV9zZXJfZW50ZW5kaWRvX3Bvcl91bWFfY3JpYW5jYSkgJT4lIA0KICByZW5hbWUoYWRvbGVzY2VudGUgPSB2b2NlX2p1bGdhc19xdWVfZXN0ZV9pdGVtX2VfY2xhcm9fcGFyYV9zZXJfZW50ZW5kaWRvX3Bvcl91bV9hZG9sZXNjZW50ZSkgJT4lIA0KICByZW5hbWUocGVydGluZW5jaWEgPSB2b2NlX2p1bGdhX3F1ZV9lc3RlX2l0ZW1fZV9wZXJ0aW5lbnRlX3BhcmFfbWVkaXJfb19xdWVfc2VfcHJvcG9lX3Bvcl9leGVtcGxvX2F1dG9jb25oZWNpbWVudG8pICU+JSANCiAgZmlsdGVyKGFkb2xlc2NlbnRlID4gMyAmIHBlcnRpbmVuY2lhID4gMykgJT4lIA0KICBsZWZ0X2pvaW4oLiwgYmFzZV9hdXRvY29uaGVjaW1lbnRvICU+JSBzZWxlY3QoaXRlbV9udW1iZXIsIGNvbnRldWRvKSkgJT4lIA0KICByb3duYW1lc190b19jb2x1bW4oInBvc2ljYW8iKSAlPiUgDQogIHNlbGVjdCgtcG9zaWNhbykgJT4lIA0KICBkaXN0aW5jdCguLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgDQogIHNlbGVjdCgtY3JpYW5jYSkgJT4lIA0KICAgIERUOjpkYXRhdGFibGUoKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KYmFzZV9hdXRvY29uaGVjaW1lbnRvICU+JSANCiAgZ3JvdXBfYnkoaXRlbV9udW1iZXIpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnModm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2E6dm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSwNCiAgICAgICAgICAgICAgIH5tZWFuKC4pKSAlPiUgDQogIHJlbmFtZShjcmlhbmNhID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1hX2NyaWFuY2EpICU+JSANCiAgcmVuYW1lKGFkb2xlc2NlbnRlID0gdm9jZV9qdWxnYXNfcXVlX2VzdGVfaXRlbV9lX2NsYXJvX3BhcmFfc2VyX2VudGVuZGlkb19wb3JfdW1fYWRvbGVzY2VudGUpICU+JSANCiAgcmVuYW1lKHBlcnRpbmVuY2lhID0gdm9jZV9qdWxnYV9xdWVfZXN0ZV9pdGVtX2VfcGVydGluZW50ZV9wYXJhX21lZGlyX29fcXVlX3NlX3Byb3BvZV9wb3JfZXhlbXBsb19hdXRvY29uaGVjaW1lbnRvKSAlPiUgDQogIHBpdm90X2xvbmdlcihpdGVtX251bWJlcikgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKHggPSBmY3RfaW5vcmRlcihmYWN0b3IodmFsdWUpLCBjcmlhbmNhKSwgeSA9IGNyaWFuY2EpKSArDQogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIpICsgDQogIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KYGBgDQoNCg0KDQo=