This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Uncontrols: Shock response in right BST

library(brms) # for the analysis
Loading required package: Rcpp
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Loading 'brms' package (version 2.12.0). Useful instructions
can be found by typing help('brms'). A more detailed introduction
to the package is available through vignette('brms_overview').

Attaching package: 㤼㸱brms㤼㸲

The following object is masked from 㤼㸱package:stats㤼㸲:

    ar
library(haven) # to load the SPSS .sav file
library(tidyverse) # needed for data manipulation.
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0     v purrr   0.3.3
v tibble  2.1.3     v dplyr   0.8.3
v tidyr   1.0.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(RColorBrewer) # needed for some extra colours in one of the graphs
library(ggmcmc)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
library(ggthemes)
library(ggridges)

Model

\[Y \sim N(\mu, \sigma_{\epsilon}^{2})\] \[\mu = A + \alpha*T + \beta*S+ \epsilon\] Where TM, TD, SM, and SD are covariates.

T: Trait score
S: State score

Priors

\[ A \sim N(0,100)\] \[\alpha \sim N(0,100)\] \[\beta \sim N(0,100)\] \[\sigma_{\epsilon} \sim Cauchy(0,100)\]

setwd("C:/Users/Chirag/Box/Box/UMD/Project_UMD/eCON/RBA/uncon_rBNST_with_covariates")

df <- read.table('uncon_rBNST_with_covariates.txt',header=TRUE)
prior1 <- c(prior(normal(0,100),class=Intercept),
            prior(normal(0,100),class=b, coef="TRAIT"),
            prior(normal(0,100),class=b, coef="STATE"),
            prior(cauchy(0,100),class=sigma)
           )

bmod1 <- brm(Y ~ TRAIT + STATE, 
             data = df, 
             family = gaussian(),
             prior = prior1,
             warmup = 2000, iter = 5000,
             chains = 4,
             cores  = 2)
Compiling the C++ model
Start sampling

Model Summary

summary(bmod1)
 Family: gaussian 
  Links: mu = identity; sigma = identity 
Formula: Y ~ TRAIT + STATE 
   Data: df (Number of observations: 61) 
Samples: 4 chains, each with iter = 5000; warmup = 2000; thin = 1;
         total post-warmup samples = 12000

Population-Level Effects: 
          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept     0.42      0.05     0.33     0.52 1.00    11378     8426
TRAIT        -0.06      0.06    -0.17     0.05 1.00    10321     8629
STATE         0.08      0.06    -0.03     0.19 1.00    10617     8382

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma     0.38      0.04     0.32     0.46 1.00    10536     8696

Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Posteriors

data <- fixef(bmod1,summary = FALSE)
write.csv(data,file = 'posteriors.csv')
# IMPORT LIBRARIES:
library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.12.8 using 2 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: 㤼㸱data.table㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    between, first, last

The following object is masked from 㤼㸱package:purrr㤼㸲:

    transpose
library(ggplot2)
library(ggridges)
library(dplyr)
library(tidyr)
library(scales)

Attaching package: 㤼㸱scales㤼㸲

The following object is masked from 㤼㸱package:purrr㤼㸲:

    discard

The following object is masked from 㤼㸱package:readr㤼㸲:

    col_factor
library(viridis)
Loading required package: viridisLite

Attaching package: 㤼㸱viridis㤼㸲

The following object is masked from 㤼㸱package:scales㤼㸲:

    viridis_pal
rois <- colnames(data)
#data$X <- NULL
nobj=dim(data)[1]

# rename columns with ROI list


data_stats = data.frame(1:length(rois))

# create ROI column instead of numerics to match threat table above

data_stats$ROI <- rois
data_stats$mean <- colMeans(data)
data_stats$P <- colSums(data > 0)/nobj
data_stats$Pn <- data_stats$P


for (i in 1:length(rois)) {
  if (data_stats$P[i]<.5){data_stats$Pn[i]=1-data_stats$P[i]}
}


# this will order the distributions correctly
data_stats <- data_stats[order(data_stats$mean),]



data_trans <- as.data.frame(t(as.matrix(data)))
data_trans <- tibble::rownames_to_column(data_trans, "ROI")
data_trans$X <- 1:nrow(data_trans)




