9. Анализ данных типа времени жизни
Глушков Егор Александрович, гр. 20.М04-мм
Данные SurMart.xls о дожитии и длительности безрецидивного периоды больных с глиобластомами.
- time – выживаемость (дней)
- time.c – индикатор цензурирования выживаемости (0 – полные данные, 1 – цензурированные)
- relapse_free – безрецедивный период (дней)
- relapse_free.c – индикатор цензурирования безрецедивного периода
- oper – вид оперативного вмешательства (0 – нет, 1 – открытое, 2 – стереотакс. биопсия, 3 – стереотакс. криотомия)
- speech_disorders – речевые нарушения (0 – нет, 1 – ?, 2 – способность общения не нарушена, 3 – нарушена способность общения, 4 – неспособность к общению) – категориальная переменная
- gen – пол (1 – мужской, 2 – женский) – бинарная переменная
- karn – общее состояние по Карновскому – метрическая переменная (ковариата)
Построить кривые Каплана-Мейера
по выживанию,
по длительности безрецедивного периода.
для групп, отличающихся:
значениями категориальной переменной,
бинарной переменной.
Привести средние и медианы дожития, проверить значимость различия групп.
Внести в модель влияние ковариаты (метрические переменные) и проверить значимость её влияния.
Кривые Каплана-Мейера по выживанию
library(readxl)
X <- read_excel("SurMart.xls")
surv_data <- na.omit(X[ , c(4, 3, 6, 5, 17, 1, 7)])
colnames(surv_data) <- c('time', 'time.c', 'relapse_free', 'relapse_free.c', 'speech_disorders', 'gen', 'karn')
surv_data$speech_disorders <- as.factor(surv_data$speech_disorders)
surv_data$gen <- as.factor(surv_data$gen)
summary(surv_data)
time time.c relapse_free relapse_free.c speech_disorders gen karn
Min. : 9.00 Min. :0.0000 Min. : 1.0 Min. :0.0000 0:481 1:342 Min. :20.00
1st Qu.: 59.00 1st Qu.:1.0000 1st Qu.: 8.0 1st Qu.:0.0000 1: 9 2:262 1st Qu.:60.00
Median : 69.00 Median :1.0000 Median : 66.5 Median :1.0000 2: 56 Median :70.00
Mean : 70.18 Mean :0.8046 Mean : 440.9 Mean :0.7053 3: 50 Mean :71.84
3rd Qu.: 79.00 3rd Qu.:1.0000 3rd Qu.: 476.5 3rd Qu.:1.0000 4: 8 3rd Qu.:80.00
Max. :336.00 Max. :1.0000 Max. :6923.0 Max. :1.0000 Max. :90.00
Строим кривую дожития (в качестве времени – выживаемость в днях)
library(survival)
library(ggfortify)
time_surv <- Surv(surv_data$time, event = surv_data$time.c)
km_fit <- survfit(time_surv ~ 1, data=surv_data)
# summary(km_fit)
# plot(km_fit)
autoplot(km_fit)

hist(surv_data$time)

