load library

gc()
##           used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
## Ncells 2905173 155.2    5599308 299.1         NA  4006350 214.0
## Vcells 4875103  37.2   10146329  77.5      16384  6992917  53.4
library(ipumsr)
## 
## Attaching package: 'ipumsr'
## The following objects are masked from 'package:sjlabelled':
## 
##     as_factor, zap_labels
gc()
##           used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
## Ncells 2909141 155.4    5599308 299.1         NA  4006350 214.0
## Vcells 4879379  37.3   10146329  77.5      16384  6992917  53.4
setwd("~/Downloads")

Read the IPUMS NHIS data

gc()
##           used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
## Ncells 2909137 155.4    5599308 299.1         NA  4006350 214.0
## Vcells 4879536  37.3   10146329  77.5      16384  6992917  53.4
ddi <- read_ipums_ddi("nhis_00008.xml")
data <- read_ipums_micro(ddi)
## Use of data from IPUMS NHIS is subject to conditions including that users
## should cite the data appropriately. Use command `ipums_conditions()` for more
## details.
data<- haven::zap_labels(data)

Filter data to only mortality eligible and young adult age 18-35

data <- data %>%
  filter(MORTELIG == 1)


data <- data %>%
filter(AGE ==18) 

data <- data%>%
filter(complete.cases(.))
data <- data %>%
  mutate(death_age = ifelse( MORTSTAT ==1, 
                             MORTDODY - (YEAR - AGE), 
                             2018 - (YEAR - AGE)), 
         d.event = ifelse(MORTSTAT == 1, 1, 0))


library(survival)

age_fit <- survfit(Surv(death_age, d.event) ~ 1, 
                   data = data)

library(ggsurvfit)

age_fit %>%
  ggsurvfit() +
  add_confidence_interval(type = "ribbon") +
  add_quantile() 

library(muhaz)
gc()
##            used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
## Ncells  3155916 168.6    8957226 478.4         NA  7074552 377.9
## Vcells 10936104  83.5   72084264 550.0      16384 90105330 687.5
#since these functions don't work with durations of 0, we add a very small amount to the intervals
fit.haz.km<-kphaz.fit(data$death_age,
                      data$d.event , 
                      method = "product-limit")

#this is a version of the hazard that is smoothed using a kernel-density method
fit.haz.sm<-muhaz(data$death_age, data$d.event )

Covairate -Sex, BMI and SRH

library(eha)
# Recoding the variables
gc()
##            used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
## Ncells  3163857 169.0    8957226 478.4         NA  7074552 377.9
## Vcells 10989400  83.9   57667412 440.0      16384 90105330 687.5
# BMI
 
data$bmicat2<-car::Recode(data$BMICAT, recodes="1:2 ='Underweight/Normal weight ' ; 3:4='Overweight/Obesity' ; else=NA", as.factor=T)

data$bmicat2<-relevel(data$bmicat2, ref='Overweight/Obesity') 

#Poor or fair self rated health
data$badhealth<-car::Recode(data$HEALTH, recodes="4:5='Poor/Fair Health'; 1:3='Good Health'; else=NA", as.factor=T)


#sex
data$sex2<-as.factor(ifelse(data$SEX==1, "Male", "Female"))


data <- data%>%
filter(complete.cases(.))

Test for an interaction between at least two of the predictors(Numberical )

#exponential distribution for hazard, here we hard code it to be
#a weibull dist with shape ==1 

fit.11<-phreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             dist="weibull",
             shape = 1)

summary(fit.11)
## Single term deletions
## 
## Model:
## Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * 
##     HEALTH
##                  Df  AIC   LRT Pr(>Chi)    
## <none>               972                   
## sex2              1 1000 29.74    5e-08 ***
## bmicat2:BMI       1  970  0.00     0.97    
## badhealth:HEALTH  1  970  0.01     0.93    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Covariate             Mean       Coef     Rel.Risk   S.E.    Wald p
## sex2 
##           Female      0.504     0         1 (reference)
##             Male      0.496     1.702     5.486     0.365   0.0000 
## bmicat2 
## Overweight/Obesi      0.361     0         1 (reference)
## Underweight/Norm      0.639     0.131     1.140     2.244   0.9535 
## BMI                  24.491     0.017     1.017     0.042   0.6885 
## badhealth 
##      Good Health      0.962     0         1 (reference)
## Poor/Fair Health      0.038     1.113     3.044     4.509   0.8050 
## HEALTH                1.801    -0.040     0.961     0.191   0.8343 
## bmicat2:BMI      
##    Underweight/Normal wei     0.004     1.004     0.094    0.9693 
## badhealth:HEALTH 
##    Poor/Fair Health:          0.096     1.101     1.098    0.9304 
## 
## Events                    56 
## Total time at risk        147539 
## Max. log. likelihood      -478.17 
## LR test statistic         37.82 
## Degrees of freedom        7 
## Overall p-value           3.27279e-06
#exponential distribution for hazard, here we hard code it to be
#a weibull dist with shape ==1 

