bibliotecas

Preparação dos dados

Abrir bases originais:

# abrir base e criar amostras
#dados_finais_2000_2010 <- readRDS("~/RStudio/ENEM/2_Dado tratado/dados_finais_2000_2010.rds")
#df<-slice_sample(dados_finais_2000_2010,prop = 0.01) 
#saveRDS(df, file = "sample_00_10.rds")
#table(dados_finais_2000_2010$NU_ANO)
#table(df$NU_ANO)
#dados_finais_2000_2010 <- readRDS("~/RStudio/ENEM/2_Dado tratado/dados_finais_2012_2014.rds")

#df2<-slice_sample(dados_finais_2000_2010,prop = 0.01) 
#saveRDS(df2, file = "sample_12_14.rds")


#dados_finais_2015_2020 <- readRDS("~/RStudio/ENEM/2_Dado tratado/dados_finais_2015_2020.rds")
#df3<-slice_sample(dados_finais_2015_2020,prop = 0.01) 
#saveRDS(df3, file = "sample_15_20.rds")
#Base de 2000-2010
sample_00_10 <- readRDS("~/RStudio/ENEM/sample_00_10.rds")
#Base de 2011-2015
sample_12_14 <- readRDS("~/RStudio/ENEM/sample_12_14.rds")
#Base de 2015-2016
sample_15_20 <- readRDS("~/RStudio/ENEM/sample_15_20.rds")
#base de Variaveis Ambientais
# unificar base de dados ambiental
Centro <- readRDS("~/RStudio/ENEM/Data-20220615T014950Z-001/Data/Centro.rds")
NE <- readRDS("~/RStudio/ENEM/Data-20220615T014950Z-001/Data/NE.rds")
NO <- readRDS("~/RStudio/ENEM/Data-20220615T014950Z-001/Data/NO.rds")
SE <- readRDS("~/RStudio/ENEM/Data-20220615T014950Z-001/Data/SE.rds")
SUL <- readRDS("~/RStudio/ENEM/Data-20220615T014950Z-001/Data/Sul.rds")
df_Am<-bind_rows(NE, NO, SE,SUL)
rm(NE,NO,SE,SUL,Centro)
head(df_Am)

Preparar Bases:

Selecionar Variaveis de Interesse

  #nota componente X
#  ,#Questão renda
#  ,#Questão
#  ,#Questão
#  ,#Questão
)->sample_00_10
Error: unexpected ')' in ")"

Fundir Bases:

rm(df_enem,df_Am)
Warning in rm(df_enem, df_Am) : object 'df_Am' not found

Analise Exploratória

Sumário dos Dados

Resumo dos Dados

skim(df)
── Data Summary ────────────────────────
                           Values
Name                       df    
Number of rows             915875
Number of columns          25    
Key                        NULL  
_______________________          
Column type frequency:           
  character                2     
  factor                   6     
  logical                  1     
  numeric                  16    
________________________         
Group variables            None  
df[,7:12] <- lapply(df[,7:12], as.numeric)
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion
Warning in lapply(df[, 7:12], as.numeric) : NAs introduced by coercion

Analise das uni

#variaveis numéricas
  plot_num(df)
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.


#variaveis Categoricas
freq(df)
Warning in freq_logic(data = data, input = input[i], plot, na.rm, path_out = path_out) :
  Skipping plot for variable 'NU_INSCRICAO' (more than 100 categories)
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
Warning in freq_logic(data = data, input = input[i], plot, na.rm, path_out = path_out) :
  Skipping plot for variable 'NO_MUNICIPIO_RESIDENCIA' (more than 100 categories)
Warning in freq_logic(data = data, input = input[i], plot, na.rm, path_out = path_out) :
  Skipping plot for variable 'CO_MUNICIPIO_RESIDENCIA' (more than 100 categories)
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

[1] "Variables processed: NU_INSCRICAO, TP_SEXO, SG_UF_RESIDENCIA, NO_MUNICIPIO_RESIDENCIA, CO_MUNICIPIO_RESIDENCIA, NU_NOTA_COMP5, name_state, name_region"