# merge values & stats into one table by ROI

data_merge <- merge(data_stats, data_trans, by = "ROI")
data_merge <- data_merge[order(data_merge$X),]

# Transform data into long form


# Melt dataframe by ROI
library(data.table)

data_long <- melt(data_trans, id=c("ROI","X"))
The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(data_trans). In the next version, this warning will become an error.
#threat_long <- melt(threat_trans, id=c("ROI","X.x"))


data_long <- data_long[order(data_long$X),]


# This is incredibly clunky, but for the sake of time adding stats by ensuring orders are all the same and repeating each value 2000 times... Tried a few different methods with no success for some reason. 

data_long$mean <- rep(data_merge$mean, each = nobj)
data_long$P <- rep(data_merge$P, each =nobj)
data_long$Pn <- rep(data_merge$Pn, each =nobj)

# set your labels here so you don't have to change within the plot below: 
format(round(1, 2), nsmall = 2)
[1] "1.00"
y.axis.labs <- format(round(data_stats$P,2), nsmall = 2)                        # y axis labels
sec.y.axis.labs <- data_stats$ROI                             # second y axis labels (probabilities)


 # X AXIS LABELS NEED TO CHANGE TO CORRESPOND TO DATA SET! UNCOMMENT WHICHEVER MATCHES

# Uncomment for THREAT
x.axis.labs <- c( "Shock < 0", "0", "Shock > 0")                 # x axis labels  THREAT
x.labs.pos <- c(-0.2, 0, 0.2)                                             # x axis position THREAT


# Uncomment for VALENCE
#x.axis.labs <- c("Neutral > Positive", "0", "Positive > Neutral")         # x axis labels  VALENCE
#x.labs.pos  <- c(-0.1,0,0.2)                                              # x axis position VALENCE

# Uncomment for INTERACTION
#x.axis.labs <- NULL                                                       # x axis labels  INTERACTION, not sure what to put.
#x.labs.pos <- NULL                                                        # a axis position INTERACTION, change when labels decided

#graph.title <- data.name                                   # graph title 
legend.title <- "Probability"                              # legend title
y.axis.title <- NULL                                       # for now ...
x.axis.title <- NULL                                       # for now...

# GRAPH DATA 
dataset <- data_long
x.values <- data_long$value                               # x values
y.values <- data_long$ROI                                 # y values
y.values.RO <- data_long$value                            # values to reorder Y by
distrib.fill <- data_long$Pn                              # fill graph with probabilities
group <- data_long$ROI

# Other aspects
gradient.colors <- c("yellow","#C9182B","#41245C")        # change gradient colors here (currently, yellow - purple)
label.size <- 12                                         # adjust ROI and probability y-axis font size
title.size <- 28                                          # adjust graph title size 
x.axis.size <- 12                                        # adjust x-axis label sizes

# here is where you can change information about the graph and add other characteristics using ggplot and ggridges


ggplot(dataset, aes(x = x.values, y = as.numeric(reorder(y.values, y.values.RO)), 
                    fill = distrib.fill, group = group)) +                        # scale = spacing, alpha = transparency
  coord_cartesian(xlim = c(-0.5, 0.5)) +
  stat_density_ridges(quantile_lines = TRUE, 
                      quantiles = 2, 
                      alpha = .95, 
                      scale = 2.55,
                      color = "black",
                      size = .35
                     ) +            # divide into two quantiles (show mean)
  geom_vline(xintercept = 0, linetype="solid",color = "black",alpha = .95, size = .45) +    #create line at X = 0
  scale_fill_gradientn(colors = viridis_pal(direction = 1, option = "inferno")(20),                         # set gradient
                       limits = c(.85,1),                                # which probabilites matter?
                       na.value = "#909497",                                # if not in limits, gray out
                       name = legend.title) +                            # name legend
  scale_y_continuous(breaks = 1:length(rois),                            # A VERY HACK-Y WAY TO HAVE TWO Y AXES W DISCRETE DATA
                     expand = c(0,0),
                     labels = y.axis.labs,                               # Trick ggplot into thinking data is continuous...
                     sec.axis = sec_axis(~.,                             # Second axis to show probabilities
                                         breaks = 1:length(rois),
                                         labels = sec.y.axis.labs)) +
  #theme_ridges(font_size = label.size, grid = TRUE, center_axis_labels = TRUE) +  # theme info
  #ggtitle(graph.title)+ 
  #theme_bw() +# graph title
 #theme_ridges(grid = FALSE) + 
  theme(   
    panel.background = element_blank(),
    legend.position = "none",
    #panel.grid.major.y = element_line(color = "grey"), 
    plot.title = element_text(hjust = 0.5, size = title.size),            # plot title size and position
    axis.text.y = element_text(size=label.size),                               # y-axis text size
    axis.line.x = element_line(color = "gray"),
    axis.text.y.right = element_text(size = label.size),                  # y-axis info for right axis
    axis.text.x = element_text(size = x.axis.size),
    #plot.margin = unit(c(0,0,0,0), "cm"),
    axis.ticks.x = element_blank(),
    axis.ticks.y = element_blank(),
    legend.title.align = 5)+
  guides(shape = guide_legend(label.position = "bottom",
                              title.positon = "bottom",
                              title.vjust = 0.4)) +          
  labs(
    x = NULL,                                                         # Add or not add X and Y labels
    y = NULL) +
  scale_x_continuous(breaks = x.labs.pos, labels = c(x.axis.labs))


#ggsave(file = paste0(strsplit(type,'.RData'),".jpg", sep=""), width=4.5, height=3, units = "in", dpi = 900)

# preview will look smooshed, be sure to look at the saved .jpg before making any changes to text size, etc!
#graph
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCiMgKipVbmNvbnRyb2xzOiBTaG9jayByZXNwb25zZSBpbiByaWdodCBCU1QqKg0KDQpgYGB7cn0NCmxpYnJhcnkoYnJtcykgIyBmb3IgdGhlIGFuYWx5c2lzDQpsaWJyYXJ5KGhhdmVuKSAjIHRvIGxvYWQgdGhlIFNQU1MgLnNhdiBmaWxlDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBuZWVkZWQgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpICMgbmVlZGVkIGZvciBzb21lIGV4dHJhIGNvbG91cnMgaW4gb25lIG9mIHRoZSBncmFwaHMNCmxpYnJhcnkoZ2dtY21jKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dyaWRnZXMpDQpgYGANCiMjICoqTW9kZWwqKg0KJCRZIFxzaW0gTihcbXUsIFxzaWdtYV97XGVwc2lsb259XnsyfSkkJA0KJCRcbXUgPSBBICsgXGFscGhhKlQgKyBcYmV0YSpTKyBcZXBzaWxvbiQkDQpXaGVyZSBUTSwgVEQsIFNNLCBhbmQgU0QgYXJlIGNvdmFyaWF0ZXMuDQoNClQ6IFRyYWl0IHNjb3JlICANClM6IFN0YXRlIHNjb3JlICANCg0KIyMgKipQcmlvcnMqKg0KDQokJCBBIFxzaW0gTigwLDEwMCkkJA0KJCRcYWxwaGEgXHNpbSBOKDAsMTAwKSQkDQokJFxiZXRhIFxzaW0gTigwLDEwMCkkJA0KJCRcc2lnbWFfe1xlcHNpbG9ufSBcc2ltIENhdWNoeSgwLDEwMCkkJA0KDQpgYGB7cn0NCnNldHdkKCJDOi9Vc2Vycy9DaGlyYWcvQm94L0JveC9VTUQvUHJvamVjdF9VTUQvZUNPTi9SQkEvdW5jb25fckJOU1Rfd2l0aF9jb3ZhcmlhdGVzIikNCg0KZGYgPC0gcmVhZC50YWJsZSgndW5jb25fckJOU1Rfd2l0aF9jb3ZhcmlhdGVzLnR4dCcsaGVhZGVyPVRSVUUpDQpwcmlvcjEgPC0gYyhwcmlvcihub3JtYWwoMCwxMDApLGNsYXNzPUludGVyY2VwdCksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwxMDApLGNsYXNzPWIsIGNvZWY9IlRSQUlUIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwxMDApLGNsYXNzPWIsIGNvZWY9IlNUQVRFIiksDQogICAgICAgICAgICBwcmlvcihjYXVjaHkoMCwxMDApLGNsYXNzPXNpZ21hKQ0KICAgICAgICAgICApDQoNCmJtb2QxIDwtIGJybShZIH4gVFJBSVQgKyBTVEFURSwgDQogICAgICAgICAgICAgZGF0YSA9IGRmLCANCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpLA0KICAgICAgICAgICAgIHByaW9yID0gcHJpb3IxLA0KICAgICAgICAgICAgIHdhcm11cCA9IDIwMDAsIGl0ZXIgPSA1MDAwLA0KICAgICAgICAgICAgIGNoYWlucyA9IDQsDQogICAgICAgICAgICAgY29yZXMgID0gMikNCg0KYGBgDQojIyAqKk1vZGVsIFN1bW1hcnkqKg0KYGBge3J9DQpzdW1tYXJ5KGJtb2QxKQ0KYGBgDQojIyBQb3N0ZXJpb3JzDQpgYGB7cn0NCmRhdGEgPC0gZml4ZWYoYm1vZDEsc3VtbWFyeSA9IEZBTFNFKQ0Kd3JpdGUuY3N2KGRhdGEsZmlsZSA9ICdwb3N0ZXJpb3JzLmNzdicpDQpgYGANCg0KDQpgYGB7cn0NCiMgSU1QT1JUIExJQlJBUklFUzoNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dyaWRnZXMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KYGBgDQoNCg0KYGBge3J9DQpyb2lzIDwtIGNvbG5hbWVzKGRhdGEpDQojZGF0YSRYIDwtIE5VTEwNCmBgYA0KDQoNCmBgYHtyfQ0Kbm9iaj1kaW0oZGF0YSlbMV0NCg0KIyByZW5hbWUgY29sdW1ucyB3aXRoIFJPSSBsaXN0DQoNCg0KZGF0YV9zdGF0cyA9IGRhdGEuZnJhbWUoMTpsZW5ndGgocm9pcykpDQoNCiMgY3JlYXRlIFJPSSBjb2x1bW4gaW5zdGVhZCBvZiBudW1lcmljcyB0byBtYXRjaCB0aHJlYXQgdGFibGUgYWJvdmUNCg0KZGF0YV9zdGF0cyRST0kgPC0gcm9pcw0KZGF0YV9zdGF0cyRtZWFuIDwtIGNvbE1lYW5zKGRhdGEpDQpkYXRhX3N0YXRzJFAgPC0gY29sU3VtcyhkYXRhID4gMCkvbm9iag0KZGF0YV9zdGF0cyRQbiA8LSBkYXRhX3N0YXRzJFANCg0KDQpmb3IgKGkgaW4gMTpsZW5ndGgocm9pcykpIHsNCiAgaWYgKGRhdGFfc3RhdHMkUFtpXTwuNSl7ZGF0YV9zdGF0cyRQbltpXT0xLWRhdGFfc3RhdHMkUFtpXX0NCn0NCg0KDQojIHRoaXMgd2lsbCBvcmRlciB0aGUgZGlzdHJpYnV0aW9ucyBjb3JyZWN0bHkNCmRhdGFfc3RhdHMgPC0gZGF0YV9zdGF0c1tvcmRlcihkYXRhX3N0YXRzJG1lYW4pLF0NCg0KDQoNCmRhdGFfdHJhbnMgPC0gYXMuZGF0YS5mcmFtZSh0KGFzLm1hdHJpeChkYXRhKSkpDQpkYXRhX3RyYW5zIDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKGRhdGFfdHJhbnMsICJST0kiKQ0KZGF0YV90cmFucyRYIDwtIDE6bnJvdyhkYXRhX3RyYW5zKQ0KDQoNCg0KDQojIG1lcmdlIHZhbHVlcyAmIHN0YXRzIGludG8gb25lIHRhYmxlIGJ5IFJPSQ0KDQpkYXRhX21lcmdlIDwtIG1lcmdlKGRhdGFfc3RhdHMsIGRhdGFfdHJhbnMsIGJ5ID0gIlJPSSIpDQpkYXRhX21lcmdlIDwtIGRhdGFfbWVyZ2Vbb3JkZXIoZGF0YV9tZXJnZSRYKSxdDQoNCiMgVHJhbnNmb3JtIGRhdGEgaW50byBsb25nIGZvcm0NCg0KDQojIE1lbHQgZGF0YWZyYW1lIGJ5IFJPSQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KDQpkYXRhX2xvbmcgPC0gbWVsdChkYXRhX3RyYW5zLCBpZD1jKCJST0kiLCJYIikpDQojdGhyZWF0X2xvbmcgPC0gbWVsdCh0aHJlYXRfdHJhbnMsIGlkPWMoIlJPSSIsIlgueCIpKQ0KDQoNCmRhdGFfbG9uZyA8LSBkYXRhX2xvbmdbb3JkZXIoZGF0YV9sb25nJFgpLF0NCg0KDQojIFRoaXMgaXMgaW5jcmVkaWJseSBjbHVua3ksIGJ1dCBmb3IgdGhlIHNha2Ugb2YgdGltZSBhZGRpbmcgc3RhdHMgYnkgZW5zdXJpbmcgb3JkZXJzIGFyZSBhbGwgdGhlIHNhbWUgYW5kIHJlcGVhdGluZyBlYWNoIHZhbHVlIDIwMDAgdGltZXMuLi4gVHJpZWQgYSBmZXcgZGlmZmVyZW50IG1ldGhvZHMgd2l0aCBubyBzdWNjZXNzIGZvciBzb21lIHJlYXNvbi4gDQoNCmRhdGFfbG9uZyRtZWFuIDwtIHJlcChkYXRhX21lcmdlJG1lYW4sIGVhY2ggPSBub2JqKQ0KZGF0YV9sb25nJFAgPC0gcmVwKGRhdGFfbWVyZ2UkUCwgZWFjaCA9bm9iaikNCmRhdGFfbG9uZyRQbiA8LSByZXAoZGF0YV9tZXJnZSRQbiwgZWFjaCA9bm9iaikNCg0KYGBgDQoNCmBgYHtyfQ0KDQojIHNldCB5b3VyIGxhYmVscyBoZXJlIHNvIHlvdSBkb24ndCBoYXZlIHRvIGNoYW5nZSB3aXRoaW4gdGhlIHBsb3QgYmVsb3c6IA0KZm9ybWF0KHJvdW5kKDEsIDIpLCBuc21hbGwgPSAyKQ0KeS5heGlzLmxhYnMgPC0gZm9ybWF0KHJvdW5kKGRhdGFfc3RhdHMkUCwyKSwgbnNtYWxsID0gMikgICAgICAgICAgICAgICAgICAgICAgICAjIHkgYXhpcyBsYWJlbHMNCnNlYy55LmF4aXMubGFicyA8LSBkYXRhX3N0YXRzJFJPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWNvbmQgeSBheGlzIGxhYmVscyAocHJvYmFiaWxpdGllcykNCg0KDQogIyBYIEFYSVMgTEFCRUxTIE5FRUQgVE8gQ0hBTkdFIFRPIENPUlJFU1BPTkQgVE8gREFUQSBTRVQhIFVOQ09NTUVOVCBXSElDSEVWRVIgTUFUQ0hFUw0KDQojIFVuY29tbWVudCBmb3IgVEhSRUFUDQp4LmF4aXMubGFicyA8LSBjKCAiU2hvY2sgPCAwIiwgIjAiLCAiU2hvY2sgPiAwIikgICAgICAgICAgICAgICAgICMgeCBheGlzIGxhYmVscyAgVEhSRUFUDQp4LmxhYnMucG9zIDwtIGMoLTAuMiwgMCwgMC4yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeCBheGlzIHBvc2l0aW9uIFRIUkVBVA0KDQoNCiMgVW5jb21tZW50IGZvciBWQUxFTkNFDQojeC5heGlzLmxhYnMgPC0gYygiTmV1dHJhbCA+IFBvc2l0aXZlIiwgIjAiLCAiUG9zaXRpdmUgPiBOZXV0cmFsIikgICAgICAgICAjIHggYXhpcyBsYWJlbHMgIFZBTEVOQ0UNCiN4LmxhYnMucG9zICA8LSBjKC0wLjEsMCwwLjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeCBheGlzIHBvc2l0aW9uIFZBTEVOQ0UNCg0KIyBVbmNvbW1lbnQgZm9yIElOVEVSQUNUSU9ODQojeC5heGlzLmxhYnMgPC0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggYXhpcyBsYWJlbHMgIElOVEVSQUNUSU9OLCBub3Qgc3VyZSB3aGF0IHRvIHB1dC4NCiN4LmxhYnMucG9zIDwtIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBheGlzIHBvc2l0aW9uIElOVEVSQUNUSU9OLCBjaGFuZ2Ugd2hlbiBsYWJlbHMgZGVjaWRlZA0KDQojZ3JhcGgudGl0bGUgPC0gZGF0YS5uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdyYXBoIHRpdGxlIA0KbGVnZW5kLnRpdGxlIDwtICJQcm9iYWJpbGl0eSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlZ2VuZCB0aXRsZQ0KeS5heGlzLnRpdGxlIDwtIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBub3cgLi4uDQp4LmF4aXMudGl0bGUgPC0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIG5vdy4uLg0KDQojIEdSQVBIIERBVEEgDQpkYXRhc2V0IDwtIGRhdGFfbG9uZw0KeC52YWx1ZXMgPC0gZGF0YV9sb25nJHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeCB2YWx1ZXMNCnkudmFsdWVzIDwtIGRhdGFfbG9uZyRST0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHkgdmFsdWVzDQp5LnZhbHVlcy5STyA8LSBkYXRhX2xvbmckdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXMgdG8gcmVvcmRlciBZIGJ5DQpkaXN0cmliLmZpbGwgPC0gZGF0YV9sb25nJFBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWxsIGdyYXBoIHdpdGggcHJvYmFiaWxpdGllcw0KZ3JvdXAgPC0gZGF0YV9sb25nJFJPSQ0KDQojIE90aGVyIGFzcGVjdHMNCmdyYWRpZW50LmNvbG9ycyA8LSBjKCJ5ZWxsb3ciLCIjQzkxODJCIiwiIzQxMjQ1QyIpICAgICAgICAjIGNoYW5nZSBncmFkaWVudCBjb2xvcnMgaGVyZSAoY3VycmVudGx5LCB5ZWxsb3cgLSBwdXJwbGUpDQpsYWJlbC5zaXplIDwtIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkanVzdCBST0kgYW5kIHByb2JhYmlsaXR5IHktYXhpcyBmb250IHNpemUNCnRpdGxlLnNpemUgPC0gMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFkanVzdCBncmFwaCB0aXRsZSBzaXplIA0KeC5heGlzLnNpemUgPC0gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGp1c3QgeC1heGlzIGxhYmVsIHNpemVzDQoNCiMgaGVyZSBpcyB3aGVyZSB5b3UgY2FuIGNoYW5nZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JhcGggYW5kIGFkZCBvdGhlciBjaGFyYWN0ZXJpc3RpY3MgdXNpbmcgZ2dwbG90IGFuZCBnZ3JpZGdlcw0KDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHgudmFsdWVzLCB5ID0gYXMubnVtZXJpYyhyZW9yZGVyKHkudmFsdWVzLCB5LnZhbHVlcy5STykpLCANCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGRpc3RyaWIuZmlsbCwgZ3JvdXAgPSBncm91cCkpICsgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYWxlID0gc3BhY2luZywgYWxwaGEgPSB0cmFuc3BhcmVuY3kNCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0wLjUsIDAuNSkpICsNCiAgc3RhdF9kZW5zaXR5X3JpZGdlcyhxdWFudGlsZV9saW5lcyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlcyA9IDIsIA0KICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gLjk1LCANCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IDIuNTUsDQogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAuMzUNCiAgICAgICAgICAgICAgICAgICAgICkgKyAgICAgICAgICAgICMgZGl2aWRlIGludG8gdHdvIHF1YW50aWxlcyAoc2hvdyBtZWFuKQ0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZT0ic29saWQiLGNvbG9yID0gImJsYWNrIixhbHBoYSA9IC45NSwgc2l6ZSA9IC40NSkgKyAgICAjY3JlYXRlIGxpbmUgYXQgWCA9IDANCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gdmlyaWRpc19wYWwoZGlyZWN0aW9uID0gMSwgb3B0aW9uID0gImluZmVybm8iKSgyMCksICAgICAgICAgICAgICAgICAgICAgICAgICMgc2V0IGdyYWRpZW50DQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLjg1LDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBwcm9iYWJpbGl0ZXMgbWF0dGVyPw0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjOTA5NDk3IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGluIGxpbWl0cywgZ3JheSBvdXQNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGxlZ2VuZC50aXRsZSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5hbWUgbGVnZW5kDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSAxOmxlbmd0aChyb2lzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBIFZFUlkgSEFDSy1ZIFdBWSBUTyBIQVZFIFRXTyBZIEFYRVMgVyBESVNDUkVURSBEQVRBDQogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsMCksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSB5LmF4aXMubGFicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUcmljayBnZ3Bsb3QgaW50byB0aGlua2luZyBkYXRhIGlzIGNvbnRpbnVvdXMuLi4NCiAgICAgICAgICAgICAgICAgICAgIHNlYy5heGlzID0gc2VjX2F4aXMofi4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNlY29uZCBheGlzIHRvIHNob3cgcHJvYmFiaWxpdGllcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAxOmxlbmd0aChyb2lzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VjLnkuYXhpcy5sYWJzKSkgKw0KICAjdGhlbWVfcmlkZ2VzKGZvbnRfc2l6ZSA9IGxhYmVsLnNpemUsIGdyaWQgPSBUUlVFLCBjZW50ZXJfYXhpc19sYWJlbHMgPSBUUlVFKSArICAjIHRoZW1lIGluZm8NCiAgI2dndGl0bGUoZ3JhcGgudGl0bGUpKyANCiAgI3RoZW1lX2J3KCkgKyMgZ3JhcGggdGl0bGUNCiAjdGhlbWVfcmlkZ2VzKGdyaWQgPSBGQUxTRSkgKyANCiAgdGhlbWUoICAgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgI3BhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiksIA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSB0aXRsZS5zaXplKSwgICAgICAgICAgICAjIHBsb3QgdGl0bGUgc2l6ZSBhbmQgcG9zaXRpb24NCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPWxhYmVsLnNpemUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHktYXhpcyB0ZXh0IHNpemUNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGxhYmVsLnNpemUpLCAgICAgICAgICAgICAgICAgICMgeS1heGlzIGluZm8gZm9yIHJpZ2h0IGF4aXMNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0geC5heGlzLnNpemUpLA0KICAgICNwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwgImNtIiksDQogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQudGl0bGUuYWxpZ24gPSA1KSsNCiAgZ3VpZGVzKHNoYXBlID0gZ3VpZGVfbGVnZW5kKGxhYmVsLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5wb3NpdG9uID0gImJvdHRvbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS52anVzdCA9IDAuNCkpICsgICAgICAgICAgDQogIGxhYnMoDQogICAgeCA9IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBZGQgb3Igbm90IGFkZCBYIGFuZCBZIGxhYmVscw0KICAgIHkgPSBOVUxMKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB4LmxhYnMucG9zLCBsYWJlbHMgPSBjKHguYXhpcy5sYWJzKSkNCg0KI2dnc2F2ZShmaWxlID0gcGFzdGUwKHN0cnNwbGl0KHR5cGUsJy5SRGF0YScpLCIuanBnIiwgc2VwPSIiKSwgd2lkdGg9NC41LCBoZWlnaHQ9MywgdW5pdHMgPSAiaW4iLCBkcGkgPSA5MDApDQoNCiMgcHJldmlldyB3aWxsIGxvb2sgc21vb3NoZWQsIGJlIHN1cmUgdG8gbG9vayBhdCB0aGUgc2F2ZWQgLmpwZyBiZWZvcmUgbWFraW5nIGFueSBjaGFuZ2VzIHRvIHRleHQgc2l6ZSwgZXRjIQ0KI2dyYXBoDQpgYGANCg0K