library(tidyverse);library(tidylog);library(mgcv);library(boot);library(data.table)
Warning: package ‘tidyverse’ was built under R version 4.3.1Warning: package ‘ggplot2’ was built under R version 4.3.3Warning: package ‘tidyr’ was built under R version 4.3.3Warning: package ‘stringr’ was built under R version 4.3.3Warning: package ‘lubridate’ was built under R version 4.3.3── Attaching core tidyverse packages ──────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.0     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.1     ── Conflicts ────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errorsWarning: package ‘tidylog’ was built under R version 4.3.3
Attaching package: ‘tidylog’

The following objects are masked from ‘package:dplyr’:

    add_count, add_tally, anti_join, count, distinct, distinct_all, distinct_at, distinct_if, filter,
    filter_all, filter_at, filter_if, full_join, group_by, group_by_all, group_by_at, group_by_if,
    inner_join, left_join, mutate, mutate_all, mutate_at, mutate_if, relocate, rename, rename_all,
    rename_at, rename_if, rename_with, right_join, sample_frac, sample_n, select, select_all,
    select_at, select_if, semi_join, slice, slice_head, slice_max, slice_min, slice_sample, slice_tail,
    summarise, summarise_all, summarise_at, summarise_if, summarize, summarize_all, summarize_at,
    summarize_if, tally, top_frac, top_n, transmute, transmute_all, transmute_at, transmute_if, ungroup

The following objects are masked from ‘package:tidyr’:

    drop_na, fill, gather, pivot_longer, pivot_wider, replace_na, spread, uncount

The following object is masked from ‘package:stats’:

    filter

Carregando pacotes exigidos: nlme

Attaching package: ‘nlme’

The following object is masked from ‘package:dplyr’:

    collapse

This is mgcv 1.8-42. For overview type 'help("mgcv-package")'.
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.8 using 2 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following objects are masked from ‘package:lubridate’:

    hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:purrr’:

    transpose
library(skimr)
Warning: package ‘skimr’ was built under R version 4.3.1

Open the dataset

Subsistem production Variable

df %>% group_by(Date,nom_subsistema) %>% summarise(ger_subsistema=sum(val_geracao)) %>% 
  right_join(df,by=c("Date","nom_subsistema"))->df
group_by: 2 grouping variables (Date, nom_subsistema)
summarise: now 40,132 rows and 3 columns, one group variable remaining (Date)
right_join: added 14 columns (cod_modalidadeoperacao, nom_estado, nom_tipousina, nom_tipocombustivel, preciptation, …)
            > rows only in x  (        0)
            > rows only in y           0
            > matched rows     1,548,877
            >                 ===========
            > rows total       1,548,877

Descriptive Analisis

df$nom_subsistema<-as.factor(df$nom_subsistema)
summar<-df %>% as.data.frame() %>% skim()
summar
── Data Summary ────────────────────────
                           Values    
Name                       Piped data
Number of rows             1548877   
Number of columns          17        
_______________________              
Column type frequency:               
  Date                     1         
  factor                   5         
  numeric                  11        
________________________             
Group variables            None      

Atrito

df %>% 
  mutate(y=year(Date),
         na=is.na(humidity)*is.na(no2_ppb)*is.na(so2_ugm3)) %>%
  group_by(y,na) %>% summarise(n=n()) %>% spread(na,n) %>% 
  mutate(per=`1`/(`0`+`1`))
mutate (grouped): new variable 'y' (integer) with 22 unique values and 0% NA
                  new variable 'na' (integer) with 2 unique values and 0% NA
group_by: 2 grouping variables (y, na)
summarise: now 41 rows and 3 columns, one group variable remaining (y)
spread: reorganized (na, n) into (0, 1) [was 41x3, now 22x3]
mutate (grouped): new variable 'per' (double) with 20 unique values and 14% NA
df %>% 
  mutate(na=is.na(humidity)*is.na(no2_ppb)*is.na(so2_ugm3)) %>%
  group_by(nom_subsistema,na) %>% summarise(n=n()) %>% spread(na,n) %>% 
  mutate(per=`1`/(`0`+`1`))
