postop_data<-readr::read_csv(file = "postop_data_cleaned.csv")
retropostion_data<-postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,POSITION) %>% separate(POSITION,into=c("N_POSITION","T_POSITION"),sep='-')

RELATION WITH RETROPOSITION

Cart tree for N_RETROPOSITION_MM

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

rpart.rules(tree)

Cart tree for T_RETROPOSITION_MM

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

rpart.rules(tree)

CHECK DISTRIBUTION for RETROPOSITION

Media and Standard deviation and 95% CI


estimate_position<-postop_data %>% select(T_RETROPOSITION_MM,N_RETROPOSITION_MM) %>% 
  reshape2::melt() %>% 
  group_by(variable) %>% 
  summarise(mean=mean(value),sd=sd(value))
No id variables; using all as measure variables
ci_t_position<-t.test(postop_data$T_RETROPOSITION_MM,) %>% broom::tidy() %>% select(conf.low,conf.high)
ci_n_position<-t.test(postop_data$N_RETROPOSITION_MM,) %>% broom::tidy() %>% select(conf.low,conf.high)

cbind(estimate_position,rbind(ci_t_position,ci_n_position))

Histogram

postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM) %>% reshape2::melt() %>%
  ggplot()+
  facet_wrap(~variable)+
  geom_histogram(aes(x=value),fill="skyblue",color="gray")+
  theme_bw()
No id variables; using all as measure variables

Q-Q Plots

The result of using Shapiro’s Normality test is also annotated in the plots.

shapiro_N_RETRO<-shapiro.test(postop_data$N_RETROPOSITION_MM) 
shapiro_T_RETRO <-shapiro.test(postop_data$T_RETROPOSITION_MM) 

qq_n_plot<-qplot(sample= postop_data$N_RETROPOSITION_MM,color="", main=paste0("Distribution of N_RETROPOSITION_MM\n","p_value=",shapiro_N_RETRO$p.value))+theme_bw()

qq_t_plot<-qplot(sample= postop_data$T_RETROPOSITION_MM,color="", main=paste0("Distribution of T_RETROPOSITION_MM\n","p_value=",shapiro_T_RETRO$p.value))+theme_bw()

#plotly::ggplotly(qq_n_plot)
#plotly::ggplotly(qq_t_plot)

gridExtra::grid.arrange(qq_n_plot,qq_t_plot,ncol=2,nrow=1)

Discrimnated by Eyes

postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,EYE) %>% reshape2::melt() %>%
  ggplot()+
  facet_grid(variable~EYE)+
  geom_histogram(aes(x=value),fill="skyblue",color="gray")+
  theme_bw()
Using EYE as id variables


nod_data<-postop_data %>% filter (EYE=="OD") %>% select(N_RETROPOSITION_MM) %>% unlist()
nos_data<-postop_data %>% filter (EYE=="OS") %>% select(N_RETROPOSITION_MM) %>% unlist()
tod_data<-postop_data %>% filter (EYE=="OD") %>% select(T_RETROPOSITION_MM) %>% unlist()
tos_data<-postop_data %>% filter (EYE=="OS") %>% select(T_RETROPOSITION_MM) %>% unlist()

shapiro_N_RETRO_OD <- shapiro.test(nod_data) 
shapiro_N_RETRO_OS <- shapiro.test(nos_data) 
shapiro_T_RETRO_OD <- shapiro.test(tod_data) 
shapiro_T_RETRO_OS <- shapiro.test(tos_data) 

nod_plot<-qplot(sample= nod_data, 
      color="", 
      main= paste0("Distribution of N_RETROPOSITION_MM for OD\n","shapiro p_value=",
               shapiro_N_RETRO_OD$p.value))+
        theme_bw()

nos_plot<-qplot(sample=nos_data,
      color="", 
      main=paste0("Distribution of N_RETROPOSITION_MM for OS\n","shapiro p_value=",
                  shapiro_N_RETRO_OS$p.value))+theme_bw()

tod_plot<-qplot(sample=tod_data, 
      color="", 
      main= paste0("Distribution of T_RETROPOSITION_MM for OD\n","shapiro p_value=",
               shapiro_T_RETRO_OD$p.value))+
        theme_bw()

