library(ggplot2)
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.5
library(pheatmap)
package 㤼㸱pheatmap㤼㸲 was built under R version 4.0.5
library(RColorBrewer)
library(tidyverse)
package 㤼㸱tidyverse㤼㸲 was built under R version 4.0.5Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages ----------------------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
v tibble  3.1.6     v dplyr   1.0.7
v tidyr   1.1.4     v stringr 1.4.0
v readr   2.1.1     v forcats 0.5.1
v purrr   0.3.4     
package 㤼㸱tibble㤼㸲 was built under R version 4.0.5package 㤼㸱tidyr㤼㸲 was built under R version 4.0.5package 㤼㸱readr㤼㸲 was built under R version 4.0.5package 㤼㸱dplyr㤼㸲 was built under R version 4.0.5package 㤼㸱forcats㤼㸲 was built under R version 4.0.5-- Conflicts -------------------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(ggpubr)
package 㤼㸱ggpubr㤼㸲 was built under R version 4.0.5
library(ggsignif)
package 㤼㸱ggsignif㤼㸲 was built under R version 4.0.5
library(openxlsx)
package 㤼㸱openxlsx㤼㸲 was built under R version 4.0.5
#library(viridis)
library(jcolors)
package 㤼㸱jcolors㤼㸲 was built under R version 4.0.5
setwd("//atlas.uni.lux/users/isabel.rosety/GBA/DA ELISA")
The working directory was changed to //atlas.uni.lux/users/isabel.rosety/GBA/DA ELISA 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.csv("WB data for Rstudio plots.csv", header = T,  sep = ",")
OutPath= "//atlas.uni.lux/users/isabel.rosety/GBA/DA ELISA"
data <- read.xlsx("Data combined for Plotting in R.xlsx")
#data15 <- read.xlsx("WB data for Rstudio plots.xlsx", sheet = 1) #15d are in sheet 1
#Day=as.character(DataCombined$Day)

Normalizing to the mean of the controls per feature


#Normalize to mean of controls for one feature
dataN <-data %>%
     group_by(Batch, CellLine, Condition) %>%
     mutate(DA.conc=DA.conc/mean(data$DA.conc[data$Condition=="CTRL"],na.rm = TRUE)) 

Plots

#Table_all_based_wideROS<-filter(Table_all_based_wideROS,Batch!="44")
#Table_all_based_wideROS<-filter(Table_all_based_wideROS,Batch=="52")
#Table_all_based_wideROS %>%
  #filter(!Condition%in%c("Control_DFX","PD_N370S_DFX")) -> Table_all_based_wideROS
#write.csv(Table_all_based_wideROS, file = 'Table_all_based_wideROS.csv')