mutate (grouped): new variable 'na' (integer) with 2 unique values and 0% NA
group_by: 2 grouping variables (nom_subsistema, na)
summarise: now 10 rows and 3 columns, one group variable remaining (nom_subsistema)
spread: reorganized (na, n) into (0, 1) [was 10x3, now 5x3]
mutate (grouped): new variable 'per' (double) with 5 unique values and 0% NA
df %>% 
  mutate(na=is.na(humidity)*is.na(no2_ppb)*is.na(so2_ugm3)) %>%
  group_by(nom_tipocombustivel,na) %>% summarise(n=n()) %>% spread(na,n) %>% 
  mutate(per=`1`/(`0`+`1`))
mutate (grouped): new variable 'na' (integer) with 2 unique values and 0% NA
group_by: 2 grouping variables (nom_tipocombustivel, na)
summarise: now 22 rows and 3 columns, one group variable remaining (nom_tipocombustivel)
spread: reorganized (na, n) into (0, 1) [was 22x3, now 12x3]
mutate (grouped): new variable 'per' (double) with 11 unique values and 17% NA
df %>% 
  mutate(na=is.na(humidity)*is.na(no2_ppb)*is.na(so2_ugm3)) %>%
  group_by(na,nom_tipocombustivel) %>% summarise(mean=mean(val_geracao),
                                                 sd=sd(val_geracao)) %>% 
  mutate(n=paste0(round(mean,2)," (",round(sd,2),")")) %>% select(-mean,-sd) %>% spread(na,n)
mutate (grouped): new variable 'na' (integer) with 2 unique values and 0% NA
group_by: 2 grouping variables (na, nom_tipocombustivel)
summarise: now 22 rows and 4 columns, one group variable remaining (na)
mutate (grouped): new variable 'n' (character) with 22 unique values and 0% NA
select: dropped 2 variables (mean, sd)
spread: reorganized (na, n) into (0, 1) [was 22x3, now 12x3]
#criar base de atrito
df %>% 
  mutate(na=is.na(humidity)*is.na(no2_ppb)*is.na(so2_ugm3)) %>%filter(na==0)->df1
mutate (grouped): new variable 'na' (integer) with 2 unique values and 0% NA
filter (grouped): removed 454,069 rows (29%), 1,094,808 rows remaining
df1<-df1 %>% mutate(periodo=ifelse(year(Date)>2014,"2015-2022","2000-2014"))
mutate (grouped): new variable 'periodo' (character) with 2 unique values and 0% NA

Analise Inferencial

list()->mods_sum
results<-data.frame()
results.temp<-data.frame()
#### Modelo Ajustado val_geracao#######
#df1$sum.val_geracao_day.
fit.ajusted <- gam(val_geracao~ val_geracao+ger_subsistema +
                     year(Date) + as.factor(month(Date))+as.factor(weekdays(Date))+periodo+
                     s(temperature) + s(preciptation) + s(humidity) + s(wind_speed) +s(co_ppb), data=df1)     
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuida
gc()
           used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  3676082 196.4    6056267  323.5   6056267  323.5
Vcells 42593140 325.0  545233328 4159.9 709533640 5413.4
##SE
Vcov <- vcov(fit.ajusted, useScale = FALSE)
Std_Errors <- sqrt(diag(Vcov))
se <- Std_Errors[3]

fit.ajusted$coefficients[4]#-3.316e+00
as.factor(month(Date))2 
               370.6689 
results.temp[1,1]<-"Full_base"
results.temp[1,2]<-fit.ajusted$coefficients[3]
results.temp[1,3]<-"ADJUSTED"
results.temp[1,4]<-"val_geracao"
results.temp[1,5] <- se
results.temp[1,6] <- length(df1$nom_reservatorio)
Warning: Unknown or uninitialised column: `nom_reservatorio`.
colnames(results.temp)<-c("subset", "Generation_Trend","model","Variavel Respota","SE","n")
results<-rbind(results, results.temp)
#mods_sum_Full_base_ajusted<-summary(fit.ajusted)

#### Modelo não ajustad val_geracao#######
#df1$sum.val_geracao_day.
fit.ajusted <- gam(val_geracao~ val_geracao+ger_subsistema +
                     year(Date) + as.factor(month(Date))+periodo+as.factor(weekdays(Date)), data=df1)     
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuida
##SE
Vcov <- vcov(fit.ajusted, useScale = FALSE)
Std_Errors <- sqrt(diag(Vcov))
se <- Std_Errors[3]