fit.1<-phreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             dist="weibull",
             shape = 1)

summary(fit.1)
## Single term deletions
## 
## Model:
## Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * 
##     HEALTH
##                  Df  AIC   LRT Pr(>Chi)    
## <none>               972                   
## sex2              1 1000 29.74    5e-08 ***
## bmicat2:BMI       1  970  0.00     0.97    
## badhealth:HEALTH  1  970  0.01     0.93    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Covariate             Mean       Coef     Rel.Risk   S.E.    Wald p
## sex2 
##           Female      0.504     0         1 (reference)
##             Male      0.496     1.702     5.486     0.365   0.0000 
## bmicat2 
## Overweight/Obesi      0.361     0         1 (reference)
## Underweight/Norm      0.639     0.131     1.140     2.244   0.9535 
## BMI                  24.491     0.017     1.017     0.042   0.6885 
## badhealth 
##      Good Health      0.962     0         1 (reference)
## Poor/Fair Health      0.038     1.113     3.044     4.509   0.8050 
## HEALTH                1.801    -0.040     0.961     0.191   0.8343 
## bmicat2:BMI      
##    Underweight/Normal wei     0.004     1.004     0.094    0.9693 
## badhealth:HEALTH 
##    Poor/Fair Health:          0.096     1.101     1.098    0.9304 
## 
## Events                    56 
## Total time at risk        147539 
## Max. log. likelihood      -478.17 
## LR test statistic         37.82 
## Degrees of freedom        7 
## Overall p-value           3.27279e-06

Interpretation: The model shows that those with poor/fair health are at higher risk of experiencing mortality compared to those with good health. Also, Males are 5 times more likely to die compared to female

Weibull hazard function

plot(fit.1)
lines(fit.haz.sm, col=2)

#AFT Model specification

fit.1.aft<-survreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
                   data=data,
                   dist = "exponential" )

summary(fit.1.aft)
## 
## Call:
## survreg(formula = Surv(death_age, d.event) ~ sex2 + bmicat2 * 
##     BMI + badhealth * HEALTH, data = data, dist = "exponential")
##                                          Value Std. Error     z       p
## (Intercept)                            9.62740    1.34349  7.17 7.7e-13
## sex2Male                              -1.70222    0.36534 -4.66 3.2e-06
## bmicat2Underweight/Normal weight      -0.13096    2.24407 -0.06    0.95
## BMI                                   -0.01677    0.04184 -0.40    0.69
## badhealthPoor/Fair Health             -1.11318    4.50913 -0.25    0.81
## HEALTH                                 0.03994    0.19097  0.21    0.83
## bmicat2Underweight/Normal weight :BMI -0.00362    0.09422 -0.04    0.97
## badhealthPoor/Fair Health:HEALTH      -0.09589    1.09792 -0.09    0.93
## 
## Scale fixed at 1 
## 
## Exponential distribution
## Loglik(model)= -478.2   Loglik(intercept only)= -497.1
##  Chisq= 37.82 on 7 degrees of freedom, p= 3.3e-06 
## Number of Newton-Raphson Iterations: 9 
## n= 5545

#Weibull model