print(km_fit, print.rmean = TRUE)
Call: survfit(formula = time_surv ~ 1, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
604.00 486.00 74.91 1.68 78.00 78.00 78.00
* restricted mean with upper limit = 336
Согласно усеченному средему и медиане, выживаемость составляет 75-78 суток
Кривые для групп, отличающиеся по категориальной переменной “речевые нарушения”
km_speech <- survfit(time_surv ~ speech_disorders, data=surv_data)
# plot(km_speech, lty=seq(0, 4))
autoplot(km_speech)

print(km_speech, print.rmean = TRUE)
Call: survfit(formula = time_surv ~ speech_disorders, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
speech_disorders=0 481 403 74.7 0.611 78 78 78
speech_disorders=1 9 9 66.7 5.200 69 58 NA
speech_disorders=2 56 40 81.2 11.877 68 68 69
speech_disorders=3 50 32 87.7 18.321 58 58 68
speech_disorders=4 8 2 150.7 75.662 58 58 NA
* restricted mean with upper limit = 336
Заметно, как сильно отличается усеченное среднее для группы 4 и для всех остальных: оно больше почти в два раза (однако мало объектов, чтобы всерьез говорить об этом). Среднее группы 3 также превосходит усеченные средние других групп. В то же время медианное значение наоборот больше у группы 0 и с ростом номера группы лишь уменьшается.
\(H_0: h_1(t) = h_2(t) = ... = h_n(t)\)
\(H_1: h_i(t_0) \neq h_j(t_0)\) хотя бы для одной пары i, j и \(t_0\)
survdiff(time_surv ~ speech_disorders, data=surv_data)
Call:
survdiff(formula = time_surv ~ speech_disorders, data = surv_data)
N Observed Expected (O-E)^2/E (O-E)^2/V
speech_disorders=0 481 403 443.795 3.75 53.63
speech_disorders=1 9 9 5.140 2.90 3.51
speech_disorders=2 56 40 25.680 7.99 10.57
speech_disorders=3 50 32 10.654 42.77 49.49
speech_disorders=4 8 2 0.732 2.20 2.26
Chisq= 70.3 on 4 degrees of freedom, p= 2e-14
p = 2e-14, различия кривых дожития между группами (по нарушениям речи) значимы
Кривые для групп, отличающиеся по бинарной переменной “пол”
km_gen <- survfit(time_surv ~ gen, data=surv_data)
# plot(km_gen, lty=c(1, 2))
autoplot(km_gen)

print(km_gen, print.rmean = TRUE)
Call: survfit(formula = time_surv ~ gen, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
gen=1 342 263 76.5 2.75 78 77.6 78
gen=2 262 223 73.7 1.58 78 70.0 78
* restricted mean with upper limit = 336
Для мужского пола среднее время выживания (в днях) равно 76.5 (усеченное среднее), медианное – 78. Для женского пола среднее – 73.7, медианное – также 78.
\(H_0: h_1(t) = h_2(t) = ... = h_n(t)\)
\(H_1: h_i(t_0) \neq h_j(t_0)\) хотя бы для одной пары i, j и \(t_0\)
survdiff(time_surv ~ gen, data=surv_data)
Call:
survdiff(formula = time_surv ~ gen, data = surv_data)
N Observed Expected (O-E)^2/E (O-E)^2/V
gen=1 342 263 278 0.839 2.64
gen=2 262 223 208 1.124 2.64
Chisq= 2.6 on 1 degrees of freedom, p= 0.1
p = 0.1, различия кривых дожития между полами не значимы на уровне 0.1 > 0.05
Кривые Каплана-Мейера по длительности безрецидивного периода
rel_surv <- Surv(surv_data$relapse_free, event = surv_data$relapse_free.c)
km_fit.2 <- survfit(rel_surv ~ 1, data=surv_data)
# summary(km_fit.2)
# plot(km_fit.2)
autoplot(km_fit.2)

hist(surv_data$relapse_free)

print(km_fit.2, print.rmean = TRUE)
Call: survfit(formula = rel_surv ~ 1, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
604.0 426.0 955.4 94.1 150.0 79.0 259.0
* restricted mean with upper limit = 6923
Медианное значение безрецидивного периода в днях составляет 150, тогда как усечённое среднее – 955.4 дня.
Кривые для групп, отличающиеся по категориальной переменной “речевые нарушения”
km_speech.2 <- survfit(rel_surv ~ speech_disorders, data=surv_data)
# plot(km_speech.2, lty=seq(0, 4))
autoplot(km_speech.2)

print(km_speech.2, print.rmean = TRUE)
Call: survfit(formula = rel_surv ~ speech_disorders, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
speech_disorders=0 481 350 1042.90 105.73 228 96 335
speech_disorders=1 9 7 71.37 34.91 9 7 NA
speech_disorders=2 56 42 374.21 95.34 53 16 320
speech_disorders=3 50 25 1549.75 677.40 58 19 NA
speech_disorders=4 8 2 8.88 1.05 10 NA NA
* restricted mean with upper limit = 6923
Если не обращать внимания на те группы, где мало наблюдений (1, 4) и потому сложно всерьез брать это в расчет, то для групп 0, 2, 3 усеченные средние сильно отличаются: разница между некоторыми из них 3-5 раз. Медиана группы 1 также намного больше примерно равных медиан групп 2 и 3.
\(H_0: h_1(t) = h_2(t) = ... = h_n(t)\)
\(H_1: h_i(t_0) \neq h_j(t_0)\) хотя бы для одной пары i, j и \(t_0\)
survdiff(rel_surv ~ speech_disorders, data=surv_data)
Call:
survdiff(formula = rel_surv ~ speech_disorders, data = surv_data)
N Observed Expected (O-E)^2/E (O-E)^2/V
speech_disorders=0 481 350 370.62 1.147 9.437
speech_disorders=1 9 7 2.99 5.392 5.773
speech_disorders=2 56 42 30.80 4.071 4.580
speech_disorders=3 50 25 20.38 1.049 1.170
speech_disorders=4 8 2 1.22 0.502 0.567
Chisq= 13.1 on 4 degrees of freedom, p= 0.01
p = 0.01, различия кривых дожития между группами значимы, так как нулевая гипотеза о равенстве функций интенсивности для разных групп отвергается.
Кривые для групп, отличающиеся по бинарной переменной “пол”
km_gen.2 <- survfit(rel_surv ~ gen, data=surv_data)
# plot(km_gen.2, lty=c(1, 2))
autoplot(km_gen.2)

print(km_gen.2, print.rmean = TRUE)
Call: survfit(formula = rel_surv ~ gen, data = surv_data)
n events *rmean *se(rmean) median 0.95LCL 0.95UCL
gen=1 342 227 881 111 124 51 287
gen=2 262 199 958 130 210 82 369
* restricted mean with upper limit = 6923
Можно лишь заметить значительную разницу медиан для обоих полов: почти в 2 раза длиннее безрецедивный период у представительниц женского пола, в усеченных средних такой разницы не наблюдается.
\(H_0: h_1(t) = h_2(t) = ... = h_n(t)\)
\(H_1: h_i(t_0) \neq h_j(t_0)\) хотя бы для одной пары i, j и \(t_0\)
survdiff(rel_surv ~ gen, data=surv_data)
Call:
survdiff(formula = rel_surv ~ gen, data = surv_data)
N Observed Expected (O-E)^2/E (O-E)^2/V
gen=1 342 227 227 4.08e-05 9.2e-05
gen=2 262 199 199 4.65e-05 9.2e-05
Chisq= 0 on 1 degrees of freedom, p= 1
Различия кривых дожития между полами не значимы, так как нулевая гипотеза о равенстве интенсивностей для разных групп не отвергается с p = 1.
Регрессионная модель Кокса. Влияние ковариаты
summary(coxph(Surv(time, event = time.c) ~ karn, data=surv_data))
Call:
coxph(formula = Surv(time, event = time.c) ~ karn, data = surv_data)
n= 604, number of events= 486
coef exp(coef) se(coef) z Pr(>|z|)
karn -0.126675 0.881020 0.004224 -29.99 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
karn 0.881 1.135 0.8738 0.8883
Concordance= 0.894 (se = 0.007 )
Likelihood ratio test= 655.1 on 1 df, p=<2e-16
Wald test = 899.2 on 1 df, p=<2e-16
Score (logrank) test = 861.1 on 1 df, p=<2e-16
Полученные доверительные уровни вероятности порядка <2e-16 позволяют отвергнуть гипотезу о незначимости коэффициента, то есть о равенстве коэффициента нулю. Таким образом, коэффициент отличен от нуля, влияние ковариаты (общее состояние по Карновскому) на выживаемость (в днях) значимо.
summary(coxph(Surv(relapse_free, event = relapse_free.c) ~ karn, data=surv_data))
Call:
coxph(formula = Surv(relapse_free, event = relapse_free.c) ~
karn, data = surv_data)
n= 604, number of events= 426
coef exp(coef) se(coef) z Pr(>|z|)
karn -0.017172 0.982974 0.003554 -4.832 1.35e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
karn 0.983 1.017 0.9762 0.9898
Concordance= 0.577 (se = 0.015 )
Likelihood ratio test= 21.58 on 1 df, p=3e-06
Wald test = 23.35 on 1 df, p=1e-06
Score (logrank) test = 23.39 on 1 df, p=1e-06
Полученные p.values, имеющие порядок e-06, позволяют отвергнуть гипотезу о незначимости коэффициента, то есть о равенстве коэффициента нулю. Таким образом, коэффициент отличен от нуля, влияние ковариаты на длительность безрецидивного периода значимо.
rho <- sum(surv_data$time.c) / sum(surv_data$time); rho
[1] 0.01146454
fitKM <- survfit(Surv(time, event=time.c)~1, data=surv_data)
plot(fitKM, mark.time = FALSE, col=1, conf.int = FALSE, lty=2)
curve(exp(-rho*x), from=0, to=max(surv_data$time), add=TRUE, col=2)

LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJY3DQojIyMgOS4g0JDQvdCw0LvQuNC3INC00LDQvdC90YvRhSDRgtC40L/QsCDQstGA0LXQvNC10L3QuCDQttC40LfQvdC4DQoNCj4g0JPQu9GD0YjQutC+0LIg0JXQs9C+0YAg0JDQu9C10LrRgdCw0L3QtNGA0L7QstC40YcsINCz0YAuIDIwLtCcMDQt0LzQvCAgDQoNCi0tLQ0KDQrQlNCw0L3QvdGL0LUgU3VyTWFydC54bHMg0L4g0LTQvtC20LjRgtC40Lgg0Lgg0LTQu9C40YLQtdC70YzQvdC+0YHRgtC4INCx0LXQt9GA0LXRhtC40LTQuNCy0L3QvtCz0L4g0L/QtdGA0LjQvtC00Ysg0LHQvtC70YzQvdGL0YUg0YEg0LPQu9C40L7QsdC70LDRgdGC0L7QvNCw0LzQuC4NCg0KKyAqdGltZSogIC0tINCy0YvQttC40LLQsNC10LzQvtGB0YLRjCAo0LTQvdC10LkpDQorICp0aW1lLmMqIC0tINC40L3QtNC40LrQsNGC0L7RgCDRhtC10L3Qt9GD0YDQuNGA0L7QstCw0L3QuNGPINCy0YvQttC40LLQsNC10LzQvtGB0YLQuCAoMCAtLSDQv9C+0LvQvdGL0LUg0LTQsNC90L3Ri9C1LCAxIC0tINGG0LXQvdC30YPRgNC40YDQvtCy0LDQvdC90YvQtSkNCisgKnJlbGFwc2VfZnJlZSogLS0g0LHQtdC30YDQtdGG0LXQtNC40LLQvdGL0Lkg0L/QtdGA0LjQvtC0ICjQtNC90LXQuSkNCisgKnJlbGFwc2VfZnJlZS5jKiAtLSDQuNC90LTQuNC60LDRgtC+0YAg0YbQtdC90LfRg9GA0LjRgNC+0LLQsNC90LjRjyDQsdC10LfRgNC10YbQtdC00LjQstC90L7Qs9C+INC/0LXRgNC40L7QtNCwIA0KKyAqb3BlciogLS0g0LLQuNC0INC+0L/QtdGA0LDRgtC40LLQvdC+0LPQviDQstC80LXRiNCw0YLQtdC70YzRgdGC0LLQsCAoMCAtLSDQvdC10YIsIDEgLS0g0L7RgtC60YDRi9GC0L7QtSwgMiAtLSDRgdGC0LXRgNC10L7RgtCw0LrRgS4g0LHQuNC+0L/RgdC40Y8sIDMgLS0g0YHRgtC10YDQtdC+0YLQsNC60YEuINC60YDQuNC+0YLQvtC80LjRjykNCisgKnNwZWVjaF9kaXNvcmRlcnMqIC0tINGA0LXRh9C10LLRi9C1INC90LDRgNGD0YjQtdC90LjRjyAoMCAtLSDQvdC10YIsIDEgLS0gPywgMiAtLSDRgdC/0L7RgdC+0LHQvdC+0YHRgtGMINC+0LHRidC10L3QuNGPINC90LUg0L3QsNGA0YPRiNC10L3QsCwgMyAtLSDQvdCw0YDRg9GI0LXQvdCwINGB0L/QvtGB0L7QsdC90L7RgdGC0Ywg0L7QsdGJ0LXQvdC40Y8sIDQgLS0g0L3QtdGB0L/QvtGB0L7QsdC90L7RgdGC0Ywg0Log0L7QsdGJ0LXQvdC40Y4pIC0tINC60LDRgtC10LPQvtGA0LjQsNC70YzQvdCw0Y8g0L/QtdGA0LXQvNC10L3QvdCw0Y8NCisgKmdlbiogLS0g0L/QvtC7ICgxIC0tINC80YPQttGB0LrQvtC5LCAyIC0tINC20LXQvdGB0LrQuNC5KSAtLSDQsdC40L3QsNGA0L3QsNGPINC/0LXRgNC10LzQtdC90L3QsNGPDQorICprYXJuKiAtLSDQvtCx0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtSDQv9C+INCa0LDRgNC90L7QstGB0LrQvtC80YMgLS0g0LzQtdGC0YDQuNGH0LXRgdC60LDRjyDQv9C10YDQtdC80LXQvdC90LDRjyAo0LrQvtCy0LDRgNC40LDRgtCwKQ0KDQoNCjEuINCf0L7RgdGC0YDQvtC40YLRjCDQutGA0LjQstGL0LUg0JrQsNC/0LvQsNC90LAt0JzQtdC50LXRgNCwDQoNCiAgICBhKSDQv9C+INCy0YvQttC40LLQsNC90LjRjiwNCiAgICANCiAgICBiKSDQv9C+INC00LvQuNGC0LXQu9GM0L3QvtGB0YLQuCDQsdC10LfRgNC10YbQtdC00LjQstC90L7Qs9C+INC/0LXRgNC40L7QtNCwLg0KDQogICAg0LTQu9GPINCz0YDRg9C/0L8sINC+0YLQu9C40YfQsNGO0YnQuNGF0YHRjzoNCg0KICAgIGEpINC30L3QsNGH0LXQvdC40Y/QvNC4INC60LDRgtC10LPQvtGA0LjQsNC70YzQvdC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LksDQogICAgDQogICAgYikg0LHQuNC90LDRgNC90L7QuSDQv9C10YDQtdC80LXQvdC90L7QuS4NCiAgICANCiAgICDQn9GA0LjQstC10YHRgtC4INGB0YDQtdC00L3QuNC1INC4INC80LXQtNC40LDQvdGLINC00L7QttC40YLQuNGPLCDQv9GA0L7QstC10YDQuNGC0Ywg0LfQvdCw0YfQuNC80L7RgdGC0Ywg0YDQsNC30LvQuNGH0LjRjyDQs9GA0YPQv9C/Lg0KDQoyLiDQktC90LXRgdGC0Lgg0LIg0LzQvtC00LXQu9GMINCy0LvQuNGP0L3QuNC1INC60L7QstCw0YDQuNCw0YLRiyAo0LzQtdGC0YDQuNGH0LXRgdC60LjQtSDQv9C10YDQtdC80LXQvdC90YvQtSkg0Lgg0L/RgNC+0LLQtdGA0LjRgtGMINC30L3QsNGH0LjQvNC+0YHRgtGMINC10ZEg0LLQu9C40Y/QvdC40Y8uDQoNCi0tLQ0KDQo+INCa0YDQuNCy0YvQtSDQmtCw0L/Qu9Cw0L3QsC3QnNC10LnQtdGA0LAg0L/QviDQstGL0LbQuNCy0LDQvdC40Y4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCg0KWCA8LSByZWFkX2V4Y2VsKCJTdXJNYXJ0LnhscyIpDQoNCnN1cnZfZGF0YSA8LSBuYS5vbWl0KFhbICwgYyg0LCAzLCA2LCA1LCAxNywgMSwgNyldKQ0KY29sbmFtZXMoc3Vydl9kYXRhKSA8LSBjKCd0aW1lJywgJ3RpbWUuYycsICdyZWxhcHNlX2ZyZWUnLCAncmVsYXBzZV9mcmVlLmMnLCAnc3BlZWNoX2Rpc29yZGVycycsICdnZW4nLCAna2FybicpDQpzdXJ2X2RhdGEkc3BlZWNoX2Rpc29yZGVycyA8LSBhcy5mYWN0b3Ioc3Vydl9kYXRhJHNwZWVjaF9kaXNvcmRlcnMpDQpzdXJ2X2RhdGEkZ2VuIDwtIGFzLmZhY3RvcihzdXJ2X2RhdGEkZ2VuKQ0KDQpzdW1tYXJ5KHN1cnZfZGF0YSkNCmBgYA0KDQrQodGC0YDQvtC40Lwg0LrRgNC40LLRg9GOINC00L7QttC40YLQuNGPICjQsiDQutCw0YfQtdGB0YLQstC1INCy0YDQtdC80LXQvdC4IC0tINCy0YvQttC40LLQsNC10LzQvtGB0YLRjCDQsiDQtNC90Y/RhSkNCmBgYHtyfQ0KbGlicmFyeShzdXJ2aXZhbCkNCmxpYnJhcnkoZ2dmb3J0aWZ5KQ0KDQp0aW1lX3N1cnYgPC0gU3VydihzdXJ2X2RhdGEkdGltZSwgZXZlbnQgPSBzdXJ2X2RhdGEkdGltZS5jKQ0Ka21fZml0IDwtIHN1cnZmaXQodGltZV9zdXJ2IH4gMSwgZGF0YT1zdXJ2X2RhdGEpDQoNCiMgc3VtbWFyeShrbV9maXQpDQojIHBsb3Qoa21fZml0KQ0KYXV0b3Bsb3Qoa21fZml0KQ0KYGBgDQoNCg0KYGBge3J9DQpoaXN0KHN1cnZfZGF0YSR0aW1lKQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoa21fZml0LCBwcmludC5ybWVhbiA9IFRSVUUpDQpgYGANCtCh0L7Qs9C70LDRgdC90L4g0YPRgdC10YfQtdC90L3QvtC80YMg0YHRgNC10LTQtdC80YMg0Lgg0LzQtdC00LjQsNC90LUsINCy0YvQttC40LLQsNC10LzQvtGB0YLRjCDRgdC+0YHRgtCw0LLQu9GP0LXRgiA3NS03OCDRgdGD0YLQvtC6DQoNCg0KPiDQmtGA0LjQstGL0LUg0LTQu9GPINCz0YDRg9C/0L8sINC+0YLQu9C40YfQsNGO0YnQuNC10YHRjyDQv9C+INC60LDRgtC10LPQvtGA0LjQsNC70YzQvdC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkgItGA0LXRh9C10LLRi9C1INC90LDRgNGD0YjQtdC90LjRjyINCg0KYGBge3J9DQprbV9zcGVlY2ggPC0gc3VydmZpdCh0aW1lX3N1cnYgfiBzcGVlY2hfZGlzb3JkZXJzLCBkYXRhPXN1cnZfZGF0YSkNCiMgcGxvdChrbV9zcGVlY2gsIGx0eT1zZXEoMCwgNCkpDQphdXRvcGxvdChrbV9zcGVlY2gpDQpgYGANCg0KYGBge3J9DQpwcmludChrbV9zcGVlY2gsIHByaW50LnJtZWFuID0gVFJVRSkNCmBgYA0K0JfQsNC80LXRgtC90L4sINC60LDQuiDRgdC40LvRjNC90L4g0L7RgtC70LjRh9Cw0LXRgtGB0Y8g0YPRgdC10YfQtdC90L3QvtC1INGB0YDQtdC00L3QtdC1INC00LvRjyDQs9GA0YPQv9C/0YsgNCDQuCDQtNC70Y8g0LLRgdC10YUg0L7RgdGC0LDQu9GM0L3Ri9GFOiDQvtC90L4g0LHQvtC70YzRiNC1INC/0L7Rh9GC0Lgg0LIg0LTQstCwINGA0LDQt9CwICjQvtC00L3QsNC60L4g0LzQsNC70L4g0L7QsdGK0LXQutGC0L7Qsiwg0YfRgtC+0LHRiyDQstGB0LXRgNGM0LXQtyDQs9C+0LLQvtGA0LjRgtGMINC+0LEg0Y3RgtC+0LwpLiDQodGA0LXQtNC90LXQtSDQs9GA0YPQv9C/0YsgMyDRgtCw0LrQttC1INC/0YDQtdCy0L7RgdGF0L7QtNC40YIg0YPRgdC10YfQtdC90L3Ri9C1INGB0YDQtdC00L3QuNC1INC00YDRg9Cz0LjRhSDQs9GA0YPQv9C/LiDQkiDRgtC+INC20LUg0LLRgNC10LzRjyDQvNC10LTQuNCw0L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQvdCw0L7QsdC+0YDQvtGCINCx0L7Qu9GM0YjQtSDRgyDQs9GA0YPQv9C/0YsgMCDQuCDRgSDRgNC+0YHRgtC+0Lwg0L3QvtC80LXRgNCwINCz0YDRg9C/0L/RiyDQu9C40YjRjCDRg9C80LXQvdGM0YjQsNC10YLRgdGPLg0KDQoNCiRIXzA6IGhfMSh0KSA9IGhfMih0KSA9IC4uLiA9IGhfbih0KSQgIA0KJEhfMTogaF9pKHRfMCkgXG5lcSBoX2oodF8wKSQg0YXQvtGC0Y8g0LHRiyDQtNC70Y8g0L7QtNC90L7QuSDQv9Cw0YDRiyAqaSwgaiog0LggJHRfMCQNCmBgYHtyfQ0Kc3VydmRpZmYodGltZV9zdXJ2IH4gc3BlZWNoX2Rpc29yZGVycywgZGF0YT1zdXJ2X2RhdGEpDQpgYGANCipwID0gMmUtMTQqLCDRgNCw0LfQu9C40YfQuNGPINC60YDQuNCy0YvRhSDQtNC+0LbQuNGC0LjRjyDQvNC10LbQtNGDINCz0YDRg9C/0L/QsNC80LggKNC/0L4g0L3QsNGA0YPRiNC10L3QuNGP0Lwg0YDQtdGH0LgpINC30L3QsNGH0LjQvNGLDQoNCj4g0JrRgNC40LLRi9C1INC00LvRjyDQs9GA0YPQv9C/LCDQvtGC0LvQuNGH0LDRjtGJ0LjQtdGB0Y8g0L/QviDQsdC40L3QsNGA0L3QvtC5INC/0LXRgNC10LzQtdC90L3QvtC5ICLQv9C+0LsiDQoNCmBgYHtyfQ0Ka21fZ2VuIDwtIHN1cnZmaXQodGltZV9zdXJ2IH4gZ2VuLCBkYXRhPXN1cnZfZGF0YSkNCiMgcGxvdChrbV9nZW4sIGx0eT1jKDEsIDIpKQ0KYXV0b3Bsb3Qoa21fZ2VuKQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoa21fZ2VuLCBwcmludC5ybWVhbiA9IFRSVUUpDQpgYGANCtCU0LvRjyDQvNGD0LbRgdC60L7Qs9C+INC/0L7Qu9CwINGB0YDQtdC00L3QtdC1INCy0YDQtdC80Y8g0LLRi9C20LjQstCw0L3QuNGPICjQsiDQtNC90Y/RhSkg0YDQsNCy0L3QviA3Ni41ICjRg9GB0LXRh9C10L3QvdC+0LUg0YHRgNC10LTQvdC10LUpLCDQvNC10LTQuNCw0L3QvdC+0LUgLS0gNzguDQrQlNC70Y8g0LbQtdC90YHQutC+0LPQviDQv9C+0LvQsCDRgdGA0LXQtNC90LXQtSAtLSA3My43LCDQvNC10LTQuNCw0L3QvdC+0LUgLS0g0YLQsNC60LbQtSA3OC4NCg0KJEhfMDogaF8xKHQpID0gaF8yKHQpID0gLi4uID0gaF9uKHQpJCAgDQokSF8xOiBoX2kodF8wKSBcbmVxIGhfaih0XzApJCDRhdC+0YLRjyDQsdGLINC00LvRjyDQvtC00L3QvtC5INC/0LDRgNGLICppLCBqKiDQuCAkdF8wJA0KYGBge3J9DQpzdXJ2ZGlmZih0aW1lX3N1cnYgfiBnZW4sIGRhdGE9c3Vydl9kYXRhKQ0KYGBgDQoqcCA9IDAuMSosINGA0LDQt9C70LjRh9C40Y8g0LrRgNC40LLRi9GFINC00L7QttC40YLQuNGPINC80LXQttC00YMg0L/QvtC70LDQvNC4INC90LUg0LfQvdCw0YfQuNC80Ysg0L3QsCDRg9GA0L7QstC90LUgKjAuMSA+IDAuMDUqDQoNCj4g0JrRgNC40LLRi9C1INCa0LDQv9C70LDQvdCwLdCc0LXQudC10YDQsCDQv9C+INC00LvQuNGC0LXQu9GM0L3QvtGB0YLQuCDQsdC10LfRgNC10YbQuNC00LjQstC90L7Qs9C+INC/0LXRgNC40L7QtNCwDQoNCmBgYHtyfQ0KcmVsX3N1cnYgPC0gU3VydihzdXJ2X2RhdGEkcmVsYXBzZV9mcmVlLCBldmVudCA9IHN1cnZfZGF0YSRyZWxhcHNlX2ZyZWUuYykNCmttX2ZpdC4yIDwtIHN1cnZmaXQocmVsX3N1cnYgfiAxLCBkYXRhPXN1cnZfZGF0YSkNCg0KIyBzdW1tYXJ5KGttX2ZpdC4yKQ0KIyBwbG90KGttX2ZpdC4yKQ0KYXV0b3Bsb3Qoa21fZml0LjIpDQpgYGANCg0KDQpgYGB7cn0NCmhpc3Qoc3Vydl9kYXRhJHJlbGFwc2VfZnJlZSkNCmBgYA0KDQpgYGB7cn0NCnByaW50KGttX2ZpdC4yLCBwcmludC5ybWVhbiA9IFRSVUUpDQpgYGANCtCc0LXQtNC40LDQvdC90L7QtSDQt9C90LDRh9C10L3QuNC1INCx0LXQt9GA0LXRhtC40LTQuNCy0L3QvtCz0L4g0L/QtdGA0LjQvtC00LAg0LIg0LTQvdGP0YUg0YHQvtGB0YLQsNCy0LvRj9C10YIgMTUwLCDRgtC+0LPQtNCwINC60LDQuiDRg9GB0LXRh9GR0L3QvdC+0LUg0YHRgNC10LTQvdC10LUgLS0gOTU1LjQg0LTQvdGPLg0KDQoNCj4g0JrRgNC40LLRi9C1INC00LvRjyDQs9GA0YPQv9C/LCDQvtGC0LvQuNGH0LDRjtGJ0LjQtdGB0Y8g0L/QviDQutCw0YLQtdCz0L7RgNC40LDQu9GM0L3QvtC5INC/0LXRgNC10LzQtdC90L3QvtC5ICLRgNC10YfQtdCy0YvQtSDQvdCw0YDRg9GI0LXQvdC40Y8iDQoNCmBgYHtyfQ0Ka21fc3BlZWNoLjIgPC0gc3VydmZpdChyZWxfc3VydiB+IHNwZWVjaF9kaXNvcmRlcnMsIGRhdGE9c3Vydl9kYXRhKQ0KIyBwbG90KGttX3NwZWVjaC4yLCBsdHk9c2VxKDAsIDQpKQ0KYXV0b3Bsb3Qoa21fc3BlZWNoLjIpDQpgYGANCg0KYGBge3J9DQpwcmludChrbV9zcGVlY2guMiwgcHJpbnQucm1lYW4gPSBUUlVFKQ0KYGBgDQrQldGB0LvQuCDQvdC1INC+0LHRgNCw0YnQsNGC0Ywg0LLQvdC40LzQsNC90LjRjyDQvdCwINGC0LUg0LPRgNGD0L/Qv9GLLCDQs9C00LUg0LzQsNC70L4g0L3QsNCx0LvRjtC00LXQvdC40LkgKDEsIDQpINC4INC/0L7RgtC+0LzRgyDRgdC70L7QttC90L4g0LLRgdC10YDRjNC10Lcg0LHRgNCw0YLRjCDRjdGC0L4g0LIg0YDQsNGB0YfQtdGCLCDRgtC+INC00LvRjyDQs9GA0YPQv9C/IDAsIDIsIDMg0YPRgdC10YfQtdC90L3Ri9C1INGB0YDQtdC00L3QuNC1INGB0LjQu9GM0L3QviDQvtGC0LvQuNGH0LDRjtGC0YHRjzog0YDQsNC30L3QuNGG0LAg0LzQtdC20LTRgyDQvdC10LrQvtGC0L7RgNGL0LzQuCDQuNC3INC90LjRhSAzLTUg0YDQsNC3LiDQnNC10LTQuNCw0L3QsCDQs9GA0YPQv9C/0YsgMSDRgtCw0LrQttC1INC90LDQvNC90L7Qs9C+INCx0L7Qu9GM0YjQtSDQv9GA0LjQvNC10YDQvdC+INGA0LDQstC90YvRhSDQvNC10LTQuNCw0L0g0LPRgNGD0L/QvyAyINC4IDMuDQoNCg0KJEhfMDogaF8xKHQpID0gaF8yKHQpID0gLi4uID0gaF9uKHQpJCAgDQokSF8xOiBoX2kodF8wKSBcbmVxIGhfaih0XzApJCDRhdC+0YLRjyDQsdGLINC00LvRjyDQvtC00L3QvtC5INC/0LDRgNGLICppLCBqKiDQuCAkdF8wJA0KYGBge3J9DQpzdXJ2ZGlmZihyZWxfc3VydiB+IHNwZWVjaF9kaXNvcmRlcnMsIGRhdGE9c3Vydl9kYXRhKQ0KYGBgDQoqcCA9IDAuMDEqLCDRgNCw0LfQu9C40YfQuNGPINC60YDQuNCy0YvRhSDQtNC+0LbQuNGC0LjRjyDQvNC10LbQtNGDINCz0YDRg9C/0L/QsNC80Lgg0LfQvdCw0YfQuNC80YssINGC0LDQuiDQutCw0Log0L3Rg9C70LXQstCw0Y8g0LPQuNC/0L7RgtC10LfQsCDQviDRgNCw0LLQtdC90YHRgtCy0LUg0YTRg9C90LrRhtC40Lkg0LjQvdGC0LXQvdGB0LjQstC90L7RgdGC0Lgg0LTQu9GPINGA0LDQt9C90YvRhSDQs9GA0YPQv9C/INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8uDQoNCj4g0JrRgNC40LLRi9C1INC00LvRjyDQs9GA0YPQv9C/LCDQvtGC0LvQuNGH0LDRjtGJ0LjQtdGB0Y8g0L/QviDQsdC40L3QsNGA0L3QvtC5INC/0LXRgNC10LzQtdC90L3QvtC5ICLQv9C+0LsiDQoNCmBgYHtyfQ0Ka21fZ2VuLjIgPC0gc3VydmZpdChyZWxfc3VydiB+IGdlbiwgZGF0YT1zdXJ2X2RhdGEpDQojIHBsb3Qoa21fZ2VuLjIsIGx0eT1jKDEsIDIpKQ0KYXV0b3Bsb3Qoa21fZ2VuLjIpDQpgYGANCg0KYGBge3J9DQpwcmludChrbV9nZW4uMiwgcHJpbnQucm1lYW4gPSBUUlVFKQ0KYGBgDQrQnNC+0LbQvdC+INC70LjRiNGMINC30LDQvNC10YLQuNGC0Ywg0LfQvdCw0YfQuNGC0LXQu9GM0L3Rg9GOINGA0LDQt9C90LjRhtGDINC80LXQtNC40LDQvSDQtNC70Y8g0L7QsdC+0LjRhSDQv9C+0LvQvtCyOiDQv9C+0YfRgtC4INCyIDIg0YDQsNC30LAg0LTQu9C40L3QvdC10LUg0LHQtdC30YDQtdGG0LXQtNC40LLQvdGL0Lkg0L/QtdGA0LjQvtC0INGDINC/0YDQtdC00YHRgtCw0LLQuNGC0LXQu9GM0L3QuNGGINC20LXQvdGB0LrQvtCz0L4g0L/QvtC70LAsINCyINGD0YHQtdGH0LXQvdC90YvRhSDRgdGA0LXQtNC90LjRhSDRgtCw0LrQvtC5INGA0LDQt9C90LjRhtGLINC90LUg0L3QsNCx0LvRjtC00LDQtdGC0YHRjy4NCg0KJEhfMDogaF8xKHQpID0gaF8yKHQpID0gLi4uID0gaF9uKHQpJCAgDQokSF8xOiBoX2kodF8wKSBcbmVxIGhfaih0XzApJCDRhdC+0YLRjyDQsdGLINC00LvRjyDQvtC00L3QvtC5INC/0LDRgNGLICppLCBqKiDQuCAkdF8wJA0KYGBge3J9DQpzdXJ2ZGlmZihyZWxfc3VydiB+IGdlbiwgZGF0YT1zdXJ2X2RhdGEpDQpgYGANCtCg0LDQt9C70LjRh9C40Y8g0LrRgNC40LLRi9GFINC00L7QttC40YLQuNGPINC80LXQttC00YMg0L/QvtC70LDQvNC4INC90LUg0LfQvdCw0YfQuNC80YssINGC0LDQuiDQutCw0Log0L3Rg9C70LXQstCw0Y8g0LPQuNC/0L7RgtC10LfQsCDQviDRgNCw0LLQtdC90YHRgtCy0LUg0LjQvdGC0LXQvdGB0LjQstC90L7RgdGC0LXQuSDQtNC70Y8g0YDQsNC30L3Ri9GFINCz0YDRg9C/0L8g0L3QtSDQvtGC0LLQtdGA0LPQsNC10YLRgdGPINGBICpwID0gMSouDQoNCg0KPiDQoNC10LPRgNC10YHRgdC40L7QvdC90LDRjyDQvNC+0LTQtdC70Ywg0JrQvtC60YHQsC4g0JLQu9C40Y/QvdC40LUg0LrQvtCy0LDRgNC40LDRgtGLDQoNCmBgYHtyfQ0Kc3VtbWFyeShjb3hwaChTdXJ2KHRpbWUsIGV2ZW50ID0gdGltZS5jKSB+IGthcm4sIGRhdGE9c3Vydl9kYXRhKSkNCmBgYA0K0J/QvtC70YPRh9C10L3QvdGL0LUg0LTQvtCy0LXRgNC40YLQtdC70YzQvdGL0LUg0YPRgNC+0LLQvdC4INCy0LXRgNC+0Y/RgtC90L7RgdGC0Lgg0L/QvtGA0Y/QtNC60LAgPDJlLTE2INC/0L7Qt9Cy0L7Qu9GP0Y7RgiDQvtGC0LLQtdGA0LPQvdGD0YLRjCDQs9C40L/QvtGC0LXQt9GDINC+INC90LXQt9C90LDRh9C40LzQvtGB0YLQuCDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0LAsINGC0L4g0LXRgdGC0Ywg0L4g0YDQsNCy0LXQvdGB0YLQstC1INC60L7RjdGE0YTQuNGG0LjQtdC90YLQsCDQvdGD0LvRji4g0KLQsNC60LjQvCDQvtCx0YDQsNC30L7QvCwg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQvtGC0LvQuNGH0LXQvSDQvtGCINC90YPQu9GPLCDQstC70LjRj9C90LjQtSDQutC+0LLQsNGA0LjQsNGC0YsgKNC+0LHRidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1INC/0L4g0JrQsNGA0L3QvtCy0YHQutC+0LzRgykg0L3QsCDQstGL0LbQuNCy0LDQtdC80L7RgdGC0YwgKNCyINC00L3Rj9GFKSDQt9C90LDRh9C40LzQvi4NCg0KYGBge3J9DQpzdW1tYXJ5KGNveHBoKFN1cnYocmVsYXBzZV9mcmVlLCBldmVudCA9IHJlbGFwc2VfZnJlZS5jKSB+IGthcm4sIGRhdGE9c3Vydl9kYXRhKSkNCmBgYA0KDQrQn9C+0LvRg9GH0LXQvdC90YvQtSBwLnZhbHVlcywg0LjQvNC10Y7RidC40LUg0L/QvtGA0Y/QtNC+0LogZS0wNiwg0L/QvtC30LLQvtC70Y/RjtGCINC+0YLQstC10YDQs9C90YPRgtGMINCz0LjQv9C+0YLQtdC30YMg0L4g0L3QtdC30L3QsNGH0LjQvNC+0YHRgtC4INC60L7RjdGE0YTQuNGG0LjQtdC90YLQsCwg0YLQviDQtdGB0YLRjCDQviDRgNCw0LLQtdC90YHRgtCy0LUg0LrQvtGN0YTRhNC40YbQuNC10L3RgtCwINC90YPQu9GOLiDQotCw0LrQuNC8INC+0LHRgNCw0LfQvtC8LCDQutC+0Y3RhNGE0LjRhtC40LXQvdGCINC+0YLQu9C40YfQtdC9INC+0YIg0L3Rg9C70Y8sINCy0LvQuNGP0L3QuNC1INC60L7QstCw0YDQuNCw0YLRiyDQvdCwINC00LvQuNGC0LXQu9GM0L3QvtGB0YLRjCDQsdC10LfRgNC10YbQuNC00LjQstC90L7Qs9C+INC/0LXRgNC40L7QtNCwINC30L3QsNGH0LjQvNC+Lg0KDQoNCmBgYHtyfSANCnJobyA8LSBzdW0oc3Vydl9kYXRhJHRpbWUuYykgLyBzdW0oc3Vydl9kYXRhJHRpbWUpOyByaG8NCmBgYA0KDQpgYGB7cn0NCmZpdEtNIDwtIHN1cnZmaXQoU3Vydih0aW1lLCBldmVudD10aW1lLmMpfjEsIGRhdGE9c3Vydl9kYXRhKQ0KcGxvdChmaXRLTSwgbWFyay50aW1lID0gRkFMU0UsIGNvbD0xLCBjb25mLmludCA9IEZBTFNFLCBsdHk9MikNCmN1cnZlKGV4cCgtcmhvKngpLCBmcm9tPTAsIHRvPW1heChzdXJ2X2RhdGEkdGltZSksIGFkZD1UUlVFLCBjb2w9MikNCmBgYA0KDQo=