results.temp[1,1]<-"Full_base"
results.temp[1,2]<-fit.ajusted$coefficients[3]
results.temp[1,3]<-"UNADJUSTED"
results.temp[1,4]<-"val_geracao"
results.temp[1,5] <- se
results.temp[1,6] <- length(df1$nom_reservatorio)
Warning: Unknown or uninitialised column: `nom_reservatorio`.
colnames(results.temp)<-c("subset", "Generation_Trend","model","Variavel Respota","SE","n")
#mods_sum_Full_base_unajusted<-summary(fit.ajusted)

results<-rbind(results, results.temp)
#results %>% distinct()
results

LOOPING

a<-unique(df1$nom_tipocombustivel)

### Step 2 ###
##############
for (k in a)  {
  print(a)#### Por tipo de usina
  results.temp <- data.frame()
  #modelo não Ajustado
  df1 %>% filter(nom_tipocombustivel==k) ->df
  #### Modelo Ajustado val_geracao#######
#df1$sum.val_geracao_day.
fit.ajusted <- gam(val_geracao~ val_geracao+ger_subsistema +
                     year(Date) + as.factor(month(Date))+as.factor(weekdays(Date))+periodo+
                     s(temperature) + s(preciptation) + s(humidity) + s(wind_speed) +s(co_ppb), data=df)     

##SE
Vcov <- vcov(fit.ajusted, useScale = FALSE)
Std_Errors <- sqrt(diag(Vcov))
se <- Std_Errors[3]

fit.ajusted$coefficients[4]#-3.316e+00
results.temp[1,1]<-k
results.temp[1,2]<-fit.ajusted$coefficients[3]
results.temp[1,3]<-"ADJUSTED"
results.temp[1,4]<-"val_geracao"
results.temp[1,5] <- se
results.temp[1,6] <- length(df1$nom_reservatorio)
colnames(results.temp)<-c("subset", "Generation_Trend","model","Variavel Respota","SE","n")
results<-rbind(results, results.temp)

#### Modelo não ajustad val_geracao#######
#df1$sum.val_geracao_day.
fit.ajusted <- gam(val_geracao~ val_geracao+ger_subsistema +
                     year(Date) + as.factor(month(Date))+periodo+as.factor(weekdays(Date)), data=df)     

##SE
Vcov <- vcov(fit.ajusted, useScale = FALSE)
Std_Errors <- sqrt(diag(Vcov))
se <- Std_Errors[3]


results.temp[1,1]<-k
results.temp[1,2]<-fit.ajusted$coefficients[3]
results.temp[1,3]<-"UNADJUSTED"
results.temp[1,4]<-"val_geracao"
results.temp[1,5] <- se
results.temp[1,6] <- length(df1$nom_reservatorio)
colnames(results.temp)<-c("subset", "Generation_Trend","model","Variavel Respota","SE","n")

results<-rbind(results, results.temp)
#results %>% distinct()
}
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 325,375 rows (30%), 769,433 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 970,751 rows (89%), 124,057 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,087,881 rows (99%), 6,927 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,073,285 rows (98%), 21,523 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,064,422 rows (97%), 30,386 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,051,914 rows (96%), 42,894 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,039,510 rows (95%), 55,298 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,064,181 rows (97%), 30,627 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,082,416 rows (99%), 12,392 rows remaining
Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.Warning: a resposta apareceu no lado direito e foi descartadaWarning: problema com o termo 1 na matriz do modelo: nenhuma coluna foi atribuidaWarning: Unknown or uninitialised column: `nom_reservatorio`.
 [1] Hidráulica           Gás                  Nuclear              Carvão               Óleo Diesel         
 [6] Óleo Combustível     Biomassa             Eólica               Resíduos Industriais Fotovoltaica        
11 Levels: Biomassa Carvão Eólica Fotovoltaica Gás Hidráulica Nuclear Óleo Combustível ... Resíduos Industriais
filter (grouped): removed 1,093,537 rows (>99%), 1,271 rows remaining
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrastes podem ser aplicados apenas a fatores com 2 ou mais níveis
results %>% ggplot(aes(x=Generation_Trend,y=subset,col=model,
                       xmax=Generation_Trend+se*1.96,
                       xmin=Generation_Trend-se*1.96))+
                     geom_point()+
  facet_wrap(~subset,scales="free")+geom_errorbar()+coord_flip() + theme_minimal()