#weibull distribution for hazard

                   
fit.2<-phreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             dist="weibull")
summary(fit.2)
## Single term deletions
## 
## Model:
## Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * 
##     HEALTH
##                  Df AIC   LRT Pr(>Chi)    
## <none>              864                   
## sex2              1 893 30.99  2.6e-08 ***
## bmicat2:BMI       1 862  0.02     0.89    
## badhealth:HEALTH  1 862  0.00     0.97    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Covariate             Mean       Coef     Rel.Risk   S.E.    Wald p
## sex2 
##           Female      0.504     0         1 (reference)
##             Male      0.496     1.737     5.679     0.366   0.0000 
## bmicat2 
## Overweight/Obesi      0.361     0         1 (reference)
## Underweight/Norm      0.639     0.493     1.638     2.215   0.8238 
## BMI                  24.491     0.020     1.020     0.039   0.6172 
## badhealth 
##      Good Health      0.962     0         1 (reference)
## Poor/Fair Health      0.038     1.341     3.822     4.520   0.7668 
## HEALTH                1.801    -0.051     0.951     0.191   0.7908 
## bmicat2:BMI      
##    Underweight/Normal wei    -0.014     0.987     0.094    0.8853 
## badhealth:HEALTH 
##    Poor/Fair Health:          0.044     1.045     1.100    0.9681 
## 
## Events                    56 
## Total time at risk        147539 
## Max. log. likelihood      -422.83 
## LR test statistic         39.56 
## Degrees of freedom        7 
## Overall p-value           1.529e-06

Interpretation: The model shows that those with poor/fair health are at higher risk of experiencing mortality compared to those with good health. Also, Males are 5 times more likely to die compared to female

plot(fit.2, fn = "haz")
lines(fit.haz.sm, col=2)

#re-scaled beta's
(betaHat <- -coef(fit.1.aft)[-1] / fit.1.aft$scale)
##                              sex2Male     bmicat2Underweight/Normal weight  
##                           1.702221896                           0.130959502 
##                                   BMI             badhealthPoor/Fair Health 
##                           0.016774398                           1.113178737 
##                                HEALTH bmicat2Underweight/Normal weight :BMI 
##                          -0.039943628                           0.003624976 
##      badhealthPoor/Fair Health:HEALTH 
##                           0.095889780
#beta's from the PH model
coef(fit.1)
##                              sex2Male     bmicat2Underweight/Normal weight  
##                           1.702221896                           0.130959502 
##                                   BMI             badhealthPoor/Fair Health 
##                           0.016774398                           1.113178737 
##                                HEALTH bmicat2Underweight/Normal weight :BMI 
##                          -0.039943628                           0.003624976 
##      badhealthPoor/Fair Health:HEALTH                            log(scale) 
##                           0.095889780                           9.627399943

Log-normal model

#log-normal distribution for hazard


fit.3<-phreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             dist="lognormal")
## fail in [dsytrf]; info = 10
## Warning in phreg(Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * :
## Failed with error code 10
summary(fit.3)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       1       1       1       1       1       1
#plot the hazard from the log normal vs the empirical hazard
#plot(fit.3)
#lines(fit.haz.sm, col=2)

#Log logistic model

#log-normal distribution for hazard

            
fit.4<-phreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             dist="loglogistic")
summary(fit.4)
## Warning in sqrt(varcoef): NaNs produced
## Warning in sqrt(varhaz): NaNs produced
## Single term deletions
## 
## Model:
## Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * 
##     HEALTH
##                  Df AIC   LRT Pr(>Chi)    
## <none>              866                   
## sex2              1 895 30.99  2.6e-08 ***
## bmicat2:BMI       1 864  0.02     0.89    
## badhealth:HEALTH  1 864  0.00     0.97    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Covariate             Mean       Coef     Rel.Risk   S.E.    Wald p
## sex2 
##           Female      0.504     0         1 (reference)
##             Male      0.496    18.036 68035368.612       NaN      NaN 
## bmicat2 
## Overweight/Obesi      0.361     0         1 (reference)
## Underweight/Norm      0.639     1.737     5.679     0.366   0.0000 
## BMI                  24.491     0.493     1.638     2.215   0.8238 
## badhealth 
##      Good Health      0.962     0         1 (reference)
## Poor/Fair Health      0.038     0.020     1.020     0.039   0.6172 
## HEALTH                1.801     1.341     3.822     4.520   0.7668 
## bmicat2:BMI      
##    HEALTH                    -0.051     0.951     0.191    0.7908 
## badhealth:HEALTH 
##    bmicat2Underweight/Nor    -0.014     0.987     0.094    0.8853 
## 
## Events                    56 
## Total time at risk        147539 
## Max. log. likelihood      -422.83 
## LR test statistic         39.56 
## Degrees of freedom        7 
## Overall p-value           1.52991e-06
#plot the hazard from the log normal vs the empirical hazard
plot(fit.4, fn="haz", xlim = c(0, 60) , ylim = c(0, 60) ) 
lines(fit.haz.sm, col=2)