Analise de Correlações

#df1<-slice_sample(df,prop = 0.01)
df1 %>% ggplot(aes(x=NU_ANO,y =NU_NOTA_REDACAO))+#geom_density2d_filled()+
  geom_smooth()+geom_dotplot(size=5,alpha=0.01)
Warning: Ignoring unknown parameters: size
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Warning: Removed 1263 rows containing non-finite values (stat_smooth).
Bin width defaults to 1/30 of the range of the data. Pick better value with `binwidth`.
Error in `check_required_aesthetics()`:
! geom_dotplot requires the following missing aesthetics: y
Backtrace:
 1. base `<fn>`(x)
 2. ggplot2:::print.ggplot(x)
 4. ggplot2:::ggplot_build.ggplot(x)
 5. ggplot2 by_layer(function(l, d) l$compute_geom_1(d))
 6. ggplot2 f(l = layers[[i]], d = data[[i]])
 7. l$compute_geom_1(d)
 8. ggplot2 f(..., self = self)
 9. ggplot2:::check_required_aesthetics(...)

a<-"a"
for (i in 7:12) {
  print(i)
  a<-print(colnames(df)[i])
  df1 %>% ggplot(aes(pm25_ugm3,a,col=name_state))+
  geom_point() %>% print()
  
}
[1] 7
[1] "NU_NOTA_REDACAO"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
[1] 8
[1] "NU_NOTA_COMP1"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
[1] 9
[1] "NU_NOTA_COMP2"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
[1] 10
[1] "NU_NOTA_COMP3"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
[1] 11
[1] "NU_NOTA_COMP4"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
[1] 12
[1] "NU_NOTA_COMP5"
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity 
i
[1] 12
#df1 %>% ggplot(aes(pm25_ugm3,NU_NOTA_REDACAO,col=name_state))+
#  geom_point()
  

Regressões

Modelo basico de referencia

#modelo Linear
<-lm(Nota~ poluente,data = )
#Efeitos Mistos
<-lmer(Nota~ poluente + (1+poluente|Estado),data = )
summary()
summary()

extração de Coeficientes

#extração de Coeficientes
ds

#Valor Previsto

%>% ggplot(
  aes(
    predict(),
    col=estado
    )
  ) +
  geom_point()
  

Modelo com controles

#modelo Linear
<-lm(Nota~ poluente,data = )
#Efeitos Mistos
<-lmer(Nota~ poluente + (1+poluente|Estado),data = )
summary()
summary()

extração de Coeficientes

#extração de Coeficientes
ds

#Valor Previsto

%>% ggplot(
  aes(
    predict(),
    col=estado
    )
  ) +
  geom_point()
  

Modelo com controles variando por ano

Modelo com controles variando por modalidade educacional

Modelo com controles variando por modalidade educacional