LS0tDQp0aXRsZTogIkVuZXJneSBFbnZpcm9tZW50YWwgQW5hbGlzaXMiDQphdXRob3I6ICJUaGlhZ28gTi4gR2FyZGluICYgRGFuaWVsIERhbmEiDQpkYXRlOiAiMjAyNC0wNC0xNiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpO2xpYnJhcnkodGlkeWxvZyk7bGlicmFyeShtZ2N2KTtsaWJyYXJ5KGJvb3QpO2xpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoc2tpbXIpDQpgYGANCg0KIyMjIE9wZW4gdGhlIGRhdGFzZXQNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpkZjwtcmVhZFJEUygiRW5lcmdpYV9hbWJpZW50YWxfZGnDoXJpby5yZHMiKSAlPiUgYXMuZGF0YS50YWJsZSgpDQoNCmBgYA0KIyBTdWJzaXN0ZW0gcHJvZHVjdGlvbiBWYXJpYWJsZQ0KYGBge3J9DQpkZiAlPiUgZ3JvdXBfYnkoRGF0ZSxub21fc3Vic2lzdGVtYSkgJT4lIHN1bW1hcmlzZShnZXJfc3Vic2lzdGVtYT1zdW0odmFsX2dlcmFjYW8pKSAlPiUgDQogIHJpZ2h0X2pvaW4oZGYsYnk9YygiRGF0ZSIsIm5vbV9zdWJzaXN0ZW1hIikpLT5kZg0KDQpgYGANCiMjIyBEZXNjcmlwdGl2ZSBBbmFsaXNpcw0KDQpgYGB7cn0NCmRmJG5vbV9zdWJzaXN0ZW1hPC1hcy5mYWN0b3IoZGYkbm9tX3N1YnNpc3RlbWEpDQpzdW1tYXI8LWRmICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNraW0oKQ0Kc3VtbWFyDQpgYGANCiMgQXRyaXRvDQpgYGB7cn0NCmRmICU+JSANCiAgbXV0YXRlKHk9eWVhcihEYXRlKSwNCiAgICAgICAgIG5hPWlzLm5hKGh1bWlkaXR5KSppcy5uYShubzJfcHBiKSppcy5uYShzbzJfdWdtMykpICU+JQ0KICBncm91cF9ieSh5LG5hKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgc3ByZWFkKG5hLG4pICU+JSANCiAgbXV0YXRlKHBlcj1gMWAvKGAwYCtgMWApKQ0KYGBgDQoNCmBgYHtyfQ0KZGYgJT4lIA0KICBtdXRhdGUobmE9aXMubmEoaHVtaWRpdHkpKmlzLm5hKG5vMl9wcGIpKmlzLm5hKHNvMl91Z20zKSkgJT4lDQogIGdyb3VwX2J5KG5vbV9zdWJzaXN0ZW1hLG5hKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgc3ByZWFkKG5hLG4pICU+JSANCiAgbXV0YXRlKHBlcj1gMWAvKGAwYCtgMWApKQ0KYGBgDQpgYGB7cn0NCmRmICU+JSANCiAgbXV0YXRlKG5hPWlzLm5hKGh1bWlkaXR5KSppcy5uYShubzJfcHBiKSppcy5uYShzbzJfdWdtMykpICU+JQ0KICBncm91cF9ieShub21fdGlwb2NvbWJ1c3RpdmVsLG5hKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgc3ByZWFkKG5hLG4pICU+JSANCiAgbXV0YXRlKHBlcj1gMWAvKGAwYCtgMWApKQ0KYGBgDQpgYGB7cn0NCmRmICU+JSANCiAgbXV0YXRlKG5hPWlzLm5hKGh1bWlkaXR5KSppcy5uYShubzJfcHBiKSppcy5uYShzbzJfdWdtMykpICU+JQ0KICBncm91cF9ieShuYSxub21fdGlwb2NvbWJ1c3RpdmVsKSAlPiUgc3VtbWFyaXNlKG1lYW49bWVhbih2YWxfZ2VyYWNhbyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Q9c2QodmFsX2dlcmFjYW8pKSAlPiUgDQogIG11dGF0ZShuPXBhc3RlMChyb3VuZChtZWFuLDIpLCIgKCIscm91bmQoc2QsMiksIikiKSkgJT4lIHNlbGVjdCgtbWVhbiwtc2QpICU+JSBzcHJlYWQobmEsbikNCmBgYA0KYGBge3J9DQojY3JpYXIgYmFzZSBkZSBhdHJpdG8NCmRmICU+JSANCiAgbXV0YXRlKG5hPWlzLm5hKGh1bWlkaXR5KSppcy5uYShubzJfcHBiKSppcy5uYShzbzJfdWdtMykpICU+JWZpbHRlcihuYT09MCktPmRmMQ0KYGBgDQpgYGB7cn0NCmRmMTwtZGYxICU+JSBtdXRhdGUocGVyaW9kbz1pZmVsc2UoeWVhcihEYXRlKT4yMDE0LCIyMDE1LTIwMjIiLCIyMDAwLTIwMTQiKSkNCg0KYGBgDQoNCiMjIEFuYWxpc2UgSW5mZXJlbmNpYWwNCg0KYGBge3J9DQpsaXN0KCktPm1vZHNfc3VtDQpyZXN1bHRzPC1kYXRhLmZyYW1lKCkNCnJlc3VsdHMudGVtcDwtZGF0YS5mcmFtZSgpDQojIyMjIE1vZGVsbyBBanVzdGFkbyB2YWxfZ2VyYWNhbyMjIyMjIyMNCiNkZjEkc3VtLnZhbF9nZXJhY2FvX2RheS4NCmZpdC5hanVzdGVkIDwtIGdhbSh2YWxfZ2VyYWNhb34gdmFsX2dlcmFjYW8rZ2VyX3N1YnNpc3RlbWEgKw0KICAgICAgICAgICAgICAgICAgICAgeWVhcihEYXRlKSArIGFzLmZhY3Rvcihtb250aChEYXRlKSkrYXMuZmFjdG9yKHdlZWtkYXlzKERhdGUpKStwZXJpb2RvKw0KICAgICAgICAgICAgICAgICAgICAgcyh0ZW1wZXJhdHVyZSkgKyBzKHByZWNpcHRhdGlvbikgKyBzKGh1bWlkaXR5KSArIHMod2luZF9zcGVlZCkgK3MoY29fcHBiKSwgZGF0YT1kZjEpICAgICANCiMjU0UNClZjb3YgPC0gdmNvdihmaXQuYWp1c3RlZCwgdXNlU2NhbGUgPSBGQUxTRSkNClN0ZF9FcnJvcnMgPC0gc3FydChkaWFnKFZjb3YpKQ0Kc2UgPC0gU3RkX0Vycm9yc1szXQ0KDQpmaXQuYWp1c3RlZCRjb2VmZmljaWVudHNbNF0jLTMuMzE2ZSswMA0KcmVzdWx0cy50ZW1wWzEsMV08LSJGdWxsX2Jhc2UiDQpyZXN1bHRzLnRlbXBbMSwyXTwtZml0LmFqdXN0ZWQkY29lZmZpY2llbnRzWzNdDQpyZXN1bHRzLnRlbXBbMSwzXTwtIkFESlVTVEVEIg0KcmVzdWx0cy50ZW1wWzEsNF08LSJ2YWxfZ2VyYWNhbyINCnJlc3VsdHMudGVtcFsxLDVdIDwtIHNlDQpyZXN1bHRzLnRlbXBbMSw2XSA8LSBsZW5ndGgoZGYxJG5vbV9yZXNlcnZhdG9yaW8pDQpjb2xuYW1lcyhyZXN1bHRzLnRlbXApPC1jKCJzdWJzZXQiLCAiR2VuZXJhdGlvbl9UcmVuZCIsIm1vZGVsIiwiVmFyaWF2ZWwgUmVzcG90YSIsIlNFIiwibiIpDQpyZXN1bHRzPC1yYmluZChyZXN1bHRzLCByZXN1bHRzLnRlbXApDQojbW9kc19zdW1fRnVsbF9iYXNlX2FqdXN0ZWQ8LXN1bW1hcnkoZml0LmFqdXN0ZWQpDQoNCiMjIyMgTW9kZWxvIG7Do28gYWp1c3RhZCB2YWxfZ2VyYWNhbyMjIyMjIyMNCiNkZjEkc3VtLnZhbF9nZXJhY2FvX2RheS4NCmZpdC5hanVzdGVkIDwtIGdhbSh2YWxfZ2VyYWNhb34gdmFsX2dlcmFjYW8rZ2VyX3N1YnNpc3RlbWEgKw0KICAgICAgICAgICAgICAgICAgICAgeWVhcihEYXRlKSArIGFzLmZhY3Rvcihtb250aChEYXRlKSkrcGVyaW9kbythcy5mYWN0b3Iod2Vla2RheXMoRGF0ZSkpLCBkYXRhPWRmMSkgICAgIA0KIyNTRQ0KVmNvdiA8LSB2Y292KGZpdC5hanVzdGVkLCB1c2VTY2FsZSA9IEZBTFNFKQ0KU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQpzZSA8LSBTdGRfRXJyb3JzWzNdDQoNCg0KcmVzdWx0cy50ZW1wWzEsMV08LSJGdWxsX2Jhc2UiDQpyZXN1bHRzLnRlbXBbMSwyXTwtZml0LmFqdXN0ZWQkY29lZmZpY2llbnRzWzNdDQpyZXN1bHRzLnRlbXBbMSwzXTwtIlVOQURKVVNURUQiDQpyZXN1bHRzLnRlbXBbMSw0XTwtInZhbF9nZXJhY2FvIg0KcmVzdWx0cy50ZW1wWzEsNV0gPC0gc2UNCnJlc3VsdHMudGVtcFsxLDZdIDwtIGxlbmd0aChkZjEkbm9tX3Jlc2VydmF0b3JpbykNCmNvbG5hbWVzKHJlc3VsdHMudGVtcCk8LWMoInN1YnNldCIsICJHZW5lcmF0aW9uX1RyZW5kIiwibW9kZWwiLCJWYXJpYXZlbCBSZXNwb3RhIiwiU0UiLCJuIikNCiNtb2RzX3N1bV9GdWxsX2Jhc2VfdW5hanVzdGVkPC1zdW1tYXJ5KGZpdC5hanVzdGVkKQ0KDQpyZXN1bHRzPC1yYmluZChyZXN1bHRzLCByZXN1bHRzLnRlbXApDQojcmVzdWx0cyAlPiUgZGlzdGluY3QoKQ0KDQpgYGANCmBgYHtyfQ0KcmVzdWx0cw0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KTE9PUElORw0KDQpgYGB7cn0NCnJlc3VsdHM8LXJlc3VsdHNbMToyLF0NCmBgYA0KDQpgYGB7cn0NCmE8LXVuaXF1ZShkZjEkbm9tX3RpcG9jb21idXN0aXZlbCkNCg0KIyMjIFN0ZXAgMiAjIyMNCiMjIyMjIyMjIyMjIyMjDQpmb3IgKGsgaW4gYSkgIHsNCiAgcHJpbnQoYSkjIyMjIFBvciB0aXBvIGRlIHVzaW5hDQogIHJlc3VsdHMudGVtcCA8LSBkYXRhLmZyYW1lKCkNCiAgI21vZGVsbyBuw6NvIEFqdXN0YWRvDQogIGRmMSAlPiUgZmlsdGVyKG5vbV90aXBvY29tYnVzdGl2ZWw9PWspIC0+ZGYNCiAgIyMjIyBNb2RlbG8gQWp1c3RhZG8gdmFsX2dlcmFjYW8jIyMjIyMjDQojZGYxJHN1bS52YWxfZ2VyYWNhb19kYXkuDQpmaXQuYWp1c3RlZCA8LSBnYW0odmFsX2dlcmFjYW9+IHZhbF9nZXJhY2FvK2dlcl9zdWJzaXN0ZW1hICsNCiAgICAgICAgICAgICAgICAgICAgIHllYXIoRGF0ZSkgKyBhcy5mYWN0b3IobW9udGgoRGF0ZSkpK2FzLmZhY3Rvcih3ZWVrZGF5cyhEYXRlKSkrcGVyaW9kbysNCiAgICAgICAgICAgICAgICAgICAgIHModGVtcGVyYXR1cmUpICsgcyhwcmVjaXB0YXRpb24pICsgcyhodW1pZGl0eSkgKyBzKHdpbmRfc3BlZWQpICtzKGNvX3BwYiksIGRhdGE9ZGYpICAgICANCg0KIyNTRQ0KVmNvdiA8LSB2Y292KGZpdC5hanVzdGVkLCB1c2VTY2FsZSA9IEZBTFNFKQ0KU3RkX0Vycm9ycyA8LSBzcXJ0KGRpYWcoVmNvdikpDQpzZSA8LSBTdGRfRXJyb3JzWzNdDQoNCmZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1s0XSMtMy4zMTZlKzAwDQpyZXN1bHRzLnRlbXBbMSwxXTwtaw0KcmVzdWx0cy50ZW1wWzEsMl08LWZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1szXQ0KcmVzdWx0cy50ZW1wWzEsM108LSJBREpVU1RFRCINCnJlc3VsdHMudGVtcFsxLDRdPC0idmFsX2dlcmFjYW8iDQpyZXN1bHRzLnRlbXBbMSw1XSA8LSBzZQ0KcmVzdWx0cy50ZW1wWzEsNl0gPC0gbGVuZ3RoKGRmMSRub21fcmVzZXJ2YXRvcmlvKQ0KY29sbmFtZXMocmVzdWx0cy50ZW1wKTwtYygic3Vic2V0IiwgIkdlbmVyYXRpb25fVHJlbmQiLCJtb2RlbCIsIlZhcmlhdmVsIFJlc3BvdGEiLCJTRSIsIm4iKQ0KcmVzdWx0czwtcmJpbmQocmVzdWx0cywgcmVzdWx0cy50ZW1wKQ0KDQojIyMjIE1vZGVsbyBuw6NvIGFqdXN0YWQgdmFsX2dlcmFjYW8jIyMjIyMjDQojZGYxJHN1bS52YWxfZ2VyYWNhb19kYXkuDQpmaXQuYWp1c3RlZCA8LSBnYW0odmFsX2dlcmFjYW9+IHZhbF9nZXJhY2FvK2dlcl9zdWJzaXN0ZW1hICsNCiAgICAgICAgICAgICAgICAgICAgIHllYXIoRGF0ZSkgKyBhcy5mYWN0b3IobW9udGgoRGF0ZSkpK3BlcmlvZG8rYXMuZmFjdG9yKHdlZWtkYXlzKERhdGUpKSwgZGF0YT1kZikgICAgIA0KDQojI1NFDQpWY292IDwtIHZjb3YoZml0LmFqdXN0ZWQsIHVzZVNjYWxlID0gRkFMU0UpDQpTdGRfRXJyb3JzIDwtIHNxcnQoZGlhZyhWY292KSkNCnNlIDwtIFN0ZF9FcnJvcnNbM10NCg0KDQpyZXN1bHRzLnRlbXBbMSwxXTwtaw0KcmVzdWx0cy50ZW1wWzEsMl08LWZpdC5hanVzdGVkJGNvZWZmaWNpZW50c1szXQ0KcmVzdWx0cy50ZW1wWzEsM108LSJVTkFESlVTVEVEIg0KcmVzdWx0cy50ZW1wWzEsNF08LSJ2YWxfZ2VyYWNhbyINCnJlc3VsdHMudGVtcFsxLDVdIDwtIHNlDQpyZXN1bHRzLnRlbXBbMSw2XSA8LSBsZW5ndGgoZGYxJG5vbV9yZXNlcnZhdG9yaW8pDQpjb2xuYW1lcyhyZXN1bHRzLnRlbXApPC1jKCJzdWJzZXQiLCAiR2VuZXJhdGlvbl9UcmVuZCIsIm1vZGVsIiwiVmFyaWF2ZWwgUmVzcG90YSIsIlNFIiwibiIpDQoNCnJlc3VsdHM8LXJiaW5kKHJlc3VsdHMsIHJlc3VsdHMudGVtcCkNCiNyZXN1bHRzICU+JSBkaXN0aW5jdCgpDQp9DQpgYGANCg0KDQoNCmBgYHtyfQ0KcmVzdWx0cyAlPiUgZ2dwbG90KGFlcyh4PUdlbmVyYXRpb25fVHJlbmQseT1zdWJzZXQsY29sPW1vZGVsLA0KICAgICAgICAgICAgICAgICAgICAgICB4bWF4PUdlbmVyYXRpb25fVHJlbmQrc2UqMS45NiwNCiAgICAgICAgICAgICAgICAgICAgICAgeG1pbj1HZW5lcmF0aW9uX1RyZW5kLXNlKjEuOTYpKSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSsNCiAgZmFjZXRfd3JhcCh+c3Vic2V0LHNjYWxlcz0iZnJlZSIpK2dlb21fZXJyb3JiYXIoKStjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg0KDQo=