Análise de Sobrevivência - Projeto 01

1 Análise descritiva

1.1 Descrição da base

library(readr)
library(survival)
library(flexsurv)
library(knitr)
library(ggplot2)
library(RColorBrewer)
library(pacman)
library(tidyverse)
library(scales)
pacman::p_load(knitr, captioner, bundesligR, stringr)

table_nums <- captioner::captioner(prefix = "Tabela")
tab.1_cap <- table_nums(name = "tab_1", 
                         caption = "Descrição das variáveis da base de dados")


Drogas_SP <- read_csv("Drogas-SP.csv")[,-5]

Os dados são provenientes da Pesquisa Nacional de Saúde do Escolar (PeNSE) de 2015, conduzida pelo IBGE, e se referem ao tempo até a experimentação de drogas ilícitas em uma amostra de estudantes do 9º ano do ensino fundamental de escolas privadas da cidade de São Paulo.

A base de dados contém 445 observações e 11 variáveis.

A variável V0007 foi removida por não conter descrição.

1.2 Descrição das variáveis


Tabela 1: Descrição das variáveis da base de dados


desc_variaveis <- data.frame(Variável = colnames(Drogas_SP),
                             Renomeando = c("tempo",
                                             "censura",
                                             "sexo",
                                             "cor_raca", 
                                             "mora_mae",
                                             "tempo_livre_responsaveis",
                                             "bebida_alcoolica",
                                             "cigarro",
                                             "responsavel_fuma",
                                             "sentido_sozinho",
                                             "amigos_drogas"),
                             Descrição = c("Tempo até o primeiro uso de drogas ilícitas, como: maconha, cocaína, crack, loló, lança-perfume, ecstasy, oxy, etc (variável resposta)",
                                           "Indicador de censura ",
                                           "Qual é o seu sexo?",
                                           "Qual é a sua cor ou raça? ",
                                           "Você mora com sua mãe? ",
                                           "NOS ÚLTIMOS 30 DIAS, com que frequência seus pais ou responsáveis sabiam realmente o que você estava fazendo em seu tempo livre? ",
                                           "Alguma vez na vida você tomou uma dose de bebida alcoólica? (Uma dose equivale a uma lata de cerveja ou uma taça de vinho ou uma dose de cachaça ou uísque etc) ",
                                           "Alguma vez na vida, você já fumou cigarro, mesmo uma ou duas tragadas? ",
                                           "Algum de seus pais ou responsáveis fuma? ",
                                           "NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)? ",
                                           "Quantos amigos seus usam drogas? "),
                             
                             Categorias =c("-","0=censura e 1=falha","1=Masculino e 2=Feminino","1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena e  99=Não informado","1=Sim, 2=Não e 99=Não informado","1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre e 99=Não informado","1=Sim, 2=Não e 99=Não informado","1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado", "1=Sim, 2=Não e 99=Não informado","1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes, 5=Sempre e 99=Não informado","1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei e 99=Não informado"))

knitr::kable(desc_variaveis)
Variável Renomeando Descrição Categorias
Tempo tempo Tempo até o primeiro uso de drogas ilícitas, como: maconha, cocaína, crack, loló, lança-perfume, ecstasy, oxy, etc (variável resposta) -
Censura censura Indicador de censura 0=censura e 1=falha
VB01001 sexo Qual é o seu sexo? 1=Masculino e 2=Feminino
VB01002 cor_raca Qual é a sua cor ou raça? 1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena e 99=Não informado
VB01006 mora_mae Você mora com sua mãe? 1=Sim, 2=Não e 99=Não informado
VB07002 tempo_livre_responsaveis NOS ÚLTIMOS 30 DIAS, com que frequência seus pais ou responsáveis sabiam realmente o que você estava fazendo em seu tempo livre? 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre e 99=Não informado
VB05002 bebida_alcoolica Alguma vez na vida você tomou uma dose de bebida alcoólica? (Uma dose equivale a uma lata de cerveja ou uma taça de vinho ou uma dose de cachaça ou uísque etc) 1=Sim, 2=Não e 99=Não informado
VB04001 cigarro Alguma vez na vida, você já fumou cigarro, mesmo uma ou duas tragadas? 1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado
VB04006A responsavel_fuma Algum de seus pais ou responsáveis fuma? 1=Sim, 2=Não e 99=Não informado
VB12001 sentido_sozinho NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)? 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes, 5=Sempre e 99=Não informado
VB06006 amigos_drogas Quantos amigos seus usam drogas? 1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei e 99=Não informado
colnames(Drogas_SP)<- c("tempo",
                        "censura",
                        "sexo",
                        "cor_raca",
                        "mora_mae",
                        "tempo_livre_responsaveis",
                        "bebida_alcoolica",
                        "cigarro",
                        "responsavel_fuma",
                        "sentido_sozinho",
                        "amigos_drogas")

1.3 Falhas e censuras

falhas_censuras <- data.frame(Categoria = c("Censura","Falha"),Percentual=round(as.matrix((table(Drogas_SP$censura)/445)*100),2))

ggplot(falhas_censuras, aes(x="", y=Percentual, fill=Categoria))+
  geom_bar(width = 1, stat = "identity")+
  coord_polar("y", start=0)+
  scale_fill_brewer(palette="Set1")+
  theme_minimal()+
  ggtitle("Percentual de falhas e censuras")+
 theme(axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks.y=element_blank(),
      plot.title = element_text(hjust = 0.5)) +
  xlab(element_blank())+
  ylab(element_blank())+
  geom_text(aes(x =c(1,1.2) ,y = c(50, 5), 
            label = paste(`Percentual`,"%")), size=5)

De acordo com a Figura 1,

  • 90.34% dos estudantes da amostra ainda não experimentaram drogas ilícitas.
  • 9.66% dos estudantes da amostra já experimentaram drogas ilícitas.

1.4 Variável resposta

A variável resposta ‘tempo’, que corresponde ao tempo até o primeiro uso de drogas no contexto de análise de sobrevivência, nada mais é que a idade dos estudantes no momento que a coleta dos dados pela PeNSE foi realizada.

par(mfrow=c(4,1))

ggplot(data = Drogas_SP, aes (y = tempo))+
  geom_boxplot(fill="#E69F00") + 
  theme_classic() + 
  scale_fill_brewer(palette="Set1")+
  ggtitle("Boxplot do tempo até o primeiro uso de drogas (Idade dos estudantes na PeNSE)\n")+
  theme(plot.title = element_text(hjust = 0.5))+
  ylab("Idade\n")

De acordo com o boxplot, podemos observar que:

  • As idades mínima e máxima observadas nos estudantes da amostra são 11 e 16 anos, respectivamente, e ambas são consideradas outliers ;
  • De acordo com o primeiro quartil, 25% dos estudantes da amostra possuem idade igual ou inferior a 13 anos;
  • De acordo com a mediana, 50% dos estudantes da amostra possuem idade igual ou inferior a 14 anos;
  • De acordo com o terceiro quartil, 75% dos estudantes da amostra possuem idade igual ou inferior a 14 anos;
  • De acordo com o intervalo interquartil, 50% dos estudantes da amostra possuem idade entre 13 e 14 anos.

1.5 Covariáveis

As demais variáveis se referem às seguintes perguntas feitas na pesquisa:

1.5.1 Qual é o seu sexo?

sexo <- data.frame(Sexo =  c("Masculino","Feminino"),Percentual=round(as.matrix((table(Drogas_SP$sexo)/445)*100),2))

ggplot(sexo, aes(x="", y=Percentual, fill=Sexo))+
  geom_bar(width = 1, stat = "identity")+
  coord_polar("y", start=0)+
  scale_fill_brewer(palette="Set1")+
  theme_minimal()+
  ggtitle("Percentual de obs. por categorias de 'sexo'" )+
 theme(axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks.y=element_blank(),
      plot.title = element_text(hjust = 0.5)) +
  xlab(element_blank())+
  ylab(element_blank())+
  geom_text(aes(y = `Percentual`/2 + c(0, cumsum(`Percentual`)[-length(`Percentual`)]), 
            label = paste(`Percentual`,"%")), size=5)

1.5.2 Qual é a sua cor ou raça?

cor_raca <- data.frame(Cor=c("Branca","Preta","Amarela","Parda","Indigena"),Percentual = round(as.matrix((table(Drogas_SP$cor_raca)/445)*100),2))

ggplot(cor_raca, aes(x=Cor, y=Percentual,fill=Cor)) +
  geom_bar(stat="identity",color="black", width=0.8)+
  ylim(0,100)+
  geom_text(aes(label= paste0(Percentual,"%")), vjust=-1.5, color="black", size=3.5)+
  scale_fill_brewer(palette="Set1")+
  xlab("\nCor")+
  ylab("Percentual (%)\n")+
  ggtitle("Percentual de obs. por categorias de 'cor_raca'\n" )+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5))

1.5.3 Você mora com sua mãe?

mora_mae <- data.frame(Categoria = c("Sim","Não"),Percentual=round(as.matrix((table(Drogas_SP$mora_mae)/445)*100),2))

ggplot(mora_mae, aes(x="", y=Percentual, fill=Categoria))+
  geom_bar(width = 1, stat = "identity")+
  coord_polar("y", start=0)+
  scale_fill_brewer(palette="Set1")+
  theme_minimal()+
  ggtitle("Percentual de obs. por categorias de 'mora_mae'" )+
 theme(axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks.y=element_blank(),
      plot.title = element_text(hjust = 0.5)) +
  xlab(element_blank())+
  ylab(element_blank())+
  geom_text(aes(x=c(1,1.3),y = c(45.17,100), 
            label = paste(`Percentual`,"%")), size=5)

1.5.4 NOS ÚLTIMOS 30 DIAS, com que frequência seus pais ou responsáveis sabiam realmente o que você estava fazendo em seu tempo livre?

tempo_livre_responsaveis <- data.frame(Categoria=c("Nunca", "Raramente", "Às vezes", "Na maior parte do tempo", "Sempre"),Percentual = round(as.matrix((table(Drogas_SP$tempo_livre_responsaveis)/445)*100),2))

ggplot(tempo_livre_responsaveis, aes(x=Categoria, y=Percentual,fill=Categoria)) +
  geom_bar(stat="identity",color="black", width=0.8)+
  ylim(0,100)+
  geom_text(aes(label= paste0(Percentual,"%")), vjust=-1.5, color="black", size=3.5)+
  scale_fill_brewer(palette="Set1")+
  xlab("\nCor")+
  ylab("Percentual (%)\n")+
  ggtitle("Percentual de obs. por categorias de 'tempo_livre_responsaveis'\n" )+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5))

1.5.5 Alguma vez na vida você tomou uma dose de bebida alcoólica?

bebida_alcoolica <- data.frame(Categoria = c("Sim","Não"),Percentual = round(as.matrix((table(Drogas_SP$bebida_alcoolica)/445)*100),2))

ggplot(bebida_alcoolica, aes(x="", y=Percentual, fill=Categoria))+
  geom_bar(width = 1, stat = "identity")+
  coord_polar("y", start=0)+
  scale_fill_brewer(palette="Set1")+
  theme_minimal()+
  ggtitle("Percentual de obs. por categorias de 'bebida_alcoolica'" )+
 theme(axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks.y=element_blank(),
      plot.title = element_text(hjust = 0.5)) +
  xlab(element_blank())+
  ylab(element_blank())+
  geom_text(aes(x=c(0.9,0.9),y = c(25,75), 
            label = paste(`Percentual`,"%")), size=5)

1.5.6 Alguma vez na vida, você já fumou cigarro, mesmo uma ou duas tragadas?

cigarro <- data.frame(Categoria = c("Sim","Não"),Percentual= round(as.matrix((table(Drogas_SP$cigarro)/445)*100),2))

ggplot(cigarro, aes(x="", y=Percentual, fill=Categoria))+
  geom_bar(width = 1, stat = "identity")+
  coord_polar("y", start=0)+
  scale_fill_brewer(palette="Set1")+
  theme_minimal()+
  ggtitle("Percentual de obs. por categorias de 'cigarro'" )+
 theme(axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks.y=element_blank(),
      plot.title = element_text(hjust = 0.5)) +
  xlab(element_blank())+
  ylab(element_blank())+
  geom_text(aes(x=c(1.2,0.9),y = c(10,55), 
            label = paste(`Percentual`,"%")), size=5)

1.5.7 Algum de seus pais ou responsáveis fuma?

responsavel_fuma <- data.frame(Categoria = c("Nenhum deles", "Só meu pai ou responsável do sexo masculino", "Só minha mãe ou responsável do sexo feminino", "Meu pai e minha mãe ou responsáveis", "Não sei", "Não informado"),Percentual = round(as.matrix((table(Drogas_SP$responsavel_fuma)/445)*100),2))

ggplot(responsavel_fuma, aes(x=Categoria, y=Percentual,fill=Categoria)) +
  geom_bar(stat="identity",color="black", width=0.8)+
  ylim(0,100)+
  geom_text(aes(label= paste0(Percentual,"%")), vjust=-1.5, color="black", size=3.5)+
  scale_fill_brewer(palette="Set1")+
  xlab("\nCor")+
  ylab("Percentual (%)\n")+
  ggtitle("Percentual de obs. por categorias de 'responsavel_fuma'\n" )+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5),axis.text.x = element_blank())

1.5.8 NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)?

sentido_sozinho <- data.frame(Categoria = c("Nunca", "Raramente", "Às vezes", "Na maioria das vezes", "Sempre"),Percentual = round(as.matrix((table(Drogas_SP$sentido_sozinho)/445)*100),2))

ggplot(sentido_sozinho, aes(x=Categoria, y=Percentual,fill=Categoria)) +
  geom_bar(stat="identity",color="black", width=0.8)+
  ylim(0,100)+
  geom_text(aes(label= paste0(Percentual,"%")), vjust=-1.5, color="black", size=3.5)+
  scale_fill_brewer(palette="Set1")+
  xlab("\nCor")+
  ylab("Percentual (%)\n")+
  ggtitle("Percentual de obs. por categorias de 'sentido_sozinho'\n" )+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5))

1.5.9 Quantos amigos seus usam drogas?

amigos_drogas <- data.frame(Categoria= c("Nenhum", "Poucos", "Alguns", "A maioria","Não sei"),Percentual = round(as.matrix((table(Drogas_SP$amigos_drogas)/445)*100),2))

ggplot(amigos_drogas, aes(x=Categoria, y=Percentual,fill=Categoria)) +
  geom_bar(stat="identity",color="black", width=0.8)+
  ylim(0,100)+
  geom_text(aes(label= paste0(Percentual,"%")), vjust=-1.5, color="black", size=3.5)+
  scale_fill_brewer(palette="Set1")+
  xlab("\nCor")+
  ylab("Percentual (%)\n")+
  ggtitle("Percentual de obs. por categorias de 'amigos_drogas'\n" )+
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5))

2 Estimação não-paramétrica

tempos<- Drogas_SP$tempo
cens<-Drogas_SP$censura

2.1 Estimação da função de sobrevivência S(t) por Kaplan-Meier com transformação log[-log(S(t))]


\(S(t) = Pr(T > t)\)


ekm<-survfit(Surv(tempos,cens)~1,conf.type="log-log")
plot(ekm,xlab="Tempo (anos)",ylab="S(t) Kaplan-Meier",conf.int=T, main="S(t) estimada por Kaplan-Meier com transf. log[-log(S(t))] + IC\n")

  • A probabilidade de sobrevivência nos dá a probabilidade de um um indivíduo do estudo sobreviver após um tempo \(t\) especificado.

  • O gráfico acima contém as probabilidades de sobrevivência correspondentes a cada tempo de falha ordenado.

  • Por ser obtida de forma empírica, a função de sobrevivência é uma função de degraus: começa com uma linha horizontal na probabilidade de sobrevivência 1 e e então vai descendo para probabilidades de sobrevivência menores a medida que falhas vão sendo observadas.

  • A probabilidade de sobrevivência estimada após o primeiro tempo de falha ordenado (11 anos) continua bem próxima de \(1\).

  • Aos 15 anos ocorre o quinto (e último) tempo de falha ordenado e a probabilidade de sobrevivência estimada fica acima de \(70\%\), ou seja, estima-se que a probabilidade de um estudante não experimentar drogas ilícitas após os 15 anos é superior a \(70\%\).

  • Conforme os anos passam, percebemos que as quedas nas probabilidades de sobrevivência foram aumentando.

  • Como o maior tempo (16 anos) é uma censura, o valor de \(S(t)\) a partir desse ponto é indeterminado.

2.1.1 ICs normais com transformacao log[-log(S(t))] para a estimativa de Kaplan-Meier de S(t)

A saída abaixo contém as estimativas pontuais e intervalares (com transformação log-log) de Kaplan-Meier. As colunas são relativas a/ao:

  1. tempo de falha;
  2. número de indivíduos em risco de sofrer o evento;
  3. número de indivíduos que sofreram o evento;
  4. estimativa da probabilidade de sobrevivência;
  5. erro padrão da estimativa;
  6. limite inferior do iC de 95% para a probabilidade de sobrevivência;
  7. limite superior do IC de 95% para a probabilidade de sobrevivência.
summary(ekm)
## Call: survfit(formula = Surv(tempos, cens) ~ 1, conf.type = "log-log")
## 
##  time n.risk n.event survival std.err lower 95% CI upper 95% CI
##    11    445       1    0.998 0.00224        0.984        1.000
##    12    444       5    0.987 0.00547        0.970        0.994
##    13    438      18    0.946 0.01073        0.920        0.963
##    14    285      14    0.900 0.01583        0.864        0.926
##    15     30       5    0.750 0.06261        0.601        0.849

Podemos observar que,

  • Aos 11 anos ocorre a primeira falha, o que ocasiona a queda da probabilidade de sobrevivência de \(1\) para \(0.998\).
  • Aos 12 anos são observadas mais 5 falhas e \(S(t)\) passa de \(0.998\) para \(0.987\).
  • Aos 13 anos é observado o maior número de falhas, 18! \(S(t)\) passa de \(0.987\) para \(0.946\).
  • Aos 14 anos são observadas 14 falhas e \(S(t)\) passa de \(0.946\) para \(0.900\).
  • Por fim, 5 falhas são observadas aos 15 anos e \(S(t)\) sofre uma queda mais acentuada, indo \(0.900\) para \(0.750\).
  • Utilizando a estimação de Kaplan-Meier, podemos afirmar com confiança de 95% que a real probabilidade de não experimentar drogas ilícitas (sobreviver) após os 15 anos está entre \(0.601\) e \(0.849\).

2.2 Estimação da função de sobrevivência S(t) por Nelson-Aalen

Abaixo, temos o gráfico de \(S(t)\) estimada por Nelson-Aalen:

ss<-survfit(coxph(Surv(tempos,cens)~1,method="breslow"))
plot(ss, main="S(t) estimada por Nelson-Aalen\n")

  • Podemos concluir o mesmo observado para o gráfico de \(S(t)\) estimada por Kaplan-Meier, visto que não se encontram diferenças perceptíveis entre os dois gráficos.

2.2.1 ICs para a estimativa de Nelson-Aalen de S(t)

