In this exercise I use most of the variables considered by Massoglia et al. (2014), get estimates of the effect of incarceration on mortality, and examine an initial imputation model.
The variables I considered were:
- Gender (I)
- Age (I)
- Race (I)
- Income (V)
- Education (V)
- Parents’ education (I)
- Delinquency (1980) (I)
- Working (V)
- Health issues (related to work) (V)
- Incarceration (V)
- Married (V)
I considered records since 1980 and respondents 18 years old or more, that is, a sample of 12625. During that period 661 people died. The median age of death was 41.
Just to get an idea of the missing data:
countmis(org)
clincome_adj job healthw cdeltot married rprison cpedu cedui
0.214 0.066 0.059 0.058 0.058 0.041 0.037 0.000
The highest proportion of missing cases is income. I defined imputation multivel models, where I use both time invariant and variant variables, age and year. Just to provide an example, the income imputation model is:
\[income = \alpha + year + age + edu + parents\_edu + prison + married \\
+ health + delinquency + job + dropout + death + \delta_r + \epsilon_i \]
Death and dropout are time-invariant variables. One of the most important predictor of income missigness is incarceration! For this exercise, I generated 10 imputations. Final versions of this exercise should use more iterations and imputations (e.g., 30 iterations, 60 imputations). Anyways mixing doesn’t look bad.
I explored differences by gender:
# explore differences by gender
x <- org[, .(male = max(male, na.rm = TRUE),
prison = max(rprison, na.rm = TRUE),
death = max(died, na.rm = TRUE), age = max(agei, na.rm = TRUE)), id]
# these numbers are different because of age >= 18 and year >= 1980
table(x[, .(prison, death, male)])
, , male = 0
death
prison 0 1
0 5936 239
1 61 17
, , male = 1
death
prison 0 1
0 5386 341
1 581 64
# odds ratio male
a <- table(x[male == 1, .(prison, death)])
(a[2,2]*a[1,1]) / (a[2,1]*a[1,2])
[1] 1.739866
# odd ratios female
b <- table(x[male == 0, .(prison, death)])
(b[2,2]*b[1,1]) / (b[2,1]*b[1,2]) # huge
[1] 6.921737
# time between first incarceration event and death by gender!
x <- org[, .(id ,rprison, died, male, agei, stop)]
a <- x[rprison == 1, .(prison = min(stop), age = min(agei)), .(id, male)]
b <- x[died == 1, .(death = min(stop)), .(id, male)]
#anyDuplicated(b)
#anyDuplicated(a)
setkey(a, id, male)
setkey(b, id, male)
c <- b[a]
# only 81 cases of people who have been incarcerated and died in the sample
length(c[!is.na(death), death - prison])
[1] 81
mean(c[!is.na(death) & male == 1, age]) # men are younger
[1] 26.6875
mean(c[!is.na(death) & male == 0, age]) # women are older
[1] 29.23529
# mean and median of year between first incarceration event and death
# men
mean(c[!is.na(death) & male == 1, death - prison])
[1] 14.15625
median(c[!is.na(death) & male == 1, death - prison])
[1] 13.5
hist(c[!is.na(death) & male == 1, death - prison], main = "Men: Distribution time between incarceration and death")

# women
mean(c[!is.na(death) & male == 0, death - prison])
[1] 13.29412
median(c[!is.na(death) & male == 0, death - prison])
[1] 12
hist(c[!is.na(death) & male == 0, death - prison], main = "Women: Distribution time between incarceration and death")

Let’s explore the imputations:



Then, I examine the distribution of the imputed variables by age and year. Here I show only income and prison, all the rest of imputed variables look right. Gray lines represent imputed datasets, the red line the observed data.
Income imputations are far below the observed values, I guess mainly to the effect of prison on income missingness. Probably, it would be a good idea to use a lag version of income to improve the imputation.
Incarceartion looks fine. After the 2004, NLYS recorded non-response due to incarceration, that is why there are no missing records during those years.