tos_plot<-qplot(sample= tos_data,
      color="", 
      main=paste0("Distribution of T_RETROPOSITION_MM for OS\n","shapiro p_value=",
                  shapiro_T_RETRO_OS$p.value))+theme_bw()

gridExtra::grid.arrange(tos_plot,tod_plot,nod_plot,nos_plot)

Discriminated by Gender

postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,SEX) %>% reshape2::melt() %>%
  ggplot()+
  facet_grid(variable~SEX)+
  geom_histogram(aes(x=value),fill="skyblue",color="gray")+
  theme_bw()
Using SEX as id variables

nf_data<-postop_data %>% filter (SEX=="F") %>% select(N_RETROPOSITION_MM) %>% unlist()
nm_data<-postop_data %>% filter (SEX=="M") %>% select(N_RETROPOSITION_MM) %>% unlist()
tf_data<-postop_data %>% filter (SEX=="F") %>% select(T_RETROPOSITION_MM) %>% unlist()
tm_data<-postop_data %>% filter (SEX=="M") %>% select(T_RETROPOSITION_MM) %>% unlist()

shapiro_N_RETRO_F <- shapiro.test(nf_data) 
shapiro_N_RETRO_M <- shapiro.test(nm_data) 
shapiro_T_RETRO_F <- shapiro.test(tf_data) 
shapiro_T_RETRO_M <- shapiro.test(tm_data) 


nf_plot<-qplot(sample= nf_data, 
      color="", 
      main= paste0("Distribution of N_RETROPOSITION_MM for F\n","shapiro p_value=",
               shapiro_N_RETRO_F$p.value))+
        theme_bw()

nm_plot<-qplot(sample= nm_data,
      color="", 
      main=paste0("Distribution of N_RETROPOSITION_MM for M\n","shapiro p_value=",
                  shapiro_N_RETRO_M$p.value))+theme_bw()

tf_plot<-qplot(sample= tf_data, 
      color="", 
      main= paste0("Distribution of T_RETROPOSITION_MM for F\n","shapiro p_value=",
               shapiro_T_RETRO_F$p.value))+
        theme_bw()

tm_plot<-qplot(sample= tm_data,
      color="", 
      main=paste0("Distribution of T_RETROPOSITION_MM for M\n","shapiro p_value=",
                  shapiro_T_RETRO_M$p.value))+theme_bw()

gridExtra::grid.arrange(tf_plot,tm_plot,nf_plot,nm_plot)

Discriminated by IOL MODEL


postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% reshape2::melt() %>%
  ggplot()+
  facet_grid(variable~IOL_MODEL_NEW)+
  geom_histogram(aes(x=value),fill="skyblue",color="gray")+
  theme_bw()
Using IOL_MODEL_NEW as id variables

postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% reshape2::melt() %>%
  ggplot()+
  facet_grid(variable~IOL_MODEL_NEW)+
  geom_qq(aes(sample=value),fill="skyblue",color="red")+
  theme_bw()
Using IOL_MODEL_NEW as id variables

Saphiro_test for T_RETROPOSITION_NN