AIC(fit.1)
## [1] 972.3436
AIC(fit.2)
## [1] 863.6526
#AIC(fit.3)
AIC(fit.4)
## [1] 861.6526

log-logistic model best fits the data, based on the minimum AIC criteria

#Piecewise constant exponential model

# here I must supply the times for the "pieces" where I expect the  hazard to be constant

             
fit.5<-pchreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
             data=data,
             cuts=seq(1, 30, 5))
summary(fit.5)
## Single term deletions
## 
## Model:
## Surv(death_age, d.event) ~ sex2 + bmicat2 * BMI + badhealth * 
##     HEALTH
##                  Df AIC   LRT Pr(>Chi)    
## <none>              578                   
## sex2              1 597 21.79    3e-06 ***
## bmicat2:BMI       1 577  1.35     0.25    
## badhealth:HEALTH  1 576  0.15     0.70    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Covariate             Mean       Coef     Rel.Risk   S.E.    Wald p
## sex2 
##           Female      0.504     0         1 (reference)
##             Male      0.496     1.870     6.491     0.484   0.0001 
## bmicat2 
## Overweight/Obesi      0.361     0         1 (reference)
## Underweight/Norm      0.639    -2.755     0.064     3.042   0.3650 
## BMI                  24.491    -0.010     0.990     0.063   0.8778 
## badhealth 
##      Good Health      0.962     0         1 (reference)
## Poor/Fair Health      0.038    -0.996     0.369     4.968   0.8411 
## HEALTH                1.801     0.153     1.165     0.227   0.5008 
## bmicat2:BMI      
##    Underweight/Normal wei     0.140     1.151     0.124    0.2581 
## badhealth:HEALTH 
##    Poor/Fair Health:          0.480     1.616     1.180    0.6841 
## 
## Events                    56 
## Total time at risk        147539 
## Max. log. likelihood      -276.81 
## LR test statistic         29.00 
## Degrees of freedom        7 
## Overall p-value           0.000144793
## 
## Restricted mean survival:  24.9927 in (1, 26]
plot(fit.5, fn="haz")
lines(fit.haz.sm, col=2)

AIC(fit.4)
## [1] 861.6526
-2*fit.5$loglik[2]+length(fit.5$coefficients) #have to construct this ourselves
## [1] 560.6175

Carry out model fit diagnostics for the model, AIC

#Graphical checks on the model fit

emp<-coxreg(Surv(death_age, d.event)~sex2+bmicat2*BMI+badhealth*HEALTH,
            data=data)

check.dist(sp=emp,pp=fit.1, main = "Empirical vs. Exponential")

check.dist(sp=emp,pp=fit.2, main = "Empirical vs. Weibull")

#check.dist(sp=emp,pp=fit.3, main = "Empirical vs. Log-Normal")
check.dist(sp=emp,pp=fit.4, main = "Empirical vs. Log-Logistic")

check.dist(sp=emp,pp=fit.5, main = "Empirical vs. PCH")

Did you choose an AFT or PH model and why?

I chose the PCH model because it fits well with the empirical data compared to other models. Also the Weibull is not doing bad

