NASAL
N_RETROPOSITION_MM
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 6 1 0
CP 4 46 0
S 0 0 6
Overall Statistics
Accuracy : 0.9206
95% CI : (0.8244, 0.9737)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.0004041
Kappa : 0.7918
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.60000 0.9787 1.00000
Specificity 0.98113 0.7500 1.00000
Pos Pred Value 0.85714 0.9200 1.00000
Neg Pred Value 0.92857 0.9231 1.00000
Prevalence 0.15873 0.7460 0.09524
Detection Rate 0.09524 0.7302 0.09524
Detection Prevalence 0.11111 0.7937 0.09524
Balanced Accuracy 0.79057 0.8644 1.00000
cbind(id=1:nrow(retropostion_data),retropostion_data,N_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(N_POSITION!=N_POSITION_PREDICTED) %>% select(NAME,N_POSITION,N_POSITION_PREDICTED)
NA
NA
NORM_N_RETROPOSITION_MM
tree<-rpart::rpart(N_POSITION~NORM_N_RETROPOSITION,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 4 0 2
CP 6 47 0
S 0 0 4
Overall Statistics
Accuracy : 0.873
95% CI : (0.765, 0.9435)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.01097
Kappa : 0.6385
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.40000 1.0000 0.66667
Specificity 0.96226 0.6250 1.00000
Pos Pred Value 0.66667 0.8868 1.00000
Neg Pred Value 0.89474 1.0000 0.96610
Prevalence 0.15873 0.7460 0.09524
Detection Rate 0.06349 0.7460 0.06349
Detection Prevalence 0.09524 0.8413 0.06349
Balanced Accuracy 0.68113 0.8125 0.83333
NORM_N_RETRO_HALF_IOL
tree<-rpart::rpart(N_POSITION~NORM_N_RETRO_HALF_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 4 0 3
CP 6 47 0
S 0 0 3
Overall Statistics
Accuracy : 0.8571
95% CI : (0.7461, 0.9325)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.02497
Kappa : 0.5921
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.40000 1.0000 0.50000
Specificity 0.94340 0.6250 1.00000
Pos Pred Value 0.57143 0.8868 1.00000
Neg Pred Value 0.89286 1.0000 0.95000
Prevalence 0.15873 0.7460 0.09524
Detection Rate 0.06349 0.7460 0.04762
Detection Prevalence 0.11111 0.8413 0.04762
Balanced Accuracy 0.67170 0.8125 0.75000
NORM_N_RETRO_IOL
tree<-rpart::rpart(N_POSITION~NORM_N_RETRO_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$N_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 7 2 4
CP 3 45 2
S 0 0 0
Overall Statistics
Accuracy : 0.8254
95% CI : (0.709, 0.9095)
No Information Rate : 0.746
P-Value [Acc > NIR] : 0.09291
Kappa : 0.5346
Mcnemar's Test P-Value : 0.10228
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.7000 0.9574 0.00000
Specificity 0.8868 0.6875 1.00000
Pos Pred Value 0.5385 0.9000 NaN
Neg Pred Value 0.9400 0.8462 0.90476
Prevalence 0.1587 0.7460 0.09524
Detection Rate 0.1111 0.7143 0.00000
Detection Prevalence 0.2063 0.7937 0.00000
Balanced Accuracy 0.7934 0.8225 0.50000
TEMPORAL
T_RETROPOSITION_MM
tree<-rpart::rpart(T_POSITION~T_RETROPOSITION_MM,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
cbind(id=1:nrow(retropostion_data),retropostion_data,T_POSITION_PREDICTED=as.character(preds)) %>% as.data.frame() %>% filter(T_POSITION!=T_POSITION_PREDICTED) %>% select(NAME,T_POSITION,T_POSITION_PREDICTED)
NORM_T_RETROPOSITION
tree<-rpart::rpart(T_POSITION~NORM_T_RETROPOSITION,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 2 1 0
CP 2 48 1
S 2 0 7
Overall Statistics
Accuracy : 0.9048
95% CI : (0.8041, 0.9642)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.007371
Kappa : 0.7261
Mcnemar's Test P-Value : 0.343030
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.33333 0.9796 0.8750
Specificity 0.98246 0.7857 0.9636
Pos Pred Value 0.66667 0.9412 0.7778
Neg Pred Value 0.93333 0.9167 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.03175 0.7619 0.1111
Detection Prevalence 0.04762 0.8095 0.1429
Balanced Accuracy 0.65789 0.8827 0.9193
NORM_T_RETRO_HALF_IOL
tree<-rpart::rpart(T_POSITION~NORM_T_RETRO_HALF_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 0 0 0
CP 4 49 1
S 2 0 7
Overall Statistics
Accuracy : 0.8889
95% CI : (0.7844, 0.9541)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.01881
Kappa : 0.6475
Mcnemar's Test P-Value : 0.07190
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.00000 1.0000 0.8750
Specificity 1.00000 0.6429 0.9636
Pos Pred Value NaN 0.9074 0.7778
Neg Pred Value 0.90476 1.0000 0.9815
Prevalence 0.09524 0.7778 0.1270
Detection Rate 0.00000 0.7778 0.1111
Detection Prevalence 0.00000 0.8571 0.1429
Balanced Accuracy 0.50000 0.8214 0.9193
NORM_T_RETRO_IOL
tree<-rpart::rpart(T_POSITION~NORM_T_RETRO_IOL,data=retropostion_data,control = rpart.control(minsplit = 10))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
preds<-predict(tree,retropostion_data,type = 'class')
caret::confusionMatrix(preds,as.factor(retropostion_data$T_POSITION))
Confusion Matrix and Statistics
Reference
Prediction CA CP S
CA 0 0 0
CP 4 49 5
S 2 0 3
Overall Statistics
Accuracy : 0.8254
95% CI : (0.709, 0.9095)
No Information Rate : 0.7778
P-Value [Acc > NIR] : 0.22809
Kappa : 0.3625
Mcnemar's Test P-Value : 0.01173
Statistics by Class:
Class: CA Class: CP Class: S
Sensitivity 0.00000 1.0000 0.37500
Specificity 1.00000 0.3571 0.96364
Pos Pred Value NaN 0.8448 0.60000
Neg Pred Value 0.90476 1.0000 0.91379
Prevalence 0.09524 0.7778 0.12698
Detection Rate 0.00000 0.7778 0.04762
Detection Prevalence 0.00000 0.9206 0.07937
Balanced Accuracy 0.50000 0.6786 0.66932
LS0tCnRpdGxlOiAiSVogSUNMIFBPU0lUSU9OIEFOQUxZU0lTIChSRVRFU1RJTkcpIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHNraW1yKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFZJTSkKbGlicmFyeShyZWFkcikKbGlicmFyeShycGFydC5wbG90KQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnBvc3RvcF9kYXRhPC1yZWFkcjo6cmVhZF9jc3YoZmlsZSA9ICJwb3N0b3BfZGF0YV9jbGVhbmVkX25vcm1hbGl6ZWQtdmVyc2lvbjUtcmV0ZXN0LmNzdiIpCnJldHJvcG9zdGlvbl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5BTUUsTk9STV9OX1JFVFJPUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST1BPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NJVElPTixOX1JFVFJPUE9TSVRJT05fTU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfUkVUUk9QT1NJVElPTl9NTSxSRVRFU1RfUE9TSVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fVF9SRVRST19IQUxGX0lPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9OX1JFVFJPX0hBTEZfSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX1RfUkVUUk9fSU9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX05fUkVUUk9fSU9MCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAlPiUgZmlsdGVyKCFpcy5uYShSRVRFU1RfUE9TSVRJT04pKSAlPiUgc2VwYXJhdGUoUkVURVNUX1BPU0lUSU9OLGludG89YygiTl9QT1NJVElPTiIsIlRfUE9TSVRJT04iKSxzZXA9Jy0nKSAlPiUgZHJvcF9uYShUX1BPU0lUSU9OKSAlPiUgZHJvcF9uYShOT1JNX1RfUkVUUk9QT1NJVElPTikKCgpyZXRyb3Bvc3Rpb25fZGF0YTwtcmV0cm9wb3N0aW9uX2RhdGEgJT4lIG11dGF0ZShUX1BPU0lUSU9OPWlmZWxzZShUX1BPU0lUSU9OPT0iQ00iLCJDQSIsVF9QT1NJVElPTiksTl9QT1NJVElPTj1pZmVsc2UoTl9QT1NJVElPTj09IkNNIiwiQ0EiLE5fUE9TSVRJT04pKQpyZXRyb3Bvc3Rpb25fZGF0YQpgYGAKCiMgTkFTQUwKIyMgTl9SRVRST1BPU0lUSU9OX01NCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkTl9QT1NJVElPTikpCmNiaW5kKGlkPTE6bnJvdyhyZXRyb3Bvc3Rpb25fZGF0YSkscmV0cm9wb3N0aW9uX2RhdGEsTl9QT1NJVElPTl9QUkVESUNURUQ9YXMuY2hhcmFjdGVyKHByZWRzKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgZmlsdGVyKE5fUE9TSVRJT04hPU5fUE9TSVRJT05fUFJFRElDVEVEKSAlPiUgc2VsZWN0KE5BTUUsTl9QT1NJVElPTixOX1BPU0lUSU9OX1BSRURJQ1RFRCkKCgpgYGAKIyMgTk9STV9OX1JFVFJPUE9TSVRJT05fTU0KYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChOX1BPU0lUSU9Ofk5PUk1fTl9SRVRST1BPU0lUSU9OLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJE5fUE9TSVRJT04pKQpgYGAKCiMjIE5PUk1fTl9SRVRST19IQUxGX0lPTAoKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChOX1BPU0lUSU9Ofk5PUk1fTl9SRVRST19IQUxGX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgojIyBOT1JNX05fUkVUUk9fSU9MCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tk9STV9OX1JFVFJPX0lPTCxkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSROX1BPU0lUSU9OKSkKYGBgCgoKIyBURU1QT1JBTAoKIyMgVF9SRVRST1BPU0lUSU9OX01NCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KFRfUE9TSVRJT05+VF9SRVRST1BPU0lUSU9OX01NLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKCnByZWRzPC1wcmVkaWN0KHRyZWUscmV0cm9wb3N0aW9uX2RhdGEsdHlwZSA9ICdjbGFzcycpCmNhcmV0Ojpjb25mdXNpb25NYXRyaXgocHJlZHMsYXMuZmFjdG9yKHJldHJvcG9zdGlvbl9kYXRhJFRfUE9TSVRJT04pKQpjYmluZChpZD0xOm5yb3cocmV0cm9wb3N0aW9uX2RhdGEpLHJldHJvcG9zdGlvbl9kYXRhLFRfUE9TSVRJT05fUFJFRElDVEVEPWFzLmNoYXJhY3RlcihwcmVkcykpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIGZpbHRlcihUX1BPU0lUSU9OIT1UX1BPU0lUSU9OX1BSRURJQ1RFRCkgJT4lIHNlbGVjdChOQU1FLFRfUE9TSVRJT04sVF9QT1NJVElPTl9QUkVESUNURUQpCmBgYAoKIyMgTk9STV9UX1JFVFJPUE9TSVRJT04KCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5OT1JNX1RfUkVUUk9QT1NJVElPTixkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTApKQpycGFydC5wbG90KHRyZWUsdHlwZT0xLAogICAgICAgICAgIGV4dHJhPTEwMSwgYm94LnBhbGV0dGU9IkduQnUiLAogICAgICAgICAgIGJyYW5jaC5sdHk9Mywgc2hhZG93LmNvbD0iZ3JheSIsIG5uPVRSVUUKICAgICAgICApCnJwYXJ0LnJ1bGVzKHRyZWUpCgpwcmVkczwtcHJlZGljdCh0cmVlLHJldHJvcG9zdGlvbl9kYXRhLHR5cGUgPSAnY2xhc3MnKQpjYXJldDo6Y29uZnVzaW9uTWF0cml4KHByZWRzLGFzLmZhY3RvcihyZXRyb3Bvc3Rpb25fZGF0YSRUX1BPU0lUSU9OKSkKYGBgCgoKIyMgTk9STV9UX1JFVFJPX0hBTEZfSU9MCmBgYHtyfQp0cmVlPC1ycGFydDo6cnBhcnQoVF9QT1NJVElPTn5OT1JNX1RfUkVUUk9fSEFMRl9JT0wsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkVF9QT1NJVElPTikpCmBgYAoKCiMjIE5PUk1fVF9SRVRST19JT0wKYGBge3J9CnRyZWU8LXJwYXJ0OjpycGFydChUX1BPU0lUSU9Ofk5PUk1fVF9SRVRST19JT0wsZGF0YT1yZXRyb3Bvc3Rpb25fZGF0YSxjb250cm9sID0gcnBhcnQuY29udHJvbChtaW5zcGxpdCA9IDEwKSkKcnBhcnQucGxvdCh0cmVlLHR5cGU9MSwKICAgICAgICAgICBleHRyYT0xMDEsIGJveC5wYWxldHRlPSJHbkJ1IiwKICAgICAgICAgICBicmFuY2gubHR5PTMsIHNoYWRvdy5jb2w9ImdyYXkiLCBubj1UUlVFCiAgICAgICAgKQpycGFydC5ydWxlcyh0cmVlKQoKcHJlZHM8LXByZWRpY3QodHJlZSxyZXRyb3Bvc3Rpb25fZGF0YSx0eXBlID0gJ2NsYXNzJykKY2FyZXQ6OmNvbmZ1c2lvbk1hdHJpeChwcmVkcyxhcy5mYWN0b3IocmV0cm9wb3N0aW9uX2RhdGEkVF9QT1NJVElPTikpCmBgYAoK