A saída abaixo contém as estimativas pontuais e intervalares de Nelson-Aalen. As colunas são relativas a/ao:

  1. tempo de falha;
  2. número de indivíduos em risco de sofrer o evento;
  3. número de indivíduos que sofreram o evento;
  4. estimativa da probabilidade de sobrevivência;
  5. erro padrão da estimativa;
  6. limite inferior do iC de 95% para a probabilidade de sobrevivência;
  7. limite superior do IC de 95% para a probabilidade de sobrevivência.
summary(ss)
## Call: survfit(formula = coxph(Surv(tempos, cens) ~ 1, method = "breslow"))
## 
##  time n.risk n.event survival std.err lower 95% CI upper 95% CI
##    11    445       1    0.998 0.00224        0.993        1.000
##    12    444       5    0.987 0.00544        0.976        0.997
##    13    438      18    0.947 0.01055        0.926        0.968
##    14    285      14    0.901 0.01553        0.872        0.932
##    15     30       5    0.763 0.05838        0.657        0.887

Podemos observar que,

  • As probabilidades de sobrevivência estimadas por Nelson-Aalen foram iguais ou superiores às estimadas por Kaplan-Meier.
  • Os erros-padrão das estimativas por Nelson-Aalen são iguais ou menores aos obtidos por Kaplan-Meier.
  • Os intervalos de 95% de confiança por Nelson-Aalen tem menor ampplitude que os intervalos de confiança por Kaplan-Meier.
  • A maior diferença entre as probabilidades de sobrevivência estimadas por Nelson-Aalen e Kaplan-Meier foi para \(S(15)\).
  • Utilizando a estimação de Nelson-Aalen, podemos afirmar com confiança de 95% que a real probabilidade de não experimentar drogas ilícitas (sobreviver) após os 15 anos está entre \(0.657\) e \(0.887\).

2.2.2 Comparando S(t) por Kaplan-Meier e Nelson-Aalen

plot(ekm,ylab="S(t) estimada",xlab="Tempo (anos)",conf.int=F,col=4)
lines(ss,conf.int=F,col=6)
Legenda<-c("Kaplan-Meier","Nelson-Aalen")
legend("bottomright", Legenda,lwd=c(1,1),cex=1.2,inset=0.00,col=c(4,6),bty="n")

  • Como comentado anteriormente, as estimativas são bem próximas, com a maior diferença sendo observada a partir dos 15 anos.

2.3 Comparando S(t) estimada por Kaplan-Meier com transformação log[-log(S(t))] entre os sexos masculino e feminino

Existe diferença entre as curvas de sobrevivência de homens e mulheres?

grupos<-Drogas_SP$sexo
grupos <- ifelse(grupos==1,"Masculino","Feminino")
ekm<-survfit(Surv(tempos,cens)~grupos,conf.type="log-log")
plot(ekm,lty=c(2,1),xlab="Tempo (anos)",ylab="S(t) estimada")
legend(1,0.3,lty=c(2,1),c("Feminino","Masculino"),lwd=1,bty="n")

Podemos observar que,

  • A curva do sexo feminino possui menos degraus: algum tempo de falha observado para o sexo masculino não ocorreu para o sexo feminino.

  • Até os 15 anos, a curva de sobrevivência por Kaplan-Meier do sexo feminino fica acima da curva de sovrevivência do sexo masculino, o que significa que as probabilidades de sobrevivência do sexo feminino são maiores que as do sexo masculino.

  • A partir dos 15 anos, a curva de sobrevivência do sexo feminino possui queda abrupta, ficando abaixo da curva do sexo masculino. Isso nos diz que a partir dessa idade, as probabilidades de sobrevivência para o sexo feminino são inferiores às probabilidades de sobrevivência do sexo masculino.

2.3.1 ICs com transformacao log[-log(S(t))] para a estimativa de Kaplan-Meier de S(t) para os sexos feminino e masculino

summary(ekm)
## Call: survfit(formula = Surv(tempos, cens) ~ grupos, conf.type = "log-log")
## 
##                 grupos=Feminino 
##  time n.risk n.event survival std.err lower 95% CI upper 95% CI
##    12    223       1    0.996 0.00447        0.969        0.999
##    13    221       8    0.959 0.01323        0.924        0.979
##    14    134       7    0.909 0.02230        0.854        0.944
##    15      7       2    0.650 0.15608        0.277        0.865
## 
##                 grupos=Masculino 
##  time n.risk n.event survival std.err lower 95% CI upper 95% CI
##    11    222       1    0.995 0.00449        0.968        0.999
##    12    221       4    0.977 0.00996        0.947        0.991
##    13    217      10    0.932 0.01685        0.890        0.959
##    14    151       7    0.889 0.02264        0.836        0.926
##    15     23       3    0.773 0.06547        0.612        0.874
  • Como foi observado no gráfico, as probabilidades de sobrevivência para os dois grupos não diferem muito nos tempos de falha em comum, com exceção do tempo de falha \(t=15\).
  • Para o tempo de falha \(t=15\), a probabilidade de sobrevivência estimada para o sexo feminino foi \(0.650\), enquanto a do sexo masculino foi \(0.773\).
  • Essa diferença pode estar relacionada ao número de indivíduos sob risco de sofrer o evento: para ambos os sexos o número de eventos em \(t=15\) é similar (2 e 3). Entretanto, o número de indivíduos do sexo masculino sob risco de sofrer o evento é 3 vezes maior que o do sexo feminino, afetando a probabilidade estimada.

\(\hat{S}(t) = \prod_{t_i<t}{1- \frac{d_i}{n_i}}\)

onde \(d_i\) é o número de eventos em \(t_i\) e \(n_i\) o número de indivíduos sob risco em \(t_i\).

2.3.2 Teste logrank para comparar as curvas de sobrevivência nos dois grupos

survdiff(Surv(tempos,cens)~grupos,rho=0)
## Call:
## survdiff(formula = Surv(tempos, cens) ~ grupos, rho = 0)
## 
##                    N Observed Expected (O-E)^2/E (O-E)^2/V
## grupos=Feminino  223       18     19.8     0.171     0.343
## grupos=Masculino 222       25     23.2     0.147     0.343
## 
##  Chisq= 0.3  on 1 degrees of freedom, p= 0.6

O teste de logrank tem estatística de teste igual a \(0.3\), e p-valor \(0.6\). Logo, ao nível de 5%, não rejeitamos a hipótese nula de igualdade entre as curvas de sobrevivência dos sexos masculino e feminino.

3 Estimação paramétrica

3.1 Estimação pela distribuição Exponencial

  • A forma da Exponencial utilizada é dada por:

\(\hat{f(t)}= \frac{1}{\hat{\alpha}} e^{\frac{-t}{\hat{\alpha}}}\)

3.1.1 EMV e IC do parâmetro de escala da Exponencial

  • Utilização do Método Delta: O R ajusta uma distribuição Exponencial com parâmetro \(\theta\) tal que, na nossa parametrização, o parâmetro de escala \(\alpha\) é obtido por \(\alpha = e^{\theta}\).

  • A estimativa de máxima verossimilhança para \(\alpha\), o parâmetro de escala da distribuição Exponencial, sua variância e o IC de \(95\%\) são dados por:

tempos<- Drogas_SP$tempo
cens<-Drogas_SP$censura
# Estimacao usando a distribuicao Exponencial:
ajuste_exp<-survreg(Surv(tempos,cens)~1,dist='exponential')
# como a funçãoo usa outra parametrização da exponencial:
alfa_exp<-exp(ajuste_exp$coefficients[1]) # EMV do parametro de escala da Exponencial | estimativa pontual do parâmetro alfa 
varalfa_exp<-ajuste_exp$var[1, 1]*(exp(ajuste_exp$coefficient[1]))^2 # EMV da variancia do parametro de escala
                
tab_exp <- data.frame(EMV = exp(ajuste_exp$coefficients[1]), Variancia=ajuste_exp$var[1, 1]*(exp(ajuste_exp$coefficient[1]))^2 , LI= alfa_exp-qnorm(0.975)*sqrt(varalfa_exp),LS=alfa_exp+qnorm(0.975)*sqrt(varalfa_exp) )
tab_exp <- round(tab_exp,4)
knitr::kable(tab_exp,row.names = FALSE)
EMV Variancia LI LS
141.814 467.7023 99.4269 184.201
  • Com base nas estimativas obtidas, podemos estimar quantidades de interesse para os dados.

3.1.2 Tempo médio até a experimentação de drogas ilícitas

  • Uma vez estimados os parâmetros, o tempo médio até a experimentação de drogas ilícitas pode ser estimado:
#Estimando o tempo medio ate a reincidencia:
E_T= round(data.frame(E_T = alfa_exp),2)
knitr::kable(E_T, row.names = FALSE)
E_T
141.81
  • Estima-se o tempo médio até a experimenação de drogas ilícitas seja de \(141.81\) anos, visto que na distribuição Exponencial \(\hat{E}(T)=\hat{\alpha}\).

3.1.3 Estimação da função de taxa de falha

# Estimando a função de taxa de falha:
lambda_exp<-function(t){1/alfa_exp*(t^0)}
# Estimando a funcao de taxa de falha:

plot(lambda_exp,ylab=expression(lambda(t)),xlab="t (em anos)",xlim=c(0,16),
     main="Função da taxa de falha - Exponencial") #plotando a funcao de taxa de falha

  • A função de taxa de falha, que nesse caso é constante (propriedade de falta de memória da distribuição Exponencial), é estimada como sendo \(0.007\).
  • Esse é o risco instantâneo de uso de drogas ilícitas, independente do tempo (em anos).
  • Por exemplo, um estudante com 5 anos tem o mesmo risco instantâneo estimado de usar drogas ilícitas que um estudante de 15 anos.

3.1.4 Estimação dos percentis 100p%

# Estimando o percentil 100p%:
perc_exp<-function(p){-alfa_exp*log(1-p)}#criando uma funcao no R para o percentil
perc_exp_est <- data.frame(cbind(perc_exp(p=0.1),perc_exp(p=0.2),perc_exp(p=0.3)))
colnames(perc_exp_est)<- c("10%","20%","30%")
perc_exp_est <- round(perc_exp_est,2)
knitr::kable(perc_exp_est, row.names = FALSE)
10% 20% 30%
14.94 31.64 50.58
  • Aos \(14.94\) anos, estima-se que 10% terão utilizado drogas ilícitas;
  • Aos \(31.64\) anos, estima-se que 20% terão utilizado drogas ilícitas;
  • Aos \(50.58\) anos, estima-se que 30% terão utilizado drogas ilícitas.

O gráfico abaixo mostra como os percentis variam em função do valor de p.

plot(perc_exp,ylab="tp (em anos)",xlab="p",
     main="Percentil 100% - Exponencial") #plotando o percentil versus p

3.1.5 Estimação da função de sobrevivência

#Estimando a funcao de sobrevivencia:
S_exp<-function(t){exp(-t/alfa_exp)}#criando uma funcao no R para a sobrevivencia
var_S_exp<-function(t){varalfa_exp*((t/alfa_exp^2)*exp(-t/alfa_exp))^2}#criando uma funcao no R para a variancia da funcao de sobrêvivencia

f_sobrev <- data.frame(est_pontual = c(S_exp(t=15),S_exp(t=18),S_exp(t=22)), 
                       LI = c(S_exp(t=15)-qnorm(0.975)*sqrt(var_S_exp(t=15)),S_exp(t=18)-qnorm(0.975)*sqrt(var_S_exp(t=18)),S_exp(t=22)-qnorm(0.975)*sqrt(var_S_exp(t=22))),
                       LS = c(S_exp(t=15)+qnorm(0.975)*sqrt(var_S_exp(t=15)), S_exp(t=18)+qnorm(0.975)*sqrt(var_S_exp(t=18)), S_exp(t=22)+qnorm(0.975)*sqrt(var_S_exp(t=22))))
f_sobrev <- round(f_sobrev,4)
rownames(f_sobrev)<-c("t=15","t=18","t=22")
knitr::kable(f_sobrev,row.names = TRUE)
est_pontual LI LS
t=15 0.8996 0.8712 0.9281
t=18 0.8808 0.8474 0.9142
t=22 0.8563 0.8166 0.8960