LS0tCnRpdGxlOiAiRXZlbnQgSGlzdG9yeSBBbmFseXNpcyBBc3MzIgphdXRob3I6ICJKb3NlcGggSmFpeWVvbGEiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIyBsb2FkIGxpYnJhcnkKYGBge3IgaW5jbHVkZT1GQUxTRX0KZ2MoKQpwYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAia25pdHIiLCAidGliYmxlIiwgImthYmxlRXh0cmEiLCAib2ZmaWNlciIsICJjb21wYXJlR3JvdXBzIiwgImNhciIsICJoYXZlbiIsICJmb3JlaWduIiwgInRpZHlyIiwgIm1hZ3JpdHRyIiwgImxhYmVsbGVkIiwgImdncGxvdDIiLCAiZm9yZWlnbiIsICJsbWU0IiwgImxtZXJUZXN0IiwgIk11TUluIiwgIk1BU1MiLCAiYXJtIiwgImxhdHRpY2UiLCAicHNjbCIsICJzdXJ2aXZhbCIsICJzdXJ2ZXkiLCAic3J2eXIiLCAic3Vydm1pbmVyIiwgImVmZmVjdHMiLCAiZ3QiLCAiZ3RzdW1tYXJ5IiwgImdsdWUiLCAiZmxleHRhYmxlIiwgImh1eHRhYmxlIiwgIm1vZGVsc3VtbWFyeSIsICJicm9vbSIsICJicm9vbS5taXhlZCIsICJsYXR0aWNlIiwgImNtcHJzayIsICJzdGFyZ2F6ZXIiLCAic2pzdGF0cyIsICJzalBsb3QiLCAic2ptaXNjIiwgInNqbGFiZWxsZWQiKQppbnZpc2libGUobGFwcGx5KHBhY2thZ2VzLCBmdW5jdGlvbih4KSByZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVCwgcXVpZXRseSA9IFQpKSkKYGBgCgpgYGB7cn0KZ2MoKQpsaWJyYXJ5KGlwdW1zcikKYGBgCgpgYGB7cn0KZ2MoKQpzZXR3ZCgifi9Eb3dubG9hZHMiKQpgYGAKCiMjIyBSZWFkIHRoZSBJUFVNUyBOSElTIGRhdGEKYGBge3J9CmdjKCkKZGRpIDwtIHJlYWRfaXB1bXNfZGRpKCJuaGlzXzAwMDA4LnhtbCIpCmRhdGEgPC0gcmVhZF9pcHVtc19taWNybyhkZGkpCmRhdGE8LSBoYXZlbjo6emFwX2xhYmVscyhkYXRhKQpgYGAKCgojIyMgRmlsdGVyIGRhdGEgdG8gb25seSBtb3J0YWxpdHkgZWxpZ2libGUgYW5kIHlvdW5nIGFkdWx0IGFnZSAxOC0zNQpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogIGZpbHRlcihNT1JURUxJRyA9PSAxKQoKCmRhdGEgPC0gZGF0YSAlPiUKZmlsdGVyKEFHRSA9PTE4KSAKCmRhdGEgPC0gZGF0YSU+JQpmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpCgpgYGAKCgoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUoZGVhdGhfYWdlID0gaWZlbHNlKCBNT1JUU1RBVCA9PTEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PUlRET0RZIC0gKFlFQVIgLSBBR0UpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE4IC0gKFlFQVIgLSBBR0UpKSwgCiAgICAgICAgIGQuZXZlbnQgPSBpZmVsc2UoTU9SVFNUQVQgPT0gMSwgMSwgMCkpCgoKbGlicmFyeShzdXJ2aXZhbCkKCmFnZV9maXQgPC0gc3VydmZpdChTdXJ2KGRlYXRoX2FnZSwgZC5ldmVudCkgfiAxLCAKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQoKbGlicmFyeShnZ3N1cnZmaXQpCgphZ2VfZml0ICU+JQogIGdnc3VydmZpdCgpICsKICBhZGRfY29uZmlkZW5jZV9pbnRlcnZhbCh0eXBlID0gInJpYmJvbiIpICsKICBhZGRfcXVhbnRpbGUoKSAKYGBgCgoKCgpgYGB7cn0KbGlicmFyeShtdWhheikKZ2MoKQpgYGAKCmBgYHtyfQojc2luY2UgdGhlc2UgZnVuY3Rpb25zIGRvbid0IHdvcmsgd2l0aCBkdXJhdGlvbnMgb2YgMCwgd2UgYWRkIGEgdmVyeSBzbWFsbCBhbW91bnQgdG8gdGhlIGludGVydmFscwpmaXQuaGF6LmttPC1rcGhhei5maXQoZGF0YSRkZWF0aF9hZ2UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhJGQuZXZlbnQgLCAKICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJwcm9kdWN0LWxpbWl0IikKCiN0aGlzIGlzIGEgdmVyc2lvbiBvZiB0aGUgaGF6YXJkIHRoYXQgaXMgc21vb3RoZWQgdXNpbmcgYSBrZXJuZWwtZGVuc2l0eSBtZXRob2QKZml0Lmhhei5zbTwtbXVoYXooZGF0YSRkZWF0aF9hZ2UsIGRhdGEkZC5ldmVudCApCgpgYGAKCgoKCiMjIyBDb3ZhaXJhdGUgLVNleCwgQk1JIGFuZCBTUkgKCmBgYHtyfQpsaWJyYXJ5KGVoYSkKYGBgCgoKYGBge3J9CiMgUmVjb2RpbmcgdGhlIHZhcmlhYmxlcwpnYygpCiMgQk1JCiAKZGF0YSRibWljYXQyPC1jYXI6OlJlY29kZShkYXRhJEJNSUNBVCwgcmVjb2Rlcz0iMToyID0nVW5kZXJ3ZWlnaHQvTm9ybWFsIHdlaWdodCAnIDsgMzo0PSdPdmVyd2VpZ2h0L09iZXNpdHknIDsgZWxzZT1OQSIsIGFzLmZhY3Rvcj1UKQoKZGF0YSRibWljYXQyPC1yZWxldmVsKGRhdGEkYm1pY2F0MiwgcmVmPSdPdmVyd2VpZ2h0L09iZXNpdHknKSAKCiNQb29yIG9yIGZhaXIgc2VsZiByYXRlZCBoZWFsdGgKZGF0YSRiYWRoZWFsdGg8LWNhcjo6UmVjb2RlKGRhdGEkSEVBTFRILCByZWNvZGVzPSI0OjU9J1Bvb3IvRmFpciBIZWFsdGgnOyAxOjM9J0dvb2QgSGVhbHRoJzsgZWxzZT1OQSIsIGFzLmZhY3Rvcj1UKQoKCiNzZXgKZGF0YSRzZXgyPC1hcy5mYWN0b3IoaWZlbHNlKGRhdGEkU0VYPT0xLCAiTWFsZSIsICJGZW1hbGUiKSkKCgpkYXRhIDwtIGRhdGElPiUKZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKQoKYGBgCgoKCiMJVGVzdCBmb3IgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhdCBsZWFzdCB0d28gb2YgdGhlIHByZWRpY3RvcnMoTnVtYmVyaWNhbCApCgpgYGB7cn0KI2V4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBmb3IgaGF6YXJkLCBoZXJlIHdlIGhhcmQgY29kZSBpdCB0byBiZQojYSB3ZWlidWxsIGRpc3Qgd2l0aCBzaGFwZSA9PTEgCgpmaXQuMTE8LXBocmVnKFN1cnYoZGVhdGhfYWdlLCBkLmV2ZW50KX5zZXgyK2JtaWNhdDIqQk1JK2JhZGhlYWx0aCpIRUFMVEgsCiAgICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgICBkaXN0PSJ3ZWlidWxsIiwKICAgICAgICAgICAgIHNoYXBlID0gMSkKCnN1bW1hcnkoZml0LjExKQpgYGAKCgpgYGB7cn0KI2V4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBmb3IgaGF6YXJkLCBoZXJlIHdlIGhhcmQgY29kZSBpdCB0byBiZQojYSB3ZWlidWxsIGRpc3Qgd2l0aCBzaGFwZSA9PTEgCgpmaXQuMTwtcGhyZWcoU3VydihkZWF0aF9hZ2UsIGQuZXZlbnQpfnNleDIrYm1pY2F0MipCTUkrYmFkaGVhbHRoKkhFQUxUSCwKICAgICAgICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICAgICAgIGRpc3Q9IndlaWJ1bGwiLAogICAgICAgICAgICAgc2hhcGUgPSAxKQoKc3VtbWFyeShmaXQuMSkKYGBgCiMjIyBJbnRlcnByZXRhdGlvbjogVGhlIG1vZGVsIHNob3dzIHRoYXQgdGhvc2Ugd2l0aCBwb29yL2ZhaXIgaGVhbHRoIGFyZSBhdCBoaWdoZXIgcmlzayBvZiBleHBlcmllbmNpbmcgbW9ydGFsaXR5IGNvbXBhcmVkIHRvIHRob3NlIHdpdGggZ29vZCBoZWFsdGguIEFsc28sIE1hbGVzIGFyZSA1IHRpbWVzIG1vcmUgbGlrZWx5IHRvIGRpZSBjb21wYXJlZCB0byBmZW1hbGUKCiMgV2VpYnVsbCBoYXphcmQgZnVuY3Rpb24KYGBge3J9CnBsb3QoZml0LjEpCmxpbmVzKGZpdC5oYXouc20sIGNvbD0yKQpgYGAKCgojQUZUIE1vZGVsIHNwZWNpZmljYXRpb24KCmBgYHtyfQpmaXQuMS5hZnQ8LXN1cnZyZWcoU3VydihkZWF0aF9hZ2UsIGQuZXZlbnQpfnNleDIrYm1pY2F0MipCTUkrYmFkaGVhbHRoKkhFQUxUSCwKICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICAgICAgICAgICAgIGRpc3QgPSAiZXhwb25lbnRpYWwiICkKCnN1bW1hcnkoZml0LjEuYWZ0KQpgYGAKCgojV2VpYnVsbCBtb2RlbAoKYGBge3J9CiN3ZWlidWxsIGRpc3RyaWJ1dGlvbiBmb3IgaGF6YXJkCgogICAgICAgICAgICAgICAgICAgCmZpdC4yPC1waHJlZyhTdXJ2KGRlYXRoX2FnZSwgZC5ldmVudCl+c2V4MitibWljYXQyKkJNSStiYWRoZWFsdGgqSEVBTFRILAogICAgICAgICAgICAgZGF0YT1kYXRhLAogICAgICAgICAgICAgZGlzdD0id2VpYnVsbCIpCnN1bW1hcnkoZml0LjIpCmBgYAoKIyMjIEludGVycHJldGF0aW9uOiBUaGUgbW9kZWwgc2hvd3MgdGhhdCB0aG9zZSB3aXRoIHBvb3IvZmFpciBoZWFsdGggYXJlIGF0IGhpZ2hlciByaXNrIG9mIGV4cGVyaWVuY2luZyBtb3J0YWxpdHkgY29tcGFyZWQgdG8gdGhvc2Ugd2l0aCBnb29kIGhlYWx0aC4gQWxzbywgTWFsZXMgYXJlIDUgdGltZXMgbW9yZSBsaWtlbHkgdG8gZGllIGNvbXBhcmVkIHRvIGZlbWFsZQoKCgpgYGB7cn0KcGxvdChmaXQuMiwgZm4gPSAiaGF6IikKbGluZXMoZml0Lmhhei5zbSwgY29sPTIpCmBgYAoKYGBge3J9CiNyZS1zY2FsZWQgYmV0YSdzCihiZXRhSGF0IDwtIC1jb2VmKGZpdC4xLmFmdClbLTFdIC8gZml0LjEuYWZ0JHNjYWxlKQpgYGAKCmBgYHtyfQojYmV0YSdzIGZyb20gdGhlIFBIIG1vZGVsCmNvZWYoZml0LjEpCmBgYAoKCiMgTG9nLW5vcm1hbCBtb2RlbApgYGB7cn0KI2xvZy1ub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBoYXphcmQKCgpmaXQuMzwtcGhyZWcoU3VydihkZWF0aF9hZ2UsIGQuZXZlbnQpfnNleDIrYm1pY2F0MipCTUkrYmFkaGVhbHRoKkhFQUxUSCwKICAgICAgICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICAgICAgIGRpc3Q9ImxvZ25vcm1hbCIpCgpzdW1tYXJ5KGZpdC4zKQpgYGAKCgpgYGB7cn0KI3Bsb3QgdGhlIGhhemFyZCBmcm9tIHRoZSBsb2cgbm9ybWFsIHZzIHRoZSBlbXBpcmljYWwgaGF6YXJkCiNwbG90KGZpdC4zKQojbGluZXMoZml0Lmhhei5zbSwgY29sPTIpCmBgYAoKI0xvZyBsb2dpc3RpYyBtb2RlbAoKYGBge3J9CiNsb2ctbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgaGF6YXJkCgogICAgICAgICAgICAKZml0LjQ8LXBocmVnKFN1cnYoZGVhdGhfYWdlLCBkLmV2ZW50KX5zZXgyK2JtaWNhdDIqQk1JK2JhZGhlYWx0aCpIRUFMVEgsCiAgICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgICBkaXN0PSJsb2dsb2dpc3RpYyIpCnN1bW1hcnkoZml0LjQpCmBgYAoKYGBge3J9CiNwbG90IHRoZSBoYXphcmQgZnJvbSB0aGUgbG9nIG5vcm1hbCB2cyB0aGUgZW1waXJpY2FsIGhhemFyZApwbG90KGZpdC40LCBmbj0iaGF6IiwgeGxpbSA9IGMoMCwgNjApICwgeWxpbSA9IGMoMCwgNjApICkgCmxpbmVzKGZpdC5oYXouc20sIGNvbD0yKQpgYGAKCgoKYGBge3J9CkFJQyhmaXQuMSkKYGBgCgpgYGB7cn0KQUlDKGZpdC4yKQpgYGAKCmBgYHtyfQojQUlDKGZpdC4zKQpgYGAKCmBgYHtyfQpBSUMoZml0LjQpCmBgYAoKbG9nLWxvZ2lzdGljIG1vZGVsIGJlc3QgZml0cyB0aGUgZGF0YSwgYmFzZWQgb24gdGhlIG1pbmltdW0gQUlDIGNyaXRlcmlhCgojUGllY2V3aXNlIGNvbnN0YW50IGV4cG9uZW50aWFsIG1vZGVsCmBgYHtyfQojIGhlcmUgSSBtdXN0IHN1cHBseSB0aGUgdGltZXMgZm9yIHRoZSAicGllY2VzIiB3aGVyZSBJIGV4cGVjdCB0aGUgIGhhemFyZCB0byBiZSBjb25zdGFudAoKICAgICAgICAgICAgIApmaXQuNTwtcGNocmVnKFN1cnYoZGVhdGhfYWdlLCBkLmV2ZW50KX5zZXgyK2JtaWNhdDIqQk1JK2JhZGhlYWx0aCpIRUFMVEgsCiAgICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgICBjdXRzPXNlcSgxLCAzMCwgNSkpCnN1bW1hcnkoZml0LjUpCgpgYGAKCmBgYHtyfQpwbG90KGZpdC41LCBmbj0iaGF6IikKbGluZXMoZml0Lmhhei5zbSwgY29sPTIpCmBgYAoKYGBge3J9CkFJQyhmaXQuNCkKYGBgCgpgYGB7cn0KLTIqZml0LjUkbG9nbGlrWzJdK2xlbmd0aChmaXQuNSRjb2VmZmljaWVudHMpICNoYXZlIHRvIGNvbnN0cnVjdCB0aGlzIG91cnNlbHZlcwpgYGAKCgojIENhcnJ5IG91dCBtb2RlbCBmaXQgZGlhZ25vc3RpY3MgZm9yIHRoZSBtb2RlbCwgQUlDCiNHcmFwaGljYWwgY2hlY2tzIG9uIHRoZSBtb2RlbCBmaXQKYGBge3J9CgogICAgICAgICAgICAgIAplbXA8LWNveHJlZyhTdXJ2KGRlYXRoX2FnZSwgZC5ldmVudCl+c2V4MitibWljYXQyKkJNSStiYWRoZWFsdGgqSEVBTFRILAogICAgICAgICAgICBkYXRhPWRhdGEpCgpjaGVjay5kaXN0KHNwPWVtcCxwcD1maXQuMSwgbWFpbiA9ICJFbXBpcmljYWwgdnMuIEV4cG9uZW50aWFsIikKYGBgCgoKYGBge3J9CmNoZWNrLmRpc3Qoc3A9ZW1wLHBwPWZpdC4yLCBtYWluID0gIkVtcGlyaWNhbCB2cy4gV2VpYnVsbCIpCmBgYAoKYGBge3J9CiNjaGVjay5kaXN0KHNwPWVtcCxwcD1maXQuMywgbWFpbiA9ICJFbXBpcmljYWwgdnMuIExvZy1Ob3JtYWwiKQpgYGAKCmBgYHtyfQpjaGVjay5kaXN0KHNwPWVtcCxwcD1maXQuNCwgbWFpbiA9ICJFbXBpcmljYWwgdnMuIExvZy1Mb2dpc3RpYyIpCmBgYAoKYGBge3J9CmNoZWNrLmRpc3Qoc3A9ZW1wLHBwPWZpdC41LCBtYWluID0gIkVtcGlyaWNhbCB2cy4gUENIIikKYGBgCgoKIyMJRGlkIHlvdSBjaG9vc2UgYW4gQUZUIG9yIFBIIG1vZGVsIGFuZCB3aHk/CgpJIGNob3NlIHRoZSBQQ0ggbW9kZWwgYmVjYXVzZSBpdCBmaXRzIHdlbGwgd2l0aCB0aGUgZW1waXJpY2FsIGRhdGEgY29tcGFyZWQgdG8gb3RoZXIgbW9kZWxzLiBBbHNvIHRoZSBXZWlidWxsIGlzIG5vdCBkb2luZyBiYWQKCgoKCgoKCgoKCgoK