data %>%
  ggplot(aes(x = Condition, y=DA.conc),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")+
  #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, margin_top=0.4,size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05,  " "=2) ) +
    #ggpubr::stat_compare_means(comparisons=my_comparisons, method="wilcox.test", p.adjust.method="BH",label="p.signif", label.x = 1.5)+
         labs(x     ="",
        y     = "DA concentration (ng/mL)",
       fill  = "Condition",
      title = "") +
    theme_bw() +
  theme(
       axis.line = element_line(colour = 'black', size = 0.5) ,
    axis.title.x = element_blank(),
    axis.text.x = element_text(size=12, color="black"),
    axis.title.y = element_text(size = 12),
    axis.text.y = element_text(size=10, 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
  #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)

  #t<- cowplot::ggdraw(cowplot::add_sub(p, "wilcox.test, ***p=0.001, **p=0.01, *p=0.05",hjust=-0.3, size=12))

  #print(t)
ggsave(paste0(Sys.Date()," Dopamine levels DIV 60.pdf"), height=3.5,width=3, path=OutPath)

Plot colored data points

```r


data %>%
  ggplot(aes(x = Condition, y=DA.conc),ordered=TRUE)+
    geom_boxplot(aes(fill=Condition),width=0.7)+
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) ) +
    #ggpubr::stat_compare_means(comparisons=my_comparisons, method=\wilcox.test\, p.adjust.method=\BH\,label=\p.signif\, label.x = 1.5)+
         labs(x     =\\,
        y     = \DA concentration (ng/mL)\,
       fill  = \Condition\,
      title = \\) +
    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
  #t<- cowplot::ggdraw(cowplot::add_sub(p, \Wilcox-test

```r

  #t<- cowplot::ggdraw(cowplot::add_sub(p, \wilcox.test
Saving 7.29 x 7 in image
Error in grDevices::pdf(file = filename, ..., version = version) : 
  cannot open file '//atlas.uni.lux/users/isabel.rosety/GBA/Organoids with Matrix/Stainings/Plots/2022-01-06 Dopamine levels DIV 60.pdf'
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KLS0tDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGhlYXRtYXApDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdnc2lnbmlmKQ0KbGlicmFyeShvcGVueGxzeCkNCiNsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGpjb2xvcnMpDQpgYGANCg0KYGBge3J9DQpzZXR3ZCgiLy9hdGxhcy51bmkubHV4L3VzZXJzL2lzYWJlbC5yb3NldHkvR0JBL0RBIEVMSVNBIikNCiNkYXRhIDwtIHJlYWQuY3N2KCJXQiBkYXRhIGZvciBSc3R1ZGlvIHBsb3RzLmNzdiIsIGhlYWRlciA9IFQsICBzZXAgPSAiLCIpDQpPdXRQYXRoPSAiLy9hdGxhcy51bmkubHV4L3VzZXJzL2lzYWJlbC5yb3NldHkvR0JBL0RBIEVMSVNBIg0KZGF0YSA8LSByZWFkLnhsc3goIkRhdGEgY29tYmluZWQgZm9yIFBsb3R0aW5nIGluIFIueGxzeCIpDQojZGF0YTE1IDwtIHJlYWQueGxzeCgiV0IgZGF0YSBmb3IgUnN0dWRpbyBwbG90cy54bHN4Iiwgc2hlZXQgPSAxKSAjMTVkIGFyZSBpbiBzaGVldCAxDQojRGF5PWFzLmNoYXJhY3RlcihEYXRhQ29tYmluZWQkRGF5KQ0KYGBgDQoNCg0KTm9ybWFsaXppbmcgdG8gdGhlIG1lYW4gb2YgdGhlIGNvbnRyb2xzIHBlciBmZWF0dXJlDQpgYGB7cn0gDQoNCiNOb3JtYWxpemUgdG8gbWVhbiBvZiBjb250cm9scyBmb3Igb25lIGZlYXR1cmUNCmRhdGFOIDwtZGF0YSAlPiUNCiAgICAgZ3JvdXBfYnkoQmF0Y2gsIENlbGxMaW5lLCBDb25kaXRpb24pICU+JQ0KICAgICBtdXRhdGUoREEuY29uYz1EQS5jb25jL21lYW4oZGF0YSREQS5jb25jW2RhdGEkQ29uZGl0aW9uPT0iQ1RSTCJdLG5hLnJtID0gVFJVRSkpIA0KYGBgDQoNClBsb3RzDQpgYGB7cn0NCiNUYWJsZV9hbGxfYmFzZWRfd2lkZVJPUzwtZmlsdGVyKFRhYmxlX2FsbF9iYXNlZF93aWRlUk9TLEJhdGNoIT0iNDQiKQ0KI1RhYmxlX2FsbF9iYXNlZF93aWRlUk9TPC1maWx0ZXIoVGFibGVfYWxsX2Jhc2VkX3dpZGVST1MsQmF0Y2g9PSI1MiIpDQojVGFibGVfYWxsX2Jhc2VkX3dpZGVST1MgJT4lDQogICNmaWx0ZXIoIUNvbmRpdGlvbiVpbiVjKCJDb250cm9sX0RGWCIsIlBEX04zNzBTX0RGWCIpKSAtPiBUYWJsZV9hbGxfYmFzZWRfd2lkZVJPUw0KI3dyaXRlLmNzdihUYWJsZV9hbGxfYmFzZWRfd2lkZVJPUywgZmlsZSA9ICdUYWJsZV9hbGxfYmFzZWRfd2lkZVJPUy5jc3YnKQ0KDQpkYXRhICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBDb25kaXRpb24sIHk9REEuY29uYyksb3JkZXJlZD1UUlVFKSsNCiAgI2dlb21fdmlvbGluKCBhZXMoZmlsbD1Db25kaXRpb24pLHNob3cubGVnZW5kID0gVCwgdHJpbT1UKSwNCiAgZ2VvbV92aW9saW4oIGFlcyhmaWxsPUNvbmRpdGlvbiksc2hvdy5sZWdlbmQgPSBULHNjYWxlID0gIndpZHRoIiwgdHJpbT1GKSsNCiAgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsc3RhY2tkaXIgPSAiY2VudGVyIixkb3RzaXplPTAuOCkrDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IGMoIiNiZGQ3ZTciLCIjMjE3MWI1IiksbmFtZSA9ICJDb25kaXRpb24iLCBndWlkZSA9IEZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSBhbHBoYShjKCIjMTU2NUMwIiwiI0NDMDAwMCIpLDAuNzUpLG5hbWUgPSAiQ29uZGl0aW9uIixndWlkZSA9ICJub25lIikrDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IGMoIiNGRkZGRkYiLCIjOTk5OTk5IiksbmFtZSA9ICJDb25kaXRpb24iLCBndWlkZSA9ICJub25lIikrICNndWlkZSBmYWxzZSB3aWxsIHJlbW92ZSB0aGUgbGVnZW5kIGZvciB0aGUgY29uZGl0aW9uDQogICN5bGltKDQsOSkrDQogICAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjA3LCBmaWxsPSJ3aGl0ZSIpICsgDQogICAgI2dlb21fcG9pbnQoYWVzKGNvbG9yPUNlbGxMaW5lKSxzaXplPTMsc2hvdy5sZWdlbmQgPSBULGFscGhhID0gMC41KSsNCiAgICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihicmV3ZXIucGFsKG49NiwgbmFtZT0iT3JSZCIpKSkrDQogICAgI3NjYWxlX2NvbG9yX2pjb2xvcnMoInBhbDciKSsNCiAgICAjc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAiRCIsIGRpc2NyZXRlPVRSVUUpKw0KICAgICNnZW9tX3BvaW50KHNoYXBlID0gMSxzaXplID0gMyxjb2xvdXIgPSAiYmxhY2siKSsNCiAgICB0aGVtZShsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSkgKw0KICAgIA0KICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiQ1RSTCIsICJHQkEtUEQiKSksIHRlc3Q9J3dpbGNveC50ZXN0JywNCiAgICAgICAgICAgICAgdmp1c3Q9MC41LCBtYXJnaW5fdG9wPTAuNCxzaXplPTAuNSwgdGV4dHNpemU9OSwgbWFwX3NpZ25pZl9sZXZlbD1jKCIqKioiPTAuMDAxLCAiKioiPTAuMDEsICIqIj0wLjA1LCAgIiAiPTIpICkgKw0KICAgICNnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucywgbWV0aG9kPSJ3aWxjb3gudGVzdCIsIHAuYWRqdXN0Lm1ldGhvZD0iQkgiLGxhYmVsPSJwLnNpZ25pZiIsIGxhYmVsLnggPSAxLjUpKw0KICAgICAgICAgbGFicyh4ICAgICA9IiIsDQogICAgICAgIHkgICAgID0gIkRBIGNvbmNlbnRyYXRpb24gKG5nL21MKSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIiIpICsNCiAgICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICdibGFjaycsIHNpemUgPSAwLjUpICwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgY29sb3I9ImJsYWNrIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgY29sb3I9ImJsYWNrIiksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKCksDQogICAgYXhpcy50aWNrcy5sZW5ndGg9dW5pdCguMjUsICJjbSIpLA0KICAgICNjaGFuZ2UgbGVnZW5kIHRleHQgZm9udCBzaXplKQ0KICAgICNsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgImNtIiksDQogICAgI2xlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNiwiY20iKSwNCiAgICBsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgaGp1c3Q9MC41LCB2anVzdD0gMSwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwjZWxlbWVudF90ZXh0KHNpemUgPSAyLCBoanVzdD0wLjUpDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCB2anVzdD0wLjUpLA0KICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0ibGlnaHRncmF5IiksDQogICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIiksDQogICAgcGFuZWwuc3BhY2luZy55ID0gdW5pdCgwLjgsICJsaW5lcyIpLA0KICAgIHN0cmlwLnN3aXRjaC5wYWQud3JhcD11bml0KDIwLCAibGluZXMiKSwNCiAgICBsZWdlbmQucG9zaXRpb249InJpZ2h0IiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE3KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xOSkNCiAgICANCiAgKSAgLT4gcA0KICAjdDwtIGNvd3Bsb3Q6OmdnZHJhdyhjb3dwbG90OjphZGRfc3ViKHAsICJXaWxjb3gtdGVzdCwgKioqcD0wLjAwMSwgKipwPTAuMDEsICpwPTAuMDUiLGhqdXN0PS0wLjIsIHNpemU9MTMpKQ0KICBwcmludChwKQ0KDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIndpbGNveC50ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMywgc2l6ZT0xMikpDQoNCiAgI3ByaW50KHQpDQpnZ3NhdmUocGFzdGUwKFN5cy5EYXRlKCksIiBEb3BhbWluZSBsZXZlbHMgRElWIDYwLnBkZiIpLCBoZWlnaHQ9My41LHdpZHRoPTMsIHBhdGg9T3V0UGF0aCkNCg0KYGBgDQoNClBsb3QgY29sb3JlZCBkYXRhIHBvaW50cw0KYGBge3J9DQoNCg0KZGF0YSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQ29uZGl0aW9uLCB5PURBLmNvbmMpLG9yZGVyZWQ9VFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPUNvbmRpdGlvbiksd2lkdGg9MC43KSsNCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYygiI0ZGRkZGRiIsIiM5OTk5OTkiKSxuYW1lID0gIkNvbmRpdGlvbiIsIGd1aWRlID0gIm5vbmUiKSsgI2d1aWRlIGZhbHNlIHdpbGwgcmVtb3ZlIHRoZSBsZWdlbmQgZm9yIHRoZSBjb25kaXRpb24NCiAgI3lsaW0oNCw5KSsNCiAgICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMDcsIGZpbGw9IndoaXRlIikgKyANCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvcj1DZWxsTGluZSksc2l6ZT0zLHNob3cubGVnZW5kID0gVCxhbHBoYSA9IDAuNSkrDQogICAgI3NjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXYoYnJld2VyLnBhbChuPTYsIG5hbWU9Ik9yUmQiKSkpKw0KICAgIHNjYWxlX2NvbG9yX2pjb2xvcnMoInBhbDciKSsNCiAgICAjc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAiRCIsIGRpc2NyZXRlPVRSVUUpKw0KICAgICNnZW9tX3BvaW50KHNoYXBlID0gMSxzaXplID0gMyxjb2xvdXIgPSAiYmxhY2siKSsNCiAgICB0aGVtZShsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSkgKw0KICAgIA0KICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiQ1RSTCIsICJHQkEtUEQiKSksIHRlc3Q9J3dpbGNveC50ZXN0JywNCiAgICAgICAgICAgICAgdmp1c3Q9MC41LCBzaXplPTAuNSwgdGV4dHNpemU9OSwgbWFwX3NpZ25pZl9sZXZlbD1jKCIqKioiPTAuMDAxLCAiKioiPTAuMDEsICIqIj0wLjA1LCAgIiAiPTIpICkgKw0KICAgICNnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1teV9jb21wYXJpc29ucywgbWV0aG9kPSJ3aWxjb3gudGVzdCIsIHAuYWRqdXN0Lm1ldGhvZD0iQkgiLGxhYmVsPSJwLnNpZ25pZiIsIGxhYmVsLnggPSAxLjUpKw0KICAgICAgICAgbGFicyh4ICAgICA9IiIsDQogICAgICAgIHkgICAgID0gIkRBIGNvbmNlbnRyYXRpb24gKG5nL21MKSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIiIpICsNCiAgICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICdibGFjaycsIHNpemUgPSAxKSAsDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjEsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjEpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgpLA0KICAgIGF4aXMudGlja3MubGVuZ3RoPXVuaXQoLjI1LCAiY20iKSwNCiAgICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIldpbGNveC10ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMiwgc2l6ZT0xMykpDQogIHByaW50KHApDQoNCiAgI3Q8LSBjb3dwbG90OjpnZ2RyYXcoY293cGxvdDo6YWRkX3N1YihwLCAid2lsY294LnRlc3QsICoqKnA9MC4wMDEsICoqcD0wLjAxLCAqcD0wLjA1IixoanVzdD0tMC4zLCBzaXplPTEyKSkNCg0KICAjcHJpbnQodCkNCmdnc2F2ZShwYXN0ZTAoU3lzLkRhdGUoKSwiIERvcGFtaW5lIGxldmVscyBESVYgNjAucGRmIiksIGhlaWdodD00LCBwYXRoPU91dFBhdGgpDQpgYGANCg0KDQo=