Estimativas pontuais e intervalares (95% de confiança) foram obtidas para os \(t\) igual a 10, 12 e 15 anos, sendo:

  • \(\hat{S}(15)=0.8996 \quad(0.8712; 0.9281):\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 15 anos é de \(89.96\%\).

  • \(\hat{S}(18)=0.8808 \quad(0.8474; 0.9142):\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 18 anos é de \(88.08\%\).

  • \(\hat{S}(22)=0.8563 \quad(0.8166; 0.8960):\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 22 anos é de \(85.63\%\).

  • É interessante observar a relação entre e \(\hat{S}(15)=0.8996\) e \(\hat{t}_{0.1004} \approx 15\) , estimado anteriormente: Se para 15 anos estima-se que \(89.96\%\) dos pacientes não terão experimentado drogas ilícitas, esse é o tempo em que, aproximadamente, 10% deles já terão experimentado esse evento.

O gráfico mostra como a função de sobrevivência \(S(t)\) varia ao longo de \(t\) (em anos):

plot(S_exp,ylab="S(t)",xlab="t (em anos)",xlim=c(0,100),
     main="Função de sobrevivência - Exponencial") #plotando a funcao de sobrêvivencia

3.2 Estimação usando a distribuição Weibull

  • A forma da Weibull utilizada é dada por:

\(\hat{f}(t)=\frac{\hat{\gamma}}{\hat{\alpha}\hat{\gamma}}t^{\hat{\gamma}-1}e^{-(\frac{t}{\hat{\alpha}})^\hat{\gamma}}\)

3.2.1 EMVs e ICs para os parâmetros da Weibull

  • Assim como na distribuição Exponencial, a parametrização utilizada pelo R para a distribuição Weibull é diferente da que utilizamos.
  • O R ajusta uma distribuição Weibull com parâmetros \(\theta_1\) e \(\theta_2\) tais que, na nossa parametrização, \(\alpha=exp(\theta_1)\) e \(\\gamma=\frac{1}{\theta_2}\).
  • As estimativas de máxima verossimilhança para \(\alpha\) e \(\gamma\), suas variâncias e respectivos intervalos de confiança são:
ajuste_wei<-survreg(Surv(tempos,cens)~1,dist='weibull')
alfa_wei<-exp(ajuste_wei$coefficients[1]) # EMV do parametro de escala da Weibull
gama_wei<-1/ajuste_wei$scale# EMV do parametro de forma da Weibull

varalfa_wei<-ajuste_wei$var[1,1]*exp(ajuste_wei$coefficients[1])^2
vargama_wei<-ajuste_wei$var[2,2]*(-1/ajuste_wei$scale^2)^2

tab_weib <- data.frame(EMV = c(gama_wei,alfa_wei), 
                       Variancia = c(varalfa_wei,vargama_wei), 
                       LI = c(alfa_wei-qnorm(0.975)*sqrt(varalfa_wei),gama_wei-qnorm(0.975)*sqrt(vargama_wei)), 
                       LS = c(alfa_wei+qnorm(0.975)*sqrt(varalfa_wei),gama_wei+qnorm(0.975)*sqrt(vargama_wei)))

rownames(tab_weib) <-c("alfa","gama")
knitr::kable(tab_weib)
EMV Variancia LI LS
alfa 15.53066 0.0833058 15.65154 16.78294
gama 16.21724 768.3947748 -38.79941 69.86073

3.2.2 Tempo médio até a experimentação de drogas ilícitas

  • Uma vez estimados os parâmetros, o tempo médio até a experimentação de drogas ilícitas pode ser estimado:
#Estimando o tempo medio ate a reincidencia:
E_T= round(data.frame(E_T = alfa_wei*gamma(1+1/gama_wei)),2)
knitr::kable(E_T, row.names = FALSE)
E_T
15.68
  • Portanto, estima-se o tempo médio até a experimenação de drogas ilícitas seja de \(15.68\) anos.

3.2.3 Estimação da função de taxa de falha

# Estimando a funcao de taxa de falha:
lambda_wei<-function(t){gama_wei/alfa_wei^gama_wei*t^(gama_wei-1)}#criando uma funcao no R para a taxa de falha 

tab_lambda_wei <- round(cbind.data.frame(lambda_wei = c(lambda_wei(t=15), lambda_wei(t=18),lambda_wei(t=22))),2)
rownames(tab_lambda_wei) <- c("15","18","22")
knitr::kable(tab_lambda_wei)
lambda_wei
15 0.31
18 4.36
22 80.49
  • O risco instantâneo de experimentação de drogas ilícitas é estimado em \(0.31\), \(4.36\) e \(80.49\) em 15, 18 e 22 anos, respectivamente.
plot(lambda_wei,ylab=expression(lambda(t)),xlab="t (em anos)",xlim=c(0,40),
     main = "Função da taxa de falha - Weibull") #plotando a funcao de taxa de falha

  • A função de taxa de falha estimada pelo ajuste da distribuição Weibull é crescente, diferente do observado quando se utilizou a distribuição Exponencial.
  • Logo, os indivíduos tornam-se mais suscetíveis a uma falha instantânea à medida em que o tempo (em anos) aumenta.

3.2.4 Estimação dos percentis 100p%

# Estimando o percentil 100p%:
perc_wei<-function(p){alfa_wei*(-log(1-p))^(1/gama_wei)}#criando uma funcao no R para o percentil
perc_wei_est <- data.frame(cbind(perc_wei(p=0.1),perc_wei(p=0.2),perc_wei(p=0.3)))
colnames(perc_wei_est)<- c("10%","20%","30%")
perc_wei_est <- round(perc_wei_est,2)
knitr::kable(perc_wei_est, row.names = FALSE)
10% 20% 30%
14.03 14.72 15.18
  • Aos \(14.03\) anos, estima-se que 10% terão utilizado drogas ilícitas;
  • Aos \(14.72\) anos, estima-se que 20% terão utilizado drogas ilícitas;
  • Aos \(15.18\) anos, estima-se que 30% terão utilizado drogas ilícitas.

O gráfico abaixo mostra como os percentis variam em função do valor de p.

plot(perc_wei,ylab="tp (em anos)",xlab="p",
     main="Percentil 100% - Weibull") #plotando o percentil versus p

3.2.5 Estimação da função de sobrevivência

#Estimando a funcao de sobrevivencia:
S_wei<-function(t){exp(-(t/alfa_wei)^gama_wei)}#criando uma funcao no R para a sobrevivencia
f_sobrev <- data.frame(est_pontual = c(S_wei(t=15),S_wei(t=18),S_wei(t=22)))
f_sobrev <- round(f_sobrev,4)
rownames(f_sobrev)<-c("t=15","t=18","t=22")
knitr::kable(f_sobrev,row.names = TRUE)
est_pontual
t=15 0.7425
t=18 0.0064
t=22 0.0000

Estimativas pontuais foram obtidas para os \(t\) igual a 15, 18 e 22 anos, sendo:

  • \(\hat{S}(15)=0.7425\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 15 anos é de \(74.25\%\).
  • \(\hat{S}(18)=0.0064\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 18 anos é de \(0.64\%\).
  • \(\hat{S}(22)=0.000\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 22 anos é de \(0\%\).

O gráfico mostra como a função de sobrevivência \(S(t)\) varia ao longo de \(t\) (em anos):

plot(S_wei,ylab="S(t)",xlab="t (em anos)",xlim=c(0,40),
     main="Função de sobrevivência - Weibull") #plotando a funcao de sobrevivencia

3.3 Estimação usando a distribuição Log-normal

  • A forma da Log-normal utilizada é dada por:

\(\hat{f}(t)=\frac{1}{\sqrt{2\pi}t\hat{\sigma}}exp{-\frac{1}{2}( \frac{log(t)-\hat{\mu}}{\hat{\sigma}})^2 }\)

3.3.1 EMVs e Ics para parâmetros da Log-normal

  • As estimativas de máxima verossimilhança para \(\mu\) e \(\sigma\), suas variâncias e respectivos intervalos de confiança são:
ajuste_logn<-survreg(Surv(tempos,cens)~1,dist='lognorm')
mu_logn<-ajuste_logn$coefficients[1] # EMV do parametro de locacao da Log-normal
sigma_logn<-ajuste_logn$scale# EMV do parametro de escala da Log-normal


var_mu<-ajuste_logn$var[1,1]# variancia da estimativa do parametro de locacao
var_sigma<-ajuste_logn$var[2,2]


tab_logn <- data.frame(EMV = c(mu_logn,sigma_logn), 
                       Variancia = c(var_mu,var_sigma), 
                       LI = c(mu_logn-qnorm(0.975)*sqrt(var_mu),mu_logn+qnorm(0.975)*sqrt(var_mu)), 
                       LS = c(sigma_logn-qnorm(0.975)*sqrt(var_sigma),sigma_logn+qnorm(0.975)*sqrt(var_sigma)))

rownames(tab_logn) <-c("mu","sigma")
knitr::kable(tab_logn)
EMV Variancia LI LS
mu 2.7944794 0.0005022 2.750557 -0.1043686
sigma 0.1234007 0.0135050 2.838402 0.3511701
  • Essas estimativas podem ser utilizadas para se obter as demais medidas de interesse.

3.3.2 Tempo médio até a experimentação de drogas ilícitas

  • Uma vez estimados os parâmetros, o tempo médio até a experimentação de drogas ilícitas pode ser estimado:
#Estimando o tempo medio ate a reincidencia:
E_T=round(data.frame(E_T=exp(mu_logn+(sigma_logn^2)/2)),2)
knitr::kable(E_T,row.names = FALSE)
E_T
16.48
  • Portanto, estima-se o tempo médio até a experimenação de drogas ilícitas seja de \(16.48\) anos.

3.3.3 Estimação da função de taxa de falha

f_logn<-function(t){(1/(sqrt(2*pi)*t*sigma_logn))*exp(-0.5*((log(t)-mu_logn)/sigma_logn)^2)}#criando uma funcao no R para a densidade
S_logn<-function(t){pnorm((-log(t)+mu_logn)/sigma_logn)}
lambda_logn<-function(t){f_logn(t)/S_logn(t)}#criando uma funcao no R para a taxa de falha 

tab_lambda_logn <- round(cbind.data.frame(lambda_logn = c(lambda_logn(t=15), lambda_logn(t=18),lambda_logn(t=22))),2)
rownames(tab_lambda_logn)<- c("15","18","22")
knitr::kable(tab_lambda_logn)
lambda_logn
15 0.22
18 0.61
22 1.01
  • O risco instantâneo de experimentação de drogas ilícitas é estimado em \(0.22\), \(0.61\) e \(1.01\) em 15, 18 e 22 anos, respectivamente.

  • O gráfico da função da taxa de falha ao longo do tempo t(em anos) pode ser visto abaixo:

plot(lambda_logn,ylab=expression(lambda(t)),xlab="t (em anos)",xlim=c(0,45),
     main = " Função da taxa de falha - Log-normal") #plotando a funcao de taxa de falha

3.3.4 Estimação dos percentis 100p%

# Estimando o percentil 100p%:
perc_logn<-function(p){exp(qnorm(p)*sigma_logn+mu_logn)}#criando uma funcao no R para o percentil
perc_logn_est <- data.frame(cbind(perc_logn(p=0.1),perc_logn(p=0.2),perc_logn(p=0.3)))
colnames(perc_logn_est)<- c("10%","20%","30%")
perc_logn_est <- round(perc_logn_est,2)
knitr::kable(perc_logn_est, row.names = FALSE)
10% 20% 30%
13.96 14.74 15.33
  • Aos \(13.96\) anos, estima-se que 10% terão utilizado drogas ilícitas;
  • Aos \(14.74\) anos, estima-se que 20% terão utilizado drogas ilícitas;
  • Aos \(15.33\) anos, estima-se que 30% terão utilizado drogas ilícitas.

O gráfico abaixo mostra como os percentis variam em função do valor de p.

plot(perc_logn,ylab="t (em anos)",xlab="p", 
     main = " Percentil 100% - Log-normal") #plotando o percentil versus p

3.3.5 Estimação da função de sobrevivência

#Estimando a funcao de sobrevivencia:
S_logn<-function(t){pnorm((-log(t)+mu_logn)/sigma_logn)}#criando uma funcao no R para a sobrevivencia
f_sobrev <- data.frame(est_pontual = c(S_logn(t=15),S_logn(t=18),S_logn(t=22)))
f_sobrev <- round(f_sobrev,4)
rownames(f_sobrev)<-c("t=15","t=18","t=22")
knitr::kable(f_sobrev,row.names = TRUE)
est_pontual
t=15 0.7582
t=18 0.2186
t=22 0.0081

Estimativas pontuais foram obtidas para os \(t\) igual a 15, 18 e 22 anos, sendo:

  • \(\hat{S}(15)=0.7582\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 15 anos é de \(75.82\%\).
  • \(\hat{S}(18)=0.2186\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 18 anos é de \(21.86\%\).
  • \(\hat{S}(22)=0.0081\) estima-se que a chance de um indivíduo não ter experimentado drogas ilícitas após os 22 anos é de \(0.81\%\).

O gráfico mostra como a função de sobrevivência \(S(t)\) varia ao longo de \(t\) (em anos):

plot(S_logn,ylab="S(t)",xlab="t (em anos)",xlim=c(0,100),
     main = " Função de sobrevivência - Log-normal") #plotando a funcao de sobrevivencia

3.4 Comparando os resultados das três distribuições

Comparação entre os resultados da estimação paramétrica para as distribuições Exponencial, Weibull e Log-normal

3.5 Plotando as funções das três distribuições conjuntamente

#Funcao densidade:
f_exp<-function(t){(1/alfa_exp)*exp(-t/alfa_exp)} #funcao densidade da Exponencial
f_wei<-function(t){(gama_wei/alfa_wei^gama_wei)*t^(gama_wei-1)*exp(-(t/alfa_wei)^gama_wei)} #funcao densidade da Weibull

plot(f_exp,type="l",col=4,ylab="f(t)",xlab="t",xlim=c(0,40), ylim=c(0,0.4), main= "Comparando funções de densidade")#plotando as funcoes
t=seq(0,40,0.1)
lines(t,f_wei(t),type="l",col=6)
lines(t,f_logn(t),type="l",col=9)
Legenda<-c(expression(Exponencial),expression(Weibull),expression(Log-normal))
legend("topright", Legenda,lwd=c(1,1,1),cex=1.2,inset=0.00,col=c(4,6,9),bty="n")

#Funcao de taxa de falha:
plot(lambda_exp,type="l",col=4,ylab=expression(lambda(t)),xlab="t",xlim=c(0,40),ylim=c(0,1), main= "Comparando funções de taxa de falha")#plotando as funcoes
t=seq(0,40,0.1)
lines(t,lambda_wei(t),type="l",col=6)
lines(t,lambda_logn(t),type="l",col=9)
Legenda<-c(expression(Exponencial),expression(Weibull),expression(Log-normal))
legend("topright", Legenda,lwd=c(1,1,1),cex=1.2,inset=0.00,col=c(4,6,9),bty="n")

#Funcao de sobrevivencia:
plot(S_exp,type="l",col=4,ylab="S(t)",xlab="t",xlim=c(0,40), main= "Comparando funções de sobrevivência")#plotando as funcoes
t=seq(0,8040,0.1)
lines(t,S_wei(t),type="l",col=6)
lines(t,S_logn(t),type="l",col=9)
Legenda<-c(expression(Exponencial),expression(Weibull),expression(Log-normal))
legend("topright", Legenda,lwd=c(1,1,1),cex=1.2,inset=0.00,col=c(4,6,9),bty="n")

3.6 Teste de Razão de Verossimilhança

  • Hipóteses:

\(H0: \text{O modelo de interesse é adequado}\)

\(H1: \text{O modelo de interesse não é adequado}\)

  • Estimou-se os parâmetros por MV para cada uma das três distribuições (Exponencial, Weibull e Lognormal), e para a distribuição de referência (Gama generalizada).
  • E então, as estatisticas TRV e seus p-valores foram calculados:
ajuste_exp<-survreg(Surv(tempos,cens)~1,dist='exponential')
ajuste_wei<-survreg(Surv(tempos,cens)~1,dist='weibull')
ajuste_logn<-survreg(Surv(tempos,cens)~1,dist='lognorm')
ajuste_gamg<-flexsurvreg(Surv(tempos,cens)~1,dist="gengamma")

TRV_exp=2*(ajuste_gamg$loglik-ajuste_exp$loglik[2])
TRV_wei=2*(ajuste_gamg$loglik-ajuste_wei$loglik[2])
TRV_logn=2*(ajuste_gamg$loglik-ajuste_logn$loglik[2])

TRV <- data.frame(pvalor= c(1-pchisq(TRV_exp,df=2),1-pchisq(TRV_wei,df=1),1-pchisq(TRV_logn,df=1)))
rownames(TRV) <- c("Exponencial","Weibull","Log-normal")
knitr::kable(TRV)
pvalor
Exponencial 0.0000000
Weibull 0.1511699
Log-normal 0.8446717
  • Analisando os p-valores concluímos que, ao nível de \(5\%\), as distribuições weibull e log-normal são adequadas.
LS0tDQp0aXRsZTogIkFuw6FsaXNlIGRlIFNvYnJldml2w6puY2lhIC0gUHJvamV0byAwMSINCmF1dGhvcjogIlZpY3TDs3JpYSBWYXJnYXMiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpyb2JvYm9vazoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlIA0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQojIEFuw6FsaXNlIGRlc2NyaXRpdmENCg0KIyMgRGVzY3Jpw6fDo28gZGEgYmFzZSANCmBgYHtyICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc3Vydml2YWwpDQpsaWJyYXJ5KGZsZXhzdXJ2KQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShwYWNtYW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KcGFjbWFuOjpwX2xvYWQoa25pdHIsIGNhcHRpb25lciwgYnVuZGVzbGlnUiwgc3RyaW5ncikNCg0KdGFibGVfbnVtcyA8LSBjYXB0aW9uZXI6OmNhcHRpb25lcihwcmVmaXggPSAiVGFiZWxhIikNCnRhYi4xX2NhcCA8LSB0YWJsZV9udW1zKG5hbWUgPSAidGFiXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gIkRlc2NyacOnw6NvIGRhcyB2YXJpw6F2ZWlzIGRhIGJhc2UgZGUgZGFkb3MiKQ0KDQoNCkRyb2dhc19TUCA8LSByZWFkX2NzdigiRHJvZ2FzLVNQLmNzdiIpWywtNV0NCg0KYGBgDQoNCk9zIGRhZG9zIHPDo28gcHJvdmVuaWVudGVzIGRhIFBlc3F1aXNhIE5hY2lvbmFsIGRlIFNhw7pkZSBkbyBFc2NvbGFyIChQZU5TRSkgZGUgMjAxNSwgY29uZHV6aWRhIHBlbG8gSUJHRSwgZSBzZSByZWZlcmVtIGFvIHRlbXBvIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgZW0gdW1hIGFtb3N0cmEgZGUgZXN0dWRhbnRlcyBkbyA5wrogYW5vIGRvIGVuc2lubyBmdW5kYW1lbnRhbCBkZSBlc2NvbGFzIHByaXZhZGFzIGRhIGNpZGFkZSBkZSBTw6NvIFBhdWxvLg0KDQpBIGJhc2UgZGUgZGFkb3MgY29udMOpbSA0NDUgb2JzZXJ2YcOnw7VlcyBlIDExIHZhcmnDoXZlaXMuDQoNCkEgdmFyacOhdmVsIFYwMDA3IGZvaSByZW1vdmlkYSBwb3IgbsOjbyBjb250ZXIgZGVzY3Jpw6fDo28uDQoNCg0KIyMgRGVzY3Jpw6fDo28gZGFzIHZhcmnDoXZlaXMgDQoNCg0KDQotLS0NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCiAgIGByIHRhYmxlX251bXMoJ3RhYl8xJylgDQo8L2Rpdj4NCg0KLS0tDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZGVzY192YXJpYXZlaXMgPC0gZGF0YS5mcmFtZShWYXJpw6F2ZWwgPSBjb2xuYW1lcyhEcm9nYXNfU1ApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5vbWVhbmRvID0gYygidGVtcG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNlbnN1cmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNleG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcl9yYWNhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9yYV9tYWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmViaWRhX2FsY29vbGljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2lnYXJybyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzcG9uc2F2ZWxfZnVtYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VudGlkb19zb3ppbmhvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbWlnb3NfZHJvZ2FzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyacOnw6NvID0gYygiVGVtcG8gYXTDqSBvIHByaW1laXJvIHVzbyBkZSBkcm9nYXMgaWzDrWNpdGFzLCBjb21vOiBtYWNvbmhhLCBjb2Nhw61uYSwgY3JhY2ssIGxvbMOzLCBsYW7Dp2EtcGVyZnVtZSwgZWNzdGFzeSwgb3h5LCBldGMgKHZhcmnDoXZlbCByZXNwb3N0YSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRpY2Fkb3IgZGUgY2Vuc3VyYSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWFsIMOpIG8gc2V1IHNleG8/IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVhbCDDqSBhIHN1YSBjb3Igb3UgcmHDp2E/ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZvY8OqIG1vcmEgY29tIHN1YSBtw6NlPyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOT1Mgw5pMVElNT1MgMzAgRElBUywgY29tIHF1ZSBmcmVxdcOqbmNpYSBzZXVzIHBhaXMgb3UgcmVzcG9uc8OhdmVpcyBzYWJpYW0gcmVhbG1lbnRlIG8gcXVlIHZvY8OqIGVzdGF2YSBmYXplbmRvIGVtIHNldSB0ZW1wbyBsaXZyZT8gIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxndW1hIHZleiBuYSB2aWRhIHZvY8OqIHRvbW91IHVtYSBkb3NlIGRlIGJlYmlkYSBhbGNvw7NsaWNhPyAoVW1hIGRvc2UgZXF1aXZhbGUgYSB1bWEgbGF0YSBkZSBjZXJ2ZWphIG91IHVtYSB0YcOnYSBkZSB2aW5obyBvdSB1bWEgZG9zZSBkZSBjYWNoYcOnYSBvdSB1w61zcXVlIGV0YykgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxndW1hIHZleiBuYSB2aWRhLCB2b2PDqiBqw6EgZnVtb3UgY2lnYXJybywgbWVzbW8gdW1hIG91IGR1YXMgdHJhZ2FkYXM/ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsZ3VtIGRlIHNldXMgcGFpcyBvdSByZXNwb25zw6F2ZWlzIGZ1bWE/ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5PUyDDmkxUSU1PUyAxMiBNRVNFUyBjb20gcXVlIGZyZXF1w6puY2lhIHRlbSBzZSBzZW50aWRvIHNvemluaG8oYSk/ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1YW50b3MgYW1pZ29zIHNldXMgdXNhbSBkcm9nYXM/ICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcmlhcyA9YygiLSIsIjA9Y2Vuc3VyYSBlIDE9ZmFsaGEiLCIxPU1hc2N1bGlubyBlIDI9RmVtaW5pbm8iLCIxPUJyYW5jYSwgMj1QcmV0YSwgMz1BbWFyZWxhLCA0PVBhcmRhLCA1PUluZMOtZ2VuYSBlICA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9U2ltLCAyPU7Do28gZSA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9TnVuY2EsIDI9UmFyYW1lbnRlLCAzPcOAcyB2ZXplcywgND1OYSBtYWlvciBwYXJ0ZSBkbyB0ZW1wbywgNT1TZW1wcmUgZSA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9U2ltLCAyPU7Do28gZSA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9TmVuaHVtIGRlbGVzLCAyPVPDsyBtZXUgcGFpIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIG1hc2N1bGlubywgMz1Tw7MgbWluaGEgbcOjZSBvdSByZXNwb25zw6F2ZWwgZG8gc2V4byBmZW1pbmlubywgND1NZXUgcGFpIGUgbWluaGEgbcOjZSBvdSByZXNwb25zw6F2ZWlzLCA1PU7Do28gc2VpIGUgOTk9TsOjbyBpbmZvcm1hZG8iLCAiMT1TaW0sIDI9TsOjbyBlIDk5PU7Do28gaW5mb3JtYWRvIiwiMT1OdW5jYSwgMj1SYXJhbWVudGUsIDM9w4BzIHZlemVzLCA0PU5hIG1haW9yaWEgZGFzIHZlemVzLCA1PVNlbXByZSBlIDk5PU7Do28gaW5mb3JtYWRvIiwiMT1OZW5odW0sIDI9UG91Y29zLCAzPUFsZ3VucywgND1BIG1haW9yaWEsIDU9VG9kb3MsIDY9TsOjbyBzZWkgZSA5OT1Ow6NvIGluZm9ybWFkbyIpKQ0KDQprbml0cjo6a2FibGUoZGVzY192YXJpYXZlaXMpDQpjb2xuYW1lcyhEcm9nYXNfU1ApPC0gYygidGVtcG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgImNlbnN1cmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgInNleG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgImNvcl9yYWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJtb3JhX21hZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAidGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJiZWJpZGFfYWxjb29saWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJjaWdhcnJvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXNwb25zYXZlbF9mdW1hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJzZW50aWRvX3NvemluaG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgImFtaWdvc19kcm9nYXMiKQ0KDQpgYGANCg0KDQojIyBGYWxoYXMgZSBjZW5zdXJhcyANCg0KDQpgYGB7ciAgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZmFsaGFzX2NlbnN1cmFzIDwtIGRhdGEuZnJhbWUoQ2F0ZWdvcmlhID0gYygiQ2Vuc3VyYSIsIkZhbGhhIiksUGVyY2VudHVhbD1yb3VuZChhcy5tYXRyaXgoKHRhYmxlKERyb2dhc19TUCRjZW5zdXJhKS80NDUpKjEwMCksMikpDQoNCmdncGxvdChmYWxoYXNfY2Vuc3VyYXMsIGFlcyh4PSIiLCB5PVBlcmNlbnR1YWwsIGZpbGw9Q2F0ZWdvcmlhKSkrDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBmYWxoYXMgZSBjZW5zdXJhcyIpKw0KIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgeGxhYihlbGVtZW50X2JsYW5rKCkpKw0KICB5bGFiKGVsZW1lbnRfYmxhbmsoKSkrDQogIGdlb21fdGV4dChhZXMoeCA9YygxLDEuMikgLHkgPSBjKDUwLCA1KSwgDQogICAgICAgICAgICBsYWJlbCA9IHBhc3RlKGBQZXJjZW50dWFsYCwiJSIpKSwgc2l6ZT01KQ0KICANCiAgIA0KYGBgDQoNCkRlIGFjb3JkbyBjb20gYSBGaWd1cmEgMSwNCg0KLSA5MC4zNFwlIGRvcyBlc3R1ZGFudGVzIGRhIGFtb3N0cmEgYWluZGEgbsOjbyBleHBlcmltZW50YXJhbSBkcm9nYXMgaWzDrWNpdGFzLg0KLSA5LjY2XCUgZG9zIGVzdHVkYW50ZXMgZGEgYW1vc3RyYSBqw6EgZXhwZXJpbWVudGFyYW0gZHJvZ2FzIGlsw61jaXRhcy4NCg0KIyMgVmFyacOhdmVsIHJlc3Bvc3RhIA0KDQpBIHZhcmnDoXZlbCByZXNwb3N0YSAndGVtcG8nLCBxdWUgY29ycmVzcG9uZGUgYW8gdGVtcG8gYXTDqSBvIHByaW1laXJvIHVzbyBkZSBkcm9nYXMgbm8gY29udGV4dG8gDQpkZSBhbsOhbGlzZSBkZSBzb2JyZXZpdsOqbmNpYSwgbmFkYSBtYWlzIMOpIHF1ZSBhIGlkYWRlIGRvcyBlc3R1ZGFudGVzIG5vIG1vbWVudG8gcXVlIGEgY29sZXRhIGRvcyBkYWRvcyANCnBlbGEgUGVOU0UgZm9pIHJlYWxpemFkYS4gDQoNCg0KYGBge3J9DQoNCnBhcihtZnJvdz1jKDQsMSkpDQoNCmdncGxvdChkYXRhID0gRHJvZ2FzX1NQLCBhZXMgKHkgPSB0ZW1wbykpKw0KICBnZW9tX2JveHBsb3QoZmlsbD0iI0U2OUYwMCIpICsgDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIGdndGl0bGUoIkJveHBsb3QgZG8gdGVtcG8gYXTDqSBvIHByaW1laXJvIHVzbyBkZSBkcm9nYXMgKElkYWRlIGRvcyBlc3R1ZGFudGVzIG5hIFBlTlNFKVxuIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsNCiAgeWxhYigiSWRhZGVcbiIpDQogICAgIA0KYGBgDQoNCkRlIGFjb3JkbyBjb20gbyBib3hwbG90LCBwb2RlbW9zIG9ic2VydmFyIHF1ZTogDQoNCi0gQXMgaWRhZGVzICoqbcOtbmltYSoqIGUgKiptw6F4aW1hKiogb2JzZXJ2YWRhcyBub3MgZXN0dWRhbnRlcyBkYSBhbW9zdHJhIHPDo28gMTEgZSAxNiBhbm9zLCByZXNwZWN0aXZhbWVudGUsIGUgYW1iYXMgc8OjbyBjb25zaWRlcmFkYXMgb3V0bGllcnMgOw0KLSBEZSBhY29yZG8gY29tIG8gKipwcmltZWlybyBxdWFydGlsKiosIDI1JSBkb3MgZXN0dWRhbnRlcyBkYSBhbW9zdHJhIHBvc3N1ZW0gaWRhZGUgaWd1YWwgb3UgaW5mZXJpb3IgYSAxMyBhbm9zOw0KLSBEZSBhY29yZG8gY29tIGEgKiptZWRpYW5hKiosIDUwJSBkb3MgZXN0dWRhbnRlcyBkYSBhbW9zdHJhIHBvc3N1ZW0gaWRhZGUgaWd1YWwgb3UgaW5mZXJpb3IgYSAxNCBhbm9zOw0KLSBEZSBhY29yZG8gY29tIG8gKip0ZXJjZWlybyBxdWFydGlsKiosIDc1JSBkb3MgZXN0dWRhbnRlcyBkYSBhbW9zdHJhIHBvc3N1ZW0gaWRhZGUgaWd1YWwgb3UgaW5mZXJpb3IgYSAxNCBhbm9zOw0KLSBEZSBhY29yZG8gY29tIG8gKippbnRlcnZhbG8gaW50ZXJxdWFydGlsKiosIDUwJSBkb3MgZXN0dWRhbnRlcyBkYSBhbW9zdHJhIHBvc3N1ZW0gaWRhZGUgZW50cmUgMTMgZSAxNCBhbm9zLg0KDQoNCiMjIENvdmFyacOhdmVpcyANCg0KQXMgZGVtYWlzIHZhcmnDoXZlaXMgc2UgcmVmZXJlbSDDoHMgc2VndWludGVzIHBlcmd1bnRhcyBmZWl0YXMgbmEgcGVzcXVpc2E6DQoNCiMjIyBRdWFsIMOpIG8gc2V1IHNleG8/DQoNCg0KYGBge3J9DQpzZXhvIDwtIGRhdGEuZnJhbWUoU2V4byA9ICBjKCJNYXNjdWxpbm8iLCJGZW1pbmlubyIpLFBlcmNlbnR1YWw9cm91bmQoYXMubWF0cml4KCh0YWJsZShEcm9nYXNfU1Akc2V4bykvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3Qoc2V4bywgYWVzKHg9IiIsIHk9UGVyY2VudHVhbCwgZmlsbD1TZXhvKSkrDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICdzZXhvJyIgKSsNCiB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHhsYWIoZWxlbWVudF9ibGFuaygpKSsNCiAgeWxhYihlbGVtZW50X2JsYW5rKCkpKw0KICBnZW9tX3RleHQoYWVzKHkgPSBgUGVyY2VudHVhbGAvMiArIGMoMCwgY3Vtc3VtKGBQZXJjZW50dWFsYClbLWxlbmd0aChgUGVyY2VudHVhbGApXSksIA0KICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZShgUGVyY2VudHVhbGAsIiUiKSksIHNpemU9NSkNCiAgIA0KICANCiAgDQpgYGANCg0KDQojIyMgUXVhbCDDqSBhIHN1YSBjb3Igb3UgcmHDp2E/DQoNCg0KYGBge3J9DQpjb3JfcmFjYSA8LSBkYXRhLmZyYW1lKENvcj1jKCJCcmFuY2EiLCJQcmV0YSIsIkFtYXJlbGEiLCJQYXJkYSIsIkluZGlnZW5hIiksUGVyY2VudHVhbCA9IHJvdW5kKGFzLm1hdHJpeCgodGFibGUoRHJvZ2FzX1NQJGNvcl9yYWNhKS80NDUpKjEwMCksMikpDQoNCmdncGxvdChjb3JfcmFjYSwgYWVzKHg9Q29yLCB5PVBlcmNlbnR1YWwsZmlsbD1Db3IpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iixjb2xvcj0iYmxhY2siLCB3aWR0aD0wLjgpKw0KICB5bGltKDAsMTAwKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcGFzdGUwKFBlcmNlbnR1YWwsIiUiKSksIHZqdXN0PS0xLjUsIGNvbG9yPSJibGFjayIsIHNpemU9My41KSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpKw0KICB4bGFiKCJcbkNvciIpKw0KICB5bGFiKCJQZXJjZW50dWFsICglKVxuIikrDQogIGdndGl0bGUoIlBlcmNlbnR1YWwgZGUgb2JzLiBwb3IgY2F0ZWdvcmlhcyBkZSAnY29yX3JhY2EnXG4iICkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQogIA0KDQoNCmBgYA0KDQojIyMgVm9jw6ogbW9yYSBjb20gc3VhIG3Do2U/IA0KDQoNCmBgYHtyfQ0KbW9yYV9tYWUgPC0gZGF0YS5mcmFtZShDYXRlZ29yaWEgPSBjKCJTaW0iLCJOw6NvIiksUGVyY2VudHVhbD1yb3VuZChhcy5tYXRyaXgoKHRhYmxlKERyb2dhc19TUCRtb3JhX21hZSkvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3QobW9yYV9tYWUsIGFlcyh4PSIiLCB5PVBlcmNlbnR1YWwsIGZpbGw9Q2F0ZWdvcmlhKSkrDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICdtb3JhX21hZSciICkrDQogdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICB4bGFiKGVsZW1lbnRfYmxhbmsoKSkrDQogIHlsYWIoZWxlbWVudF9ibGFuaygpKSsNCiAgZ2VvbV90ZXh0KGFlcyh4PWMoMSwxLjMpLHkgPSBjKDQ1LjE3LDEwMCksIA0KICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZShgUGVyY2VudHVhbGAsIiUiKSksIHNpemU9NSkNCiAgIA0KICANCmBgYA0KDQojIyMgTk9TIMOaTFRJTU9TIDMwIERJQVMsIGNvbSBxdWUgZnJlcXXDqm5jaWEgc2V1cyBwYWlzIG91IHJlc3BvbnPDoXZlaXMgc2FiaWFtIHJlYWxtZW50ZSBvIHF1ZSB2b2PDqiBlc3RhdmEgZmF6ZW5kbyBlbSBzZXUgdGVtcG8gbGl2cmU/IA0KDQoNCmBgYHtyfQ0KdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIDwtIGRhdGEuZnJhbWUoQ2F0ZWdvcmlhPWMoIk51bmNhIiwgIlJhcmFtZW50ZSIsICLDgHMgdmV6ZXMiLCAiTmEgbWFpb3IgcGFydGUgZG8gdGVtcG8iLCAiU2VtcHJlIiksUGVyY2VudHVhbCA9IHJvdW5kKGFzLm1hdHJpeCgodGFibGUoRHJvZ2FzX1NQJHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcykvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3QodGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzLCBhZXMoeD1DYXRlZ29yaWEsIHk9UGVyY2VudHVhbCxmaWxsPUNhdGVnb3JpYSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLGNvbG9yPSJibGFjayIsIHdpZHRoPTAuOCkrDQogIHlsaW0oMCwxMDApKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBwYXN0ZTAoUGVyY2VudHVhbCwiJSIpKSwgdmp1c3Q9LTEuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0zLjUpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHhsYWIoIlxuQ29yIikrDQogIHlsYWIoIlBlcmNlbnR1YWwgKCUpXG4iKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICd0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMnXG4iICkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQogIA0KDQoNCmBgYA0KDQojIyMgQWxndW1hIHZleiBuYSB2aWRhIHZvY8OqIHRvbW91IHVtYSBkb3NlIGRlIGJlYmlkYSBhbGNvw7NsaWNhPw0KDQoNCmBgYHtyfQ0KYmViaWRhX2FsY29vbGljYSA8LSBkYXRhLmZyYW1lKENhdGVnb3JpYSA9IGMoIlNpbSIsIk7Do28iKSxQZXJjZW50dWFsID0gcm91bmQoYXMubWF0cml4KCh0YWJsZShEcm9nYXNfU1AkYmViaWRhX2FsY29vbGljYSkvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3QoYmViaWRhX2FsY29vbGljYSwgYWVzKHg9IiIsIHk9UGVyY2VudHVhbCwgZmlsbD1DYXRlZ29yaWEpKSsNCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IikrDQogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkrDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNldDEiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBnZ3RpdGxlKCJQZXJjZW50dWFsIGRlIG9icy4gcG9yIGNhdGVnb3JpYXMgZGUgJ2JlYmlkYV9hbGNvb2xpY2EnIiApKw0KIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgeGxhYihlbGVtZW50X2JsYW5rKCkpKw0KICB5bGFiKGVsZW1lbnRfYmxhbmsoKSkrDQogIGdlb21fdGV4dChhZXMoeD1jKDAuOSwwLjkpLHkgPSBjKDI1LDc1KSwgDQogICAgICAgICAgICBsYWJlbCA9IHBhc3RlKGBQZXJjZW50dWFsYCwiJSIpKSwgc2l6ZT01KQ0KICAgDQoNCmBgYA0KDQojIyMgQWxndW1hIHZleiBuYSB2aWRhLCB2b2PDqiBqw6EgZnVtb3UgY2lnYXJybywgbWVzbW8gdW1hIG91IGR1YXMgdHJhZ2FkYXM/DQoNCg0KYGBge3J9DQpjaWdhcnJvIDwtIGRhdGEuZnJhbWUoQ2F0ZWdvcmlhID0gYygiU2ltIiwiTsOjbyIpLFBlcmNlbnR1YWw9IHJvdW5kKGFzLm1hdHJpeCgodGFibGUoRHJvZ2FzX1NQJGNpZ2Fycm8pLzQ0NSkqMTAwKSwyKSkNCg0KZ2dwbG90KGNpZ2Fycm8sIGFlcyh4PSIiLCB5PVBlcmNlbnR1YWwsIGZpbGw9Q2F0ZWdvcmlhKSkrDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICdjaWdhcnJvJyIgKSsNCiB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHhsYWIoZWxlbWVudF9ibGFuaygpKSsNCiAgeWxhYihlbGVtZW50X2JsYW5rKCkpKw0KICBnZW9tX3RleHQoYWVzKHg9YygxLjIsMC45KSx5ID0gYygxMCw1NSksIA0KICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZShgUGVyY2VudHVhbGAsIiUiKSksIHNpemU9NSkNCiAgIA0KDQoNCmBgYA0KDQojIyMgQWxndW0gZGUgc2V1cyBwYWlzIG91IHJlc3BvbnPDoXZlaXMgZnVtYT8NCg0KDQpgYGB7cn0NCnJlc3BvbnNhdmVsX2Z1bWEgPC0gZGF0YS5mcmFtZShDYXRlZ29yaWEgPSBjKCJOZW5odW0gZGVsZXMiLCAiU8OzIG1ldSBwYWkgb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gbWFzY3VsaW5vIiwgIlPDsyBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIGZlbWluaW5vIiwgIk1ldSBwYWkgZSBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlaXMiLCAiTsOjbyBzZWkiLCAiTsOjbyBpbmZvcm1hZG8iKSxQZXJjZW50dWFsID0gcm91bmQoYXMubWF0cml4KCh0YWJsZShEcm9nYXNfU1AkcmVzcG9uc2F2ZWxfZnVtYSkvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3QocmVzcG9uc2F2ZWxfZnVtYSwgYWVzKHg9Q2F0ZWdvcmlhLCB5PVBlcmNlbnR1YWwsZmlsbD1DYXRlZ29yaWEpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iixjb2xvcj0iYmxhY2siLCB3aWR0aD0wLjgpKw0KICB5bGltKDAsMTAwKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcGFzdGUwKFBlcmNlbnR1YWwsIiUiKSksIHZqdXN0PS0xLjUsIGNvbG9yPSJibGFjayIsIHNpemU9My41KSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpKw0KICB4bGFiKCJcbkNvciIpKw0KICB5bGFiKCJQZXJjZW50dWFsICglKVxuIikrDQogIGdndGl0bGUoIlBlcmNlbnR1YWwgZGUgb2JzLiBwb3IgY2F0ZWdvcmlhcyBkZSAncmVzcG9uc2F2ZWxfZnVtYSdcbiIgKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSxheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgDQoNCmBgYA0KDQojIyMgTk9TIMOaTFRJTU9TIDEyIE1FU0VTIGNvbSBxdWUgZnJlcXXDqm5jaWEgdGVtIHNlIHNlbnRpZG8gc296aW5obyhhKT8NCg0KDQpgYGB7cn0NCnNlbnRpZG9fc296aW5obyA8LSBkYXRhLmZyYW1lKENhdGVnb3JpYSA9IGMoIk51bmNhIiwgIlJhcmFtZW50ZSIsICLDgHMgdmV6ZXMiLCAiTmEgbWFpb3JpYSBkYXMgdmV6ZXMiLCAiU2VtcHJlIiksUGVyY2VudHVhbCA9IHJvdW5kKGFzLm1hdHJpeCgodGFibGUoRHJvZ2FzX1NQJHNlbnRpZG9fc296aW5obykvNDQ1KSoxMDApLDIpKQ0KDQpnZ3Bsb3Qoc2VudGlkb19zb3ppbmhvLCBhZXMoeD1DYXRlZ29yaWEsIHk9UGVyY2VudHVhbCxmaWxsPUNhdGVnb3JpYSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLGNvbG9yPSJibGFjayIsIHdpZHRoPTAuOCkrDQogIHlsaW0oMCwxMDApKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBwYXN0ZTAoUGVyY2VudHVhbCwiJSIpKSwgdmp1c3Q9LTEuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0zLjUpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHhsYWIoIlxuQ29yIikrDQogIHlsYWIoIlBlcmNlbnR1YWwgKCUpXG4iKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICdzZW50aWRvX3NvemluaG8nXG4iICkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQogIA0KYGBgDQoNCg0KIyMjIFF1YW50b3MgYW1pZ29zIHNldXMgdXNhbSBkcm9nYXM/DQoNCg0KYGBge3J9DQphbWlnb3NfZHJvZ2FzIDwtIGRhdGEuZnJhbWUoQ2F0ZWdvcmlhPSBjKCJOZW5odW0iLCAiUG91Y29zIiwgIkFsZ3VucyIsICJBIG1haW9yaWEiLCJOw6NvIHNlaSIpLFBlcmNlbnR1YWwgPSByb3VuZChhcy5tYXRyaXgoKHRhYmxlKERyb2dhc19TUCRhbWlnb3NfZHJvZ2FzKS80NDUpKjEwMCksMikpDQoNCmdncGxvdChhbWlnb3NfZHJvZ2FzLCBhZXMoeD1DYXRlZ29yaWEsIHk9UGVyY2VudHVhbCxmaWxsPUNhdGVnb3JpYSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLGNvbG9yPSJibGFjayIsIHdpZHRoPTAuOCkrDQogIHlsaW0oMCwxMDApKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBwYXN0ZTAoUGVyY2VudHVhbCwiJSIpKSwgdmp1c3Q9LTEuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0zLjUpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHhsYWIoIlxuQ29yIikrDQogIHlsYWIoIlBlcmNlbnR1YWwgKCUpXG4iKSsNCiAgZ2d0aXRsZSgiUGVyY2VudHVhbCBkZSBvYnMuIHBvciBjYXRlZ29yaWFzIGRlICdhbWlnb3NfZHJvZ2FzJ1xuIiApKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KICANCg0KYGBgDQoNCg0KIyBFc3RpbWHDp8OjbyBuw6NvLXBhcmFtw6l0cmljYQ0KDQpgYGB7cn0NCg0KdGVtcG9zPC0gRHJvZ2FzX1NQJHRlbXBvDQpjZW5zPC1Ecm9nYXNfU1AkY2Vuc3VyYQ0KDQpgYGANCg0KIyMgRXN0aW1hw6fDo28gZGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgUyh0KSBwb3IgS2FwbGFuLU1laWVyIGNvbSAgdHJhbnNmb3JtYcOnw6NvIGxvZ1stbG9nKFModCkpXSANCg0KLS0tDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQogICAkUyh0KSA9IFByKFQgPiB0KSQNCg0KPC9kaXY+DQoNCi0tLQ0KDQpgYGB7cn0NCmVrbTwtc3VydmZpdChTdXJ2KHRlbXBvcyxjZW5zKX4xLGNvbmYudHlwZT0ibG9nLWxvZyIpDQpwbG90KGVrbSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgS2FwbGFuLU1laWVyIixjb25mLmludD1ULCBtYWluPSJTKHQpIGVzdGltYWRhIHBvciBLYXBsYW4tTWVpZXIgY29tIHRyYW5zZi4gbG9nWy1sb2coUyh0KSldICsgSUNcbiIpDQpgYGANCg0KDQotIEEgcHJvYmFiaWxpZGFkZSBkZSBzb2JyZXZpdsOqbmNpYSBub3MgZMOhIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSB1bSBpbmRpdsOtZHVvIGRvIGVzdHVkbyBzb2JyZXZpdmVyIGFww7NzIHVtIHRlbXBvICR0JCBlc3BlY2lmaWNhZG8uDQoNCi0gTyBncsOhZmljbyBhY2ltYSBjb250w6ltIGFzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIGNvcnJlc3BvbmRlbnRlcyBhIGNhZGEgdGVtcG8gZGUgZmFsaGEgb3JkZW5hZG8uDQoNCi0gUG9yIHNlciBvYnRpZGEgZGUgZm9ybWEgZW1ww61yaWNhLCBhIGZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIMOpIHVtYSBmdW7Dp8OjbyBkZSBkZWdyYXVzOiBjb21lw6dhIGNvbSB1bWEgbGluaGEgaG9yaXpvbnRhbCBuYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhIDEgZSANCmUgZW50w6NvIHZhaSBkZXNjZW5kbyBwYXJhIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIG1lbm9yZXMgYSBtZWRpZGEgcXVlIGZhbGhhcyB2w6NvIHNlbmRvIG9ic2VydmFkYXMuIA0KDQotIEEgcHJvYmFiaWxpZGFkZSBkZSBzb2JyZXZpdsOqbmNpYSBlc3RpbWFkYSBhcMOzcyBvDQpwcmltZWlybyB0ZW1wbyBkZSBmYWxoYSBvcmRlbmFkbyAoMTEgYW5vcykgY29udGludWEgYmVtIHByw7N4aW1hIGRlICQxJC4gDQoNCi0gQW9zIDE1IGFub3Mgb2NvcnJlIG8gcXVpbnRvIChlIMO6bHRpbW8pIHRlbXBvIGRlIGZhbGhhIG9yZGVuYWRvIGUgYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhIGVzdGltYWRhIGZpY2EgYWNpbWEgZGUgJDcwXCUkLCBvdSBzZWphLCBlc3RpbWEtc2UgcXVlIGEgcHJvYmFiaWxpZGFkZSBkZSB1bSBlc3R1ZGFudGUgbsOjbyBleHBlcmltZW50YXIgZHJvZ2FzIGlsw61jaXRhcyBhcMOzcyBvcyAxNSBhbm9zIMOpIHN1cGVyaW9yIGEgICQ3MFwlJC4NCg0KLSBDb25mb3JtZSBvcyBhbm9zIHBhc3NhbSwgcGVyY2ViZW1vcyBxdWUgYXMgcXVlZGFzIG5hcyBwcm9iYWJpbGlkYWRlcyBkZSBzb2JyZXZpdsOqbmNpYSBmb3JhbSBhdW1lbnRhbmRvLiANCg0KLSBDb21vIG8gbWFpb3IgdGVtcG8gKDE2IGFub3MpIMOpIHVtYSBjZW5zdXJhLCBvIHZhbG9yIGRlICRTKHQpJCBhIHBhcnRpciBkZXNzZSBwb250byDDqSBpbmRldGVybWluYWRvLg0KDQoNCiMjIyAgSUNzIG5vcm1haXMgY29tIHRyYW5zZm9ybWFjYW8gbG9nWy1sb2coUyh0KSldIHBhcmEgYSBlc3RpbWF0aXZhIGRlIEthcGxhbi1NZWllciBkZSBTKHQpIA0KDQpBIHNhw61kYSBhYmFpeG8gY29udMOpbSBhcyBlc3RpbWF0aXZhcyBwb250dWFpcyBlIGludGVydmFsYXJlcyAoY29tIHRyYW5zZm9ybWHDp8OjbyBsb2ctbG9nKSBkZQ0KS2FwbGFuLU1laWVyLg0KQXMgY29sdW5hcyBzw6NvIHJlbGF0aXZhcyBhL2FvOg0KDQoxKSB0ZW1wbyBkZSBmYWxoYTsNCjIpIG7Dum1lcm8gZGUgaW5kaXbDrWR1b3MgZW0gcmlzY28gZGUgc29mcmVyIG8gZXZlbnRvOw0KMykgbsO6bWVybyBkZSBpbmRpdsOtZHVvcyBxdWUgc29mcmVyYW0gbyBldmVudG87DQo0KSBlc3RpbWF0aXZhIGRhIHByb2JhYmlsaWRhZGUgZGUgc29icmV2aXbDqm5jaWE7DQo1KSBlcnJvIHBhZHLDo28gZGEgZXN0aW1hdGl2YTsgDQo2KSBsaW1pdGUgaW5mZXJpb3IgZG8gaUMgZGUgOTUlIHBhcmEgYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhOw0KNykgbGltaXRlIHN1cGVyaW9yIGRvIElDIGRlIDk1JSBwYXJhIGEgcHJvYmFiaWxpZGFkZSBkZSBzb2JyZXZpdsOqbmNpYS4NCg0KYGBge3J9DQoNCnN1bW1hcnkoZWttKQ0KDQpgYGANCg0KUG9kZW1vcyBvYnNlcnZhciBxdWUsDQoNCi0gQW9zIDExIGFub3Mgb2NvcnJlIGEgcHJpbWVpcmEgZmFsaGEsIG8gcXVlIG9jYXNpb25hIGEgcXVlZGEgZGEgcHJvYmFiaWxpZGFkZSBkZSBzb2JyZXZpdsOqbmNpYSBkZSAkMSQgcGFyYSAkMC45OTgkLg0KLSBBb3MgMTIgYW5vcyBzw6NvIG9ic2VydmFkYXMgbWFpcyA1IGZhbGhhcyBlICRTKHQpJCBwYXNzYSBkZSAkMC45OTgkIHBhcmEgJDAuOTg3JC4NCi0gQW9zIDEzIGFub3Mgw6kgb2JzZXJ2YWRvIG8gbWFpb3IgbsO6bWVybyBkZSBmYWxoYXMsIDE4ISAgJFModCkkIHBhc3NhIGRlICQwLjk4NyQgcGFyYSAkMC45NDYkLg0KLSBBb3MgMTQgYW5vcyBzw6NvIG9ic2VydmFkYXMgMTQgZmFsaGFzIGUgJFModCkkIHBhc3NhIGRlICQwLjk0NiQgcGFyYSAkMC45MDAkLiANCi0gUG9yIGZpbSwgNSBmYWxoYXMgc8OjbyBvYnNlcnZhZGFzIGFvcyAxNSBhbm9zIGUgICRTKHQpJCBzb2ZyZSB1bWEgcXVlZGEgbWFpcyBhY2VudHVhZGEsIGluZG8gJDAuOTAwJCBwYXJhICQwLjc1MCQuDQotIFV0aWxpemFuZG8gYSBlc3RpbWHDp8OjbyBkZSBLYXBsYW4tTWVpZXIsIHBvZGVtb3MgYWZpcm1hciBjb20gY29uZmlhbsOnYSBkZSA5NSUgcXVlIGEgcmVhbCBwcm9iYWJpbGlkYWRlIGRlIG7Do28gZXhwZXJpbWVudGFyIGRyb2dhcyBpbMOtY2l0YXMgKHNvYnJldml2ZXIpIGFww7NzIG9zIDE1IGFub3MgZXN0w6EgZW50cmUgJDAuNjAxJCBlICQwLjg0OSQuDQoNCg0KIyMgRXN0aW1hw6fDo28gZGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgUyh0KSBwb3IgTmVsc29uLUFhbGVuDQoNCkFiYWl4bywgdGVtb3MgbyBncsOhZmljbyBkZSAkUyh0KSQgZXN0aW1hZGEgcG9yIE5lbHNvbi1BYWxlbjoNCg0KYGBge3J9DQpzczwtc3VydmZpdChjb3hwaChTdXJ2KHRlbXBvcyxjZW5zKX4xLG1ldGhvZD0iYnJlc2xvdyIpKQ0KcGxvdChzcywgbWFpbj0iUyh0KSBlc3RpbWFkYSBwb3IgTmVsc29uLUFhbGVuXG4iKQ0KDQpgYGANCg0KLSBQb2RlbW9zIGNvbmNsdWlyIG8gbWVzbW8gb2JzZXJ2YWRvIHBhcmEgbyBncsOhZmljbyBkZSAkUyh0KSQgZXN0aW1hZGEgcG9yIEthcGxhbi1NZWllciwgdmlzdG8gcXVlIG7Do28gc2UgZW5jb250cmFtIGRpZmVyZW7Dp2FzIHBlcmNlcHTDrXZlaXMgZW50cmUgb3MgZG9pcyBncsOhZmljb3MuDQoNCg0KIyMjIElDcyBwYXJhIGEgZXN0aW1hdGl2YSBkZSBOZWxzb24tQWFsZW4gZGUgUyh0KQ0KDQpBIHNhw61kYSBhYmFpeG8gY29udMOpbSBhcyBlc3RpbWF0aXZhcyBwb250dWFpcyBlIGludGVydmFsYXJlcyBkZQ0KTmVsc29uLUFhbGVuLg0KQXMgY29sdW5hcyBzw6NvIHJlbGF0aXZhcyBhL2FvOg0KDQoxKSB0ZW1wbyBkZSBmYWxoYTsNCjIpIG7Dum1lcm8gZGUgaW5kaXbDrWR1b3MgZW0gcmlzY28gZGUgc29mcmVyIG8gZXZlbnRvOw0KMykgbsO6bWVybyBkZSBpbmRpdsOtZHVvcyBxdWUgc29mcmVyYW0gbyBldmVudG87DQo0KSBlc3RpbWF0aXZhIGRhIHByb2JhYmlsaWRhZGUgZGUgc29icmV2aXbDqm5jaWE7DQo1KSBlcnJvIHBhZHLDo28gZGEgZXN0aW1hdGl2YTsgDQo2KSBsaW1pdGUgaW5mZXJpb3IgZG8gaUMgZGUgOTUlIHBhcmEgYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhOw0KNykgbGltaXRlIHN1cGVyaW9yIGRvIElDIGRlIDk1JSBwYXJhIGEgcHJvYmFiaWxpZGFkZSBkZSBzb2JyZXZpdsOqbmNpYS4NCg0KDQpgYGB7cn0NCnN1bW1hcnkoc3MpDQpgYGANCg0KUG9kZW1vcyBvYnNlcnZhciBxdWUsDQoNCi0gQXMgcHJvYmFiaWxpZGFkZXMgZGUgc29icmV2aXbDqm5jaWEgZXN0aW1hZGFzIHBvciBOZWxzb24tQWFsZW4gZm9yYW0gaWd1YWlzIG91IHN1cGVyaW9yZXMgw6BzIGVzdGltYWRhcyBwb3IgS2FwbGFuLU1laWVyLg0KLSBPcyBlcnJvcy1wYWRyw6NvIGRhcyBlc3RpbWF0aXZhcyBwb3IgTmVsc29uLUFhbGVuIHPDo28gaWd1YWlzIG91IG1lbm9yZXMgYW9zIG9idGlkb3MgcG9yIEthcGxhbi1NZWllci4NCi0gT3MgaW50ZXJ2YWxvcyBkZSA5NSUgZGUgY29uZmlhbsOnYSBwb3IgTmVsc29uLUFhbGVuIHRlbSBtZW5vciBhbXBwbGl0dWRlIHF1ZSBvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW7Dp2EgcG9yIEthcGxhbi1NZWllci4NCi0gQSBtYWlvciBkaWZlcmVuw6dhIGVudHJlIGFzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIGVzdGltYWRhcyBwb3IgTmVsc29uLUFhbGVuIGUgS2FwbGFuLU1laWVyIGZvaSBwYXJhICRTKDE1KSQuDQotIFV0aWxpemFuZG8gYSBlc3RpbWHDp8OjbyBkZSBOZWxzb24tQWFsZW4sIHBvZGVtb3MgYWZpcm1hciBjb20gY29uZmlhbsOnYSBkZSA5NSUgcXVlIGEgcmVhbCBwcm9iYWJpbGlkYWRlIGRlIG7Do28gZXhwZXJpbWVudGFyIGRyb2dhcyBpbMOtY2l0YXMgKHNvYnJldml2ZXIpIGFww7NzIG9zIDE1IGFub3MgZXN0w6EgZW50cmUgJDAuNjU3JCBlICQwLjg4NyQuDQoNCg0KDQojIyMgQ29tcGFyYW5kbyBTKHQpIHBvciBLYXBsYW4tTWVpZXIgZSBOZWxzb24tQWFsZW4NCg0KYGBge3J9DQpwbG90KGVrbSx5bGFiPSJTKHQpIGVzdGltYWRhIix4bGFiPSJUZW1wbyAoYW5vcykiLGNvbmYuaW50PUYsY29sPTQpDQpsaW5lcyhzcyxjb25mLmludD1GLGNvbD02KQ0KTGVnZW5kYTwtYygiS2FwbGFuLU1laWVyIiwiTmVsc29uLUFhbGVuIikNCmxlZ2VuZCgiYm90dG9tcmlnaHQiLCBMZWdlbmRhLGx3ZD1jKDEsMSksY2V4PTEuMixpbnNldD0wLjAwLGNvbD1jKDQsNiksYnR5PSJuIikNCmBgYA0KDQotIENvbW8gY29tZW50YWRvIGFudGVyaW9ybWVudGUsIGFzIGVzdGltYXRpdmFzIHPDo28gYmVtIHByw7N4aW1hcywgY29tIGEgbWFpb3IgZGlmZXJlbsOnYSBzZW5kbyBvYnNlcnZhZGEgYSBwYXJ0aXIgZG9zIDE1IGFub3MuDQoNCiMjIENvbXBhcmFuZG8gUyh0KSBlc3RpbWFkYSBwb3IgS2FwbGFuLU1laWVyIGNvbSB0cmFuc2Zvcm1hw6fDo28gbG9nWy1sb2coUyh0KSldIGVudHJlIG9zIHNleG9zIG1hc2N1bGlubyBlIGZlbWluaW5vIA0KDQpFeGlzdGUgZGlmZXJlbsOnYSBlbnRyZSBhcyBjdXJ2YXMgZGUgc29icmV2aXbDqm5jaWEgZGUgaG9tZW5zIGUgbXVsaGVyZXM/IA0KDQpgYGB7cn0NCmdydXBvczwtRHJvZ2FzX1NQJHNleG8NCmdydXBvcyA8LSBpZmVsc2UoZ3J1cG9zPT0xLCJNYXNjdWxpbm8iLCJGZW1pbmlubyIpDQpla208LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+Z3J1cG9zLGNvbmYudHlwZT0ibG9nLWxvZyIpDQpwbG90KGVrbSxsdHk9YygyLDEpLHhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iUyh0KSBlc3RpbWFkYSIpDQpsZWdlbmQoMSwwLjMsbHR5PWMoMiwxKSxjKCJGZW1pbmlubyIsIk1hc2N1bGlubyIpLGx3ZD0xLGJ0eT0ibiIpDQoNCmBgYA0KDQpQb2RlbW9zIG9ic2VydmFyIHF1ZSwNCg0KLSBBIGN1cnZhIGRvIHNleG8gZmVtaW5pbm8gcG9zc3VpIG1lbm9zIGRlZ3JhdXM6IGFsZ3VtIHRlbXBvIGRlIGZhbGhhIG9ic2VydmFkbyBwYXJhIG8gc2V4byBtYXNjdWxpbm8gbsOjbyBvY29ycmV1IHBhcmEgbyBzZXhvIGZlbWluaW5vLg0KDQotIEF0w6kgb3MgMTUgYW5vcywgYSBjdXJ2YSBkZSBzb2JyZXZpdsOqbmNpYSBwb3IgS2FwbGFuLU1laWVyIGRvIHNleG8gZmVtaW5pbm8gZmljYSBhY2ltYSBkYSBjdXJ2YSBkZSBzb3ZyZXZpdsOqbmNpYSBkbyBzZXhvIG1hc2N1bGlubywgbyBxdWUgc2lnbmlmaWNhIHF1ZSBhcyBwcm9iYWJpbGlkYWRlcyBkZSBzb2JyZXZpdsOqbmNpYSBkbyBzZXhvIGZlbWluaW5vIHPDo28gbWFpb3JlcyBxdWUgYXMgZG8gc2V4byBtYXNjdWxpbm8uIA0KDQoNCi0gQSBwYXJ0aXIgZG9zIDE1IGFub3MsIGEgY3VydmEgZGUgc29icmV2aXbDqm5jaWEgZG8gc2V4byBmZW1pbmlubyBwb3NzdWkgcXVlZGEgYWJydXB0YSwgZmljYW5kbyBhYmFpeG8gZGEgY3VydmEgZG8gc2V4byBtYXNjdWxpbm8uIElzc28gbm9zIGRpeiBxdWUgYSBwYXJ0aXIgZGVzc2EgaWRhZGUsIGFzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIHBhcmEgbyBzZXhvIGZlbWluaW5vIHPDo28gaW5mZXJpb3JlcyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgc29icmV2aXbDqm5jaWEgZG8gc2V4byBtYXNjdWxpbm8uICANCg0KDQoNCiMjIyAgSUNzIGNvbSB0cmFuc2Zvcm1hY2FvIGxvZ1stbG9nKFModCkpXSBwYXJhIGEgZXN0aW1hdGl2YSBkZSBLYXBsYW4tTWVpZXIgZGUgUyh0KSBwYXJhIG9zIHNleG9zIGZlbWluaW5vIGUgbWFzY3VsaW5vIA0KDQpgYGB7cn0NCnN1bW1hcnkoZWttKQ0KYGBgDQoNCi0gQ29tbyBmb2kgb2JzZXJ2YWRvIG5vIGdyw6FmaWNvLCBhcyBwcm9iYWJpbGlkYWRlcyBkZSBzb2JyZXZpdsOqbmNpYSBwYXJhIG9zIGRvaXMgZ3J1cG9zIG7Do28gZGlmZXJlbSBtdWl0byBub3MgdGVtcG9zIGRlIGZhbGhhIGVtIGNvbXVtLCBjb20gZXhjZcOnw6NvIGRvIHRlbXBvIGRlIGZhbGhhICR0PTE1JC4NCi0gUGFyYSBvIHRlbXBvIGRlIGZhbGhhICR0PTE1JCwgYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhIGVzdGltYWRhIHBhcmEgbyBzZXhvIGZlbWluaW5vIGZvaSAkMC42NTAkLCBlbnF1YW50byBhIGRvIHNleG8gbWFzY3VsaW5vIGZvaSAkMC43NzMkLg0KLSBFc3NhIGRpZmVyZW7Dp2EgcG9kZSBlc3RhciByZWxhY2lvbmFkYSBhbyBuw7ptZXJvIGRlIGluZGl2w61kdW9zIHNvYiByaXNjbyBkZSBzb2ZyZXIgbyBldmVudG86IHBhcmEgYW1ib3Mgb3Mgc2V4b3MgbyBuw7ptZXJvIGRlIGV2ZW50b3MgZW0gJHQ9MTUkIMOpIHNpbWlsYXIgKDIgZSAzKS4gRW50cmV0YW50bywgbyBuw7ptZXJvIGRlIGluZGl2w61kdW9zIGRvIHNleG8gbWFzY3VsaW5vIHNvYiByaXNjbyBkZSBzb2ZyZXIgbyBldmVudG8gw6kgMyB2ZXplcyBtYWlvciBxdWUgbyBkbyBzZXhvIGZlbWluaW5vLCBhZmV0YW5kbyBhIHByb2JhYmlsaWRhZGUgZXN0aW1hZGEuIA0KDQoNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCiAgJFxoYXR7U30odCkgPSBccHJvZF97dF9pPHR9ezEtIFxmcmFje2RfaX17bl9pfX0kDQo8L2Rpdj4NCg0KDQoNCm9uZGUgJGRfaSQgw6kgIG8gbsO6bWVybyBkZSBldmVudG9zIGVtICR0X2kkIGUgJG5faSQgbyBuw7ptZXJvIGRlIGluZGl2w61kdW9zIHNvYiByaXNjbyBlbSAkdF9pJC4NCg0KDQoNCiMjIyBUZXN0ZSBsb2dyYW5rIHBhcmEgY29tcGFyYXIgYXMgY3VydmFzIGRlIHNvYnJldml2w6puY2lhIG5vcyBkb2lzIGdydXBvcw0KDQpgYGB7cn0NCnN1cnZkaWZmKFN1cnYodGVtcG9zLGNlbnMpfmdydXBvcyxyaG89MCkNCg0KYGBgDQoNCk8gdGVzdGUgZGUgbG9ncmFuayB0ZW0gZXN0YXTDrXN0aWNhIGRlIHRlc3RlIGlndWFsIGEgJDAuMyQsIGUgKnAqLXZhbG9yICQwLjYkLiBMb2dvLCBhbyBuw612ZWwgZGUgNSUsIG7Do28gcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBudWxhDQpkZSBpZ3VhbGRhZGUgZW50cmUgYXMgY3VydmFzIGRlIHNvYnJldml2w6puY2lhIGRvcyBzZXhvcyBtYXNjdWxpbm8gZSBmZW1pbmluby4NCg0KIyBFc3RpbWHDp8OjbyBwYXJhbcOpdHJpY2ENCg0KIyMgRXN0aW1hw6fDo28gcGVsYSBkaXN0cmlidWnDp8OjbyBFeHBvbmVuY2lhbA0KDQotIEEgZm9ybWEgZGEgRXhwb25lbmNpYWwgdXRpbGl6YWRhIMOpIGRhZGEgcG9yOiANCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KJFxoYXR7Zih0KX09IFxmcmFjezF9e1xoYXR7XGFscGhhfX0gZV57XGZyYWN7LXR9e1xoYXR7XGFscGhhfX19JCANCjwvZGl2Pg0KDQoNCiMjIyBFTVYgZSBJQyBkbyBwYXLDom1ldHJvIGRlIGVzY2FsYSBkYSBFeHBvbmVuY2lhbCANCg0KLSBVdGlsaXphw6fDo28gZG8gTcOpdG9kbyBEZWx0YTogTyBSIGFqdXN0YSB1bWEgZGlzdHJpYnVpw6fDo28gRXhwb25lbmNpYWwgY29tIHBhcsOibWV0cm8gJFx0aGV0YSQgdGFsIHF1ZSwgbmEgbm9zc2EgcGFyYW1ldHJpemHDp8OjbywNCm8gcGFyw6JtZXRybyBkZSBlc2NhbGEgJFxhbHBoYSQgw6kgb2J0aWRvIHBvciAkXGFscGhhID0gZV57XHRoZXRhfSQuDQoNCi0gQSBlc3RpbWF0aXZhIGRlIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBwYXJhICRcYWxwaGEkLCBvIHBhcsOibWV0cm8gZGUgZXNjYWxhIGRhIGRpc3RyaWJ1acOnw6NvIEV4cG9uZW5jaWFsLCBzdWEgdmFyacOibmNpYSBlIG8gSUMgZGUgJDk1XCUkIHPDo28NCmRhZG9zIHBvcjoNCg0KYGBge3J9DQp0ZW1wb3M8LSBEcm9nYXNfU1AkdGVtcG8NCmNlbnM8LURyb2dhc19TUCRjZW5zdXJhDQojIEVzdGltYWNhbyB1c2FuZG8gYSBkaXN0cmlidWljYW8gRXhwb25lbmNpYWw6DQphanVzdGVfZXhwPC1zdXJ2cmVnKFN1cnYodGVtcG9zLGNlbnMpfjEsZGlzdD0nZXhwb25lbnRpYWwnKQ0KIyBjb21vIGEgZnVuw6fDo29vIHVzYSBvdXRyYSBwYXJhbWV0cml6YcOnw6NvIGRhIGV4cG9uZW5jaWFsOg0KYWxmYV9leHA8LWV4cChhanVzdGVfZXhwJGNvZWZmaWNpZW50c1sxXSkgIyBFTVYgZG8gcGFyYW1ldHJvIGRlIGVzY2FsYSBkYSBFeHBvbmVuY2lhbCB8IGVzdGltYXRpdmEgcG9udHVhbCBkbyBwYXLDom1ldHJvIGFsZmEgDQp2YXJhbGZhX2V4cDwtYWp1c3RlX2V4cCR2YXJbMSwgMV0qKGV4cChhanVzdGVfZXhwJGNvZWZmaWNpZW50WzFdKSleMiAjIEVNViBkYSB2YXJpYW5jaWEgZG8gcGFyYW1ldHJvIGRlIGVzY2FsYQ0KICAgICAgICAgICAgICAgIA0KdGFiX2V4cCA8LSBkYXRhLmZyYW1lKEVNViA9IGV4cChhanVzdGVfZXhwJGNvZWZmaWNpZW50c1sxXSksIFZhcmlhbmNpYT1hanVzdGVfZXhwJHZhclsxLCAxXSooZXhwKGFqdXN0ZV9leHAkY29lZmZpY2llbnRbMV0pKV4yICwgTEk9IGFsZmFfZXhwLXFub3JtKDAuOTc1KSpzcXJ0KHZhcmFsZmFfZXhwKSxMUz1hbGZhX2V4cCtxbm9ybSgwLjk3NSkqc3FydCh2YXJhbGZhX2V4cCkgKQ0KdGFiX2V4cCA8LSByb3VuZCh0YWJfZXhwLDQpDQprbml0cjo6a2FibGUodGFiX2V4cCxyb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQotIENvbSBiYXNlIG5hcyBlc3RpbWF0aXZhcyBvYnRpZGFzLCBwb2RlbW9zIGVzdGltYXIgcXVhbnRpZGFkZXMgZGUgaW50ZXJlc3NlIHBhcmEgb3MgZGFkb3MuDQoNCg0KIyMjIFRlbXBvIG3DqWRpbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzDQoNCi0gVW1hIHZleiBlc3RpbWFkb3Mgb3MgcGFyw6JtZXRyb3MsIG8gdGVtcG8gbcOpZGlvIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgcG9kZSBzZXIgZXN0aW1hZG86DQoNCmBgYHtyfQ0KI0VzdGltYW5kbyBvIHRlbXBvIG1lZGlvIGF0ZSBhIHJlaW5jaWRlbmNpYToNCkVfVD0gcm91bmQoZGF0YS5mcmFtZShFX1QgPSBhbGZhX2V4cCksMikNCmtuaXRyOjprYWJsZShFX1QsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KLSBFc3RpbWEtc2UgbyB0ZW1wbyBtw6lkaW8gYXTDqSBhIGV4cGVyaW1lbmHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIHNlamEgZGUgJDE0MS44MSQgYW5vcywgdmlzdG8gcXVlIG5hIGRpc3RyaWJ1acOnw6NvIEV4cG9uZW5jaWFsICRcaGF0e0V9KFQpPVxoYXR7XGFscGhhfSQuDQoNCiMjIyBFc3RpbWHDp8OjbyBkYSBmdW7Dp8OjbyBkZSB0YXhhIGRlIGZhbGhhDQoNCmBgYHtyfQ0KIyBFc3RpbWFuZG8gYSBmdW7Dp8OjbyBkZSB0YXhhIGRlIGZhbGhhOg0KbGFtYmRhX2V4cDwtZnVuY3Rpb24odCl7MS9hbGZhX2V4cCoodF4wKX0NCiMgRXN0aW1hbmRvIGEgZnVuY2FvIGRlIHRheGEgZGUgZmFsaGE6DQoNCnBsb3QobGFtYmRhX2V4cCx5bGFiPWV4cHJlc3Npb24obGFtYmRhKHQpKSx4bGFiPSJ0IChlbSBhbm9zKSIseGxpbT1jKDAsMTYpLA0KICAgICBtYWluPSJGdW7Dp8OjbyBkYSB0YXhhIGRlIGZhbGhhIC0gRXhwb25lbmNpYWwiKSAjcGxvdGFuZG8gYSBmdW5jYW8gZGUgdGF4YSBkZSBmYWxoYQ0KDQpgYGANCg0KLSBBIGZ1bsOnw6NvIGRlIHRheGEgZGUgZmFsaGEsIHF1ZSBuZXNzZSBjYXNvIMOpIGNvbnN0YW50ZSAocHJvcHJpZWRhZGUgZGUgZmFsdGEgZGUgbWVtw7NyaWEgZGEgZGlzdHJpYnVpw6fDo28gRXhwb25lbmNpYWwpLCDDqQ0KZXN0aW1hZGEgY29tbyBzZW5kbyAkMC4wMDckLg0KLSBFc3NlIMOpIG8gcmlzY28gaW5zdGFudMOibmVvIGRlIHVzbyBkZSBkcm9nYXMgaWzDrWNpdGFzLCBpbmRlcGVuZGVudGUgZG8gdGVtcG8gKGVtIGFub3MpLg0KLSBQb3IgZXhlbXBsbywgdW0gZXN0dWRhbnRlIGNvbSA1IGFub3MgdGVtIG8gbWVzbW8gcmlzY28gaW5zdGFudMOibmVvIGVzdGltYWRvIGRlIHVzYXIgZHJvZ2FzIGlsw61jaXRhcyAgcXVlIHVtIGVzdHVkYW50ZSBkZSAxNSBhbm9zLg0KDQoNCiMjIyBFc3RpbWHDp8OjbyBkb3MgcGVyY2VudGlzIDEwMHAlDQpgYGB7cn0NCg0KIyBFc3RpbWFuZG8gbyBwZXJjZW50aWwgMTAwcCU6DQpwZXJjX2V4cDwtZnVuY3Rpb24ocCl7LWFsZmFfZXhwKmxvZygxLXApfSNjcmlhbmRvIHVtYSBmdW5jYW8gbm8gUiBwYXJhIG8gcGVyY2VudGlsDQpwZXJjX2V4cF9lc3QgPC0gZGF0YS5mcmFtZShjYmluZChwZXJjX2V4cChwPTAuMSkscGVyY19leHAocD0wLjIpLHBlcmNfZXhwKHA9MC4zKSkpDQpjb2xuYW1lcyhwZXJjX2V4cF9lc3QpPC0gYygiMTAlIiwiMjAlIiwiMzAlIikNCnBlcmNfZXhwX2VzdCA8LSByb3VuZChwZXJjX2V4cF9lc3QsMikNCmtuaXRyOjprYWJsZShwZXJjX2V4cF9lc3QsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KLSBBb3MgJDE0Ljk0JCBhbm9zLCBlc3RpbWEtc2UgcXVlIDEwJSB0ZXLDo28gdXRpbGl6YWRvIGRyb2dhcyBpbMOtY2l0YXM7DQotIEFvcyAkMzEuNjQkIGFub3MsIGVzdGltYS1zZSBxdWUgMjAlIHRlcsOjbyB1dGlsaXphZG8gZHJvZ2FzIGlsw61jaXRhczsNCi0gQW9zICQ1MC41OCQgYW5vcywgZXN0aW1hLXNlIHF1ZSAzMCUgdGVyw6NvIHV0aWxpemFkbyBkcm9nYXMgaWzDrWNpdGFzLg0KDQpPIGdyw6FmaWNvIGFiYWl4byBtb3N0cmEgY29tbyBvcyBwZXJjZW50aXMgdmFyaWFtIGVtIGZ1bsOnw6NvIGRvIHZhbG9yIGRlIHAuDQoNCmBgYHtyfQ0KcGxvdChwZXJjX2V4cCx5bGFiPSJ0cCAoZW0gYW5vcykiLHhsYWI9InAiLA0KICAgICBtYWluPSJQZXJjZW50aWwgMTAwJSAtIEV4cG9uZW5jaWFsIikgI3Bsb3RhbmRvIG8gcGVyY2VudGlsIHZlcnN1cyBwDQpgYGANCg0KDQojIyMgRXN0aW1hw6fDo28gZGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWENCmBgYHtyfQ0KDQojRXN0aW1hbmRvIGEgZnVuY2FvIGRlIHNvYnJldml2ZW5jaWE6DQpTX2V4cDwtZnVuY3Rpb24odCl7ZXhwKC10L2FsZmFfZXhwKX0jY3JpYW5kbyB1bWEgZnVuY2FvIG5vIFIgcGFyYSBhIHNvYnJldml2ZW5jaWENCnZhcl9TX2V4cDwtZnVuY3Rpb24odCl7dmFyYWxmYV9leHAqKCh0L2FsZmFfZXhwXjIpKmV4cCgtdC9hbGZhX2V4cCkpXjJ9I2NyaWFuZG8gdW1hIGZ1bmNhbyBubyBSIHBhcmEgYSB2YXJpYW5jaWEgZGEgZnVuY2FvIGRlIHNvYnLDqnZpdmVuY2lhDQoNCmZfc29icmV2IDwtIGRhdGEuZnJhbWUoZXN0X3BvbnR1YWwgPSBjKFNfZXhwKHQ9MTUpLFNfZXhwKHQ9MTgpLFNfZXhwKHQ9MjIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgIExJID0gYyhTX2V4cCh0PTE1KS1xbm9ybSgwLjk3NSkqc3FydCh2YXJfU19leHAodD0xNSkpLFNfZXhwKHQ9MTgpLXFub3JtKDAuOTc1KSpzcXJ0KHZhcl9TX2V4cCh0PTE4KSksU19leHAodD0yMiktcW5vcm0oMC45NzUpKnNxcnQodmFyX1NfZXhwKHQ9MjIpKSksDQogICAgICAgICAgICAgICAgICAgICAgIExTID0gYyhTX2V4cCh0PTE1KStxbm9ybSgwLjk3NSkqc3FydCh2YXJfU19leHAodD0xNSkpLCBTX2V4cCh0PTE4KStxbm9ybSgwLjk3NSkqc3FydCh2YXJfU19leHAodD0xOCkpLCBTX2V4cCh0PTIyKStxbm9ybSgwLjk3NSkqc3FydCh2YXJfU19leHAodD0yMikpKSkNCmZfc29icmV2IDwtIHJvdW5kKGZfc29icmV2LDQpDQpyb3duYW1lcyhmX3NvYnJldik8LWMoInQ9MTUiLCJ0PTE4IiwidD0yMiIpDQprbml0cjo6a2FibGUoZl9zb2JyZXYscm93Lm5hbWVzID0gVFJVRSkNCmBgYA0KDQpFc3RpbWF0aXZhcyBwb250dWFpcyBlIGludGVydmFsYXJlcyAoOTUlIGRlIGNvbmZpYW7Dp2EpIGZvcmFtIG9idGlkYXMgcGFyYSBvcyAkdCQgaWd1YWwgYSAxMCwgMTIgZSAxNSBhbm9zLCBzZW5kbzoNCg0KLSAkXGhhdHtTfSgxNSk9MC44OTk2IFxxdWFkKDAuODcxMjsJMC45MjgxKTokIGVzdGltYS1zZSBxdWUgYSBjaGFuY2UgZGUgdW0gaW5kaXbDrWR1byBuw6NvIHRlciBleHBlcmltZW50YWRvIGRyb2dhcyBpbMOtY2l0YXMgYXDDs3Mgb3MgMTUgYW5vcyDDqSBkZSAkODkuOTZcJSQuDQotICRcaGF0e1N9KDE4KT0wLjg4MDggXHF1YWQoMC44NDc0OwkwLjkxNDIpOiQgZXN0aW1hLXNlIHF1ZSBhIGNoYW5jZSBkZSB1bSBpbmRpdsOtZHVvIG7Do28gdGVyIGV4cGVyaW1lbnRhZG8gZHJvZ2FzIGlsw61jaXRhcyBhcMOzcyBvcyAxOCBhbm9zIMOpIGRlICQ4OC4wOFwlJC4NCi0gJFxoYXR7U30oMjIpPTAuODU2MyBccXVhZCgwLjgxNjY7CTAuODk2MCk6JCBlc3RpbWEtc2UgcXVlIGEgY2hhbmNlIGRlIHVtIGluZGl2w61kdW8gbsOjbyB0ZXIgZXhwZXJpbWVudGFkbyBkcm9nYXMgaWzDrWNpdGFzIGFww7NzIG9zIDIyIGFub3Mgw6kgZGUgJDg1LjYzXCUkLg0KDQotIMOJIGludGVyZXNzYW50ZSBvYnNlcnZhciBhIHJlbGHDp8OjbyBlbnRyZSBlICRcaGF0e1N9KDE1KT0wLjg5OTYkIGUgJFxoYXR7dH1fezAuMTAwNH0gXGFwcHJveCAxNSQgLCBlc3RpbWFkbyBhbnRlcmlvcm1lbnRlOiBTZSBwYXJhIDE1IGFub3MgZXN0aW1hLXNlDQpxdWUgJDg5Ljk2XCUkIGRvcyBwYWNpZW50ZXMgbsOjbyB0ZXLDo28gZXhwZXJpbWVudGFkbyBkcm9nYXMgaWzDrWNpdGFzLCBlc3NlIMOpIG8gdGVtcG8gZW0gcXVlLCBhcHJveGltYWRhbWVudGUsIDEwJSBkZWxlcyBqw6EgdGVyw6NvIGV4cGVyaW1lbnRhZG8gZXNzZQ0KZXZlbnRvLg0KDQpPIGdyw6FmaWNvIG1vc3RyYSBjb21vIGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgJFModCkkIHZhcmlhIGFvIGxvbmdvIGRlICR0JCAoZW0gYW5vcyk6DQoNCmBgYHtyfQ0KcGxvdChTX2V4cCx5bGFiPSJTKHQpIix4bGFiPSJ0IChlbSBhbm9zKSIseGxpbT1jKDAsMTAwKSwNCiAgICAgbWFpbj0iRnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgLSBFeHBvbmVuY2lhbCIpICNwbG90YW5kbyBhIGZ1bmNhbyBkZSBzb2Jyw6p2aXZlbmNpYQ0KDQpgYGANCg0KDQojIyBFc3RpbWHDp8OjbyB1c2FuZG8gYSBkaXN0cmlidWnDp8OjbyBXZWlidWxsDQoNCi0gQSBmb3JtYSBkYSBXZWlidWxsIHV0aWxpemFkYSDDqSBkYWRhIHBvcjoNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCiRcaGF0e2Z9KHQpPVxmcmFje1xoYXR7XGdhbW1hfX17XGhhdHtcYWxwaGF9XGhhdHtcZ2FtbWF9fXRee1xoYXR7XGdhbW1hfS0xfWVeey0oXGZyYWN7dH17XGhhdHtcYWxwaGF9fSleXGhhdHtcZ2FtbWF9fSQNCg0KPC9kaXY+DQoNCiMjIyBFTVZzIGUgSUNzIHBhcmEgb3MgcGFyw6JtZXRyb3MgZGEgV2VpYnVsbCANCg0KLSBBc3NpbSBjb21vIG5hIGRpc3RyaWJ1acOnw6NvIEV4cG9uZW5jaWFsLCBhIHBhcmFtZXRyaXphw6fDo28gdXRpbGl6YWRhIHBlbG8gUiBwYXJhIGEgZGlzdHJpYnVpw6fDo28gV2VpYnVsbCDDqSBkaWZlcmVudGUgZGEgcXVlDQp1dGlsaXphbW9zLiANCi0gTyBSIGFqdXN0YSB1bWEgZGlzdHJpYnVpw6fDo28gV2VpYnVsbCBjb20gcGFyw6JtZXRyb3MgJFx0aGV0YV8xJCBlICRcdGhldGFfMiQgdGFpcyBxdWUsIG5hIG5vc3NhIHBhcmFtZXRyaXphw6fDo28sICRcYWxwaGE9ZXhwKFx0aGV0YV8xKSQgZQ0KJFxcZ2FtbWE9XGZyYWN7MX17XHRoZXRhXzJ9JC4NCi0gQXMgZXN0aW1hdGl2YXMgZGUgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhIHBhcmEgJFxhbHBoYSQgZSAkXGdhbW1hJCwgc3VhcyB2YXJpw6JuY2lhcyBlIHJlc3BlY3Rpdm9zIGludGVydmFsb3MgZGUgY29uZmlhbsOnYSBzw6NvOg0KDQoNCmBgYHtyfQ0KYWp1c3RlX3dlaTwtc3VydnJlZyhTdXJ2KHRlbXBvcyxjZW5zKX4xLGRpc3Q9J3dlaWJ1bGwnKQ0KYWxmYV93ZWk8LWV4cChhanVzdGVfd2VpJGNvZWZmaWNpZW50c1sxXSkgIyBFTVYgZG8gcGFyYW1ldHJvIGRlIGVzY2FsYSBkYSBXZWlidWxsDQpnYW1hX3dlaTwtMS9hanVzdGVfd2VpJHNjYWxlIyBFTVYgZG8gcGFyYW1ldHJvIGRlIGZvcm1hIGRhIFdlaWJ1bGwNCg0KdmFyYWxmYV93ZWk8LWFqdXN0ZV93ZWkkdmFyWzEsMV0qZXhwKGFqdXN0ZV93ZWkkY29lZmZpY2llbnRzWzFdKV4yDQp2YXJnYW1hX3dlaTwtYWp1c3RlX3dlaSR2YXJbMiwyXSooLTEvYWp1c3RlX3dlaSRzY2FsZV4yKV4yDQoNCnRhYl93ZWliIDwtIGRhdGEuZnJhbWUoRU1WID0gYyhnYW1hX3dlaSxhbGZhX3dlaSksIA0KICAgICAgICAgICAgICAgICAgICAgICBWYXJpYW5jaWEgPSBjKHZhcmFsZmFfd2VpLHZhcmdhbWFfd2VpKSwgDQogICAgICAgICAgICAgICAgICAgICAgIExJID0gYyhhbGZhX3dlaS1xbm9ybSgwLjk3NSkqc3FydCh2YXJhbGZhX3dlaSksZ2FtYV93ZWktcW5vcm0oMC45NzUpKnNxcnQodmFyZ2FtYV93ZWkpKSwgDQogICAgICAgICAgICAgICAgICAgICAgIExTID0gYyhhbGZhX3dlaStxbm9ybSgwLjk3NSkqc3FydCh2YXJhbGZhX3dlaSksZ2FtYV93ZWkrcW5vcm0oMC45NzUpKnNxcnQodmFyZ2FtYV93ZWkpKSkNCg0Kcm93bmFtZXModGFiX3dlaWIpIDwtYygiYWxmYSIsImdhbWEiKQ0Ka25pdHI6OmthYmxlKHRhYl93ZWliKQ0KDQoNCmBgYA0KDQoNCiMjIyBUZW1wbyBtw6lkaW8gYXTDqSBhIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcw0KDQotIFVtYSB2ZXogZXN0aW1hZG9zIG9zIHBhcsOibWV0cm9zLCBvIHRlbXBvIG3DqWRpbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIHBvZGUgc2VyIGVzdGltYWRvOg0KDQpgYGB7cn0NCiNFc3RpbWFuZG8gbyB0ZW1wbyBtZWRpbyBhdGUgYSByZWluY2lkZW5jaWE6DQpFX1Q9IHJvdW5kKGRhdGEuZnJhbWUoRV9UID0gYWxmYV93ZWkqZ2FtbWEoMSsxL2dhbWFfd2VpKSksMikNCmtuaXRyOjprYWJsZShFX1QsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KLSBQb3J0YW50bywgZXN0aW1hLXNlIG8gdGVtcG8gbcOpZGlvIGF0w6kgYSBleHBlcmltZW5hw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyBzZWphIGRlICQxNS42OCQgYW5vcy4NCg0KIyMjIEVzdGltYcOnw6NvIGRhIGZ1bsOnw6NvIGRlIHRheGEgZGUgZmFsaGENCg0KYGBge3J9DQoNCiMgRXN0aW1hbmRvIGEgZnVuY2FvIGRlIHRheGEgZGUgZmFsaGE6DQpsYW1iZGFfd2VpPC1mdW5jdGlvbih0KXtnYW1hX3dlaS9hbGZhX3dlaV5nYW1hX3dlaSp0XihnYW1hX3dlaS0xKX0jY3JpYW5kbyB1bWEgZnVuY2FvIG5vIFIgcGFyYSBhIHRheGEgZGUgZmFsaGEgDQoNCnRhYl9sYW1iZGFfd2VpIDwtIHJvdW5kKGNiaW5kLmRhdGEuZnJhbWUobGFtYmRhX3dlaSA9IGMobGFtYmRhX3dlaSh0PTE1KSwgbGFtYmRhX3dlaSh0PTE4KSxsYW1iZGFfd2VpKHQ9MjIpKSksMikNCnJvd25hbWVzKHRhYl9sYW1iZGFfd2VpKSA8LSBjKCIxNSIsIjE4IiwiMjIiKQ0Ka25pdHI6OmthYmxlKHRhYl9sYW1iZGFfd2VpKQ0KYGBgDQoNCg0KDQotIE8gcmlzY28gaW5zdGFudMOibmVvIGRlIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyDDqSBlc3RpbWFkbyBlbSAkMC4zMSQsICQ0LjM2JCBlICQ4MC40OSQNCmVtIDE1LCAxOCBlIDIyIGFub3MsIHJlc3BlY3RpdmFtZW50ZS4NCg0KDQoNCmBgYHtyfQ0KDQpwbG90KGxhbWJkYV93ZWkseWxhYj1leHByZXNzaW9uKGxhbWJkYSh0KSkseGxhYj0idCAoZW0gYW5vcykiLHhsaW09YygwLDQwKSwNCiAgICAgbWFpbiA9ICJGdW7Dp8OjbyBkYSB0YXhhIGRlIGZhbGhhIC0gV2VpYnVsbCIpICNwbG90YW5kbyBhIGZ1bmNhbyBkZSB0YXhhIGRlIGZhbGhhDQoNCmBgYA0KDQotIEEgZnVuw6fDo28gZGUgdGF4YSBkZSBmYWxoYSBlc3RpbWFkYSBwZWxvIGFqdXN0ZSBkYSBkaXN0cmlidWnDp8OjbyBXZWlidWxsIMOpIGNyZXNjZW50ZSwgZGlmZXJlbnRlIGRvIG9ic2VydmFkbyBxdWFuZG8gc2UNCnV0aWxpem91IGEgZGlzdHJpYnVpw6fDo28gRXhwb25lbmNpYWwuIA0KLSBMb2dvLCBvcyBpbmRpdsOtZHVvcyB0b3JuYW0tc2UgbWFpcyBzdXNjZXTDrXZlaXMgYSB1bWEgZmFsaGEgaW5zdGFudMOibmVhIMOgIG1lZGlkYSBlbQ0KcXVlIG8gdGVtcG8gKGVtIGFub3MpIGF1bWVudGEuIA0KDQoNCiMjIyBFc3RpbWHDp8OjbyBkb3MgcGVyY2VudGlzIDEwMHAlDQoNCg0KYGBge3J9DQoNCiMgRXN0aW1hbmRvIG8gcGVyY2VudGlsIDEwMHAlOg0KcGVyY193ZWk8LWZ1bmN0aW9uKHApe2FsZmFfd2VpKigtbG9nKDEtcCkpXigxL2dhbWFfd2VpKX0jY3JpYW5kbyB1bWEgZnVuY2FvIG5vIFIgcGFyYSBvIHBlcmNlbnRpbA0KcGVyY193ZWlfZXN0IDwtIGRhdGEuZnJhbWUoY2JpbmQocGVyY193ZWkocD0wLjEpLHBlcmNfd2VpKHA9MC4yKSxwZXJjX3dlaShwPTAuMykpKQ0KY29sbmFtZXMocGVyY193ZWlfZXN0KTwtIGMoIjEwJSIsIjIwJSIsIjMwJSIpDQpwZXJjX3dlaV9lc3QgPC0gcm91bmQocGVyY193ZWlfZXN0LDIpDQprbml0cjo6a2FibGUocGVyY193ZWlfZXN0LCByb3cubmFtZXMgPSBGQUxTRSkNCg0KYGBgDQoNCi0gQW9zICQxNC4wMyQgYW5vcywgZXN0aW1hLXNlIHF1ZSAxMCUgdGVyw6NvIHV0aWxpemFkbyBkcm9nYXMgaWzDrWNpdGFzOw0KLSBBb3MgJDE0LjcyJCBhbm9zLCBlc3RpbWEtc2UgcXVlIDIwJSB0ZXLDo28gdXRpbGl6YWRvIGRyb2dhcyBpbMOtY2l0YXM7DQotIEFvcyAkMTUuMTgkIGFub3MsIGVzdGltYS1zZSBxdWUgMzAlIHRlcsOjbyB1dGlsaXphZG8gZHJvZ2FzIGlsw61jaXRhcy4NCg0KTyBncsOhZmljbyBhYmFpeG8gbW9zdHJhIGNvbW8gb3MgcGVyY2VudGlzIHZhcmlhbSBlbSBmdW7Dp8OjbyBkbyB2YWxvciBkZSBwLg0KDQpgYGB7cn0NCnBsb3QocGVyY193ZWkseWxhYj0idHAgKGVtIGFub3MpIix4bGFiPSJwIiwNCiAgICAgbWFpbj0iUGVyY2VudGlsIDEwMCUgLSBXZWlidWxsIikgI3Bsb3RhbmRvIG8gcGVyY2VudGlsIHZlcnN1cyBwDQoNCmBgYA0KDQoNCiMjIyBFc3RpbWHDp8OjbyBkYSBmdW7Dp8OjbyBkZSBzb2JyZXZpdsOqbmNpYSANCg0KYGBge3J9DQojRXN0aW1hbmRvIGEgZnVuY2FvIGRlIHNvYnJldml2ZW5jaWE6DQpTX3dlaTwtZnVuY3Rpb24odCl7ZXhwKC0odC9hbGZhX3dlaSleZ2FtYV93ZWkpfSNjcmlhbmRvIHVtYSBmdW5jYW8gbm8gUiBwYXJhIGEgc29icmV2aXZlbmNpYQ0KZl9zb2JyZXYgPC0gZGF0YS5mcmFtZShlc3RfcG9udHVhbCA9IGMoU193ZWkodD0xNSksU193ZWkodD0xOCksU193ZWkodD0yMikpKQ0KZl9zb2JyZXYgPC0gcm91bmQoZl9zb2JyZXYsNCkNCnJvd25hbWVzKGZfc29icmV2KTwtYygidD0xNSIsInQ9MTgiLCJ0PTIyIikNCmtuaXRyOjprYWJsZShmX3NvYnJldixyb3cubmFtZXMgPSBUUlVFKQ0KYGBgDQoNCkVzdGltYXRpdmFzIHBvbnR1YWlzIGZvcmFtIG9idGlkYXMgcGFyYSBvcyAkdCQgaWd1YWwgYSAxNSwgMTggZSAyMiBhbm9zLCBzZW5kbzoNCg0KLSAkXGhhdHtTfSgxNSk9MC43NDI1JCBlc3RpbWEtc2UgcXVlIGEgY2hhbmNlIGRlIHVtIGluZGl2w61kdW8gbsOjbyB0ZXIgZXhwZXJpbWVudGFkbyBkcm9nYXMgaWzDrWNpdGFzIGFww7NzIG9zIDE1IGFub3Mgw6kgZGUgJDc0LjI1XCUkLg0KLSAkXGhhdHtTfSgxOCk9MC4wMDY0JCBlc3RpbWEtc2UgcXVlIGEgY2hhbmNlIGRlIHVtIGluZGl2w61kdW8gbsOjbyB0ZXIgZXhwZXJpbWVudGFkbyBkcm9nYXMgaWzDrWNpdGFzIGFww7NzIG9zIDE4IGFub3Mgw6kgZGUgJDAuNjRcJSQuDQotICRcaGF0e1N9KDIyKT0wLjAwMCQgZXN0aW1hLXNlIHF1ZSBhIGNoYW5jZSBkZSB1bSBpbmRpdsOtZHVvIG7Do28gdGVyIGV4cGVyaW1lbnRhZG8gZHJvZ2FzIGlsw61jaXRhcyBhcMOzcyBvcyAyMiBhbm9zIMOpIGRlICQwXCUkLg0KDQoNCk8gZ3LDoWZpY28gbW9zdHJhIGNvbW8gYSBmdW7Dp8OjbyBkZSBzb2JyZXZpdsOqbmNpYSAkUyh0KSQgdmFyaWEgYW8gbG9uZ28gZGUgJHQkIChlbSBhbm9zKToNCg0KYGBge3J9DQpwbG90KFNfd2VpLHlsYWI9IlModCkiLHhsYWI9InQgKGVtIGFub3MpIix4bGltPWMoMCw0MCksDQogICAgIG1haW49IkZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIC0gV2VpYnVsbCIpICNwbG90YW5kbyBhIGZ1bmNhbyBkZSBzb2JyZXZpdmVuY2lhDQoNCmBgYA0KDQoNCiMjIEVzdGltYcOnw6NvIHVzYW5kbyBhIGRpc3RyaWJ1acOnw6NvIExvZy1ub3JtYWwNCg0KLSBBIGZvcm1hIGRhIExvZy1ub3JtYWwgdXRpbGl6YWRhIMOpIGRhZGEgcG9yOg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KJFxoYXR7Zn0odCk9XGZyYWN7MX17XHNxcnR7MlxwaX10XGhhdHtcc2lnbWF9fWV4cHstXGZyYWN7MX17Mn0oIFxmcmFje2xvZyh0KS1caGF0e1xtdX19e1xoYXR7XHNpZ21hfX0pXjIgfSQNCg0KPC9kaXY+DQoNCg0KIyMjIEVNVnMgZSBJY3MgcGFyYSBwYXLDom1ldHJvcyBkYSBMb2ctbm9ybWFsDQoNCg0KDQotIEFzIGVzdGltYXRpdmFzIGRlIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBwYXJhICRcbXUkIGUgJFxzaWdtYSQsIHN1YXMgdmFyacOibmNpYXMgZSByZXNwZWN0aXZvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW7Dp2Egc8OjbzoNCg0KDQpgYGB7cn0NCmFqdXN0ZV9sb2duPC1zdXJ2cmVnKFN1cnYodGVtcG9zLGNlbnMpfjEsZGlzdD0nbG9nbm9ybScpDQptdV9sb2duPC1hanVzdGVfbG9nbiRjb2VmZmljaWVudHNbMV0gIyBFTVYgZG8gcGFyYW1ldHJvIGRlIGxvY2FjYW8gZGEgTG9nLW5vcm1hbA0Kc2lnbWFfbG9nbjwtYWp1c3RlX2xvZ24kc2NhbGUjIEVNViBkbyBwYXJhbWV0cm8gZGUgZXNjYWxhIGRhIExvZy1ub3JtYWwNCg0KDQp2YXJfbXU8LWFqdXN0ZV9sb2duJHZhclsxLDFdIyB2YXJpYW5jaWEgZGEgZXN0aW1hdGl2YSBkbyBwYXJhbWV0cm8gZGUgbG9jYWNhbw0KdmFyX3NpZ21hPC1hanVzdGVfbG9nbiR2YXJbMiwyXQ0KDQoNCnRhYl9sb2duIDwtIGRhdGEuZnJhbWUoRU1WID0gYyhtdV9sb2duLHNpZ21hX2xvZ24pLCANCiAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFuY2lhID0gYyh2YXJfbXUsdmFyX3NpZ21hKSwgDQogICAgICAgICAgICAgICAgICAgICAgIExJID0gYyhtdV9sb2duLXFub3JtKDAuOTc1KSpzcXJ0KHZhcl9tdSksbXVfbG9nbitxbm9ybSgwLjk3NSkqc3FydCh2YXJfbXUpKSwgDQogICAgICAgICAgICAgICAgICAgICAgIExTID0gYyhzaWdtYV9sb2duLXFub3JtKDAuOTc1KSpzcXJ0KHZhcl9zaWdtYSksc2lnbWFfbG9nbitxbm9ybSgwLjk3NSkqc3FydCh2YXJfc2lnbWEpKSkNCg0Kcm93bmFtZXModGFiX2xvZ24pIDwtYygibXUiLCJzaWdtYSIpDQprbml0cjo6a2FibGUodGFiX2xvZ24pDQoNCg0KYGBgDQoNCg0KLSBFc3NhcyBlc3RpbWF0aXZhcyBwb2RlbSBzZXIgdXRpbGl6YWRhcyBwYXJhIHNlIG9idGVyIGFzIGRlbWFpcyBtZWRpZGFzIGRlIGludGVyZXNzZS4NCg0KIyMjIFRlbXBvIG3DqWRpbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzDQoNCg0KLSBVbWEgdmV6IGVzdGltYWRvcyBvcyBwYXLDom1ldHJvcywgbyB0ZW1wbyBtw6lkaW8gYXTDqSBhIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyBwb2RlIHNlciBlc3RpbWFkbzoNCg0KDQpgYGB7cn0NCiNFc3RpbWFuZG8gbyB0ZW1wbyBtZWRpbyBhdGUgYSByZWluY2lkZW5jaWE6DQpFX1Q9cm91bmQoZGF0YS5mcmFtZShFX1Q9ZXhwKG11X2xvZ24rKHNpZ21hX2xvZ25eMikvMikpLDIpDQprbml0cjo6a2FibGUoRV9ULHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCi0gUG9ydGFudG8sIGVzdGltYS1zZSBvIHRlbXBvIG3DqWRpbyBhdMOpIGEgZXhwZXJpbWVuYcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgc2VqYSBkZSAkMTYuNDgkIGFub3MuDQoNCg0KDQojIyMgRXN0aW1hw6fDo28gZGEgZnVuw6fDo28gZGUgdGF4YSBkZSBmYWxoYQ0KDQpgYGB7cn0NCmZfbG9nbjwtZnVuY3Rpb24odCl7KDEvKHNxcnQoMipwaSkqdCpzaWdtYV9sb2duKSkqZXhwKC0wLjUqKChsb2codCktbXVfbG9nbikvc2lnbWFfbG9nbileMil9I2NyaWFuZG8gdW1hIGZ1bmNhbyBubyBSIHBhcmEgYSBkZW5zaWRhZGUNClNfbG9nbjwtZnVuY3Rpb24odCl7cG5vcm0oKC1sb2codCkrbXVfbG9nbikvc2lnbWFfbG9nbil9DQpsYW1iZGFfbG9nbjwtZnVuY3Rpb24odCl7Zl9sb2duKHQpL1NfbG9nbih0KX0jY3JpYW5kbyB1bWEgZnVuY2FvIG5vIFIgcGFyYSBhIHRheGEgZGUgZmFsaGEgDQoNCnRhYl9sYW1iZGFfbG9nbiA8LSByb3VuZChjYmluZC5kYXRhLmZyYW1lKGxhbWJkYV9sb2duID0gYyhsYW1iZGFfbG9nbih0PTE1KSwgbGFtYmRhX2xvZ24odD0xOCksbGFtYmRhX2xvZ24odD0yMikpKSwyKQ0Kcm93bmFtZXModGFiX2xhbWJkYV9sb2duKTwtIGMoIjE1IiwiMTgiLCIyMiIpDQprbml0cjo6a2FibGUodGFiX2xhbWJkYV9sb2duKQ0KYGBgDQoNCg0KDQotIE8gcmlzY28gaW5zdGFudMOibmVvIGRlIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyDDqSBlc3RpbWFkbyBlbSAkMC4yMiQsICQwLjYxJCBlICQxLjAxJA0KZW0gMTUsIDE4IGUgMjIgYW5vcywgcmVzcGVjdGl2YW1lbnRlLg0KDQoNCi0gTyBncsOhZmljbyBkYSBmdW7Dp8OjbyBkYSB0YXhhIGRlIGZhbGhhIGFvIGxvbmdvIGRvIHRlbXBvIHQoZW0gYW5vcykgcG9kZSBzZXIgdmlzdG8gYWJhaXhvOg0KDQoNCmBgYHtyfQ0KDQpwbG90KGxhbWJkYV9sb2duLHlsYWI9ZXhwcmVzc2lvbihsYW1iZGEodCkpLHhsYWI9InQgKGVtIGFub3MpIix4bGltPWMoMCw0NSksDQogICAgIG1haW4gPSAiIEZ1bsOnw6NvIGRhIHRheGEgZGUgZmFsaGEgLSBMb2ctbm9ybWFsIikgI3Bsb3RhbmRvIGEgZnVuY2FvIGRlIHRheGEgZGUgZmFsaGENCg0KYGBgDQoNCg0KIyMjIEVzdGltYcOnw6NvIGRvcyBwZXJjZW50aXMgMTAwcCUNCg0KDQpgYGB7cn0NCiMgRXN0aW1hbmRvIG8gcGVyY2VudGlsIDEwMHAlOg0KcGVyY19sb2duPC1mdW5jdGlvbihwKXtleHAocW5vcm0ocCkqc2lnbWFfbG9nbittdV9sb2duKX0jY3JpYW5kbyB1bWEgZnVuY2FvIG5vIFIgcGFyYSBvIHBlcmNlbnRpbA0KcGVyY19sb2duX2VzdCA8LSBkYXRhLmZyYW1lKGNiaW5kKHBlcmNfbG9nbihwPTAuMSkscGVyY19sb2duKHA9MC4yKSxwZXJjX2xvZ24ocD0wLjMpKSkNCmNvbG5hbWVzKHBlcmNfbG9nbl9lc3QpPC0gYygiMTAlIiwiMjAlIiwiMzAlIikNCnBlcmNfbG9nbl9lc3QgPC0gcm91bmQocGVyY19sb2duX2VzdCwyKQ0Ka25pdHI6OmthYmxlKHBlcmNfbG9nbl9lc3QsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KLSBBb3MgJDEzLjk2JCBhbm9zLCBlc3RpbWEtc2UgcXVlIDEwJSB0ZXLDo28gdXRpbGl6YWRvIGRyb2dhcyBpbMOtY2l0YXM7DQotIEFvcyAkMTQuNzQkIGFub3MsIGVzdGltYS1zZSBxdWUgMjAlIHRlcsOjbyB1dGlsaXphZG8gZHJvZ2FzIGlsw61jaXRhczsNCi0gQW9zICQxNS4zMyQgYW5vcywgZXN0aW1hLXNlIHF1ZSAzMCUgdGVyw6NvIHV0aWxpemFkbyBkcm9nYXMgaWzDrWNpdGFzLg0KDQpPIGdyw6FmaWNvIGFiYWl4byBtb3N0cmEgY29tbyBvcyBwZXJjZW50aXMgdmFyaWFtIGVtIGZ1bsOnw6NvIGRvIHZhbG9yIGRlIHAuDQoNCmBgYHtyfQ0KDQpwbG90KHBlcmNfbG9nbix5bGFiPSJ0IChlbSBhbm9zKSIseGxhYj0icCIsIA0KICAgICBtYWluID0gIiBQZXJjZW50aWwgMTAwJSAtIExvZy1ub3JtYWwiKSAjcGxvdGFuZG8gbyBwZXJjZW50aWwgdmVyc3VzIHANCmBgYA0KDQoNCg0KIyMjIEVzdGltYcOnw6NvIGRhIGZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIA0KDQoNCg0KDQpgYGB7cn0NCiNFc3RpbWFuZG8gYSBmdW5jYW8gZGUgc29icmV2aXZlbmNpYToNClNfbG9nbjwtZnVuY3Rpb24odCl7cG5vcm0oKC1sb2codCkrbXVfbG9nbikvc2lnbWFfbG9nbil9I2NyaWFuZG8gdW1hIGZ1bmNhbyBubyBSIHBhcmEgYSBzb2JyZXZpdmVuY2lhDQpmX3NvYnJldiA8LSBkYXRhLmZyYW1lKGVzdF9wb250dWFsID0gYyhTX2xvZ24odD0xNSksU19sb2duKHQ9MTgpLFNfbG9nbih0PTIyKSkpDQpmX3NvYnJldiA8LSByb3VuZChmX3NvYnJldiw0KQ0Kcm93bmFtZXMoZl9zb2JyZXYpPC1jKCJ0PTE1IiwidD0xOCIsInQ9MjIiKQ0Ka25pdHI6OmthYmxlKGZfc29icmV2LHJvdy5uYW1lcyA9IFRSVUUpDQpgYGANCg0KRXN0aW1hdGl2YXMgcG9udHVhaXMgZm9yYW0gb2J0aWRhcyBwYXJhIG9zICR0JCBpZ3VhbCBhIDE1LCAxOCBlIDIyIGFub3MsIHNlbmRvOg0KDQotICRcaGF0e1N9KDE1KT0wLjc1ODIkIGVzdGltYS1zZSBxdWUgYSBjaGFuY2UgZGUgdW0gaW5kaXbDrWR1byBuw6NvIHRlciBleHBlcmltZW50YWRvIGRyb2dhcyBpbMOtY2l0YXMgYXDDs3Mgb3MgMTUgYW5vcyDDqSBkZSAkNzUuODJcJSQuDQotICRcaGF0e1N9KDE4KT0wLjIxODYkIGVzdGltYS1zZSBxdWUgYSBjaGFuY2UgZGUgdW0gaW5kaXbDrWR1byBuw6NvIHRlciBleHBlcmltZW50YWRvIGRyb2dhcyBpbMOtY2l0YXMgYXDDs3Mgb3MgMTggYW5vcyDDqSBkZSAkMjEuODZcJSQuDQotICRcaGF0e1N9KDIyKT0wLjAwODEkIGVzdGltYS1zZSBxdWUgYSBjaGFuY2UgZGUgdW0gaW5kaXbDrWR1byBuw6NvIHRlciBleHBlcmltZW50YWRvIGRyb2dhcyBpbMOtY2l0YXMgYXDDs3Mgb3MgMjIgYW5vcyDDqSBkZSAkMC44MVwlJC4NCg0KDQpPIGdyw6FmaWNvIG1vc3RyYSBjb21vIGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgJFModCkkIHZhcmlhIGFvIGxvbmdvIGRlICR0JCAoZW0gYW5vcyk6DQoNCmBgYHtyfQ0KcGxvdChTX2xvZ24seWxhYj0iUyh0KSIseGxhYj0idCAoZW0gYW5vcykiLHhsaW09YygwLDEwMCksDQogICAgIG1haW4gPSAiIEZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIC0gTG9nLW5vcm1hbCIpICNwbG90YW5kbyBhIGZ1bmNhbyBkZSBzb2JyZXZpdmVuY2lhDQoNCmBgYA0KDQoNCiMjIENvbXBhcmFuZG8gb3MgcmVzdWx0YWRvcyBkYXMgdHLDqnMgZGlzdHJpYnVpw6fDtWVzDQoNCiFbQ29tcGFyYcOnw6NvIGVudHJlIG9zIHJlc3VsdGFkb3MgZGEgZXN0aW1hw6fDo28gcGFyYW3DqXRyaWNhIHBhcmEgYXMgZGlzdHJpYnVpw6fDtWVzIEV4cG9uZW5jaWFsLCBXZWlidWxsIGUgTG9nLW5vcm1hbF0odGFiZWxhX2NvbXBhcmF0aXZhLnBuZykNCg0KDQojIyBQbG90YW5kbyBhcyBmdW7Dp8O1ZXMgZGFzIHRyw6pzIGRpc3RyaWJ1acOnw7VlcyBjb25qdW50YW1lbnRlDQoNCmBgYHtyfQ0KI0Z1bmNhbyBkZW5zaWRhZGU6DQpmX2V4cDwtZnVuY3Rpb24odCl7KDEvYWxmYV9leHApKmV4cCgtdC9hbGZhX2V4cCl9ICNmdW5jYW8gZGVuc2lkYWRlIGRhIEV4cG9uZW5jaWFsDQpmX3dlaTwtZnVuY3Rpb24odCl7KGdhbWFfd2VpL2FsZmFfd2VpXmdhbWFfd2VpKSp0XihnYW1hX3dlaS0xKSpleHAoLSh0L2FsZmFfd2VpKV5nYW1hX3dlaSl9ICNmdW5jYW8gZGVuc2lkYWRlIGRhIFdlaWJ1bGwNCg0KcGxvdChmX2V4cCx0eXBlPSJsIixjb2w9NCx5bGFiPSJmKHQpIix4bGFiPSJ0Iix4bGltPWMoMCw0MCksIHlsaW09YygwLDAuNCksIG1haW49ICJDb21wYXJhbmRvIGZ1bsOnw7VlcyBkZSBkZW5zaWRhZGUiKSNwbG90YW5kbyBhcyBmdW5jb2VzDQp0PXNlcSgwLDQwLDAuMSkNCmxpbmVzKHQsZl93ZWkodCksdHlwZT0ibCIsY29sPTYpDQpsaW5lcyh0LGZfbG9nbih0KSx0eXBlPSJsIixjb2w9OSkNCkxlZ2VuZGE8LWMoZXhwcmVzc2lvbihFeHBvbmVuY2lhbCksZXhwcmVzc2lvbihXZWlidWxsKSxleHByZXNzaW9uKExvZy1ub3JtYWwpKQ0KbGVnZW5kKCJ0b3ByaWdodCIsIExlZ2VuZGEsbHdkPWMoMSwxLDEpLGNleD0xLjIsaW5zZXQ9MC4wMCxjb2w9Yyg0LDYsOSksYnR5PSJuIikNCmBgYA0KDQoNCmBgYHtyfQ0KI0Z1bmNhbyBkZSB0YXhhIGRlIGZhbGhhOg0KcGxvdChsYW1iZGFfZXhwLHR5cGU9ImwiLGNvbD00LHlsYWI9ZXhwcmVzc2lvbihsYW1iZGEodCkpLHhsYWI9InQiLHhsaW09YygwLDQwKSx5bGltPWMoMCwxKSwgbWFpbj0gIkNvbXBhcmFuZG8gZnVuw6fDtWVzIGRlIHRheGEgZGUgZmFsaGEiKSNwbG90YW5kbyBhcyBmdW5jb2VzDQp0PXNlcSgwLDQwLDAuMSkNCmxpbmVzKHQsbGFtYmRhX3dlaSh0KSx0eXBlPSJsIixjb2w9NikNCmxpbmVzKHQsbGFtYmRhX2xvZ24odCksdHlwZT0ibCIsY29sPTkpDQpMZWdlbmRhPC1jKGV4cHJlc3Npb24oRXhwb25lbmNpYWwpLGV4cHJlc3Npb24oV2VpYnVsbCksZXhwcmVzc2lvbihMb2ctbm9ybWFsKSkNCmxlZ2VuZCgidG9wcmlnaHQiLCBMZWdlbmRhLGx3ZD1jKDEsMSwxKSxjZXg9MS4yLGluc2V0PTAuMDAsY29sPWMoNCw2LDkpLGJ0eT0ibiIpDQpgYGANCg0KYGBge3J9DQojRnVuY2FvIGRlIHNvYnJldml2ZW5jaWE6DQpwbG90KFNfZXhwLHR5cGU9ImwiLGNvbD00LHlsYWI9IlModCkiLHhsYWI9InQiLHhsaW09YygwLDQwKSwgbWFpbj0gIkNvbXBhcmFuZG8gZnVuw6fDtWVzIGRlIHNvYnJldml2w6puY2lhIikjcGxvdGFuZG8gYXMgZnVuY29lcw0KdD1zZXEoMCw4MDQwLDAuMSkNCmxpbmVzKHQsU193ZWkodCksdHlwZT0ibCIsY29sPTYpDQpsaW5lcyh0LFNfbG9nbih0KSx0eXBlPSJsIixjb2w9OSkNCkxlZ2VuZGE8LWMoZXhwcmVzc2lvbihFeHBvbmVuY2lhbCksZXhwcmVzc2lvbihXZWlidWxsKSxleHByZXNzaW9uKExvZy1ub3JtYWwpKQ0KbGVnZW5kKCJ0b3ByaWdodCIsIExlZ2VuZGEsbHdkPWMoMSwxLDEpLGNleD0xLjIsaW5zZXQ9MC4wMCxjb2w9Yyg0LDYsOSksYnR5PSJuIikNCg0KYGBgDQoNCiMjIFRlc3RlIGRlIFJhesOjbyBkZSBWZXJvc3NpbWlsaGFuw6dhDQoNCi0gSGlww7N0ZXNlczoNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KJEgwOiBcdGV4dHtPIG1vZGVsbyBkZSBpbnRlcmVzc2Ugw6kgYWRlcXVhZG99JA0KDQoNCiRIMTogXHRleHR7TyBtb2RlbG8gZGUgaW50ZXJlc3NlIG7Do28gw6kgYWRlcXVhZG99JCANCg0KPC9kaXY+DQoNCg0KLSBFc3RpbW91LXNlIG9zIHBhcsOibWV0cm9zIHBvciBNViBwYXJhIGNhZGEgdW1hIGRhcyB0csOqcyBkaXN0cmlidWnDp8O1ZXMgKEV4cG9uZW5jaWFsLCBXZWlidWxsIGUgTG9nbm9ybWFsKSwNCmUgcGFyYSBhIGRpc3RyaWJ1acOnw6NvIGRlIHJlZmVyw6puY2lhIChHYW1hIGdlbmVyYWxpemFkYSkuDQotIEUgZW50w6NvLCBhcyBlc3RhdGlzdGljYXMgVFJWIGUgc2V1cyAqcC0qdmFsb3JlcyBmb3JhbSBjYWxjdWxhZG9zOg0KDQoNCmBgYHtyfQ0KYWp1c3RlX2V4cDwtc3VydnJlZyhTdXJ2KHRlbXBvcyxjZW5zKX4xLGRpc3Q9J2V4cG9uZW50aWFsJykNCmFqdXN0ZV93ZWk8LXN1cnZyZWcoU3Vydih0ZW1wb3MsY2Vucyl+MSxkaXN0PSd3ZWlidWxsJykNCmFqdXN0ZV9sb2duPC1zdXJ2cmVnKFN1cnYodGVtcG9zLGNlbnMpfjEsZGlzdD0nbG9nbm9ybScpDQphanVzdGVfZ2FtZzwtZmxleHN1cnZyZWcoU3Vydih0ZW1wb3MsY2Vucyl+MSxkaXN0PSJnZW5nYW1tYSIpDQoNClRSVl9leHA9MiooYWp1c3RlX2dhbWckbG9nbGlrLWFqdXN0ZV9leHAkbG9nbGlrWzJdKQ0KVFJWX3dlaT0yKihhanVzdGVfZ2FtZyRsb2dsaWstYWp1c3RlX3dlaSRsb2dsaWtbMl0pDQpUUlZfbG9nbj0yKihhanVzdGVfZ2FtZyRsb2dsaWstYWp1c3RlX2xvZ24kbG9nbGlrWzJdKQ0KDQpUUlYgPC0gZGF0YS5mcmFtZShwdmFsb3I9IGMoMS1wY2hpc3EoVFJWX2V4cCxkZj0yKSwxLXBjaGlzcShUUlZfd2VpLGRmPTEpLDEtcGNoaXNxKFRSVl9sb2duLGRmPTEpKSkNCnJvd25hbWVzKFRSVikgPC0gYygiRXhwb25lbmNpYWwiLCJXZWlidWxsIiwiTG9nLW5vcm1hbCIpDQprbml0cjo6a2FibGUoVFJWKQ0KYGBgDQoNCi0gQW5hbGlzYW5kbyBvcyAqcC0qdmFsb3JlcyBjb25jbHXDrW1vcyBxdWUsIGFvDQpuw612ZWwgZGUgJDVcJSQsIGFzIGRpc3RyaWJ1acOnw7VlcyB3ZWlidWxsIGUgbG9nLW5vcm1hbCBzw6NvIGFkZXF1YWRhcy4NCg==