library(ggplot2)
library(pheatmap)
library(RColorBrewer)
library(tidyverse)
library(ggpubr)
library(ggsignif)
library(openxlsx)
library(viridis)
library(jcolors)
library(stringr)
setwd("//atlas.uni.lux/users/isabel.rosety/GBA/GCase activity/Plots")
Warning: The working directory was changed to //atlas.uni.lux/users/isabel.rosety/GBA/GCase activity/Plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
data  <- read_excel("//atlas.uni.lux/LCSB_Cellular_Biology/16-Our Papers/In Preparation/GBA hMO_Isabel/Figures/Fig1/Partials/B//Quantification/20210910_GCase activity results.xlsx",sheet=3)
dataNBarPlot<-dataN%>%
  group_by(CellLine)%>%
  summarise(Mean = mean(Gcase_activity), sd_rating = sd(Gcase_activity))
Error in group_by(., CellLine) : object 'dataN' not found

Violin Plots


dataN%>%
  ggplot(aes(x = Condition, y=Gcase_activity),ordered=TRUE)+
  #geom_violin( aes(fill=Condition),show.legend = T, trim=T),
  geom_violin( aes(fill=Condition),show.legend = T,scale = "width", trim=F)+
  geom_dotplot(binaxis = "y",stackdir = "center",dotsize=0.8)+
  #scale_fill_manual(values= c("#bdd7e7","#2171b5"),name = "Condition", guide = FALSE)+
    scale_fill_manual(values= alpha(c("#1565C0","#CC0000"),0.75),name = "Condition",guide = "none")+
    theme(legend.key=element_blank()) +
    
  geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
              margin_top=0.5,vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05,  " "=2) ) +
  #facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
       labs(x     ="",
        y     = "Relative GCase activity",
       fill  = "Condition",
      title = "GCase activity") +
  theme_bw() +
  theme(
   axis.line = element_line(colour = 'black', size = 0.5) ,
    axis.title.x = element_blank(),
    axis.text.x = element_text(size=16, color="black"),
    axis.title.y = element_text(size = 16),
    axis.text.y = element_text(size=10, color="black"),
    axis.ticks.y = element_line(),
    axis.ticks.length=unit(.20, "cm"),
    #change legend text font size)
    #legend.key.size = unit(0.7, "cm"),
    #legend.key.width = unit(0.6,"cm"),
    legend.key=element_blank(),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
    plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
    strip.text = element_text(size=12, vjust=0.5),
    strip.background = element_rect(fill="lightgray"),
   # panel.border = element_rect(fill = NA, color = "black"),
    panel.spacing.y = unit(0.8, "lines"),
    strip.switch.pad.wrap=unit(20, "lines"),
    legend.position="right",
    legend.text = element_text(size=17),
    legend.title = element_text(size=19)
    
  )  -> p
  #t<- cowplot::ggdraw(cowplot::add_sub(p, "Wilcox-test, ***p=0.001, **p=0.01, *p=0.05",hjust=-0.2, size=13))
  print(p)
  ##ggsave(paste0(Sys.Date(),"_", names[i], ".pdf"), plot=t)


ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=2.5,width=3)

Cell Lines


dataN%>%
  ggplot(aes(x = Condition, y=Gcase_activity),ordered=TRUE)+
    geom_boxplot(aes(fill=Condition),show.legend = FALSE,width=0.7)+
        #scale_fill_manual(values=c("#2171b5","#B22222","#008B8B"))+  #blue and red
  

scale_fill_manual(values= c("#FFFFFF","#999999"),name = "Condition", guide = "none")+ #guide false will remove the legend for the condition
  #ylim(4,9)+
    #geom_boxplot(width=0.07, fill="white") + 
    geom_point(aes(color=CellLine),size=3,show.legend = T,alpha = 0.5)+
    #scale_color_manual(values = rev(brewer.pal(n=6, name="OrRd")))+
    scale_color_jcolors("pal7")+
    #scale_color_viridis(option = "D", discrete=TRUE)+
    #geom_point(shape = 1,size = 3,colour = "black")+
    theme(legend.key=element_blank()) +
    
  geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
              vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05,  " "=2) ) +
  #facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
       labs(x     ="",
        y     = "Relative GCase activity",
       fill  = "Condition",
      title = "GCase activity") +
  theme_bw() +
  theme(
    axis.line = element_line(colour = 'black', size = 1) ,
    axis.title.x = element_blank(),
    axis.text.x = element_text(size=21, color="black"),
    axis.title.y = element_text(size = 21),
    axis.text.y = element_text(size=15, color="black"),
    axis.ticks.y = element_line(),
    axis.ticks.length=unit(.25, "cm"),
     #change legend text font size)
    #legend.key.size = unit(0.7, "cm"),
    #legend.key.width = unit(0.6,"cm"),
    legend.key=element_blank(),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
    plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
    strip.text = element_text(size=12, vjust=0.5),
    strip.background = element_rect(fill="lightgray"),
   # panel.border = element_rect(fill = NA, color = "black"),
    panel.spacing.y = unit(0.8, "lines"),
    strip.switch.pad.wrap=unit(20, "lines"),
    legend.position="right",
    legend.text = element_text(size=17),
    legend.title = element_text(size=19)
    
  )  -> p

  print(p)


#ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=4)

Bar Plots for all the features one timepoint


dataNBarPlot%>%
  ggplot(aes(x=factor(CellLine, level = c("CTRL1", "CTRL2","CTRL3", "PD1", "PD2","PD3")), y=MeanGCase),ordered=TRUE)+
  #geom_violin( aes(fill=Condition),show.legend = T, trim=T),
  geom_bar(aes(fill=CellLine),stat="summary",position=position_dodge(),colour="black",size=0.3,width=0.8) +
  scale_y_continuous(expand = c(0, 0))+
    scale_fill_manual(values= c("#1565C0", alpha(("#1565C0"),0.7),alpha(("#1565C0"),0.4),"#CC0000", alpha(("#CC0000"),0.5),alpha(("#CC0000"),0.2)),name = "CellLine",guide = "none")+
  geom_errorbar(aes(ymin=MeanGCase, ymax=MeanGCase+sd_rating),width=.2,position=position_dodge(.9), size=0.3)+        # Width of the error bars
    theme(legend.key=element_blank()) +
    
  geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
              margin_top=0.5,vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05,  " "=2) ) +
  #facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
       labs(x     ="",
        y     = "Relative GCase activity",
       fill  = "",
      title = "") +
  theme_bw() +
  theme(
   axis.line = element_line(colour = 'black', size = 0.3) ,
    axis.title.x = element_blank(),
    axis.text.x = element_text(size=7, color="black"),
    axis.title.y = element_text(size = 10),
    axis.text.y = element_text(size=7, color="black"),
    axis.ticks.y = element_line(size=0.3),
    axis.ticks.x = element_line(size=0.3),
    axis.ticks.length=unit(.1, "cm"),
    #change legend text font size)
    #legend.key.size = unit(0.7, "cm"),
    #legend.key.width = unit(0.6,"cm"),
    legend.key=element_blank(),
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
    plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
    strip.text = element_text(size=12, vjust=0.5),
    strip.background = element_rect(fill="lightgray"),
   # panel.border = element_rect(fill = NA, color = "black"),
    panel.spacing.y = unit(0.8, "lines"),
    strip.switch.pad.wrap=unit(20, "lines"),
    legend.position="right",
    legend.text = element_text(size=17),
    legend.title = element_text(size=19)
    
  )  -> p
  #t<- cowplot::ggdraw(cowplot::add_sub(p, "Wilcox-test, ***p=0.001, **p=0.01, *p=0.05",hjust=-0.2, size=13))
  print(p)
  ##ggsave(paste0(Sys.Date(),"_", names[i], ".pdf"), plot=t)


ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=2.5,width=3)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KLS0tDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGhlYXRtYXApDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdnc2lnbmlmKQ0KbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkoamNvbG9ycykNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpgYGB7cn0NCnNldHdkKCIvL2F0bGFzLnVuaS5sdXgvdXNlcnMvaXNhYmVsLnJvc2V0eS9HQkEvR0Nhc2UgYWN0aXZpdHkvUGxvdHMiKQ0KZGF0YSAgPC0gcmVhZF9leGNlbCgiLy9hdGxhcy51bmkubHV4L0xDU0JfQ2VsbHVsYXJfQmlvbG9neS8xNi1PdXIgUGFwZXJzL0luIFByZXBhcmF0aW9uL0dCQSBoTU9fSXNhYmVsL0ZpZ3VyZXMvRmlnMS9QYXJ0aWFscy9CLy9RdWFudGlmaWNhdGlvbi8yMDIxMDkxMF9HQ2FzZSBhY3Rpdml0eSByZXN1bHRzLnhsc3giLHNoZWV0PTMpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI05vcm1hbGl6ZSB0byBtZWFuIG9mIGNvbnRyb2xzIGZvciBvbmUgZmVhdHVyZQ0KZGF0YU4gPC1kYXRhICU+JQ0KICAgICBncm91cF9ieShCYXRjaCwgQ29uZGl0aW9uKSAlPiUNCiAgICAgbXV0YXRlKEdjYXNlX2FjdGl2aXR5PUdjYXNlX2FjdGl2aXR5L21lYW4oZGF0YSRHY2FzZV9hY3Rpdml0eVtkYXRhJENvbmRpdGlvbj09IkNUUkwiXS8xMDAsbmEucm0gPSBUUlVFKSkgDQpkYXRhTkJhclBsb3Q8LWRhdGFOJT4lDQogIGdyb3VwX2J5KENlbGxMaW5lKSU+JQ0KICBzdW1tYXJpc2UoTWVhbkdDYXNlID0gbWVhbihHY2FzZV9hY3Rpdml0eSksIHNkX3JhdGluZyA9IHNkKEdjYXNlX2FjdGl2aXR5KSkNCiN3cml0ZS5jc3YoZGF0YU4sIGZpbGUgPSAnRGF0YSBhcyBQZXJjZW50YWdlIG9mIGNvbnRyb2xzLmNzdicpDQoNCmRhdGFOQmFyUGxvdCAlPiUgDQogICBtdXRhdGUoQ2VsbExpbmUgPSBzdHJfcmVwbGFjZV9hbGwoQ2VsbExpbmUsIA0KICAgICAgICAgICAgcGF0dGVybiA9ICJXVF81NiIsIHJlcGxhY2VtZW50ID0gIkNUUkwxIikpICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIldUXzM5IiwgcmVwbGFjZW1lbnQgPSAiQ1RSTDIiKSkgICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIldUXzY4IiwgcmVwbGFjZW1lbnQgPSAiQ1RSTDMiKSkgJT4lDQogICAgbXV0YXRlKENlbGxMaW5lID0gc3RyX3JlcGxhY2VfYWxsKENlbGxMaW5lLCANCiAgICAgICAgICAgIHBhdHRlcm4gPSAiTXV0XzMwOSIsIHJlcGxhY2VtZW50ID0gIlBEMSIpKSAlPiUNCiAgICBtdXRhdGUoQ2VsbExpbmU9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIk11dF9LVEk2IiwgcmVwbGFjZW1lbnQgPSAiUEQyIikpICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIk11dF9TR08xIiwgcmVwbGFjZW1lbnQgPSAiUEQzIikpIC0+ZGF0YU5CYXJQbG90DQoNCmRhdGFOPC1hcy5kYXRhLmZyYW1lKGRhdGFOKQ0KDQpgYGANCg0KVmlvbGluIFBsb3RzDQpgYGB7cn0NCg0KZGF0YU4lPiUNCiAgZ2dwbG90KGFlcyh4ID0gQ29uZGl0aW9uLCB5PUdjYXNlX2FjdGl2aXR5KSxvcmRlcmVkPVRSVUUpKw0KICAjZ2VvbV92aW9saW4oIGFlcyhmaWxsPUNvbmRpdGlvbiksc2hvdy5sZWdlbmQgPSBULCB0cmltPVQpLA0KICBnZW9tX3Zpb2xpbiggYWVzKGZpbGw9Q29uZGl0aW9uKSxzaG93LmxlZ2VuZCA9IFQsc2NhbGUgPSAid2lkdGgiLCB0cmltPUYpKw0KICBnZW9tX2RvdHBsb3QoYmluYXhpcyA9ICJ5IixzdGFja2RpciA9ICJjZW50ZXIiLGRvdHNpemU9MC44KSsNCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYygiI2JkZDdlNyIsIiMyMTcxYjUiKSxuYW1lID0gIkNvbmRpdGlvbiIsIGd1aWRlID0gRkFMU0UpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYWxwaGEoYygiIzE1NjVDMCIsIiNDQzAwMDAiKSwwLjc1KSxuYW1lID0gIkNvbmRpdGlvbiIsZ3VpZGUgPSAibm9uZSIpKw0KICAgIHRoZW1lKGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArDQogICAgDQogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJDVFJMIiwgIkdCQS1QRCIpKSwgdGVzdD0nd2lsY294LnRlc3QnLA0KICAgICAgICAgICAgICBtYXJnaW5fdG9wPTAuNSx2anVzdD0wLjUsIHNpemU9MC41LCB0ZXh0c2l6ZT05LCBtYXBfc2lnbmlmX2xldmVsPWMoIioqKiI9MC4wMDEsICIqKiI9MC4wMSwgIioiPTAuMDUsICAiICI9MikgKSArDQogICNmYWNldF9ncmlkKH5mY3RfcmVsZXZlbChEYXksICJkMzAiLCJkNjAiKSwgc2NhbGVzPSJmcmVlIikgKw0KICAgICAgIGxhYnMoeCAgICAgPSIiLA0KICAgICAgICB5ICAgICA9ICJSZWxhdGl2ZSBHQ2FzZSBhY3Rpdml0eSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIkdDYXNlIGFjdGl2aXR5IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ2JsYWNrJywgc2l6ZSA9IDAuNSkgLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE2LCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoKSwNCiAgICBheGlzLnRpY2tzLmxlbmd0aD11bml0KC4yMCwgImNtIiksDQogICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIldpbGNveC10ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMiwgc2l6ZT0xMykpDQogIHByaW50KHApDQogICMjZ2dzYXZlKHBhc3RlMChTeXMuRGF0ZSgpLCJfIiwgbmFtZXNbaV0sICIucGRmIiksIHBsb3Q9dCkNCg0KDQpnZ3NhdmUocGFzdGUwKFN5cy5EYXRlKCksIiBHQ2FzZSBhY3Rpdml0eSBESVYzMC5wZGYiKSxoZWlnaHQ9Mi41LHdpZHRoPTMpDQoNCmBgYA0KQ2VsbCBMaW5lcw0KYGBge3J9DQoNCmRhdGFOJT4lDQogIGdncGxvdChhZXMoeCA9IENvbmRpdGlvbiwgeT1HY2FzZV9hY3Rpdml0eSksb3JkZXJlZD1UUlVFKSsNCiAgICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Q29uZGl0aW9uKSxzaG93LmxlZ2VuZCA9IEZBTFNFLHdpZHRoPTAuNykrDQogICAgICAgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzIxNzFiNSIsIiNCMjIyMjIiLCIjMDA4QjhCIikpKyAgI2JsdWUgYW5kIHJlZA0KICANCg0Kc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSBjKCIjRkZGRkZGIiwiIzk5OTk5OSIpLG5hbWUgPSAiQ29uZGl0aW9uIiwgZ3VpZGUgPSAibm9uZSIpKyAjZ3VpZGUgZmFsc2Ugd2lsbCByZW1vdmUgdGhlIGxlZ2VuZCBmb3IgdGhlIGNvbmRpdGlvbg0KICAjeWxpbSg0LDkpKw0KICAgICNnZW9tX2JveHBsb3Qod2lkdGg9MC4wNywgZmlsbD0id2hpdGUiKSArIA0KICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPUNlbGxMaW5lKSxzaXplPTMsc2hvdy5sZWdlbmQgPSBULGFscGhhID0gMC41KSsNCiAgICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihicmV3ZXIucGFsKG49NiwgbmFtZT0iT3JSZCIpKSkrDQogICAgc2NhbGVfY29sb3JfamNvbG9ycygicGFsNyIpKw0KICAgICNzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJEIiwgZGlzY3JldGU9VFJVRSkrDQogICAgI2dlb21fcG9pbnQoc2hhcGUgPSAxLHNpemUgPSAzLGNvbG91ciA9ICJibGFjayIpKw0KICAgIHRoZW1lKGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArDQogICAgDQogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJDVFJMIiwgIkdCQS1QRCIpKSwgdGVzdD0nd2lsY294LnRlc3QnLA0KICAgICAgICAgICAgICB2anVzdD0wLjUsIHNpemU9MC41LCB0ZXh0c2l6ZT05LCBtYXBfc2lnbmlmX2xldmVsPWMoIioqKiI9MC4wMDEsICIqKiI9MC4wMSwgIioiPTAuMDUsICAiICI9MikgKSArDQogICNmYWNldF9ncmlkKH5mY3RfcmVsZXZlbChEYXksICJkMzAiLCJkNjAiKSwgc2NhbGVzPSJmcmVlIikgKw0KICAgICAgIGxhYnMoeCAgICAgPSIiLA0KICAgICAgICB5ICAgICA9ICJSZWxhdGl2ZSBHQ2FzZSBhY3Rpdml0eSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIkdDYXNlIGFjdGl2aXR5IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICdibGFjaycsIHNpemUgPSAxKSAsDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjEsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjEpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgpLA0KICAgIGF4aXMudGlja3MubGVuZ3RoPXVuaXQoLjI1LCAiY20iKSwNCiAgICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQoNCiAgcHJpbnQocCkNCg0KI2dnc2F2ZShwYXN0ZTAoU3lzLkRhdGUoKSwiIEdDYXNlIGFjdGl2aXR5IERJVjMwLnBkZiIpLGhlaWdodD00KQ0KDQpgYGANCg0KQmFyIFBsb3RzIGZvciBhbGwgdGhlIGZlYXR1cmVzIG9uZSB0aW1lcG9pbnQNCmBgYHtyfQ0KDQpkYXRhTkJhclBsb3QlPiUNCiAgZ2dwbG90KGFlcyh4PWZhY3RvcihDZWxsTGluZSwgbGV2ZWwgPSBjKCJDVFJMMSIsICJDVFJMMiIsIkNUUkwzIiwgIlBEMSIsICJQRDIiLCJQRDMiKSksIHk9TWVhbkdDYXNlKSxvcmRlcmVkPVRSVUUpKw0KICAjZ2VvbV92aW9saW4oIGFlcyhmaWxsPUNvbmRpdGlvbiksc2hvdy5sZWdlbmQgPSBULCB0cmltPVQpLA0KICBnZW9tX2JhcihhZXMoZmlsbD1DZWxsTGluZSksc3RhdD0ic3VtbWFyeSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSxjb2xvdXI9ImJsYWNrIixzaXplPTAuMyx3aWR0aD0wLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYygiIzE1NjVDMCIsIGFscGhhKCgiIzE1NjVDMCIpLDAuNyksYWxwaGEoKCIjMTU2NUMwIiksMC40KSwiI0NDMDAwMCIsIGFscGhhKCgiI0NDMDAwMCIpLDAuNSksYWxwaGEoKCIjQ0MwMDAwIiksMC4yKSksbmFtZSA9ICJDZWxsTGluZSIsZ3VpZGUgPSAibm9uZSIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPU1lYW5HQ2FzZSwgeW1heD1NZWFuR0Nhc2Urc2RfcmF0aW5nKSx3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSksIHNpemU9MC4zKSsgICAgICAgICMgV2lkdGggb2YgdGhlIGVycm9yIGJhcnMNCiAgICB0aGVtZShsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSkgKw0KICAgIA0KICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiQ1RSTCIsICJHQkEtUEQiKSksIHRlc3Q9J3dpbGNveC50ZXN0JywNCiAgICAgICAgICAgICAgbWFyZ2luX3RvcD0wLjUsdmp1c3Q9MC41LCBzaXplPTAuNSwgdGV4dHNpemU9OSwgbWFwX3NpZ25pZl9sZXZlbD1jKCIqKioiPTAuMDAxLCAiKioiPTAuMDEsICIqIj0wLjA1LCAgIiAiPTIpICkgKw0KICAjZmFjZXRfZ3JpZCh+ZmN0X3JlbGV2ZWwoRGF5LCAiZDMwIiwiZDYwIiksIHNjYWxlcz0iZnJlZSIpICsNCiAgICAgICBsYWJzKHggICAgID0iIiwNCiAgICAgICAgeSAgICAgPSAiUmVsYXRpdmUgR0Nhc2UgYWN0aXZpdHkiLA0KICAgICAgIGZpbGwgID0gIiIsDQogICAgICB0aXRsZSA9ICIiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZSgNCiAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAnYmxhY2snLCBzaXplID0gMC4zKSAsDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9NywgY29sb3I9ImJsYWNrIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT03LCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoc2l6ZT0wLjMpLA0KICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZShzaXplPTAuMyksDQogICAgYXhpcy50aWNrcy5sZW5ndGg9dW5pdCguMSwgImNtIiksDQogICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIldpbGNveC10ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMiwgc2l6ZT0xMykpDQogIHByaW50KHApDQogICMjZ2dzYXZlKHBhc3RlMChTeXMuRGF0ZSgpLCJfIiwgbmFtZXNbaV0sICIucGRmIiksIHBsb3Q9dCkNCg0KDQpnZ3NhdmUocGFzdGUwKFN5cy5EYXRlKCksIiBHQ2FzZSBhY3Rpdml0eSBESVYzMC5wZGYiKSxoZWlnaHQ9Mi41LHdpZHRoPTMpDQoNCmBgYA0K