LS0tDQp0aXRsZTogIlNjcmlwdCBwYXJhIE51dmVtIg0KYXV0aG9yOg0KLSBuYW1lOiBUaGlhZ28gTm9yb25oYSBHYXJkaW4NCiAgYWZmaWxpYXRpb246IEZ1bmRhw6fDo28gR2V0dWxpbyBWYXJnYXMNCi0gbmFtZTogV2VlYmVyYiBKLiBSw6lxdWlhIEpyLg0KICBhZmZpbGlhdGlvbjogRnVuZGHDp8OjbyBHZXR1bGlvIFZhcmdhcw0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpiaWJsaW90ZWNhcw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KI21hbmlwdWxhw6fDo28gZGUgZGFkb3MNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQojQW5hbGlzZSBleHBsb3JhdMOzcmlhDQpsaWJyYXJ5KHNraW1yKQ0KbGlicmFyeShmdW5Nb2RlbGluZykNCmxpYnJhcnkoY29ycnBsb3QpDQoNCg0KI3JlZ3Jlc3PDo28NCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkocGFyYW1ldGVycykNCmxpYnJhcnkoc3BsaW5lcykNCg0KDQpgYGANCg0KIyBQcmVwYXJhw6fDo28gZG9zIGRhZG9zDQoNCiMjIEFicmlyIGJhc2VzIG9yaWdpbmFpczoNCg0KYGBge3J9DQojIGFicmlyIGJhc2UgZSBjcmlhciBhbW9zdHJhcw0KI2RhZG9zX2ZpbmFpc18yMDAwXzIwMTAgPC0gcmVhZFJEUygifi9SU3R1ZGlvL0VORU0vMl9EYWRvIHRyYXRhZG8vZGFkb3NfZmluYWlzXzIwMDBfMjAxMC5yZHMiKQ0KI2RmPC1zbGljZV9zYW1wbGUoZGFkb3NfZmluYWlzXzIwMDBfMjAxMCxwcm9wID0gMC4wMSkgDQojc2F2ZVJEUyhkZiwgZmlsZSA9ICJzYW1wbGVfMDBfMTAucmRzIikNCiN0YWJsZShkYWRvc19maW5haXNfMjAwMF8yMDEwJE5VX0FOTykNCiN0YWJsZShkZiROVV9BTk8pDQojZGFkb3NfZmluYWlzXzIwMDBfMjAxMCA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS8yX0RhZG8gdHJhdGFkby9kYWRvc19maW5haXNfMjAxMl8yMDE0LnJkcyIpDQoNCiNkZjI8LXNsaWNlX3NhbXBsZShkYWRvc19maW5haXNfMjAwMF8yMDEwLHByb3AgPSAwLjAxKSANCiNzYXZlUkRTKGRmMiwgZmlsZSA9ICJzYW1wbGVfMTJfMTQucmRzIikNCg0KDQojZGFkb3NfZmluYWlzXzIwMTVfMjAyMCA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS8yX0RhZG8gdHJhdGFkby9kYWRvc19maW5haXNfMjAxNV8yMDIwLnJkcyIpDQojZGYzPC1zbGljZV9zYW1wbGUoZGFkb3NfZmluYWlzXzIwMTVfMjAyMCxwcm9wID0gMC4wMSkgDQojc2F2ZVJEUyhkZjMsIGZpbGUgPSAic2FtcGxlXzE1XzIwLnJkcyIpDQpgYGANCg0KYGBge3J9DQojQmFzZSBkZSAyMDAwLTIwMTANCnNhbXBsZV8wMF8xMCA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS9zYW1wbGVfMDBfMTAucmRzIikNCiNCYXNlIGRlIDIwMTEtMjAxNQ0Kc2FtcGxlXzEyXzE0IDwtIHJlYWRSRFMoIn4vUlN0dWRpby9FTkVNL3NhbXBsZV8xMl8xNC5yZHMiKQ0KI0Jhc2UgZGUgMjAxNS0yMDE2DQpzYW1wbGVfMTVfMjAgPC0gcmVhZFJEUygifi9SU3R1ZGlvL0VORU0vc2FtcGxlXzE1XzIwLnJkcyIpDQojYmFzZSBkZSBWYXJpYXZlaXMgQW1iaWVudGFpcw0KDQoNCmBgYA0KDQpgYGB7cn0NCiMgdW5pZmljYXIgYmFzZSBkZSBkYWRvcyBhbWJpZW50YWwNCkNlbnRybyA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS9EYXRhLTIwMjIwNjE1VDAxNDk1MFotMDAxL0RhdGEvQ2VudHJvLnJkcyIpDQpORSA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS9EYXRhLTIwMjIwNjE1VDAxNDk1MFotMDAxL0RhdGEvTkUucmRzIikNCk5PIDwtIHJlYWRSRFMoIn4vUlN0dWRpby9FTkVNL0RhdGEtMjAyMjA2MTVUMDE0OTUwWi0wMDEvRGF0YS9OTy5yZHMiKQ0KU0UgPC0gcmVhZFJEUygifi9SU3R1ZGlvL0VORU0vRGF0YS0yMDIyMDYxNVQwMTQ5NTBaLTAwMS9EYXRhL1NFLnJkcyIpDQpTVUwgPC0gcmVhZFJEUygifi9SU3R1ZGlvL0VORU0vRGF0YS0yMDIyMDYxNVQwMTQ5NTBaLTAwMS9EYXRhL1N1bC5yZHMiKQ0KZGZfQW08LWJpbmRfcm93cyhORSwgTk8sIFNFLFNVTCkNCnJtKE5FLE5PLFNFLFNVTCxDZW50cm8pDQpoZWFkKGRmX0FtKQ0KYGBgDQoNCiMjIFByZXBhcmFyIEJhc2VzOg0KDQpTZWxlY2lvbmFyIFZhcmlhdmVpcyBkZSBJbnRlcmVzc2UNCg0KYGBge3J9DQoNCiNCYXNlIGRlIDIwMDAtMjAxMA0Kc2FtcGxlXzAwXzEwJT4lIHNlbGVjdChOVV9JTlNDUklDQU8sI27Dum1lcm8gZGUgaW5zY3Jpw6fDo28NCiAgVFBfU0VYTywNCiAgTlVfQU5PLCNhbm8NCiAgU0dfVUZfUkVTSURFTkNJQSwjRXN0YWRvDQogIE5PX01VTklDSVBJT19SRVNJREVOQ0lBLCNtdW5pY2lwaW8NCiAgQ09fTVVOSUNJUElPX1JFU0lERU5DSUEsI2NvZGlnbyBkbyBtdW5pY2lwaW8NCiAgTlVfTk9UQV9SRURBQ0FPLCNub3RhIFJlZGHDp8Ojbw0KICBOVV9OT1RBX0NPTVAxLCNub3RhIGNvbXBvbmVudGUgWA0KICBOVV9OT1RBX0NPTVAyLCNub3RhIGNvbXBvbmVudGUgWA0KICBOVV9OT1RBX0NPTVAzLCNub3RhIGNvbXBvbmVudGUgWA0KICBOVV9OT1RBX0NPTVA0LA0KICBOVV9OT1RBX0NPTVA1DQogICNub3RhIGNvbXBvbmVudGUgWA0KIyAgLCNRdWVzdMOjbyByZW5kYQ0KIyAgLCNRdWVzdMOjbw0KIyAgLCNRdWVzdMOjbw0KIyAgLCNRdWVzdMOjbw0KKS0+c2FtcGxlXzAwXzEwDQoNCg0KDQojQmFzZSBkZSAyMDExLTIwMTUNCnNhbXBsZV8xMl8xNCU+JSBzZWxlY3QoTlVfSU5TQ1JJQ0FPLCNuw7ptZXJvIGRlIGluc2NyacOnw6NvDQogIFRQX1NFWE8sDQogIE5VX0FOTywjYW5vDQogIFVGX1JFU0lERU5DSUEsI0VzdGFkbw0KICBOT19NVU5JQ0lQSU9fUkVTSURFTkNJQSwjbXVuaWNpcGlvDQogIENPX01VTklDSVBJT19SRVNJREVOQ0lBLCNjb2RpZ28gZG8gbXVuaWNpcGlvDQogIE5VX05PVEFfUkVEQUNBTywjbm90YSBSZWRhw6fDo28NCiAgTlVfTk9UQV9DT01QMSwjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QMiwjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QMywjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QNCwNCiAgTlVfTk9UQV9DT01QNSNub3RhIGNvbXBvbmVudGUgWA0KICAjUXVlc3TDo28gcmVuZGENCiMgICwjUXVlc3TDo28NCiMgICwjUXVlc3TDo28NCiMgICwjUXVlc3TDo28NCiktPnNhbXBsZV8xMl8xNA0KI0Jhc2UgZGUgMjAxNS0yMDE2DQoNCnNhbXBsZV8xNV8yMCU+JSBzZWxlY3QoTlVfSU5TQ1JJQ0FPLCNuw7ptZXJvIGRlIGluc2NyacOnw6NvDQogIFRQX1NFWE8sDQogIE5VX0FOTywjYW5vDQogIFNHX1VGX1JFU0lERU5DSUEsI0VzdGFkbw0KICBOT19NVU5JQ0lQSU9fUkVTSURFTkNJQSwjbXVuaWNpcGlvDQogIENPX01VTklDSVBJT19SRVNJREVOQ0lBLCNjb2RpZ28gZG8gbXVuaWNpcGlvDQogIE5VX05PVEFfUkVEQUNBTywjbm90YSBSZWRhw6fDo28NCiAgTlVfTk9UQV9DT01QMSwjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QMiwjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QMywjbm90YSBjb21wb25lbnRlIFgNCiAgTlVfTk9UQV9DT01QNCwNCiAgTlVfTk9UQV9DT01QNSNub3RhIGNvbXBvbmVudGUgWA0KIyAgLCNRdWVzdMOjbyByZW5kYQ0KIyAgLCNRdWVzdMOjbw0KIyAgLCNRdWVzdMOjbw0KIyAgLCNRdWVzdMOjbw0KKS0+c2FtcGxlXzE1XzIwDQojYmFzZSBkZSBWYXJpYXZlaXMgQW1iaWVudGFpcw0KDQoNCmBgYA0KDQpgYGB7cn0NCmRmX0FtPC1kZl9BbSAlPiUgbXV0YXRlKENPX01VTklDSVBJT19SRVNJREVOQ0lBPWNvZGVfbXVuaSkgJT4lICMgY3JpdGVyaW8gdW5pZmljYWRvcg0KICBncm91cF9ieShDT19NVU5JQ0lQSU9fUkVTSURFTkNJQSxZZWFyLG5hbWVfc3RhdGUsbmFtZV9yZWdpb24pICU+JSAjIGZhdG9yZXMgYSBzZSBtYW50ZXINCiAgc3VtbWFyaXNlKGNvX3BwYj1tZWFuKGNvX3BwYiksIyBtZWRpYSBkYXMgdmFyaWF2ZWlzIGFtYmllbnRhcmlzIHBvciBkaWEvbWVzDQogICAgICAgICAgICBubzJfcHBiPW1lYW4obm8yX3BwYiksDQogICAgICAgICAgICBvM19wcGI9bWVhbihvM19wcGIpLA0KICAgICAgICAgICAgcG0yNV91Z20zPW1lYW4ocG0yNV91Z20zKSwNCiAgICAgICAgICAgIHNvMl91Z20zPW1lYW4oc28yX3VnbTMpLA0KICAgICAgICAgICAgcHJlY2lwdGF0aW9uPW1lYW4ocHJlY2lwdGF0aW9uKSwNCiAgICAgICAgICAgIHRlbXBlcmF0dXJlPW1lYW4odGVtcGVyYXR1cmUpLA0KICAgICAgICAgICAgaHVtaWRpdHk9bWVhbihodW1pZGl0eSksDQogICAgICAgICAgICB3aW5kX2RpcmVjdGlvbj1tZWFuKHdpbmRfZGlyZWN0aW9uKSwNCiAgICAgICAgICAgIHdpbmRfc3BlZWQ9bWVhbih3aW5kX3NwZWVkKSwNCiAgICAgICAgICAgIHdpbGRmaXJlPW1lYW4od2lsZGZpcmUpKSU+JSBkaXN0aW5jdCgpDQpzYXZlUkRTKGRmX0FtLCJiYXNlYW1iaWVudGFsLnJkcyIpDQpkZl9BbSA8LSByZWFkUkRTKCJ+L1JTdHVkaW8vRU5FTS9iYXNlYW1iaWVudGFsLnJkcyIpDQoNCmBgYA0KDQojIyBGdW5kaXIgQmFzZXM6DQoNCmBgYHtyfQ0KDQojQmFzZSBkbyBlbmVtDQpzYW1wbGVfMTJfMTQgJT4lIG11dGF0ZShTR19VRl9SRVNJREVOQ0lBPVVGX1JFU0lERU5DSUEpICU+JSANCiAgc2VsZWN0KC1VRl9SRVNJREVOQ0lBKS0+c2FtcGxlXzEyXzE0DQpzYW1wbGVfMTVfMjAkTlVfQU5PPC1hcy5jaGFyYWN0ZXIoc2FtcGxlXzE1XzIwJE5VX0FOTykNCmRmX2VuZW08LWJpbmRfcm93cyhzYW1wbGVfMDBfMTAsc2FtcGxlXzEyXzE0LHNhbXBsZV8xNV8yMCkNCnNhdmVSRFMoZGZfZW5lbSwiRW5lbWZ1bmRpZG8ucmRzIikNCnJtKHNhbXBsZV8wMF8xMCxzYW1wbGVfMTJfMTQsc2FtcGxlXzE1XzIwKQ0KDQojYmFzZSBkZSBWYXJpYXZlaXMgQW1iaWVudGFpcw0KdW5pcXVlKGRmX0FtJFllYXIpDQp1bmlxdWUoZGZfZW5lbSROVV9BTk8pDQpkZl9lbmVtJE5VX0FOTzwtYXMubnVtZXJpYyhkZl9lbmVtJE5VX0FOTykNCmRmPC1sZWZ0X2pvaW4oZGZfZW5lbSxkZl9BbSxieT1jKCJDT19NVU5JQ0lQSU9fUkVTSURFTkNJQSIsIk5VX0FOTyI9IlllYXIiKSkNCnNhdmVSRFMoZGYsImJhc2UgZGUgcmVmZXJlbmNpYS5yZHMiKQ0Kcm0oZGZfZW5lbSxkZl9BbSkNCmRmIDwtIHJlYWRSRFMoIn4vUlN0dWRpby9FTkVNL2Jhc2UgZGUgcmVmZXJlbmNpYS5yZHMiKQ0KYGBgDQoNCiMgQW5hbGlzZSBFeHBsb3JhdMOzcmlhDQoNCiMjIFN1bcOhcmlvIGRvcyBEYWRvcw0KDQpSZXN1bW8gZG9zIERhZG9zDQoNCmBgYHtyfQ0Kc2tpbShkZikNCmBgYA0KDQpgYGB7cn0NCiNhanVzdGFuZG8gdmFyaWF2ZWlzDQp1bmlxdWUoZGYkVFBfU0VYTykNCmRmWywyXSA8LSBsYXBwbHkoZGZbLDJdLCBhcy5mYWN0b3IpDQpkZlssNDo2XSA8LSBsYXBwbHkoZGZbLDQ6Nl0sIGFzLmZhY3RvcikNCmRmWyw3OjEyXSA8LSBsYXBwbHkoZGZbLDc6MTJdLCBhcy5udW1lcmljKQ0KZGZbLDEyOjEzXSA8LSBsYXBwbHkoZGZbLDEyOjEzXSwgYXMuZmFjdG9yKQ0KDQpgYGANCg0KQW5hbGlzZSBkYXMgdW5pDQoNCmBgYHtyfQ0KI3ZhcmlhdmVpcyBudW3DqXJpY2FzDQogIHBsb3RfbnVtKGRmKQ0KDQpgYGANCg0KXA0KDQpgYGB7cn0NCg0KDQpgYGANCg0KYGBge3J9DQojdmFyaWF2ZWlzIENhdGVnb3JpY2FzDQpmcmVxKGRmKQ0KDQpgYGANCg0KQW5hbGlzZSBkZSBDb3JyZWxhw6fDtWVzDQoNCmBgYHtyfQ0KI2RmMTwtc2xpY2Vfc2FtcGxlKGRmLHByb3AgPSAwLjAxKQ0KZGYxICU+JSBnZ3Bsb3QoYWVzKHg9TlVfQU5PLHkgPU5VX05PVEFfUkVEQUNBTykpKyNnZW9tX2RlbnNpdHkyZF9maWxsZWQoKSsNCiAgZ2VvbV9zbW9vdGgoKStnZW9tX3BvaW50KHNpemU9NSxhbHBoYT0wLjAxKQ0KIyAgZmFjZXRfd3JhcCh+bmFtZV9zdGF0ZSkNCmBgYA0KDQpgYGB7cn0NCmE8LSJhIg0KZm9yIChpIGluIDc6MTIpIHsNCiAgcHJpbnQoaSkNCiAgYTwtcHJpbnQoY29sbmFtZXMoZGYpW2ldKQ0KICBkZjEgJT4lIGdncGxvdChhZXMocG0yNV91Z20zLGEsY29sPW5hbWVfc3RhdGUpKSsNCiAgZ2VvbV9wb2ludCgpICU+JSBwcmludCgpDQogIA0KfQ0KaQ0KI2RmMSAlPiUgZ2dwbG90KGFlcyhwbTI1X3VnbTMsTlVfTk9UQV9SRURBQ0FPLGNvbD1uYW1lX3N0YXRlKSkrDQojICBnZW9tX3BvaW50KCkNCiAgDQpgYGANCg0KIyBSZWdyZXNzw7Vlcw0KDQojIyBNb2RlbG8gYmFzaWNvIGRlIHJlZmVyZW5jaWENCg0KYGBge3J9DQojbW9kZWxvIExpbmVhcg0KPC1sbShOb3RhfiBwb2x1ZW50ZSxkYXRhID0gKQ0KI0VmZWl0b3MgTWlzdG9zDQo8LWxtZXIoTm90YX4gcG9sdWVudGUgKyAoMStwb2x1ZW50ZXxFc3RhZG8pLGRhdGEgPSApDQpzdW1tYXJ5KCkNCnN1bW1hcnkoKQ0KDQpgYGANCg0KZXh0cmHDp8OjbyBkZSBDb2VmaWNpZW50ZXMNCg0KYGBge3J9DQojZXh0cmHDp8OjbyBkZSBDb2VmaWNpZW50ZXMNCmRzDQoNCmBgYA0KDQojVmFsb3IgUHJldmlzdG8NCg0KYGBge3J9DQolPiUgZ2dwbG90KA0KICBhZXMoDQogICAgcHJlZGljdCgpLA0KICAgIGNvbD1lc3RhZG8NCiAgICApDQogICkgKw0KICBnZW9tX3BvaW50KCkNCiAgDQpgYGANCg0KIyMgTW9kZWxvIGNvbSBjb250cm9sZXMNCg0KYGBge3J9DQojbW9kZWxvIExpbmVhcg0KPC1sbShOb3RhfiBwb2x1ZW50ZSxkYXRhID0gKQ0KI0VmZWl0b3MgTWlzdG9zDQo8LWxtZXIoTm90YX4gcG9sdWVudGUgKyAoMStwb2x1ZW50ZXxFc3RhZG8pLGRhdGEgPSApDQpzdW1tYXJ5KCkNCnN1bW1hcnkoKQ0KDQpgYGANCg0KZXh0cmHDp8OjbyBkZSBDb2VmaWNpZW50ZXMNCg0KYGBge3J9DQojZXh0cmHDp8OjbyBkZSBDb2VmaWNpZW50ZXMNCmRzDQoNCmBgYA0KDQojVmFsb3IgUHJldmlzdG8NCg0KYGBge3J9DQolPiUgZ2dwbG90KA0KICBhZXMoDQogICAgcHJlZGljdCgpLA0KICAgIGNvbD1lc3RhZG8NCiAgICApDQogICkgKw0KICBnZW9tX3BvaW50KCkNCiAgDQpgYGANCg0KIyMgTW9kZWxvIGNvbSBjb250cm9sZXMgdmFyaWFuZG8gcG9yIGFubw0KDQojIyBNb2RlbG8gY29tIGNvbnRyb2xlcyB2YXJpYW5kbyBwb3IgbW9kYWxpZGFkZSBlZHVjYWNpb25hbA0KDQojIyBNb2RlbG8gY29tIGNvbnRyb2xlcyB2YXJpYW5kbyBwb3IgbW9kYWxpZGFkZSBlZHVjYWNpb25hbA0K