postop_data %>% select(T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% 
  group_by(IOL_MODEL_NEW) %>% 
  nest()  %>%
  mutate(saphiro_test=purrr::map(data, ~{shapiro.test(.x$T_RETROPOSITION_MM)%>% broom::tidy()} )  ) %>% select(-data)%>% unnest(cols = c("saphiro_test"))

Saphiro_test for N_RETROPOSITION_NN

postop_data %>% select(N_RETROPOSITION_MM,IOL_MODEL_NEW) %>% 
  group_by(IOL_MODEL_NEW) %>% 
  nest()  %>%
  mutate(saphiro_test=purrr::map(data, ~{shapiro.test(.x$N_RETROPOSITION_MM)%>% broom::tidy()} )  ) %>% select(-data)%>% unnest(cols = c("saphiro_test"))

HYPOTHESIS TESTING

By EYES

Check if significant differences exist between OD and OS for N_RETROPOSITION_MM and T_RETROPOSITION_MM

rbind(
  t.test(tos_data,tod_data) %>% broom::tidy() %>% mutate(RETROPOSITION="T"), 
  t.test(nos_data,nod_data) %>% broom::tidy() %>% mutate(RETROPOSITION="N")
) %>% select(RETROPOSITION,p.value,method, alternative, conf.low, conf.high)

By GENDER

Check if significant differences exist between F and M for N_RETROPOSITION_MM and T_RETROPOSITION_MM

rbind(
  t.test(tf_data,tm_data) %>% broom::tidy() %>% mutate(RETROPOSITION="T"), 
  t.test(nf_data,nm_data) %>% broom::tidy() %>% mutate(RETROPOSITION="N")
) %>% select(RETROPOSITION,p.value,method, alternative, conf.low, conf.high)

By IOL MODELS

We use ONE WAY ANOVA instead of T-test paired

nretro_model<-postop_data %>% select(N_RETROPOSITION_MM,IOL_MODEL_NEW) %>% 
  group_by(IOL_MODEL_NEW)

anova_nretro<-oneway.test(N_RETROPOSITION_MM~IOL_MODEL_NEW,data=nretro_model) %>% broom::tidy()
Multiple parameters; naming those columns num.df, denom.df
anova_nretro$RETROPOSITION_MM <- "N"

tretro_model<-postop_data %>% select(T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% 
  group_by(IOL_MODEL_NEW)

anova_tretro<-oneway.test(T_RETROPOSITION_MM~IOL_MODEL_NEW,data=tretro_model) %>%broom::tidy()
Multiple parameters; naming those columns num.df, denom.df
anova_tretro$RETROPOSITION_MM <- "T"

rbind(anova_nretro,anova_tretro) %>% select(RETROPOSITION_MM,method,p.value)

CONCLUSIONS

  1. N_RETROPOSITION_MM (N_RETRO) AND T_RETROPOSITION_MM (T_RETRO) variables are clearly related with the POSITION variable in the dataset. A value. (See CART Trees). A value of N_RETRO > 0.41 and T_RETRO >0.38 is related with CP class in POSITION.
  2. Both N_RETRO and T_RETRO follow a normal distribution with mean 0.43 and 0.42, respectively. (see media, sd and CI)
  3. Grouping by GENDER, EYES and IOL_MODEL also show a normal distribution according to qqplots, histograms and Saphiro tests.
  4. T and one-way ANOVA tests carried out over all the groups show there is no enough evidence in the data that indicate GENDER, EYES and IOL_MODEL have influence in the value of T_RETRO and N_RETRO. (see p.value) and consequently the POSTION.
  5. More experiments should be conducted to get more evidence.
LS0tCnRpdGxlOiAiSVogSUNMIFBPU0lUSU9OIEFOQUxZU0lTIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgpgYGB7cn0KcG9zdG9wX2RhdGE8LXJlYWRyOjpyZWFkX2NzdihmaWxlID0gInBvc3RvcF9kYXRhX2NsZWFuZWQuY3N2IikKYGBgCgpgYGB7cn0KcmV0cm9wb3N0aW9uX2RhdGE8LXBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxQT1NJVElPTikgJT4lIHNlcGFyYXRlKFBPU0lUSU9OLGludG89YygiTl9QT1NJVElPTiIsIlRfUE9TSVRJT04iKSxzZXA9Jy0nKQpgYGAKIyAgUkVMQVRJT04gV0lUSCBSRVRST1BPU0lUSU9OCiMjIENhcnQgdHJlZSBmb3IgTl9SRVRST1BPU0lUSU9OX01NCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxNSkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKYGBgCgojIyBDYXJ0IHRyZWUgZm9yIFRfUkVUUk9QT1NJVElPTl9NTQpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KFRfUE9TSVRJT05+LixkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gOCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKYGBgCgoKCiMgQ0hFQ0sgRElTVFJJQlVUSU9OIGZvciBSRVRST1BPU0lUSU9OCiMjIE1lZGlhIGFuZCBTdGFuZGFyZCBkZXZpYXRpb24gYW5kIDk1JSBDSQoKCmBgYHtyfQoKZXN0aW1hdGVfcG9zaXRpb248LXBvc3RvcF9kYXRhICU+JSBzZWxlY3QoVF9SRVRST1BPU0lUSU9OX01NLE5fUkVUUk9QT1NJVElPTl9NTSkgJT4lIAogIHJlc2hhcGUyOjptZWx0KCkgJT4lIAogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW49bWVhbih2YWx1ZSksc2Q9c2QodmFsdWUpKQoKY2lfdF9wb3NpdGlvbjwtdC50ZXN0KHBvc3RvcF9kYXRhJFRfUkVUUk9QT1NJVElPTl9NTSwpICU+JSBicm9vbTo6dGlkeSgpICU+JSBzZWxlY3QoY29uZi5sb3csY29uZi5oaWdoKQpjaV9uX3Bvc2l0aW9uPC10LnRlc3QocG9zdG9wX2RhdGEkTl9SRVRST1BPU0lUSU9OX01NLCkgJT4lIGJyb29tOjp0aWR5KCkgJT4lIHNlbGVjdChjb25mLmxvdyxjb25mLmhpZ2gpCgpjYmluZChlc3RpbWF0ZV9wb3NpdGlvbixyYmluZChjaV90X3Bvc2l0aW9uLGNpX25fcG9zaXRpb24pKQpgYGAKCiMjIEhpc3RvZ3JhbSAKCmBgYHtyfQpwb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxUX1JFVFJPUE9TSVRJT05fTU0pICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X3dyYXAofnZhcmlhYmxlKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYAojIyBRLVEgUGxvdHMKClRoZSByZXN1bHQgb2YgdXNpbmcgU2hhcGlybydzIE5vcm1hbGl0eSB0ZXN0IGlzIGFsc28gYW5ub3RhdGVkIGluIHRoZSBwbG90cy4KCmBgYHtyfQpzaGFwaXJvX05fUkVUUk88LXNoYXBpcm8udGVzdChwb3N0b3BfZGF0YSROX1JFVFJPUE9TSVRJT05fTU0pIApzaGFwaXJvX1RfUkVUUk8gPC1zaGFwaXJvLnRlc3QocG9zdG9wX2RhdGEkVF9SRVRST1BPU0lUSU9OX01NKSAKCnFxX25fcGxvdDwtcXBsb3Qoc2FtcGxlPSBwb3N0b3BfZGF0YSROX1JFVFJPUE9TSVRJT05fTU0sY29sb3I9IiIsIG1haW49cGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NXG4iLCJwX3ZhbHVlPSIsc2hhcGlyb19OX1JFVFJPJHAudmFsdWUpKSt0aGVtZV9idygpCgpxcV90X3Bsb3Q8LXFwbG90KHNhbXBsZT0gcG9zdG9wX2RhdGEkVF9SRVRST1BPU0lUSU9OX01NLGNvbG9yPSIiLCBtYWluPXBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIFRfUkVUUk9QT1NJVElPTl9NTVxuIiwicF92YWx1ZT0iLHNoYXBpcm9fVF9SRVRSTyRwLnZhbHVlKSkrdGhlbWVfYncoKQoKI3Bsb3RseTo6Z2dwbG90bHkocXFfbl9wbG90KQojcGxvdGx5OjpnZ3Bsb3RseShxcV90X3Bsb3QpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShxcV9uX3Bsb3QscXFfdF9wbG90LG5jb2w9Mixucm93PTEpCmBgYAoKIyMgRGlzY3JpbW5hdGVkIGJ5IEV5ZXMKYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxFWUUpICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X2dyaWQodmFyaWFibGV+RVlFKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYApgYGB7ciBmaWcud2lkdGg9MTJ9Cgpub2RfZGF0YTwtcG9zdG9wX2RhdGEgJT4lIGZpbHRlciAoRVlFPT0iT0QiKSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSkgJT4lIHVubGlzdCgpCm5vc19kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChFWUU9PSJPUyIpICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NKSAlPiUgdW5saXN0KCkKdG9kX2RhdGE8LXBvc3RvcF9kYXRhICU+JSBmaWx0ZXIgKEVZRT09Ik9EIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0b3NfZGF0YTwtcG9zdG9wX2RhdGEgJT4lIGZpbHRlciAoRVlFPT0iT1MiKSAlPiUgc2VsZWN0KFRfUkVUUk9QT1NJVElPTl9NTSkgJT4lIHVubGlzdCgpCgpzaGFwaXJvX05fUkVUUk9fT0QgPC0gc2hhcGlyby50ZXN0KG5vZF9kYXRhKSAKc2hhcGlyb19OX1JFVFJPX09TIDwtIHNoYXBpcm8udGVzdChub3NfZGF0YSkgCnNoYXBpcm9fVF9SRVRST19PRCA8LSBzaGFwaXJvLnRlc3QodG9kX2RhdGEpIApzaGFwaXJvX1RfUkVUUk9fT1MgPC0gc2hhcGlyby50ZXN0KHRvc19kYXRhKSAKCm5vZF9wbG90PC1xcGxvdChzYW1wbGU9IG5vZF9kYXRhLCAKICAgICAgY29sb3I9IiIsIAogICAgICBtYWluPSBwYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBOX1JFVFJPUE9TSVRJT05fTU0gZm9yIE9EXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgc2hhcGlyb19OX1JFVFJPX09EJHAudmFsdWUpKSsKICAgICAgICB0aGVtZV9idygpCgpub3NfcGxvdDwtcXBsb3Qoc2FtcGxlPW5vc19kYXRhLAogICAgICBjb2xvcj0iIiwgCiAgICAgIG1haW49cGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NIGZvciBPU1xuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgICAgIHNoYXBpcm9fTl9SRVRST19PUyRwLnZhbHVlKSkrdGhlbWVfYncoKQoKdG9kX3Bsb3Q8LXFwbG90KHNhbXBsZT10b2RfZGF0YSwgCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj0gcGFzdGUwKCJEaXN0cmlidXRpb24gb2YgVF9SRVRST1BPU0lUSU9OX01NIGZvciBPRFxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgIHNoYXBpcm9fVF9SRVRST19PRCRwLnZhbHVlKSkrCiAgICAgICAgdGhlbWVfYncoKQoKdG9zX3Bsb3Q8LXFwbG90KHNhbXBsZT0gdG9zX2RhdGEsCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj1wYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBUX1JFVFJPUE9TSVRJT05fTU0gZm9yIE9TXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgICAgc2hhcGlyb19UX1JFVFJPX09TJHAudmFsdWUpKSt0aGVtZV9idygpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZSh0b3NfcGxvdCx0b2RfcGxvdCxub2RfcGxvdCxub3NfcGxvdCkKCmBgYAoKIyMgRGlzY3JpbWluYXRlZCBieSBHZW5kZXIKYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxTRVgpICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X2dyaWQodmFyaWFibGV+U0VYKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEyfQpuZl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJGIikgJT4lIHNlbGVjdChOX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQpubV9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJNIikgJT4lIHNlbGVjdChOX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0Zl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJGIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0bV9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJNIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQoKc2hhcGlyb19OX1JFVFJPX0YgPC0gc2hhcGlyby50ZXN0KG5mX2RhdGEpIApzaGFwaXJvX05fUkVUUk9fTSA8LSBzaGFwaXJvLnRlc3Qobm1fZGF0YSkgCnNoYXBpcm9fVF9SRVRST19GIDwtIHNoYXBpcm8udGVzdCh0Zl9kYXRhKSAKc2hhcGlyb19UX1JFVFJPX00gPC0gc2hhcGlyby50ZXN0KHRtX2RhdGEpIAoKCm5mX3Bsb3Q8LXFwbG90KHNhbXBsZT0gbmZfZGF0YSwgCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj0gcGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NIGZvciBGXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgc2hhcGlyb19OX1JFVFJPX0YkcC52YWx1ZSkpKwogICAgICAgIHRoZW1lX2J3KCkKCm5tX3Bsb3Q8LXFwbG90KHNhbXBsZT0gbm1fZGF0YSwKICAgICAgY29sb3I9IiIsIAogICAgICBtYWluPXBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIE5fUkVUUk9QT1NJVElPTl9NTSBmb3IgTVxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgICAgIHNoYXBpcm9fTl9SRVRST19NJHAudmFsdWUpKSt0aGVtZV9idygpCgp0Zl9wbG90PC1xcGxvdChzYW1wbGU9IHRmX2RhdGEsIAogICAgICBjb2xvcj0iIiwgCiAgICAgIG1haW49IHBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIFRfUkVUUk9QT1NJVElPTl9NTSBmb3IgRlxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgIHNoYXBpcm9fVF9SRVRST19GJHAudmFsdWUpKSsKICAgICAgICB0aGVtZV9idygpCgp0bV9wbG90PC1xcGxvdChzYW1wbGU9IHRtX2RhdGEsCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj1wYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBUX1JFVFJPUE9TSVRJT05fTU0gZm9yIE1cbiIsInNoYXBpcm8gcF92YWx1ZT0iLAogICAgICAgICAgICAgICAgICBzaGFwaXJvX1RfUkVUUk9fTSRwLnZhbHVlKSkrdGhlbWVfYncoKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UodGZfcGxvdCx0bV9wbG90LG5mX3Bsb3Qsbm1fcGxvdCkKCmBgYAoKIyMgRGlzY3JpbWluYXRlZCBieSBJT0wgTU9ERUwKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9Cgpwb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxUX1JFVFJPUE9TSVRJT05fTU0sSU9MX01PREVMX05FVykgJT4lIHJlc2hhcGUyOjptZWx0KCkgJT4lCiAgZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCh2YXJpYWJsZX5JT0xfTU9ERUxfTkVXKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCgpgYGAKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgcmVzaGFwZTI6Om1lbHQoKSAlPiUKICBnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKHZhcmlhYmxlfklPTF9NT0RFTF9ORVcpKwogIGdlb21fcXEoYWVzKHNhbXBsZT12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9InJlZCIpKwogIHRoZW1lX2J3KCkKYGBgCgojIyMgU2FwaGlyb190ZXN0IGZvciBUX1JFVFJPUE9TSVRJT05fTk4KYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoVF9SRVRST1BPU0lUSU9OX01NLElPTF9NT0RFTF9ORVcpICU+JSAKICBncm91cF9ieShJT0xfTU9ERUxfTkVXKSAlPiUgCiAgbmVzdCgpICAlPiUKICBtdXRhdGUoc2FwaGlyb190ZXN0PXB1cnJyOjptYXAoZGF0YSwgfntzaGFwaXJvLnRlc3QoLngkVF9SRVRST1BPU0lUSU9OX01NKSU+JSBicm9vbTo6dGlkeSgpfSApICApICU+JSBzZWxlY3QoLWRhdGEpJT4lIHVubmVzdChjb2xzID0gYygic2FwaGlyb190ZXN0IikpCmBgYAojIyMgU2FwaGlyb190ZXN0IGZvciBOX1JFVFJPUE9TSVRJT05fTk4KYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLElPTF9NT0RFTF9ORVcpICU+JSAKICBncm91cF9ieShJT0xfTU9ERUxfTkVXKSAlPiUgCiAgbmVzdCgpICAlPiUKICBtdXRhdGUoc2FwaGlyb190ZXN0PXB1cnJyOjptYXAoZGF0YSwgfntzaGFwaXJvLnRlc3QoLngkTl9SRVRST1BPU0lUSU9OX01NKSU+JSBicm9vbTo6dGlkeSgpfSApICApICU+JSBzZWxlY3QoLWRhdGEpJT4lIHVubmVzdChjb2xzID0gYygic2FwaGlyb190ZXN0IikpCmBgYAoKCiMgSFlQT1RIRVNJUyBURVNUSU5HCiMjIEJ5IEVZRVMKQ2hlY2sgaWYgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgZXhpc3QgYmV0d2VlbiBPRCBhbmQgT1MgZm9yIE5fUkVUUk9QT1NJVElPTl9NTSBhbmQgVF9SRVRST1BPU0lUSU9OX01NCmBgYHtyfQpyYmluZCgKICB0LnRlc3QodG9zX2RhdGEsdG9kX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iVCIpLCAKICB0LnRlc3Qobm9zX2RhdGEsbm9kX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iTiIpCikgJT4lIHNlbGVjdChSRVRST1BPU0lUSU9OLHAudmFsdWUsbWV0aG9kLCBhbHRlcm5hdGl2ZSwgY29uZi5sb3csIGNvbmYuaGlnaCkKYGBgCgojIyBCeSBHRU5ERVIKCkNoZWNrIGlmIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGV4aXN0IGJldHdlZW4gRiBhbmQgTSBmb3IgTl9SRVRST1BPU0lUSU9OX01NIGFuZCBUX1JFVFJPUE9TSVRJT05fTU0KYGBge3J9CnJiaW5kKAogIHQudGVzdCh0Zl9kYXRhLHRtX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iVCIpLCAKICB0LnRlc3QobmZfZGF0YSxubV9kYXRhKSAlPiUgYnJvb206OnRpZHkoKSAlPiUgbXV0YXRlKFJFVFJPUE9TSVRJT049Ik4iKQopICU+JSBzZWxlY3QoUkVUUk9QT1NJVElPTixwLnZhbHVlLG1ldGhvZCwgYWx0ZXJuYXRpdmUsIGNvbmYubG93LCBjb25mLmhpZ2gpCmBgYAojIyBCeSBJT0wgTU9ERUxTCldlIHVzZSBPTkUgV0FZIEFOT1ZBIGluc3RlYWQgb2YgVC10ZXN0IHBhaXJlZApgYGB7cn0KbnJldHJvX21vZGVsPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgCiAgZ3JvdXBfYnkoSU9MX01PREVMX05FVykKCmFub3ZhX25yZXRybzwtb25ld2F5LnRlc3QoTl9SRVRST1BPU0lUSU9OX01NfklPTF9NT0RFTF9ORVcsZGF0YT1ucmV0cm9fbW9kZWwpICU+JSBicm9vbTo6dGlkeSgpCmFub3ZhX25yZXRybyRSRVRST1BPU0lUSU9OX01NIDwtICJOIgoKdHJldHJvX21vZGVsPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KFRfUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgCiAgZ3JvdXBfYnkoSU9MX01PREVMX05FVykKCmFub3ZhX3RyZXRybzwtb25ld2F5LnRlc3QoVF9SRVRST1BPU0lUSU9OX01NfklPTF9NT0RFTF9ORVcsZGF0YT10cmV0cm9fbW9kZWwpICU+JWJyb29tOjp0aWR5KCkKYW5vdmFfdHJldHJvJFJFVFJPUE9TSVRJT05fTU0gPC0gIlQiCgpyYmluZChhbm92YV9ucmV0cm8sYW5vdmFfdHJldHJvKSAlPiUgc2VsZWN0KFJFVFJPUE9TSVRJT05fTU0sbWV0aG9kLHAudmFsdWUpCmBgYAojIENPTkNMVVNJT05TCgoxLiBOX1JFVFJPUE9TSVRJT05fTU0gKE5fUkVUUk8pIEFORCBUX1JFVFJPUE9TSVRJT05fTU0gKFRfUkVUUk8pIHZhcmlhYmxlcyBhcmUgY2xlYXJseSByZWxhdGVkIHdpdGggdGhlIFBPU0lUSU9OIHZhcmlhYmxlIGluIHRoZSBkYXRhc2V0LiBBIHZhbHVlLiAoU2VlIENBUlQgVHJlZXMpLiBBIHZhbHVlIG9mIE5fUkVUUk8gPiAwLjQxIGFuZCBUX1JFVFJPID4wLjM4IGlzIHJlbGF0ZWQgd2l0aCBDUCBjbGFzcyBpbiBQT1NJVElPTi4KMi4gQm90aCBOX1JFVFJPIGFuZCBUX1JFVFJPIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBtZWFuIDAuNDMgYW5kIDAuNDIsIHJlc3BlY3RpdmVseS4gKHNlZSBtZWRpYSwgc2QgYW5kIENJKQozLiBHcm91cGluZyBieSBHRU5ERVIsIEVZRVMgYW5kIElPTF9NT0RFTCBhbHNvIHNob3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFjY29yZGluZyB0byBxcXBsb3RzLCBoaXN0b2dyYW1zIGFuZCBTYXBoaXJvIHRlc3RzLgo0LiBUIGFuZCBvbmUtd2F5IEFOT1ZBIHRlc3RzIGNhcnJpZWQgb3V0IG92ZXIgYWxsIHRoZSBncm91cHMgc2hvdyB0aGVyZSBpcyBubyBlbm91Z2ggZXZpZGVuY2UgaW4gdGhlIGRhdGEgdGhhdCBpbmRpY2F0ZSBHRU5ERVIsIEVZRVMgYW5kIElPTF9NT0RFTCBoYXZlIGluZmx1ZW5jZSBpbiB0aGUgdmFsdWUgb2YgVF9SRVRSTyBhbmQgTl9SRVRSTy4gKHNlZSBwLnZhbHVlKSBhbmQgY29uc2VxdWVudGx5IHRoZSBQT1NUSU9OLgo1LiBNb3JlIGV4cGVyaW1lbnRzIHNob3VsZCBiZSBjb25kdWN0ZWQgdG8gZ2V0IG1vcmUgZXZpZGVuY2UuCg==