Pooled Models
A simple model removing time-varying adjustments (different from the naive model, but similar to MSM):
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.20705581 0.13817298 -0.06376533 0.477876963 1 %
male 0.38692541 0.08416393 0.22196705 0.551883776 0 %
magef19 -0.15800652 0.12487920 -0.40276526 0.086752223 0 %
magef20 0.17021554 0.12056974 -0.06609681 0.406527898 0 %
magef21 0.06794871 0.13167489 -0.19012934 0.326026767 0 %
magef22 0.40046214 0.11793874 0.16930644 0.631617850 0 %
magef23 0.52363598 0.21263395 0.10688108 0.940390883 0 %
raceblack 0.41827848 0.12071222 0.18168590 0.654871061 1 %
racenon-hispanic/non-black 0.20973827 0.12495792 -0.03518295 0.454659488 2 %
cedui -0.07346525 0.01896565 -0.11064084 -0.036289667 3 %
cpedu -0.02032035 0.01438131 -0.04853588 0.007895176 9 %
clincome_adj -0.10112303 0.01398543 -0.12855172 -0.073694337 7 %
cdeltot 0.13429863 0.06417320 0.00845311 0.260144156 6 %
Adding time-varying covariates.
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.05844335 0.13637113 -0.20884505 0.325731758 1 %
male 0.52322639 0.08484666 0.35692992 0.689522855 0 %
magef19 -0.18304748 0.12497753 -0.42799893 0.061903976 0 %
magef20 0.14054481 0.12068848 -0.09600026 0.377089885 0 %
magef21 0.06108670 0.13177843 -0.19719429 0.319367686 0 %
magef22 0.39196654 0.11812839 0.16043914 0.623493938 0 %
magef23 0.52082845 0.21309940 0.10316129 0.938495610 0 %
raceblack 0.25216301 0.12067392 0.01564484 0.488681169 1 %
racenon-hispanic/non-black 0.25761083 0.12464618 0.01330041 0.501921249 2 %
cedui -0.03627544 0.01919190 -0.07389332 0.001342446 2 %
cpedu -0.02003647 0.01432104 -0.04813576 0.008062817 9 %
clincome_adj -0.01975688 0.01642951 -0.05199882 0.012485049 10 %
healthw 0.83907566 0.10570916 0.63188895 1.046262377 0 %
job -0.76537225 0.10104180 -0.96342877 -0.567315725 3 %
married -0.83233637 0.09413722 -1.01684304 -0.647829702 1 %
cdeltot 0.08505121 0.06561958 -0.04366846 0.213770884 8 %
No effect of prison on mortality.
Because of time-varying confounding I used the MSM adjustment. This seems to correct the adjustment of mediators. The effects are higher but less precise and non-statistically significant. Similarly to Massoglia et al, the interaction between prison and gender suggests a huge positive effect for women. The imputations I am using are not completly suitable, the imputation model should include the interaction by gender. The coefficient for women is too big to be credible (hazard ratio of about 5, kind of similar to the odds ratios computed above).
Multiple imputation results:
MIcombine.default(modelsMSM)
results se (lower upper) missInfo
prison 0.281064758 0.19620595 -0.10471927 0.666848785 16 %
magef19 -0.194962483 0.13907104 -0.46766175 0.077736781 6 %
magef20 -0.031991808 0.15602230 -0.33789005 0.273906438 5 %
magef21 0.070066585 0.14210109 -0.20847563 0.348608804 3 %
magef22 0.365676881 0.12695691 0.11683424 0.614519521 2 %
magef23 0.493597994 0.22522961 0.05213245 0.935063539 2 %
male 0.469803620 0.09460129 0.28436504 0.655242200 3 %
raceblack 0.236583066 0.13763483 -0.03329556 0.506461692 6 %
racenon-hispanic/non-black 0.304874084 0.13600363 0.03825046 0.571497703 4 %
cedui -0.004109759 0.02197381 -0.04718881 0.038969294 4 %
cpedu -0.028272743 0.01627431 -0.06020967 0.003664184 10 %
clincome_adj -0.014768386 0.01983132 -0.05377729 0.024240514 17 %
healthw 0.791785692 0.10899082 0.57813693 1.005434451 3 %
job -0.727400945 0.10834780 -0.93979810 -0.515003792 4 %
married -0.856636235 0.10068798 -1.05398434 -0.659288128 1 %
cdeltot 0.082107232 0.09021496 -0.09655979 0.260774252 29 %
Multiple imputation results:
MIcombine.default(modelsMSM)
results se (lower upper) missInfo
prison 1.634382867 0.29486277 1.05591949 2.212846246 8 %
male 0.542145740 0.09349000 0.35887475 0.725416725 4 %
magef19 -0.216069895 0.13893477 -0.48852445 0.056384660 6 %
magef20 -0.050113070 0.15652347 -0.35697616 0.256750023 5 %
magef21 0.065940045 0.14231506 -0.21302992 0.344910010 3 %
magef22 0.363537763 0.12661104 0.11537048 0.611705043 2 %
magef23 0.502423222 0.22282963 0.06566337 0.939183076 2 %
raceblack 0.253268805 0.13667027 -0.01474066 0.521278274 6 %
racenon-hispanic/non-black 0.311047923 0.13601157 0.04439313 0.577702713 5 %
cedui -0.003172991 0.02201871 -0.04634187 0.039995890 5 %
cpedu -0.028772638 0.01615455 -0.06047258 0.002927308 10 %
clincome_adj -0.016393007 0.01983752 -0.05542020 0.022634183 17 %
healthw 0.785154809 0.10936140 0.57077585 0.999533771 3 %
job -0.729676066 0.10866812 -0.94269926 -0.516652871 4 %
married -0.855741824 0.10053569 -1.05279202 -0.658691624 1 %
cdeltot 0.087528616 0.08868364 -0.08810911 0.263166342 29 %
prison:male -1.553770291 0.36463179 -2.27040549 -0.837135093 15 %
LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBFZmZlY3Qgb24gTW9ydGFsaXR5LCBOTFlTICsgSW1wdXRhdGlvbiBNb2RlbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW4gdGhpcyBleGVyY2lzZSBJIHVzZSBtb3N0IG9mIHRoZSB2YXJpYWJsZXMgY29uc2lkZXJlZCBieSBNYXNzb2dsaWEgZXQgYWwuICgyMDE0KSwgZ2V0IGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGluY2FyY2VyYXRpb24gb24gbW9ydGFsaXR5LCBhbmQgZXhhbWluZSBhbiBpbml0aWFsIGltcHV0YXRpb24gbW9kZWwuIAoKVGhlIHZhcmlhYmxlcyBJIGNvbnNpZGVyZWQgd2VyZTogCgotIEdlbmRlciAoSSkKLSBBZ2UgKEkpCi0gUmFjZSAoSSkKLSBJbmNvbWUgKFYpCi0gRWR1Y2F0aW9uIChWKQotIFBhcmVudHMnIGVkdWNhdGlvbiAoSSkKLSBEZWxpbnF1ZW5jeSAoMTk4MCkgKEkpCi0gV29ya2luZyAoVikKLSBIZWFsdGggaXNzdWVzIChyZWxhdGVkIHRvIHdvcmspIChWKQotIEluY2FyY2VyYXRpb24gKFYpCi0gTWFycmllZCAoVikKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0Kcm0obGlzdD1scyhhbGw9VFJVRSkpCgpsaWJyYXJ5KHNkYXphcikKbGlicmFyeShsYXR0aWNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3Vydml2YWwpCmxpYnJhcnkoaXB3KQpsaWJyYXJ5KHRleHJlZykKCnNldHdkKCIvVXNlcnMvc2RhemEvR29vZ2xlIERyaXZlLzAxUHJvamVjdHMvMDFJbmNhcmNlcmF0aW9uSGVhbHRoLyIpCmxvYWQoIjA1UmVzZWFyY2gvc2RhemEvb3V0cHV0L3JkYXRhL25sc3kvaW1wMS5SZGF0YSIpCgoKIyBnZXQgZGF0YQpsb25nIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgImxvbmciLCBpbmMgPSBUUlVFKSkKZXhpIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgMSkpCm9yZyA8LSBkYXRhLnRhYmxlKGNvbXBsZXRlKGltcDEsIDApKQoKIyB2YXJpYWJsZXMgcHJlZGljdGluZyBtaXNzaW5nbmVzcwojIG9yZ1ssIGluY29tZV9taXNzaW5nIDo9IGlmZWxzZShpcy5uYShjbGluY29tZV9hZGopLCAxLCAwKV0Kb3JnWywgbWFnZSA6PSBtaW4oYWdlaSksIGlkXQojIHNjcmVlbnJlZyhnbG0oaW5jb21lX21pc3NpbmcgfiBtYWxlICsgbWFnZSArIHJhY2UgKyBycHJpc29uICsgam9iICsKICAjIG1hcnJpZWQgKyBjcGVkdSArIGFkcm9wb3V0ICsgY2RlbHRvdCArIHllYXIsIGRhdCA9IG9yZykpCmBgYAoKCkkgY29uc2lkZXJlZCByZWNvcmRzIHNpbmNlIDE5ODAgYW5kIHJlc3BvbmRlbnRzIDE4IHllYXJzIG9sZCBvciBtb3JlLCB0aGF0IGlzLCBhIHNhbXBsZSBvZiBgciBsZW5ndGgodW5pcXVlKG9yZyRpZCkpYC4gRHVyaW5nIHRoYXQgcGVyaW9kIGByIHN1bShvcmdbLCBkaWVkXSlgIHBlb3BsZSBkaWVkLiBUaGUgbWVkaWFuIGFnZSBvZiBkZWF0aCB3YXMgYHIgcm91bmQobWVkaWFuKG9yZ1tkaWVkID09IDEsIGFnZWldKSwgMilgLgoKSnVzdCB0byBnZXQgYW4gaWRlYSBvZiB0aGUgbWlzc2luZyBkYXRhOiAKCmBgYHtyfQpjb3VudG1pcyhvcmcpCmBgYAoKVGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBtaXNzaW5nIGNhc2VzIGlzIGluY29tZS4gSSBkZWZpbmVkIGltcHV0YXRpb24gbXVsdGl2ZWwgbW9kZWxzLCB3aGVyZSBJIHVzZSBib3RoIHRpbWUgaW52YXJpYW50IGFuZCB2YXJpYW50IHZhcmlhYmxlcywgYWdlIGFuZCB5ZWFyLiBKdXN0IHRvIHByb3ZpZGUgYW4gZXhhbXBsZSwgdGhlIGluY29tZSBpbXB1dGF0aW9uIG1vZGVsIGlzOiAKCiAgICAgICAgICAgICAgIAokJGluY29tZSA9IFxhbHBoYSArIHllYXIgKyBhZ2UgKyBlZHUgICsgcGFyZW50c1xfZWR1ICsgcHJpc29uICsgbWFycmllZCBcXAorIGhlYWx0aCArIGRlbGlucXVlbmN5ICsgam9iICsgZHJvcG91dCArIGRlYXRoICsgXGRlbHRhX3IgKyBcZXBzaWxvbl9pICQkCgpEZWF0aCBhbmQgZHJvcG91dCBhcmUgdGltZS1pbnZhcmlhbnQgdmFyaWFibGVzLiBPbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHByZWRpY3RvciBvZiBpbmNvbWUgbWlzc2lnbmVzcyBpcyBpbmNhcmNlcmF0aW9uISBGb3IgdGhpcyBleGVyY2lzZSwgSSBnZW5lcmF0ZWQgMTAgaW1wdXRhdGlvbnMuIEZpbmFsIHZlcnNpb25zIG9mIHRoaXMgZXhlcmNpc2Ugc2hvdWxkIHVzZSBtb3JlIGl0ZXJhdGlvbnMgYW5kIGltcHV0YXRpb25zIChlLmcuLCAzMCBpdGVyYXRpb25zLCA2MCBpbXB1dGF0aW9ucykuIEFueXdheXMgbWl4aW5nIGRvZXNuJ3QgbG9vayBiYWQuIAoKSSBleHBsb3JlZCBkaWZmZXJlbmNlcyBieSBnZW5kZXI6IAoKYGBge3IsIGVjaG8gPSBUUlVFfQojIGV4cGxvcmUgZGlmZmVyZW5jZXMgYnkgZ2VuZGVyCnggPC0gb3JnWywgLihtYWxlID0gbWF4KG1hbGUsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgIHByaXNvbiA9IG1heChycHJpc29uLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgICBkZWF0aCA9IG1heChkaWVkLCBuYS5ybSA9IFRSVUUpLCBhZ2UgPSBtYXgoYWdlaSwgbmEucm0gPSBUUlVFKSksIGlkXQoKIyB0aGVzZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiBhZ2UgPj0gMTggYW5kIHllYXIgPj0gMTk4MAp0YWJsZSh4WywgLihwcmlzb24sIGRlYXRoLCBtYWxlKV0pCgojIG9kZHMgcmF0aW8gbWFsZQphIDwtIHRhYmxlKHhbbWFsZSA9PSAxLCAuKHByaXNvbiwgZGVhdGgpXSkKKGFbMiwyXSphWzEsMV0pIC8gKGFbMiwxXSphWzEsMl0pCgojIG9kZCByYXRpb3MgZmVtYWxlCmIgPC0gdGFibGUoeFttYWxlID09IDAsIC4ocHJpc29uLCBkZWF0aCldKQooYlsyLDJdKmJbMSwxXSkgLyAoYlsyLDFdKmJbMSwyXSkgIyBodWdlCgoKIyB0aW1lIGJldHdlZW4gZmlyc3QgaW5jYXJjZXJhdGlvbiBldmVudCBhbmQgZGVhdGggYnkgZ2VuZGVyIQp4IDwtIG9yZ1ssIC4oaWQgLHJwcmlzb24sIGRpZWQsIG1hbGUsIGFnZWksIHN0b3ApXQphIDwtIHhbcnByaXNvbiA9PSAxLCAuKHByaXNvbiA9IG1pbihzdG9wKSwgYWdlID0gbWluKGFnZWkpKSwgLihpZCwgbWFsZSldCmIgPC0geFtkaWVkID09IDEsIC4oZGVhdGggPSBtaW4oc3RvcCkpLCAuKGlkLCBtYWxlKV0KCiNhbnlEdXBsaWNhdGVkKGIpCiNhbnlEdXBsaWNhdGVkKGEpCnNldGtleShhLCBpZCwgbWFsZSkKc2V0a2V5KGIsIGlkLCBtYWxlKQpjIDwtIGJbYV0KCiMgb25seSA4MSBjYXNlcyBvZiBwZW9wbGUgd2hvIGhhdmUgYmVlbiBpbmNhcmNlcmF0ZWQgYW5kIGRpZWQgaW4gdGhlIHNhbXBsZQpsZW5ndGgoY1shaXMubmEoZGVhdGgpLCBkZWF0aCAtIHByaXNvbl0pCm1lYW4oY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBhZ2VdKSAjIG1lbiBhcmUgeW91bmdlcgptZWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgYWdlXSkgIyB3b21lbiBhcmUgb2xkZXIKCiMgbWVhbiBhbmQgbWVkaWFuIG9mIHllYXIgYmV0d2VlbiBmaXJzdCBpbmNhcmNlcmF0aW9uIGV2ZW50IGFuZCBkZWF0aAojIG1lbgptZWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMSwgZGVhdGggLSBwcmlzb25dKQptZWRpYW4oY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBkZWF0aCAtIHByaXNvbl0pCmhpc3QoY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBkZWF0aCAtIHByaXNvbl0sIG1haW4gPSAiTWVuOiBEaXN0cmlidXRpb24gdGltZSBiZXR3ZWVuIGluY2FyY2VyYXRpb24gYW5kIGRlYXRoIikKCiMgd29tZW4KbWVhbihjWyFpcy5uYShkZWF0aCkgJiBtYWxlID09IDAsIGRlYXRoIC0gcHJpc29uXSkKbWVkaWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgZGVhdGggLSBwcmlzb25dKQpoaXN0KGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgZGVhdGggLSBwcmlzb25dLCBtYWluID0gIldvbWVuOiBEaXN0cmlidXRpb24gdGltZSBiZXR3ZWVuIGluY2FyY2VyYXRpb24gYW5kIGRlYXRoIikKCmBgYAoKTGV0J3MgZXhwbG9yZSB0aGUgaW1wdXRhdGlvbnM6IAoKYGBge3IsIGVjaG89RkFMU0V9CnBsb3QoaW1wMSkKYGBgCgpUaGVuLCBJIGV4YW1pbmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgaW1wdXRlZCB2YXJpYWJsZXMgYnkgYWdlIGFuZCB5ZWFyLiBIZXJlIEkgc2hvdyBvbmx5IGluY29tZSBhbmQgcHJpc29uLCBhbGwgdGhlIHJlc3Qgb2YgaW1wdXRlZCB2YXJpYWJsZXMgbG9vayByaWdodC4gR3JheSBsaW5lcyByZXByZXNlbnQgaW1wdXRlZCBkYXRhc2V0cywgdGhlIHJlZCBsaW5lIHRoZSBvYnNlcnZlZCBkYXRhLiAKCkluY29tZSBpbXB1dGF0aW9ucyBhcmUgZmFyIGJlbG93IHRoZSBvYnNlcnZlZCB2YWx1ZXMsIEkgZ3Vlc3MgbWFpbmx5IHRvIHRoZSBlZmZlY3Qgb2YgcHJpc29uIG9uIGluY29tZSBtaXNzaW5nbmVzcy4gUHJvYmFibHksIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSBhIGxhZyB2ZXJzaW9uIG9mIGluY29tZSB0byBpbXByb3ZlIHRoZSBpbXB1dGF0aW9uLiAKCkluY2FyY2VhcnRpb24gbG9va3MgZmluZS4gQWZ0ZXIgdGhlIDIwMDQsIE5MWVMgcmVjb3JkZWQgbm9uLXJlc3BvbnNlIGR1ZSB0byBpbmNhcmNlcmF0aW9uLCB0aGF0IGlzIHdoeSB0aGVyZSBhcmUgbm8gbWlzc2luZyByZWNvcmRzIGR1cmluZyB0aG9zZSB5ZWFycy4gCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBpbmNvbWUKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oY2xpbmNvbWVfYWRqLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPCA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAibG4gaW5jb21lIGNlbnRlcmVkXG4iKQoKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oY2xpbmNvbWVfYWRqLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJsbiBpbmNvbWUgY2VudGVyZWRcbiIpCgojIHByaXNvbgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBcbiIpCgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gInByb3BvcnRpb24gaW4gcHJpc29uIFxuIikKCiMgb3JnWywgbWF4KGFnZWkpLCAuKGlkLCBtYWxlKV1bLCBtZWFuKFYxKSwgbWFsZV0KIyBvcmdbLCBtZWFuKGRlYXRoKSwgbWFsZV0KIyB0YWJsZShvcmdbbWFsZSA9PSAwLCAuKHJwcmlzb24sIGRpZWQpXSkgIyAyNTAKIyB0YWJsZShvcmdbbWFsZSA9PSAxLCBkaWVkXSkgIyA0MDAKCiMgIyBqb2IKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihqb2IsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiam9iIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3Agam9iXG4iKQojIAojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGpvYiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiB5ZWFyICVpbiUgeWVhcnNdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJqb2IgYnkgYWdlIiwgeCA9ICJcbnllYXIiLCB5ID0gInllYXJzIG9mIGVkdWNhdGlvbiBjZW50ZXJlZFxuIikKIyAKIyAKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihoZWFsdGh3LCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPCA2MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCiMgCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oaGVhbHRodywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCmBgYAoKIyMgUG9vbGVkIE1vZGVscwoKQSBzaW1wbGUgbW9kZWwgcmVtb3ZpbmcgdGltZS12YXJ5aW5nIGFkanVzdG1lbnRzIChkaWZmZXJlbnQgZnJvbSB0aGUgbmFpdmUgbW9kZWwsIGJ1dCBzaW1pbGFyIHRvIE1TTSk6IAoKYGBge3IsIGVjaG89RkFMU0V9CiMrIGNyZWF0ZSBtb2RlbHMgcGVyIGltcHV0YXRpb24KCiMgcmVkZWZpbmUgc29tZSB2YXJpYWJsZXMKbGltcCA8LSBsb25nWy5pbXAgIT0gMF0Kc2V0a2V5KGxpbXAsIC5pbXAsIGlkLCBzdGFydCkKCmxpbXBbLCBjcHJpc29uIDo9IGN1bXN1bShycHJpc29uKSwgYnkgPSAuKC5pbXAsIGlkKV1bLCBwcmlzb24gOj0gaWZlbHNlKGNwcmlzb24gPiAwLCAxLCAwKV0KI3RhYmxlKGxpbXAkcHJpc29uLCB1c2VOQSA9ICJpZmFueSIpCmxpbXBbLCBjaGVhbHRoIDo9IGN1bXN1bShoZWFsdGh3KSwgYnkgPS4oaWQsIC5pbXApXVssIHBvb3JoZWFsdGggOj0gaWZlbHNlKGNoZWFsdGggPiAwLCAxLCAwKV0KI3RhYmxlKGxpbXAkcG9vcmhlYWx0aCwgdXNlTkEgPSAiaWZhbnkiKQpsaW1wWywgbWFnZSA6PSBtaW4oYWdlaSksIC4oaWQsIC5pbXApXQpsaW1wWywgbWFnZWYgOj0gZmFjdG9yKG1hZ2UpXQoKCm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBjZGVsdG90LCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgoKQWRkaW5nIHRpbWUtdmFyeWluZyBjb3ZhcmlhdGVzLgoKYGBge3IsIGVjaG89RkFMU0V9Cm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQgKyBjZGVsdG90LCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgpObyBlZmZlY3Qgb2YgcHJpc29uIG9uIG1vcnRhbGl0eS4gCgpCZWNhdXNlIG9mIHRpbWUtdmFyeWluZyBjb25mb3VuZGluZyBJIHVzZWQgdGhlIE1TTSBhZGp1c3RtZW50LiBUaGlzIHNlZW1zIHRvIGNvcnJlY3QgdGhlIGFkanVzdG1lbnQgb2YgbWVkaWF0b3JzLiBUaGUgZWZmZWN0cyBhcmUgaGlnaGVyIGJ1dCBsZXNzIHByZWNpc2UgYW5kIG5vbi1zdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBTaW1pbGFybHkgdG8gTWFzc29nbGlhIGV0IGFsLCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBwcmlzb24gYW5kIGdlbmRlciBzdWdnZXN0cyBhIGh1Z2UgcG9zaXRpdmUgZWZmZWN0IGZvciB3b21lbi4gVGhlIGltcHV0YXRpb25zIEkgYW0gdXNpbmcgYXJlIG5vdCBjb21wbGV0bHkgc3VpdGFibGUsIHRoZSBpbXB1dGF0aW9uIG1vZGVsIHNob3VsZCBpbmNsdWRlIHRoZSBpbnRlcmFjdGlvbiBieSBnZW5kZXIuIFRoZSBjb2VmZmljaWVudCBmb3Igd29tZW4gaXMgdG9vIGJpZyB0byBiZSBjcmVkaWJsZSAoaGF6YXJkIHJhdGlvIG9mIGFib3V0IDUsIGtpbmQgb2Ygc2ltaWxhciB0byB0aGUgb2RkcyByYXRpb3MgY29tcHV0ZWQgYWJvdmUpLiAgCgoKYGBge3IsIGVjaG89RkFMU0V9Cm1vZGVsc01TTSA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbnMKICAgICAgdCA8LSBsaW1wWy5pbXAgPT0gaV0KICAgICAgdzEgPC0gaXB3dG0oZXhwb3N1cmUgPSBkcm9wb3V0LCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSwKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpc29uICsgY2VkdWkgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQsIAogICAgICAgICAgICAgIGlkID0gaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB3MiA8LSBpcHd0bShleHBvc3VyZSA9IHByaXNvbiwgZmFtaWx5ID0gInN1cnZpdmFsIiwKICAgICAgICAgICAgICBudW1lcmF0b3IgPSB+IG1hbGUgKyBtYWdlZiArIHJhY2UgKyBjZGVsdG90ICsgY3BlZHUsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+IG1hbGUgKyBtYWdlZiArIHJhY2UgKyBjZGVsdG90ICsgY3BlZHUgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VkdWkgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQsIGlkID0gaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB0Wywgd3QgOj0gdzEkaXB3LndlaWdodHMgKiB3MiRpcHcud2VpZ2h0c10KICAgICAgbW9kZWxzTVNNW1tpXV0gPC0gY294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFnZWYgKyBtYWxlICsgcmFjZSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjZWR1aSArIGNwZWR1ICsgY2xpbmNvbWVfYWRqICsgaGVhbHRodyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IgKyBtYXJyaWVkICsgY2RlbHRvdCArIGNsdXN0ZXIoaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gdCR3dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHQpCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVsc01TTSkpCmBgYApgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWxzTVNNIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgbWFnZWYgKyByYWNlICsgY2RlbHRvdCArIGNwZWR1LAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiBtYWxlICsgbWFnZWYgKyByYWNlICsgY2RlbHRvdCArIGNwZWR1ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlzb24gKyBjZWR1aSArIGNsaW5jb21lX2FkaiArIGhlYWx0aHcgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iICsgbWFycmllZCwgCiAgICAgICAgICAgICAgaWQgPSBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gcHJpc29uLCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSwKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWR1aSArIGNsaW5jb21lX2FkaiArIGhlYWx0aHcgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iICsgbWFycmllZCwgaWQgPSBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHRbLCB3dCA6PSB3MSRpcHcud2VpZ2h0cyAqIHcyJGlwdy53ZWlnaHRzXQogICAgICBtb2RlbHNNU01bW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKiBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQgKyBjZGVsdG90ICsgY2x1c3RlcihpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB0JHd0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzTVNNKSkKYGBgCg==