1 Overview

The exact order of these steps may vary, depending on your data and what you need to do with it.

  1. Create codebook.
  2. Export data from Qualtrics (or other source).
  3. Import data to R (or other stats program).
  4. Cleaning and organizing data:
      4a. Get rid of Qualtrics junk/non-study IDs (e.g., test responses, pilot data).
      4b. Tidy your data:
      • “Tidy” data has a basic structure:
          • Each variable forms a column.
          • Each observation forms a row.
          • Each type of observational unit forms a table.
      • Tidy data is easy to manipulate, model, visualize, and makes it simple to discern relationships between variables (Wickham, 2014).
      4c. Rename variables.
      4d. Recode variables, convert to appropriate type (numeric, integer, factor, etc.), and label and order factor levels.
        • This includes defining and assigning missing values as necessary.
      4e. Compute new variables for any scored measures.
      4f. Create filter variables (if analyses are to be run on subset(s) of participants in the dataset).
      4g. Merging datasets (if data from multiple sources needs to be combined).
      • Clean (and save) each dataset individually, then merge.
      • Create key variable (usually participant ID) that can be matched across datasets.
  5. Exploratory data analysis.
      5a. Look at your data!
        • Histograms, boxplots, scatterplots.
      5b. For every variable, check:
        • Distribution and frequencies
          • Range, standard deviations, skew/kurtosis, outliers, % missing.
        5c. For composite variables (e.g., measure total scores), check reliability (Cronbach’s alpha).
        5d. Other exploration:
          • Bivariate relationships (when appropriate)
            • Correlations, scatterplots.
              • For multivariate models, check collinearity.
                • Normality testing (residuals should be normally distributed).
                    • If residuals are significantly non-normal, decide how to handle it: transformation, using approaches that don’t assume normality…
  6. Missing data.
      6a. Report amount of missing data and whether any of your variables predict missingness.
      6b. Decide how you will deal with missing data.
      • Simple: use complete cases only; mean imputation; regression imputation.
      • More sophisticated: multiple imputation; modeling approaches using Full Information Maximum Likelihood (FIML).
  7. Reshape data (e.g., wide–long), if needed for your planned analyses.
  8. Back up your data.
      8a. The cleaned dataset should be clearly labeled as such, distinct from the raw dataset, and saved in at least two different locations (i.e., external HD & cloud; local & server…

1.1 General Notes

Good/helpful practices (an incomplete and somewhat subjective list):

  • Name your files to be human-readable, machine-readable, and work well with default ordering (see Jenny Bryant’s how to name files).
  • Refer to rows/columns by name rather than position in dataframe.
  • Understand how R handles categorical data (see the preprint Wrangling categorical data in R).
  • Name dichotomous variables in a way that tells you what the reference level is (akin to dummy-coding - this is helpful when you set up lm/glm models later).
  • Create a new dataframe for each step of data cleaning. This allows you to re-run portions of your script when you make a mistake without having to re-run the whole thing from the very top, and to compare cleaned and non-cleaned values (useful for checking reverse-coding and factor levels).
  • Be aware for the potential for accidental reverse-reverse-coding caused by running a script a second time on the same variable. Consider creating new variables with the reversed values, e.g., i.e., pswq_10 –> pswq_10r.
  • Check out the overview in An introduction to data cleaning with R (I found their tutorial more useful on a conceptual - rather than practical - level, since the tutorial focuses on base R and I prefer using tidyverse tools for data cleaning.)

2 First Steps

2.1 Exporting Data from Qualtrics

  • Log into Qualtrics (http://qualtrics.arizona.edu)
  • Navigate to the survey/project containing the data you want to export.
  • Navigate to Data & Analysis > Export/Import… > Download Data Table as CSV file
  • Check Download all fields
  • Depending on your data, it may make more sense to select Use numeric values vs. Use choice text, or vice versa.

2.2 Creating the Codebook

A codebook should contain:

    1. The text of the questions and responses, as the participant saw them.
    2. The name of each variable (e.g., bgq_1) as it will appear in the final dataset (not what it’s named in Qualtrics).
    3. The values for each variable (e.g., 0 = Not at all, 1 = Somewhat, 2 = A lot) as they will appear in the final dataset (not whatever values Qualtrics assigned).
    4. A citation and scoring information (how responses are coded, reverse scoring, subscales, whether total score is a sum or a mean, possible range, norms, clinical cutoffs, etc.) for each measure included in the dataset.
example of the codebook section for a measure

example of the codebook section for a measure

For steps (2) and (3), I found it easiest to create an initial draft of the codebook for my own reference, where I recorded the variable names and values exactly as they were in Qualtrics for use while writing the portions of the data cleaning script where variables were renamed and recoded. Then I made a final copy of the codebook with the names and values as reflected in the cleaned dataset.

3 Baseline

This section of the script deals with the baseline trait measures that participants completed before their experimental sessions.

3.1 Import data and clean up Qualtrics junk

This assumes that you have just exported the data directly from Qualtrics, and have not manipulated it in any way (i.e., in Excel, etc.) beforehand.

Task: Import data from CSV file except for columns 2:18 (2:17 is just Qualtrics junk, 18 is the participant’s name and needs to be deleted). We’ll keep the first column ‘StartDate’.
We also want to remove any rows where ID (‘Q52’ for now) doesn’t begin with D1, in order to filter out any pilot or test responses.

# run install.packages("tidyverse") if this is the first time using dplyr on your local machine
library(tidyverse) 
filter <- dplyr::filter
select <- dplyr::select

baseline <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT+fMRI+Baseline_January+18%2C+2019_14.22.csv", stringsAsFactors = FALSE, na.strings="")[ ,-c(2:18)] %>%
  filter(grepl("^D1", Q52, ignore.case = TRUE)) # one person input their id as "d130", so should NOT be case sensitive
# na.strings = "" replaces all instances where missing data is represented by blank cells with NA, which is how R handles missing values.

# view IDs
baseline$Q52

# filter out participants who did not complete study
baseline <- filter(baseline, !grepl("D108|D109|D111|D112|D116|D124|D150",Q52)) 

# view IDs
baseline$Q52

Check that your second column is “Q52” (if you’ve deleted the correct number of columns, it will be). You should have 40 observations of 171 variables.

3.2 Rename variables

The name to the left of the equal sign is the new name, the one on the right is what the variable was named in Qualtrics.

baseline_1 <- rename(baseline, startdate = StartDate,
ID = Q52,
dob = Q2,
sex_m = Q1,
dateofdeath = Q36,
knowbefore_y = Q37,
caretaker_y = Q38,
education = Q5,
highestdegree = Q6, 
education_other = Q6_6_TEXT,
employment = Q7,
householdsize = Q8,
householdsize_adult = Q10,
householdsize_income = Q12,
ethnicity_hisp = Q13,
race = Q14,
race_other = Q14_6_TEXT,
learnaboutstudy = MHQ.1,
meds_y = MHQ.2,
meds_which = MHQ.3,
meds_dx = MHQ.4,
meds_dose = MHQ.5,
majorhealthprobs_y = MHQ.6,
majorhealthprobs_what = MHQ.7,
past2wks_injuryinfect_y = MHQ.8,
past2wks_dentist_y = MHQ.9,
currenttx_y = MHQ.10,
postmenopausal_y = MHQ.11,
lastperiod = MHQ.12, 
n_pregnancies = MHQ.13,
n_livebirths = MHQ.14,
n_nursed = MHQ.15,
allergies = MHQ.16,
surgeries_past6mos = MHQ.17,
alcohol = MHQ.18,
smoking_y = MHQ.19,
smoking_howlong = MHQ.20,
smoking_perday = MHQ.21,
caffeine_perday = MHQ.22,
exercise = MHQ.25,
pss_1 = PSS.1.10_1,
pss_2 = PSS.1.10_2,
pss_3 = PSS.1.10_3,
pss_4 = PSS.1.10_4,
pss_5 = PSS.1.10_5,
pss_6 = PSS.1.10_6,
pss_7 = PSS.1.10_7,
pss_8 = PSS.1.10_8,
pss_9 = PSS.1.10_9,
pss_10 = PSS.1.10_10,
ysl_1 = Yrn.1.21_1,
ysl_2 = Yrn.1.21_2,
ysl_3 = Yrn.1.21_3,
ysl_4 = Yrn.1.21_4,
ysl_5 = Yrn.1.21_5,
ysl_6 = Yrn.1.21_6,
ysl_7 = Yrn.1.21_7,
ysl_8 = Yrn.1.21_8,
ysl_9 = Yrn.1.21_9,
ysl_10 = Yrn.1.21_10,
ysl_11 = Yrn.1.21_11,
ysl_12 = Yrn.1.21_12,
ysl_13 = Yrn.1.21_13,
ysl_14 = Yrn.1.21_14,
ysl_15 = Yrn.1.21_15,
ysl_16 = Yrn.1.21_16,
ysl_17 = Yrn.1.21_17,
ysl_18 = Yrn.1.21_18,
ysl_19 = Yrn.1.21_19,
ysl_20 = Yrn.1.21_20,
ysl_21 = Yrn.1.21_21,
icg_1 = ICG.R1.19_1,
icg_2 = ICG.R1.19_2,
icg_3 = ICG.R1.19_3,
icg_4 = ICG.R1.19_4,
icg_5 = ICG.R1.19_5,
icg_6 = ICG.R1.19_6,
icg_7 = ICG.R1.19_7,
icg_8 = ICG.R1.19_8,
icg_9 = ICG.R1.19_9,
icg_10 = ICG.R1.19_10,
icg_11 = ICG.R1.19_11,
icg_12 = ICG.R1.19_12,
icg_13 = ICG.R1.19_13,
icg_14 = ICG.R1.19_14,
icg_15 = ICG.R1.19_15,
icg_16 = ICG.R1.19_16,
icg_17 = ICG.R1.19_17,
icg_18 = ICG.R1.19_18,
icg_19 = ICG.R1.19_19,
bdi_1 = BDI.1,
bdi_2 = BDI.2,
bdi_3 = BDI.3,
bdi_4 = BDI.4,
bdi_5 = BDI.5,
bdi_6 = BDI.6,
bdi_7 = BDI.7,
bdi_8 = BDI.8,
bdi_9 = BDI.9,
bdi_10 = BDI.10,
bdi_11 = BDI.11,
bdi_12 = BDI.12,
bdi_13 = BDI.13,
bdi_14 = BDI.14,
bdi_15 = BDI.15,
bdi_16 = BDI.16,
bdi_17 = BDI.17,
bdi_18 = BDI.18,
bdi_19 = BDI.19,
bdi_20 = BDI.20,
bdi_21 = BDI.21,
hand_1 = Hand.1_1,
hand_2 = Hand.1_2,
hand_3 = Hand.1_3,
hand_4 = Hand.1_4,
hand_5 = Hand.1_5,
hand_6 = Hand.1_6,
hand_7 = Hand.1_7,
hand_8 = Hand.1_8,
hand_9 = Hand.1_9,
hand_10 = Hand.1_10,
hand_11 = Hand.1_11,
hand_12 = Hand.1_12,
hand_bat_1 = Hand.2,
bisbas_1 = BISBAS_1,
bisbas_2 = BISBAS_2,
bisbas_3 = BISBAS_3,
bisbas_4 = BISBAS_4,
bisbas_5 = BISBAS_5,
bisbas_6 = BISBAS_6,
bisbas_7 = BISBAS_7,
bisbas_8 = BISBAS_8,
bisbas_9 = BISBAS_9,
bisbas_10 = BISBAS_10,
bisbas_11 = BISBAS_11,
bisbas_12 = BISBAS_12,
bisbas_13 = BISBAS_13,
bisbas_14 = BISBAS_14,
bisbas_15 = BISBAS_15,
bisbas_16 = BISBAS_16,
bisbas_17 = BISBAS_17,
bisbas_18 = BISBAS_18,
bisbas_19 = BISBAS_19,
bisbas_20 = BISBAS_20,
bisbas_21 = BISBAS_21,
bisbas_22 = BISBAS_22,
bisbas_23 = BISBAS_23,
bisbas_24 = BISBAS_24,
bgq_1 = BGQ.1,
bgq_2 = BGQ.2,
bgq_3 = BGQ.3,
bgq_4 = BGQ.4,
bgq_5 = BGQ.5,
ecrrs_global_1 = Q185_1,
ecrrs_global_2 = Q185_2,
ecrrs_global_3 = Q185_3,
ecrrs_global_4 = Q185_4,
ecrrs_global_5 = Q185_5,
ecrrs_global_6 = Q185_6,
ecrrs_global_7 = Q185_7,
ecrrs_global_8 = Q185_8,
ecrrs_global_9 = Q185_9,
ecrrs_spouse_1 = Q186_1,
ecrrs_spouse_2 = Q186_2,
ecrrs_spouse_3 = Q186_3,
ecrrs_spouse_4 = Q186_4,
ecrrs_spouse_5 = Q186_5,
ecrrs_spouse_6 = Q186_6,
ecrrs_spouse_7 = Q186_7,
ecrrs_spouse_8 = Q186_8,
ecrrs_spouse_9 = Q186_9)

# Check it out:
print(colnames(baseline_1))
# Save it as a csv file
write.csv(baseline_1, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_1.csv")

3.3 Change variable types

First, let’s change all our scale items from chr to numeric:

baseline_2 <- baseline_1 %>% mutate_at(vars(pss_1:ecrrs_spouse_9), funs(as.numeric))

Note: One way to get this all into the same expression might be to use base R’s sapply, e.g. dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric) - but I’m not a fan. Column order may change, and it’s much easier to mix up columns when referring to their order in the dataframe (e.g., 88 vs. 89) than it is to mix up two columns when referring to their names.

Let’s leave our nominal, date, and free-text response variables alone for now (ID, dob, dateofdeath, race_other, learnaboutstudy, meds_which, meds_dx, meds_dose, majorhealthprobs_what, lastperiod, n_pregnancies, n_livebirths, allergies, surgeries_past6mos, alcohol, smoking_howlong).

We could also convert variables from chr to factor here – e.g., baseline <- baseline %>% mutate_at(vars(sex_m), funs(factor)) – but that will be taken care of in the next step.

Let’s save the cleaned data so far. R data format (.rds) preserves data structures, such as column data types (numeric, character or factor).

saveRDS(baseline_2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_2.rds")
# If you ever want to restore the pre-factoring step data, simply use:
# baseline_2 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_2.rds")

3.4 Creating factors and recoding values

3.4.1 About factors in R (IMPORTANT!)

If you have 5 possible levels of a factor (e.g., options for ‘race’ were White, Black, Asian, Native American/Alaskan Native, Other Race Not Listed) but only 2 actual levels in your data (e.g., all of our participants identify as either White or Other), then it will make 1 = the first factor listed for which there is data, and 2 = the second listed for which there is data.

This is different than SPSS, which preserves factor levels regardless of what your data actually contains.

You can check levels and their order like this:

levels(baseline_3$race)
nlevels(baseline_3$race)

For ordered factors, can check their order (and lowest/highest levels) using the min() and max() functions. For example, min(baseline_3$education) returns the following:

[1] high school grad
Levels: high school grad < some college < college grad < 1 year grad school < 2 years grad school < 3 years grad school < 4+ years grad school

For non-ordered factors, view their levels by simply printing the column. baseline$race returns the following below the data:

Levels: White Other (specify)

3.4.2 A few other notes on factors in R

  • Make sure you double-check that you’ve assigned levels properly by going back to the raw data and seeing if, for example, the “>10 cigarettes/day” in the current dataframe matches up with what you see in the Qualtrics data for that person. (See also https://swcarpentry.github.io/r-novice-inflammation/12-supp-factors/)
  • I haven’t used it here, but some people like the package lfactors (“Provides an extension to factors called ‘lfactor’ that are similar to factors but allows users to refer to ‘lfactor’ levels by either the level or the label”) (link)
# householdsize_income was a factor in Qualtrics ("0 people bringing in income" had a value of 1)
## But here, let's convert it to a numeric variable and simply subtract 1 from each value, instead of treating it as a factor:
baseline_3 <- baseline_2 %>% mutate_at(vars(householdsize_income), funs(as.numeric)) %>% mutate(householdsize_income = householdsize_income - 1)
# householdsize and householdsize_adult should also be numeric.
baseline_3 <- baseline_2 %>% mutate_at(vars(householdsize,householdsize_adult), funs(as.numeric))
# Let's clean up the n_pregnancies variable. This was a free-response field, so several people entered "none", "n/a", "male", etc. rather than numeric values.
## We want to change the response "Two" to "2", and make any other non-number response NA.
baseline_3 <- baseline_2 %>% mutate(n_pregnancies = recode(n_pregnancies, "Two" = "2")) # this will give an error message "NAs introduced by coercion" - feel free to ignore it.
baseline_3 <- baseline_2 %>% mutate_at(vars(n_pregnancies), funs(as.numeric))
NAs introduced by coercion
# na_if is also useful function if there's only one value you want to make NA
# See also https://dplyr.tidyverse.org/reference/na_if.html
## Example: baseline <- baseline %>% mutate(n_pregnancies = na_if(n_pregnancies, "None"))
### (We could have done that for all of the text responses other than "Two" in this dataset, but changing the column to numeric from character automatically converts any remaining strings to NA so it would be redundant).
# Making ordered factors: '.ordered = TRUE' orders your levels in order listed, so the first is the reference value. 
## Example: for sex_m, we want female to be the reference value, so it is listed first.
## For all of the yes/no variables, they are appended "_y" (for ex., meds_y).
### This indicates that a "no" response is always the reference group, so it should be listed first.
### Note that not all factors are ordered ('.ordered = FALSE' is default).
baseline_3 <- baseline_2 %>% 
  mutate(sex_m = recode_factor(sex_m, "2" = "female", "1" = "male", .ordered = TRUE),
        knowbefore_y = recode_factor(knowbefore_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        caretaker_y = recode_factor(caretaker_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        education = recode_factor(education, "1" = "less than high school", "2" = "less than high school", "3" = "less than high school", "4" = "less than high school", "5" = "high school grad", "6" = "some college", "7" = "some college", "8" = "some college","9" = "college grad", "10" = "1 year grad school", "11" = "2 years grad school", "12" = "3 years grad school", "13" = "4+ years grad school", .ordered = TRUE),   # collapsed the 13 different education categories into 8
         highestdegree = recode_factor(highestdegree, "7" = "Less than HS diploma or GED", "1" = "HS diploma or GED", "2" = "Associates's", "3" = "Bachelor's", "4" = "Master's", "5" = "Doctorate", "6" = "Other (specify)"), # did not make this an ordered factor because wasn't sure how the Other category should be ranked
         employment = recode_factor(employment, "1" = "working full time", "2" = "working part time", "3" = "unemployed or laid off", "4" = "looking for work", "5" = "keeping house or raising children full time", "6" = "retired", "7" = "student"),
        ethnicity_hisp = recode_factor(ethnicity_hisp, "2" = "not Hispanic or Latino", "1" = "Hispanic or Latino", .ordered = TRUE),
        race = recode_factor(race, "1" = "White", "2" = "African-American/Black", "3" = "Asian American/Asian", "4" = "Native American or Alaskan Native", "5" = "Pacific Islander or Native Hawaiian", "6" = "Other (specify)"),
        meds_y = recode_factor(meds_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        majorhealthprobs_y = recode_factor(majorhealthprobs_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        past2wks_injuryinfect_y = recode_factor(past2wks_injuryinfect_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        past2wks_dentist_y = recode_factor(past2wks_dentist_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        currenttx_y = recode_factor(currenttx_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        postmenopausal_y = recode_factor(postmenopausal_y, "1" = "no/pre", "2" = "yes/post", .ordered = TRUE),
        n_livebirths = recode_factor(n_livebirths, "6" = "0", "1" = "1", "2" = "2", "3" = "3", "4" = "4", "5" = "5 or more", .ordered = TRUE),
        n_nursed = recode_factor(n_nursed, "6" = "0", "1" = "1", "2" = "2", "3" = "3", "4" = "4", "5" = "5 or more", .ordered = TRUE),
        smoking_y = recode_factor(smoking_y, "2" = "no", "1" = "yes", .ordered = TRUE),
        smoking_perday = recode_factor(smoking_perday, "4" = "< 1 cigarette/day", "3" = "1-10 cigarettes/day", "2" = ">10 cigarettes/day", "1" = ">1 pack/day", .ordered = TRUE),
        caffeine_perday = recode_factor(caffeine_perday, "4" = "never or <1x", "3" = "1-3x", "2" = "3-5x", "1" = ">5x", .ordered = TRUE),
        exercise = recode_factor(exercise, "1" = "not at all", "2" = "1x/week (30+ mins)", "3" = "2-3x/week (30+ mins)", "4" = ">3x/week (30+ mins)", .ordered = TRUE))
# In RStudio, double-check your work by highlighting the name of each variable to show other instances of that variable (helpful with copy/paste errors)

3.5 New variables: age and time since death

# the lubridate package will be installed along with tidyverse, but if not:
# install.packages("lubridate")
library(lubridate)

Attaching package: ‘lubridate’

The following object is masked from ‘package:base’:

    date
# First, we only care about the date they completed the baseline survey, not the time
# so we'll split 'startdate' into two columns, removing the time column.
tidyr::separate(baseline_3, startdate, c("startdate", "time"), sep = " ") -> baseline_3
Expected 2 pieces. Missing pieces filled with `NA` in 40 rows [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...].
baseline_3$time <- NULL
# 'dob' and 'dateofdeath' both need to be converted from character to date.
# Notice that D138 entered dates using dashes (-) rather than slashes (/), so we need to change that.
# Use the mdy function from lubridate to convert 'dob' and 'dateofdeath' from character to date.
baseline_3 <- baseline_3 %>% 
 mutate(dateofdeath = recode(dateofdeath, "10-01-2015" = "10/01/2015"),
        dob = recode(dob, "03-13-1950" = "03/13/1950"),
        dateofdeath = mdy(dateofdeath),
        dob = mdy(dob),
        startdate = ymd(startdate)
        )
unknown timezone 'zone/tz/2018i.1.0/zoneinfo/America/Phoenix'
# Now we need to calculate two new variables: age at enrollment (using when they completed the baseline survey as a proxy for enrollment), and time since death at enrollment. 
baseline_3 %>% mutate(timesincedeath = startdate - dateofdeath, age = startdate - dob) %>% mutate_at(vars(timesincedeath, age), funs(as.numeric)) -> baseline_3
# needed to convert the new timesincedeath variable to numeric (vs. difftime) object, because there are a limited number of functions that can operate on difftime objects.
# to get their age in years (instead of days), use
baseline_3 %>% mutate(age_yrs = age/365) -> baseline_3
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
# time since death
describe(baseline_3$timesincedeath)
   vars  n  mean     sd median trimmed    mad min  max range skew kurtosis    se
X1    1 40 468.5 248.34    429  433.97 220.17 151 1095   944 1.03     0.06 39.27
# age in years
describe(baseline_3$age_yrs)
   vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
X1    1 40 69.22 6.49  70.19   69.38 7.33 57.11 79.73 22.62 -0.22    -1.03 1.03
# save your work frequently!
saveRDS(baseline_3, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_3.rds")
# load if needed: 
# baseline_3 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_3.rds")
# 'haven' package should allow you to save as .sav file but won't work for me - file is blank when I open it in spss
# 'foreign' package hasn't worked either - may be compatibility issue with newer versions of SPSS?

3.6 Clean numerical variables and scoring scales

Now, let’s tackle our scales.
Qualtrics assigns values starting with 1 as default, but this doesn’t always match what the values should be (i.e., when an item should be scored 0-3, not 1-4).

# For this section, you'll need the 'psych' package
## install.packages("psych") if you don't have it on this machine
library(psych)
baseline_4 <- baseline_3 # make a new iteration of the dataset for scoring and recoding
##################  
### Perceived Stress Scale
# Citation: Cohen, S., Kamarck, T., and Mermelstein, R. (1983). A global measure of perceived stress. Journal of Health and Social Behavior, 24, 386-396. 
# Answer choices range from 0 (Never) – 4 (Very Often). 
# Reverse scored items = 4, 5, 7, 8. 
# Sum all items (possible range: 0 – 40) [tot_pss]
# First, reverse score (and/or recode, if applicable) the relevant items:
baseline_4$pss_4r <- 4 - baseline_3$pss_4
baseline_4$pss_5r <- 4 - baseline_3$pss_5
baseline_4$pss_7r <- 4 - baseline_3$pss_7
baseline_4$pss_8r <- 4 - baseline_3$pss_8
# Another way to do this would be:
## cols = c("pss_4", "pss_5", "pss_7", "pss_8")
## baseline[ ,cols] = 5 - baseline[ ,cols]
## BUT the problem with this approach is that you could accidentally re-run those lines, which would undo the reverse scoring because it assigns the new scoring back to the old variable.
# How to create a new 'total' variable:
## First, subset out the columns you want to use in the total score.
## Then use rowSums to get the total, and attach tot_pss back to the dataframe.
tot_pss <- subset(baseline_4, select=c(pss_1,pss_2,pss_3,pss_4r,pss_5r,pss_6,pss_7r,pss_8r,pss_9,pss_10))
baseline_4$tot_pss <- rowSums(tot_pss, na.rm=TRUE) # if na.rm=FALSE, participants with missing responses on any of the items in the subset will not have their total score calculated (i.e., their total will be NA)
# Check out the descriptives if you like (though we'll do this later too)
describe(baseline_4$tot_pss)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 12.93 6.75   11.5   12.53 8.15   4  28    24 0.37    -1.04 1.07
##################  
### Yearning in Situations of Loss
  
# Citation: O'Connor, M. F., & Sussman, T. J. (2014). Developing the yearning in situations of loss scale: Convergent and discriminant validity for bereavement, spouse breakup, and homesickness. Death Studies, 38(7), 450-458.
# Answer choices range from 1 (Never) – 5 (Always). 
# NO reverse scored items. 
# Sum all items (possible range: 21 – 105) [tot_ysl]
tot_ysl <- subset(baseline_3, select=c(ysl_1:ysl_21))
baseline_4$tot_ysl <- rowSums(tot_ysl, na.rm=TRUE)
  
describe(baseline_4$tot_ysl)
   vars  n  mean    sd median trimmed   mad min max range  skew kurtosis   se
X1    1 40 67.38 18.79   69.5   67.19 20.02  31 100    69 -0.03    -1.17 2.97
  
##################  
### Inventory of Complicated Grief (NOT the ICG-Revised, although it was labeled as such in Qualtrics)
  
# Citation: Prigerson, H. G., Maciejewski, P. K., Reynolds, C. F., Bierhals, A. J., Newsom, J. T., Fasiczka, A., ... & Miller, M. (1995). Inventory of Complicated Grief: a scale to measure maladaptive symptoms of loss. Psychiatry Research, 59(1), 65-79.
# Answer choices range from 0 (Never) – 4 (Always). 
# NO reverse scored items. 
# Sum all items (possible range: 0 – 76; clinical cut-off = 25). [tot_icg]
tot_icg <- subset(baseline_3, select=c(icg_1:icg_19))
baseline_4$tot_icg <- rowSums(tot_icg, na.rm=TRUE)
  
describe(baseline_4$tot_icg)
   vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 40 23.35 12.47     22   22.59 10.38   4  51    47 0.37    -0.69 1.97
##################  
### Beck Depression Inventory-II  
# Citation: Beck, A.T., Steer, R.A., & Brown, G.K. (1996). Manual for the Beck Depression Inventory-II. San Antonio, TX: Psychological Corporation.
# Answer choices range from 0 – 3.
# NO reverse scored items. 
# Sum all items (possible range: 0 – 63; <14 = Minimal, 14-20 = Mild, 20-29 = Moderate, 29-51 = Severe). [tot_bdi]
baseline_4 <-  baseline_4 %>% mutate(bdi_1c = recode(bdi_1, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_2c = recode(bdi_2, "1" = "0", "4" = "1", "6" = "2", "7" = "3")) # note that the Qualtrics coding on item 2 differed from the other items
baseline_4 <-  baseline_4 %>% mutate(bdi_3c = recode(bdi_3, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_4c = recode(bdi_4, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_5c = recode(bdi_5, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_6c = recode(bdi_6, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_7c = recode(bdi_7, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_8c = recode(bdi_8, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_9c = recode(bdi_9, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_10c = recode(bdi_10, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_11c = recode(bdi_11, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_12c = recode(bdi_12, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_13c = recode(bdi_13, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_14c = recode(bdi_14, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_15c = recode(bdi_15, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_16c = recode(bdi_16, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_17c = recode(bdi_17, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_18c = recode(bdi_18, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_19c = recode(bdi_19, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_20c = recode(bdi_20, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
baseline_4 <-  baseline_4 %>% mutate(bdi_21c = recode(bdi_21, "1" = "0", "2" = "1", "3" = "2", "4" = "3"))
              
baseline_4 <- baseline_4 %>% mutate_at(vars(bdi_1c:bdi_21c), funs(as.numeric))                 
tot_bdi <- subset(baseline_4, select=c(bdi_1c:bdi_21c))  
baseline_4$tot_bdi <- rowSums(tot_bdi, na.rm=TRUE)
  
describe(baseline_4$tot_bdi)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 10.32 7.72    9.5    9.66 8.15   0  28    28 0.55    -0.76 1.22
   
  
##################  
### Hand Usage Questionnaire 
# Citation: Raczkowski, D., Kalat, J. W., & Nebes, R. (1974). Reliability and validity of some handedness questionnaire items. Neuropsychologia, 12(1), 43-47.
# Sum all items (1 = Right, 2 = Either, 3 = Left).  [tot_handedness]
# Possible range: 13 (completely right-handed) – 39 (completely left-handed).
  
baseline_4 <- baseline_4 %>% mutate(hand_1c = recode(hand_1, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_2c = recode(hand_2, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_3c = recode(hand_3, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_4c = recode(hand_4, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_5c = recode(hand_5, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_6c = recode(hand_6, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_7c = recode(hand_7, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_8c = recode(hand_8, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_9c = recode(hand_9, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_10c = recode(hand_10, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_11c = recode(hand_11, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_12c = recode(hand_12, "2" = "1", "1" = "3", "4" = "2"))
baseline_4 <- baseline_4 %>% mutate(hand_bat_1c = recode(hand_bat_1, "2" = "1", "1" = "3", "3" = "2"))
  
  
baseline_4 <- baseline_4 %>% mutate_at(vars(hand_1c:hand_bat_1c), funs(as.numeric))                 
tot_handedness <- subset(baseline_4, select=c(hand_1c:hand_bat_1c))  
baseline_4$tot_handedness <- rowSums(tot_handedness, na.rm=TRUE) 
  
describe(baseline_4$tot_handedness)
   vars  n  mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 40 15.43 5.42     13      14   0  13  39    26  2.9     8.31 0.86
##################  
### Behavioral Inhibition/Behavioral Activation Scales (BIS/BAS)  
# Citation: Carver, C. S., & White, T. L. (1994). Behavioral inhibition, behavioral activation, and affective responses to impending reward and punishment: The BIS/BAS scales. Journal of Personality and Social Psychology, 67, 319-333.
# Answer choices range from 1 (Very true) – 4 (Very false). 
# Reverse score ALL items EXCEPT for 2 and 22. 
## BAS Drive: 3, 9, 12, 21 [tot_bisbas_basdr]
## BAS Fun Seeking: 5, 10, 15, 20 [tot_bisbas_basfun]
## BAS Reward Responsiveness: 4, 7, 14, 18, 23 [tot_bisbas_basrr]
## BIS: 2, 8, 13, 16, 19, 22, 24 [tot_bisbas_bis]
## Items 1, 6, 11, 17 are fillers.
# reverse score:
baseline_4$bisbas_1r <- 5 - baseline_4$bisbas_1
baseline_4$bisbas_3r <- 5 - baseline_4$bisbas_3
baseline_4$bisbas_4r <- 5 - baseline_4$bisbas_4
baseline_4$bisbas_5r <- 5 - baseline_4$bisbas_5
baseline_4$bisbas_6r <- 5 - baseline_4$bisbas_6
baseline_4$bisbas_7r <- 5 - baseline_4$bisbas_7
baseline_4$bisbas_8r <- 5 - baseline_4$bisbas_8
baseline_4$bisbas_9r <- 5 - baseline_4$bisbas_9
baseline_4$bisbas_10r <- 5 - baseline_4$bisbas_10
baseline_4$bisbas_11r <- 5 - baseline_4$bisbas_12
baseline_4$bisbas_12r <- 5 - baseline_4$bisbas_12
baseline_4$bisbas_13r <- 5 - baseline_4$bisbas_13
baseline_4$bisbas_14r <- 5 - baseline_4$bisbas_14
baseline_4$bisbas_15r <- 5 - baseline_4$bisbas_15
baseline_4$bisbas_16r <- 5 - baseline_4$bisbas_16
baseline_4$bisbas_17r <- 5 - baseline_4$bisbas_17
baseline_4$bisbas_18r <- 5 - baseline_4$bisbas_18
baseline_4$bisbas_19r <- 5 - baseline_4$bisbas_19
baseline_4$bisbas_20r <- 5 - baseline_4$bisbas_20
baseline_4$bisbas_21r <- 5 - baseline_4$bisbas_21
baseline_4$bisbas_23r <- 5 - baseline_4$bisbas_23
baseline_4$bisbas_24r <- 5 - baseline_4$bisbas_24
# BAS-Drive subscale
tot_basdr <- subset(baseline_4, select=c(bisbas_3r, bisbas_9r, bisbas_12r, bisbas_21r))
baseline_4$tot_bisbas_basdr <- rowSums(tot_basdr, na.rm=TRUE) 
# BAS-Fun Seeking subscale
tot_basfun <- subset(baseline_4, select=c(bisbas_5r, bisbas_10r, bisbas_15r, bisbas_20r))
baseline_4$tot_bisbas_basfun <- rowSums(tot_basfun, na.rm=TRUE) 
# BAS-Reward Responsiveness subscale
tot_basrr <- subset(baseline_4, select=c(bisbas_4r, bisbas_7r, bisbas_14r, bisbas_18r, bisbas_23r))
baseline_4$tot_bisbas_basrr <- rowSums(tot_basrr, na.rm=TRUE) 
  
# BIS subscale
tot_bis <- subset(baseline_4, select=c(bisbas_2, bisbas_8r, bisbas_13r, bisbas_16r, bisbas_19r, bisbas_22, bisbas_24r))
baseline_4$tot_bisbas_bis <- rowSums(tot_bis, na.rm=TRUE) 
  
describe(baseline_4$tot_bisbas_basdr)
   vars  n mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 40 8.95 2.46      9    9.09 2.97   4  13     9 -0.33    -1.05 0.39
describe(baseline_4$tot_bisbas_basfun)
   vars  n mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 40  9.8 2.22     10    9.78 2.22   4  14    10 -0.16     0.05 0.35
describe(baseline_4$tot_bisbas_basrr)
   vars  n  mean  sd median trimmed  mad min max range  skew kurtosis   se
X1    1 40 15.75 2.2     16   15.94 1.48   9  19    10 -0.85     0.85 0.35
describe(baseline_4$tot_bisbas_bis)
   vars  n mean  sd median trimmed  mad min max range  skew kurtosis   se
X1    1 40 19.3 4.1     19   19.31 3.71   9  27    18 -0.15     -0.1 0.65
  
  
##################  
### Brief Grief Questionnaire 
# Citations: (1) Shear, K., & Essock, S. (2002). Brief grief questionnaire. Pittsburgh, PA: University of Pittsburgh. (2) Shear, K. M., Jackson, C. T., Essock, S. M., Donahue, S. A., & Felton, C. J. (2006). Screening for complicated grief among Project Liberty service recipients 18 months after September 11, 2001. Psychiatric Services, 57(9), 1291-1297.
# Sum all items (0 = Not at all, 1 = Somewhat, 2 = A lot).  [tot_bgq]
## Possible range: 0 – 10. 
## Cutoffs from Shear et al. (2006): “8 or higher, complicated grief was likely; between 5 and 7, complicated grief was likely at a subthreshold level; and less than 5, complicated grief was unlikely.” For a dichotomous variable, a score of 5 or above was taken as a positive CG screen.
    
tot_bgq <- subset(baseline_4, select=c(bgq_1:bgq_5))
baseline_4$tot_bgq <- rowSums(tot_bgq, na.rm=TRUE)
  
describe(baseline_4$tot_bgq)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 9.55 2.28      9    9.44 1.48   6  15     9 0.47    -0.33 0.36
  
##################  
### Experiences in Close Relationships - Relationship Structures (Global Version)
# Citations: Fraley, R. C., Heffernan, M. E., Vicary, A. M., & Brumbaugh, C. C. (2011). The Experiences in Close Relationships-Relationship Structures questionnaire: A method for assessing attachment orientations across relationships. Psychological Assessment, 23, 615-625.
# Reverse-scored: 1, 2, 3, 4.
# Two subscales (NO overall total)
## Avoidance: 1-6 [tot_ecrrs_global_avoid] (average)
## Anxiety: 7-9 [tot_ecrrs_global_anx] (average)
# Fix incorrect Qualtrics coding:
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_1c = recode(ecrrs_global_1, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_2c = recode(ecrrs_global_2, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_3c = recode(ecrrs_global_3, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_4c = recode(ecrrs_global_4, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_5c = recode(ecrrs_global_5, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_6c = recode(ecrrs_global_6, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_7c = recode(ecrrs_global_7, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_8c = recode(ecrrs_global_8, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_global_9c = recode(ecrrs_global_9, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <- baseline_4 %>% mutate_at(vars(ecrrs_global_1c:ecrrs_global_9c), funs(as.numeric))  
# Reverse code items 1-4:
baseline_4$ecrrs_global_1r <- 8 - baseline_4$ecrrs_global_1c
baseline_4$ecrrs_global_2r <- 8 - baseline_4$ecrrs_global_2c
baseline_4$ecrrs_global_3r <- 8 - baseline_4$ecrrs_global_3c
baseline_4$ecrrs_global_4r <- 8 - baseline_4$ecrrs_global_4c
tot_ecrrs_global_avoid <- subset(baseline_4,  select=c(ecrrs_global_1r:ecrrs_global_4r, ecrrs_global_5c, ecrrs_global_6c))
tot_ecrrs_global_anx <- subset(baseline_4,  select=c(ecrrs_global_7c:ecrrs_global_9c))
  
baseline_4$tot_ecrrs_global_avoid <- rowMeans(tot_ecrrs_global_avoid, na.rm=TRUE)
baseline_4$tot_ecrrs_global_anx <- rowMeans(tot_ecrrs_global_anx, na.rm=TRUE)
 
describe(baseline_4$tot_ecrrs_global_avoid)
   vars  n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 40  3.4 1.09   3.42     3.4 0.86   1 6.33  5.33 0.08     0.22 0.17
describe(baseline_4$tot_ecrrs_global_anx)
   vars  n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 40 3.24 1.46   3.33    3.17 1.98   1 6.33  5.33 0.36    -0.86 0.23
    
##################  
### Experiences in Close Relationships - Relationship Structures (Romantic Partner/Spouse Version)
# Citations: Fraley, R. C., Heffernan, M. E., Vicary, A. M., & Brumbaugh, C. C. (2011). The Experiences in Close Relationships-Relationship Structures questionnaire: A method for assessing attachment orientations across relationships. Psychological Assessment, 23, 615-625.
# Reverse-scored: 1, 2, 3, 4.
# Two subscales (NO overall total) 
## Avoidance: 1-6 [tot_ecrrs_global_avoid] (average)
## Anxiety: 7-9 [tot_ecrrs_global_anx] (average)
# Fix incorrect Qualtrics coding
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_1c = recode(ecrrs_spouse_1, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_2c = recode(ecrrs_spouse_2, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_3c = recode(ecrrs_spouse_3, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_4c = recode(ecrrs_spouse_4, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_5c = recode(ecrrs_spouse_5, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_6c = recode(ecrrs_spouse_6, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_7c = recode(ecrrs_spouse_7, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_8c = recode(ecrrs_spouse_8, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <-  baseline_4 %>% mutate(ecrrs_spouse_9c = recode(ecrrs_spouse_9, "1"="1", "2"="2", "3"="3", "4"="4", "7"="5", "8"="6", "9"="7"))
baseline_4 <- baseline_4 %>% mutate_at(vars(ecrrs_spouse_1c:ecrrs_spouse_9c), funs(as.numeric)) 
# Reverse code items 1-4:
baseline_4$ecrrs_spouse_1r <- 8 - baseline_4$ecrrs_spouse_1c
baseline_4$ecrrs_spouse_2r <- 8 - baseline_4$ecrrs_spouse_2c
baseline_4$ecrrs_spouse_3r <- 8 - baseline_4$ecrrs_spouse_3c
baseline_4$ecrrs_spouse_4r <- 8 - baseline_4$ecrrs_spouse_4c
tot_ecrrs_spouse_avoid <- subset(baseline_4,  select=c(ecrrs_spouse_1r:ecrrs_spouse_4r, ecrrs_spouse_5c, ecrrs_spouse_6c))
tot_ecrrs_spouse_anx <- subset(baseline_4,  select=c(ecrrs_spouse_7c:ecrrs_spouse_9c))
  
baseline_4$tot_ecrrs_spouse_avoid <- rowMeans(tot_ecrrs_spouse_avoid, na.rm=TRUE)
baseline_4$tot_ecrrs_spouse_anx <- rowMeans(tot_ecrrs_spouse_anx, na.rm=TRUE)
 
describe(baseline_4$tot_ecrrs_spouse_avoid)
   vars  n mean   sd median trimmed  mad min  max range skew kurtosis   se
X1    1 40 2.15 1.18   1.67    2.01 0.99   1 5.33  4.33 0.79    -0.45 0.19
describe(baseline_4$tot_ecrrs_spouse_anx)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 2.23 1.56   1.33    1.96 0.49   1   6     5 0.98    -0.35 0.25
  
# Save your work again
saveRDS(baseline_4, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_4.rds")

3.7 Histograms and boxplots

# Create a subset of only scale total scores (i.e., variables that start with "tot")
scales <- baseline_4[, grep('^tot', names(baseline_4))]
# Plot the variables:
for(i in 1:length(scales)) boxplot(scales[,i], xlab=NULL, main=names(scales[i]))

for(i in 1:length(scales)) hist(scales[,i], xlab=NULL, main=names(scales[i]))

# Check out age and timesincedeath as well:
boxplot(baseline_4$age_yrs, main="age_yrs")

boxplot(baseline_4$timesincedeath/365, main="timesincedeath") # in years

hist(baseline_4$age_yrs)

hist(baseline_4$timesincedeath/365) # in years

describe(baseline_4$age_yrs)
   vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
X1    1 40 69.22 6.49  70.19   69.38 7.33 57.11 79.73 22.62 -0.22    -1.03 1.03
describe(baseline_4$timesincedeath)
   vars  n  mean     sd median trimmed    mad min  max range skew kurtosis    se
X1    1 40 468.5 248.34    429  433.97 220.17 151 1095   944 1.03     0.06 39.27

Note that there is one participant (D130) whose timesincedeath is <6 months (151 days or ~5 months). Although he was screened 3/31/16 and completed the baseline survey 4/11/16, we waited until 5/18/16 to scan him because of the time criterion, at which point it had been 6.2 months.

3.8 Descriptives (numerical variables)

# View descriptives for each scale
## stargazer makes nice-looking summary tables (https://cran.r-project.org/web/packages/stargazer/vignettes/stargazer.pdf)
library(stargazer) # install.packages("stargazer") if this is the first time using the package on this machine

Please cite as: 

 Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
 R package version 5.2.1. https://CRAN.R-project.org/package=stargazer 
stargazer(scales, type="text")

=====================================================
Statistic              N   Mean  St. Dev.  Min   Max 
-----------------------------------------------------
tot_pss                40 12.925  6.750     4    28  
tot_ysl                40 67.375  18.786   31    100 
tot_icg                40 23.350  12.469    4    51  
tot_bdi                40 10.325  7.721     0    28  
tot_handedness         40 15.425  5.415    13    39  
tot_bisbas_basdr       40 8.950   2.459     4    13  
tot_bisbas_basfun      40 9.800   2.221     4    14  
tot_bisbas_basrr       40 15.750  2.204     9    19  
tot_bisbas_bis         40 19.300  4.096     9    27  
tot_bgq                40 9.550   2.275     6    15  
tot_ecrrs_global_avoid 40 3.400   1.087   1.000 6.333
tot_ecrrs_global_anx   40 3.242   1.464   1.000 6.333
tot_ecrrs_spouse_avoid 40 2.146   1.176   1.000 5.333
tot_ecrrs_spouse_anx   40 2.225   1.561   1.000 6.000
-----------------------------------------------------

3.9 Frequencies (categorical variables)

# Make a subset of ONLY variables that are factors
# and print column names (fast way to know exactly which variables to use here)
factors <- baseline_4 %>%
  select_if(is.factor)
colnames(factors)
 [1] "sex_m"                   "knowbefore_y"            "caretaker_y"             "education"               "highestdegree"          
 [6] "employment"              "ethnicity_hisp"          "race"                    "meds_y"                  "majorhealthprobs_y"     
[11] "past2wks_injuryinfect_y" "past2wks_dentist_y"      "currenttx_y"             "postmenopausal_y"        "n_livebirths"           
[16] "n_nursed"                "smoking_y"               "smoking_perday"          "caffeine_perday"         "exercise"               
# Frequency tables
# Note below that I've grouped some of the counts to make them more informative, for example highest degree by education or ethnicity_hisp by race
## demographics:
count(baseline_4,sex_m)
count(baseline_4,education,highestdegree) 
count(baseline_4,employment)
count(baseline_4,race,ethnicity_hisp)
## medical:
count(baseline_4,meds_y)
count(baseline_4,majorhealthprobs_y)
count(baseline_4,past2wks_injuryinfect_y)
count(baseline_4,past2wks_dentist_y)
count(baseline_4,currenttx_y)
count(baseline_4,postmenopausal_y)
count(baseline_4,n_livebirths)
count(baseline_4,n_nursed)
count(baseline_4,smoking_perday, smoking_y)
count(baseline_4,caffeine_perday)
count(baseline_4,exercise)
## other:
count(baseline_4,knowbefore_y)
count(baseline_4,caretaker_y)
# I can look at n-way frequency tables using count as well, though these are harder to understand
## e.g., look at knowbefore broken down by both sex and race
count(baseline_4,knowbefore_y,sex_m,race)

hist and boxplot won’t work with non-numerical variables, but here’s a code snippet for a basic bar chart for a categorical variable in ggplot:

library(ggplot2)
ggplot(factors, aes(x = baseline$education)) +
        geom_bar() +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))

3.10 Evaluate missing data

This will be done together with the baseline added measures (see missing data section under Baseline added measures heading).

3.11 Check scale reliabilities

# The 'alpha' function is helpful because it will alert you if your reverse coding went awry somehow. 
## Note that Emily Butler says it's not always correct - if it flags an issues and you've double- and triple-checked your reverse coding, ignore it.
# Primarily, we use/report the standard alpha.
library(psych)
psych::alpha(tot_pss)

Reliability analysis   
Call: psych::alpha(x = tot_pss)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.88      0.88    0.92      0.43 7.7 0.027  1.3 0.67     0.42

 lower alpha upper     95% confidence boundaries
0.83 0.88 0.94 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
pss_1       0.88      0.88    0.92      0.45 7.3    0.029 0.024  0.44
pss_2       0.87      0.87    0.91      0.42 6.6    0.031 0.025  0.42
pss_3       0.87      0.87    0.91      0.43 6.8    0.030 0.025  0.42
pss_4r      0.88      0.88    0.92      0.46 7.6    0.028 0.021  0.43
pss_5r      0.86      0.87    0.90      0.42 6.4    0.033 0.023  0.41
pss_6       0.87      0.87    0.92      0.43 6.9    0.031 0.028  0.44
pss_7r      0.87      0.87    0.91      0.43 6.9    0.030 0.025  0.44
pss_8r      0.86      0.86    0.90      0.41 6.4    0.033 0.022  0.42
pss_9       0.88      0.88    0.92      0.46 7.6    0.028 0.025  0.46
pss_10      0.87      0.87    0.91      0.43 6.9    0.030 0.026  0.42

 Item statistics 
        n raw.r std.r r.cor r.drop mean   sd
pss_1  40  0.62  0.63  0.59   0.53 1.45 0.90
pss_2  40  0.75  0.76  0.74   0.68 1.38 0.95
pss_3  40  0.71  0.72  0.70   0.63 1.88 0.99
pss_4r 40  0.61  0.59  0.54   0.49 1.07 1.14
pss_5r 40  0.81  0.80  0.80   0.75 1.48 1.09
pss_6  40  0.71  0.71  0.67   0.63 1.27 0.88
pss_7r 40  0.71  0.70  0.68   0.62 0.97 1.00
pss_8r 40  0.81  0.80  0.81   0.76 1.15 0.95
pss_9  40  0.55  0.58  0.51   0.47 1.32 0.76
pss_10 40  0.71  0.71  0.69   0.63 0.95 0.93

Non missing response frequency for each item
          0    1    2    3    4 miss
pss_1  0.18 0.28 0.50 0.02 0.02    0
pss_2  0.15 0.48 0.25 0.10 0.02    0
pss_3  0.05 0.35 0.32 0.22 0.05    0
pss_4r 0.40 0.28 0.22 0.05 0.05    0
pss_5r 0.20 0.32 0.32 0.10 0.05    0
pss_6  0.20 0.40 0.32 0.08 0.00    0
pss_7r 0.38 0.38 0.18 0.05 0.02    0
pss_8r 0.22 0.50 0.22 0.00 0.05    0
pss_9  0.12 0.48 0.35 0.05 0.00    0
pss_10 0.42 0.22 0.32 0.02 0.00    0
psych::alpha(tot_ysl)

Reliability analysis   
Call: psych::alpha(x = tot_ysl)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
      0.96      0.96    0.99      0.52  23 0.0093  3.2 0.89     0.55

 lower alpha upper     95% confidence boundaries
0.94 0.96 0.98 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
ysl_1       0.96      0.96    0.98      0.54  24   0.0093 0.017  0.57
ysl_2       0.95      0.95    0.98      0.51  21   0.0099 0.025  0.54
ysl_3       0.95      0.95    0.98      0.51  21   0.0100 0.025  0.54
ysl_4       0.96      0.96    0.98      0.52  22   0.0097 0.025  0.56
ysl_5       0.95      0.95    0.98      0.51  21   0.0099 0.025  0.54
ysl_6       0.95      0.95    0.98      0.51  21   0.0100 0.025  0.54
ysl_7       0.96      0.96    0.98      0.52  21   0.0097 0.024  0.55
ysl_8       0.95      0.95    0.98      0.51  21   0.0101 0.024  0.54
ysl_9       0.95      0.95    0.98      0.51  21   0.0101 0.024  0.54
ysl_10      0.95      0.95    0.98      0.51  21   0.0101 0.024  0.54
ysl_11      0.95      0.95    0.98      0.51  21   0.0099 0.024  0.54
ysl_12      0.96      0.96    0.98      0.52  22   0.0095 0.025  0.56
ysl_13      0.96      0.96    0.98      0.53  23   0.0092 0.023  0.56
ysl_14      0.95      0.95    0.98      0.51  21   0.0099 0.025  0.54
ysl_15      0.96      0.96    0.98      0.53  23   0.0092 0.024  0.56
ysl_16      0.96      0.96    0.98      0.53  22   0.0094 0.024  0.57
ysl_17      0.95      0.96    0.98      0.52  21   0.0098 0.024  0.54
ysl_18      0.96      0.96    0.98      0.52  22   0.0097 0.025  0.55
ysl_19      0.95      0.95    0.98      0.51  21   0.0099 0.025  0.54
ysl_20      0.95      0.96    0.98      0.51  21   0.0098 0.024  0.55
ysl_21      0.95      0.95    0.98      0.51  21   0.0102 0.023  0.54

 Item statistics 
        n raw.r std.r r.cor r.drop mean   sd
ysl_1  40  0.37  0.40  0.39   0.34  4.3 0.74
ysl_2  40  0.80  0.80  0.80   0.77  3.5 1.11
ysl_3  40  0.85  0.85  0.84   0.83  2.4 0.98
ysl_4  40  0.71  0.72  0.72   0.69  2.8 0.89
ysl_5  40  0.79  0.80  0.79   0.77  2.9 1.14
ysl_6  40  0.82  0.82  0.82   0.80  2.9 1.19
ysl_7  40  0.75  0.74  0.73   0.71  3.2 1.62
ysl_8  40  0.82  0.81  0.80   0.79  2.5 1.48
ysl_9  40  0.84  0.83  0.83   0.81  2.7 1.38
ysl_10 40  0.82  0.82  0.82   0.80  2.6 1.34
ysl_11 40  0.79  0.78  0.78   0.76  3.0 1.31
ysl_12 40  0.66  0.66  0.65   0.61  2.7 1.27
ysl_13 40  0.59  0.59  0.58   0.54  3.7 1.26
ysl_14 40  0.80  0.80  0.79   0.78  3.7 1.20
ysl_15 40  0.58  0.59  0.58   0.53  3.8 1.26
ysl_16 40  0.58  0.59  0.58   0.54  4.5 0.85
ysl_17 40  0.76  0.75  0.74   0.73  3.5 1.15
ysl_18 40  0.72  0.72  0.70   0.69  3.0 1.20
ysl_19 40  0.78  0.77  0.77   0.75  3.4 1.13
ysl_20 40  0.77  0.77  0.76   0.74  3.2 1.35
ysl_21 40  0.85  0.84  0.84   0.82  3.2 1.38

Non missing response frequency for each item
          1    2    3    4    5 miss
ysl_1  0.00 0.00 0.15 0.35 0.50    0
ysl_2  0.02 0.18 0.28 0.30 0.22    0
ysl_3  0.25 0.22 0.42 0.10 0.00    0
ysl_4  0.08 0.28 0.48 0.15 0.02    0
ysl_5  0.08 0.38 0.25 0.20 0.10    0
ysl_6  0.18 0.20 0.28 0.30 0.05    0
ysl_7  0.22 0.18 0.15 0.10 0.35    0
ysl_8  0.35 0.20 0.20 0.08 0.18    0
ysl_9  0.28 0.18 0.30 0.10 0.15    0
ysl_10 0.28 0.25 0.20 0.18 0.10    0
ysl_11 0.15 0.22 0.30 0.15 0.18    0
ysl_12 0.20 0.30 0.22 0.18 0.10    0
ysl_13 0.08 0.10 0.22 0.25 0.35    0
ysl_14 0.05 0.10 0.30 0.20 0.35    0
ysl_15 0.02 0.18 0.20 0.15 0.45    0
ysl_16 0.00 0.02 0.15 0.15 0.68    0
ysl_17 0.05 0.15 0.32 0.25 0.22    0
ysl_18 0.10 0.28 0.20 0.32 0.10    0
ysl_19 0.05 0.15 0.35 0.25 0.20    0
ysl_20 0.10 0.25 0.20 0.20 0.25    0
ysl_21 0.18 0.12 0.25 0.25 0.20    0
psych::alpha(tot_icg)

Reliability analysis   
Call: psych::alpha(x = tot_icg)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.92      0.92    0.96      0.37  11 0.017  1.2 0.66     0.35

 lower alpha upper     95% confidence boundaries
0.89 0.92 0.95 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r  S/N alpha se var.r med.r
icg_1       0.91      0.91    0.95      0.35  9.8    0.019 0.036  0.33
icg_2       0.92      0.91    0.96      0.37 10.5    0.018 0.039  0.34
icg_3       0.91      0.91    0.95      0.35  9.8    0.019 0.037  0.33
icg_4       0.92      0.91    0.96      0.36 10.2    0.018 0.041  0.33
icg_5       0.92      0.92    0.96      0.38 11.2    0.017 0.040  0.37
icg_6       0.91      0.91    0.95      0.36 10.2    0.018 0.038  0.33
icg_7       0.91      0.91    0.95      0.35  9.9    0.019 0.037  0.33
icg_8       0.91      0.91    0.96      0.36 10.0    0.018 0.039  0.33
icg_9       0.91      0.91    0.95      0.36 10.0    0.018 0.040  0.34
icg_10      0.92      0.91    0.96      0.36 10.2    0.018 0.041  0.34
icg_11      0.92      0.92    0.96      0.39 11.7    0.017 0.035  0.37
icg_12      0.92      0.92    0.96      0.39 11.4    0.017 0.039  0.38
icg_13      0.91      0.91    0.96      0.35  9.8    0.019 0.039  0.33
icg_14      0.92      0.92    0.95      0.39 11.3    0.016 0.037  0.37
icg_15      0.92      0.92    0.95      0.38 11.1    0.017 0.039  0.37
icg_16      0.92      0.91    0.96      0.36 10.3    0.018 0.041  0.33
icg_17      0.92      0.91    0.96      0.37 10.4    0.018 0.039  0.34
icg_18      0.92      0.91    0.96      0.37 10.7    0.017 0.042  0.36
icg_19      0.91      0.91    0.95      0.36 10.1    0.018 0.040  0.33

 Item statistics 
        n raw.r std.r r.cor r.drop mean   sd
icg_1  40  0.82  0.81  0.81   0.80 1.40 0.87
icg_2  40  0.63  0.62  0.61   0.58 1.82 0.96
icg_3  40  0.83  0.82  0.82   0.80 1.20 1.18
icg_4  40  0.70  0.71  0.70   0.65 2.50 1.15
icg_5  40  0.42  0.43  0.39   0.36 1.85 0.92
icg_6  40  0.73  0.71  0.71   0.68 1.48 1.18
icg_7  40  0.80  0.79  0.79   0.76 1.65 1.14
icg_8  40  0.76  0.76  0.76   0.72 1.38 1.08
icg_9  40  0.74  0.75  0.75   0.71 0.70 0.76
icg_10 40  0.68  0.70  0.69   0.64 0.88 0.94
icg_11 40  0.24  0.28  0.23   0.19 0.25 0.54
icg_12 40  0.37  0.38  0.33   0.30 0.72 0.91
icg_13 40  0.82  0.81  0.80   0.78 1.95 1.26
icg_14 40  0.37  0.39  0.37   0.30 0.68 0.94
icg_15 40  0.44  0.46  0.45   0.38 0.38 0.87
icg_16 40  0.69  0.68  0.66   0.63 0.75 1.21
icg_17 40  0.67  0.66  0.65   0.62 0.88 1.09
icg_18 40  0.56  0.56  0.54   0.50 0.90 1.08
icg_19 40  0.73  0.72  0.72   0.69 2.00 1.06

Non missing response frequency for each item
          0    1    2    3    4 miss
icg_1  0.15 0.40 0.35 0.10 0.00    0
icg_2  0.08 0.30 0.38 0.22 0.02    0
icg_3  0.38 0.22 0.28 0.08 0.05    0
icg_4  0.08 0.10 0.28 0.35 0.20    0
icg_5  0.05 0.30 0.45 0.15 0.05    0
icg_6  0.25 0.28 0.28 0.15 0.05    0
icg_7  0.18 0.30 0.28 0.20 0.05    0
icg_8  0.25 0.30 0.30 0.12 0.02    0
icg_9  0.48 0.35 0.18 0.00 0.00    0
icg_10 0.42 0.35 0.15 0.08 0.00    0
icg_11 0.80 0.15 0.05 0.00 0.00    0
icg_12 0.52 0.28 0.15 0.05 0.00    0
icg_13 0.12 0.28 0.28 0.18 0.15    0
icg_14 0.57 0.22 0.18 0.00 0.02    0
icg_15 0.80 0.08 0.10 0.00 0.02    0
icg_16 0.65 0.12 0.10 0.08 0.05    0
icg_17 0.52 0.18 0.22 0.05 0.02    0
icg_18 0.50 0.22 0.15 0.12 0.00    0
icg_19 0.08 0.25 0.35 0.25 0.08    0
psych::alpha(tot_bgq)

Reliability analysis   
Call: psych::alpha(x = tot_bgq)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.71      0.72    0.73      0.34 2.5 0.071  1.9 0.46     0.31

 lower alpha upper     95% confidence boundaries
0.57 0.71 0.85 

 Reliability if an item is dropped:
      raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bgq_1      0.62      0.63    0.61      0.30 1.7    0.095 0.030  0.33
bgq_2      0.56      0.55    0.51      0.24 1.2    0.110 0.015  0.28
bgq_3      0.72      0.73    0.73      0.41 2.8    0.073 0.028  0.33
bgq_4      0.67      0.67    0.68      0.34 2.0    0.084 0.052  0.31
bgq_5      0.72      0.73    0.72      0.40 2.7    0.070 0.033  0.35

 Item statistics 
       n raw.r std.r r.cor r.drop mean   sd
bgq_1 40  0.76  0.75  0.72   0.56  1.9 0.71
bgq_2 40  0.85  0.86  0.88   0.74  2.1 0.62
bgq_3 40  0.49  0.56  0.38   0.29  2.0 0.51
bgq_4 40  0.69  0.68  0.55   0.47  1.8 0.71
bgq_5 40  0.62  0.57  0.39   0.34  1.7 0.76

Non missing response frequency for each item
         1    2    3 miss
bgq_1 0.28 0.50 0.22    0
bgq_2 0.15 0.62 0.22    0
bgq_3 0.12 0.75 0.12    0
bgq_4 0.35 0.48 0.18    0
bgq_5 0.48 0.35 0.18    0
psych::alpha(tot_bdi)

Reliability analysis   
Call: psych::alpha(x = tot_bdi)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
       0.9       0.9    0.97      0.31 9.4 0.022  0.5 0.37     0.31

 lower alpha upper     95% confidence boundaries
0.85 0.9 0.94 

 Reliability if an item is dropped:
        raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bdi_1c       0.89      0.90    0.97      0.31 8.9    0.023 0.036  0.31
bdi_2c       0.89      0.90    0.97      0.31 9.1    0.023 0.036  0.31
bdi_3c       0.90      0.90    0.97      0.32 9.5    0.022 0.033  0.33
bdi_4c       0.89      0.90    0.97      0.30 8.5    0.025 0.034  0.30
bdi_5c       0.89      0.90    0.97      0.31 8.8    0.023 0.036  0.30
bdi_6c       0.90      0.91    0.97      0.33 9.7    0.022 0.031  0.34
bdi_7c       0.89      0.90    0.97      0.30 8.7    0.024 0.035  0.30
bdi_8c       0.89      0.90    0.97      0.31 8.9    0.023 0.036  0.31
bdi_9c       0.90      0.90    0.97      0.31 9.1    0.023 0.035  0.32
bdi_10c      0.89      0.90    0.97      0.30 8.7    0.024 0.035  0.30
bdi_11c      0.90      0.90    0.97      0.32 9.3    0.023 0.035  0.33
bdi_12c      0.88      0.89    0.97      0.29 8.3    0.026 0.032  0.30
bdi_13c      0.89      0.90    0.97      0.31 9.1    0.023 0.035  0.31
bdi_14c      0.89      0.90    0.96      0.31 8.8    0.024 0.035  0.30
bdi_15c      0.89      0.90    0.96      0.30 8.6    0.025 0.035  0.30
bdi_16c      0.89      0.90    0.97      0.31 8.9    0.023 0.037  0.31
bdi_17c      0.89      0.90    0.97      0.31 9.0    0.023 0.035  0.31
bdi_18c      0.90      0.91    0.97      0.33 9.8    0.022 0.033  0.35
bdi_19c      0.89      0.90    0.97      0.31 8.9    0.024 0.033  0.30
bdi_20c      0.89      0.90    0.97      0.30 8.7    0.025 0.034  0.30
bdi_21c      0.91      0.91    0.97      0.32 9.6    0.020 0.033  0.33

 Item statistics 
         n raw.r std.r r.cor r.drop mean   sd
bdi_1c  39  0.59  0.61  0.60   0.54 0.41 0.50
bdi_2c  40  0.55  0.56  0.56   0.48 0.35 0.62
bdi_3c  40  0.35  0.40  0.38   0.28 0.23 0.48
bdi_4c  40  0.76  0.75  0.75   0.72 0.78 0.70
bdi_5c  40  0.61  0.64  0.63   0.56 0.42 0.50
bdi_6c  40  0.30  0.35  0.33   0.26 0.10 0.38
bdi_7c  39  0.64  0.68  0.68   0.59 0.31 0.66
bdi_8c  39  0.64  0.63  0.63   0.57 0.31 0.52
bdi_9c  39  0.50  0.54  0.54   0.47 0.13 0.34
bdi_10c 40  0.71  0.71  0.71   0.67 0.65 0.62
bdi_11c 40  0.49  0.48  0.46   0.42 0.53 0.60
bdi_12c 40  0.87  0.85  0.85   0.84 0.62 0.84
bdi_13c 39  0.57  0.53  0.52   0.50 0.64 0.74
bdi_14c 40  0.64  0.66  0.66   0.59 0.38 0.63
bdi_15c 39  0.79  0.74  0.74   0.71 0.54 0.72
bdi_16c 40  0.61  0.61  0.59   0.55 0.75 0.67
bdi_17c 40  0.55  0.57  0.57   0.50 0.23 0.48
bdi_18c 40  0.29  0.29  0.26   0.22 0.62 0.67
bdi_19c 39  0.64  0.62  0.61   0.59 0.62 0.63
bdi_20c 40  0.75  0.71  0.71   0.70 0.65 0.66
bdi_21c 40  0.45  0.38  0.36   0.33 1.15 1.14

Non missing response frequency for each item
           0    1    2    3 miss
bdi_1c  0.59 0.41 0.00 0.00 0.03
bdi_2c  0.72 0.20 0.08 0.00 0.00
bdi_3c  0.80 0.18 0.02 0.00 0.00
bdi_4c  0.35 0.55 0.08 0.02 0.00
bdi_5c  0.57 0.42 0.00 0.00 0.00
bdi_6c  0.92 0.05 0.02 0.00 0.00
bdi_7c  0.79 0.10 0.10 0.00 0.03
bdi_8c  0.72 0.26 0.03 0.00 0.03
bdi_9c  0.87 0.13 0.00 0.00 0.03
bdi_10c 0.40 0.57 0.00 0.02 0.00
bdi_11c 0.52 0.42 0.05 0.00 0.00
bdi_12c 0.55 0.32 0.08 0.05 0.00
bdi_13c 0.51 0.33 0.15 0.00 0.03
bdi_14c 0.70 0.22 0.08 0.00 0.00
bdi_15c 0.59 0.28 0.13 0.00 0.03
bdi_16c 0.38 0.50 0.12 0.00 0.00
bdi_17c 0.80 0.18 0.02 0.00 0.00
bdi_18c 0.45 0.50 0.02 0.02 0.00
bdi_19c 0.46 0.46 0.08 0.00 0.03
bdi_20c 0.45 0.45 0.10 0.00 0.00
bdi_21c 0.42 0.15 0.28 0.15 0.00
psych::alpha(tot_handedness)
Matrix was not positive definite, smoothing was doneIn factor.stats, I could not find the RMSEA upper bound . Sorry about that
Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was done

Reliability analysis   
Call: psych::alpha(x = tot_handedness)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.94      0.94    0.99      0.57  17 0.013  1.2 0.42     0.59

 lower alpha upper     95% confidence boundaries
0.92 0.94 0.97 

 Reliability if an item is dropped:
            raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
hand_1c          0.93      0.94    0.98      0.55  14    0.016 0.029  0.55
hand_2c          0.93      0.94    0.98      0.55  14    0.016 0.029  0.55
hand_3c          0.94      0.94    0.97      0.57  16    0.014 0.033  0.60
hand_4c          0.94      0.94    0.98      0.58  16    0.014 0.030  0.60
hand_5c          0.93      0.94    0.98      0.55  14    0.016 0.030  0.57
hand_6c          0.93      0.94    0.98      0.56  15    0.015 0.034  0.59
hand_7c          0.94      0.95    0.98      0.59  17    0.013 0.031  0.60
hand_8c          0.93      0.94    0.98      0.55  15    0.015 0.031  0.58
hand_9c          0.94      0.94    0.98      0.58  16    0.014 0.030  0.60
hand_10c         0.94      0.94    0.99      0.58  16    0.014 0.036  0.60
hand_11c         0.94      0.94    0.98      0.58  16    0.014 0.032  0.59
hand_12c         0.94      0.94    0.98      0.57  16    0.014 0.033  0.58
hand_bat_1c      0.94      0.94    0.99      0.58  16    0.013 0.034  0.60

 Item statistics 
             n raw.r std.r r.cor r.drop mean   sd
hand_1c     40  0.92  0.91  0.91   0.90  1.1 0.53
hand_2c     40  0.92  0.91  0.91   0.90  1.1 0.53
hand_3c     39  0.73  0.77  0.77   0.70  1.2 0.43
hand_4c     40  0.72  0.71  0.72   0.67  1.1 0.53
hand_5c     40  0.91  0.90  0.90   0.89  1.2 0.55
hand_6c     40  0.83  0.82  0.81   0.79  1.3 0.65
hand_7c     40  0.58  0.61  0.60   0.52  1.1 0.43
hand_8c     40  0.87  0.86  0.86   0.84  1.2 0.58
hand_9c     40  0.72  0.71  0.72   0.67  1.1 0.53
hand_10c    40  0.67  0.70  0.67   0.63  1.1 0.35
hand_11c    40  0.70  0.70  0.69   0.64  1.2 0.55
hand_12c    40  0.76  0.77  0.76   0.71  1.2 0.53
hand_bat_1c 40  0.72  0.70  0.67   0.64  1.4 0.77

Non missing response frequency for each item
               1    2    3 miss
hand_1c     0.92 0.00 0.08 0.00
hand_2c     0.92 0.00 0.08 0.00
hand_3c     0.87 0.10 0.03 0.03
hand_4c     0.92 0.00 0.08 0.00
hand_5c     0.90 0.02 0.08 0.00
hand_6c     0.80 0.10 0.10 0.00
hand_7c     0.88 0.10 0.02 0.00
hand_8c     0.85 0.08 0.08 0.00
hand_9c     0.92 0.00 0.08 0.00
hand_10c    0.95 0.02 0.02 0.00
hand_11c    0.90 0.02 0.08 0.00
hand_12c    0.82 0.12 0.05 0.00
hand_bat_1c 0.80 0.02 0.18 0.00
psych::alpha(tot_bis)

Reliability analysis   
Call: psych::alpha(x = tot_bis)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.83      0.83    0.84      0.41 4.8 0.042  2.8 0.59     0.43

 lower alpha upper     95% confidence boundaries
0.74 0.83 0.91 

 Reliability if an item is dropped:
           raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
bisbas_2        0.81      0.81    0.82      0.41 4.2    0.048 0.0181  0.48
bisbas_8r       0.80      0.80    0.81      0.40 4.0    0.049 0.0160  0.43
bisbas_13r      0.79      0.79    0.79      0.39 3.8    0.051 0.0161  0.38
bisbas_16r      0.80      0.80    0.81      0.40 4.0    0.050 0.0145  0.38
bisbas_19r      0.80      0.80    0.80      0.40 4.1    0.049 0.0099  0.41
bisbas_22       0.83      0.83    0.82      0.45 5.0    0.043 0.0068  0.49
bisbas_24r      0.80      0.80    0.80      0.41 4.1    0.049 0.0165  0.43

 Item statistics 
            n raw.r std.r r.cor r.drop mean   sd
bisbas_2   40  0.72  0.69  0.61   0.56  2.6 1.01
bisbas_8r  40  0.71  0.73  0.67   0.60  3.1 0.78
bisbas_13r 40  0.76  0.77  0.73   0.65  3.0 0.78
bisbas_16r 40  0.73  0.73  0.68   0.61  2.4 0.78
bisbas_19r 40  0.71  0.72  0.68   0.59  3.2 0.81
bisbas_22  40  0.57  0.57  0.48   0.41  2.2 0.81
bisbas_24r 40  0.72  0.71  0.65   0.59  2.8 0.87

Non missing response frequency for each item
              1    2    3    4 miss
bisbas_2   0.15 0.32 0.30 0.22    0
bisbas_8r  0.02 0.18 0.48 0.32    0
bisbas_13r 0.05 0.18 0.55 0.22    0
bisbas_16r 0.12 0.40 0.42 0.05    0
bisbas_19r 0.05 0.08 0.45 0.42    0
bisbas_22  0.15 0.52 0.25 0.08    0
bisbas_24r 0.10 0.22 0.50 0.18    0
psych::alpha(tot_basdr)

Reliability analysis   
Call: psych::alpha(x = tot_basdr)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.75      0.76    0.74      0.44 3.1 0.065  2.2 0.61      0.4

 lower alpha upper     95% confidence boundaries
0.62 0.75 0.88 

 Reliability if an item is dropped:
           raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bisbas_3r       0.69      0.71    0.66      0.45 2.5    0.087 0.029  0.43
bisbas_9r       0.68      0.67    0.60      0.41 2.0    0.087 0.018  0.37
bisbas_12r      0.69      0.71    0.65      0.45 2.4    0.087 0.026  0.37
bisbas_21r      0.70      0.70    0.63      0.44 2.4    0.078 0.011  0.43

 Item statistics 
            n raw.r std.r r.cor r.drop mean   sd
bisbas_3r  40  0.78  0.75  0.62   0.55  2.4 0.90
bisbas_9r  40  0.75  0.79  0.71   0.59  2.5 0.68
bisbas_12r 40  0.78  0.75  0.63   0.55  2.4 0.90
bisbas_21r 40  0.73  0.76  0.66   0.52  1.7 0.76

Non missing response frequency for each item
              1    2    3    4 miss
bisbas_3r  0.20 0.30 0.42 0.08    0
bisbas_9r  0.05 0.42 0.48 0.05    0
bisbas_12r 0.18 0.38 0.35 0.10    0
bisbas_21r 0.50 0.32 0.18 0.00    0
psych::alpha(tot_basfun)

Reliability analysis   
Call: psych::alpha(x = tot_basfun)

  raw_alpha std.alpha G6(smc) average_r S/N  ase mean   sd median_r
      0.69      0.69    0.68      0.36 2.3 0.08  2.5 0.59     0.29

 lower alpha upper     95% confidence boundaries
0.54 0.69 0.85 

 Reliability if an item is dropped:
           raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
bisbas_5r       0.54      0.54    0.44      0.28 1.2    0.125 1.3e-04  0.29
bisbas_10r      0.56      0.56    0.46      0.30 1.3    0.121 7.1e-05  0.29
bisbas_15r      0.69      0.69    0.66      0.43 2.2    0.088 6.2e-02  0.29
bisbas_20r      0.70      0.70    0.67      0.44 2.3    0.084 5.8e-02  0.31

 Item statistics 
            n raw.r std.r r.cor r.drop mean   sd
bisbas_5r  40  0.80  0.80  0.77   0.61  3.2 0.79
bisbas_10r 40  0.79  0.79  0.75   0.58  2.7 0.79
bisbas_15r 39  0.66  0.65  0.43   0.38  2.0 0.78
bisbas_20r 40  0.65  0.64  0.42   0.36  2.0 0.80

Non missing response frequency for each item
              1    2    3    4 miss
bisbas_5r  0.02 0.15 0.42 0.40 0.00
bisbas_10r 0.05 0.35 0.45 0.15 0.00
bisbas_15r 0.31 0.41 0.28 0.00 0.03
bisbas_20r 0.30 0.45 0.22 0.02 0.00
psych::alpha(tot_basrr)

Reliability analysis   
Call: psych::alpha(x = tot_basrr)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.69       0.7    0.67      0.32 2.3 0.075  3.1 0.44     0.33

 lower alpha upper     95% confidence boundaries
0.55 0.69 0.84 

 Reliability if an item is dropped:
           raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
bisbas_4r       0.63      0.63    0.59      0.30 1.7    0.093 0.0103  0.30
bisbas_7r       0.64      0.66    0.60      0.32 1.9    0.091 0.0041  0.33
bisbas_14r      0.63      0.64    0.59      0.31 1.8    0.091 0.0070  0.33
bisbas_18r      0.66      0.68    0.62      0.34 2.1    0.087 0.0051  0.34
bisbas_23r      0.65      0.65    0.60      0.32 1.9    0.089 0.0116  0.33

 Item statistics 
            n raw.r std.r r.cor r.drop mean   sd
bisbas_4r  40  0.70  0.71  0.60   0.49  3.5 0.64
bisbas_7r  40  0.66  0.66  0.55   0.45  3.3 0.60
bisbas_14r 40  0.68  0.69  0.59   0.47  2.6 0.63
bisbas_18r 40  0.60  0.63  0.48   0.40  3.3 0.55
bisbas_23r 40  0.73  0.68  0.55   0.45  3.1 0.83

Non missing response frequency for each item
              1    2    3    4 miss
bisbas_4r  0.02 0.00 0.40 0.57    0
bisbas_7r  0.00 0.08 0.57 0.35    0
bisbas_14r 0.02 0.40 0.52 0.05    0
bisbas_18r 0.00 0.05 0.62 0.32    0
bisbas_23r 0.05 0.15 0.48 0.32    0
psych::alpha(tot_ecrrs_spouse_avoid)

Reliability analysis   
Call: psych::alpha(x = tot_ecrrs_spouse_avoid)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.91      0.93    0.95      0.69  13 0.023  2.1 1.2     0.68

 lower alpha upper     95% confidence boundaries
0.87 0.91 0.96 

 Reliability if an item is dropped:
                raw_alpha std.alpha G6(smc) average_r  S/N alpha se var.r med.r
ecrrs_spouse_1r      0.88      0.90    0.92      0.64  8.9    0.032 0.024  0.62
ecrrs_spouse_2r      0.89      0.91    0.93      0.67 10.0    0.028 0.021  0.66
ecrrs_spouse_3r      0.89      0.91    0.93      0.66  9.5    0.029 0.025  0.63
ecrrs_spouse_4r      0.90      0.92    0.94      0.70 11.5    0.027 0.029  0.66
ecrrs_spouse_5c      0.93      0.94    0.96      0.76 16.2    0.019 0.020  0.77
ecrrs_spouse_6c      0.90      0.93    0.94      0.72 12.7    0.028 0.036  0.77

 Item statistics 
                 n raw.r std.r r.cor r.drop mean  sd
ecrrs_spouse_1r 40  0.94  0.96  0.97   0.92  2.0 1.2
ecrrs_spouse_2r 40  0.87  0.91  0.91   0.83  1.9 1.1
ecrrs_spouse_3r 40  0.90  0.93  0.93   0.87  1.8 1.1
ecrrs_spouse_4r 40  0.83  0.85  0.82   0.75  2.0 1.4
ecrrs_spouse_5c 40  0.77  0.72  0.64   0.62  2.7 1.9
ecrrs_spouse_6c 40  0.83  0.81  0.77   0.74  2.3 1.6

Non missing response frequency for each item
                   1    2    3    4    5    6    7 miss
ecrrs_spouse_1r 0.42 0.30 0.12 0.12 0.00 0.02 0.00    0
ecrrs_spouse_2r 0.42 0.40 0.05 0.10 0.00 0.02 0.00    0
ecrrs_spouse_3r 0.50 0.32 0.05 0.10 0.02 0.00 0.00    0
ecrrs_spouse_4r 0.50 0.22 0.10 0.12 0.02 0.00 0.02    0
ecrrs_spouse_5c 0.38 0.22 0.02 0.20 0.05 0.10 0.02    0
ecrrs_spouse_6c 0.48 0.22 0.00 0.15 0.12 0.02 0.00    0
psych::alpha(tot_ecrrs_spouse_anx)

Reliability analysis   
Call: psych::alpha(x = tot_ecrrs_spouse_anx)

  raw_alpha std.alpha G6(smc) average_r S/N  ase mean  sd median_r
      0.86      0.87    0.85      0.68 6.4 0.04  2.2 1.6     0.64

 lower alpha upper     95% confidence boundaries
0.78 0.86 0.94 

 Reliability if an item is dropped:
                raw_alpha std.alpha G6(smc) average_r  S/N alpha se var.r med.r
ecrrs_spouse_7c      0.92      0.92    0.86      0.86 12.2    0.024    NA  0.86
ecrrs_spouse_8c      0.70      0.71    0.55      0.55  2.4    0.092    NA  0.55
ecrrs_spouse_9c      0.78      0.78    0.64      0.64  3.5    0.070    NA  0.64

 Item statistics 
                 n raw.r std.r r.cor r.drop mean  sd
ecrrs_spouse_7c 40  0.83  0.82  0.65   0.62  2.2 1.9
ecrrs_spouse_8c 40  0.93  0.94  0.93   0.84  2.3 1.8
ecrrs_spouse_9c 40  0.89  0.90  0.88   0.77  2.1 1.6

Non missing response frequency for each item
                   1    2    3    4    5    6    7 miss
ecrrs_spouse_7c 0.57 0.15 0.02 0.08 0.10 0.02 0.05    0
ecrrs_spouse_8c 0.52 0.18 0.00 0.15 0.08 0.05 0.02    0
ecrrs_spouse_9c 0.57 0.18 0.00 0.15 0.02 0.08 0.00    0
  
# save the cleaned data
saveRDS(baseline_4, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline.rds")
write.csv(baseline_4, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline.csv")
# 'haven' package should allow you to save as .sav file but won't work for me - file is blank when I open it in spss
# 'foreign' package hasn't worked either - may be compatibility issue with newer versions of SPSS?

4 Baseline added measures

This section of the script deals with the “post” addendum to the baseline survey, containing additional trait measures that participants completed at home after they finished their two experimental sessions. Ultimately, these data will be merged with the baseline dataset.

What has been done up to this point: (1) codebook created, (2) data exported from Qualtrics.

4.1 Import data and clean up Qualtrics junk

Task: Import data from CSV file except for the first 17 columns (1:17 is just Qualtrics junk).

# run install.packages("tidyverse") if this is the first time using dplyr on your local machine
library(dplyr) 
filter <- dplyr::filter
select <- dplyr::select
baseline_post <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT+fMRI+Post_January+18%2C+2019_14.24.csv", stringsAsFactors = FALSE, na.strings="")[ ,-c(2:17)]
# na.strings = "" replaces all instances where missing data is represented by blank cells with NA, which is how R handles missing values.
View(baseline_post)

Note that we need to correct some of the IDs to match the baseline dataset so that the two datasets can ultimately be merged.

# Found some duplicate IDs:
  # Duplicate IDs with non-duplicated data: D131 (row 31 blank), D145 (row 43 blank)
  # Duplicate IDs with duplicated data: D130 (looks like data was entered 2x? lines 33 and 49)
baseline_post <- baseline_post %>% filter(!grepl("2016-05-23 06:48:13", StartDate)) %>% 
  filter(!grepl("2016-10-19 19:26:04", StartDate)) %>%
  filter(!grepl("2016-06-13 15:35:02", StartDate))
# drop those rows based on their value in StartDate, then get rid of StartDate
baseline_post$StartDate <- NULL
# Also corrected some of the IDs so that data can ultimately be merged by ID:
baseline_post <- baseline_post %>% mutate(ID = as.character(recode(ID, ":D101" = "D101",
                                                                   "d104" = "D104", 
                                                                  "D121_b" = "D121",
                                                                  "D117_c" = "D117",
                                                                  "D 120" = "D120", 
                                                                  "D128 (entered from hard copy by SS 4/13/16)" = "D128",
                                                                  "D130 [entered from hard copy by SS 6/13/16, survey postmarked 5/31/16]" = "D130"
                                                             )))
baseline_post_0 <- baseline_post %>% filter(grepl("^D1", ID, ignore.case = TRUE))
View(baseline_post_0)
# Now we have 40 observations of 150 variables, instead of 49.

4.2 Rename variables

The name to the left of the equal sign is the new name, the one on the right is what the variable was named in Qualtrics.


baseline_post_1 <- rename(baseline_post_0, ID = ID, ucla_loneliness_1 = UCLA_1.20_1,
ucla_loneliness_2 = UCLA_1.20_2,
ucla_loneliness_3 = UCLA_1.20_3,
ucla_loneliness_4 = UCLA_1.20_4,
ucla_loneliness_5 = UCLA_1.20_5,
ucla_loneliness_6 = UCLA_1.20_6,
ucla_loneliness_7 = UCLA_1.20_7,
ucla_loneliness_8 = UCLA_1.20_8,
ucla_loneliness_9 = UCLA_1.20_9,
ucla_loneliness_10 = UCLA_1.20_10,
ucla_loneliness_11 = UCLA_1.20_11,
ucla_loneliness_12 = UCLA_1.20_12,
ucla_loneliness_13 = UCLA_1.20_13,
ucla_loneliness_14 = UCLA_1.20_14,
ucla_loneliness_15 = UCLA_1.20_15,
ucla_loneliness_16 = UCLA_1.20_16,
ucla_loneliness_17 = UCLA_1.20_17,
ucla_loneliness_18 = UCLA_1.20_18,
ucla_loneliness_19 = UCLA_1.20_19,
ucla_loneliness_20 = UCLA_1.20_20,
gcq_1 = GCS.1.38_1,
gcq_2 = GCS.1.38_2,
gcq_3 = GCS.1.38_3,
gcq_4 = GCS.1.38_4,
gcq_5 = GCS.1.38_5,
gcq_6 = GCS.1.38_6,
gcq_7 = GCS.1.38_7,
gcq_8 = GCS.1.38_8,
gcq_9 = GCS.1.38_9,
gcq_10 = GCS.1.38_10,
gcq_11 = GCS.1.38_11,
gcq_12 = GCS.1.38_12,
gcq_13 = GCS.1.38_13,
gcq_14 = GCS.1.38_14,
gcq_15 = GCS.1.38_15,
gcq_16 = GCS.1.38_16,
gcq_17 = GCS.1.38_17,
gcq_18 = GCS.1.38_18,
gcq_19 = GCS.1.38_19,
gcq_20 = GCS.1.38_20,
gcq_21 = GCS.1.38_21,
gcq_22 = GCS.1.38_22,
gcq_23 = GCS.1.38_23,
gcq_24 = GCS.1.38_24,
gcq_25 = GCS.1.38_25,
gcq_26 = GCS.1.38_26,
gcq_27 = GCS.1.38_27,
gcq_28 = GCS.1.38_28,
gcq_29 = GCS.1.38_29,
gcq_30 = GCS.1.38_30,
gcq_31 = GCS.1.38_31,
gcq_32 = GCS.1.38_32,
gcq_33 = GCS.1.38_33,
gcq_34 = GCS.1.38_34,
gcq_35 = GCS.1.38_35,
gcq_36 = GCS.1.38_36,
gcq_37 = GCS.1.38_37,
gcq_38 = GCS.1.38_38,
srrs_1 = LES.1.51_1, 
srrs_2 = LES.1.51_2, 
srrs_3 = LES.1.51_3,
srrs_4 = LES.1.51_4,
srrs_5 = LES.1.51_5,
srrs_6 = LES.1.51_6,
srrs_7 = LES.1.51_7,
srrs_8 = LES.1.51_8,
srrs_9 = LES.1.51_9,
srrs_10 = LES.1.51_10,
srrs_11 = LES.1.51_11,
srrs_12 = LES.1.51_12,
srrs_13 = LES.1.51_13,
srrs_14 = LES.1.51_14,
srrs_15 = LES.1.51_15,
srrs_16 = LES.1.51_16,
srrs_17 = LES.1.51_17,
srrs_18 = LES.1.51_18,
srrs_19 = LES.1.51_19,
srrs_20 = LES.1.51_20,
srrs_21 = LES.1.51_21,
srrs_22 = LES.1.51_22,
srrs_23 = LES.1.51_23,
srrs_24 = LES.1.51_24,
srrs_25 = LES.1.51_25,
srrs_26 = LES.1.51_26,
srrs_27 = LES.1.51_27,
srrs_28 = LES.1.51_28,
srrs_29 = LES.1.51_29,
srrs_30 = LES.1.51_30,
srrs_31 = LES.1.51_31,
srrs_32 = LES.1.51_32,
srrs_33 = LES.1.51_33,
srrs_34 = LES.1.51_34,
srrs_35 = LES.1.51_35,
srrs_36 = LES.1.51_36,
srrs_37 = LES.1.51_37,
srrs_38 = LES.1.51_38,
srrs_39 = LES.1.51_39,
srrs_40 = LES.1.51_40,
srrs_41 = LES.1.51_41,
srrs_42 = LES.1.51_42,
srrs_43 = LES.1.51_43,
srrs_44 = LES.1.51_44,
srrs_45 = LES.1.51_45,
srrs_46 = LES.1.51_46,
srrs_47 = LES.1.51_47,
srrs_48 = LES.1.51_48,
srrs_49 = LES.1.51_49,
srrs_50 = LES.1.51_50,
srrs_51 = LES.1.51_51,
ppss_fr_1 = PPSS.Fr_1,
ppss_fr_2 = PPSS.Fr_2,
ppss_fr_3 = PPSS.Fr_3,
ppss_fr_4 = PPSS.Fr_4,
ppss_fr_5 = PPSS.Fr_5,
ppss_fr_6 = PPSS.Fr_6,
ppss_fr_7 = PPSS.Fr_7,
ppss_fr_8 = PPSS.Fr_8,
ppss_fr_9 = PPSS.Fr_9,
ppss_fr_10 = PPSS.Fr_10,
ppss_fr_11 = PPSS.Fr_11,
ppss_fr_12 = PPSS.Fr_12,
ppss_fr_13 = PPSS.Fr_13,
ppss_fr_14 = PPSS.Fr_14,
ppss_fr_15 = PPSS.Fr_15,
ppss_fr_16 = PPSS.Fr_16,
ppss_fr_17 = PPSS.Fr_21,
ppss_fr_18 = PPSS.Fr_17,
ppss_fr_19 = PPSS.Fr_18,
ppss_fr_20 = PPSS.Fr_19,
ppss_fa_1 = PPSS.Fa_1,
ppss_fa_2 = PPSS.Fa_14,
ppss_fa_3 = PPSS.Fa_2,
ppss_fa_4 = PPSS.Fa_15,
ppss_fa_5 = PPSS.Fa_3,
ppss_fa_6 = PPSS.Fa_27,
ppss_fa_7 = PPSS.Fa_4,
ppss_fa_8 = PPSS.Fa_5,
ppss_fa_9 = PPSS.Fa_8,
ppss_fa_10 = PPSS.Fa_9,
ppss_fa_11 = PPSS.Fa_10,
ppss_fa_12 = PPSS.Fa_11,
ppss_fa_13 = PPSS.Fa_12,
ppss_fa_14 = PPSS.Fa_13,
ppss_fa_15 = PPSS.Fa_6,
ppss_fa_16 = PPSS.Fa_28,
ppss_fa_17 = PPSS.Fa_16,
ppss_fa_18 = PPSS.Fa_21,
ppss_fa_19 = PPSS.Fa_17,
ppss_fa_20 = PPSS.Fa_19
)

# Finally, let's make all of the variables (except ID) numeric rather than chr.
colnames(baseline_post_1)
baseline_post_1 <- baseline_post_1 %>% mutate_at(vars(ucla_loneliness_1:ppss_fa_20), funs(as.numeric))

# Check it out:
colnames(baseline_post_1)

# R data format (.rds) preserves data structures, such as column data types (numeric, character or factor). 
saveRDS(baseline_post_1, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_1.rds")
# baseline_post_1 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_1.rds")

4.3 Create factors and recode values

# The only variables we need to make into factors are the SRRS variables, in which participants indicate yes or no to each stressful life event.
labels_yn <- c("No", "Yes")
levels_yn <- c("2", "1")
baseline_post_2 <- baseline_post_1 %>% mutate_at(vars(starts_with("SR")), 
                      funs(factor(., levels = levels_yn, labels = labels_yn, ordered = TRUE)))
# this is an ordered factor with two levels: "No" [1] < "Yes" [2]
# confirm that 1's in post_1 are 2's in post_2 and vice versa:
str(baseline_post_2$srrs_1)
 Ord.factor w/ 2 levels "No"<"Yes": 1 2 1 2 1 2 1 1 1 2 ...
str(baseline_post_1$srrs_1)
 num [1:40] 2 1 2 1 2 1 2 2 2 1 ...
# Another way to do this would be to make each item a factor where "no" = 0 and "yes" = whatever the rating is
write.csv(baseline_post_2, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_2.csv")
saveRDS(baseline_post_2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_2.rds")
# baseline_post_2 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_2.rds")

4.4 Clean numerical variables and score scales

# For this section, you'll need the 'psych' package
## install.packages("psych") if you don't have it on this machine
library(psych)
baseline_post_3 <- baseline_post_2 # baseline_post_3 will contain the scored measures
##################  
### Social Readjustment Rating Scale – Revised
# Citation: Hobson, C. J., Kamen, J., Szostek, J., Nethercut, C. M., Tiedmann, J. W., & Wojnarowicz, S. (1998). Stressful life events: A revision and update of the social readjustment rating scale. International Journal of Stress Management, 5(1), 1-23.
# Each event is weighted out of 100 points. 
# Total score is sum of all responses [tot_srrs] 
# Number of total stressful life events: [tot_n_srrs]
srrs_factor <- select(baseline_post_3, starts_with("srrs"))
baseline_post_3$tot_srrs_n <- rowSums(srrs_factor[-c(3,47)] == "Yes") 
# drop 'death of a close family member' (item 3, column 3) since it seems that some participants may have answered referring to their spouse but it is unclear
# drop 'death of a spouse' (item 47, column 47) since we are interested in stressors outside of bereavement
describe(baseline_post_3$tot_srrs_n)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 3.33 3.25      3    2.81 2.97   0  14    14 1.33     1.54 0.51
# Total score (not counting items 3 and 47):
select(baseline_post_3, starts_with("srrs")) %>% mutate_at(vars(starts_with("srrs")), 
                      funs(as.numeric)) %>% rename_at(vars(starts_with("srrs")),function(x) paste0(x,"c")) -> srrs
srrs$srrs_1c <- as.numeric(recode(srrs$srrs_1c, "2" = "32", "1" = "0")) # Changing work responsibilities (increased/decreased hours/travel) 
srrs$srrs_2c <- as.numeric(recode(srrs$srrs_2c, "2" = "62", "1" = "0")) # Experiencing financial problems/difficulties (bankruptcy, credit card debt, college costs, tax problems) 
srrs$srrs_3c <- as.numeric(recode(srrs$srrs_3c, "2" = "79", "1" = "0")) # Death of close family member 
srrs$srrs_4c <- as.numeric(recode(srrs$srrs_4c, "2" = "35", "1" = "0")) # Change in residence 
srrs$srrs_5c <- as.numeric(recode(srrs$srrs_5c, "2" = "43", "1" = "0")) # Changing employers/career 
srrs$srrs_6c <- as.numeric(recode(srrs$srrs_6c, "2" = "45", "1" = "0")) # Employer reorganization/downsizing 
srrs$srrs_7c <- as.numeric(recode(srrs$srrs_7c, "2" = "37", "1" = "0")) # Major disagreement with boss/coworker 
srrs$srrs_8c <- as.numeric(recode(srrs$srrs_8c, "2" = "33", "1" = "0")) # Change in employment position (i.e., lateral transfer, promotion) 
srrs$srrs_9c <- as.numeric(recode(srrs$srrs_9c, "2" = "22", "1" = "0")) # Receiving a ticket for violating the law (traffic, parking) 
srrs$srrs_10c <- as.numeric(recode(srrs$srrs_10c, "2" = "33", "1" = "0")) # Gaining a new family member (through birth, adoption, marriage) 
srrs$srrs_11c <- as.numeric(recode(srrs$srrs_11c, "2" = "72", "1" = "0")) # Major injury/illness to close family member (i.e., cancer, AIDS, etc.) 
srrs$srrs_12c <- as.numeric(recode(srrs$srrs_12c, "2" = "47", "1" = "0")) # Attempting to modify addictive behavior of self (i.e., smoking, alcohol, drugs, etc.) 
srrs$srrs_13c <- as.numeric(recode(srrs$srrs_13c, "2" = "30", "1" = "0")) # Obtaining a major loan other than home mortgage (car, boat, etc.) 
srrs$srrs_14c <- as.numeric(recode(srrs$srrs_14c, "2" = "61", "1" = "0")) # Death of close friend 
srrs$srrs_15c <- as.numeric(recode(srrs$srrs_15c, "2" = "30", "1" = "0")) # Obtaining a home mortgage 
srrs$srrs_16c <- as.numeric(recode(srrs$srrs_16c, "2" = "64", "1" = "0")) # Being fired/laid off/unemployed 
srrs$srrs_17c <- as.numeric(recode(srrs$srrs_17c, "2" = "53", "1" = "0")) # Experiencing/involved in auto accident 
srrs$srrs_18c <- as.numeric(recode(srrs$srrs_18c, "2" = "46", "1" = "0")) # Discovering/attempting to modify addictive behavior of close family member (i.e., smoking, alcohol, drugs, etc.) 
srrs$srrs_19c <- as.numeric(recode(srrs$srrs_19c, "2" = "38", "1" = "0")) # Spouse/mate begins/ceases work outside the home 
srrs$srrs_20c <- as.numeric(recode(srrs$srrs_20c, "2" = "56", "1" = "0")) # Assuming responsibility for sick or elderly loved one 
srrs$srrs_21c <- as.numeric(recode(srrs$srrs_21c, "2" = "30", "1" = "0")) # Child leaving home (i.e., marriage, standing college, etc.) 
srrs$srrs_22c <- as.numeric(recode(srrs$srrs_22c, "2" = "78", "1" = "0")) # Major injury/illness to self (cancer, AIDS, etc.) 
srrs$srrs_23c <- as.numeric(recode(srrs$srrs_23c, "2" = "56", "1" = "0")) # Loss of/or major reduction in health insurance/benefits 
srrs$srrs_24c <- as.numeric(recode(srrs$srrs_24c, "2" = "34", "1" = "0")) # Finding appropriate child care/day care 
srrs$srrs_25c <- as.numeric(recode(srrs$srrs_25c, "2" = "66", "1" = "0")) # Separation or reconciliation with spouse/mate 
srrs$srrs_26c <- as.numeric(recode(srrs$srrs_26c, "2" = "70", "1" = "0")) # Being a victim of crime (theft, robbery, assault, rape, etc.) 
srrs$srrs_27c <- as.numeric(recode(srrs$srrs_27c, "2" = "41", "1" = "0")) # Pregnancy of spouse/mate/self 
srrs$srrs_28c <- as.numeric(recode(srrs$srrs_28c, "2" = "53", "1" = "0")) # Major disagreement over child support/custody/visitation 
srrs$srrs_29c <- as.numeric(recode(srrs$srrs_29c, "2" = "49", "1" = "0")) # Child develops behavior or learning problems 
srrs$srrs_30c <- as.numeric(recode(srrs$srrs_30c, "2" = "26", "1" = "0")) # Beginning/ceasing formal education 
srrs$srrs_31c <- as.numeric(recode(srrs$srrs_31c, "2" = "56", "1" = "0")) # Self/close family member being arrested for violating the law 
srrs$srrs_32c <- as.numeric(recode(srrs$srrs_32c, "2" = "50", "1" = "0")) # Adult child moving in with parent/parent moving in with adult child 
srrs$srrs_33c <- as.numeric(recode(srrs$srrs_33c, "2" = "59", "1" = "0")) # Surviving a disaster (fire, flood, earthquake, tornado, hurricane) 
srrs$srrs_34c <- as.numeric(recode(srrs$srrs_34c, "2" = "42", "1" = "0")) # Failure to obtain/qualify for a mortgage 
srrs$srrs_35c <- as.numeric(recode(srrs$srrs_35c, "2" = "38", "1" = "0")) # Experiencing employment discrimination/sexual harassment 
srrs$srrs_36c <- as.numeric(recode(srrs$srrs_36c, "2" = "39", "1" = "0")) # Experiencing discrimination/harassment outside the workplace 
srrs$srrs_37c <- as.numeric(recode(srrs$srrs_37c, "2" = "28", "1" = "0")) # Retirement
srrs$srrs_38c <- as.numeric(recode(srrs$srrs_38c, "2" = "43", "1" = "0")) # Getting married/remarried (self) 
srrs$srrs_39c <- as.numeric(recode(srrs$srrs_39c, "2" = "59", "1" = "0")) # Becoming a single parent 
srrs$srrs_40c <- as.numeric(recode(srrs$srrs_40c, "2" = "71", "1" = "0")) # Divorce 
srrs$srrs_41c <- as.numeric(recode(srrs$srrs_41c, "2" = "69", "1" = "0")) # Infidelity (cheating on spouse/mate) 
srrs$srrs_42c <- as.numeric(recode(srrs$srrs_42c, "2" = "33", "1" = "0")) # Experiencing a large unexpected monetary gain 
srrs$srrs_43c <- as.numeric(recode(srrs$srrs_43c, "2" = "44", "1" = "0")) # Dealing with infertility/miscarriage 
srrs$srrs_44c <- as.numeric(recode(srrs$srrs_44c, "2" = "53", "1" = "0")) # Being disciplined at work/demoted 
srrs$srrs_45c <- as.numeric(recode(srrs$srrs_45c, "2" = "69", "1" = "0")) # Experiencing domestic violence/sexual abuse 
srrs$srrs_46c <- as.numeric(recode(srrs$srrs_46c, "2" = "76", "1" = "0")) # Detention in jail or other institution (mental, drug rehab, etc.) 
srrs$srrs_47c <- as.numeric(recode(srrs$srrs_47c, "2" = "87", "1" = "0")) # Death of spouse/mate 
srrs$srrs_48c <- as.numeric(recode(srrs$srrs_48c, "2" = "51", "1" = "0")) # Dealing with unwanted pregnancy 
srrs$srrs_49c <- as.numeric(recode(srrs$srrs_49c, "2" = "71", "1" = "0")) # Foreclosure on loan/mortgage 
srrs$srrs_50c <- as.numeric(recode(srrs$srrs_50c, "2" = "39", "1" = "0")) # Release from jail 
srrs$srrs_51c <- as.numeric(recode(srrs$srrs_51c, "2" = "69", "1" = "0")) # Being the victim of police brutality 
# Attach tot_srrs back to the baseline_post_3 dataframe, minus the 'death of spouse' and 'death of close family member' items mentioned above:
baseline_post_3$tot_srrs <- rowSums(srrs[-c(3,47)], na.rm=TRUE)
describe(baseline_post_3$tot_srrs)
   vars  n  mean     sd median trimmed   mad min max range skew kurtosis    se
X1    1 40 161.1 156.09  135.5  137.62 123.8   0 705   705 1.41     2.22 24.68
##################  
### UCLA Loneliness Scale - Version 3
# Citation: Russell, D. (1996). UCLA Loneliness Scale (Version 3): Reliability, validity, and factor structure. Journal of Personality Assessment, 66, 20-40. 
# Answer choices range from 1 (Never) – 4 (Often).
# Reverse-scored: 1, 5, 6, 9, 10, 15, 16, 19, 20.
# Sum all items for total score [tot_ucla_loneliness].
# reverse-score items:
baseline_post_3$ucla_loneliness_1r <- 6 - baseline_post_2$ucla_loneliness_1
baseline_post_3$ucla_loneliness_5r <- 6 - baseline_post_2$ucla_loneliness_5
baseline_post_3$ucla_loneliness_6r <- 6 - baseline_post_2$ucla_loneliness_6
baseline_post_3$ucla_loneliness_9r <- 6 - baseline_post_2$ucla_loneliness_9
baseline_post_3$ucla_loneliness_10r <- 6 - baseline_post_2$ucla_loneliness_10
baseline_post_3$ucla_loneliness_15r <- 6 - baseline_post_2$ucla_loneliness_15
baseline_post_3$ucla_loneliness_16r <- 6 - baseline_post_2$ucla_loneliness_16
baseline_post_3$ucla_loneliness_19r <- 6 - baseline_post_2$ucla_loneliness_19
baseline_post_3$ucla_loneliness_20r <- 6 - baseline_post_2$ucla_loneliness_20
# total score:
tot_ucla_loneliness <- subset(baseline_post_3, select=c("ucla_loneliness_1r","ucla_loneliness_2", "ucla_loneliness_3", "ucla_loneliness_4", "ucla_loneliness_5r", "ucla_loneliness_6r", "ucla_loneliness_7", "ucla_loneliness_8", "ucla_loneliness_9r", "ucla_loneliness_10r", "ucla_loneliness_11", "ucla_loneliness_12", "ucla_loneliness_13", "ucla_loneliness_14", "ucla_loneliness_15r", "ucla_loneliness_16r", "ucla_loneliness_17", "ucla_loneliness_18", "ucla_loneliness_19r", "ucla_loneliness_20r"))
baseline_post_3$tot_ucla_loneliness <- rowSums(tot_ucla_loneliness, na.rm=TRUE) 
describe(baseline_post_3$tot_ucla_loneliness)
   vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 40 56.58 10.58     57   56.25 11.86  36  79    43 0.11    -0.88 1.67
##################  
### Grief Cognitions Scale
# Citation: Boelen, P. & Lensvelt-Mulders, G. (2005). Psychometric properties of the Grief Cognitions Questionnaire (GCQ). Journal of Psychopathology and Behavioral Assessment, 27, 291–303. 
# Answer choices range from 0 (strong disagree) to 5 (strongly agree)
# NO reverse scored items.
# Sum all items for total score [tot_gcq].
# 9 subscales:
# Self: 1, 7, 9, 22, 25, 37 [tot_gcq_self]
# World: 3, 10, 19, 34 [tot_gcq_world]
# Life: 12, 15, 20, 32 [tot_gcq_life]
# Future: 5, 13, 21, 27, 35 [tot_gcq_future]
# Self-Blame: 2, 17, 24, 30, 33 [tot_gcq_blame]
# Others: 4, 18, 29 [tot_gcq_others]
# Appropriateness of grief: 11, 16, 26, 31 [tot_gcq_approp]
# Cherish grief: 6, 14, 28 [tot_gcq_cherish]
# Threatening interpretation of grief: 8, 23, 36, 38 [tot_gcq_threat]
# Self:
tot_gcq_self <- subset(baseline_post_2, select=c("gcq_1", "gcq_7", "gcq_9", "gcq_22", "gcq_25", "gcq_37"))
baseline_post_3$tot_gcq_self <- rowSums(tot_gcq_self, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_self)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis se
X1    1 40 6.75 6.34    5.5    6.03 6.67   0  25    25 0.81    -0.13  1
# World: 
tot_gcq_world <- subset(baseline_post_2, select=c("gcq_3", "gcq_10", "gcq_19", "gcq_34"))
baseline_post_3$tot_gcq_world <- rowSums(tot_gcq_world, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_world)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 2.75 3.41    1.5    2.16 2.22   0  12    12  1.2     0.29 0.54
# Life: 
tot_gcq_life <- subset(baseline_post_2, select=c("gcq_12", "gcq_15", "gcq_20", "gcq_32"))
baseline_post_3$tot_gcq_life <- rowSums(tot_gcq_life, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_life)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 4.28 5.11      3    3.47 4.45   0  17    17    1    -0.23 0.81
# Future: 
tot_gcq_future <- subset(baseline_post_2, select=c("gcq_5", "gcq_13", "gcq_21", "gcq_27", "gcq_35"))
baseline_post_3$tot_gcq_future <- rowSums(tot_gcq_future, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_future)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40  7.2 6.52      6    6.47 7.41   0  25    25 0.83    -0.15 1.03
# Self-Blame: 
tot_gcq_blame <- subset(baseline_post_2, select=c("gcq_2", "gcq_17", "gcq_24", "gcq_30", "gcq_33"))
baseline_post_3$tot_gcq_blame <- rowSums(tot_gcq_blame, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_blame)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 6.22 6.51      3    5.22 4.45   0  24    24 1.09     0.18 1.03
# Others:
tot_gcq_others <- subset(baseline_post_2, select=c("gcq_4", "gcq_18", "gcq_29"))
baseline_post_3$tot_gcq_others <- rowSums(tot_gcq_others, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_others)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 3.77 3.45      3    3.44 4.45   0  12    12  0.6    -0.76 0.54
# Appropriateness of grief:
tot_gcq_approp <- subset(baseline_post_2, select=c("gcq_11", "gcq_16", "gcq_26", "gcq_31"))
baseline_post_3$tot_gcq_approp <- rowSums(tot_gcq_approp, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_approp)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 4.17 4.21      3    3.56 3.71   0  15    15 1.03     0.02 0.66
# Cherish grief:
tot_gcq_cherish <- subset(baseline_post_2, select=c("gcq_6", "gcq_14", "gcq_28"))
baseline_post_3$tot_gcq_cherish <- rowSums(tot_gcq_cherish, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_cherish)
   vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 3.15 3.61      2    2.53 2.97   0  14    14 1.37     0.98 0.57
# Threatening interpretation of grief: 8, 23, 36, 38
# threat: 3, 10, 19, 34
tot_gcq_threat <- subset(baseline_post_2, select=c("gcq_8", "gcq_23", "gcq_36", "gcq_38"))
baseline_post_3$tot_gcq_threat <- rowSums(tot_gcq_threat, na.rm=TRUE) 
describe(baseline_post_3$tot_gcq_threat)
   vars  n mean  sd median trimmed  mad min max range skew kurtosis   se
X1    1 40 4.17 4.7      3    3.41 4.45   0  16    16 1.04    -0.03 0.74
##################  
### Procidano Perceived Social Support Scale - Friends Version
# Citation: Procidano, M. E., & Heller, K. (1983). Measures of perceived social support from friends and from family: Three validation studies. American Journal of Community Psychology, 11(1), 1-24.
# Answer choices are 1 (Yes), 0 (No), NA/not scored (Don't know).
# Reverse scored items: 2, 6, 7, 15, 18, 20. 
# Sum all items (possible range: 0 – 20) [tot_ppss_fr]
# recode the responses from Qualtrics (where 1 = Yes, 2 = No) into 1 = Yes, 0 = No):
baseline_post_3 <- baseline_post_3 %>% mutate_at(vars(starts_with("ppss_fr")), 
                      funs(recode(., "1"="1", "2"="0")))
baseline_post_3 <- baseline_post_3 %>% mutate_at(vars(starts_with("ppss_fr")), funs(as.numeric))
# compare before and after:
str(baseline_post_2$ppss_fr_1) # before recoding
 num [1:40] 2 1 NA 1 2 1 1 NA 1 2 ...
str(baseline_post_3$ppss_fr_1) # after recoding
 num [1:40] 0 1 NA 1 0 1 1 NA 1 0 ...
# reverse-score items:
baseline_post_3$ppss_fr_2r <- as.numeric(recode(baseline_post_3$ppss_fr_2, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fr_6r <- as.numeric(recode(baseline_post_3$ppss_fr_6, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fr_7r <- as.numeric(recode(baseline_post_3$ppss_fr_7, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fr_15r <- as.numeric(recode(baseline_post_3$ppss_fr_15, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fr_18r <- as.numeric(recode(baseline_post_3$ppss_fr_18, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fr_20r <- as.numeric(recode(baseline_post_3$ppss_fr_20, "1" = "0", "0" = "1"))
# check that it worked:
str(baseline_post_3$ppss_fr_2)
 num [1:40] NA NA 0 0 1 0 0 1 0 1 ...
str(baseline_post_3$ppss_fr_2r)
 num [1:40] NA NA 1 1 0 1 1 0 1 0 ...
# total score:
tot_ppss_fr <- subset(baseline_post_3, select=c("ppss_fr_1", "ppss_fr_2r", "ppss_fr_3", "ppss_fr_4", "ppss_fr_5", "ppss_fr_6r", "ppss_fr_7r", "ppss_fr_8", "ppss_fr_9", "ppss_fr_10", "ppss_fr_11", "ppss_fr_12", "ppss_fr_13", "ppss_fr_14", "ppss_fr_15r", "ppss_fr_16", "ppss_fr_17", "ppss_fr_18r", "ppss_fr_19", "ppss_fr_20r"))
baseline_post_3$tot_ppss_fr <- rowSums(tot_ppss_fr, na.rm=TRUE) 
describe(baseline_post_3$tot_ppss_fr)
   vars  n  mean   sd median trimmed  mad min max range  skew kurtosis  se
X1    1 40 12.12 5.08   12.5    12.5 5.19   2  20    18 -0.51    -0.79 0.8
##################  
### Procidano Perceived Social Support Scale - Family Version
# Citation: Procidano, M. E., & Heller, K. (1983). Measures of perceived social support from friends and from family: Three validation studies. American Journal of Community Psychology, 11(1), 1-24.
# Answer choices are 1 (Yes), 0 (No), NA/not scored (Don't know).
# Reverse scored items: 3, 4, 16, 19, 20. 
# Sum all items (possible range: 0 – 20) [tot_ppss_fa]
# recode the responses from Qualtrics (where 1 = Yes, 2 = No) into 1 = Yes, 0 = No):
baseline_post_3 <- baseline_post_3 %>% mutate_at(vars(starts_with("ppss_fa")), 
                                                 funs(recode(., "1"="1", "2"="0")))
baseline_post_3 <- baseline_post_3 %>% mutate_at(vars(starts_with("ppss_fa")), funs(as.numeric))
# compare before and after:
str(baseline_post_2$ppss_fa_1) # before recoding
 num [1:40] 2 1 2 1 2 1 1 1 1 2 ...
str(baseline_post_3$ppss_fa_1) # after recoding
 num [1:40] 0 1 0 1 0 1 1 1 1 0 ...
# reverse-score items:
baseline_post_3$ppss_fa_3r <- as.numeric(recode(baseline_post_3$ppss_fa_3, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fa_4r <- as.numeric(recode(baseline_post_3$ppss_fa_4, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fa_16r <- as.numeric(recode(baseline_post_3$ppss_fa_16, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fa_19r <- as.numeric(recode(baseline_post_3$ppss_fa_19, "1" = "0", "0" = "1"))
baseline_post_3$ppss_fa_20r <- as.numeric(recode(baseline_post_3$ppss_fa_20, "1" = "0", "0" = "1"))
# check that it worked:
str(baseline_post_3$ppss_fa_3)
 num [1:40] NA NA 1 0 1 0 1 NA 0 0 ...
str(baseline_post_3$ppss_fa_3r)
 num [1:40] NA NA 0 1 0 1 0 NA 1 1 ...
# total score:
tot_ppss_fa <- subset(baseline_post_3, select=c("ppss_fa_1", "ppss_fa_2", "ppss_fa_3r", "ppss_fa_4r", "ppss_fa_5", "ppss_fa_6", "ppss_fa_7", "ppss_fa_8", "ppss_fa_9", "ppss_fa_10", "ppss_fa_11", "ppss_fa_12", "ppss_fa_13", "ppss_fa_14", "ppss_fa_15", "ppss_fa_16r", "ppss_fa_17", "ppss_fa_18", "ppss_fa_19r", "ppss_fa_20r"))
baseline_post_3$tot_ppss_fa <- rowSums(tot_ppss_fa, na.rm=TRUE)
describe(baseline_post_3$tot_ppss_fa)
   vars  n  mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 40 11.85 6.22   13.5   12.34 6.67   0  20    20 -0.63    -0.99 0.98
# check that all "tot_*" variables appear
colnames(baseline_post_3) 
  [1] "ID"                  "ucla_loneliness_1"   "ucla_loneliness_2"   "ucla_loneliness_3"   "ucla_loneliness_4"   "ucla_loneliness_5"  
  [7] "ucla_loneliness_6"   "ucla_loneliness_7"   "ucla_loneliness_8"   "ucla_loneliness_9"   "ucla_loneliness_10"  "ucla_loneliness_11" 
 [13] "ucla_loneliness_12"  "ucla_loneliness_13"  "ucla_loneliness_14"  "ucla_loneliness_15"  "ucla_loneliness_16"  "ucla_loneliness_17" 
 [19] "ucla_loneliness_18"  "ucla_loneliness_19"  "ucla_loneliness_20"  "gcq_1"               "gcq_2"               "gcq_3"              
 [25] "gcq_4"               "gcq_5"               "gcq_6"               "gcq_7"               "gcq_8"               "gcq_9"              
 [31] "gcq_10"              "gcq_11"              "gcq_12"              "gcq_13"              "gcq_14"              "gcq_15"             
 [37] "gcq_16"              "gcq_17"              "gcq_18"              "gcq_19"              "gcq_20"              "gcq_21"             
 [43] "gcq_22"              "gcq_23"              "gcq_24"              "gcq_25"              "gcq_26"              "gcq_27"             
 [49] "gcq_28"              "gcq_29"              "gcq_30"              "gcq_31"              "gcq_32"              "gcq_33"             
 [55] "gcq_34"              "gcq_35"              "gcq_36"              "gcq_37"              "gcq_38"              "srrs_1"             
 [61] "srrs_2"              "srrs_3"              "srrs_4"              "srrs_5"              "srrs_6"              "srrs_7"             
 [67] "srrs_8"              "srrs_9"              "srrs_10"             "srrs_11"             "srrs_12"             "srrs_13"            
 [73] "srrs_14"             "srrs_15"             "srrs_16"             "srrs_17"             "srrs_18"             "srrs_19"            
 [79] "srrs_20"             "srrs_21"             "srrs_22"             "srrs_23"             "srrs_24"             "srrs_25"            
 [85] "srrs_26"             "srrs_27"             "srrs_28"             "srrs_29"             "srrs_30"             "srrs_31"            
 [91] "srrs_32"             "srrs_33"             "srrs_34"             "srrs_35"             "srrs_36"             "srrs_37"            
 [97] "srrs_38"             "srrs_39"             "srrs_40"             "srrs_41"             "srrs_42"             "srrs_43"            
[103] "srrs_44"             "srrs_45"             "srrs_46"             "srrs_47"             "srrs_48"             "srrs_49"            
[109] "srrs_50"             "srrs_51"             "ppss_fr_1"           "ppss_fr_2"           "ppss_fr_3"           "ppss_fr_4"          
[115] "ppss_fr_5"           "ppss_fr_6"           "ppss_fr_7"           "ppss_fr_8"           "ppss_fr_9"           "ppss_fr_10"         
[121] "ppss_fr_11"          "ppss_fr_12"          "ppss_fr_13"          "ppss_fr_14"          "ppss_fr_15"          "ppss_fr_16"         
[127] "ppss_fr_17"          "ppss_fr_18"          "ppss_fr_19"          "ppss_fr_20"          "ppss_fa_1"           "ppss_fa_2"          
[133] "ppss_fa_3"           "ppss_fa_4"           "ppss_fa_5"           "ppss_fa_6"           "ppss_fa_7"           "ppss_fa_8"          
[139] "ppss_fa_9"           "ppss_fa_10"          "ppss_fa_11"          "ppss_fa_12"          "ppss_fa_13"          "ppss_fa_14"         
[145] "ppss_fa_15"          "ppss_fa_16"          "ppss_fa_17"          "ppss_fa_18"          "ppss_fa_19"          "ppss_fa_20"         
[151] "tot_srrs_n"          "tot_srrs"            "ucla_loneliness_1r"  "ucla_loneliness_5r"  "ucla_loneliness_6r"  "ucla_loneliness_9r" 
[157] "ucla_loneliness_10r" "ucla_loneliness_15r" "ucla_loneliness_16r" "ucla_loneliness_19r" "ucla_loneliness_20r" "tot_ucla_loneliness"
[163] "tot_gcq_self"        "tot_gcq_world"       "tot_gcq_life"        "tot_gcq_future"      "tot_gcq_blame"       "tot_gcq_others"     
[169] "tot_gcq_approp"      "tot_gcq_cherish"     "tot_gcq_threat"      "ppss_fr_2r"          "ppss_fr_6r"          "ppss_fr_7r"         
[175] "ppss_fr_15r"         "ppss_fr_18r"         "ppss_fr_20r"         "tot_ppss_fr"         "ppss_fa_3r"          "ppss_fa_4r"         
[181] "ppss_fa_16r"         "ppss_fa_19r"         "ppss_fa_20r"         "tot_ppss_fa"        
# save the cleaned and scored data
saveRDS(baseline_post_3, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_3.rds")
# baseline_post_3 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_post_3.rds")

4.5 Histograms and boxplots

# Create a subset of only scale total scores (i.e., variables that start with "tot")
scales_post <- baseline_post_3[, grep('^tot', names(baseline_post_3))]
# Plot the variables:
for(i in 1:length(scales_post)) boxplot(scales_post[,i], xlab=NULL, main=names(scales_post[i]))

for(i in 1:length(scales_post)) hist(scales_post[,i], xlab=NULL, main=names(scales_post[i]))

4.6 Descriptives (numerical variables)

# View descriptives for each scale
## stargazer makes nice-looking summary tables (https://cran.r-project.org/web/packages/stargazer/vignettes/stargazer.pdf)
library(stargazer) # install.packages("stargazer") if this is the first time using the package on this machine
stargazer(scales_post, type="text")

===============================================
Statistic           N   Mean   St. Dev. Min Max
-----------------------------------------------
tot_srrs_n          40  3.325   3.253    0  14 
tot_srrs            40 161.100 156.091   0  705
tot_ucla_loneliness 40 56.575   10.583  36  79 
tot_gcq_self        40  6.750   6.344    0  25 
tot_gcq_world       40  2.750   3.410    0  12 
tot_gcq_life        40  4.275   5.114    0  17 
tot_gcq_future      40  7.200   6.525    0  25 
tot_gcq_blame       40  6.225   6.510    0  24 
tot_gcq_others      40  3.775   3.445    0  12 
tot_gcq_approp      40  4.175   4.206    0  15 
tot_gcq_cherish     40  3.150   3.613    0  14 
tot_gcq_threat      40  4.175   4.701    0  16 
tot_ppss_fr         40 12.125   5.085    2  20 
tot_ppss_fa         40 11.850   6.225    0  20 
-----------------------------------------------

4.7 Frequencies (categorical variables)

# Make a subset of ONLY variables that are factors
# and print column names (fast way to know exactly which variables to use here)
factors <- baseline_post_3 %>%
  select_if(is.factor)
colnames(factors)
 [1] "srrs_1"  "srrs_2"  "srrs_3"  "srrs_4"  "srrs_5"  "srrs_6"  "srrs_7"  "srrs_8"  "srrs_9"  "srrs_10" "srrs_11" "srrs_12" "srrs_13" "srrs_14" "srrs_15"
[16] "srrs_16" "srrs_17" "srrs_18" "srrs_19" "srrs_20" "srrs_21" "srrs_22" "srrs_23" "srrs_24" "srrs_25" "srrs_26" "srrs_27" "srrs_28" "srrs_29" "srrs_30"
[31] "srrs_31" "srrs_32" "srrs_33" "srrs_34" "srrs_35" "srrs_36" "srrs_37" "srrs_38" "srrs_39" "srrs_40" "srrs_41" "srrs_42" "srrs_43" "srrs_44" "srrs_45"
[46] "srrs_46" "srrs_47" "srrs_48" "srrs_49" "srrs_50" "srrs_51"
## SRRS: Frequency of stressful life events in past 12 months
count(baseline_post_3,srrs_1) # Changing work responsibilities (increased/decreased hours/travel) 
count(baseline_post_3,srrs_2) # Experiencing financial problems/difficulties (bankruptcy, credit card debt, college costs, tax problems) 
count(baseline_post_3,srrs_3) # Death of close family member 
count(baseline_post_3,srrs_4) # Change in residence 
count(baseline_post_3,srrs_5) # Changing employers/career 
count(baseline_post_3,srrs_6) # Employer reorganization/downsizing 
count(baseline_post_3,srrs_7) # Major disagreement with boss/coworker 
count(baseline_post_3,srrs_8) # Change in employment position (i.e., lateral transfer, promotion) 
count(baseline_post_3,srrs_9) # Receiving a ticket for violating the law (traffic, parking) 
count(baseline_post_3,srrs_10) # Gaining a new family member (through birth, adoption, marriage) 
count(baseline_post_3,srrs_11) # Major injury/illness to close family member (i.e., cancer, AIDS, etc.) 
count(baseline_post_3,srrs_12) # Attempting to modify addictive behavior of self (i.e., smoking, alcohol, drugs, etc.) 
count(baseline_post_3,srrs_13) # Obtaining a major loan other than home mortgage (car, boat, etc.) 
count(baseline_post_3,srrs_14) # Death of close friend 
count(baseline_post_3,srrs_15) # Obtaining a home mortgage 
count(baseline_post_3,srrs_16) # Being fired/laid off/unemployed 
count(baseline_post_3,srrs_17) # Experiencing/involved in auto accident 
count(baseline_post_3,srrs_18) # Discovering/attempting to modify addictive behavior of close family member (i.e., smoking, alcohol, drugs, etc.) 
count(baseline_post_3,srrs_19) # Spouse/mate begins/ceases work outside the home 
count(baseline_post_3,srrs_20) # Assuming responsibility for sick or elderly loved one 
count(baseline_post_3,srrs_21) # Child leaving home (i.e., marriage, standing college, etc.) 
count(baseline_post_3,srrs_22) # Major injury/illness to self (cancer, AIDS, etc.) 
count(baseline_post_3,srrs_23) # Loss of/or major reduction in health insurance/benefits 
count(baseline_post_3,srrs_24) # Finding appropriate child care/day care 
count(baseline_post_3,srrs_25) # Separation or reconciliation with spouse/mate 
count(baseline_post_3,srrs_26) # Being a victim of crime (theft, robbery, assault, rape, etc.) 
count(baseline_post_3,srrs_27) # Pregnancy of spouse/mate/self 
count(baseline_post_3,srrs_28) # Major disagreement over child support/custody/visitation 
count(baseline_post_3,srrs_29) # Child develops behavior or learning problems 
count(baseline_post_3,srrs_30) # Beginning/ceasing formal education 
count(baseline_post_3,srrs_31) # Self/close family member being arrested for violating the law 
count(baseline_post_3,srrs_32) # Adult child moving in with parent/parent moving in with adult child 
count(baseline_post_3,srrs_33) # Surviving a disaster (fire, flood, earthquake, tornado, hurricane
count(baseline_post_3,srrs_34) # Failure to obtain/qualify for a mortgage 
count(baseline_post_3,srrs_35) # Experiencing employment discrimination/sexual harassment 
count(baseline_post_3,srrs_36) # Experiencing discrimination/harassment outside the workplace 
count(baseline_post_3,srrs_37) # Retirement
count(baseline_post_3,srrs_38) # Getting married/remarried (self) 
count(baseline_post_3,srrs_39) # Becoming a single parent 
count(baseline_post_3,srrs_40) # Divorce
count(baseline_post_3,srrs_41) # Infidelity (cheating on spouse/mate) 
count(baseline_post_3,srrs_42) # Experiencing a large unexpected monetary gain 
count(baseline_post_3,srrs_43) # Dealing with infertility/miscarriage 
count(baseline_post_3,srrs_44) # Being disciplined at work/demoted 
count(baseline_post_3,srrs_45) # Experiencing domestic violence/sexual abuse 
count(baseline_post_3,srrs_46) # Detention in jail or other institution (mental, drug rehab, etc.) 
count(baseline_post_3,srrs_47) # Death of spouse/mate 
count(baseline_post_3,srrs_48) # Dealing with unwanted pregnancy 
count(baseline_post_3,srrs_49) # Foreclosure on loan/mortgage 
count(baseline_post_3,srrs_50) # Release from jail 
count(baseline_post_3,srrs_51) # Being the victim of police brutality 
Incidence of stressful life experiences in our sample, in order:
47. Death of spouse/mate: 21/40
(NOT included in tot_srrs variable) 3. Death of close family member: 20/40 (suspect some may be counting spouse in this but unsure; NOT included in tot_srrs variable)
1. Changing work responsibilities: 16/40
11. Major injury/illness to close family member: 15/40
14. Death of close friend: 12/40
2. Financial problems: 9/40
20. Assuming responsibility for sick or elderly loved one: 9/40
10. Gaining a new family member: 6/40
18. Discovering/attempting to modify addictive behavior of close family member: 6/40
36. Retirement: 5/40
5. Changing employers/career: 4/40
6. Employer reorganization/downsizing: 4/40
8. Change in employment position: 4/40
9. Traffic or parking ticket: 4/40
32. Adult child moving in with parent/parent moving in with adult child: 4/40
4. Change in residence: 3/40
7. Major disagreement with boss/coworker: 3/30 12. Attempting to modify addictive behavior of self: 3/40
13. Obtaining a major loan other than home mortgage: 3/40
26. Being a victim of crime: 3/40
38. Experiencing a large unexpected monetary gain: 3/40
22. Major injury/illness to self: 2/40
15. Obtaining home mortage: 2/40
16. Fired/laid off/unemployed: 2/40
25. Separation or reconciliation with spouse/mate: 2/40
23. Loss of/or major reduction in health insurance/benefits: 2/40
31. Self/close family member being arrested for violating the law: 2/40
19. Spouse/mate begins/ceases work outside the home: 1/40
21. Child leaving home: 1/40
35. Experiencing employment discrimination/sexual harassment: 1/40
49. Foreclosure on loan/mortgage: 1/40

(For all other items, 0 reported incidence in this sample).

4.8 Check scale reliabilities

# The 'alpha' function is helpful because it will alert you if your reverse coding went awry somehow. 
## Note that Emily Butler says it's not always correct - if it flags an issues and you've double- and triple-checked your reverse coding, ignore it.
# Primarily, we use/report the standard alpha.
library(psych)
psych::alpha(tot_gcq_approp)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_approp)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.88      0.88    0.87      0.65 7.5 0.029    1 1.1     0.69

 lower alpha upper     95% confidence boundaries
0.82 0.88 0.94 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
gcq_11      0.89      0.90    0.86      0.75 9.0    0.028 0.0003  0.75
gcq_16      0.81      0.81    0.77      0.59 4.3    0.051 0.0214  0.54
gcq_26      0.83      0.84    0.81      0.63 5.1    0.043 0.0210  0.65
gcq_31      0.84      0.84    0.79      0.64 5.3    0.042 0.0092  0.65

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_11 40  0.76  0.77  0.66   0.62 0.78 1.1
gcq_16 40  0.92  0.91  0.89   0.84 1.23 1.4
gcq_26 40  0.89  0.88  0.83   0.78 1.25 1.4
gcq_31 40  0.86  0.87  0.83   0.77 0.93 1.0

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_11 0.52 0.32 0.05 0.05 0.05 0.00    0
gcq_16 0.38 0.32 0.12 0.08 0.08 0.02    0
gcq_26 0.40 0.25 0.15 0.10 0.10 0.00    0
gcq_31 0.42 0.35 0.12 0.08 0.02 0.00    0
psych::alpha(tot_gcq_blame)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_blame)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.89      0.89    0.91      0.62 8.3 0.027  1.2 1.3     0.62

 lower alpha upper     95% confidence boundaries
0.84 0.89 0.94 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
gcq_2       0.87      0.88    0.89      0.64 7.0    0.033 0.018  0.62
gcq_17      0.85      0.85    0.86      0.59 5.7    0.040 0.019  0.56
gcq_24      0.86      0.86    0.88      0.61 6.2    0.037 0.024  0.57
gcq_30      0.89      0.89    0.88      0.67 8.0    0.029 0.014  0.65
gcq_33      0.87      0.87    0.85      0.62 6.5    0.033 0.025  0.60

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_2  40  0.82  0.82  0.77   0.72 1.23 1.5
gcq_17 40  0.90  0.89  0.87   0.83 0.97 1.6
gcq_24 40  0.87  0.86  0.81   0.77 1.40 1.8
gcq_30 40  0.75  0.77  0.72   0.64 1.23 1.3
gcq_33 40  0.83  0.84  0.82   0.73 1.40 1.5

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_2  0.45 0.25 0.10 0.10 0.02 0.08    0
gcq_17 0.62 0.12 0.08 0.08 0.02 0.08    0
gcq_24 0.50 0.18 0.02 0.12 0.08 0.10    0
gcq_30 0.40 0.22 0.22 0.05 0.10 0.00    0
gcq_33 0.40 0.22 0.10 0.18 0.05 0.05    0
psych::alpha(tot_gcq_cherish)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_cherish)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
       0.9      0.92    0.89      0.79  11 0.025  1.1 1.2     0.77

 lower alpha upper     95% confidence boundaries
0.85 0.9 0.95 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r  S/N alpha se var.r med.r
gcq_6       0.90      0.91    0.83      0.83 10.0    0.029    NA  0.83
gcq_14      0.84      0.87    0.77      0.77  6.9    0.043    NA  0.77
gcq_28      0.85      0.87    0.76      0.76  6.5    0.044    NA  0.76

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_6  40  0.93  0.91  0.83   0.80 1.35 1.6
gcq_14 40  0.93  0.93  0.89   0.84 1.05 1.2
gcq_28 40  0.92  0.94  0.90   0.85 0.75 1.1

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_6  0.40 0.25 0.18 0.02 0.08 0.08    0
gcq_14 0.42 0.30 0.15 0.08 0.02 0.02    0
gcq_28 0.55 0.28 0.10 0.02 0.05 0.00    0
psych::alpha(tot_gcq_future)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_future)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.93      0.93    0.93      0.73  14 0.019  1.4 1.3     0.73

 lower alpha upper     95% confidence boundaries
0.89 0.93 0.96 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
gcq_5       0.94      0.94    0.93      0.80 15.7    0.017 0.0047  0.78
gcq_13      0.90      0.90    0.89      0.70  9.5    0.027 0.0107  0.69
gcq_21      0.92      0.93    0.92      0.76 12.4    0.021 0.0121  0.74
gcq_27      0.90      0.91    0.90      0.71  9.7    0.026 0.0136  0.71
gcq_35      0.90      0.90    0.88      0.69  8.9    0.027 0.0081  0.69

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_5  40  0.80  0.80  0.71   0.68  1.4 1.5
gcq_13 40  0.92  0.92  0.91   0.87  1.4 1.4
gcq_21 40  0.86  0.85  0.79   0.77  1.6 1.7
gcq_27 40  0.91  0.92  0.90   0.86  1.5 1.5
gcq_35 40  0.94  0.94  0.95   0.90  1.3 1.3

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_5  0.38 0.20 0.20 0.10 0.08 0.05    0
gcq_13 0.38 0.25 0.15 0.12 0.08 0.02    0
gcq_21 0.30 0.35 0.05 0.12 0.08 0.10    0
gcq_27 0.30 0.28 0.22 0.08 0.08 0.05    0
gcq_35 0.32 0.38 0.10 0.12 0.05 0.02    0
psych::alpha(tot_gcq_life)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_life)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.95      0.95    0.95      0.83  19 0.013  1.1 1.3      0.8

 lower alpha upper     95% confidence boundaries
0.92 0.95 0.97 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
gcq_12      0.93      0.93    0.91      0.82  14    0.018 0.00151  0.82
gcq_15      0.94      0.95    0.93      0.85  17    0.016 0.00413  0.87
gcq_20      0.93      0.94    0.92      0.83  15    0.017 0.00470  0.79
gcq_32      0.91      0.92    0.89      0.80  12    0.022 0.00034  0.79

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_12 40  0.93  0.93  0.92   0.88 1.10 1.4
gcq_15 40  0.90  0.91  0.86   0.84 0.95 1.2
gcq_20 40  0.93  0.93  0.90   0.87 1.07 1.5
gcq_32 40  0.96  0.96  0.95   0.92 1.15 1.4

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_12 0.52 0.15 0.10 0.18 0.02 0.02    0
gcq_15 0.50 0.20 0.18 0.10 0.02 0.00    0
gcq_20 0.52 0.22 0.08 0.05 0.08 0.05    0
gcq_32 0.45 0.25 0.12 0.05 0.12 0.00    0
psych::alpha(tot_gcq_others)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_others)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.79      0.81    0.74      0.58 4.2 0.056  1.3 1.1     0.57

 lower alpha upper     95% confidence boundaries
0.68 0.79 0.89 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
gcq_4       0.68      0.73    0.57      0.57 2.7    0.088    NA  0.57
gcq_18      0.75      0.76    0.61      0.61 3.2    0.076    NA  0.61
gcq_29      0.70      0.72    0.56      0.56 2.5    0.090    NA  0.56

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_4  40  0.84  0.85  0.74   0.65 1.40 1.3
gcq_18 40  0.88  0.84  0.70   0.63 1.52 1.7
gcq_29 40  0.82  0.86  0.75   0.67 0.85 1.1

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_4  0.30 0.28 0.25 0.10 0.05 0.02    0
gcq_18 0.45 0.10 0.15 0.12 0.12 0.05    0
gcq_29 0.48 0.32 0.12 0.02 0.05 0.00    0
psych::alpha(tot_gcq_self)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_self)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.91      0.91    0.92      0.64  11 0.022  1.1 1.1     0.66

 lower alpha upper     95% confidence boundaries
0.87 0.91 0.95 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
gcq_1       0.88      0.89    0.89      0.62  8.2    0.030 0.0158  0.65
gcq_7       0.90      0.91    0.91      0.66  9.8    0.024 0.0152  0.71
gcq_9       0.90      0.91    0.90      0.66  9.7    0.025 0.0114  0.65
gcq_22      0.88      0.89    0.89      0.61  7.8    0.031 0.0162  0.64
gcq_25      0.88      0.89    0.89      0.61  7.8    0.030 0.0162  0.63
gcq_37      0.91      0.92    0.91      0.69 10.9    0.021 0.0057  0.69

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_1  40  0.88  0.88  0.86   0.83 0.95 1.2
gcq_7  40  0.78  0.80  0.74   0.69 1.00 1.2
gcq_9  40  0.78  0.80  0.76   0.70 0.80 1.0
gcq_22 40  0.90  0.90  0.88   0.84 1.35 1.4
gcq_25 40  0.90  0.90  0.88   0.85 1.35 1.2
gcq_37 40  0.78  0.75  0.69   0.65 1.30 1.6

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_1  0.52 0.15 0.20 0.10 0.02 0.00    0
gcq_7  0.50 0.18 0.20 0.08 0.05 0.00    0
gcq_9  0.50 0.30 0.12 0.05 0.02 0.00    0
gcq_22 0.38 0.28 0.05 0.25 0.02 0.02    0
gcq_25 0.25 0.42 0.12 0.12 0.08 0.00    0
gcq_37 0.42 0.28 0.05 0.12 0.08 0.05    0
psych::alpha(tot_gcq_threat)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_threat)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.92      0.92    0.92      0.74  11 0.022    1 1.2     0.76

 lower alpha upper     95% confidence boundaries
0.87 0.92 0.96 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
gcq_8       0.86      0.87    0.84      0.68  6.4    0.040 0.0166  0.72
gcq_23      0.92      0.92    0.89      0.79 11.5    0.023 0.0029  0.78
gcq_36      0.87      0.87    0.86      0.70  6.9    0.036 0.0200  0.74
gcq_38      0.92      0.92    0.90      0.79 11.5    0.022 0.0042  0.81

 Item statistics 
        n raw.r std.r r.cor r.drop mean  sd
gcq_8  40  0.95  0.95  0.94   0.90  1.1 1.4
gcq_23 40  0.85  0.85  0.80   0.74  0.9 1.3
gcq_36 40  0.93  0.94  0.91   0.88  1.0 1.2
gcq_38 40  0.86  0.85  0.79   0.74  1.2 1.4

Non missing response frequency for each item
          0    1    2    3    4    5 miss
gcq_8  0.52 0.18 0.12 0.10 0.05 0.02    0
gcq_23 0.52 0.25 0.10 0.08 0.02 0.02    0
gcq_36 0.45 0.30 0.02 0.22 0.00 0.00    0
gcq_38 0.42 0.25 0.15 0.08 0.08 0.02    0
psych::alpha(tot_gcq_world)

Reliability analysis   
Call: psych::alpha(x = tot_gcq_world)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.87       0.9     0.9      0.68 8.6 0.031 0.69 0.85     0.68

 lower alpha upper     95% confidence boundaries
0.81 0.87 0.93 

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
gcq_3       0.83      0.86    0.82      0.67 6.2    0.039 0.0082  0.71
gcq_10      0.81      0.86    0.83      0.67 6.0    0.049 0.0233  0.58
gcq_19      0.86      0.89    0.86      0.73 8.3    0.035 0.0096  0.71
gcq_34      0.85      0.85    0.80      0.66 5.8    0.042 0.0065  0.65

 Item statistics 
        n raw.r std.r r.cor r.drop mean   sd
gcq_3  40  0.87  0.88  0.85   0.74 0.75 1.06
gcq_10 40  0.89  0.89  0.84   0.80 0.78 1.00
gcq_19 40  0.86  0.83  0.75   0.71 0.85 1.23
gcq_34 40  0.86  0.89  0.87   0.80 0.38 0.63

Non missing response frequency for each item
          0    1    2    3    4 miss
gcq_3  0.57 0.22 0.08 0.12 0.00    0
gcq_10 0.52 0.28 0.10 0.10 0.00    0
gcq_19 0.55 0.25 0.08 0.05 0.08    0
gcq_34 0.70 0.22 0.08 0.00 0.00    0
psych::alpha(tot_ucla_loneliness)

Reliability analysis   
Call: psych::alpha(x = tot_ucla_loneliness)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.94      0.94    0.98      0.45  16 0.013  2.8 0.53     0.47

 lower alpha upper     95% confidence boundaries
0.92 0.94 0.97 

 Reliability if an item is dropped:
                    raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
ucla_loneliness_1r       0.94      0.94    0.98      0.45  16    0.013 0.033  0.47
ucla_loneliness_2        0.94      0.94    0.98      0.46  16    0.013 0.031  0.47
ucla_loneliness_3        0.94      0.94    0.97      0.44  15    0.014 0.030  0.46
ucla_loneliness_4        0.94      0.94    0.98      0.46  16    0.013 0.031  0.47
ucla_loneliness_5r       0.94      0.94    0.98      0.45  16    0.013 0.033  0.47
ucla_loneliness_6r       0.94      0.94    0.98      0.45  15    0.013 0.032  0.46
ucla_loneliness_7        0.94      0.94    0.98      0.44  15    0.014 0.031  0.46
ucla_loneliness_8        0.94      0.94    0.98      0.45  16    0.013 0.033  0.47
ucla_loneliness_9r       0.94      0.94    0.98      0.45  16    0.013 0.033  0.47
ucla_loneliness_10r      0.94      0.94    0.98      0.45  15    0.014 0.031  0.46
ucla_loneliness_11       0.94      0.94    0.98      0.47  17    0.013 0.029  0.48
ucla_loneliness_12       0.94      0.94    0.98      0.45  16    0.013 0.032  0.47
ucla_loneliness_13       0.94      0.94    0.97      0.44  15    0.014 0.032  0.46
ucla_loneliness_14       0.94      0.94    0.98      0.45  15    0.014 0.033  0.46
ucla_loneliness_15r      0.94      0.94    0.98      0.44  15    0.014 0.032  0.46
ucla_loneliness_16r      0.94      0.94    0.98      0.44  15    0.014 0.030  0.46
ucla_loneliness_17       0.95      0.95    0.98      0.48  18    0.011 0.022  0.48
ucla_loneliness_18       0.94      0.94    0.98      0.45  15    0.014 0.033  0.47
ucla_loneliness_19r      0.94      0.94    0.98      0.44  15    0.014 0.030  0.46
ucla_loneliness_20r      0.94      0.94    0.98      0.44  15    0.014 0.031  0.47

 Item statistics 
                     n raw.r std.r r.cor r.drop mean   sd
ucla_loneliness_1r  40  0.65  0.67  0.65   0.62  2.9 0.55
ucla_loneliness_2   40  0.55  0.54  0.53   0.49  2.9 0.76
ucla_loneliness_3   40  0.84  0.82  0.82   0.80  2.5 1.01
ucla_loneliness_4   40  0.61  0.61  0.61   0.57  3.0 0.60
ucla_loneliness_5r  40  0.67  0.68  0.67   0.63  3.1 0.74
ucla_loneliness_6r  40  0.71  0.72  0.72   0.67  3.1 0.66
ucla_loneliness_7   40  0.83  0.81  0.80   0.79  2.5 1.04
ucla_loneliness_8   40  0.66  0.68  0.67   0.63  2.8 0.62
ucla_loneliness_9r  40  0.66  0.67  0.65   0.62  2.9 0.66
ucla_loneliness_10r 40  0.75  0.75  0.75   0.72  3.2 0.65
ucla_loneliness_11  40  0.46  0.46  0.45   0.42  2.6 0.59
ucla_loneliness_12  40  0.65  0.66  0.65   0.61  2.5 0.82
ucla_loneliness_13  40  0.79  0.79  0.79   0.76  2.8 0.72
ucla_loneliness_14  40  0.76  0.76  0.75   0.73  2.5 0.75
ucla_loneliness_15r 40  0.78  0.77  0.77   0.75  3.1 0.86
ucla_loneliness_16r 40  0.85  0.85  0.85   0.83  3.1 0.77
ucla_loneliness_17  40  0.28  0.29  0.27   0.21  2.5 0.88
ucla_loneliness_18  40  0.74  0.75  0.74   0.71  2.7 0.78
ucla_loneliness_19r 40  0.79  0.78  0.78   0.75  2.9 0.83
ucla_loneliness_20r 40  0.79  0.77  0.77   0.75  2.9 0.87

Non missing response frequency for each item
                       1    2    3    4    5 miss
ucla_loneliness_1r  0.00 0.20 0.70 0.10 0.00    0
ucla_loneliness_2   0.05 0.18 0.57 0.20 0.00    0
ucla_loneliness_3   0.22 0.15 0.48 0.15 0.00    0
ucla_loneliness_4   0.00 0.18 0.65 0.18 0.00    0
ucla_loneliness_5r  0.00 0.20 0.52 0.25 0.02    0
ucla_loneliness_6r  0.00 0.15 0.55 0.30 0.00    0
ucla_loneliness_7   0.25 0.18 0.42 0.15 0.00    0
ucla_loneliness_8   0.02 0.25 0.65 0.08 0.00    0
ucla_loneliness_9r  0.00 0.30 0.55 0.15 0.00    0
ucla_loneliness_10r 0.00 0.12 0.55 0.32 0.00    0
ucla_loneliness_11  0.02 0.35 0.60 0.02 0.00    0
ucla_loneliness_12  0.10 0.38 0.42 0.10 0.00    0
ucla_loneliness_13  0.05 0.22 0.60 0.12 0.00    0
ucla_loneliness_14  0.10 0.32 0.52 0.05 0.00    0
ucla_loneliness_15r 0.00 0.28 0.42 0.25 0.05    0
ucla_loneliness_16r 0.00 0.18 0.55 0.22 0.05    0
ucla_loneliness_17  0.18 0.25 0.50 0.08 0.00    0
ucla_loneliness_18  0.08 0.25 0.55 0.12 0.00    0
ucla_loneliness_19r 0.00 0.38 0.45 0.12 0.05    0
ucla_loneliness_20r 0.00 0.38 0.40 0.18 0.05    0
psych::alpha(tot_ppss_fa)
Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was done

Reliability analysis   
Call: psych::alpha(x = tot_ppss_fa)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
      0.96      0.96       1      0.57  27 0.0084 0.69 0.34     0.57

 lower alpha upper     95% confidence boundaries
0.95 0.96 0.98 

 Reliability if an item is dropped:
            raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
ppss_fa_1        0.96      0.96       1      0.56  25   0.0091 0.025  0.57
ppss_fa_2        0.96      0.96       1      0.58  26   0.0085 0.024  0.59
ppss_fa_3r       0.96      0.96       1      0.58  26   0.0087 0.026  0.57
ppss_fa_4r       0.96      0.96       1      0.58  26   0.0087 0.027  0.58
ppss_fa_5        0.96      0.96       1      0.56  24   0.0094 0.024  0.56
ppss_fa_6        0.96      0.96       1      0.59  27   0.0084 0.026  0.60
ppss_fa_7        0.96      0.97       1      0.59  28   0.0083 0.022  0.60
ppss_fa_8        0.96      0.96       1      0.57  25   0.0091 0.027  0.56
ppss_fa_9        0.96      0.96       1      0.58  26   0.0086 0.027  0.59
ppss_fa_10       0.96      0.96       1      0.57  26   0.0089 0.027  0.57
ppss_fa_11       0.96      0.96       1      0.58  26   0.0086 0.026  0.58
ppss_fa_12       0.96      0.96       1      0.58  26   0.0087 0.027  0.58
ppss_fa_13       0.96      0.96       1      0.58  26   0.0086 0.025  0.58
ppss_fa_14       0.96      0.96       1      0.57  26   0.0088 0.027  0.57
ppss_fa_15       0.96      0.96       1      0.57  25   0.0089 0.025  0.57
ppss_fa_16r      0.96      0.96       1      0.57  25   0.0092 0.026  0.56
ppss_fa_17       0.96      0.96       1      0.57  26   0.0088 0.027  0.58
ppss_fa_18       0.96      0.96       1      0.57  25   0.0090 0.028  0.57
ppss_fa_19r      0.96      0.96       1      0.57  25   0.0091 0.025  0.57
ppss_fa_20r      0.96      0.96       1      0.57  25   0.0090 0.026  0.56

 Item statistics 
             n raw.r std.r r.cor r.drop mean   sd
ppss_fa_1   40  0.88  0.88  0.88   0.86 0.75 0.44
ppss_fa_2   39  0.68  0.68  0.68   0.65 0.67 0.48
ppss_fa_3r  24  0.77  0.74  0.74   0.71 0.58 0.50
ppss_fa_4r  36  0.75  0.73  0.73   0.70 0.69 0.47
ppss_fa_5   30  0.94  0.98  0.98   0.97 0.77 0.43
ppss_fa_6   35  0.66  0.65  0.65   0.61 0.57 0.50
ppss_fa_7   40  0.52  0.55  0.55   0.50 0.80 0.41
ppss_fa_8   38  0.86  0.86  0.86   0.84 0.66 0.48
ppss_fa_9   37  0.67  0.68  0.68   0.65 0.86 0.35
ppss_fa_10  36  0.75  0.78  0.78   0.76 0.67 0.48
ppss_fa_11  37  0.73  0.72  0.72   0.68 0.62 0.49
ppss_fa_12  39  0.74  0.73  0.73   0.70 0.72 0.46
ppss_fa_13  35  0.71  0.71  0.71   0.68 0.66 0.48
ppss_fa_14  39  0.78  0.78  0.78   0.76 0.56 0.50
ppss_fa_15  33  0.78  0.79  0.79   0.76 0.70 0.47
ppss_fa_16r 37  0.86  0.87  0.87   0.85 0.70 0.46
ppss_fa_17  29  0.75  0.78  0.78   0.75 0.52 0.51
ppss_fa_18  29  0.78  0.82  0.82   0.79 0.69 0.47
ppss_fa_19r 21  0.77  0.87  0.87   0.84 0.62 0.50
ppss_fa_20r 38  0.84  0.85  0.85   0.83 0.79 0.41

Non missing response frequency for each item
               0    1 miss
ppss_fa_1   0.25 0.75 0.00
ppss_fa_2   0.33 0.67 0.03
ppss_fa_3r  0.42 0.58 0.40
ppss_fa_4r  0.31 0.69 0.10
ppss_fa_5   0.23 0.77 0.25
ppss_fa_6   0.43 0.57 0.12
ppss_fa_7   0.20 0.80 0.00
ppss_fa_8   0.34 0.66 0.05
ppss_fa_9   0.14 0.86 0.07
ppss_fa_10  0.33 0.67 0.10
ppss_fa_11  0.38 0.62 0.07
ppss_fa_12  0.28 0.72 0.03
ppss_fa_13  0.34 0.66 0.12
ppss_fa_14  0.44 0.56 0.03
ppss_fa_15  0.30 0.70 0.18
ppss_fa_16r 0.30 0.70 0.07
ppss_fa_17  0.48 0.52 0.28
ppss_fa_18  0.31 0.69 0.28
ppss_fa_19r 0.38 0.62 0.48
ppss_fa_20r 0.21 0.79 0.05
psych::alpha(tot_ppss_fr)
Item = ppss_fr_20r had no variance and was deletedMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was done

Reliability analysis   
Call: psych::alpha(x = tot_ppss_fr)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.93      0.93       1      0.41  13 0.016 0.72 0.29     0.41

 lower alpha upper     95% confidence boundaries
0.9 0.93 0.96 

 Reliability if an item is dropped:
            raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
ppss_fr_1        0.92      0.92       1      0.40  12    0.018 0.035  0.40
ppss_fr_2r       0.93      0.93       1      0.42  13    0.017 0.038  0.41
ppss_fr_3        0.92      0.92       1      0.40  12    0.018 0.038  0.38
ppss_fr_4        0.93      0.93       1      0.43  13    0.017 0.037  0.43
ppss_fr_5        0.93      0.93       1      0.42  13    0.017 0.040  0.41
ppss_fr_6r       0.93      0.93       1      0.43  14    0.016 0.038  0.44
ppss_fr_7r       0.92      0.93       1      0.41  13    0.017 0.041  0.41
ppss_fr_8        0.93      0.93       1      0.43  13    0.017 0.038  0.43
ppss_fr_9        0.92      0.93       1      0.41  13    0.017 0.038  0.40
ppss_fr_10       0.92      0.93       1      0.41  13    0.017 0.038  0.41
ppss_fr_11       0.93      0.93       1      0.42  13    0.017 0.039  0.41
ppss_fr_12       0.92      0.92       1      0.41  12    0.018 0.038  0.40
ppss_fr_13       0.93      0.93       1      0.42  13    0.017 0.040  0.43
ppss_fr_14       0.92      0.92       1      0.40  12    0.018 0.034  0.39
ppss_fr_15r      0.92      0.93       1      0.41  13    0.017 0.040  0.41
ppss_fr_16       0.92      0.93       1      0.41  13    0.017 0.040  0.41
ppss_fr_17       0.93      0.93       1      0.41  13    0.017 0.040  0.41
ppss_fr_18r      0.92      0.92       1      0.40  12    0.019 0.037  0.40
ppss_fr_19       0.93      0.93       1      0.42  13    0.017 0.041  0.41

 Item statistics 
             n raw.r std.r r.cor r.drop mean   sd
ppss_fr_1   34  0.80  0.86  0.86   0.84 0.82 0.39
ppss_fr_2r  30  0.66  0.62  0.62   0.59 0.60 0.50
ppss_fr_3   34  0.75  0.85  0.85   0.82 0.88 0.33
ppss_fr_4   38  0.52  0.51  0.51   0.44 0.87 0.34
ppss_fr_5   36  0.60  0.58  0.58   0.52 0.72 0.45
ppss_fr_6r  31  0.50  0.44  0.44   0.37 0.61 0.50
ppss_fr_7r  31  0.67  0.67  0.67   0.61 0.61 0.50
ppss_fr_8   39  0.41  0.50  0.50   0.43 0.85 0.37
ppss_fr_9   34  0.71  0.70  0.70   0.66 0.76 0.43
ppss_fr_10  35  0.67  0.70  0.70   0.66 0.71 0.46
ppss_fr_11  33  0.57  0.55  0.55   0.50 0.73 0.45
ppss_fr_12  35  0.76  0.76  0.76   0.73 0.60 0.50
ppss_fr_13  37  0.63  0.61  0.61   0.58 0.46 0.51
ppss_fr_14  26  0.79  0.85  0.85   0.82 0.73 0.45
ppss_fr_15r 39  0.67  0.67  0.67   0.61 0.79 0.41
ppss_fr_16  27  0.61  0.65  0.65   0.62 0.74 0.45
ppss_fr_17  29  0.69  0.67  0.67   0.61 0.86 0.35
ppss_fr_18r 21  0.79  0.84  0.84   0.82 0.48 0.51
ppss_fr_19  36  0.63  0.64  0.64   0.57 0.75 0.44

Non missing response frequency for each item
               0    1 miss
ppss_fr_1   0.18 0.82 0.15
ppss_fr_2r  0.40 0.60 0.25
ppss_fr_3   0.12 0.88 0.15
ppss_fr_4   0.13 0.87 0.05
ppss_fr_5   0.28 0.72 0.10
ppss_fr_6r  0.39 0.61 0.22
ppss_fr_7r  0.39 0.61 0.22
ppss_fr_8   0.15 0.85 0.03
ppss_fr_9   0.24 0.76 0.15
ppss_fr_10  0.29 0.71 0.12
ppss_fr_11  0.27 0.73 0.18
ppss_fr_12  0.40 0.60 0.12
ppss_fr_13  0.54 0.46 0.07
ppss_fr_14  0.27 0.73 0.35
ppss_fr_15r 0.21 0.79 0.03
ppss_fr_16  0.26 0.74 0.32
ppss_fr_17  0.14 0.86 0.28
ppss_fr_18r 0.52 0.48 0.48
ppss_fr_19  0.25 0.75 0.10

4.9 Merge baseline and baseline_post datasets

baseline_4 <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline.rds")
names(baseline_4)
  [1] "startdate"               "ID"                      "dob"                     "sex_m"                   "dateofdeath"            
  [6] "knowbefore_y"            "caretaker_y"             "education"               "highestdegree"           "education_other"        
 [11] "employment"              "householdsize"           "householdsize_adult"     "householdsize_income"    "ethnicity_hisp"         
 [16] "race"                    "race_other"              "learnaboutstudy"         "meds_y"                  "meds_which"             
 [21] "meds_dx"                 "meds_dose"               "majorhealthprobs_y"      "majorhealthprobs_what"   "past2wks_injuryinfect_y"
 [26] "past2wks_dentist_y"      "currenttx_y"             "postmenopausal_y"        "lastperiod"              "n_pregnancies"          
 [31] "n_livebirths"            "n_nursed"                "allergies"               "surgeries_past6mos"      "alcohol"                
 [36] "smoking_y"               "smoking_howlong"         "smoking_perday"          "caffeine_perday"         "exercise"               
 [41] "pss_1"                   "pss_2"                   "pss_3"                   "pss_4"                   "pss_5"                  
 [46] "pss_6"                   "pss_7"                   "pss_8"                   "pss_9"                   "pss_10"                 
 [51] "ysl_1"                   "ysl_2"                   "ysl_3"                   "ysl_4"                   "ysl_5"                  
 [56] "ysl_6"                   "ysl_7"                   "ysl_8"                   "ysl_9"                   "ysl_10"                 
 [61] "ysl_11"                  "ysl_12"                  "ysl_13"                  "ysl_14"                  "ysl_15"                 
 [66] "ysl_16"                  "ysl_17"                  "ysl_18"                  "ysl_19"                  "ysl_20"                 
 [71] "ysl_21"                  "icg_1"                   "icg_2"                   "icg_3"                   "icg_4"                  
 [76] "icg_5"                   "icg_6"                   "icg_7"                   "icg_8"                   "icg_9"                  
 [81] "icg_10"                  "icg_11"                  "icg_12"                  "icg_13"                  "icg_14"                 
 [86] "icg_15"                  "icg_16"                  "icg_17"                  "icg_18"                  "icg_19"                 
 [91] "bdi_1"                   "bdi_2"                   "bdi_3"                   "bdi_4"                   "bdi_5"                  
 [96] "bdi_6"                   "bdi_7"                   "bdi_8"                   "bdi_9"                   "bdi_10"                 
[101] "bdi_11"                  "bdi_12"                  "bdi_13"                  "bdi_14"                  "bdi_15"                 
[106] "bdi_16"                  "bdi_17"                  "bdi_18"                  "bdi_19"                  "bdi_20"                 
[111] "bdi_21"                  "hand_1"                  "hand_2"                  "hand_3"                  "hand_4"                 
[116] "hand_5"                  "hand_6"                  "hand_7"                  "hand_8"                  "hand_9"                 
[121] "hand_10"                 "hand_11"                 "hand_12"                 "hand_bat_1"              "bisbas_1"               
[126] "bisbas_2"                "bisbas_3"                "bisbas_4"                "bisbas_5"                "bisbas_6"               
[131] "bisbas_7"                "bisbas_8"                "bisbas_9"                "bisbas_10"               "bisbas_11"              
[136] "bisbas_12"               "bisbas_13"               "bisbas_14"               "bisbas_15"               "bisbas_16"              
[141] "bisbas_17"               "bisbas_18"               "bisbas_19"               "bisbas_20"               "bisbas_21"              
[146] "bisbas_22"               "bisbas_23"               "bisbas_24"               "bgq_1"                   "bgq_2"                  
[151] "bgq_3"                   "bgq_4"                   "bgq_5"                   "ecrrs_global_1"          "ecrrs_global_2"         
[156] "ecrrs_global_3"          "ecrrs_global_4"          "ecrrs_global_5"          "ecrrs_global_6"          "ecrrs_global_7"         
[161] "ecrrs_global_8"          "ecrrs_global_9"          "ecrrs_spouse_1"          "ecrrs_spouse_2"          "ecrrs_spouse_3"         
[166] "ecrrs_spouse_4"          "ecrrs_spouse_5"          "ecrrs_spouse_6"          "ecrrs_spouse_7"          "ecrrs_spouse_8"         
[171] "ecrrs_spouse_9"          "timesincedeath"          "age"                     "age_yrs"                 "pss_4r"                 
[176] "pss_5r"                  "pss_7r"                  "pss_8r"                  "tot_pss"                 "tot_ysl"                
[181] "tot_icg"                 "bdi_1c"                  "bdi_2c"                  "bdi_3c"                  "bdi_4c"                 
[186] "bdi_5c"                  "bdi_6c"                  "bdi_7c"                  "bdi_8c"                  "bdi_9c"                 
[191] "bdi_10c"                 "bdi_11c"                 "bdi_12c"                 "bdi_13c"                 "bdi_14c"                
[196] "bdi_15c"                 "bdi_16c"                 "bdi_17c"                 "bdi_18c"                 "bdi_19c"                
[201] "bdi_20c"                 "bdi_21c"                 "tot_bdi"                 "hand_1c"                 "hand_2c"                
[206] "hand_3c"                 "hand_4c"                 "hand_5c"                 "hand_6c"                 "hand_7c"                
[211] "hand_8c"                 "hand_9c"                 "hand_10c"                "hand_11c"                "hand_12c"               
[216] "hand_bat_1c"             "tot_handedness"          "bisbas_1r"               "bisbas_3r"               "bisbas_4r"              
[221] "bisbas_5r"               "bisbas_6r"               "bisbas_7r"               "bisbas_8r"               "bisbas_9r"              
[226] "bisbas_10r"              "bisbas_11r"              "bisbas_12r"              "bisbas_13r"              "bisbas_14r"             
[231] "bisbas_15r"              "bisbas_16r"              "bisbas_17r"              "bisbas_18r"              "bisbas_19r"             
[236] "bisbas_20r"              "bisbas_21r"              "bisbas_23r"              "bisbas_24r"              "tot_bisbas_basdr"       
[241] "tot_bisbas_basfun"       "tot_bisbas_basrr"        "tot_bisbas_bis"          "tot_bgq"                 "ecrrs_global_1c"        
[246] "ecrrs_global_2c"         "ecrrs_global_3c"         "ecrrs_global_4c"         "ecrrs_global_5c"         "ecrrs_global_6c"        
[251] "ecrrs_global_7c"         "ecrrs_global_8c"         "ecrrs_global_9c"         "ecrrs_global_1r"         "ecrrs_global_2r"        
[256] "ecrrs_global_3r"         "ecrrs_global_4r"         "tot_ecrrs_global_avoid"  "tot_ecrrs_global_anx"    "ecrrs_spouse_1c"        
[261] "ecrrs_spouse_2c"         "ecrrs_spouse_3c"         "ecrrs_spouse_4c"         "ecrrs_spouse_5c"         "ecrrs_spouse_6c"        
[266] "ecrrs_spouse_7c"         "ecrrs_spouse_8c"         "ecrrs_spouse_9c"         "ecrrs_spouse_1r"         "ecrrs_spouse_2r"        
[271] "ecrrs_spouse_3r"         "ecrrs_spouse_4r"         "tot_ecrrs_spouse_avoid"  "tot_ecrrs_spouse_anx"   
baseline_4 <- baseline_4 %>% mutate(ID = recode(ID, "d130" = "D130")) # make d130 -> D130
baseline_all <- left_join(baseline_4,baseline_post_3, by="ID") #merge by ID
View(baseline_all)
names(baseline_all)
  [1] "startdate"               "ID"                      "dob"                     "sex_m"                   "dateofdeath"            
  [6] "knowbefore_y"            "caretaker_y"             "education"               "highestdegree"           "education_other"        
 [11] "employment"              "householdsize"           "householdsize_adult"     "householdsize_income"    "ethnicity_hisp"         
 [16] "race"                    "race_other"              "learnaboutstudy"         "meds_y"                  "meds_which"             
 [21] "meds_dx"                 "meds_dose"               "majorhealthprobs_y"      "majorhealthprobs_what"   "past2wks_injuryinfect_y"
 [26] "past2wks_dentist_y"      "currenttx_y"             "postmenopausal_y"        "lastperiod"              "n_pregnancies"          
 [31] "n_livebirths"            "n_nursed"                "allergies"               "surgeries_past6mos"      "alcohol"                
 [36] "smoking_y"               "smoking_howlong"         "smoking_perday"          "caffeine_perday"         "exercise"               
 [41] "pss_1"                   "pss_2"                   "pss_3"                   "pss_4"                   "pss_5"                  
 [46] "pss_6"                   "pss_7"                   "pss_8"                   "pss_9"                   "pss_10"                 
 [51] "ysl_1"                   "ysl_2"                   "ysl_3"                   "ysl_4"                   "ysl_5"                  
 [56] "ysl_6"                   "ysl_7"                   "ysl_8"                   "ysl_9"                   "ysl_10"                 
 [61] "ysl_11"                  "ysl_12"                  "ysl_13"                  "ysl_14"                  "ysl_15"                 
 [66] "ysl_16"                  "ysl_17"                  "ysl_18"                  "ysl_19"                  "ysl_20"                 
 [71] "ysl_21"                  "icg_1"                   "icg_2"                   "icg_3"                   "icg_4"                  
 [76] "icg_5"                   "icg_6"                   "icg_7"                   "icg_8"                   "icg_9"                  
 [81] "icg_10"                  "icg_11"                  "icg_12"                  "icg_13"                  "icg_14"                 
 [86] "icg_15"                  "icg_16"                  "icg_17"                  "icg_18"                  "icg_19"                 
 [91] "bdi_1"                   "bdi_2"                   "bdi_3"                   "bdi_4"                   "bdi_5"                  
 [96] "bdi_6"                   "bdi_7"                   "bdi_8"                   "bdi_9"                   "bdi_10"                 
[101] "bdi_11"                  "bdi_12"                  "bdi_13"                  "bdi_14"                  "bdi_15"                 
[106] "bdi_16"                  "bdi_17"                  "bdi_18"                  "bdi_19"                  "bdi_20"                 
[111] "bdi_21"                  "hand_1"                  "hand_2"                  "hand_3"                  "hand_4"                 
[116] "hand_5"                  "hand_6"                  "hand_7"                  "hand_8"                  "hand_9"                 
[121] "hand_10"                 "hand_11"                 "hand_12"                 "hand_bat_1"              "bisbas_1"               
[126] "bisbas_2"                "bisbas_3"                "bisbas_4"                "bisbas_5"                "bisbas_6"               
[131] "bisbas_7"                "bisbas_8"                "bisbas_9"                "bisbas_10"               "bisbas_11"              
[136] "bisbas_12"               "bisbas_13"               "bisbas_14"               "bisbas_15"               "bisbas_16"              
[141] "bisbas_17"               "bisbas_18"               "bisbas_19"               "bisbas_20"               "bisbas_21"              
[146] "bisbas_22"               "bisbas_23"               "bisbas_24"               "bgq_1"                   "bgq_2"                  
[151] "bgq_3"                   "bgq_4"                   "bgq_5"                   "ecrrs_global_1"          "ecrrs_global_2"         
[156] "ecrrs_global_3"          "ecrrs_global_4"          "ecrrs_global_5"          "ecrrs_global_6"          "ecrrs_global_7"         
[161] "ecrrs_global_8"          "ecrrs_global_9"          "ecrrs_spouse_1"          "ecrrs_spouse_2"          "ecrrs_spouse_3"         
[166] "ecrrs_spouse_4"          "ecrrs_spouse_5"          "ecrrs_spouse_6"          "ecrrs_spouse_7"          "ecrrs_spouse_8"         
[171] "ecrrs_spouse_9"          "timesincedeath"          "age"                     "age_yrs"                 "pss_4r"                 
[176] "pss_5r"                  "pss_7r"                  "pss_8r"                  "tot_pss"                 "tot_ysl"                
[181] "tot_icg"                 "bdi_1c"                  "bdi_2c"                  "bdi_3c"                  "bdi_4c"                 
[186] "bdi_5c"                  "bdi_6c"                  "bdi_7c"                  "bdi_8c"                  "bdi_9c"                 
[191] "bdi_10c"                 "bdi_11c"                 "bdi_12c"                 "bdi_13c"                 "bdi_14c"                
[196] "bdi_15c"                 "bdi_16c"                 "bdi_17c"                 "bdi_18c"                 "bdi_19c"                
[201] "bdi_20c"                 "bdi_21c"                 "tot_bdi"                 "hand_1c"                 "hand_2c"                
[206] "hand_3c"                 "hand_4c"                 "hand_5c"                 "hand_6c"                 "hand_7c"                
[211] "hand_8c"                 "hand_9c"                 "hand_10c"                "hand_11c"                "hand_12c"               
[216] "hand_bat_1c"             "tot_handedness"          "bisbas_1r"               "bisbas_3r"               "bisbas_4r"              
[221] "bisbas_5r"               "bisbas_6r"               "bisbas_7r"               "bisbas_8r"               "bisbas_9r"              
[226] "bisbas_10r"              "bisbas_11r"              "bisbas_12r"              "bisbas_13r"              "bisbas_14r"             
[231] "bisbas_15r"              "bisbas_16r"              "bisbas_17r"              "bisbas_18r"              "bisbas_19r"             
[236] "bisbas_20r"              "bisbas_21r"              "bisbas_23r"              "bisbas_24r"              "tot_bisbas_basdr"       
[241] "tot_bisbas_basfun"       "tot_bisbas_basrr"        "tot_bisbas_bis"          "tot_bgq"                 "ecrrs_global_1c"        
[246] "ecrrs_global_2c"         "ecrrs_global_3c"         "ecrrs_global_4c"         "ecrrs_global_5c"         "ecrrs_global_6c"        
[251] "ecrrs_global_7c"         "ecrrs_global_8c"         "ecrrs_global_9c"         "ecrrs_global_1r"         "ecrrs_global_2r"        
[256] "ecrrs_global_3r"         "ecrrs_global_4r"         "tot_ecrrs_global_avoid"  "tot_ecrrs_global_anx"    "ecrrs_spouse_1c"        
[261] "ecrrs_spouse_2c"         "ecrrs_spouse_3c"         "ecrrs_spouse_4c"         "ecrrs_spouse_5c"         "ecrrs_spouse_6c"        
[266] "ecrrs_spouse_7c"         "ecrrs_spouse_8c"         "ecrrs_spouse_9c"         "ecrrs_spouse_1r"         "ecrrs_spouse_2r"        
[271] "ecrrs_spouse_3r"         "ecrrs_spouse_4r"         "tot_ecrrs_spouse_avoid"  "tot_ecrrs_spouse_anx"    "ucla_loneliness_1"      
[276] "ucla_loneliness_2"       "ucla_loneliness_3"       "ucla_loneliness_4"       "ucla_loneliness_5"       "ucla_loneliness_6"      
[281] "ucla_loneliness_7"       "ucla_loneliness_8"       "ucla_loneliness_9"       "ucla_loneliness_10"      "ucla_loneliness_11"     
[286] "ucla_loneliness_12"      "ucla_loneliness_13"      "ucla_loneliness_14"      "ucla_loneliness_15"      "ucla_loneliness_16"     
[291] "ucla_loneliness_17"      "ucla_loneliness_18"      "ucla_loneliness_19"      "ucla_loneliness_20"      "gcq_1"                  
[296] "gcq_2"                   "gcq_3"                   "gcq_4"                   "gcq_5"                   "gcq_6"                  
[301] "gcq_7"                   "gcq_8"                   "gcq_9"                   "gcq_10"                  "gcq_11"                 
[306] "gcq_12"                  "gcq_13"                  "gcq_14"                  "gcq_15"                  "gcq_16"                 
[311] "gcq_17"                  "gcq_18"                  "gcq_19"                  "gcq_20"                  "gcq_21"                 
[316] "gcq_22"                  "gcq_23"                  "gcq_24"                  "gcq_25"                  "gcq_26"                 
[321] "gcq_27"                  "gcq_28"                  "gcq_29"                  "gcq_30"                  "gcq_31"                 
[326] "gcq_32"                  "gcq_33"                  "gcq_34"                  "gcq_35"                  "gcq_36"                 
[331] "gcq_37"                  "gcq_38"                  "srrs_1"                  "srrs_2"                  "srrs_3"                 
[336] "srrs_4"                  "srrs_5"                  "srrs_6"                  "srrs_7"                  "srrs_8"                 
[341] "srrs_9"                  "srrs_10"                 "srrs_11"                 "srrs_12"                 "srrs_13"                
[346] "srrs_14"                 "srrs_15"                 "srrs_16"                 "srrs_17"                 "srrs_18"                
[351] "srrs_19"                 "srrs_20"                 "srrs_21"                 "srrs_22"                 "srrs_23"                
[356] "srrs_24"                 "srrs_25"                 "srrs_26"                 "srrs_27"                 "srrs_28"                
[361] "srrs_29"                 "srrs_30"                 "srrs_31"                 "srrs_32"                 "srrs_33"                
[366] "srrs_34"                 "srrs_35"                 "srrs_36"                 "srrs_37"                 "srrs_38"                
[371] "srrs_39"                 "srrs_40"                 "srrs_41"                 "srrs_42"                 "srrs_43"                
[376] "srrs_44"                 "srrs_45"                 "srrs_46"                 "srrs_47"                 "srrs_48"                
[381] "srrs_49"                 "srrs_50"                 "srrs_51"                 "ppss_fr_1"               "ppss_fr_2"              
[386] "ppss_fr_3"               "ppss_fr_4"               "ppss_fr_5"               "ppss_fr_6"               "ppss_fr_7"              
[391] "ppss_fr_8"               "ppss_fr_9"               "ppss_fr_10"              "ppss_fr_11"              "ppss_fr_12"             
[396] "ppss_fr_13"              "ppss_fr_14"              "ppss_fr_15"              "ppss_fr_16"              "ppss_fr_17"             
[401] "ppss_fr_18"              "ppss_fr_19"              "ppss_fr_20"              "ppss_fa_1"               "ppss_fa_2"              
[406] "ppss_fa_3"               "ppss_fa_4"               "ppss_fa_5"               "ppss_fa_6"               "ppss_fa_7"              
[411] "ppss_fa_8"               "ppss_fa_9"               "ppss_fa_10"              "ppss_fa_11"              "ppss_fa_12"             
[416] "ppss_fa_13"              "ppss_fa_14"              "ppss_fa_15"              "ppss_fa_16"              "ppss_fa_17"             
[421] "ppss_fa_18"              "ppss_fa_19"              "ppss_fa_20"              "tot_srrs_n"              "tot_srrs"               
[426] "ucla_loneliness_1r"      "ucla_loneliness_5r"      "ucla_loneliness_6r"      "ucla_loneliness_9r"      "ucla_loneliness_10r"    
[431] "ucla_loneliness_15r"     "ucla_loneliness_16r"     "ucla_loneliness_19r"     "ucla_loneliness_20r"     "tot_ucla_loneliness"    
[436] "tot_gcq_self"            "tot_gcq_world"           "tot_gcq_life"            "tot_gcq_future"          "tot_gcq_blame"          
[441] "tot_gcq_others"          "tot_gcq_approp"          "tot_gcq_cherish"         "tot_gcq_threat"          "ppss_fr_2r"             
[446] "ppss_fr_6r"              "ppss_fr_7r"              "ppss_fr_15r"             "ppss_fr_18r"             "ppss_fr_20r"            
[451] "tot_ppss_fr"             "ppss_fa_3r"              "ppss_fa_4r"              "ppss_fa_16r"             "ppss_fa_19r"            
[456] "ppss_fa_20r"             "tot_ppss_fa"            

This results in 40 observations of 457 variables.

# save it
saveRDS(baseline_all, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_with_post-baseline.rds")
# Save it as a csv file
write.csv(baseline_all, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_with_post-baseline.csv")

4.10 Evaluate missing data

baseline_NA <- baseline_all %>% 
  select_if(function(x) any(is.na(x))) %>% 
  summarise_all(funs(mean(is.na(.)))) # use sum() to find n missing values
baseline_NA_long <- gather(baseline_NA) # create long data that lists variables with any NAs, and % of data missing
# tests for MAR/MCAR? BaylorEdPsych package doesn't work for me...
# equivalent to SUM.x() in SPSS? (only compute SUM if participant has responses on a certain number of items)
# another approach, although this works best with much smaller datasets (too many variables here to visualize)
library(mice)
library(VIM)
aggr = aggr(baseline_4, col=mdc(2:457), numbers=TRUE, sortVars=TRUE, labels=names(baseline_all), cex.axis=.7, gap=3, ylab=c("Proportion of missingness","Missingness Pattern"))
not enough vertical space to display frequencies (too many combinations)

 Variables sorted by number of missings: 
                Variable Count
              race_other 0.975
         education_other 0.950
              lastperiod 0.925
         smoking_howlong 0.925
          smoking_perday 0.925
   majorhealthprobs_what 0.725
        postmenopausal_y 0.350
            n_livebirths 0.300
                n_nursed 0.300
      surgeries_past6mos 0.300
               meds_dose 0.200
                 meds_dx 0.175
              meds_which 0.150
           n_pregnancies 0.100
         learnaboutstudy 0.025
                  meds_y 0.025
 past2wks_injuryinfect_y 0.025
               allergies 0.025
                   bdi_1 0.025
                   bdi_7 0.025
                   bdi_8 0.025
                   bdi_9 0.025
                  bdi_13 0.025
                  bdi_15 0.025
                  bdi_19 0.025
                  hand_3 0.025
               bisbas_11 0.025
               bisbas_15 0.025
                  bdi_1c 0.025
                  bdi_7c 0.025
                  bdi_8c 0.025
                  bdi_9c 0.025
                 bdi_13c 0.025
                 bdi_15c 0.025
                 bdi_19c 0.025
                 hand_3c 0.025
              bisbas_15r 0.025
               startdate 0.000
                      ID 0.000
                     dob 0.000
                   sex_m 0.000
             dateofdeath 0.000
            knowbefore_y 0.000
             caretaker_y 0.000
               education 0.000
           highestdegree 0.000
              employment 0.000
           householdsize 0.000
     householdsize_adult 0.000
    householdsize_income 0.000
          ethnicity_hisp 0.000
                    race 0.000
      majorhealthprobs_y 0.000
      past2wks_dentist_y 0.000
             currenttx_y 0.000
                 alcohol 0.000
               smoking_y 0.000
         caffeine_perday 0.000
                exercise 0.000
                   pss_1 0.000
                   pss_2 0.000
                   pss_3 0.000
                   pss_4 0.000
                   pss_5 0.000
                   pss_6 0.000
                   pss_7 0.000
                   pss_8 0.000
                   pss_9 0.000
                  pss_10 0.000
                   ysl_1 0.000
                   ysl_2 0.000
                   ysl_3 0.000
                   ysl_4 0.000
                   ysl_5 0.000
                   ysl_6 0.000
                   ysl_7 0.000
                   ysl_8 0.000
                   ysl_9 0.000
                  ysl_10 0.000
                  ysl_11 0.000
                  ysl_12 0.000
                  ysl_13 0.000
                  ysl_14 0.000
                  ysl_15 0.000
                  ysl_16 0.000
                  ysl_17 0.000
                  ysl_18 0.000
                  ysl_19 0.000
                  ysl_20 0.000
                  ysl_21 0.000
                   icg_1 0.000
                   icg_2 0.000
                   icg_3 0.000
                   icg_4 0.000
                   icg_5 0.000
                   icg_6 0.000
                   icg_7 0.000
                   icg_8 0.000
                   icg_9 0.000
                  icg_10 0.000
                  icg_11 0.000
                  icg_12 0.000
                  icg_13 0.000
                  icg_14 0.000
                  icg_15 0.000
                  icg_16 0.000
                  icg_17 0.000
                  icg_18 0.000
                  icg_19 0.000
                   bdi_2 0.000
                   bdi_3 0.000
                   bdi_4 0.000
                   bdi_5 0.000
                   bdi_6 0.000
                  bdi_10 0.000
                  bdi_11 0.000
                  bdi_12 0.000
                  bdi_14 0.000
                  bdi_16 0.000
                  bdi_17 0.000
                  bdi_18 0.000
                  bdi_20 0.000
                  bdi_21 0.000
                  hand_1 0.000
                  hand_2 0.000
                  hand_4 0.000
                  hand_5 0.000
                  hand_6 0.000
                  hand_7 0.000
                  hand_8 0.000
                  hand_9 0.000
                 hand_10 0.000
                 hand_11 0.000
                 hand_12 0.000
              hand_bat_1 0.000
                bisbas_1 0.000
                bisbas_2 0.000
                bisbas_3 0.000
                bisbas_4 0.000
                bisbas_5 0.000
                bisbas_6 0.000
                bisbas_7 0.000
                bisbas_8 0.000
                bisbas_9 0.000
               bisbas_10 0.000
               bisbas_12 0.000
               bisbas_13 0.000
               bisbas_14 0.000
               bisbas_16 0.000
               bisbas_17 0.000
               bisbas_18 0.000
               bisbas_19 0.000
               bisbas_20 0.000
               bisbas_21 0.000
               bisbas_22 0.000
               bisbas_23 0.000
               bisbas_24 0.000
                   bgq_1 0.000
                   bgq_2 0.000
                   bgq_3 0.000
                   bgq_4 0.000
                   bgq_5 0.000
          ecrrs_global_1 0.000
          ecrrs_global_2 0.000
          ecrrs_global_3 0.000
          ecrrs_global_4 0.000
          ecrrs_global_5 0.000
          ecrrs_global_6 0.000
          ecrrs_global_7 0.000
          ecrrs_global_8 0.000
          ecrrs_global_9 0.000
          ecrrs_spouse_1 0.000
          ecrrs_spouse_2 0.000
          ecrrs_spouse_3 0.000
          ecrrs_spouse_4 0.000
          ecrrs_spouse_5 0.000
          ecrrs_spouse_6 0.000
          ecrrs_spouse_7 0.000
          ecrrs_spouse_8 0.000
          ecrrs_spouse_9 0.000
          timesincedeath 0.000
                     age 0.000
                 age_yrs 0.000
                  pss_4r 0.000
                  pss_5r 0.000
                  pss_7r 0.000
                  pss_8r 0.000
                 tot_pss 0.000
                 tot_ysl 0.000
                 tot_icg 0.000
                  bdi_2c 0.000
                  bdi_3c 0.000
                  bdi_4c 0.000
                  bdi_5c 0.000
                  bdi_6c 0.000
                 bdi_10c 0.000
                 bdi_11c 0.000
                 bdi_12c 0.000
                 bdi_14c 0.000
                 bdi_16c 0.000
                 bdi_17c 0.000
                 bdi_18c 0.000
                 bdi_20c 0.000
                 bdi_21c 0.000
                 tot_bdi 0.000
                 hand_1c 0.000
                 hand_2c 0.000
                 hand_4c 0.000
                 hand_5c 0.000
                 hand_6c 0.000
                 hand_7c 0.000
                 hand_8c 0.000
                 hand_9c 0.000
                hand_10c 0.000
                hand_11c 0.000
                hand_12c 0.000
             hand_bat_1c 0.000
          tot_handedness 0.000
               bisbas_1r 0.000
               bisbas_3r 0.000
               bisbas_4r 0.000
               bisbas_5r 0.000
               bisbas_6r 0.000
               bisbas_7r 0.000
               bisbas_8r 0.000
               bisbas_9r 0.000
              bisbas_10r 0.000
              bisbas_11r 0.000
              bisbas_12r 0.000
              bisbas_13r 0.000
              bisbas_14r 0.000
              bisbas_16r 0.000
              bisbas_17r 0.000
              bisbas_18r 0.000
              bisbas_19r 0.000
              bisbas_20r 0.000
              bisbas_21r 0.000
              bisbas_23r 0.000
              bisbas_24r 0.000
        tot_bisbas_basdr 0.000
       tot_bisbas_basfun 0.000
        tot_bisbas_basrr 0.000
          tot_bisbas_bis 0.000
                 tot_bgq 0.000
         ecrrs_global_1c 0.000
         ecrrs_global_2c 0.000
         ecrrs_global_3c 0.000
         ecrrs_global_4c 0.000
         ecrrs_global_5c 0.000
         ecrrs_global_6c 0.000
         ecrrs_global_7c 0.000
         ecrrs_global_8c 0.000
         ecrrs_global_9c 0.000
         ecrrs_global_1r 0.000
         ecrrs_global_2r 0.000
         ecrrs_global_3r 0.000
         ecrrs_global_4r 0.000
  tot_ecrrs_global_avoid 0.000
    tot_ecrrs_global_anx 0.000
         ecrrs_spouse_1c 0.000
         ecrrs_spouse_2c 0.000
         ecrrs_spouse_3c 0.000
         ecrrs_spouse_4c 0.000
         ecrrs_spouse_5c 0.000
         ecrrs_spouse_6c 0.000
         ecrrs_spouse_7c 0.000
         ecrrs_spouse_8c 0.000
         ecrrs_spouse_9c 0.000
         ecrrs_spouse_1r 0.000
         ecrrs_spouse_2r 0.000
         ecrrs_spouse_3r 0.000
         ecrrs_spouse_4r 0.000
  tot_ecrrs_spouse_avoid 0.000
    tot_ecrrs_spouse_anx 0.000

We have 86/457 variables missing some amount of data, though some are because the question doesn’t apply (e.g., education_other or lastperiod), and others are because “don’t know” was recoded as NA and not scored for the PPSS. One person missed BDI item 9 (suicidality), which may not be at random…

5 Pre/post fMRI

This section of the script deals with the surveys that participants completed pre- and post-fMRI. Data from the two visits were entered as (e.g.) D141 at visit 1 and D141_b at visit 2, so need to organize data such that rather than one variable for two cases, there are two variables for one case. Each participant returned for two fMRI sessions, so variables appended “_v1” are from the first visit, and variables appended “_v2” are from the second visit.

What has been done up to this point: (1) codebook created, (2) data exported from Qualtrics.

5.1 Import data and clean up Qualtrics junk

Task: Import data from CSV files except for the first 17 columns (1:17 is just Qualtrics junk).

# run install.packages("tidyverse") if this is the first time using dplyr on your local machine
library(tidyverse)
filter <- dplyr::filter
select <- dplyr::select

pre_fmri <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT+fMRI+At+The+Scanner_January+18%2C+2019_14.22.csv", stringsAsFactors = FALSE, na.strings="")[ ,-c(2:17)]
post_fmri <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT+fMRI+At+The+Scanner+Post-Scan_January+18%2C+2019_14.23.csv", stringsAsFactors = FALSE, na.strings="")[ ,-c(2:17)]
# na.strings = "" replaces all instances where missing data is represented by blank cells with NA, which is how R handles missing values.
View(pre_fmri)
View(post_fmri)

NOTE: In pre_fmri, there were two cases labeled “D115_b” with non-matching data. Figured out that this is because D115_b completed the pre survey before AND after the scan (rather than completing the post survey after). I kept the case that starts Q176_1 = 4, Q176_2 = 1, Q176_3 = 2… as D115_b and changed the other to D115_b_post. Why? According to the raw AAT data, the task was run at 2:15pm and 2:25pm. In Qualtrics, the first (now D115_b) was completed at 1:15pm and the second (now D115_b_post) was completed at 2:55pm (both on 2/12/2016). These two cases need to be separated out and dealt with later.

post_fmri_0 <- post_fmri %>% filter(grepl("^D1", ID, ignore.case = TRUE))
View(post_fmri_0)
# Save it so we don't need to go through all THAT again
write.csv(post_fmri_0, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/post_fmri_0.csv")
# There are two variables at the end of post_fmri that are also Qualtrics junk.
# Get their names and remove them:
names(post_fmri_0) 
 [1] "StartDate"       "ID"              "Q176_1"          "Q176_2"          "Q176_3"          "Q176_4"          "Q176_5"          "Q176_6"         
 [9] "Q176_7"          "Q176_8"          "Q176_9"          "Q176_10"         "Q176_11"         "Q176_12"         "Q176_13"         "Q176_14"        
[17] "Q176_15"         "Q176_16"         "Q176_17"         "Q176_18"         "Q176_19"         "Q176_20"         "STAI.S_1"        "STAI.S_2"       
[25] "STAI.S_3"        "STAI.S_4"        "STAI.S_5"        "STAI.S_6"        "STAI.S_7"        "STAI.S_8"        "STAI.S_9"        "STAI.S_10"      
[33] "STAI.S_11"       "STAI.S_12"       "STAI.S_13"       "STAI.S_14"       "STAI.S_15"       "STAI.S_16"       "STAI.S_17"       "STAI.S_18"      
[41] "STAI.S_19"       "STAI.S_20"       "SROE.1"          "SROE.2"          "Q7"              "ID...Topics"     "SROE.2...Topics"
post_fmri_0$ID...Topics <- NULL
post_fmri_0$SROE.2...Topics <- NULL 
# also remove StartDate
post_fmri_0$StartDate <- NULL
write.csv(post_fmri_0, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/post_fmri_0.csv") # 80 observations of 44 variables

5.2 Rename variables

The name to the left of the equal sign is the new name, the one on the right is what the variable was named in Qualtrics.

#### PRE-FMRI
pre_fmri_1 <- rename(pre_fmri_0, ID = ID, pre_panas_1 = Q176_1,
  pre_panas_2 = Q176_2,
  pre_panas_3 = Q176_3,
  pre_panas_4 = Q176_4,
  pre_panas_5 = Q176_5,
  pre_panas_6 = Q176_6,
  pre_panas_7 = Q176_7,
  pre_panas_8 = Q176_8,
  pre_panas_9 = Q176_9,
  pre_panas_10 = Q176_10,
  pre_panas_11 = Q176_11,
  pre_panas_12 = Q176_12,
  pre_panas_13 = Q176_13,
  pre_panas_14 = Q176_14,
  pre_panas_15 = Q176_15,   
  pre_panas_16 = Q176_16,
  pre_panas_17 = Q176_17,
  pre_panas_18 = Q176_18,
  pre_panas_19 = Q176_19,
  pre_panas_20 = Q176_20,
  pre_stai_1 = STAI.S_1,
  pre_stai_2 = STAI.S_2,
  pre_stai_3 = STAI.S_3,
  pre_stai_4 = STAI.S_4,
  pre_stai_5 = STAI.S_5,
  pre_stai_6 = STAI.S_6,
  pre_stai_7 = STAI.S_7,
  pre_stai_8 = STAI.S_8,
  pre_stai_9 = STAI.S_9,
  pre_stai_10 = STAI.S_10,
  pre_stai_11 = STAI.S_11,
  pre_stai_12 = STAI.S_12,
  pre_stai_13 = STAI.S_13,
  pre_stai_14 = STAI.S_14,
  pre_stai_15 = STAI.S_15,   
  pre_stai_16 = STAI.S_16,
  pre_stai_17 = STAI.S_17,
  pre_stai_18 = STAI.S_18,
  pre_stai_19 = STAI.S_19,
  pre_stai_20 = STAI.S_20
)
# Make all of the variables (except ID) numeric rather than chr:
pre_fmri_1 <- pre_fmri_1 %>% mutate_at(vars(-ID), funs(as.numeric))
# Check it out:
names(pre_fmri_1)
 [1] "ID"           "pre_panas_1"  "pre_panas_2"  "pre_panas_3"  "pre_panas_4"  "pre_panas_5"  "pre_panas_6"  "pre_panas_7"  "pre_panas_8"  "pre_panas_9" 
[11] "pre_panas_10" "pre_panas_11" "pre_panas_12" "pre_panas_13" "pre_panas_14" "pre_panas_15" "pre_panas_16" "pre_panas_17" "pre_panas_18" "pre_panas_19"
[21] "pre_panas_20" "pre_stai_1"   "pre_stai_2"   "pre_stai_3"   "pre_stai_4"   "pre_stai_5"   "pre_stai_6"   "pre_stai_7"   "pre_stai_8"   "pre_stai_9"  
[31] "pre_stai_10"  "pre_stai_11"  "pre_stai_12"  "pre_stai_13"  "pre_stai_14"  "pre_stai_15"  "pre_stai_16"  "pre_stai_17"  "pre_stai_18"  "pre_stai_19" 
[41] "pre_stai_20" 
str(pre_fmri_1)
'data.frame':   85 obs. of  41 variables:
 $ ID          : chr  "D101" "D101_b" "D102" "D102_b" ...
 $ pre_panas_1 : num  4 4 5 5 5 5 4 4 4 5 ...
 $ pre_panas_2 : num  1 1 2 1 3 3 1 1 1 2 ...
 $ pre_panas_3 : num  2 1 4 4 3 3 3 3 3 3 ...
 $ pre_panas_4 : num  1 1 1 1 2 3 1 1 1 2 ...
 $ pre_panas_5 : num  3 3 4 5 3 2 4 4 1 3 ...
 $ pre_panas_6 : num  1 1 1 1 1 1 1 1 2 1 ...
 $ pre_panas_7 : num  1 1 3 1 3 3 2 1 2 1 ...
 $ pre_panas_8 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ pre_panas_9 : num  4 2 5 5 5 3 3 4 3 4 ...
 $ pre_panas_10: num  1 1 4 4 2 3 3 4 2 2 ...
 $ pre_panas_11: num  1 1 1 1 1 1 1 1 1 1 ...
 $ pre_panas_12: num  4 4 5 5 5 4 4 3 4 5 ...
 $ pre_panas_13: num  1 1 1 1 1 1 1 1 1 1 ...
 $ pre_panas_14: num  2 2 4 5 3 3 3 4 1 2 ...
 $ pre_panas_15: num  1 1 2 2 4 3 3 1 3 3 ...
 $ pre_panas_16: num  3 4 4 5 5 4 3 4 1 3 ...
 $ pre_panas_17: num  4 4 5 5 5 4 4 4 2 5 ...
 $ pre_panas_18: num  1 1 1 1 4 3 3 2 1 2 ...
 $ pre_panas_19: num  4 4 3 5 4 2 4 5 1 3 ...
 $ pre_panas_20: num  1 1 1 1 3 3 2 1 1 1 ...
 $ pre_stai_1  : num  4 4 3 3 2 2 3 4 3 3 ...
 $ pre_stai_2  : num  4 4 4 4 3 2 4 4 3 3 ...
 $ pre_stai_3  : num  1 1 2 1 3 3 2 1 2 2 ...
 $ pre_stai_4  : num  1 1 1 1 3 2 2 1 1 1 ...
 $ pre_stai_5  : num  4 4 3 4 2 2 3 3 2 2 ...
 $ pre_stai_6  : num  1 1 1 1 2 2 1 1 1 2 ...
 $ pre_stai_7  : num  1 4 1 1 4 4 1 1 1 2 ...
 $ pre_stai_8  : num  4 4 4 3 1 1 3 4 2 4 ...
 $ pre_stai_9  : num  1 1 1 1 3 2 1 1 1 1 ...
 $ pre_stai_10 : num  4 4 3 4 2 2 4 3 3 3 ...
 $ pre_stai_11 : num  4 4 4 4 2 3 2 4 2 3 ...
 $ pre_stai_12 : num  1 1 1 1 3 2 1 1 2 2 ...
 $ pre_stai_13 : num  1 1 1 1 3 2 1 1 1 2 ...
 $ pre_stai_14 : num  1 1 2 3 1 1 2 1 1 1 ...
 $ pre_stai_15 : num  4 4 1 4 1 1 4 4 2 3 ...
 $ pre_stai_16 : num  4 4 4 3 1 1 3 4 2 3 ...
 $ pre_stai_17 : num  1 1 1 1 4 3 1 1 2 2 ...
 $ pre_stai_18 : num  1 1 3 1 4 2 1 1 1 1 ...
 $ pre_stai_19 : num  4 3 3 4 2 2 4 4 3 3 ...
 $ pre_stai_20 : num  3 3 3 4 1 2 4 4 3 4 ...
# Save it:
saveRDS(pre_fmri_1, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/pre_fmri_1.rds")
#### POST-FMRI
post_fmri_1 <- rename(post_fmri_0, ID = ID, post_panas_1 = Q176_1,
  post_panas_2 = Q176_2,
  post_panas_3 = Q176_3,
  post_panas_4 = Q176_4,
  post_panas_5 = Q176_5,
  post_panas_6 = Q176_6,
  post_panas_7 = Q176_7,
  post_panas_8 = Q176_8,
  post_panas_9 = Q176_9,
  post_panas_10 = Q176_10,
  post_panas_11 = Q176_11,
  post_panas_12 = Q176_12,
  post_panas_13 = Q176_13,
  post_panas_14 = Q176_14,
  post_panas_15 = Q176_15,   
  post_panas_16 = Q176_16,
  post_panas_17 = Q176_17,
  post_panas_18 = Q176_18,
  post_panas_19 = Q176_19,
  post_panas_20 = Q176_20,
  post_stai_1 = STAI.S_1,
  post_stai_2 = STAI.S_2,
  post_stai_3 = STAI.S_3,
  post_stai_4 = STAI.S_4,
  post_stai_5 = STAI.S_5,
  post_stai_6 = STAI.S_6,
  post_stai_7 = STAI.S_7,
  post_stai_8 = STAI.S_8,
  post_stai_9 = STAI.S_9,
  post_stai_10 = STAI.S_10,
  post_stai_11 = STAI.S_11,
  post_stai_12 = STAI.S_12,
  post_stai_13 = STAI.S_13,
  post_stai_14 = STAI.S_14,
  post_stai_15 = STAI.S_15,   
  post_stai_16 = STAI.S_16,
  post_stai_17 = STAI.S_17,
  post_stai_18 = STAI.S_18,
  post_stai_19 = STAI.S_19,
  post_stai_20 = STAI.S_20,
  post_sroe_1 = SROE.1,
  post_sroe_2 = SROE.2,
  post_sroe_3 = Q7
)
# Make all of the variables (except ID and SROE 1 and 2 vars) numeric rather than chr:
post_fmri_1 <- post_fmri_1 %>% mutate_at(vars(-c(ID,post_sroe_1,post_sroe_2)), funs(as.numeric))
# Check it out:
names(post_fmri_1)
 [1] "ID"            "post_panas_1"  "post_panas_2"  "post_panas_3"  "post_panas_4"  "post_panas_5"  "post_panas_6"  "post_panas_7"  "post_panas_8" 
[10] "post_panas_9"  "post_panas_10" "post_panas_11" "post_panas_12" "post_panas_13" "post_panas_14" "post_panas_15" "post_panas_16" "post_panas_17"
[19] "post_panas_18" "post_panas_19" "post_panas_20" "post_stai_1"   "post_stai_2"   "post_stai_3"   "post_stai_4"   "post_stai_5"   "post_stai_6"  
[28] "post_stai_7"   "post_stai_8"   "post_stai_9"   "post_stai_10"  "post_stai_11"  "post_stai_12"  "post_stai_13"  "post_stai_14"  "post_stai_15" 
[37] "post_stai_16"  "post_stai_17"  "post_stai_18"  "post_stai_19"  "post_stai_20"  "post_sroe_1"   "post_sroe_2"   "post_sroe_3"  
str(post_fmri_1)
'data.frame':   81 obs. of  44 variables:
 $ ID           : chr  "D101" "D101_b" "D102" "D102_b" ...
 $ post_panas_1 : num  3 3 5 5 5 5 4 5 3 2 ...
 $ post_panas_2 : num  1 1 1 1 1 1 2 1 1 2 ...
 $ post_panas_3 : num  1 1 3 5 3 3 3 4 3 1 ...
 $ post_panas_4 : num  1 1 2 1 1 1 1 1 1 1 ...
 $ post_panas_5 : num  3 2 4 5 4 2 4 5 2 3 ...
 $ post_panas_6 : num  1 1 1 1 1 1 1 1 2 1 ...
 $ post_panas_7 : num  1 1 1 1 1 1 2 1 1 1 ...
 $ post_panas_8 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_panas_9 : num  2 2 4 5 5 3 3 4 3 4 ...
 $ post_panas_10: num  1 1 4 4 3 3 4 5 2 2 ...
 $ post_panas_11: num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_panas_12: num  3 5 4 5 4 4 4 4 3 3 ...
 $ post_panas_13: num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_panas_14: num  2 1 4 4 3 3 3 4 2 2 ...
 $ post_panas_15: num  1 1 1 2 2 2 1 1 2 2 ...
 $ post_panas_16: num  2 1 4 5 5 3 4 5 2 3 ...
 $ post_panas_17: num  3 5 3 5 4 4 3 4 3 3 ...
 $ post_panas_18: num  1 1 1 2 2 2 1 1 1 1 ...
 $ post_panas_19: num  3 3 3 5 3 3 4 5 2 3 ...
 $ post_panas_20: num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_stai_1  : num  4 3 4 3 2 2 4 4 3 2 ...
 $ post_stai_2  : num  4 4 4 4 3 3 4 4 3 3 ...
 $ post_stai_3  : num  1 1 1 1 2 1 1 1 2 2 ...
 $ post_stai_4  : num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_stai_5  : num  4 4 4 4 3 3 4 4 2 3 ...
 $ post_stai_6  : num  1 1 1 1 1 1 1 1 1 1 ...
 $ post_stai_7  : num  1 1 1 1 4 3 1 1 1 2 ...
 $ post_stai_8  : num  2 4 3 3 2 2 3 4 3 3 ...
 $ post_stai_9  : num  1 1 1 1 2 1 1 1 1 1 ...
 $ post_stai_10 : num  3 3 4 4 3 3 3 4 3 4 ...
 $ post_stai_11 : num  3 4 4 4 3 3 4 4 3 3 ...
 $ post_stai_12 : num  1 1 1 2 2 2 2 1 2 2 ...
 $ post_stai_13 : num  1 1 1 1 2 1 1 1 1 1 ...
 $ post_stai_14 : num  1 1 1 1 1 1 1 1 1 2 ...
 $ post_stai_15 : num  4 3 4 4 3 2 4 4 3 3 ...
 $ post_stai_16 : num  2 4 4 3 3 2 4 3 2 3 ...
 $ post_stai_17 : num  1 1 1 1 2 2 1 1 2 2 ...
 $ post_stai_18 : num  1 1 1 1 1 1 4 1 2 1 ...
 $ post_stai_19 : num  3 3 3 3 3 2 4 4 3 3 ...
 $ post_stai_20 : num  2 3 4 4 3 3 4 4 3 4 ...
 $ post_sroe_1  : chr  "The first time I saw the photo of Julie and her new glasses, it took my breath away because that's an incredibly characteristic"| __truncated__ "This time I was far more focused  on the frame and only made a couple of conscious errors with the joystick." "inrent" "focused" ...
 $ post_sroe_2  : chr  "I was trying not to look at the photos and struggling with that. I noticed that the male looked vaguely like me in that he was "| __truncated__ "I was trying hard NOT to look at the pictures but focus on the task. This may have been easier since I already was familiar wit"| __truncated__ "trying to concentrate on the frame not the pictures, but the coffin was very stark" "concentrating on the frames" ...
 $ post_sroe_3  : num  20 19 19 19 19 20 19 17 19 20 ...
# Save it:
saveRDS(post_fmri_1, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/post_fmri_1.rds")

5.3 Clean numerical variables and score scales

5.3.1 Pre

# For this section, you'll need the 'psych' package
## install.packages("psych") if you don't have it on this machine
library(psych)
pre_fmri_2 <- pre_fmri_1 # pre_fmri_2 will contain the scored measures
##################  
### Positive and Negative Affect Schedule (PANAS) – State Version
# Citation: Watson, D., Clark, L. A., & Tellegen, A. (1988). Development and validation of brief measures of positive and negative affect: the PANAS scales. Journal of Personality and Social Psychology, 54(6), 1063. 
# Answer choices range from 1 (Very slightly or not at all) – 4 (Extremely).
# No reverse-scored items.
# Positive affect: 1, 3, 5, 9, 10, 12, 14, 16, 17, 19 [tot_pre_panas_pa]
# Negative affect: 2, 4, 6, 7, 8, 11, 13, 15, 18, 20 [tot_pre_panas_na]
# total score:
tot_pre_panas_pa <- subset(pre_fmri_2, select=c("pre_panas_1","pre_panas_3", "pre_panas_5", "pre_panas_9","pre_panas_10","pre_panas_12","pre_panas_14","pre_panas_16","pre_panas_17","pre_panas_19"))
tot_pre_panas_na <- subset(pre_fmri_2, select=c("pre_panas_2","pre_panas_4", "pre_panas_6", "pre_panas_7","pre_panas_8","pre_panas_11","pre_panas_13","pre_panas_15","pre_panas_18","pre_panas_20"))
pre_fmri_2$tot_pre_panas_pa <- rowSums(tot_pre_panas_pa, na.rm=TRUE) 
describe(pre_fmri_2$tot_pre_panas_pa)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 85 33.46 6.85     33   33.45 7.41  14  50    36 0.05    -0.08 0.74
pre_fmri_2$tot_pre_panas_na <- rowSums(tot_pre_panas_na, na.rm=TRUE) 
describe(pre_fmri_2$tot_pre_panas_na)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 85 12.86 3.48     12   12.26 2.97  10  27    17 1.59     2.65 0.38
##################  
### State-Trait Anxiety Inventory (STAI) – State Version
# Citation: Spielberger, C.D. (1983). Manual for the State-Trait Anxiety Inventory (STAI). Palo Alto, CA: Consulting Psychologists Press. 
# Answer choices range from 1 (Not at all) – 4 (Very much so).
# Reverse-scored: 1, 2, 5, 8, 10, 11, 15, 16, 19, 20. 
# Sum total score [tot_pre_stai]
pre_fmri_2$pre_stai_1r <- 5 - pre_fmri_2$pre_stai_1
pre_fmri_2$pre_stai_2r <- 5 - pre_fmri_2$pre_stai_2
pre_fmri_2$pre_stai_5r <- 5 - pre_fmri_2$pre_stai_5
pre_fmri_2$pre_stai_8r <- 5 - pre_fmri_2$pre_stai_8
pre_fmri_2$pre_stai_10r <- 5 - pre_fmri_2$pre_stai_10
pre_fmri_2$pre_stai_11r <- 5 - pre_fmri_2$pre_stai_11
pre_fmri_2$pre_stai_15r <- 5 - pre_fmri_2$pre_stai_15
pre_fmri_2$pre_stai_16r <- 5 - pre_fmri_2$pre_stai_16
pre_fmri_2$pre_stai_19r <- 5 - pre_fmri_2$pre_stai_19
pre_fmri_2$pre_stai_20r <- 5 - pre_fmri_2$pre_stai_20
# total score:
tot_pre_stai <- subset(pre_fmri_2, select=c("pre_stai_1r","pre_stai_2r","pre_stai_3","pre_stai_4","pre_stai_5r","pre_stai_6","pre_stai_7","pre_stai_8r", "pre_stai_9","pre_stai_10r","pre_stai_11r","pre_stai_12","pre_stai_13","pre_stai_14","pre_stai_15r","pre_stai_16r","pre_stai_17","pre_stai_18","pre_stai_19r","pre_stai_20r"))
pre_fmri_2$tot_pre_stai <- rowSums(tot_pre_stai, na.rm=TRUE) 
describe(pre_fmri_2$tot_pre_stai)
   vars  n  mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 85 32.28 9.38     31    31.2 8.9  20  63    43 1.05     1.04 1.02
# check that all "tot_*" variables appear
names(pre_fmri_2) 
 [1] "ID"               "pre_panas_1"      "pre_panas_2"      "pre_panas_3"      "pre_panas_4"      "pre_panas_5"      "pre_panas_6"      "pre_panas_7"     
 [9] "pre_panas_8"      "pre_panas_9"      "pre_panas_10"     "pre_panas_11"     "pre_panas_12"     "pre_panas_13"     "pre_panas_14"     "pre_panas_15"    
[17] "pre_panas_16"     "pre_panas_17"     "pre_panas_18"     "pre_panas_19"     "pre_panas_20"     "pre_stai_1"       "pre_stai_2"       "pre_stai_3"      
[25] "pre_stai_4"       "pre_stai_5"       "pre_stai_6"       "pre_stai_7"       "pre_stai_8"       "pre_stai_9"       "pre_stai_10"      "pre_stai_11"     
[33] "pre_stai_12"      "pre_stai_13"      "pre_stai_14"      "pre_stai_15"      "pre_stai_16"      "pre_stai_17"      "pre_stai_18"      "pre_stai_19"     
[41] "pre_stai_20"      "tot_pre_panas_pa" "tot_pre_panas_na" "pre_stai_1r"      "pre_stai_2r"      "pre_stai_5r"      "pre_stai_8r"      "pre_stai_10r"    
[49] "pre_stai_11r"     "pre_stai_15r"     "pre_stai_16r"     "pre_stai_19r"     "pre_stai_20r"     "tot_pre_stai"    
# save the cleaned and scored data
saveRDS(pre_fmri_2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/pre_fmri_2.rds")

5.3.2 Post

post_fmri_2 <- post_fmri_1 # post_fmri_2 will contain the scored measures
# Recode the sroe_3 item (rate task difficulty).
# Should be on scale of 1 (easy) to 5 (nearly impossible) 
# No one endorsed "nearly impossible"
post_fmri_2 <-  post_fmri_2 %>% mutate(post_sroe_3 = as.numeric(recode(post_sroe_3, "17" = "1", "19" = "2", "20" = "3", "21" = "4")))
##################  
### Positive and Negative Affect Schedule (PANAS) – State Version
# Citation: Watson, D., Clark, L. A., & Tellegen, A. (1988). Development and validation of brief measures of positive and negative affect: the PANAS scales. Journal of Personality and Social Psychology, 54(6), 1063. 
# Answer choices range from 1 (Very slightly or not at all) – 4 (Extremely).
# No reverse-scored items.
# Positive affect: 1, 3, 5, 9, 10, 12, 14, 16, 17, 19 [tot_post_panas_pa]
# Negative affect: 2, 4, 6, 7, 8, 11, 13, 15, 18, 20 [tot_post_panas_na]
# total score:
tot_post_panas_pa <- subset(post_fmri_2, select=c("post_panas_1","post_panas_3", "post_panas_5", "post_panas_9","post_panas_10","post_panas_12","post_panas_14","post_panas_16","post_panas_17","post_panas_19"))
tot_post_panas_na <- subset(post_fmri_2, select=c("post_panas_2","post_panas_4", "post_panas_6", "post_panas_7","post_panas_8","post_panas_11","post_panas_13","post_panas_15","post_panas_18","post_panas_20"))
post_fmri_2$tot_post_panas_pa <- rowSums(tot_post_panas_pa, na.rm=TRUE) 
describe(post_fmri_2$tot_post_panas_pa)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 81 33.57 7.48     33   33.43 7.41  17  50    33 0.09    -0.62 0.83
post_fmri_2$tot_post_panas_na <- rowSums(tot_post_panas_na, na.rm=TRUE) 
describe(post_fmri_2$tot_post_panas_na)
   vars  n  mean   sd median trimmed mad min max range skew kurtosis   se
X1    1 81 11.33 1.86     10   10.97   0  10  19     9 1.69     3.01 0.21
##################  
### State-Trait Anxiety Inventory (STAI) – State Version
# Citation: Spielberger, C.D. (1983). Manual for the State-Trait Anxiety Inventory (STAI). Palo Alto, CA: Consulting Psychologists Press. 
# Answer choices range from 1 (Not at all) – 4 (Very much so).
# Reverse-scored: 1, 2, 5, 8, 10, 11, 15, 16, 19, 20. 
# Sum total score [tot_post_stai]
post_fmri_2$post_stai_1r <- 5 - post_fmri_2$post_stai_1
post_fmri_2$post_stai_2r <- 5 - post_fmri_2$post_stai_2
post_fmri_2$post_stai_5r <- 5 - post_fmri_2$post_stai_5
post_fmri_2$post_stai_8r <- 5 - post_fmri_2$post_stai_8
post_fmri_2$post_stai_10r <- 5 - post_fmri_2$post_stai_10
post_fmri_2$post_stai_11r <- 5 - post_fmri_2$post_stai_11
post_fmri_2$post_stai_15r <- 5 - post_fmri_2$post_stai_15
post_fmri_2$post_stai_16r <- 5 - post_fmri_2$post_stai_16
post_fmri_2$post_stai_19r <- 5 - post_fmri_2$post_stai_19
post_fmri_2$post_stai_20r <- 5 - post_fmri_2$post_stai_20
# total score:
tot_post_stai <- subset(post_fmri_2, select=c("post_stai_1r","post_stai_2r","post_stai_3","post_stai_4","post_stai_5r","post_stai_6","post_stai_7","post_stai_8r", "post_stai_9","post_stai_10r","post_stai_11r","post_stai_12","post_stai_13","post_stai_14","post_stai_15r","post_stai_16r","post_stai_17","post_stai_18","post_stai_19r","post_stai_20r"))
post_fmri_2$tot_post_stai <- rowSums(tot_post_stai, na.rm=TRUE) 
describe(post_fmri_2$tot_post_stai)
   vars  n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 81 29.99 8.34     28      29 7.41  20  61    41 1.18     1.44 0.93
# check that all "tot_*" variables appear
names(post_fmri_2) 
 [1] "ID"                "post_panas_1"      "post_panas_2"      "post_panas_3"      "post_panas_4"      "post_panas_5"      "post_panas_6"     
 [8] "post_panas_7"      "post_panas_8"      "post_panas_9"      "post_panas_10"     "post_panas_11"     "post_panas_12"     "post_panas_13"    
[15] "post_panas_14"     "post_panas_15"     "post_panas_16"     "post_panas_17"     "post_panas_18"     "post_panas_19"     "post_panas_20"    
[22] "post_stai_1"       "post_stai_2"       "post_stai_3"       "post_stai_4"       "post_stai_5"       "post_stai_6"       "post_stai_7"      
[29] "post_stai_8"       "post_stai_9"       "post_stai_10"      "post_stai_11"      "post_stai_12"      "post_stai_13"      "post_stai_14"     
[36] "post_stai_15"      "post_stai_16"      "post_stai_17"      "post_stai_18"      "post_stai_19"      "post_stai_20"      "post_sroe_1"      
[43] "post_sroe_2"       "post_sroe_3"       "tot_post_panas_pa" "tot_post_panas_na" "post_stai_1r"      "post_stai_2r"      "post_stai_5r"     
[50] "post_stai_8r"      "post_stai_10r"     "post_stai_11r"     "post_stai_15r"     "post_stai_16r"     "post_stai_19r"     "post_stai_20r"    
[57] "tot_post_stai"    
# save the cleaned and scored data
saveRDS(post_fmri_2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/post_fmri_2.rds")

5.4 Reorganize data

5.4.1 By visit

Now we need to create two subsets: one for the first visit, one for the second visit (we’ll put them back together later).

# pre_fmri, first visit:
pre_fmri_v1 <- filter(pre_fmri_2, !grepl("_b",ID)) # i.e., filter if does not contain string "_b"
View(pre_fmri_v1)
# pre_fmri, second visit:
pre_fmri_v2 <- filter(pre_fmri_2, grepl("_b",ID))
View(pre_fmri_v2)
names(pre_fmri_v2)
 [1] "ID"               "pre_panas_1"      "pre_panas_2"      "pre_panas_3"      "pre_panas_4"      "pre_panas_5"      "pre_panas_6"      "pre_panas_7"     
 [9] "pre_panas_8"      "pre_panas_9"      "pre_panas_10"     "pre_panas_11"     "pre_panas_12"     "pre_panas_13"     "pre_panas_14"     "pre_panas_15"    
[17] "pre_panas_16"     "pre_panas_17"     "pre_panas_18"     "pre_panas_19"     "pre_panas_20"     "pre_stai_1"       "pre_stai_2"       "pre_stai_3"      
[25] "pre_stai_4"       "pre_stai_5"       "pre_stai_6"       "pre_stai_7"       "pre_stai_8"       "pre_stai_9"       "pre_stai_10"      "pre_stai_11"     
[33] "pre_stai_12"      "pre_stai_13"      "pre_stai_14"      "pre_stai_15"      "pre_stai_16"      "pre_stai_17"      "pre_stai_18"      "pre_stai_19"     
[41] "pre_stai_20"      "tot_pre_panas_pa" "tot_pre_panas_na" "pre_stai_1r"      "pre_stai_2r"      "pre_stai_5r"      "pre_stai_8r"      "pre_stai_10r"    
[49] "pre_stai_11r"     "pre_stai_15r"     "pre_stai_16r"     "pre_stai_19r"     "pre_stai_20r"     "tot_pre_stai"    
# post_fmri, first visit:
post_fmri_v1 <- filter(post_fmri_2, !grepl("_b",ID))
View(post_fmri_v1)
# post_fmri, second visit:
post_fmri_v2 <- filter(post_fmri_2, grepl("_b",ID))
View(post_fmri_v2)
# Remove "_b" from the second visit datasets so that we can merge _v1 and _v2 back together eventually
pre_fmri_v2 <- pre_fmri_v2 %>% 
  mutate(ID = str_replace(ID, "_b", ""))
post_fmri_v2 <- post_fmri_v2 %>% 
  mutate(ID = str_replace(ID, "_b", ""))
# Add a suffix to the end of variables denoting which visit:
pre_fmri_v1 <- pre_fmri_v1 %>%
  rename_at(vars(-ID),function(x) paste0(x,"_v1"))
pre_fmri_v2 <- pre_fmri_v2 %>%
  rename_at(vars(-ID),function(x) paste0(x,"_v2"))
post_fmri_v1 <- post_fmri_v1 %>%
  rename_at(vars(-ID),function(x) paste0(x,"_v1"))
post_fmri_v2 <- post_fmri_v2 %>%
  rename_at(vars(-ID),function(x) paste0(x,"_v2"))

Then, dealing with D115_b’s post-fMRI data that’s in the pre_fmri dataset…

D115_post_fmri_v2 <- filter(pre_fmri_2, grepl("post",ID)) # i.e., filter if does not contain string "post"
View(D115_post_fmri_v2)
D115_post_fmri_v2 <- D115_post_fmri_v2 %>% mutate(ID = recode(ID, "D115_b_post" = "D115")) # changed D115_b_post to D115
# rename "pre" to "post"
names(D115_post_fmri_v2) <- gsub("pre", "post", names(D115_post_fmri_v2))
names(D115_post_fmri_v2) # it worked!
 [1] "ID"                "post_panas_1"      "post_panas_2"      "post_panas_3"      "post_panas_4"      "post_panas_5"      "post_panas_6"     
 [8] "post_panas_7"      "post_panas_8"      "post_panas_9"      "post_panas_10"     "post_panas_11"     "post_panas_12"     "post_panas_13"    
[15] "post_panas_14"     "post_panas_15"     "post_panas_16"     "post_panas_17"     "post_panas_18"     "post_panas_19"     "post_panas_20"    
[22] "post_stai_1"       "post_stai_2"       "post_stai_3"       "post_stai_4"       "post_stai_5"       "post_stai_6"       "post_stai_7"      
[29] "post_stai_8"       "post_stai_9"       "post_stai_10"      "post_stai_11"      "post_stai_12"      "post_stai_13"      "post_stai_14"     
[36] "post_stai_15"      "post_stai_16"      "post_stai_17"      "post_stai_18"      "post_stai_19"      "post_stai_20"      "tot_post_panas_pa"
[43] "tot_post_panas_na" "post_stai_1r"      "post_stai_2r"      "post_stai_5r"      "post_stai_8r"      "post_stai_10r"     "post_stai_11r"    
[50] "post_stai_15r"     "post_stai_16r"     "post_stai_19r"     "post_stai_20r"     "tot_post_stai"    
# add a suffix to the end of variables denoting second visit:
D115_post_fmri_v2 <- D115_post_fmri_v2 %>%
  rename_at(vars(-ID),function(x) paste0(x,"_v2"))
# attach back to post_fmri_v2
post_fmri_v2 <- bind_rows(D115_post_fmri_v2,post_fmri_v2)
View(post_fmri_v2)
# and finally, drop D115_post from the (incorrect) pre-fmri visit 2 dataset
pre_fmri_v2 <- filter(pre_fmri_v2, !grepl("post",ID))

Merging first and second visits back together…

### PRE
## Put them back together
pre_fmri_3 <- left_join(pre_fmri_v1, pre_fmri_v2, by="ID") # merge pre_v1 and pre_v2 by ID
View(pre_fmri_3)
names(pre_fmri_3)
  [1] "ID"                  "pre_panas_1_v1"      "pre_panas_2_v1"      "pre_panas_3_v1"      "pre_panas_4_v1"      "pre_panas_5_v1"     
  [7] "pre_panas_6_v1"      "pre_panas_7_v1"      "pre_panas_8_v1"      "pre_panas_9_v1"      "pre_panas_10_v1"     "pre_panas_11_v1"    
 [13] "pre_panas_12_v1"     "pre_panas_13_v1"     "pre_panas_14_v1"     "pre_panas_15_v1"     "pre_panas_16_v1"     "pre_panas_17_v1"    
 [19] "pre_panas_18_v1"     "pre_panas_19_v1"     "pre_panas_20_v1"     "pre_stai_1_v1"       "pre_stai_2_v1"       "pre_stai_3_v1"      
 [25] "pre_stai_4_v1"       "pre_stai_5_v1"       "pre_stai_6_v1"       "pre_stai_7_v1"       "pre_stai_8_v1"       "pre_stai_9_v1"      
 [31] "pre_stai_10_v1"      "pre_stai_11_v1"      "pre_stai_12_v1"      "pre_stai_13_v1"      "pre_stai_14_v1"      "pre_stai_15_v1"     
 [37] "pre_stai_16_v1"      "pre_stai_17_v1"      "pre_stai_18_v1"      "pre_stai_19_v1"      "pre_stai_20_v1"      "tot_pre_panas_pa_v1"
 [43] "tot_pre_panas_na_v1" "pre_stai_1r_v1"      "pre_stai_2r_v1"      "pre_stai_5r_v1"      "pre_stai_8r_v1"      "pre_stai_10r_v1"    
 [49] "pre_stai_11r_v1"     "pre_stai_15r_v1"     "pre_stai_16r_v1"     "pre_stai_19r_v1"     "pre_stai_20r_v1"     "tot_pre_stai_v1"    
 [55] "pre_panas_1_v2"      "pre_panas_2_v2"      "pre_panas_3_v2"      "pre_panas_4_v2"      "pre_panas_5_v2"      "pre_panas_6_v2"     
 [61] "pre_panas_7_v2"      "pre_panas_8_v2"      "pre_panas_9_v2"      "pre_panas_10_v2"     "pre_panas_11_v2"     "pre_panas_12_v2"    
 [67] "pre_panas_13_v2"     "pre_panas_14_v2"     "pre_panas_15_v2"     "pre_panas_16_v2"     "pre_panas_17_v2"     "pre_panas_18_v2"    
 [73] "pre_panas_19_v2"     "pre_panas_20_v2"     "pre_stai_1_v2"       "pre_stai_2_v2"       "pre_stai_3_v2"       "pre_stai_4_v2"      
 [79] "pre_stai_5_v2"       "pre_stai_6_v2"       "pre_stai_7_v2"       "pre_stai_8_v2"       "pre_stai_9_v2"       "pre_stai_10_v2"     
 [85] "pre_stai_11_v2"      "pre_stai_12_v2"      "pre_stai_13_v2"      "pre_stai_14_v2"      "pre_stai_15_v2"      "pre_stai_16_v2"     
 [91] "pre_stai_17_v2"      "pre_stai_18_v2"      "pre_stai_19_v2"      "pre_stai_20_v2"      "tot_pre_panas_pa_v2" "tot_pre_panas_na_v2"
 [97] "pre_stai_1r_v2"      "pre_stai_2r_v2"      "pre_stai_5r_v2"      "pre_stai_8r_v2"      "pre_stai_10r_v2"     "pre_stai_11r_v2"    
[103] "pre_stai_15r_v2"     "pre_stai_16r_v2"     "pre_stai_19r_v2"     "pre_stai_20r_v2"     "tot_pre_stai_v2"    
pre_fmri_NA_v2 <- subset(pre_fmri_3, is.na(tot_pre_stai_v2))
pre_fmri_NA_v2$ID
[1] "D108" "D111" "D109" "D124" "D130"
# we are missing pre_fmri_v2 data from D108, D111, D109, and D124. This is correct: all were dropped.
# there's something weird going on with D130. D130 is NOT missing data but for some reason when these data are merged, the _v2 data is dropped. Only way I've found to fix this is to fix it manually and retype "D130" in pre_fmri_v2.
fix(pre_fmri_v2)
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
running command ''/usr/bin/otool' -L '/Library/Frameworks/R.framework/Resources/modules/R_de.so'' had status 1
pre_fmri_3 <- left_join(pre_fmri_v1, pre_fmri_v2, by="ID") # merge pre_v1 and pre_v2 by ID
pre_fmri_NA_v2 <- subset(pre_fmri_3, is.na(tot_pre_stai_v2))
pre_fmri_NA_v2$ID
[1] "D108" "D111" "D109" "D124"
# now only missing D108, D109, D111, D124. 
# save it
saveRDS(pre_fmri_3, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/pre_fmri_3.rds")
### POST
## Put them back together (POST)
post_fmri_3 <- left_join(post_fmri_v1, post_fmri_v2, by="ID") # merge post_v1 and post_v2 by ID
View(post_fmri_3)
names(post_fmri_3)
  [1] "ID"                   "post_panas_1_v1"      "post_panas_2_v1"      "post_panas_3_v1"      "post_panas_4_v1"      "post_panas_5_v1"     
  [7] "post_panas_6_v1"      "post_panas_7_v1"      "post_panas_8_v1"      "post_panas_9_v1"      "post_panas_10_v1"     "post_panas_11_v1"    
 [13] "post_panas_12_v1"     "post_panas_13_v1"     "post_panas_14_v1"     "post_panas_15_v1"     "post_panas_16_v1"     "post_panas_17_v1"    
 [19] "post_panas_18_v1"     "post_panas_19_v1"     "post_panas_20_v1"     "post_stai_1_v1"       "post_stai_2_v1"       "post_stai_3_v1"      
 [25] "post_stai_4_v1"       "post_stai_5_v1"       "post_stai_6_v1"       "post_stai_7_v1"       "post_stai_8_v1"       "post_stai_9_v1"      
 [31] "post_stai_10_v1"      "post_stai_11_v1"      "post_stai_12_v1"      "post_stai_13_v1"      "post_stai_14_v1"      "post_stai_15_v1"     
 [37] "post_stai_16_v1"      "post_stai_17_v1"      "post_stai_18_v1"      "post_stai_19_v1"      "post_stai_20_v1"      "post_sroe_1_v1"      
 [43] "post_sroe_2_v1"       "post_sroe_3_v1"       "tot_post_panas_pa_v1" "tot_post_panas_na_v1" "post_stai_1r_v1"      "post_stai_2r_v1"     
 [49] "post_stai_5r_v1"      "post_stai_8r_v1"      "post_stai_10r_v1"     "post_stai_11r_v1"     "post_stai_15r_v1"     "post_stai_16r_v1"    
 [55] "post_stai_19r_v1"     "post_stai_20r_v1"     "tot_post_stai_v1"     "post_panas_1_v2"      "post_panas_2_v2"      "post_panas_3_v2"     
 [61] "post_panas_4_v2"      "post_panas_5_v2"      "post_panas_6_v2"      "post_panas_7_v2"      "post_panas_8_v2"      "post_panas_9_v2"     
 [67] "post_panas_10_v2"     "post_panas_11_v2"     "post_panas_12_v2"     "post_panas_13_v2"     "post_panas_14_v2"     "post_panas_15_v2"    
 [73] "post_panas_16_v2"     "post_panas_17_v2"     "post_panas_18_v2"     "post_panas_19_v2"     "post_panas_20_v2"     "post_stai_1_v2"      
 [79] "post_stai_2_v2"       "post_stai_3_v2"       "post_stai_4_v2"       "post_stai_5_v2"       "post_stai_6_v2"       "post_stai_7_v2"      
 [85] "post_stai_8_v2"       "post_stai_9_v2"       "post_stai_10_v2"      "post_stai_11_v2"      "post_stai_12_v2"      "post_stai_13_v2"     
 [91] "post_stai_14_v2"      "post_stai_15_v2"      "post_stai_16_v2"      "post_stai_17_v2"      "post_stai_18_v2"      "post_stai_19_v2"     
 [97] "post_stai_20_v2"      "tot_post_panas_pa_v2" "tot_post_panas_na_v2" "post_stai_1r_v2"      "post_stai_2r_v2"      "post_stai_5r_v2"     
[103] "post_stai_8r_v2"      "post_stai_10r_v2"     "post_stai_11r_v2"     "post_stai_15r_v2"     "post_stai_16r_v2"     "post_stai_19r_v2"    
[109] "post_stai_20r_v2"     "tot_post_stai_v2"     "post_sroe_1_v2"       "post_sroe_2_v2"       "post_sroe_3_v2"      
post_fmri_NA_v2 <- subset(post_fmri_3, is.na(tot_post_stai_v2))
post_fmri_NA_v2$ID
[1] "D108" "D111"
# we are missing post_fmri_v2 data from D108 and D111. This is correct: both were dropped.
# save it
saveRDS(post_fmri_3, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/post_fmri_3.rds")

Then merging pre and post together…

pre_post_fmri <- left_join(pre_fmri_3, post_fmri_3, by="ID")
View(pre_post_fmri)
names(pre_post_fmri)
  [1] "ID"                   "pre_panas_1_v1"       "pre_panas_2_v1"       "pre_panas_3_v1"       "pre_panas_4_v1"       "pre_panas_5_v1"      
  [7] "pre_panas_6_v1"       "pre_panas_7_v1"       "pre_panas_8_v1"       "pre_panas_9_v1"       "pre_panas_10_v1"      "pre_panas_11_v1"     
 [13] "pre_panas_12_v1"      "pre_panas_13_v1"      "pre_panas_14_v1"      "pre_panas_15_v1"      "pre_panas_16_v1"      "pre_panas_17_v1"     
 [19] "pre_panas_18_v1"      "pre_panas_19_v1"      "pre_panas_20_v1"      "pre_stai_1_v1"        "pre_stai_2_v1"        "pre_stai_3_v1"       
 [25] "pre_stai_4_v1"        "pre_stai_5_v1"        "pre_stai_6_v1"        "pre_stai_7_v1"        "pre_stai_8_v1"        "pre_stai_9_v1"       
 [31] "pre_stai_10_v1"       "pre_stai_11_v1"       "pre_stai_12_v1"       "pre_stai_13_v1"       "pre_stai_14_v1"       "pre_stai_15_v1"      
 [37] "pre_stai_16_v1"       "pre_stai_17_v1"       "pre_stai_18_v1"       "pre_stai_19_v1"       "pre_stai_20_v1"       "tot_pre_panas_pa_v1" 
 [43] "tot_pre_panas_na_v1"  "pre_stai_1r_v1"       "pre_stai_2r_v1"       "pre_stai_5r_v1"       "pre_stai_8r_v1"       "pre_stai_10r_v1"     
 [49] "pre_stai_11r_v1"      "pre_stai_15r_v1"      "pre_stai_16r_v1"      "pre_stai_19r_v1"      "pre_stai_20r_v1"      "tot_pre_stai_v1"     
 [55] "pre_panas_1_v2"       "pre_panas_2_v2"       "pre_panas_3_v2"       "pre_panas_4_v2"       "pre_panas_5_v2"       "pre_panas_6_v2"      
 [61] "pre_panas_7_v2"       "pre_panas_8_v2"       "pre_panas_9_v2"       "pre_panas_10_v2"      "pre_panas_11_v2"      "pre_panas_12_v2"     
 [67] "pre_panas_13_v2"      "pre_panas_14_v2"      "pre_panas_15_v2"      "pre_panas_16_v2"      "pre_panas_17_v2"      "pre_panas_18_v2"     
 [73] "pre_panas_19_v2"      "pre_panas_20_v2"      "pre_stai_1_v2"        "pre_stai_2_v2"        "pre_stai_3_v2"        "pre_stai_4_v2"       
 [79] "pre_stai_5_v2"        "pre_stai_6_v2"        "pre_stai_7_v2"        "pre_stai_8_v2"        "pre_stai_9_v2"        "pre_stai_10_v2"      
 [85] "pre_stai_11_v2"       "pre_stai_12_v2"       "pre_stai_13_v2"       "pre_stai_14_v2"       "pre_stai_15_v2"       "pre_stai_16_v2"      
 [91] "pre_stai_17_v2"       "pre_stai_18_v2"       "pre_stai_19_v2"       "pre_stai_20_v2"       "tot_pre_panas_pa_v2"  "tot_pre_panas_na_v2" 
 [97] "pre_stai_1r_v2"       "pre_stai_2r_v2"       "pre_stai_5r_v2"       "pre_stai_8r_v2"       "pre_stai_10r_v2"      "pre_stai_11r_v2"     
[103] "pre_stai_15r_v2"      "pre_stai_16r_v2"      "pre_stai_19r_v2"      "pre_stai_20r_v2"      "tot_pre_stai_v2"      "post_panas_1_v1"     
[109] "post_panas_2_v1"      "post_panas_3_v1"      "post_panas_4_v1"      "post_panas_5_v1"      "post_panas_6_v1"      "post_panas_7_v1"     
[115] "post_panas_8_v1"      "post_panas_9_v1"      "post_panas_10_v1"     "post_panas_11_v1"     "post_panas_12_v1"     "post_panas_13_v1"    
[121] "post_panas_14_v1"     "post_panas_15_v1"     "post_panas_16_v1"     "post_panas_17_v1"     "post_panas_18_v1"     "post_panas_19_v1"    
[127] "post_panas_20_v1"     "post_stai_1_v1"       "post_stai_2_v1"       "post_stai_3_v1"       "post_stai_4_v1"       "post_stai_5_v1"      
[133] "post_stai_6_v1"       "post_stai_7_v1"       "post_stai_8_v1"       "post_stai_9_v1"       "post_stai_10_v1"      "post_stai_11_v1"     
[139] "post_stai_12_v1"      "post_stai_13_v1"      "post_stai_14_v1"      "post_stai_15_v1"      "post_stai_16_v1"      "post_stai_17_v1"     
[145] "post_stai_18_v1"      "post_stai_19_v1"      "post_stai_20_v1"      "post_sroe_1_v1"       "post_sroe_2_v1"       "post_sroe_3_v1"      
[151] "tot_post_panas_pa_v1" "tot_post_panas_na_v1" "post_stai_1r_v1"      "post_stai_2r_v1"      "post_stai_5r_v1"      "post_stai_8r_v1"     
[157] "post_stai_10r_v1"     "post_stai_11r_v1"     "post_stai_15r_v1"     "post_stai_16r_v1"     "post_stai_19r_v1"     "post_stai_20r_v1"    
[163] "tot_post_stai_v1"     "post_panas_1_v2"      "post_panas_2_v2"      "post_panas_3_v2"      "post_panas_4_v2"      "post_panas_5_v2"     
[169] "post_panas_6_v2"      "post_panas_7_v2"      "post_panas_8_v2"      "post_panas_9_v2"      "post_panas_10_v2"     "post_panas_11_v2"    
[175] "post_panas_12_v2"     "post_panas_13_v2"     "post_panas_14_v2"     "post_panas_15_v2"     "post_panas_16_v2"     "post_panas_17_v2"    
[181] "post_panas_18_v2"     "post_panas_19_v2"     "post_panas_20_v2"     "post_stai_1_v2"       "post_stai_2_v2"       "post_stai_3_v2"      
[187] "post_stai_4_v2"       "post_stai_5_v2"       "post_stai_6_v2"       "post_stai_7_v2"       "post_stai_8_v2"       "post_stai_9_v2"      
[193] "post_stai_10_v2"      "post_stai_11_v2"      "post_stai_12_v2"      "post_stai_13_v2"      "post_stai_14_v2"      "post_stai_15_v2"     
[199] "post_stai_16_v2"      "post_stai_17_v2"      "post_stai_18_v2"      "post_stai_19_v2"      "post_stai_20_v2"      "tot_post_panas_pa_v2"
[205] "tot_post_panas_na_v2" "post_stai_1r_v2"      "post_stai_2r_v2"      "post_stai_5r_v2"      "post_stai_8r_v2"      "post_stai_10r_v2"    
[211] "post_stai_11r_v2"     "post_stai_15r_v2"     "post_stai_16r_v2"     "post_stai_19r_v2"     "post_stai_20r_v2"     "tot_post_stai_v2"    
[217] "post_sroe_1_v2"       "post_sroe_2_v2"       "post_sroe_3_v2"      
pre_post_fmri <- filter(pre_post_fmri, !grepl("D108|D109|D111|D124",ID)) # remove D108, D109, D111, D124 
# 40 observations of 219 variables
# save it
saveRDS(pre_post_fmri, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/pre-post_fmri.rds")

And finally, merging all self-report measures together (baseline, baseline_post, pre_post_fmri):

baseline_all <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/baseline_with_post-baseline.rds") # 40 observations of 457 variables
selfreports <- left_join(baseline_all, pre_post_fmri, by="ID") # 40 observations of 675 variables
saveRDS(selfreports, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports.rds")
# selfreports <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports.rds")

This yields 40 observations of 675 variables.

5.5 Histograms and boxplots

# Create a subset of only scale total scores (i.e., variables that start with "tot" or the task difficulty rating)
scales_fmri <- pre_post_fmri[, grep('^tot|post_sroe_3', names(pre_post_fmri))]
# Plot the variables:
for(i in 1:length(scales_fmri)) boxplot(scales_fmri[,i], xlab=NULL, main=names(scales_fmri[i]))

for(i in 1:length(scales_fmri)) hist(scales_fmri[,i], xlab=NULL, main=names(scales_fmri[i]))

5.6 Descriptives

# View descriptives for each scale
## stargazer makes nice-looking summary tables (https://cran.r-project.org/web/packages/stargazer/vignettes/stargazer.pdf)
library(stargazer) # install.packages("stargazer") if this is the first time using the package on this machine
stargazer(scales_fmri, type="text")

===============================================
Statistic            N   Mean  St. Dev. Min Max
-----------------------------------------------
tot_pre_panas_pa_v1  40 32.550  6.251   21  48 
tot_pre_panas_na_v1  40 12.925  3.269   10  23 
tot_pre_stai_v1      40 32.700  9.233   20  63 
tot_pre_panas_pa_v2  40 34.600  7.295   14  50 
tot_pre_panas_na_v2  40 12.600  3.650   10  27 
tot_pre_stai_v2      40 31.375  9.665   20  58 
post_sroe_3_v1       40 2.075   0.764    1   3 
tot_post_panas_pa_v1 40 31.900  7.564   17  48 
tot_post_panas_na_v1 40 11.600  2.216   10  19 
tot_post_stai_v1     40 31.450  9.640   20  61 
tot_post_panas_pa_v2 40 35.200  7.240   19  50 
tot_post_panas_na_v2 40 11.000  1.432   10  15 
tot_post_stai_v2     40 28.650  6.716   20  44 
post_sroe_3_v2       39 1.846   0.812    1   4 
-----------------------------------------------

5.7 T-tests: comparing visits

### Pre-fMRI measures
names(scales_fmri) 
 [1] "tot_pre_panas_pa_v1"  "tot_pre_panas_na_v1"  "tot_pre_stai_v1"      "tot_pre_panas_pa_v2"  "tot_pre_panas_na_v2"  "tot_pre_stai_v2"     
 [7] "post_sroe_3_v1"       "tot_post_panas_pa_v1" "tot_post_panas_na_v1" "tot_post_stai_v1"     "tot_post_panas_pa_v2" "tot_post_panas_na_v2"
[13] "tot_post_stai_v2"     "post_sroe_3_v2"      
t.test(scales_fmri$tot_pre_panas_pa_v1, scales_fmri$tot_pre_panas_pa_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # sig diff

    Paired t-test

data:  scales_fmri$tot_pre_panas_pa_v1 and scales_fmri$tot_pre_panas_pa_v2
t = -2.2038, df = 39, p-value = 0.03351
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.9315598 -0.1684402
sample estimates:
mean of the differences 
                  -2.05 
t.test(scales_fmri$tot_pre_panas_na_v1, scales_fmri$tot_pre_panas_na_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns

    Paired t-test

data:  scales_fmri$tot_pre_panas_na_v1 and scales_fmri$tot_pre_panas_na_v2
t = 0.68734, df = 39, p-value = 0.4959
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.6314007  1.2814007
sample estimates:
mean of the differences 
                  0.325 
t.test(scales_fmri$tot_pre_stai_v1, scales_fmri$tot_pre_stai_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns

    Paired t-test

data:  scales_fmri$tot_pre_stai_v1 and scales_fmri$tot_pre_stai_v2
t = 1.3816, df = 39, p-value = 0.175
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.6148097  3.2648097
sample estimates:
mean of the differences 
                  1.325 
### Post-fMRI measures
t.test(scales_fmri$tot_post_panas_pa_v1, scales_fmri$tot_post_panas_pa_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # sig diff

    Paired t-test

data:  scales_fmri$tot_post_panas_pa_v1 and scales_fmri$tot_post_panas_pa_v2
t = -3.8164, df = 39, p-value = 0.0004722
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.049005 -1.550995
sample estimates:
mean of the differences 
                   -3.3 
t.test(scales_fmri$tot_post_panas_na_v1, scales_fmri$tot_post_panas_na_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns

    Paired t-test

data:  scales_fmri$tot_post_panas_na_v1 and scales_fmri$tot_post_panas_na_v2
t = 1.506, df = 39, p-value = 0.1401
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.2058284  1.4058284
sample estimates:
mean of the differences 
                    0.6 
t.test(scales_fmri$tot_post_stai_v1, scales_fmri$tot_post_stai_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # sig diff

    Paired t-test

data:  scales_fmri$tot_post_stai_v1 and scales_fmri$tot_post_stai_v2
t = 2.1441, df = 39, p-value = 0.03831
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1585603 5.4414397
sample estimates:
mean of the differences 
                    2.8 
t.test(scales_fmri$post_sroe_3_v1, scales_fmri$post_sroe_3_v2,
       alternative = "two.sided", paired = TRUE, var.equal = FALSE) # sig diff

    Paired t-test

data:  scales_fmri$post_sroe_3_v1 and scales_fmri$post_sroe_3_v2
t = 2.132, df = 38, p-value = 0.03953
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.0129423 0.4998782
sample estimates:
mean of the differences 
              0.2564103 

From the t-tests, we see that:

  1. Participants reported higher pre-fMRI positive affect at the second visit, compared to the first.
  2. Participants reported higher post-fMRI positive affect at the second visit, compared to the first.
  3. Participants reported lower post-fMRI anxiety at the second visit, compared to the first.
  4. Participants reported that the task was easier at the second visit, compared to the first.
  5. Pre-fMRI anxiety and negative affect were not significantly different between visits.
  6. Post-fMRI negative affect was not significantly different between visits.

5.8 Evaluate missing data

pre_post_fmri %>% 
  select_if(function(x) any(is.na(x))) %>% 
  summarise_all(funs(mean(is.na(.)))) -> pre_post_fmri_NA # use sum() to find n missing values
gather(pre_post_fmri_NA) -> pre_post_fmri_NA_long # create long data that lists variables with any NAs, and % of data missing
pre_post_fmri_NA_long

We have 9 variables missing data, where one response was missed on a number of PANAS items at visit one. One person is also missing SROE data (this is D115, who erroneously was administered the pre-fMRI survey after exiting the scanner.)

5.9 Check scale reliabilities

# The 'alpha' function is helpful because it will alert you if your reverse coding went awry somehow. 
## Note that Emily Butler says it's not always correct - if it flags an issues and you've double- and triple-checked your reverse coding, ignore it.
# Primarily, we use/report the standard alpha.
library(psych)
psych::alpha(tot_pre_panas_na) # because tidyverse is loaded, the alpha function from ggplot2 is masking psych::alpha so we have to specify

Reliability analysis   
Call: psych::alpha(x = tot_pre_panas_na)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.76      0.73    0.81      0.21 2.7 0.034  1.3 0.35     0.12

 lower alpha upper     95% confidence boundaries
0.69 0.76 0.82 

 Reliability if an item is dropped:
             raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
pre_panas_2       0.72      0.69    0.77      0.20 2.2    0.039 0.069 0.094
pre_panas_4       0.74      0.71    0.79      0.21 2.5    0.035 0.080 0.057
pre_panas_6       0.79      0.75    0.82      0.25 3.1    0.029 0.074 0.210
pre_panas_7       0.70      0.67    0.76      0.18 2.0    0.042 0.062 0.063
pre_panas_8       0.76      0.73    0.81      0.24 2.8    0.035 0.078 0.135
pre_panas_11      0.78      0.76    0.83      0.26 3.2    0.031 0.073 0.210
pre_panas_13      0.77      0.75    0.82      0.25 3.0    0.032 0.073 0.193
pre_panas_15      0.67      0.66    0.74      0.17 1.9    0.049 0.057 0.057
pre_panas_18      0.68      0.66    0.73      0.18 1.9    0.046 0.057 0.062
pre_panas_20      0.69      0.65    0.73      0.17 1.8    0.044 0.052 0.063

 Item statistics 
              n raw.r std.r r.cor r.drop mean   sd
pre_panas_2  85  0.64  0.64 0.606  0.527  1.3 0.57
pre_panas_4  85  0.50  0.52 0.442  0.355  1.2 0.61
pre_panas_6  85  0.27  0.25 0.117  0.077  1.4 0.68
pre_panas_7  85  0.75  0.74 0.743  0.651  1.3 0.64
pre_panas_8  85  0.30  0.38 0.260  0.215  1.0 0.30
pre_panas_11 85  0.17  0.21 0.035  0.032  1.1 0.50
pre_panas_13 85  0.20  0.26 0.127  0.078  1.1 0.45
pre_panas_15 85  0.84  0.78 0.819  0.732  1.8 0.92
pre_panas_18 85  0.82  0.78 0.814  0.718  1.5 0.77
pre_panas_20 85  0.83  0.83 0.876  0.773  1.2 0.56

Non missing response frequency for each item
                1    2    3    4    5 miss
pre_panas_2  0.75 0.21 0.02 0.01 0.00    0
pre_panas_4  0.82 0.14 0.02 0.00 0.01    0
pre_panas_6  0.75 0.15 0.08 0.01 0.00    0
pre_panas_7  0.78 0.15 0.06 0.01 0.00    0
pre_panas_8  0.98 0.00 0.02 0.00 0.00    0
pre_panas_11 0.92 0.07 0.00 0.00 0.01    0
pre_panas_13 0.98 0.01 0.00 0.00 0.01    0
pre_panas_15 0.52 0.26 0.19 0.02 0.01    0
pre_panas_18 0.67 0.21 0.09 0.02 0.00    0
pre_panas_20 0.84 0.12 0.04 0.01 0.00    0
psych::alpha(tot_pre_panas_pa)

Reliability analysis   
Call: psych::alpha(x = tot_pre_panas_pa)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.89      0.89     0.9      0.44 7.9 0.018  3.4 0.67     0.45

 lower alpha upper     95% confidence boundaries
0.85 0.89 0.92 

 Reliability if an item is dropped:
             raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
pre_panas_1       0.88      0.88    0.89      0.46 7.7    0.019 0.0088  0.45
pre_panas_3       0.87      0.87    0.89      0.43 6.8    0.021 0.0133  0.44
pre_panas_5       0.87      0.87    0.88      0.43 6.8    0.021 0.0116  0.44
pre_panas_9       0.86      0.87    0.88      0.42 6.6    0.022 0.0109  0.45
pre_panas_10      0.88      0.88    0.89      0.45 7.2    0.020 0.0115  0.45
pre_panas_12      0.88      0.88    0.89      0.45 7.3    0.020 0.0119  0.45
pre_panas_14      0.88      0.88    0.89      0.45 7.5    0.019 0.0108  0.46
pre_panas_16      0.87      0.88    0.89      0.44 7.0    0.020 0.0148  0.46
pre_panas_17      0.87      0.87    0.88      0.43 6.8    0.020 0.0117  0.44
pre_panas_19      0.88      0.88    0.89      0.44 7.2    0.020 0.0139  0.45

 Item statistics 
              n raw.r std.r r.cor r.drop mean   sd
pre_panas_1  85  0.58  0.60  0.55   0.49  4.1 0.78
pre_panas_3  85  0.76  0.76  0.73   0.68  2.6 1.06
pre_panas_5  84  0.75  0.75  0.73   0.68  3.3 0.96
pre_panas_9  85  0.80  0.80  0.79   0.73  3.4 1.04
pre_panas_10 84  0.70  0.67  0.63   0.60  2.8 1.08
pre_panas_12 85  0.65  0.67  0.63   0.57  3.9 0.85
pre_panas_14 84  0.66  0.64  0.59   0.56  2.8 1.07
pre_panas_16 85  0.72  0.71  0.66   0.63  3.5 1.04
pre_panas_17 85  0.73  0.76  0.74   0.67  4.0 0.74
pre_panas_19 84  0.68  0.68  0.63   0.59  3.3 0.94

Non missing response frequency for each item
                1    2    3    4    5 miss
pre_panas_1  0.01 0.02 0.13 0.55 0.28 0.00
pre_panas_3  0.18 0.27 0.36 0.15 0.04 0.00
pre_panas_5  0.05 0.10 0.50 0.24 0.12 0.01
pre_panas_9  0.05 0.11 0.41 0.27 0.16 0.00
pre_panas_10 0.15 0.18 0.42 0.20 0.05 0.01
pre_panas_12 0.02 0.02 0.20 0.54 0.21 0.00
pre_panas_14 0.14 0.23 0.42 0.15 0.06 0.01
pre_panas_16 0.04 0.12 0.32 0.34 0.19 0.00
pre_panas_17 0.00 0.02 0.21 0.53 0.24 0.00
pre_panas_19 0.04 0.14 0.42 0.32 0.08 0.01
psych::alpha(tot_pre_stai)

Reliability analysis   
Call: psych::alpha(x = tot_pre_stai)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.93      0.93    0.96      0.39  13 0.011  1.6 0.47     0.38

 lower alpha upper     95% confidence boundaries
0.91 0.93 0.95 

 Reliability if an item is dropped:
             raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
pre_stai_1r       0.92      0.92    0.96      0.39  12    0.012 0.026  0.38
pre_stai_2r       0.92      0.92    0.96      0.39  12    0.012 0.025  0.38
pre_stai_3        0.92      0.92    0.96      0.39  12    0.011 0.028  0.38
pre_stai_4        0.93      0.93    0.96      0.41  13    0.011 0.025  0.39
pre_stai_5r       0.92      0.92    0.96      0.39  12    0.012 0.027  0.38
pre_stai_6        0.93      0.93    0.96      0.40  13    0.011 0.027  0.38
pre_stai_7        0.93      0.93    0.96      0.40  13    0.011 0.026  0.39
pre_stai_8r       0.92      0.92    0.96      0.39  12    0.012 0.026  0.38
pre_stai_9        0.92      0.92    0.96      0.39  12    0.011 0.028  0.38
pre_stai_10r      0.92      0.92    0.96      0.39  12    0.012 0.027  0.37
pre_stai_11r      0.92      0.92    0.96      0.39  12    0.012 0.026  0.38
pre_stai_12       0.92      0.92    0.95      0.39  12    0.012 0.027  0.37
pre_stai_13       0.93      0.93    0.96      0.40  13    0.011 0.026  0.39
pre_stai_14       0.93      0.93    0.96      0.42  14    0.010 0.023  0.39
pre_stai_15r      0.92      0.92    0.95      0.38  12    0.012 0.025  0.38
pre_stai_16r      0.92      0.92    0.95      0.38  12    0.012 0.025  0.37
pre_stai_17       0.93      0.93    0.96      0.40  12    0.011 0.028  0.39
pre_stai_18       0.93      0.93    0.96      0.40  13    0.011 0.027  0.39
pre_stai_19r      0.92      0.92    0.96      0.39  12    0.012 0.026  0.38
pre_stai_20r      0.92      0.92    0.96      0.39  12    0.012 0.026  0.38

 Item statistics 
              n raw.r std.r r.cor r.drop mean   sd
pre_stai_1r  85  0.70  0.69  0.68   0.65  1.9 0.77
pre_stai_2r  85  0.74  0.72  0.72   0.71  1.6 0.64
pre_stai_3   85  0.69  0.71  0.70   0.65  1.6 0.63
pre_stai_4   85  0.43  0.45  0.41   0.38  1.2 0.57
pre_stai_5r  85  0.68  0.67  0.65   0.63  1.9 0.83
pre_stai_6   85  0.58  0.60  0.58   0.55  1.2 0.44
pre_stai_7   85  0.51  0.52  0.50   0.44  1.5 0.88
pre_stai_8r  85  0.71  0.70  0.68   0.67  2.1 0.83
pre_stai_9   85  0.67  0.69  0.69   0.63  1.2 0.55
pre_stai_10r 85  0.76  0.76  0.74   0.72  1.8 0.81
pre_stai_11r 85  0.72  0.71  0.69   0.68  1.7 0.76
pre_stai_12  85  0.71  0.73  0.73   0.67  1.5 0.70
pre_stai_13  85  0.55  0.57  0.56   0.51  1.2 0.48
pre_stai_14  85  0.37  0.37  0.33   0.29  1.4 0.76
pre_stai_15r 85  0.82  0.80  0.80   0.78  2.0 0.91
pre_stai_16r 85  0.83  0.81  0.81   0.79  2.1 0.90
pre_stai_17  85  0.61  0.62  0.61   0.56  1.4 0.70
pre_stai_18  85  0.54  0.55  0.53   0.49  1.2 0.56
pre_stai_19r 85  0.72  0.70  0.69   0.68  1.9 0.74
pre_stai_20r 85  0.68  0.67  0.66   0.64  1.8 0.76

Non missing response frequency for each item
                1    2    3    4 miss
pre_stai_1r  0.35 0.44 0.20 0.01    0
pre_stai_2r  0.51 0.41 0.08 0.00    0
pre_stai_3   0.49 0.46 0.04 0.01    0
pre_stai_4   0.82 0.13 0.04 0.01    0
pre_stai_5r  0.34 0.46 0.15 0.05    0
pre_stai_6   0.85 0.13 0.02 0.00    0
pre_stai_7   0.71 0.20 0.01 0.08    0
pre_stai_8r  0.22 0.48 0.24 0.06    0
pre_stai_9   0.86 0.09 0.04 0.01    0
pre_stai_10r 0.36 0.49 0.08 0.06    0
pre_stai_11r 0.44 0.40 0.15 0.01    0
pre_stai_12  0.61 0.32 0.05 0.02    0
pre_stai_13  0.79 0.19 0.02 0.00    0
pre_stai_14  0.72 0.19 0.06 0.04    0
pre_stai_15r 0.33 0.36 0.25 0.06    0
pre_stai_16r 0.26 0.44 0.22 0.08    0
pre_stai_17  0.68 0.22 0.08 0.01    0
pre_stai_18  0.89 0.05 0.05 0.01    0
pre_stai_19r 0.32 0.48 0.19 0.01    0
pre_stai_20r 0.39 0.46 0.13 0.02    0
psych::alpha(tot_post_panas_na)
Some items were negatively correlated with the total scale and probably 
should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' option
Some items ( post_panas_13 ) were negatively correlated with the total scale and 
probably should be reversed.  
To do this, run the function again with the 'check.keys=TRUE' option
Reliability analysis   
Call: psych::alpha(x = tot_post_panas_na)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.56      0.56    0.66      0.11 1.3 0.068  1.1 0.19    0.077

 lower alpha upper     95% confidence boundaries
0.43 0.56 0.7 

 Reliability if an item is dropped:
              raw_alpha std.alpha G6(smc) average_r  S/N alpha se var.r med.r
post_panas_2       0.46      0.44    0.52     0.082 0.80    0.085 0.023 0.039
post_panas_4       0.52      0.53    0.60     0.111 1.13    0.076 0.027 0.078
post_panas_6       0.61      0.59    0.67     0.136 1.42    0.059 0.031 0.123
post_panas_7       0.54      0.54    0.63     0.114 1.16    0.073 0.030 0.078
post_panas_8       0.56      0.56    0.64     0.125 1.28    0.070 0.028 0.092
post_panas_11      0.52      0.51    0.60     0.103 1.04    0.076 0.028 0.060
post_panas_13      0.61      0.62    0.70     0.152 1.61    0.062 0.027 0.135
post_panas_15      0.52      0.52    0.60     0.107 1.07    0.075 0.027 0.062
post_panas_18      0.47      0.50    0.57     0.098 0.98    0.084 0.023 0.059
post_panas_20      0.53      0.52    0.63     0.109 1.10    0.073 0.032 0.045

 Item statistics 
               n raw.r std.r  r.cor r.drop mean   sd
post_panas_2  81 0.674  0.71  0.750  0.493  1.2 0.48
post_panas_4  81 0.535  0.47  0.421  0.319  1.1 0.47
post_panas_6  81 0.298  0.27  0.085  0.025  1.2 0.51
post_panas_7  81 0.397  0.45  0.349  0.279  1.1 0.24
post_panas_8  81 0.221  0.36  0.260  0.164  1.0 0.11
post_panas_11 81 0.525  0.53  0.472  0.328  1.1 0.43
post_panas_13 81 0.097  0.14 -0.090 -0.088  1.1 0.35
post_panas_15 81 0.558  0.51  0.458  0.316  1.3 0.52
post_panas_18 81 0.652  0.57  0.561  0.443  1.2 0.52
post_panas_20 81 0.448  0.49  0.375  0.312  1.1 0.29

Non missing response frequency for each item
                 1    2    3    4 miss
post_panas_2  0.85 0.11 0.04 0.00    0
post_panas_4  0.91 0.04 0.05 0.00    0
post_panas_6  0.85 0.10 0.05 0.00    0
post_panas_7  0.94 0.06 0.00 0.00    0
post_panas_8  0.99 0.01 0.00 0.00    0
post_panas_11 0.91 0.05 0.04 0.00    0
post_panas_13 0.95 0.02 0.02 0.00    0
post_panas_15 0.77 0.20 0.04 0.00    0
post_panas_18 0.83 0.15 0.01 0.01    0
post_panas_20 0.95 0.04 0.01 0.00    0
psych::alpha(tot_post_panas_pa)

Reliability analysis   
Call: psych::alpha(x = tot_post_panas_pa)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
       0.9       0.9    0.92      0.49 9.4 0.016  3.4 0.74     0.49

 lower alpha upper     95% confidence boundaries
0.87 0.9 0.93 

 Reliability if an item is dropped:
              raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
post_panas_1       0.90      0.90    0.90      0.50 8.8    0.017 0.0099  0.50
post_panas_3       0.90      0.90    0.90      0.49 8.6    0.017 0.0099  0.50
post_panas_5       0.90      0.90    0.91      0.49 8.7    0.017 0.0095  0.50
post_panas_9       0.89      0.89    0.90      0.47 7.8    0.018 0.0106  0.47
post_panas_10      0.89      0.90    0.91      0.49 8.5    0.017 0.0109  0.51
post_panas_12      0.90      0.89    0.90      0.49 8.5    0.017 0.0113  0.49
post_panas_14      0.89      0.89    0.90      0.47 8.0    0.018 0.0093  0.48
post_panas_16      0.89      0.89    0.91      0.48 8.5    0.017 0.0114  0.50
post_panas_17      0.90      0.90    0.91      0.51 9.3    0.016 0.0076  0.51
post_panas_19      0.89      0.89    0.90      0.48 8.2    0.018 0.0117  0.48

 Item statistics 
               n raw.r std.r r.cor r.drop mean   sd
post_panas_1  81  0.67  0.68  0.65   0.60  4.0 0.86
post_panas_3  81  0.73  0.72  0.69   0.65  2.5 1.19
post_panas_5  80  0.71  0.70  0.67   0.63  3.4 1.06
post_panas_9  81  0.83  0.83  0.82   0.78  3.4 1.04
post_panas_10 80  0.73  0.73  0.69   0.66  3.3 1.06
post_panas_12 81  0.72  0.73  0.70   0.65  3.7 0.92
post_panas_14 81  0.82  0.80  0.79   0.76  3.0 1.16
post_panas_16 81  0.73  0.74  0.70   0.67  3.5 0.95
post_panas_17 81  0.59  0.61  0.56   0.51  3.7 0.83
post_panas_19 81  0.77  0.77  0.74   0.70  3.1 0.96

Non missing response frequency for each item
                 1    2    3    4    5 miss
post_panas_1  0.00 0.04 0.26 0.38 0.32 0.00
post_panas_3  0.27 0.20 0.32 0.16 0.05 0.00
post_panas_5  0.08 0.10 0.30 0.41 0.11 0.01
post_panas_9  0.01 0.23 0.27 0.33 0.15 0.00
post_panas_10 0.08 0.14 0.34 0.35 0.10 0.01
post_panas_12 0.02 0.04 0.33 0.40 0.21 0.00
post_panas_14 0.15 0.14 0.37 0.26 0.09 0.00
post_panas_16 0.02 0.07 0.41 0.32 0.17 0.00
post_panas_17 0.00 0.06 0.35 0.42 0.17 0.00
post_panas_19 0.09 0.05 0.58 0.20 0.09 0.00
psych::alpha(tot_post_stai)

Reliability analysis   
Call: psych::alpha(x = tot_post_stai)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.92      0.93    0.96      0.38  12 0.011  1.5 0.42     0.37

 lower alpha upper     95% confidence boundaries
0.9 0.92 0.95 

 Reliability if an item is dropped:
              raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
post_stai_1r       0.92      0.92    0.95      0.38  11    0.012 0.039  0.35
post_stai_2r       0.92      0.92    0.95      0.38  11    0.012 0.038  0.35
post_stai_3        0.92      0.92    0.95      0.38  12    0.011 0.040  0.36
post_stai_4        0.93      0.93    0.96      0.41  13    0.010 0.036  0.39
post_stai_5r       0.92      0.92    0.95      0.38  11    0.012 0.039  0.35
post_stai_6        0.92      0.92    0.95      0.39  12    0.011 0.040  0.38
post_stai_7        0.93      0.93    0.95      0.40  13    0.010 0.038  0.39
post_stai_8r       0.92      0.92    0.95      0.38  11    0.012 0.038  0.36
post_stai_9        0.92      0.92    0.95      0.38  12    0.011 0.041  0.36
post_stai_10r      0.92      0.92    0.95      0.37  11    0.012 0.038  0.35
post_stai_11r      0.92      0.92    0.95      0.37  11    0.012 0.037  0.35
post_stai_12       0.92      0.92    0.95      0.38  12    0.011 0.041  0.36
post_stai_13       0.92      0.92    0.95      0.38  12    0.011 0.040  0.35
post_stai_14       0.93      0.93    0.96      0.40  13    0.010 0.038  0.40
post_stai_15r      0.92      0.92    0.95      0.37  11    0.012 0.037  0.35
post_stai_16r      0.92      0.92    0.95      0.37  11    0.012 0.037  0.36
post_stai_17       0.92      0.93    0.95      0.40  12    0.011 0.039  0.39
post_stai_18       0.93      0.93    0.96      0.41  13    0.011 0.036  0.40
post_stai_19r      0.92      0.92    0.95      0.38  11    0.012 0.038  0.36
post_stai_20r      0.92      0.92    0.95      0.38  12    0.012 0.037  0.37

 Item statistics 
               n raw.r std.r r.cor r.drop mean   sd
post_stai_1r  81  0.78  0.76  0.75   0.74  1.8 0.78
post_stai_2r  81  0.79  0.77  0.76   0.75  1.5 0.69
post_stai_3   81  0.64  0.69  0.68   0.60  1.3 0.52
post_stai_4   81  0.35  0.36  0.32   0.27  1.4 0.71
post_stai_5r  81  0.77  0.75  0.74   0.72  1.7 0.82
post_stai_6   81  0.53  0.57  0.56   0.50  1.1 0.29
post_stai_7   81  0.42  0.44  0.42   0.35  1.3 0.69
post_stai_8r  81  0.77  0.75  0.74   0.72  1.9 0.75
post_stai_9   81  0.63  0.69  0.68   0.60  1.1 0.28
post_stai_10r 81  0.79  0.77  0.77   0.76  1.8 0.74
post_stai_11r 81  0.81  0.78  0.78   0.77  1.8 0.72
post_stai_12  81  0.64  0.69  0.68   0.61  1.2 0.48
post_stai_13  81  0.64  0.69  0.69   0.61  1.2 0.40
post_stai_14  81  0.35  0.37  0.32   0.28  1.3 0.63
post_stai_15r 81  0.85  0.81  0.82   0.81  1.8 0.81
post_stai_16r 81  0.82  0.78  0.78   0.79  1.9 0.84
post_stai_17  81  0.47  0.48  0.46   0.41  1.3 0.52
post_stai_18  81  0.28  0.31  0.26   0.23  1.1 0.43
post_stai_19r 81  0.78  0.75  0.74   0.74  1.9 0.74
post_stai_20r 81  0.72  0.68  0.67   0.68  1.7 0.72

Non missing response frequency for each item
                 1    2    3    4 miss
post_stai_1r  0.43 0.38 0.17 0.01    0
post_stai_2r  0.58 0.31 0.11 0.00    0
post_stai_3   0.77 0.20 0.04 0.00    0
post_stai_4   0.75 0.16 0.06 0.02    0
post_stai_5r  0.46 0.38 0.12 0.04    0
post_stai_6   0.95 0.04 0.01 0.00    0
post_stai_7   0.75 0.17 0.05 0.02    0
post_stai_8r  0.28 0.52 0.17 0.02    0
post_stai_9   0.91 0.09 0.00 0.00    0
post_stai_10r 0.40 0.44 0.15 0.01    0
post_stai_11r 0.40 0.47 0.12 0.01    0
post_stai_12  0.79 0.19 0.02 0.00    0
post_stai_13  0.85 0.14 0.01 0.00    0
post_stai_14  0.73 0.23 0.01 0.02    0
post_stai_15r 0.41 0.40 0.17 0.02    0
post_stai_16r 0.37 0.41 0.19 0.04    0
post_stai_17  0.77 0.20 0.04 0.00    0
post_stai_18  0.90 0.09 0.00 0.01    0
post_stai_19r 0.33 0.48 0.17 0.01    0
post_stai_20r 0.47 0.41 0.11 0.01    0

6 OXTR genotype

This section of the script deals with the genotype data that was collected via buccal cell swab at the end of participants’ second experimental session.

What has been done up to this point: (1) codebook created, (2) data provided by MFO as Excel file.

6.1 Import data

Task: Import only rows 2:42 of the first 4 columns.

# run install.packages("tidyverse") if this is the first time using dplyr on your local machine
library(tidyverse)
filter <- dplyr::filter
select <- dplyr::select
library(readxl)
SNPs <- read_excel("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OConnor_SNP_results.xlsx", sheet = "012518_OXTR_SNPs")[c(2:41), c(1:4) ] # remember that R uses the first row as column names, so what we are calling "row 2" here is equivalent to row 3 in the excel file
View(SNPs)
write.csv(SNPs, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/oxtr_SNPs.csv") # 40 observations of 4 variables
# SNPs <- read.csv(file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/oxtr_SNPs.csv") # 40 observations of 4 variables
# SNPs$X <- NULL

6.2 Rename variables

names(SNPs)
[1] "Sample ID"      "OXTR_rs2254298" "OXTR_rs2268498" "OXTR_rs53576"  
SNPs <- rename(SNPs, ID = "Sample ID",
               rs2254298 = OXTR_rs2254298,
               rs2268498 = OXTR_rs2268498,
               rs53576 = OXTR_rs53576)
names(SNPs)
[1] "ID"        "rs2254298" "rs2268498" "rs53576"  

6.3 Create factors and new variables

For each of the SNPs, we need to create factors for each of the three genotypes (below). We also need to create factors that indicate presence of minor alleles (A allele for rs2254298 and rs53576; C allele for rs2268498).

rs2254298 rs2268498 rs53576
AA CC AA
AG TT GG
A/G C/T A/G
  • rs2254298 only has three levels (A/G, GG, UnD) because no one has the AA genotype (but we’ll replace UnD with NA instead).
  • rs53576 only has two levels (A/G, GG) because no one has the AA genotype.
  • OXTR53576 and OXTR2254298 are the same as rs53576 and rs2254298, but variable names and values have been changed to match the SPSS dataset with genotype data from the GOA sample in order to make any future merging easier.
  • SNPs_1 <- SNPs %>% mutate(rs2254298 = recode_factor(rs2254298, "GG" = "GG", "A/G" = "A/G", "UnD" = NA_character_, .ordered = FALSE),
                            rs2254298_A.carrier = recode_factor(rs2254298, "GG" = 0, "A/G" = 1, .ordered = TRUE),
                            rs2268498_C.carrier = recode_factor(rs2268498, "TT" = 0, "C/T" = 1, "CC" = 1, .ordered = TRUE),
                            rs53576_A.carrier = recode_factor(rs53576, "GG" = 0, "A/G" = 1, .ordered = TRUE),
                            OXTR2254298 = as.numeric(recode(rs2254298, "GG" = 0, "A/G" = 1, "AA" = 2)),
                            OXTR53576 = as.numeric(recode(rs53576, "GG" = 0, "A/G" = 1, "AA" = 2)))
    str(SNPs_1)
    Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   40 obs. of  9 variables:
     $ ID                 : chr  "D101" "D102" "D103" "D104" ...
     $ rs2254298          : Factor w/ 2 levels "GG","A/G": 1 1 1 1 1 1 2 1 2 1 ...
     $ rs2268498          : chr  "C/T" "C/T" "TT" "CC" ...
     $ rs53576            : chr  "A/G" "A/G" "GG" "A/G" ...
     $ rs2254298_A.carrier: Ord.factor w/ 2 levels "0"<"1": 1 1 1 1 1 1 2 1 2 1 ...
     $ rs2268498_C.carrier: Ord.factor w/ 2 levels "0"<"1": 2 2 1 2 2 1 2 2 2 1 ...
     $ rs53576_A.carrier  : Ord.factor w/ 2 levels "0"<"1": 2 2 1 2 1 1 1 2 2 1 ...
     $ OXTR2254298        : num  0 0 0 0 0 0 1 0 1 0 ...
     $ OXTR53576          : num  1 1 0 1 0 0 0 1 1 0 ...
    View(SNPs_1)
    # make ID chr rather than factor
    SNPs_1$ID <- as.character(SNPs$ID)
    saveRDS(SNPs_1, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/oxtr_SNPs.rds")

    6.4 Merge with self-reports

    selfreports_oxtr <- left_join(selfreports, SNPs_1, by="ID")
    # save it
    saveRDS(selfreports_oxtr, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr.rds")

    7 Cortisol

    This section of the script deals with the cortisol data that were collected via salivette 3x during each experimental session: | “baseline” | “pre” | “post” | |:-:|:-:|:-:| |Upon arrival|Just before entering MRI| Just after exiting MRI|

    What has been done up to this point: (1) codebook created, (2) data provided by MFO as Excel file.

    7.1 Import data

    Task: Import only rows 2:42 of the first 4 columns.

    # run install.packages("tidyverse") if this is the first time using dplyr on your local machine
    library(tidyverse)
    filter <- dplyr::filter
    select <- dplyr::select
    library(readxl)
    cortisol <- read_excel("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT cortisol output 18.12.17.xlsx", sheet = "Study 1 OT", skip=6)[c(1:251), c(1:2) ] # remember that R uses the first row as column names, so what we are calling "row 2" here is equivalent to row 3 in the excel file
    View(cortisol)
    names(cortisol)
    [1] "Sample #"        "Cortisol nmol/l"
    cortisol_0 <- rename(cortisol, sample = "Sample #",
                   cortisol = "Cortisol nmol/l")
    names(cortisol_0)
    [1] "sample"   "cortisol"
    write.csv(cortisol_0, file = "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/cortisol_0.csv") # 251 observations of 2 variables
    saveRDS(cortisol_0, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/cortisol_0.rds")

    7.2 Replace values

    According to the box map…

    cortisol_1 <- cortisol_0 %>% mutate(ID = as.character(recode(sample, "1" = "D101_PO2", 
                       "2" = "D101_PR2", 
                       "3" = "D101_BL2",
                       "4" = "D101_PO1",
                       "5" = "D101_PR1",
                       "6" = "D101_BL1",
                       "7" = "D102_PO2",
                       "8" = "D102_PR2",
                       "9" = "D102_BL2",
                       "10" = "D102_PO1",
                       "11" = "D102_PR1",
                       "12" = "D102_BL1",
                       "13" = "D103_PO2",
                       "14" = "D103_PR2",
                       "15" = "D103_BL2",
                       "16" = "D103_PO1",
                       "17" = "D103_PR1",
                       "18" = "D103_BL1",
                       "19" = "D104_PO2",
                       "20" = "D104_PR2",
                       "21" = "D104_BL2",
                       "22" = "D104_PO1",
                       "23" = "D104_PR1",
                       "24" = "D104_BL1",
                       "25" = "D105_PO2",
                       "26" = "D105_PR2",
                       "27" = "D105_BL2",
                       "28" = "D105_PO1",
                       "29" = "D105_PR1",
                       "30" = "D105_BL1",
                       "31" = "D107_PO2",
                       "32" = "D107_PR2",
                       "33" = "D107_BL2",
                       "34" = "D107_PO1",
                       "35" = "D107_PR1",
                       "36" = "D107_BL1",
                       "37" = "D108_PO1",
                       "38" = "D108_PR1",
                       "39" = "D108_BL1",
                       "40" = "D110_PO2",
                       "41" = "D110_PR2",
                       "42" = "D110_BL2",
                       "43" = "D110_PO1",
                       "44" = "D110_PR1",
                       "45" = "D110_BL1",
                       "46" = "D111_PO1",
                       "47" = "D111_PR1",
                       "48" = "D111_BL1",
                       "49" = "D113_PO2",
                       "50" = "D113_PR2",
                       "51" = "D113_BL2",
                       "52" = "D113_PO1",
                       "53" = "D113_PR1",
                       "54" = "D113_BL1",
                       "55" = "D114_PO2",
                       "56" = "D114_PR2",
                       "57" = "D114_BL2",
                       "58" = "D114_PO1",
                       "59" = "D114_PR1",
                       "60" = "D114_BL1",
                       "61" = "D115_PO2",
                       "62" = "D115_PR2",
                       "63" = "D115_BL2",
                       "64" = "D115_PO1",
                       "65" = "D115_PR1",
                       "66" = "D115_BL1",
                       "67" = "D117_PO3",
                       "68" = "D117_PR3",
                       "69" = "D117_BL3",
                       "70" = "D117_PO2",
                       "71" = "D117_PR2",
                       "72" = "D117_BL2",
                       "73" = "D117_PO1",
                       "74" = "D117_PR1",
                       "75" = "D117_BL1",
                       "76" = "D118_PO2",
                       "77" = "D118_PR2",
                       "78" = "D118_BL2",
                       "79" = "D118_PO1",
                       "80" = "D118_PR1",
                       "81" = "D118_BL1",
                       "82" = "D119_PO2",
                       "83" = "D119_PR2",
                       "84" = "D119_BL2",
                       "85" = "D119_PO1",
                       "86" = "D119_PR1",
                       "87" = "D119_BL1",
                       "88" = "D120_PO2",
                       "89" = "D120_PR2",
                       "90" = "D120_BL2",
                       "91" = "D120_PO1",
                       "92" = "D120_PR1",
                       "93" = "D120_BL1",
                       "94" = "D121_PO2",
                       "95" = "D121_PR2",
                       "96" = "D121_BL2",
                       "97" = "D121_PO1",
                       "98" = "D121_PR1",
                       "99" = "D121_BL1",
                       "100" = "D122_PO2",
                       "101" = "D122_PR2", 
                       "102" = "D122_BL2", 
                       "103" = "D122_PO1",
                       "104" = "D122_PR1",
                       "105" = "D122_BL1",
                       "106" = "D123_PO2",
                       "107" = "D123_PR2",
                       "108" = "D123_BL2",
                       "109" = "D123_PO1",
                       "110" = "D123_PR1",
                       "111" = "D123_BL1",
                       "112" = "D125_PO2",
                       "113" = "D125_PR2",
                       "114" = "D125_BL2",
                       "115" = "D125_PO1",
                       "116" = "D125_PR1",
                       "117" = "D125_BL1",
                       "118" = "D126_PO2",
                       "119" = "D126_PR2",
                       "120" = "D126_BL2",
                       "121" = "D126_PO1",
                       "122" = "D126_PR1",
                       "123" = "D126_BL1",
                       "124" = "D127_PO2",
                       "125" = "D127_PR2",
                       "126" = "D127_BL2",
                       "127" = "D127_PO1",
                       "128" = "D127_PR1",
                       "129" = "D127_BL1",
                       "130" = "D128_PO2",
                       "131" = "D128_PR2",
                       "132" = "D128_BL2",
                       "133" = "D128_PO1",
                       "134" = "D128_PR1",
                       "135" = "D128_BL1",
                       "136" = "D129_PO2",
                       "137" = "D129_PR2",
                       "138" = "D129_BL2",
                       "139" = "D129_PO1",
                       "140" = "D129_PR1",
                       "141" = "D129_BL1",
                       "142" = "D130_PO2",
                       "143" = "D130_PR2",
                       "144" = "D130_BL2",
                       "145" = "D130_PO1",
                       "146" = "D130_PR1",
                       "147" = "D130_BL1",
                       "148" = "D131_PO2",
                       "149" = "D131_PR2",
                       "150" = "D131_BL2",
                       "151" = "D131_PO1",
                       "152" = "D131_PR1",
                       "153" = "D131_BL1",
                       "154" = "D132_PO2",
                       "155" = "D132_PR2",
                       "156" = "D132_BL2",
                       "157" = "D132_PO1",
                       "158" = "D132_PR1",
                       "159" = "D132_BL1",
                       "160" = "D133_PO2",
                       "161" = "D133_PR2",
                       "162" = "D133_BL2",
                       "163" = "D133_PO1",
                       "164" = "D133_PR1",
                       "165" = "D133_BL1",
                       "166" = "D134_PO2",
                       "167" = "D134_PR2",
                       "168" = "D134_BL2",
                       "169" = "D134_P01",
                       "170" = "D134_PR1",
                       "171" = "D134_BL1",
                       "172" = "D135_PO2",
                       "173" = "D135_PR2",
                       "174" = "D135_BL2",
                       "175" = "D135_PO1",
                       "176" = "D135_PR1",
                       "177" = "D135_BL1",
                       "178" = "D137_PO2",
                       "179" = "D137_PR2",
                       "180" = "D137_BL2",
                       "181" = "D137_PO1",
                       "182" = "D137_PR1",
                       "183" = "D137_BL1",
                       "184" = "D138_PO2",
                       "185" = "D138_PR2",
                       "186" = "D138_BL2",
                       "187" = "D138_PO1",
                       "188" = "D138_PR1",
                       "189" = "D138_BL1",
                       "190" = "D139_PO2",
                       "191" = "D139_PR2",
                       "192" = "D139_BL2",
                       "193" = "D139_PO1",
                       "194" = "D139_PR1",
                       "195" = "D139_BL1",
                       "196" = "D140_PO2",
                       "197" = "D140_PR2",
                       "198" = "D140_BL2",
                       "199" = "D140_PO1",
                       "200" = "D140_PR1",
                       "201" = "D140_BL1", 
                       "202" = "D141_P02", 
                       "203" = "D141_PR2",
                       "204" = "D141_BL2",
                       "205" = "D141_PO1",
                       "206" = "D141_PR1",
                       "207" = "D141_BL1",
                       "208" = "D142_PO2",
                       "209" = "D142_PR2",
                       "210" = "D142_BL2",
                       "211" = "D142_PO1",
                       "212" = "D142_PR1",
                       "213" = "D142_BL1",
                       "214" = "D143_PO1",
                       "215" = "D143_PR1",
                       "216" = "D143_BL1",
                       "217" = "D144_PO2",
                       "218" = "D144_BL2",
                       "219" = "D144_PO1",
                       "220" = "D144_PR1",
                       "221" = "D144_BL1",
                       "222" = "D145_PO2",
                       "223" = "D145_PR2",
                       "224" = "D145_BL2",
                       "225" = "D145_PO1",
                       "226" = "D145_PR1",
                       "227" = "D145_BL1",
                       "228" = "D146_PO2",
                       "229" = "D146_PR2",
                       "230" = "D146_BL2",
                       "231" = "D146_PO1",
                       "232" = "D146_PR1",
                       "233" = "D146_BL1",
                       "234" = "D147_PO2",
                       "235" = "D147_PR2",
                       "236" = "D147_BL2",
                       "237" = "D147_PO1",
                       "238" = "D147_PR1",
                       "239" = "D147_BL1",
                       "240" = "D148_PO2",
                       "241" = "D148_PR2",
                       "242" = "D148_BL2",
                       "243" = "D148_PO1",
                       "244" = "D148_PR1",
                       "245" = "D148_BL1",
                       "246" = "D149_PO2",
                       "247" = "D149_PR2",
                       "248" = "D149_BL2",
                       "249" = "D149_PO1",
                       "250" = "D149_PR1",
                       "251" = "D149_BL1")))
                                      
    View(cortisol_1)
    # make ID chr rather than factor
    cortisol_1$ID <- as.character(cortisol_1$ID)
    saveRDS(cortisol_1, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/cortisol_1.rds")

    7.3 Reorganize data

    Now we need to create six subsets (3 samples x 2 visits):

    # Use D117's second and third visits, and drop 1st visit (fMRI data lost):
    cortisol_2 <- cortisol_1 %>% mutate(ID = as.character(recode(ID, "D117_BL1" = NA_character_, 
                                                                      "D117_PR1" = NA_character_,
                                                                      "D117_PO1" = NA_character_,
                                                                      "D117_BL2" = "D117_BL1", 
                                                                      "D117_PR2" = "D117_PR1",
                                                                      "D117_PO2" = "D117_PO1",
                                                                      "D117_BL3" = "D117_BL2", 
                                                                      "D117_PR3" = "D117_PR2",
                                                                      "D117_PO3" = "D117_PO2"
                                                                 )))
    # baseline sample, first visit:
    BL_v1 <- filter(cortisol_2[ , 2:3], grepl("BL1",ID)) # dropping 'sample' column
    View(BL_v1)
    # baseline sample, second visit:
    BL_v2 <- filter(cortisol_2[ , 2:3], grepl("BL2",ID)) 
    View(BL_v2)
    # pre-fMRI sample, first visit:
    PR_v1 <- filter(cortisol_2[ , 2:3], grepl("PR1",ID)) 
    View(PR_v1)
    # pre-fMRI sample, second visit:
    PR_v2 <- filter(cortisol_2[ , 2:3], grepl("PR2",ID)) 
    View(PR_v2)
    # post-fMRI sample, first visit:
    PO_v1 <- filter(cortisol_2[ , 2:3], grepl("PO1",ID)) 
    View(PO_v1)
    # post-fMRI sample, second visit:
    PO_v2 <- filter(cortisol_2[ , 2:3], grepl("PO2",ID)) 
    View(PO_v2)

    Now, adding a suffix to the end of ‘cortisol’ (will go into wide format dataset):

    BL_v1 <- BL_v1 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_BL_v1"))
    BL_v2 <- BL_v2 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_BL_v2"))
    PR_v1 <- PR_v1 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_PR_v1"))
    PR_v2 <- PR_v2 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_PR_v2"))
    PO_v1 <- PO_v1 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_PO_v1"))
    PO_v2 <- PO_v2 %>%
      rename_at(vars(cortisol),function(x) paste0(x,"_PO_v2"))
    # Remove "_XXn" from ID  (will go into wide format dataset):
    BL_v1 <- BL_v1 %>% 
      mutate(ID = str_replace(ID, "_BL1", ""))
    BL_v2 <- BL_v2 %>% 
      mutate(ID = str_replace(ID, "_BL2", ""))
    PR_v1 <- PR_v1 %>% 
      mutate(ID = str_replace(ID, "_PR1", ""))
    PR_v2 <- PR_v2 %>% 
      mutate(ID = str_replace(ID, "_PR2", ""))
    PO_v1 <- PO_v1 %>% 
      mutate(ID = str_replace(ID, "_PO1", ""))
    PO_v2 <- PO_v2 %>% 
      mutate(ID = str_replace(ID, "_PO2", ""))

    7.4 Merge with self-reports and OXTR data

    join1 <- left_join(selfreports_oxtr, BL_v1, by="ID")
    join2 <- left_join(join1, BL_v2, by="ID")
    join3 <- left_join(join2, PR_v1, by="ID")
    join4 <- left_join(join3, PR_v2, by="ID")
    join5 <- left_join(join4, PO_v1, by="ID")
    join6 <- left_join(join5, PO_v2, by="ID")
    # making a cortisol wide dataset:
    cortisol_wide <- join6[ , c(2,684:689)]
    names(cortisol_wide)
    [1] "ID"             "cortisol_BL_v1" "cortisol_BL_v2" "cortisol_PR_v1" "cortisol_PR_v2" "cortisol_PO_v1" "cortisol_PO_v2"
    saveRDS(cortisol_wide, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/cortisol_wide.rds")
    # adding to the overall dataset
    selfreports_oxtr_cortisol <- join6
    names(selfreports_oxtr_cortisol) # 40 observations of 689 variables
      [1] "startdate"               "ID"                      "dob"                     "sex_m"                   "dateofdeath"            
      [6] "knowbefore_y"            "caretaker_y"             "education"               "highestdegree"           "education_other"        
     [11] "employment"              "householdsize"           "householdsize_adult"     "householdsize_income"    "ethnicity_hisp"         
     [16] "race"                    "race_other"              "learnaboutstudy"         "meds_y"                  "meds_which"             
     [21] "meds_dx"                 "meds_dose"               "majorhealthprobs_y"      "majorhealthprobs_what"   "past2wks_injuryinfect_y"
     [26] "past2wks_dentist_y"      "currenttx_y"             "postmenopausal_y"        "lastperiod"              "n_pregnancies"          
     [31] "n_livebirths"            "n_nursed"                "allergies"               "surgeries_past6mos"      "alcohol"                
     [36] "smoking_y"               "smoking_howlong"         "smoking_perday"          "caffeine_perday"         "exercise"               
     [41] "pss_1"                   "pss_2"                   "pss_3"                   "pss_4"                   "pss_5"                  
     [46] "pss_6"                   "pss_7"                   "pss_8"                   "pss_9"                   "pss_10"                 
     [51] "ysl_1"                   "ysl_2"                   "ysl_3"                   "ysl_4"                   "ysl_5"                  
     [56] "ysl_6"                   "ysl_7"                   "ysl_8"                   "ysl_9"                   "ysl_10"                 
     [61] "ysl_11"                  "ysl_12"                  "ysl_13"                  "ysl_14"                  "ysl_15"                 
     [66] "ysl_16"                  "ysl_17"                  "ysl_18"                  "ysl_19"                  "ysl_20"                 
     [71] "ysl_21"                  "icg_1"                   "icg_2"                   "icg_3"                   "icg_4"                  
     [76] "icg_5"                   "icg_6"                   "icg_7"                   "icg_8"                   "icg_9"                  
     [81] "icg_10"                  "icg_11"                  "icg_12"                  "icg_13"                  "icg_14"                 
     [86] "icg_15"                  "icg_16"                  "icg_17"                  "icg_18"                  "icg_19"                 
     [91] "bdi_1"                   "bdi_2"                   "bdi_3"                   "bdi_4"                   "bdi_5"                  
     [96] "bdi_6"                   "bdi_7"                   "bdi_8"                   "bdi_9"                   "bdi_10"                 
    [101] "bdi_11"                  "bdi_12"                  "bdi_13"                  "bdi_14"                  "bdi_15"                 
    [106] "bdi_16"                  "bdi_17"                  "bdi_18"                  "bdi_19"                  "bdi_20"                 
    [111] "bdi_21"                  "hand_1"                  "hand_2"                  "hand_3"                  "hand_4"                 
    [116] "hand_5"                  "hand_6"                  "hand_7"                  "hand_8"                  "hand_9"                 
    [121] "hand_10"                 "hand_11"                 "hand_12"                 "hand_bat_1"              "bisbas_1"               
    [126] "bisbas_2"                "bisbas_3"                "bisbas_4"                "bisbas_5"                "bisbas_6"               
    [131] "bisbas_7"                "bisbas_8"                "bisbas_9"                "bisbas_10"               "bisbas_11"              
    [136] "bisbas_12"               "bisbas_13"               "bisbas_14"               "bisbas_15"               "bisbas_16"              
    [141] "bisbas_17"               "bisbas_18"               "bisbas_19"               "bisbas_20"               "bisbas_21"              
    [146] "bisbas_22"               "bisbas_23"               "bisbas_24"               "bgq_1"                   "bgq_2"                  
    [151] "bgq_3"                   "bgq_4"                   "bgq_5"                   "ecrrs_global_1"          "ecrrs_global_2"         
    [156] "ecrrs_global_3"          "ecrrs_global_4"          "ecrrs_global_5"          "ecrrs_global_6"          "ecrrs_global_7"         
    [161] "ecrrs_global_8"          "ecrrs_global_9"          "ecrrs_spouse_1"          "ecrrs_spouse_2"          "ecrrs_spouse_3"         
    [166] "ecrrs_spouse_4"          "ecrrs_spouse_5"          "ecrrs_spouse_6"          "ecrrs_spouse_7"          "ecrrs_spouse_8"         
    [171] "ecrrs_spouse_9"          "timesincedeath"          "age"                     "age_yrs"                 "pss_4r"                 
    [176] "pss_5r"                  "pss_7r"                  "pss_8r"                  "tot_pss"                 "tot_ysl"                
    [181] "tot_icg"                 "bdi_1c"                  "bdi_2c"                  "bdi_3c"                  "bdi_4c"                 
    [186] "bdi_5c"                  "bdi_6c"                  "bdi_7c"                  "bdi_8c"                  "bdi_9c"                 
    [191] "bdi_10c"                 "bdi_11c"                 "bdi_12c"                 "bdi_13c"                 "bdi_14c"                
    [196] "bdi_15c"                 "bdi_16c"                 "bdi_17c"                 "bdi_18c"                 "bdi_19c"                
    [201] "bdi_20c"                 "bdi_21c"                 "tot_bdi"                 "hand_1c"                 "hand_2c"                
    [206] "hand_3c"                 "hand_4c"                 "hand_5c"                 "hand_6c"                 "hand_7c"                
    [211] "hand_8c"                 "hand_9c"                 "hand_10c"                "hand_11c"                "hand_12c"               
    [216] "hand_bat_1c"             "tot_handedness"          "bisbas_1r"               "bisbas_3r"               "bisbas_4r"              
    [221] "bisbas_5r"               "bisbas_6r"               "bisbas_7r"               "bisbas_8r"               "bisbas_9r"              
    [226] "bisbas_10r"              "bisbas_11r"              "bisbas_12r"              "bisbas_13r"              "bisbas_14r"             
    [231] "bisbas_15r"              "bisbas_16r"              "bisbas_17r"              "bisbas_18r"              "bisbas_19r"             
    [236] "bisbas_20r"              "bisbas_21r"              "bisbas_23r"              "bisbas_24r"              "tot_bisbas_basdr"       
    [241] "tot_bisbas_basfun"       "tot_bisbas_basrr"        "tot_bisbas_bis"          "tot_bgq"                 "ecrrs_global_1c"        
    [246] "ecrrs_global_2c"         "ecrrs_global_3c"         "ecrrs_global_4c"         "ecrrs_global_5c"         "ecrrs_global_6c"        
    [251] "ecrrs_global_7c"         "ecrrs_global_8c"         "ecrrs_global_9c"         "ecrrs_global_1r"         "ecrrs_global_2r"        
    [256] "ecrrs_global_3r"         "ecrrs_global_4r"         "tot_ecrrs_global_avoid"  "tot_ecrrs_global_anx"    "ecrrs_spouse_1c"        
    [261] "ecrrs_spouse_2c"         "ecrrs_spouse_3c"         "ecrrs_spouse_4c"         "ecrrs_spouse_5c"         "ecrrs_spouse_6c"        
    [266] "ecrrs_spouse_7c"         "ecrrs_spouse_8c"         "ecrrs_spouse_9c"         "ecrrs_spouse_1r"         "ecrrs_spouse_2r"        
    [271] "ecrrs_spouse_3r"         "ecrrs_spouse_4r"         "tot_ecrrs_spouse_avoid"  "tot_ecrrs_spouse_anx"    "ucla_loneliness_1"      
    [276] "ucla_loneliness_2"       "ucla_loneliness_3"       "ucla_loneliness_4"       "ucla_loneliness_5"       "ucla_loneliness_6"      
    [281] "ucla_loneliness_7"       "ucla_loneliness_8"       "ucla_loneliness_9"       "ucla_loneliness_10"      "ucla_loneliness_11"     
    [286] "ucla_loneliness_12"      "ucla_loneliness_13"      "ucla_loneliness_14"      "ucla_loneliness_15"      "ucla_loneliness_16"     
    [291] "ucla_loneliness_17"      "ucla_loneliness_18"      "ucla_loneliness_19"      "ucla_loneliness_20"      "gcq_1"                  
    [296] "gcq_2"                   "gcq_3"                   "gcq_4"                   "gcq_5"                   "gcq_6"                  
    [301] "gcq_7"                   "gcq_8"                   "gcq_9"                   "gcq_10"                  "gcq_11"                 
    [306] "gcq_12"                  "gcq_13"                  "gcq_14"                  "gcq_15"                  "gcq_16"                 
    [311] "gcq_17"                  "gcq_18"                  "gcq_19"                  "gcq_20"                  "gcq_21"                 
    [316] "gcq_22"                  "gcq_23"                  "gcq_24"                  "gcq_25"                  "gcq_26"                 
    [321] "gcq_27"                  "gcq_28"                  "gcq_29"                  "gcq_30"                  "gcq_31"                 
    [326] "gcq_32"                  "gcq_33"                  "gcq_34"                  "gcq_35"                  "gcq_36"                 
    [331] "gcq_37"                  "gcq_38"                  "srrs_1"                  "srrs_2"                  "srrs_3"                 
    [336] "srrs_4"                  "srrs_5"                  "srrs_6"                  "srrs_7"                  "srrs_8"                 
    [341] "srrs_9"                  "srrs_10"                 "srrs_11"                 "srrs_12"                 "srrs_13"                
    [346] "srrs_14"                 "srrs_15"                 "srrs_16"                 "srrs_17"                 "srrs_18"                
    [351] "srrs_19"                 "srrs_20"                 "srrs_21"                 "srrs_22"                 "srrs_23"                
    [356] "srrs_24"                 "srrs_25"                 "srrs_26"                 "srrs_27"                 "srrs_28"                
    [361] "srrs_29"                 "srrs_30"                 "srrs_31"                 "srrs_32"                 "srrs_33"                
    [366] "srrs_34"                 "srrs_35"                 "srrs_36"                 "srrs_37"                 "srrs_38"                
    [371] "srrs_39"                 "srrs_40"                 "srrs_41"                 "srrs_42"                 "srrs_43"                
    [376] "srrs_44"                 "srrs_45"                 "srrs_46"                 "srrs_47"                 "srrs_48"                
    [381] "srrs_49"                 "srrs_50"                 "srrs_51"                 "ppss_fr_1"               "ppss_fr_2"              
    [386] "ppss_fr_3"               "ppss_fr_4"               "ppss_fr_5"               "ppss_fr_6"               "ppss_fr_7"              
    [391] "ppss_fr_8"               "ppss_fr_9"               "ppss_fr_10"              "ppss_fr_11"              "ppss_fr_12"             
    [396] "ppss_fr_13"              "ppss_fr_14"              "ppss_fr_15"              "ppss_fr_16"              "ppss_fr_17"             
    [401] "ppss_fr_18"              "ppss_fr_19"              "ppss_fr_20"              "ppss_fa_1"               "ppss_fa_2"              
    [406] "ppss_fa_3"               "ppss_fa_4"               "ppss_fa_5"               "ppss_fa_6"               "ppss_fa_7"              
    [411] "ppss_fa_8"               "ppss_fa_9"               "ppss_fa_10"              "ppss_fa_11"              "ppss_fa_12"             
    [416] "ppss_fa_13"              "ppss_fa_14"              "ppss_fa_15"              "ppss_fa_16"              "ppss_fa_17"             
    [421] "ppss_fa_18"              "ppss_fa_19"              "ppss_fa_20"              "tot_srrs_n"              "tot_srrs"               
    [426] "ucla_loneliness_1r"      "ucla_loneliness_5r"      "ucla_loneliness_6r"      "ucla_loneliness_9r"      "ucla_loneliness_10r"    
    [431] "ucla_loneliness_15r"     "ucla_loneliness_16r"     "ucla_loneliness_19r"     "ucla_loneliness_20r"     "tot_ucla_loneliness"    
    [436] "tot_gcq_self"            "tot_gcq_world"           "tot_gcq_life"            "tot_gcq_future"          "tot_gcq_blame"          
    [441] "tot_gcq_others"          "tot_gcq_approp"          "tot_gcq_cherish"         "tot_gcq_threat"          "ppss_fr_2r"             
    [446] "ppss_fr_6r"              "ppss_fr_7r"              "ppss_fr_15r"             "ppss_fr_18r"             "ppss_fr_20r"            
    [451] "tot_ppss_fr"             "ppss_fa_3r"              "ppss_fa_4r"              "ppss_fa_16r"             "ppss_fa_19r"            
    [456] "ppss_fa_20r"             "tot_ppss_fa"             "pre_panas_1_v1"          "pre_panas_2_v1"          "pre_panas_3_v1"         
    [461] "pre_panas_4_v1"          "pre_panas_5_v1"          "pre_panas_6_v1"          "pre_panas_7_v1"          "pre_panas_8_v1"         
    [466] "pre_panas_9_v1"          "pre_panas_10_v1"         "pre_panas_11_v1"         "pre_panas_12_v1"         "pre_panas_13_v1"        
    [471] "pre_panas_14_v1"         "pre_panas_15_v1"         "pre_panas_16_v1"         "pre_panas_17_v1"         "pre_panas_18_v1"        
    [476] "pre_panas_19_v1"         "pre_panas_20_v1"         "pre_stai_1_v1"           "pre_stai_2_v1"           "pre_stai_3_v1"          
    [481] "pre_stai_4_v1"           "pre_stai_5_v1"           "pre_stai_6_v1"           "pre_stai_7_v1"           "pre_stai_8_v1"          
    [486] "pre_stai_9_v1"           "pre_stai_10_v1"          "pre_stai_11_v1"          "pre_stai_12_v1"          "pre_stai_13_v1"         
    [491] "pre_stai_14_v1"          "pre_stai_15_v1"          "pre_stai_16_v1"          "pre_stai_17_v1"          "pre_stai_18_v1"         
    [496] "pre_stai_19_v1"          "pre_stai_20_v1"          "tot_pre_panas_pa_v1"     "tot_pre_panas_na_v1"     "pre_stai_1r_v1"         
    [501] "pre_stai_2r_v1"          "pre_stai_5r_v1"          "pre_stai_8r_v1"          "pre_stai_10r_v1"         "pre_stai_11r_v1"        
    [506] "pre_stai_15r_v1"         "pre_stai_16r_v1"         "pre_stai_19r_v1"         "pre_stai_20r_v1"         "tot_pre_stai_v1"        
    [511] "pre_panas_1_v2"          "pre_panas_2_v2"          "pre_panas_3_v2"          "pre_panas_4_v2"          "pre_panas_5_v2"         
    [516] "pre_panas_6_v2"          "pre_panas_7_v2"          "pre_panas_8_v2"          "pre_panas_9_v2"          "pre_panas_10_v2"        
    [521] "pre_panas_11_v2"         "pre_panas_12_v2"         "pre_panas_13_v2"         "pre_panas_14_v2"         "pre_panas_15_v2"        
    [526] "pre_panas_16_v2"         "pre_panas_17_v2"         "pre_panas_18_v2"         "pre_panas_19_v2"         "pre_panas_20_v2"        
    [531] "pre_stai_1_v2"           "pre_stai_2_v2"           "pre_stai_3_v2"           "pre_stai_4_v2"           "pre_stai_5_v2"          
    [536] "pre_stai_6_v2"           "pre_stai_7_v2"           "pre_stai_8_v2"           "pre_stai_9_v2"           "pre_stai_10_v2"         
    [541] "pre_stai_11_v2"          "pre_stai_12_v2"          "pre_stai_13_v2"          "pre_stai_14_v2"          "pre_stai_15_v2"         
    [546] "pre_stai_16_v2"          "pre_stai_17_v2"          "pre_stai_18_v2"          "pre_stai_19_v2"          "pre_stai_20_v2"         
    [551] "tot_pre_panas_pa_v2"     "tot_pre_panas_na_v2"     "pre_stai_1r_v2"          "pre_stai_2r_v2"          "pre_stai_5r_v2"         
    [556] "pre_stai_8r_v2"          "pre_stai_10r_v2"         "pre_stai_11r_v2"         "pre_stai_15r_v2"         "pre_stai_16r_v2"        
    [561] "pre_stai_19r_v2"         "pre_stai_20r_v2"         "tot_pre_stai_v2"         "post_panas_1_v1"         "post_panas_2_v1"        
    [566] "post_panas_3_v1"         "post_panas_4_v1"         "post_panas_5_v1"         "post_panas_6_v1"         "post_panas_7_v1"        
    [571] "post_panas_8_v1"         "post_panas_9_v1"         "post_panas_10_v1"        "post_panas_11_v1"        "post_panas_12_v1"       
    [576] "post_panas_13_v1"        "post_panas_14_v1"        "post_panas_15_v1"        "post_panas_16_v1"        "post_panas_17_v1"       
    [581] "post_panas_18_v1"        "post_panas_19_v1"        "post_panas_20_v1"        "post_stai_1_v1"          "post_stai_2_v1"         
    [586] "post_stai_3_v1"          "post_stai_4_v1"          "post_stai_5_v1"          "post_stai_6_v1"          "post_stai_7_v1"         
    [591] "post_stai_8_v1"          "post_stai_9_v1"          "post_stai_10_v1"         "post_stai_11_v1"         "post_stai_12_v1"        
    [596] "post_stai_13_v1"         "post_stai_14_v1"         "post_stai_15_v1"         "post_stai_16_v1"         "post_stai_17_v1"        
    [601] "post_stai_18_v1"         "post_stai_19_v1"         "post_stai_20_v1"         "post_sroe_1_v1"          "post_sroe_2_v1"         
    [606] "post_sroe_3_v1"          "tot_post_panas_pa_v1"    "tot_post_panas_na_v1"    "post_stai_1r_v1"         "post_stai_2r_v1"        
    [611] "post_stai_5r_v1"         "post_stai_8r_v1"         "post_stai_10r_v1"        "post_stai_11r_v1"        "post_stai_15r_v1"       
    [616] "post_stai_16r_v1"        "post_stai_19r_v1"        "post_stai_20r_v1"        "tot_post_stai_v1"        "post_panas_1_v2"        
    [621] "post_panas_2_v2"         "post_panas_3_v2"         "post_panas_4_v2"         "post_panas_5_v2"         "post_panas_6_v2"        
    [626] "post_panas_7_v2"         "post_panas_8_v2"         "post_panas_9_v2"         "post_panas_10_v2"        "post_panas_11_v2"       
    [631] "post_panas_12_v2"        "post_panas_13_v2"        "post_panas_14_v2"        "post_panas_15_v2"        "post_panas_16_v2"       
    [636] "post_panas_17_v2"        "post_panas_18_v2"        "post_panas_19_v2"        "post_panas_20_v2"        "post_stai_1_v2"         
    [641] "post_stai_2_v2"          "post_stai_3_v2"          "post_stai_4_v2"          "post_stai_5_v2"          "post_stai_6_v2"         
    [646] "post_stai_7_v2"          "post_stai_8_v2"          "post_stai_9_v2"          "post_stai_10_v2"         "post_stai_11_v2"        
    [651] "post_stai_12_v2"         "post_stai_13_v2"         "post_stai_14_v2"         "post_stai_15_v2"         "post_stai_16_v2"        
    [656] "post_stai_17_v2"         "post_stai_18_v2"         "post_stai_19_v2"         "post_stai_20_v2"         "tot_post_panas_pa_v2"   
    [661] "tot_post_panas_na_v2"    "post_stai_1r_v2"         "post_stai_2r_v2"         "post_stai_5r_v2"         "post_stai_8r_v2"        
    [666] "post_stai_10r_v2"        "post_stai_11r_v2"        "post_stai_15r_v2"        "post_stai_16r_v2"        "post_stai_19r_v2"       
    [671] "post_stai_20r_v2"        "tot_post_stai_v2"        "post_sroe_1_v2"          "post_sroe_2_v2"          "post_sroe_3_v2"         
    [676] "rs2254298"               "rs2268498"               "rs53576"                 "rs2254298_A.carrier"     "rs2268498_C.carrier"    
    [681] "rs53576_A.carrier"       "OXTR2254298"             "OXTR53576"               "cortisol_BL_v1"          "cortisol_BL_v2"         
    [686] "cortisol_PR_v1"          "cortisol_PR_v2"          "cortisol_PO_v1"          "cortisol_PO_v2"         
    saveRDS(selfreports_oxtr_cortisol, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol.rds")

    7.5 Histograms and boxplots

    # Using the subset we created for the wide dataset...
    cortisol_plots <- cortisol_wide[, grep('^c', names(cortisol_wide))]
    # Plot the variables:
    for(i in 1:length(cortisol_plots)) boxplot(cortisol_plots[,i], xlab=NULL, main=names(cortisol_plots[i]))

    for(i in 1:length(cortisol_plots)) hist(cortisol_plots[,i], xlab=NULL, main=names(cortisol_plots[i]))

    7.6 Descriptives

    # View descriptives for each scale
    ## stargazer makes nice-looking summary tables (https://cran.r-project.org/web/packages/stargazer/vignettes/stargazer.pdf)
    library(stargazer) # install.packages("stargazer") if this is the first time using the package on this machine
    stargazer(cortisol_plots, type="text")
    
    =============================================
    Statistic      N  Mean  St. Dev.  Min   Max  
    ---------------------------------------------
    cortisol_BL_v1 22 4.700  2.881   1.020 13.640
    cortisol_BL_v2 27 5.271  3.232   1.000 13.780
    cortisol_PR_v1 27 5.349  6.819   1.420 35.210
    cortisol_PR_v2 29 4.867  3.258   1.440 14.420
    cortisol_PO_v1 29 5.368  8.457   0.860 47.780
    cortisol_PO_v2 29 4.440  3.127   1.170 14.630
    ---------------------------------------------

    7.7 Missing data

    cortisol_wide %>% 
      select_if(function(x) any(is.na(x))) %>% 
      summarise_at(vars(starts_with("c")),funs(sum(is.na(.)))) -> cortisol_NA
    gather(cortisol_NA) -> cortisol_NA_long # create long data that lists variables with any NAs, and % of data missing
    cortisol_NA_long

    At the first visit, we are missing cortisol data from n=18 (45%) at baseline, n=13 (33%) at pre-fMRI, n=11 (28%) at post-fMRI. At the second visit, we are missing cortisol data from n=13 (33%) at baseline, n=11 (28%) at pre-fMRI, n=11 (28%) at post-fMRI.

    7.8 T-tests: comparing visits

    t.test(cortisol_wide$cortisol_BL_v1, cortisol_wide$cortisol_BL_v2,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns
    
        Paired t-test
    
    data:  cortisol_wide$cortisol_BL_v1 and cortisol_wide$cortisol_BL_v2
    t = -0.61776, df = 20, p-value = 0.5437
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.154994  1.170232
    sample estimates:
    mean of the differences 
                  -0.492381 
    t.test(cortisol_wide$cortisol_PR_v1, cortisol_wide$cortisol_PR_v2,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns
    
        Paired t-test
    
    data:  cortisol_wide$cortisol_PR_v1 and cortisol_wide$cortisol_PR_v2
    t = 0.17856, df = 25, p-value = 0.8597
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.430900  2.892438
    sample estimates:
    mean of the differences 
                  0.2307692 
    t.test(cortisol_wide$cortisol_PO_v1, cortisol_wide$cortisol_PO_v2,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) # ns
    
        Paired t-test
    
    data:  cortisol_wide$cortisol_PO_v1 and cortisol_wide$cortisol_PO_v2
    t = 0.75867, df = 22, p-value = 0.4561
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.569444  5.533792
    sample estimates:
    mean of the differences 
                   1.482174 

    No significant effect of visit at any of the three timepoints.

    8 Randomization

    This section of the script deals with how participants were randomized (1) to receive Treatment A (OT/PL) or Treatment B (OT/PL) at their first visit, and (2) whether they were randomized to receive AAT task instructions to “push blue” or “push yellow” at their first visit.

    8.1 Import, clean, and merge data

    library(readxl)
    random <- read_excel("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT_Randomization_FINAL.xlsx", sheet = "D101-D149", skip=1)[, c(1:5) ]
    View(random)
    
    # take out D117 since we need to use her 2nd and 3rd visits...
    random <- filter(random, !grepl("D117",ID))
    random_D117 <- read_excel("~/Dropbox/GLASS Lab/OT Study/OT_Randomization_FINAL.xlsx", sheet = "D101-D149", skip=1)[17, c(1,4:7) ] 
    
    # just get her visit 2 and 3 data and clean it up
    names(random_D117)
    random_D117 %>% rename("tx_v1" = Vial__1, "AATpush1_v1" = Push__1, "tx_v2" = X__1, "AATpush1_v2" = X__2) %>% 
      mutate(tx_v1 = recode(tx_v1, "A" = "A", "B" = "B"), tx_v2 = recode(tx_v2, "A" = "A", "B" = "B"), AATpush1_v1 = recode(AATpush1_v1, "Push blue" = "BLUE", "Push yellow" = "YELLOW"), AATpush1_v2 = recode(AATpush1_v2, "Push blue" = "BLUE", "Push yellow" = "YELLOW")) -> random_D117
    View(random_D117)    
    
    # do the same for the rest of the sample
    random %>% rename("tx_v1" = Vial, "AATpush1_v1" = Push, "tx_v2" = Vial__1, "AATpush1_v2" = Push__1) %>% 
      mutate(tx_v1 = recode(tx_v1, "A" = "A", "B" = "B"), tx_v2 = recode(tx_v2, "A" = "A", "B" = "B"), AATpush1_v1 = recode(AATpush1_v1, "Push blue" = "BLUE", "Push yellow" = "YELLOW", "YELLOW" = "YELLOW", "BLUE" = "BLUE"), AATpush1_v2 = recode(AATpush1_v2, "Push blue" = "BLUE", "Push yellow" = "YELLOW", "YELLOW" = "YELLOW", "BLUE" = "BLUE")) -> random
    View(random)    
    
    # merge
    random <- bind_rows(random, random_D117)
    random$tx_v1 <- as.factor(random$tx_v1)
    random$tx_v2 <- as.factor(random$tx_v2)
    random$AATpush1_v1 <- as.factor(random$AATpush1_v1)
    random$AATpush1_v2 <- as.factor(random$AATpush1_v2)
    
    saveRDS(random, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/randomization.rds")
    
    # merge 
    selfreports_oxtr_cortisol_random <- left_join(selfreports_oxtr_cortisol, random, BY="ID")
    View(selfreports_oxtr_cortisol_random) # 40 obs of 688 vars
    
    saveRDS(selfreports_oxtr_cortisol_random, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random.rds")
    write.csv(selfreports_oxtr_cortisol_random, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random.csv")
    
    # to print variable names one per row:
    cat(names(selfreports_oxtr_cortisol_random),sep="\n")
    

    9 Effect of treatment (OT/PL)

    selfreports_oxtr_cortisol_random <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random.rds")
    # Participants who got treatment A at visit 1:
    selfreports_oxtr_cortisol_random %>% 
      select(ID, tot_pre_panas_pa_v1,
    tot_pre_panas_na_v1,
    tot_pre_stai_v1,
    tot_pre_panas_pa_v2,
    tot_pre_panas_na_v2,
    tot_pre_stai_v2,
    tot_post_panas_pa_v1,
    tot_post_panas_na_v1,
    tot_post_stai_v1,
    tot_post_panas_pa_v2,
    tot_post_panas_na_v2,
    tot_post_stai_v2,
    post_sroe_1_v1,
    post_sroe_2_v1,
    post_sroe_3_v1,
    post_sroe_1_v2,
    post_sroe_2_v2,
    post_sroe_3_v2,
    cortisol_BL_v1,
    cortisol_BL_v2,
    cortisol_PR_v1,
    cortisol_PR_v2,
    cortisol_PO_v1,
    cortisol_PO_v2,
    tx_v1) %>% filter(tx_v1 == "A")  -> v1_tx_A
    View(v1_tx_A) # 21 obs of 26 vars
    # then split up by _v1/_v2:
    v1_tx_A <- v1_tx_A[, grep('ID|_v1', names(v1_tx_A))] # 21 obs of 14 vars
    # then strip out the "_v1" from column names
    v1_tx_A %>%
       rename_all(.funs = funs(sub("\\_v1", "", names(v1_tx_A)))) -> v1_tx_A 
    head(v1_tx_A)
    # Participants who got treatment A at visit 2:
    selfreports_oxtr_cortisol_random %>% 
      select(ID, tot_pre_panas_pa_v1,
    tot_pre_panas_na_v1,
    tot_pre_stai_v1,
    tot_pre_panas_pa_v2,
    tot_pre_panas_na_v2,
    tot_pre_stai_v2,
    tot_post_panas_pa_v1,
    tot_post_panas_na_v1,
    tot_post_stai_v1,
    tot_post_panas_pa_v2,
    tot_post_panas_na_v2,
    tot_post_stai_v2,
    post_sroe_1_v1,
    post_sroe_2_v1,
    post_sroe_3_v1,
    post_sroe_1_v2,
    post_sroe_2_v2,
    post_sroe_3_v2,
    cortisol_BL_v1,
    cortisol_BL_v2,
    cortisol_PR_v1,
    cortisol_PR_v2,
    cortisol_PO_v1,
    cortisol_PO_v2,
    tx_v2) %>% filter(tx_v2 == "A")  -> v2_tx_A
    View(v2_tx_A) # 21 obs of 26 vars
    # then split up by _v1/_v2
    v2_tx_A <- v2_tx_A[, grep('ID|_v2', names(v2_tx_A))] # 19 obs of 14 vars
    # then strip out the "_v2" from column names
    v2_tx_A %>%
       rename_all(.funs = funs(sub("\\_v2", "", names(v2_tx_A)))) -> v2_tx_A 
    head(v2_tx_A)
    # merge both A's:
    A <- bind_rows(v1_tx_A, v2_tx_A)
    View(A)
    # Participants who got treatment B at visit 1:
    selfreports_oxtr_cortisol_random %>% 
      select(ID, tot_pre_panas_pa_v1,
    tot_pre_panas_na_v1,
    tot_pre_stai_v1,
    tot_pre_panas_pa_v2,
    tot_pre_panas_na_v2,
    tot_pre_stai_v2,
    tot_post_panas_pa_v1,
    tot_post_panas_na_v1,
    tot_post_stai_v1,
    tot_post_panas_pa_v2,
    tot_post_panas_na_v2,
    tot_post_stai_v2,
    post_sroe_1_v1,
    post_sroe_2_v1,
    post_sroe_3_v1,
    post_sroe_1_v2,
    post_sroe_2_v2,
    post_sroe_3_v2,
    cortisol_BL_v1,
    cortisol_BL_v2,
    cortisol_PR_v1,
    cortisol_PR_v2,
    cortisol_PO_v1,
    cortisol_PO_v2,
    tx_v1) %>% filter(tx_v1 == "B")  -> v1_tx_B
    View(v1_tx_B) # 21 obs of 26 vars
    # then split up by _v1/_v2:
    v1_tx_B <- v1_tx_B[, grep('ID|_v1', names(v1_tx_B))] # 21 obs of 14 vars
    # then strip out the "_v1" from column names
    v1_tx_B %>%
       rename_all(.funs = funs(sub("\\_v1", "", names(v1_tx_B)))) -> v1_tx_B 
    head(v1_tx_B)
    # Participants who got treatment B at visit 2:
    selfreports_oxtr_cortisol_random %>% 
      select(ID, tot_pre_panas_pa_v1,
    tot_pre_panas_na_v1,
    tot_pre_stai_v1,
    tot_pre_panas_pa_v2,
    tot_pre_panas_na_v2,
    tot_pre_stai_v2,
    tot_post_panas_pa_v1,
    tot_post_panas_na_v1,
    tot_post_stai_v1,
    tot_post_panas_pa_v2,
    tot_post_panas_na_v2,
    tot_post_stai_v2,
    post_sroe_1_v1,
    post_sroe_2_v1,
    post_sroe_3_v1,
    post_sroe_1_v2,
    post_sroe_2_v2,
    post_sroe_3_v2,
    cortisol_BL_v1,
    cortisol_BL_v2,
    cortisol_PR_v1,
    cortisol_PR_v2,
    cortisol_PO_v1,
    cortisol_PO_v2,
    tx_v2) %>% filter(tx_v2 == "B")  -> v2_tx_B
    View(v2_tx_B) # 21 obs of 26 vars
    # then split up by _v1/_v2
    v2_tx_B <- v2_tx_B[, grep('ID|_v2', names(v2_tx_B))] # 19 obs of 14 vars
    # then strip out the "_v2" from column names
    v2_tx_B %>%
       rename_all(.funs = funs(sub("\\_v2", "", names(v2_tx_B)))) -> v2_tx_B 
    head(v2_tx_B)
    # merge both B's:
    B <- bind_rows(v1_tx_B, v2_tx_B)
    View(B)
    ## rename:
    A %>%
      rename_at(vars(-ID),function(x) paste0(x,"_A")) -> A
    head(A)
    B %>%
      rename_at(vars(-ID),function(x) paste0(x,"_B")) -> B
    head(B)
    # merge:
    AB <- left_join(A, B, BY="ID") # 40 obs of 27 variables
    Joining, by = "ID"
    selfreports_oxtr_cortisol_random_AB <- left_join(selfreports_oxtr_cortisol_random, AB, BY="ID") # 40 obs of 719 variables
    Joining, by = "ID"
    saveRDS(selfreports_oxtr_cortisol_random_AB, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB.rds")

    9.1 Histograms and boxplots

    # Create a subset of only numeric variables (i.e., not ID and qualitative SROE items) and order them alphabetically so they're easier to compare
    select_if(AB, is.numeric) %>% select(order(colnames(.))) -> AB_viz
    # Plot the variables:
    for(i in 1:length(AB_viz)) boxplot(AB_viz[,i], xlab=NULL, main=names(AB_viz[i]))

    for(i in 1:length(AB_viz)) hist(AB_viz[,i], xlab=NULL, main=names(AB_viz[i]))

    9.2 Descriptives

    stargazer(AB_viz, type="text")
    
    ===================================================
    Statistic           N   Mean  St. Dev.  Min   Max  
    ---------------------------------------------------
    cortisol_BL_A       25 4.530   2.524   1.000 9.900 
    cortisol_BL_B       24 5.520   3.519   1.360 13.780
    cortisol_PO_A       29 5.642   8.498   0.860 47.780
    cortisol_PO_B       29 4.166   2.899   1.170 14.630
    cortisol_PR_A       29 5.377   6.569   1.420 35.210
    cortisol_PR_B       27 4.801   3.378   1.440 14.420
    post_sroe_3_A       40 1.950   0.783     1     3   
    post_sroe_3_B       39 1.974   0.811     1     4   
    tot_post_panas_na_A 40 11.400  2.085    10     19  
    tot_post_panas_na_B 40 11.200  1.667    10     16  
    tot_post_panas_pa_A 40 34.025  7.966    17     48  
    tot_post_panas_pa_B 40 33.075  7.163    21     50  
    tot_post_stai_A     40 30.425  8.950    20     61  
    tot_post_stai_B     40 29.675  7.852    20     54  
    tot_pre_panas_na_A  40 12.625  3.303    10     22  
    tot_pre_panas_na_B  40 12.900  3.622    10     27  
    tot_pre_panas_pa_A  40 34.250  6.679    14     48  
    tot_pre_panas_pa_B  40 32.900  6.994    21     50  
    tot_pre_stai_A      40 30.800  8.948    20     56  
    tot_pre_stai_B      40 33.275  9.816    20     63  
    ---------------------------------------------------

    9.3 T-tests

    9.3.1 Cortisol

    # baseline
    t.test(AB_viz$cortisol_BL_A, AB_viz$cortisol_BL_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$cortisol_BL_A and AB_viz$cortisol_BL_B
    t = -0.79093, df = 20, p-value = 0.4383
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.279418  1.026085
    sample estimates:
    mean of the differences 
                 -0.6266667 
    # pre 
    t.test(AB_viz$cortisol_PR_A, AB_viz$cortisol_PR_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$cortisol_PR_A and AB_viz$cortisol_PR_B
    t = 0.56328, df = 25, p-value = 0.5783
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -1.922778  3.370470
    sample estimates:
    mean of the differences 
                  0.7238462 
    # post
    t.test(AB_viz$cortisol_PO_A, AB_viz$cortisol_PO_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$cortisol_PO_A and AB_viz$cortisol_PO_B
    t = 0.7701, df = 22, p-value = 0.4494
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.546138  5.553964
    sample estimates:
    mean of the differences 
                   1.503913 

    Cortisol under tx A is not significantly different from cortisol under tx B, at any timepoint.

    9.3.2 Self-reports

    t.test(AB_viz$post_sroe_3_A, AB_viz$post_sroe_3_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$post_sroe_3_A and AB_viz$post_sroe_3_B
    t = 0, df = 38, p-value = 1
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -0.2576182  0.2576182
    sample estimates:
    mean of the differences 
                          0 
    t.test(AB_viz$tot_pre_panas_na_A, AB_viz$tot_pre_panas_na_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_pre_panas_na_A and AB_viz$tot_pre_panas_na_B
    t = -0.5806, df = 39, p-value = 0.5649
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -1.2330446  0.6830446
    sample estimates:
    mean of the differences 
                     -0.275 
    t.test(AB_viz$tot_post_panas_na_A, AB_viz$tot_post_panas_na_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_post_panas_na_A and AB_viz$tot_post_panas_na_B
    t = 0.48952, df = 39, p-value = 0.6272
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -0.6263951  1.0263951
    sample estimates:
    mean of the differences 
                        0.2 
    t.test(AB_viz$tot_pre_panas_pa_A, AB_viz$tot_pre_panas_pa_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_pre_panas_pa_A and AB_viz$tot_pre_panas_pa_B
    t = 1.4026, df = 39, p-value = 0.1686
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -0.5967769  3.2967769
    sample estimates:
    mean of the differences 
                       1.35 
    t.test(AB_viz$tot_post_panas_pa_A, AB_viz$tot_post_panas_pa_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_post_panas_pa_A and AB_viz$tot_post_panas_pa_B
    t = 0.94821, df = 39, p-value = 0.3489
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -1.076512  2.976512
    sample estimates:
    mean of the differences 
                       0.95 
    t.test(AB_viz$tot_pre_stai_A, AB_viz$tot_pre_stai_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_pre_stai_A and AB_viz$tot_pre_stai_B
    t = -2.754, df = 39, p-value = 0.008897
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -4.2928088 -0.6571912
    sample estimates:
    mean of the differences 
                     -2.475 
    t.test(AB_viz$tot_post_stai_A, AB_viz$tot_post_stai_B,
           alternative = "two.sided", paired = TRUE, var.equal = FALSE) 
    
        Paired t-test
    
    data:  AB_viz$tot_post_stai_A and AB_viz$tot_post_stai_B
    t = 0.54526, df = 39, p-value = 0.5887
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -2.032202  3.532202
    sample estimates:
    mean of the differences 
                       0.75 

    None of the self-report scores significantly differ under tx A vs. tx B, except for the pre-fMRI STAI, as shown below:

    
    =========================================
    Statistic      N   Mean  St. Dev. Min Max
    -----------------------------------------
    tot_pre_stai_A 40 30.800  8.948   20  56 
    tot_pre_stai_B 40 33.275  9.816   20  63 
    -----------------------------------------

    10 Review entire dataset using summarytools

    cat(sort(names), sep="\n")
    
    Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
      'x' must be atomic

    11 20-month follow up

    Participants were asked to repeat the ICG 20-24 months after their participation in the study, either via mail or online.

    library(tidyverse)
    library(psych)
    filter <- dplyr::filter
    select <- dplyr::select
    # Import CSV from Qualtrics
    fu <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT+fMRI+Inventory+of+Complicated+Grief+-+20-mo.+Follow+Up_January+16%2C+2019_13.45.csv", stringsAsFactors = FALSE, na.strings="")[ ,-c(2:17)] %>%
      filter(grepl("^D1", Consent, ignore.case = TRUE)) # remove rows that aren't IDs 
    # NOTE: D114 only completed the first page of the ICG (items 1-10). Her date of completion was input as 2 weeks post-sent date.
    # Rename variables
    fu <- rename(fu, date_followup = StartDate,
    ID = Consent,
    fu_icg_1 = ICG.R1.19_1,
    fu_icg_2 = ICG.R1.19_2,
    fu_icg_3 = ICG.R1.19_3,
    fu_icg_4 = ICG.R1.19_4,
    fu_icg_5 = ICG.R1.19_5,
    fu_icg_6 = ICG.R1.19_6,
    fu_icg_7 = ICG.R1.19_7,
    fu_icg_8 = ICG.R1.19_8,
    fu_icg_9 = ICG.R1.19_9,
    fu_icg_10 = ICG.R1.19_10,
    fu_icg_11 = ICG.R1.19_11,
    fu_icg_12 = ICG.R1.19_12,
    fu_icg_13 = ICG.R1.19_13,
    fu_icg_14 = ICG.R1.19_14,
    fu_icg_15 = ICG.R1.19_15,
    fu_icg_16 = ICG.R1.19_16,
    fu_icg_17 = ICG.R1.19_17,
    fu_icg_18 = ICG.R1.19_18,
    fu_icg_19 = ICG.R1.19_19)
    # Make all of the ICG variables numeric and make date_followup into POSIXct (date format):
    fu <- fu %>% mutate_at(vars(-c(ID,date_followup)), funs(as.numeric)) %>% mutate(date_followup = ymd_hm(date_followup))
    fu <- fu %>% filter(!grepl("2018-01-08 15:32", date_followup)) # remove D125's response from 1-08-2018 (she has a duplicate)
    # Scoring
    ##################  
    ### Inventory of Complicated Grief
      
    # Citation: Prigerson, H. G., Maciejewski, P. K., Reynolds, C. F., Bierhals, A. J., Newsom, J. T., Fasiczka, A., ... & Miller, M. (1995). Inventory of Complicated Grief: a scale to measure maladaptive symptoms of loss. Psychiatry Research, 59(1), 65-79.
    # Answer choices range from 0 (Never) – 4 (Always). 
    # NO reverse scored items. 
    # Sum all items (possible range: 0 – 76; clinical cut-off = 25). [tot_icg]
    tot_icg_20mFU <- subset(fu, select=c(fu_icg_1:fu_icg_19))
    fu$tot_icg_20mFU <- rowSums(tot_icg_20mFU, na.rm=TRUE)
      
    describe(fu$tot_icg_20mFU)
       vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
    X1    1 33 15.52 10.25     13   14.59 11.86   2  45    43 0.75     0.19 1.78
    qqnorm(fu$tot_icg_20mFU)

    # Merge these variables into the master
    data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB.rds")
    data <- left_join(data,fu, by="ID") # merge by ID
    saveRDS(data, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu.rds")
    # How correlated are the ICG measurements?
    corr.test(data$tot_icg, data$tot_icg_20mFU)
    Call:corr.test(x = data$tot_icg, y = data$tot_icg_20mFU)
    Correlation matrix 
    [1] 0.82
    Sample Size 
    [1] 33
    Probability values  adjusted for multiple tests. 
    [1] 0
    
     To see confidence intervals of the correlations, print with the short=FALSE option
    plot(data$tot_icg, data$tot_icg_20mFU)

    t.test(data$tot_icg, data$tot_icg_20mFU, paired=TRUE)
    
        Paired t-test
    
    data:  data$tot_icg and data$tot_icg_20mFU
    t = 4.8321, df = 32, p-value = 3.236e-05
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     3.225330 7.926185
    sample estimates:
    mean of the differences 
                   5.575758 
    # Descriptive stats and distributions (only participants with FU data)
    ttest <- data %>% filter(tot_icg_20mFU != "NA")
    describe(ttest$tot_icg)
       vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
    X1    1 33 21.09 11.59     19   20.52 13.34   4  51    47 0.44     -0.5 2.02
    describe(ttest$tot_icg_20mFU)
       vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
    X1    1 33 15.52 10.25     13   14.59 11.86   2  45    43 0.75     0.19 1.78
    boxplot(ttest$tot_icg,ttest$tot_icg_20mFU)

    # Create a change variable
    ## question for down the line: if we use the change score, do we want to use difference scores or standardized residuals?
    data <- data %>% mutate(change_icg = tot_icg_20mFU - tot_icg)
    describe(data$change_icg)
       vars  n  mean   sd median trimmed  mad min max range  skew kurtosis   se
    X1    1 33 -5.58 6.63     -5   -5.37 5.93 -19   7    26 -0.33    -0.68 1.15
    hist(data$change_icg)

    boxplot(data$change_icg)

    qqnorm(data$change_icg)

    # Transform data to long format, for visualizing change over time
    icg <- subset(data, select=c(ID, tot_icg)) %>% mutate(time = rep("1"))
    icg_fu <- subset(data, select=c(ID, tot_icg_20mFU)) %>% rename(tot_icg = tot_icg_20mFU) %>% mutate(time = rep("2"))
    change <- bind_rows(icg, icg_fu) %>% mutate(ID=as.factor(ID))
    # Plot trajectories
    p <- ggplot(data = change, aes(x = time, y = tot_icg, group = ID, colour=factor(ID))) + 
      geom_point(show.legend = FALSE) + 
      geom_line(show.legend = FALSE) +
      geom_hline(yintercept=25)
    p # I can label these with participant IDs but didn't for now so that I don't see who's in which group

    # Is time since the death associated with ICG at either timepoint, or change in ICG?
    corr.test(data$timesincedeath, data$tot_icg)
    Call:corr.test(x = data$timesincedeath, y = data$tot_icg)
    Correlation matrix 
    [1] 0.01
    Sample Size 
    [1] 40
    Probability values  adjusted for multiple tests. 
    [1] 0.97
    
     To see confidence intervals of the correlations, print with the short=FALSE option
    plot(data$timesincedeath, data$tot_icg)

    corr.test(data$timesincedeath, data$tot_icg_20mFU)
    Call:corr.test(x = data$timesincedeath, y = data$tot_icg_20mFU)
    Correlation matrix 
    [1] -0.04
    Sample Size 
    [1] 33
    Probability values  adjusted for multiple tests. 
    [1] 0.82
    
     To see confidence intervals of the correlations, print with the short=FALSE option
    plot(data$timesincedeath, data$tot_icg_20mFU)

    corr.test(data$timesincedeath, data$change_icg)
    Call:corr.test(x = data$timesincedeath, y = data$change_icg)
    Correlation matrix 
    [1] -0.06
    Sample Size 
    [1] 33
    Probability values  adjusted for multiple tests. 
    [1] 0.74
    
     To see confidence intervals of the correlations, print with the short=FALSE option
    plot(data$timesincedeath, data$change_icg)

    ### CAN'T TEST THE FOLLOWING TIL YOU CREATE yrs_together VARIABLE IN THE NEXT CHUNK
    # How about years together?
    corr.test(data$yrs_together, data$tot_icg)
    Error in cor(x, y, use = use, method = method) : 'x' must be numeric

    11.1 Added variables

    Adding variables for group (CG vs. NCG), length of relationship, time from study to follow-up, …

    library(tidyverse)
    library(psych)
    # RELATIONSHIP LENGTH
    data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu.rds")
    rel <- read.csv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/relationship-length-from-screen.csv")
    data <- left_join(data,rel, by="ID") # merge by ID
    Column `ID` joining character vector and factor, coercing into character vector
    data %>% select(ID, yrs_together) # double-check these are correct
    # TIME FROM STUDY TO FOLLOW-UP
    # First, we only care about the date they completed the follow-up survey, not the time
    # so we'll split 'date_followup' into two variables, then remove the 'time' varialble.
    data <- tidyr::separate(data, date_followup, c("date_followup", "time"), sep = " ")
    data$time <- NULL
    class(data$date_followup)
    [1] "character"
    # 'date_followup' need to be converted from character to date using lubridate's ymd function (ymd to match 'start_date' [when they were enrolled])
    # Use the mdy function from lubridate to convert 'dob' and 'dateofdeath' from character to date.
    data <- data %>% 
     mutate(date_followup = ymd(date_followup))
    # Now we need to calculate time between study and follow-up
    data <- data %>% mutate(timeto20mFU = date_followup - startdate) %>% mutate_at(vars(timeto20mFU), funs(as.numeric)) %>% mutate(timeto20mFU_mos = timeto20mFU/30.417)
    # have to convert the new timesincedeath variable to numeric (vs. difftime) object, because there are a limited number of functions that can operate on difftime objects, then created a variable for time from study to FU in months (instead of days)
    describe(data$timeto20mFU_mos)
       vars  n  mean   sd median trimmed  mad   min   max range  skew kurtosis   se
    X1    1 33 21.74 0.68  21.67   21.75 0.44 20.02 23.05  3.02 -0.22    -0.13 0.12
    corr.test(data$tot_icg_20mFU, data$timeto20mFU_mos)
    Call:corr.test(x = data$tot_icg_20mFU, y = data$timeto20mFU_mos)
    Correlation matrix 
    [1] -0.32
    Sample Size 
    [1] 33
    Probability values  adjusted for multiple tests. 
    [1] 0.07
    
     To see confidence intervals of the correlations, print with the short=FALSE option
    plot(data$tot_icg_20mFU, data$timeto20mFU_mos) # time between study participation and follow-up is weakly negatively correlated with ICG score at follow-up, r = -.32, p = .07. However, note the potential outlier in the lower right corner of the scatterplot.

    # CG vs. NCG GROUP
    data <- data %>% mutate(group = as.factor(ifelse(tot_icg > 25, "CG", "NCG"))) # at study
    data$group <- relevel(data$group, ref="NCG") # make NCG the reference group
    data <- data %>% mutate(group_20mFU = as.factor(ifelse(tot_icg_20mFU > 25, "CG", "NCG"))) # at follow-up
    data$group_20mFU <- relevel(data$group_20mFU, ref="NCG") # make NCG the reference group
    # How many in each group?
    data %>% group_by(group) %>% count() # n = 23 NCG, n = 17 CG
    data %>% group_by(group,group_20mFU) %>% count() # n = 28 NCG, n = 5 CG, 7 missing (2 NCG, 5 CG)
    saveRDS(data, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu_addvars.rds")

    12 Resting state timing

    # Resting state timing descriptives
    library(tidyverse)
    library(psych)
    library(car)
    Loading required package: carData
    
    Attaching package: ‘car’
    
    The following object is masked from ‘package:psych’:
    
        logit
    
    The following object is masked from ‘package:dplyr’:
    
        recode
    
    The following object is masked from ‘package:purrr’:
    
        some
    data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu_addvars.rds")
    rs <- read.csv("~/Dropbox/GLASS Lab/OT Study/MRI protocols/Resting State Timing for R.csv")
    rs <- subset(rs, select = c(ID, Visit, Vial, Mins))
    rs$tx <- factor(rs$Vial, levels=c("A","B"), labels=c("A","B"))
    rs$visit <- factor(rs$Visit, levels=c(1,2), labels=c("v1","v2"))
    rs_v1A <- rs %>% filter(Vial == "A" & Visit == 1) %>% mutate(tx_v1 = "A")
    rs_v1B <- rs %>% filter(Vial == "B" & Visit == 1) %>% mutate(tx_v1 = "B")
    rs_v2A <- rs %>% filter(Vial == "A" & Visit == 2) %>% mutate(tx_v2 = "A")
    rs_v2B <- rs %>% filter(Vial == "B" & Visit == 2) %>% mutate(tx_v2 = "B")
    rsA <- bind_rows(rs_v1A,rs_v2A) %>% rename("timetorest_A" = Mins)
    rsB <- bind_rows(rs_v1B,rs_v2B) %>% rename("timetorest_B" = Mins)
    rest <- left_join(rsA, rsB, by="ID") %>% select(ID,timetorest_A, timetorest_B)
    data <- left_join(data, rest, by="ID")
    Column `ID` joining character vector and factor, coercing into character vector
    describe(rest$timetorest_A)
       vars  n  mean    sd median trimmed  mad   min    max range skew kurtosis   se
    X1    1 40 66.84 12.61  64.54   65.35 6.28 49.92 108.85 58.93 1.27      1.7 1.99
    describe(rest$timetorest_B) 
       vars  n  mean   sd median trimmed   mad  min    max range skew kurtosis  se
    X1    1 40 69.73 15.8  70.59   69.32 18.62 42.3 101.47 59.17 0.24    -0.75 2.5
    t.test(rest$timetorest_A, rest$timetorest_B) # A and B not significantly different
    
        Welch Two Sample t-test
    
    data:  rest$timetorest_A and rest$timetorest_B
    t = -0.90548, df = 74.328, p-value = 0.3681
    alternative hypothesis: true difference in means is not equal to 0
    95 percent confidence interval:
     -9.261919  3.473919
    sample estimates:
    mean of x mean of y 
     66.83725  69.73125 
    # do some spot-checking against the 'rs' item to make sure that the IDs, treatment, and times match up like they should
    subset(data, select = c(ID, tx_A, timetorest_A))
    saveRDS(data, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu_addvars_rest.rds")

    13 Behavioral data

    13.1 Data cleaning

    Pre-R steps:

    1. Removed all .iqdat files under 25KB or so in order to filter out pilot data and false starts.
    2. Removed non-study data (i.e., tests and OT undergrad files).
    3. Organized raw .iqdat files for each visit by run 1/run 2 (two separate folders) based on date/time stamp.

      In Terminal, within each of the folders in turn…

    4. Changed file extensions to .tsv (tab-separated) from .iqdat: find . -iname "*.iqdat" -exec bash -c 'mv "$0" "${0%\.iqdat}.tsv"' {} \;
    5. Merged the files: cat *.tsv > OT_gAAT_run-1.tsv (or OT_gAAT_run-2.tsv) 5. Merged the files: mlr --tsvlite cat *.tsv > OT_gAAT_run-1.tsv (or OT_gAAT_run-2.tsv)
        5a. mlr --tsvlite drops the header from all but the first file, so column names are not repeated throughout the dataset.
    Notes:
    • D117: Had 3 visits due to scanner technical issues. Use “_b" and “_c" as visit 1 and visit 2 respectively.
    • D114: Has multiple files from visit 2. Use the last two.
    • D135: Use files from 6/06/16 and 6/17/18 (scanner issues on 06/13/16). Use “_b" and “_c" as visit 1 and visit 2 respectively.
    • D147: Visit 1 run 2 is partial data for some reason (I do have notes that she switched back to PUSH-YELLOW during run 2, but did not re-run because running way over time.)

    # Behavioral data (gAAT)
    library(tidyverse)
    filter <- dplyr::filter
    select <- dplyr::select
    # read in the data (only importing a subset of columns)
    raw_r1 <- data.frame(read_tsv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv", col_types=cols_only(
      date = col_integer(),
      time = col_character(),
      subject = col_character(),
      blockcode = col_character(),
      blocknum = col_character(),
      trialcode = col_character(),
      values.trialcode = col_character(),
      values.stimulus = col_character(),
      values.initialresponse = col_character(),
      values.RT = col_number()
    )))
    number of columns of result is not a multiple of vector length (arg 1)154 parsing failures.
    row # A tibble: 5 x 5 col     row col       expected   actual file                                                                                            expected   <int> <chr>     <chr>      <chr>  <chr>                                                                                           actual 1   327 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv' file 2   327 values.RT a number   .      '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv' row 3   653 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv' col 4   653 values.RT a number   .      '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv' expected 5   974 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run1_tsv/OT_gAAT_run-1.tsv'
    ... ................................. ... ................................................................................................................................... ........ ................................................................................................................................................................................................................................................................ ...... ................................................................................................................................................... .... ................................................................................................................................................... ... ................................................................................................................................................... ... ................................................................................................................................................... ........ ...................................................................................................................................................
    See problems(...) for more details.
    raw_r2 <- data.frame(read_tsv("~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv", col_types=cols_only(
      date = col_integer(),
      time = col_character(),
      subject = col_character(),
      blockcode = col_character(),
      blocknum = col_character(),
      trialcode = col_character(),
      values.trialcode = col_character(),
      values.stimulus = col_character(),
      values.initialresponse = col_character(),
      values.RT = col_number()
    )))
    number of columns of result is not a multiple of vector length (arg 1)154 parsing failures.
    row # A tibble: 5 x 5 col     row col       expected   actual file                                                                                            expected   <int> <chr>     <chr>      <chr>  <chr>                                                                                           actual 1   324 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv' file 2   324 values.RT a number   .      '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv' row 3   643 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv' col 4   643 values.RT a number   .      '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv' expected 5   954 date      an integer date   '~/Dropbox/GLASS Lab/OT Study/data/raw-data/OT-gAAT-behavioral-data/Run2_tsv/OT_gAAT_run-2.tsv'
    ... ................................. ... ................................................................................................................................... ........ ................................................................................................................................................................................................................................................................ ...... ................................................................................................................................................... .... ................................................................................................................................................... ... ................................................................................................................................................... ... ................................................................................................................................................... ........ ...................................................................................................................................................
    See problems(...) for more details.
    # header line repeats when I used cat to merge, so get those out of there
    raw_r1 <- raw_r1 %>% filter(!is.na(date))
    raw_r2 <- raw_r2 %>% filter(!is.na(date))
    unique(raw_r1$subject)
     [1] "D101"   "D101_2" "D102"   "D102_B" "D103"   "D103_b" "D104"   "D104_b" "D105"   "D105_b" "D107"   "D107_b" "D110"   "D110_b" "D113"   "D113_b" "D114"  
    [18] "D114_b" "D115"   "D115_b" "D117_b" "D117_c" "test"   "D118_b" "D119"   "D119_b" "D120"   "D120_b" "D121"   "D121_b" "D122"   "D122_b" "D123"   "D123_b"
    [35] "D125"   "D125_b" "D126"   "D126_b" "D127"   "D127_b" "D128"   "D128_b" "D129"   "D129_b" "D130"   "D131"   "D131_b" "D132"   "D132_b" "D133"   "D133_b"
    [52] "D134"   "D134_b" "D135"   "D135_c" "D137"   "D137_b" "D138"   "D138_b" "D139"   "D139_b" "D140"   "D140_b" "D141"   "D141_b" "D142"   "D144"   "D144_b"
    [69] "D145"   "D145_b" "D146"   "D146_b" "D147"   "D147_b" "D148"   "D148_b"
    # D118 is showing up as "test" for some reason (checked against the .iqdat file), and D130_b is missing
    # both of D130's and D142's visits were entered as "D130"/"D142", so change the subject ID for the visit on 052416 to D130_b and on 
    raw_r1$subject[raw_r1$date == 020916] <- "D118"
    raw_r1$subject[raw_r1$date == 052416] <- "D130_b"
    raw_r1$subject[raw_r1$date == 111516] <- "D142_b"
    # fixing some other stuff in a similar vein
    raw_r1$subject[raw_r1$subject == "D101_2"] <- "D101_b"
    raw_r1$subject[raw_r1$subject == "D102_B"] <- "D102_b"
    raw_r1$subject[raw_r1$subject == "D117_b"] <- "D117"
    raw_r1$subject[raw_r1$subject == "D117_c"] <- "D117_b"
    raw_r1$subject[raw_r1$subject == "D135_c"] <- "D135_b"
    u <- unique(raw_r1$subject)
    length(u) # 78 unique - that is correct
    [1] 78
    unique(raw_r2$subject)
     [1] "D101"     "D101_2Y"  "D102"     "D102_B"   "D103"     "D103_b"   "D104"     "D104_b"   "D105"     "D105_b"   "D107"     "D107_B_2" "D110"    
    [14] "D110_b"   "D113"     "D113_b"   "D114"     "D114_b"   "D115"     "D115_b"   "D117_b"   "D117_c"   "D118"     "D118_b"   "D119"     "D119_b"  
    [27] "D120"     "D120_b"   "D121"     "D121_b"   "D122"     "D122_b"   "D123"     "D123_b"   "D125"     "D125_b"   "D126"     "D126_B"   "D127"    
    [40] "D127_b"   "D128"     "D128_b"   "D129"     "D129_b"   "D130"     "D130_b"   "D131"     "D131_b"   "D132"     "D132_b"   "D133"     "D133_b"  
    [53] "D134"     "D134_b"   "D135"     "D135_c"   "D137"     "D137_b"   "D138"     "D138_b"   "D139"     "D139_b"   "D140"     "D140_b"   "D141"    
    [66] "D141_b"   "D142"     "D144"     "D144_b"   "D145"     "D145_b"   "D146"     "D146_b"   "D147"     "D147_b"   "D148"     "D148_b"  
    # some similar issues to fix
    raw_r2$subject[raw_r2$subject == "D101_2Y"] <- "D101_b"
    raw_r2$subject[raw_r2$subject == "D102_B"] <- "D102_b"
    raw_r2$subject[raw_r2$subject == "D107_B_2"] <- "D107_b"
    raw_r2$subject[raw_r2$subject == "D117_b"] <- "D117"
    raw_r2$subject[raw_r2$subject == "D117_c"] <- "D117_b"
    raw_r2$subject[raw_r2$subject == "D126_B"] <- "D126_b"
    raw_r2$subject[raw_r2$subject == "D135_c"] <- "D135_b"
    raw_r2$subject[raw_r2$date == 111516] <- "D142_b"
    u <- unique(raw_r2$subject) 
    length(u) # 78 unique - that is correct
    [1] 78
    str(raw_r1)
    'data.frame':   25746 obs. of  10 variables:
     $ date                  : int  101515 101515 101515 101515 101515 101515 101515 101515 101515 101515 ...
     $ time                  : chr  "15:38:09" "15:38:09" "15:38:09" "15:38:09" ...
     $ subject               : chr  "D101" "D101" "D101" "D101" ...
     $ blockcode             : chr  "AATpracticeB" "AATpracticeB" "AATpracticeB" "AATpracticeB" ...
     $ blocknum              : chr  "2" "2" "2" "2" ...
     $ trialcode             : chr  "practicetrial_B" "practiceincrease" "practiceincrease" "practiceincrease" ...
     $ values.trialcode      : chr  "practicetrial_B" "practicetrial_B" "practicetrial_B" "practicetrial_B" ...
     $ values.stimulus       : chr  "grayrectangle_Y.jpg" "grayrectangle_Y.jpg" "grayrectangle_Y.jpg" "grayrectangle_Y.jpg" ...
     $ values.initialresponse: chr  "PULL" "PULL" "PULL" "PULL" ...
     $ values.RT             : num  1411 1411 1411 1411 1411 ...
    str(raw_r2)
    'data.frame':   25457 obs. of  10 variables:
     $ date                  : int  101515 101515 101515 101515 101515 101515 101515 101515 101515 101515 ...
     $ time                  : chr  "15:48:12" "15:48:12" "15:48:12" "15:48:12" ...
     $ subject               : chr  "D101" "D101" "D101" "D101" ...
     $ blockcode             : chr  "AATpracticeA" "AATpracticeA" "AATpracticeA" "AATpracticeA" ...
     $ blocknum              : chr  "2" "2" "2" "2" ...
     $ trialcode             : chr  "practicetrial_A" "practicedecrease" "practicedecrease" "practicedecrease" ...
     $ values.trialcode      : chr  "practicetrial_A" "practicetrial_A" "practicetrial_A" "practicetrial_A" ...
     $ values.stimulus       : chr  "grayrectangle_B.jpg" "grayrectangle_B.jpg" "grayrectangle_B.jpg" "grayrectangle_B.jpg" ...
     $ values.initialresponse: chr  "PUSH" "PUSH" "PUSH" "PUSH" ...
     $ values.RT             : num  1472 1472 1472 1472 1472 ...
    # take out ITIs (inter-trial intervals)
    unique(raw_r1$trialcode)
    r1 <- filter(raw_r1, grepl("^A",trialcode))
    unique(r1$trialcode)
    
    unique(raw_r2$trialcode)
    r2 <- filter(raw_r2, grepl("^A",trialcode))
    unique(r2$trialcode)
    
    # add a "trialnum" variable, grouped by ID
    r1 <- r1 %>% group_by(subject) %>% mutate(trialnum = row_number())
    View(r2)
    r2 <- r2 %>% group_by(subject) %>% mutate(trialnum = row_number())
    View(r2)
    
    r1 %>% group_by(trialnum) %>% count(trialnum) # everyone has 144 trials, hooray! (look at n for each trialnum, should = 78)
    r2 %>% group_by(trialnum) %>% count(trialnum) # everyone has 144 trials, one person has 177
    r2 %>% filter(trialnum >144)

    I do recall one scan session where Inquisit had some kind of hiccup and the task kept going beyond the end of the fMRI sequence so we had to force-quit it. D122 has complete data from the first 144 trials, so we can just drop the extra ones.

    r2 <- filter(r2, trialnum <=144) # remove trials 145-177 for D122_b
    r2 %>% filter(trialnum >144)
    # now everyone has 144 trials
    # add a column for "run"
    r1$run <- "1"
    r2$run <- "2"
    # add a column for "visit"
    r1$visit <- as.factor(ifelse(grepl("*_b", r1$subject), "2", "1"))
    r2$visit <- as.factor(ifelse(grepl("*_b", r2$subject), "2", "1"))
    r1 %>% group_by(subject) %>% count(visit) # all looks good
    r2 %>% group_by(subject) %>% count(visit) # all looks good
    # now remove the "_b" from visit 2 IDs
    r1 <- r1 %>% ungroup() %>%
      mutate(subject = str_replace(subject, "_b", ""))
    unique(r1$subject)
     [1] "D101" "D102" "D103" "D104" "D105" "D107" "D110" "D113" "D114" "D115" "D117" "D118" "D119" "D120" "D121" "D122" "D123" "D125" "D126" "D127" "D128"
    [22] "D129" "D130" "D131" "D132" "D133" "D134" "D135" "D137" "D138" "D139" "D140" "D141" "D142" "D144" "D145" "D146" "D147" "D148"
    r2 <- r2 %>% ungroup() %>%
      mutate(subject = str_replace(subject, "_b", ""))
    unique(r2$subject)
     [1] "D101" "D102" "D103" "D104" "D105" "D107" "D110" "D113" "D114" "D115" "D117" "D118" "D119" "D120" "D121" "D122" "D123" "D125" "D126" "D127" "D128"
    [22] "D129" "D130" "D131" "D132" "D133" "D134" "D135" "D137" "D138" "D139" "D140" "D141" "D142" "D144" "D145" "D146" "D147" "D148"
    # merge data from the 2 runs 
    bx <- bind_rows(r1, r2)
    # split up by visit
    v1 <- bx %>% filter(visit == "1")
    v2 <- bx %>% filter(visit == "2")
    # check that everyone has 144 trials
    v1 %>% filter(trialnum >144)
    v2 %>% filter(trialnum >144)
    # add columns for "tx" at visit 1 and visit 2 [treatment: A or B]
    # load in the randomization data
    randomize <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/randomization.rds")
    head(randomize)
    v1 <- v1 %>%
      rename("ID" = subject)
    v2 <- v2 %>%
      rename("ID" = subject)
    # get the IDs for everyone who got treatment A at visit 1 
    IDs_v1_txA <- randomize %>% filter(tx_v1 == "A")
    IDs_v1_txA
    # ifelse statement: if ID = any of those listed in IDs_v1_txA, make tx_v1 = "A", else make it "B"
    v1 <- v1 %>%
      mutate(tx_v1 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "A", "B")), tx_v2 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "B", "A")))
    head(v1)
    # ifelse statement: if ID = any of those listed in IDs_v1_txA, make tx_v2 = "B", else make it "A" (people who were A at visit 1 should be B for visit 2, and vice versa)
    v2 <- v2 %>%
      mutate(tx_v2 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "B", "A")), tx_v1 = as.factor(ifelse(ID == "D101" | ID == "D105" | ID == "D109" | ID == "D110" | ID == "D114" | ID == "D115" | ID == "D116" | ID == "D118" | ID == "D119" | ID == "D120" | ID == "D123" | ID == "D124" | ID == "D126" | ID == "D128" | ID == "D132" | ID == "D135" | ID == "D136" | ID == "D137" | ID == "D138" | ID == "D140" | ID == "D141" | ID == "D145" | ID == "D148" | ID == "D149" | ID == "D117", "A", "B")))
    levels(v1$tx_v1)
    [1] "A" "B"
    levels(v2$tx_v2)
    [1] "A" "B"
    head(v1)
      
    IDs_v1_txA$ID
     [1] "D101" "D105" "D109" "D110" "D114" "D115" "D116" "D118" "D119" "D120" "D123" "D124" "D126" "D128" "D132" "D135" "D136" "D137" "D138" "D140" "D141"
    [22] "D145" "D148" "D149" "D117"
    v1 %>% group_by(tx_v1) %>% count(ID) # IDs and tx match txA_list
    v2 %>% group_by(tx_v2) %>% count(ID) # IDs and tx match txA_list
    bx <- bind_rows(v1,v2)
    View(bx)
    # rename some variables
    colnames(bx)
     [1] "date"                   "time"                   "ID"                     "blockcode"              "blocknum"               "trialcode"             
     [7] "values.trialcode"       "values.stimulus"        "values.initialresponse" "values.RT"              "trialnum"               "run"                   
    [13] "visit"                  "tx_v1"                  "tx_v2"                 
    bx <- bx %>% rename("push_pull" = values.initialresponse,
                      "gAAT_RT" = values.RT) %>% mutate(push_pull = as.factor(push_pull))
    head(bx)
    # add a new variable for treatment
    bx1 <- bx %>% mutate(tx = as.factor(ifelse(tx_v1 == "A" & visit == "1", "A",
                                  ifelse(tx_v2 == "A" & visit == "2", "A",
                                        ifelse(tx_v1 == "B" & visit == "1", "B",
                                               ifelse(tx_v2 == "B" & visit == "2", "B", NA))))))
    # check that it coded the 'tx' column correctly  
    bx1 %>% filter(ID == "D101" & visit == "1") # 'tx' should be A
    bx1 %>% filter(ID == "D101" & visit == "2") # 'tx' should be B
    # add a new variable for stimulus category
    # in values.stimulus:
    # 1 = spouse, 2 = living loved one/WHOTO, 3 = stranger, 4 = nomothetic death-related, 5 = neutral images
    sort(unique(bx1$values.stimulus))
     [1] "1B_1.jpg" "1B_2.jpg" "1B_3.jpg" "1Y_1.jpg" "1Y_2.jpg" "1Y_3.jpg" "2B_1.jpg" "2B_2.jpg" "2B_3.jpg" "2Y_1.jpg" "2Y_2.jpg" "2Y_3.jpg" "3B_1.jpg"
    [14] "3B_2.jpg" "3B_3.jpg" "3Y_1.jpg" "3Y_2.jpg" "3Y_3.jpg" "4B_1.jpg" "4B_2.jpg" "4B_3.jpg" "4Y_1.jpg" "4Y_2.jpg" "4Y_3.jpg" "5B_1.jpg" "5B_2.jpg"
    [27] "5B_3.jpg" "5Y_1.jpg" "5Y_2.jpg" "5Y_3.jpg"
    bx2 <- bx1 %>%
      mutate(stim = as.factor(ifelse(values.stimulus == "1B_1.jpg"|values.stimulus == "1B_2.jpg"|values.stimulus == "1B_3.jpg"|values.stimulus == "1Y_1.jpg"|values.stimulus == "1Y_2.jpg"|values.stimulus == "1Y_3.jpg", "spouse", 
                           ifelse(values.stimulus == "2B_1.jpg"|values.stimulus == "2B_2.jpg"|values.stimulus == "2B_3.jpg"|values.stimulus == "2Y_1.jpg"|values.stimulus == "2Y_2.jpg"|values.stimulus == "2Y_3.jpg", "living",
                                  ifelse(values.stimulus == "3B_1.jpg"|values.stimulus == "3B_2.jpg"|values.stimulus == "3B_3.jpg"|values.stimulus == "3Y_1.jpg"|values.stimulus == "3Y_2.jpg"|values.stimulus == "3Y_3.jpg", "stranger",
                                         ifelse(values.stimulus == "4B_1.jpg"|values.stimulus == "4B_2.jpg"|values.stimulus == "4B_3.jpg"|values.stimulus == "4Y_1.jpg"|values.stimulus == "4Y_2.jpg"|values.stimulus == "4Y_3.jpg", "death",
                                                ifelse(values.stimulus == "5B_1.jpg"|values.stimulus == "5B_2.jpg"|values.stimulus == "5B_3.jpg"|values.stimulus == "5Y_1.jpg"|values.stimulus == "5Y_2.jpg"|values.stimulus == "5Y_3.jpg", "neutral", NA)))))))
    levels(bx2$stim)
    [1] "death"    "living"   "neutral"  "spouse"   "stranger"
    bx2$stim <- relevel(bx2$stim, ref = "neutral") # make neutral the reference level

    13.1.1 Remove outliers

    The top and bottom 1% of RTs will be removed as part of conventional data cleaning for this task.

    p99 <- quantile(bx2$gAAT_RT, 0.99) 
    p01 <- quantile(bx2$gAAT_RT, 0.01) 
    # drop top and bottom 1% of RTs and remove outliers from data
    bx2 <- bx2 %>% mutate(outlier_RT = as.factor(ifelse(gAAT_RT <= p01 | gAAT_RT >= p99, 1, 0))) %>% filter(outlier_RT == "0") 

    Assuming a 10% threshold for missed trials, find out if anyone’s missing more than this.

    288-(288*.10) # based on the 10% cutoff, people should have at least 259 trials
    [1] 259.2
    n <- bx2 %>% group_by(ID) %>% group_by(tx) %>% count(ID)
    n %>% filter(n < 259) # does anyone have fewer than 259? yes, D107 has only 248

    Save the long dataset.

    # save it
    saveRDS(bx2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/gAAT_long.rds")
    write.csv(bx2, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/gAAT_long.csv")

    13.1.2 Long to wide

    Next step: subsetting and taking data from long to wide.

    # Subset by stimulus category and treatment
    ## image filenames ('values.stimulus') starting with 1 = spouse, 2 = WHOTO, 3 = stranger, 4 = nomothetic death, 5 = neutral images
    spouse_push_A <- filter(bx2, grepl("1B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("A",tx))
    spouse_push_B <- filter(bx2, grepl("1B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("B",tx))
    spouse_pull_A <- filter(bx2, grepl("1B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("A",tx))
    spouse_pull_B <- filter(bx2, grepl("1B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("B",tx))
    whoto_push_A <- filter(bx2, grepl("2B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("A",tx))
    whoto_push_B <- filter(bx2, grepl("2B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("B",tx))
    whoto_pull_A <- filter(bx2, grepl("2B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("A",tx))
    whoto_pull_B <- filter(bx2, grepl("2B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("B",tx))
    stranger_push_A <- filter(bx2, grepl("3B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("A",tx))
    stranger_push_B <- filter(bx2, grepl("3B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("B",tx))
    stranger_pull_A <- filter(bx2, grepl("3B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("A",tx))
    stranger_pull_B <- filter(bx2, grepl("3B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("B",tx))
    death_push_A <- filter(bx2, grepl("4B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("A",tx))
    death_push_B <- filter(bx2, grepl("4B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("B",tx))
    death_pull_A <- filter(bx2, grepl("4B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("A",tx))
    death_pull_B <- filter(bx2, grepl("4B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("B",tx))
    neutral_push_A <- filter(bx2, grepl("5B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("A",tx))
    neutral_push_B <- filter(bx2, grepl("5B_|1Y_",values.stimulus) & grepl("PUSH",push_pull) & grepl("B",tx))
    neutral_pull_A <- filter(bx2, grepl("5B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("A",tx))
    neutral_pull_B <- filter(bx2, grepl("5B_|1Y_",values.stimulus) & grepl("PULL",push_pull) & grepl("B",tx))
    # Summarize RTs
    spouse_push_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> spouse_push_A.1
    spouse_push_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> spouse_push_B.1
    spouse_pull_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> spouse_pull_A.1
    spouse_pull_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> spouse_pull_B.1
    whoto_push_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> whoto_push_A.1
    whoto_push_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> whoto_push_B.1
    whoto_pull_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> whoto_pull_A.1
    whoto_pull_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> whoto_pull_B.1
    stranger_push_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> stranger_push_A.1
    stranger_push_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> stranger_push_B.1
    stranger_pull_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> stranger_pull_A.1
    stranger_pull_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> stranger_pull_B.1
    death_push_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> death_push_A.1
    death_push_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> death_push_B.1
    death_pull_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> death_pull_A.1
    death_pull_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> death_pull_B.1
    neutral_push_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> neutral_push_A.1
    neutral_push_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> neutral_push_B.1
    neutral_pull_A %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> neutral_pull_A.1
    neutral_pull_B %>% group_by(ID) %>% summarise_at(vars(gAAT_RT), median, na.rm = FALSE) -> neutral_pull_B.1
    # add a suffix (for the wide dataset)
    spouse_push_A.2 <- spouse_push_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_spouse_push_A"))
    spouse_push_B.2 <- spouse_push_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_spouse_push_B"))
    spouse_pull_A.2 <- spouse_pull_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_spouse_pull_A"))
    spouse_pull_B.2 <- spouse_pull_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_spouse_pull_B"))
    whoto_push_A.2 <- whoto_push_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_whoto_push_A"))
    whoto_push_B.2 <- whoto_push_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_whoto_push_B"))
    whoto_pull_A.2 <- whoto_pull_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_whoto_pull_A"))
    whoto_pull_B.2 <- whoto_pull_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_whoto_pull_B"))
    stranger_push_A.2 <- stranger_push_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_stranger_push_A"))
    stranger_push_B.2 <- stranger_push_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_stranger_push_B"))
    stranger_pull_A.2 <- stranger_pull_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_stranger_pull_A"))
    stranger_pull_B.2 <- stranger_pull_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_stranger_pull_B"))
    death_push_A.2 <- death_push_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_death_push_A"))
    death_push_B.2 <- death_push_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_death_push_B"))
    death_pull_A.2 <- death_pull_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_death_pull_A"))
    death_pull_B.2 <- death_pull_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_death_pull_B"))
    neutral_push_A.2 <- neutral_push_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_neutral_push_A"))
    neutral_push_B.2 <- neutral_push_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_neutral_push_B"))
    neutral_pull_A.2 <- neutral_pull_A.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_neutral_pull_A"))
    neutral_pull_B.2 <- neutral_pull_B.1 %>%
      rename_at(vars(gAAT_RT),function(x) paste0(x,"_neutral_pull_B"))
    # merge
    data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu_addvars_rest.rds")
    IDs <- data.frame(data$ID)
    IDs <- IDs %>% rename(ID = data.ID)
    join1bx <- left_join(data, spouse_pull_A.2, by="ID")
    join2bx <- left_join(join1bx, spouse_pull_B.2, by="ID")
    join3bx <- left_join(join2bx, spouse_push_A.2, by="ID")
    join4bx <- left_join(join3bx, spouse_push_B.2, by="ID")
    join5bx <- left_join(join4bx, stranger_pull_A.2, by="ID")
    join6bx <- left_join(join5bx, stranger_pull_B.2, by="ID")
    join7bx <- left_join(join6bx, stranger_push_A.2, by="ID")
    join8bx <- left_join(join7bx, stranger_push_B.2, by="ID")
    join9bx <- left_join(join8bx, whoto_pull_A.2, by="ID")
    join10bx <- left_join(join9bx, whoto_pull_B.2, by="ID")
    join11bx <- left_join(join10bx, whoto_push_A.2, by="ID")
    join12bx <- left_join(join11bx, whoto_push_B.2, by="ID")
    join13bx <- left_join(join12bx, neutral_pull_A.2, by="ID")
    join14bx <- left_join(join13bx, neutral_pull_B.2, by="ID")
    join15bx <- left_join(join14bx, neutral_push_A.2, by="ID")
    join16bx <- left_join(join15bx, neutral_push_B.2, by="ID")
    join17bx <- left_join(join16bx, death_pull_A.2, by="ID")
    join18bx <- left_join(join17bx, death_pull_B.2, by="ID")
    join19bx <- left_join(join18bx, death_push_A.2, by="ID")
    join20bx <- left_join(join19bx, death_push_B.2, by="ID")
    data <- join20bx
    saveRDS(data, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/selfreports_oxtr_cortisol_random_AB_20mfu_addvars_rest_gAAT.rds")
    gAAT_wide <- join20bx[, grep('^ID|gAAT', names(data))]
    saveRDS(gAAT_wide, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/gAAT_wide.rds")
    write.csv(gAAT_wide, "~/Dropbox/GLASS Lab/OT Study/data/cleaned-data/gAAT_wide.csv")

    14 Medication variables

    # make a variable for total number of Rx meds
    data_meds <- data_meds %>% 
      separate_rows(meds_rxonly) %>% 
      filter(meds_rxonly != '') %>% 
      group_by(ID) %>% 
      summarise(meds_total = n_distinct(meds_rxonly)) %>% left_join(data_meds, .) 
    
    Joining, by = "ID"

    15 Appendix

    15.1 Minor fixes

    Removing/renaming variables that don’t need to be in there:

    data$AATpush1_v1
    
     [1] YELLOW YELLOW BLUE   YELLOW YELLOW YELLOW BLUE   BLUE   BLUE   BLUE   YELLOW YELLOW BLUE   YELLOW YELLOW YELLOW BLUE   YELLOW BLUE   YELLOW YELLOW BLUE   BLUE   BLUE  
    [25] BLUE   BLUE   YELLOW BLUE   YELLOW YELLOW YELLOW YELLOW YELLOW YELLOW YELLOW BLUE   YELLOW BLUE   BLUE   BLUE  
    Levels: BLUE YELLOW

    15.2 Alphabetized list of variables

    names <- names(data)
    cat(sort(names), sep="\n")
    age
    age_yrs
    alcohol
    allergies
    bdi_1
    bdi_10
    bdi_10c
    bdi_11
    bdi_11c
    bdi_12
    bdi_12c
    bdi_13
    bdi_13c
    bdi_14
    bdi_14c
    bdi_15
    bdi_15c
    bdi_16
    bdi_16c
    bdi_17
    bdi_17c
    bdi_18
    bdi_18c
    bdi_19
    bdi_19c
    bdi_1c
    bdi_2
    bdi_20
    bdi_20c
    bdi_21
    bdi_21c
    bdi_2c
    bdi_3
    bdi_3c
    bdi_4
    bdi_4c
    bdi_5
    bdi_5c
    bdi_6
    bdi_6c
    bdi_7
    bdi_7c
    bdi_8
    bdi_8c
    bdi_9
    bdi_9c
    bgq_1
    bgq_2
    bgq_3
    bgq_4
    bgq_5
    bisbas_1
    bisbas_10
    bisbas_10r
    bisbas_11
    bisbas_11r
    bisbas_12
    bisbas_12r
    bisbas_13
    bisbas_13r
    bisbas_14
    bisbas_14r
    bisbas_15
    bisbas_15r
    bisbas_16
    bisbas_16r
    bisbas_17
    bisbas_17r
    bisbas_18
    bisbas_18r
    bisbas_19
    bisbas_19r
    bisbas_1r
    bisbas_2
    bisbas_20
    bisbas_20r
    bisbas_21
    bisbas_21r
    bisbas_22
    bisbas_23
    bisbas_23r
    bisbas_24
    bisbas_24r
    bisbas_3
    bisbas_3r
    bisbas_4
    bisbas_4r
    bisbas_5
    bisbas_5r
    bisbas_6
    bisbas_6r
    bisbas_7
    bisbas_7r
    bisbas_8
    bisbas_8r
    bisbas_9
    bisbas_9r
    caffeine_perday
    caretaker_y
    cortisol_BL_A
    cortisol_BL_B
    cortisol_BL_v1
    cortisol_BL_v2
    cortisol_PO_A
    cortisol_PO_B
    cortisol_PO_v1
    cortisol_PO_v2
    cortisol_PR_A
    cortisol_PR_B
    cortisol_PR_v1
    cortisol_PR_v2
    currenttx_y
    date_followup
    dateofdeath
    dob
    ecrrs_global_1
    ecrrs_global_1c
    ecrrs_global_1r
    ecrrs_global_2
    ecrrs_global_2c
    ecrrs_global_2r
    ecrrs_global_3
    ecrrs_global_3c
    ecrrs_global_3r
    ecrrs_global_4
    ecrrs_global_4c
    ecrrs_global_4r
    ecrrs_global_5
    ecrrs_global_5c
    ecrrs_global_6
    ecrrs_global_6c
    ecrrs_global_7
    ecrrs_global_7c
    ecrrs_global_8
    ecrrs_global_8c
    ecrrs_global_9
    ecrrs_global_9c
    ecrrs_spouse_1
    ecrrs_spouse_1c
    ecrrs_spouse_1r
    ecrrs_spouse_2
    ecrrs_spouse_2c
    ecrrs_spouse_2r
    ecrrs_spouse_3
    ecrrs_spouse_3c
    ecrrs_spouse_3r
    ecrrs_spouse_4
    ecrrs_spouse_4c
    ecrrs_spouse_4r
    ecrrs_spouse_5
    ecrrs_spouse_5c
    ecrrs_spouse_6
    ecrrs_spouse_6c
    ecrrs_spouse_7
    ecrrs_spouse_7c
    ecrrs_spouse_8
    ecrrs_spouse_8c
    ecrrs_spouse_9
    ecrrs_spouse_9c
    education
    education_other
    employment
    ethnicity_hisp
    exercise
    fu_icg_1
    fu_icg_10
    fu_icg_11
    fu_icg_12
    fu_icg_13
    fu_icg_14
    fu_icg_15
    fu_icg_16
    fu_icg_17
    fu_icg_18
    fu_icg_19
    fu_icg_2
    fu_icg_3
    fu_icg_4
    fu_icg_5
    fu_icg_6
    fu_icg_7
    fu_icg_8
    fu_icg_9
    gAAT_push_v1
    gAAT_push_v2
    gAAT_RT_death_pull_A
    gAAT_RT_death_pull_B
    gAAT_RT_death_push_A
    gAAT_RT_death_push_B
    gAAT_RT_neutral_pull_A
    gAAT_RT_neutral_pull_B
    gAAT_RT_neutral_push_A
    gAAT_RT_neutral_push_B
    gAAT_RT_spouse_pull_A
    gAAT_RT_spouse_pull_B
    gAAT_RT_spouse_push_A
    gAAT_RT_spouse_push_B
    gAAT_RT_stranger_pull_A
    gAAT_RT_stranger_pull_B
    gAAT_RT_stranger_push_A
    gAAT_RT_stranger_push_B
    gAAT_RT_whoto_pull_A
    gAAT_RT_whoto_pull_B
    gAAT_RT_whoto_push_A
    gAAT_RT_whoto_push_B
    gcq_1
    gcq_10
    gcq_11
    gcq_12
    gcq_13
    gcq_14
    gcq_15
    gcq_16
    gcq_17
    gcq_18
    gcq_19
    gcq_2
    gcq_20
    gcq_21
    gcq_22
    gcq_23
    gcq_24
    gcq_25
    gcq_26
    gcq_27
    gcq_28
    gcq_29
    gcq_3
    gcq_30
    gcq_31
    gcq_32
    gcq_33
    gcq_34
    gcq_35
    gcq_36
    gcq_37
    gcq_38
    gcq_4
    gcq_5
    gcq_6
    gcq_7
    gcq_8
    gcq_9
    group
    group_20mFU
    hand_1
    hand_10
    hand_10c
    hand_11
    hand_11c
    hand_12
    hand_12c
    hand_1c
    hand_2
    hand_2c
    hand_3
    hand_3c
    hand_4
    hand_4c
    hand_5
    hand_5c
    hand_6
    hand_6c
    hand_7
    hand_7c
    hand_8
    hand_8c
    hand_9
    hand_9c
    hand_bat_1
    hand_bat_1c
    highestdegree
    householdsize
    householdsize_adult
    householdsize_income
    icg_1
    icg_10
    icg_11
    icg_12
    icg_13
    icg_14
    icg_15
    icg_16
    icg_17
    icg_18
    icg_19
    icg_2
    icg_3
    icg_4
    icg_5
    icg_6
    icg_7
    icg_8
    icg_9
    ID
    knowbefore_y
    lastperiod
    learnaboutstudy
    majorhealthprobs_what
    majorhealthprobs_y
    meds_dose
    meds_dx
    meds_hormone_opiate
    meds_hrt
    meds_psychoactive
    meds_rxonly
    meds_total
    meds_which
    meds_y
    n_livebirths
    n_nursed
    n_pregnancies
    OXTR2254298
    OXTR53576
    past2wks_dentist_y
    past2wks_injuryinfect_y
    post_panas_1_v1
    post_panas_1_v2
    post_panas_10_v1
    post_panas_10_v2
    post_panas_11_v1
    post_panas_11_v2
    post_panas_12_v1
    post_panas_12_v2
    post_panas_13_v1
    post_panas_13_v2
    post_panas_14_v1
    post_panas_14_v2
    post_panas_15_v1
    post_panas_15_v2
    post_panas_16_v1
    post_panas_16_v2
    post_panas_17_v1
    post_panas_17_v2
    post_panas_18_v1
    post_panas_18_v2
    post_panas_19_v1
    post_panas_19_v2
    post_panas_2_v1
    post_panas_2_v2
    post_panas_20_v1
    post_panas_20_v2
    post_panas_3_v1
    post_panas_3_v2
    post_panas_4_v1
    post_panas_4_v2
    post_panas_5_v1
    post_panas_5_v2
    post_panas_6_v1
    post_panas_6_v2
    post_panas_7_v1
    post_panas_7_v2
    post_panas_8_v1
    post_panas_8_v2
    post_panas_9_v1
    post_panas_9_v2
    post_sroe_1_A
    post_sroe_1_B
    post_sroe_1_v1
    post_sroe_1_v2
    post_sroe_2_A
    post_sroe_2_B
    post_sroe_2_v1
    post_sroe_2_v2
    post_sroe_3_A
    post_sroe_3_B
    post_sroe_3_v1
    post_sroe_3_v2
    post_stai_1_v1
    post_stai_1_v2
    post_stai_10_v1
    post_stai_10_v2
    post_stai_10r_v1
    post_stai_10r_v2
    post_stai_11_v1
    post_stai_11_v2
    post_stai_11r_v1
    post_stai_11r_v2
    post_stai_12_v1
    post_stai_12_v2
    post_stai_13_v1
    post_stai_13_v2
    post_stai_14_v1
    post_stai_14_v2
    post_stai_15_v1
    post_stai_15_v2
    post_stai_15r_v1
    post_stai_15r_v2
    post_stai_16_v1
    post_stai_16_v2
    post_stai_16r_v1
    post_stai_16r_v2
    post_stai_17_v1
    post_stai_17_v2
    post_stai_18_v1
    post_stai_18_v2
    post_stai_19_v1
    post_stai_19_v2
    post_stai_19r_v1
    post_stai_19r_v2
    post_stai_1r_v1
    post_stai_1r_v2
    post_stai_2_v1
    post_stai_2_v2
    post_stai_20_v1
    post_stai_20_v2
    post_stai_20r_v1
    post_stai_20r_v2
    post_stai_2r_v1
    post_stai_2r_v2
    post_stai_3_v1
    post_stai_3_v2
    post_stai_4_v1
    post_stai_4_v2
    post_stai_5_v1
    post_stai_5_v2
    post_stai_5r_v1
    post_stai_5r_v2
    post_stai_6_v1
    post_stai_6_v2
    post_stai_7_v1
    post_stai_7_v2
    post_stai_8_v1
    post_stai_8_v2
    post_stai_8r_v1
    post_stai_8r_v2
    post_stai_9_v1
    post_stai_9_v2
    postmenopausal_y
    ppss_fa_1
    ppss_fa_10
    ppss_fa_11
    ppss_fa_12
    ppss_fa_13
    ppss_fa_14
    ppss_fa_15
    ppss_fa_16
    ppss_fa_16r
    ppss_fa_17
    ppss_fa_18
    ppss_fa_19
    ppss_fa_19r
    ppss_fa_2
    ppss_fa_20
    ppss_fa_20r
    ppss_fa_3
    ppss_fa_3r
    ppss_fa_4
    ppss_fa_4r
    ppss_fa_5
    ppss_fa_6
    ppss_fa_7
    ppss_fa_8
    ppss_fa_9
    ppss_fr_1
    ppss_fr_10
    ppss_fr_11
    ppss_fr_12
    ppss_fr_13
    ppss_fr_14
    ppss_fr_15
    ppss_fr_15r
    ppss_fr_16
    ppss_fr_17
    ppss_fr_18
    ppss_fr_18r
    ppss_fr_19
    ppss_fr_2
    ppss_fr_20
    ppss_fr_20r
    ppss_fr_2r
    ppss_fr_3
    ppss_fr_4
    ppss_fr_5
    ppss_fr_6
    ppss_fr_6r
    ppss_fr_7
    ppss_fr_7r
    ppss_fr_8
    ppss_fr_9
    pre_panas_1_v1
    pre_panas_1_v2
    pre_panas_10_v1
    pre_panas_10_v2
    pre_panas_11_v1
    pre_panas_11_v2
    pre_panas_12_v1
    pre_panas_12_v2
    pre_panas_13_v1
    pre_panas_13_v2
    pre_panas_14_v1
    pre_panas_14_v2
    pre_panas_15_v1
    pre_panas_15_v2
    pre_panas_16_v1
    pre_panas_16_v2
    pre_panas_17_v1
    pre_panas_17_v2
    pre_panas_18_v1
    pre_panas_18_v2
    pre_panas_19_v1
    pre_panas_19_v2
    pre_panas_2_v1
    pre_panas_2_v2
    pre_panas_20_v1
    pre_panas_20_v2
    pre_panas_3_v1
    pre_panas_3_v2
    pre_panas_4_v1
    pre_panas_4_v2
    pre_panas_5_v1
    pre_panas_5_v2
    pre_panas_6_v1
    pre_panas_6_v2
    pre_panas_7_v1
    pre_panas_7_v2
    pre_panas_8_v1
    pre_panas_8_v2
    pre_panas_9_v1
    pre_panas_9_v2
    pre_stai_1_v1
    pre_stai_1_v2
    pre_stai_10_v1
    pre_stai_10_v2
    pre_stai_10r_v1
    pre_stai_10r_v2
    pre_stai_11_v1
    pre_stai_11_v2
    pre_stai_11r_v1
    pre_stai_11r_v2
    pre_stai_12_v1
    pre_stai_12_v2
    pre_stai_13_v1
    pre_stai_13_v2
    pre_stai_14_v1
    pre_stai_14_v2
    pre_stai_15_v1
    pre_stai_15_v2
    pre_stai_15r_v1
    pre_stai_15r_v2
    pre_stai_16_v1
    pre_stai_16_v2
    pre_stai_16r_v1
    pre_stai_16r_v2
    pre_stai_17_v1
    pre_stai_17_v2
    pre_stai_18_v1
    pre_stai_18_v2
    pre_stai_19_v1
    pre_stai_19_v2
    pre_stai_19r_v1
    pre_stai_19r_v2
    pre_stai_1r_v1
    pre_stai_1r_v2
    pre_stai_2_v1
    pre_stai_2_v2
    pre_stai_20_v1
    pre_stai_20_v2
    pre_stai_20r_v1
    pre_stai_20r_v2
    pre_stai_2r_v1
    pre_stai_2r_v2
    pre_stai_3_v1
    pre_stai_3_v2
    pre_stai_4_v1
    pre_stai_4_v2
    pre_stai_5_v1
    pre_stai_5_v2
    pre_stai_5r_v1
    pre_stai_5r_v2
    pre_stai_6_v1
    pre_stai_6_v2
    pre_stai_7_v1
    pre_stai_7_v2
    pre_stai_8_v1
    pre_stai_8_v2
    pre_stai_8r_v1
    pre_stai_8r_v2
    pre_stai_9_v1
    pre_stai_9_v2
    pss_1
    pss_10
    pss_2
    pss_3
    pss_4
    pss_4r
    pss_5
    pss_5r
    pss_6
    pss_7
    pss_7r
    pss_8
    pss_8r
    pss_9
    race
    race_other
    rs2254298
    rs2254298_A.carrier
    rs2268498
    rs2268498_C.carrier
    rs53576
    rs53576_A.carrier
    sex_m
    smoking_howlong
    smoking_perday
    smoking_y
    srrs_1
    srrs_10
    srrs_11
    srrs_12
    srrs_13
    srrs_14
    srrs_15
    srrs_16
    srrs_17
    srrs_18
    srrs_19
    srrs_2
    srrs_20
    srrs_21
    srrs_22
    srrs_23
    srrs_24
    srrs_25
    srrs_26
    srrs_27
    srrs_28
    srrs_29
    srrs_3
    srrs_30
    srrs_31
    srrs_32
    srrs_33
    srrs_34
    srrs_35
    srrs_36
    srrs_37
    srrs_38
    srrs_39
    srrs_4
    srrs_40
    srrs_41
    srrs_42
    srrs_43
    srrs_44
    srrs_45
    srrs_46
    srrs_47
    srrs_48
    srrs_49
    srrs_5
    srrs_50
    srrs_51
    srrs_6
    srrs_7
    srrs_8
    srrs_9
    startdate
    surgeries_past6mos
    timesincedeath
    timeto20mFU
    timeto20mFU_mos
    timetorest_A
    timetorest_B
    tot_bdi
    tot_bgq
    tot_bisbas_basdr
    tot_bisbas_basfun
    tot_bisbas_basrr
    tot_bisbas_bis
    tot_ecrrs_global_anx
    tot_ecrrs_global_avoid
    tot_ecrrs_spouse_anx
    tot_ecrrs_spouse_avoid
    tot_gcq_approp
    tot_gcq_blame
    tot_gcq_cherish
    tot_gcq_future
    tot_gcq_life
    tot_gcq_others
    tot_gcq_self
    tot_gcq_threat
    tot_gcq_world
    tot_handedness
    tot_icg
    tot_icg_20mFU
    tot_post_panas_na_A
    tot_post_panas_na_B
    tot_post_panas_na_v1
    tot_post_panas_na_v2
    tot_post_panas_pa_A
    tot_post_panas_pa_B
    tot_post_panas_pa_v1
    tot_post_panas_pa_v2
    tot_post_stai_A
    tot_post_stai_B
    tot_post_stai_v1
    tot_post_stai_v2
    tot_ppss_fa
    tot_ppss_fr
    tot_pre_panas_na_A
    tot_pre_panas_na_B
    tot_pre_panas_na_v1
    tot_pre_panas_na_v2
    tot_pre_panas_pa_A
    tot_pre_panas_pa_B
    tot_pre_panas_pa_v1
    tot_pre_panas_pa_v2
    tot_pre_stai_A
    tot_pre_stai_B
    tot_pre_stai_v1
    tot_pre_stai_v2
    tot_pss
    tot_srrs
    tot_srrs_n
    tot_ucla_loneliness
    tot_ysl
    tx_v1
    tx_v2
    ucla_loneliness_1
    ucla_loneliness_10
    ucla_loneliness_10r
    ucla_loneliness_11
    ucla_loneliness_12
    ucla_loneliness_13
    ucla_loneliness_14
    ucla_loneliness_15
    ucla_loneliness_15r
    ucla_loneliness_16
    ucla_loneliness_16r
    ucla_loneliness_17
    ucla_loneliness_18
    ucla_loneliness_19
    ucla_loneliness_19r
    ucla_loneliness_1r
    ucla_loneliness_2
    ucla_loneliness_20
    ucla_loneliness_20r
    ucla_loneliness_3
    ucla_loneliness_4
    ucla_loneliness_5
    ucla_loneliness_5r
    ucla_loneliness_6
    ucla_loneliness_6r
    ucla_loneliness_7
    ucla_loneliness_8
    ucla_loneliness_9
    ucla_loneliness_9r
    yrs_together
    ysl_1
    ysl_10
    ysl_11
    ysl_12
    ysl_13
    ysl_14
    ysl_15
    ysl_16
    ysl_17
    ysl_18
    ysl_19
    ysl_2
    ysl_20
    ysl_21
    ysl_3
    ysl_4
    ysl_5
    ysl_6
    ysl_7
    ysl_8
    ysl_9
    LS0tCnRpdGxlOiAiUmVwcm9kdWNpYmxlIERhdGEgQ2xlYW5pbmcgZm9yIE9UIGZNUkkgU3R1ZHkiCmF1dGhvcjogIlNhcmVuIFNlZWxleSIKZGF0ZTogIkxhc3QgdXBkYXRlZCAwMi0wNy0yMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCi0tLQoKIyBPdmVydmlldwpfVGhlIGV4YWN0IG9yZGVyIG9mIHRoZXNlIHN0ZXBzIG1heSB2YXJ5LCBkZXBlbmRpbmcgb24geW91ciBkYXRhIGFuZCB3aGF0IHlvdSBuZWVkIHRvIGRvIHdpdGggaXQuXwoKMS4gQ3JlYXRlIGNvZGVib29rLgo8dWw+MWEuIENvbnNpZGVyIGFsc28gPGEgaHJlZj0iaHR0cDovL2hlbHAub3NmLmlvL20vYmVzdHByYWN0aWNlcy9sLzYxODc2Ny1ob3ctdG8tbWFrZS1hLWRhdGEtZGljdGlvbmFyeSI+Y3JlYXRpbmcgYSBkYXRhIGRpY3Rpb25hcnk8L2E+LCBlc3BlY2lhbGx5IGlmIHlvdXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIG90aGVycyBvdXRzaWRlIG9mIHlvdXIgbGFiLiA8L3VsPgoyLiBFeHBvcnQgZGF0YSBmcm9tIFF1YWx0cmljcyAob3Igb3RoZXIgc291cmNlKS4KMy4gSW1wb3J0IGRhdGEgdG8gUiAob3Igb3RoZXIgc3RhdHMgcHJvZ3JhbSkuCjQuIENsZWFuaW5nIGFuZCBvcmdhbml6aW5nIGRhdGE6Cjx1bD40YS4gR2V0IHJpZCBvZiBRdWFsdHJpY3MganVuay9ub24tc3R1ZHkgSURzIChlLmcuLCB0ZXN0IHJlc3BvbnNlcywgcGlsb3QgZGF0YSkuPC91bD4KPHVsPjRiLiBUaWR5IHlvdXIgZGF0YTo8L3VsPgo8dWw+KyAiVGlkeSIgZGF0YSBoYXMgYSBiYXNpYyBzdHJ1Y3R1cmU6Cjx1bD4rIEVhY2ggdmFyaWFibGUgZm9ybXMgYSBjb2x1bW4uPC91bD48L3VsPgo8dWw+KyBFYWNoIG9ic2VydmF0aW9uIGZvcm1zIGEgcm93LjwvdWw+PC91bD4KPHVsPisgRWFjaCB0eXBlIG9mIG9ic2VydmF0aW9uYWwgdW5pdCBmb3JtcyBhIHRhYmxlLjwvdWw+PC91bD4KPC91bD48L3VsPjwvdWw+PC91bD4KPHVsPisgVGlkeSBkYXRhIGlzIGVhc3kgdG8gbWFuaXB1bGF0ZSwgbW9kZWwsIHZpc3VhbGl6ZSwgYW5kIG1ha2VzIGl0IHNpbXBsZSB0byBkaXNjZXJuIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2YXJpYWJsZXMgWyhXaWNraGFtLCAyMDE0KV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3RpZHlyL3ZpZ25ldHRlcy90aWR5LWRhdGEuaHRtbCkuPC91bD48L3VsPjwvdWw+Cjx1bD40Yy4gUmVuYW1lIHZhcmlhYmxlcy48L3VsPgo8dWw+NGQuIFJlY29kZSB2YXJpYWJsZXMsIGNvbnZlcnQgdG8gYXBwcm9wcmlhdGUgdHlwZSAobnVtZXJpYywgaW50ZWdlciwgZmFjdG9yLCBldGMuKSwgYW5kIGxhYmVsIGFuZCBvcmRlciBmYWN0b3IgbGV2ZWxzLgo8dWw+KyBUaGlzIGluY2x1ZGVzIGRlZmluaW5nIGFuZCBhc3NpZ25pbmcgbWlzc2luZyB2YWx1ZXMgYXMgbmVjZXNzYXJ5LjwvdWw+PC91bD48L3VsPgo8dWw+NGUuIENvbXB1dGUgbmV3IHZhcmlhYmxlcyBmb3IgYW55IHNjb3JlZCBtZWFzdXJlcy48L3VsPgo8dWw+NGYuIENyZWF0ZSBmaWx0ZXIgdmFyaWFibGVzIChpZiBhbmFseXNlcyBhcmUgdG8gYmUgcnVuIG9uIHN1YnNldChzKSBvZiBwYXJ0aWNpcGFudHMgaW4gdGhlIGRhdGFzZXQpLjwvdWw+Cjx1bD40Zy4gTWVyZ2luZyBkYXRhc2V0cyAoaWYgZGF0YSBmcm9tIG11bHRpcGxlIHNvdXJjZXMgbmVlZHMgdG8gYmUgY29tYmluZWQpLjwvdWw+Cjx1bD4rIENsZWFuIChhbmQgc2F2ZSkgZWFjaCBkYXRhc2V0IGluZGl2aWR1YWxseSwgdGhlbiBtZXJnZS48L3VsPjwvdWw+Cjx1bD4rIENyZWF0ZSBrZXkgdmFyaWFibGUgKHVzdWFsbHkgcGFydGljaXBhbnQgSUQpIHRoYXQgY2FuIGJlIG1hdGNoZWQgYWNyb3NzIGRhdGFzZXRzLjx1bD4gPC91bD4KNS4gRXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcy4KPHVsPjVhLiBfTG9vayBhdCB5b3VyIGRhdGEhXwo8dWw+KyBIaXN0b2dyYW1zLCBib3hwbG90cywgc2NhdHRlcnBsb3RzLjwvdWw+PC91bD48L3VsPgo8dWw+NWIuIEZvciBldmVyeSB2YXJpYWJsZSwgY2hlY2s6IAo8dWw+KyBEaXN0cmlidXRpb24gYW5kIGZyZXF1ZW5jaWVzIDwvdWw+Cjx1bD4rIFJhbmdlLCBzdGFuZGFyZCBkZXZpYXRpb25zLCBza2V3L2t1cnRvc2lzLCBvdXRsaWVycywgJSBtaXNzaW5nLjx1bD48L3VsPjwvdWw+PC91bD48L3VsPgo8dWw+NWMuIEZvciBjb21wb3NpdGUgdmFyaWFibGVzIChlLmcuLCBtZWFzdXJlIHRvdGFsIHNjb3JlcyksIGNoZWNrIHJlbGlhYmlsaXR5IChDcm9uYmFjaCdzIGFscGhhKS48L3VsPgo8dWw+NWQuIE90aGVyIGV4cGxvcmF0aW9uOiAKPHVsPisgQml2YXJpYXRlIHJlbGF0aW9uc2hpcHMgKHdoZW4gYXBwcm9wcmlhdGUpPC91bD4KPHVsPisgQ29ycmVsYXRpb25zLCBzY2F0dGVycGxvdHMuPC91bD4KPHVsPisgRm9yIG11bHRpdmFyaWF0ZSBtb2RlbHMsIGNoZWNrIGNvbGxpbmVhcml0eS48L3VsPgo8dWw+KyBOb3JtYWxpdHkgdGVzdGluZyAocmVzaWR1YWxzIHNob3VsZCBiZSBub3JtYWxseSBkaXN0cmlidXRlZCkuPC91bD4KPHVsPjx1bD4rIElmIHJlc2lkdWFscyBhcmUgc2lnbmlmaWNhbnRseSBub24tbm9ybWFsLCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdDogdHJhbnNmb3JtYXRpb24sIHVzaW5nIGFwcHJvYWNoZXMgdGhhdCBkb24ndCBhc3N1bWUgbm9ybWFsaXR5Li4uPC91bD48L3VsPgo8L3VsPjwvdWw+PC91bD48L3VsPgo2LiBNaXNzaW5nIGRhdGEuCjx1bD42YS4gUmVwb3J0IGFtb3VudCBvZiBtaXNzaW5nIGRhdGEgYW5kIHdoZXRoZXIgYW55IG9mIHlvdXIgdmFyaWFibGVzIHByZWRpY3QgbWlzc2luZ25lc3MuPC91bD4KPHVsPjZiLiBEZWNpZGUgaG93IHlvdSB3aWxsIGRlYWwgd2l0aCBtaXNzaW5nIGRhdGEuPC91bD4KPHVsPisgX1NpbXBsZTpfIHVzZSBjb21wbGV0ZSBjYXNlcyBvbmx5OyBtZWFuIGltcHV0YXRpb247IHJlZ3Jlc3Npb24gaW1wdXRhdGlvbi48L3VsPjwvdWw+Cjx1bD4rIF9Nb3JlIHNvcGhpc3RpY2F0ZWQ6XyBtdWx0aXBsZSBpbXB1dGF0aW9uOyBtb2RlbGluZyBhcHByb2FjaGVzIHVzaW5nIEZ1bGwgSW5mb3JtYXRpb24gTWF4aW11bSBMaWtlbGlob29kIChGSU1MKS4KNy4gUmVzaGFwZSBkYXRhIChlLmcuLCB3aWRlLS1sb25nKSwgaWYgbmVlZGVkIGZvciB5b3VyIHBsYW5uZWQgYW5hbHlzZXMuPC91bD4KOC4gQmFjayB1cCB5b3VyIGRhdGEuCjx1bD44YS4gVGhlIGNsZWFuZWQgZGF0YXNldCBzaG91bGQgYmUgY2xlYXJseSBsYWJlbGVkIGFzIHN1Y2gsIGRpc3RpbmN0IGZyb20gdGhlIHJhdyBkYXRhc2V0LCBhbmQgc2F2ZWQgaW4gYXQgbGVhc3QgdHdvIGRpZmZlcmVudCBsb2NhdGlvbnMgKGkuZS4sIGV4dGVybmFsIEhEICYgY2xvdWQ7IGxvY2FsICYgc2VydmVyLi4uPC91bD4KCiMjIEdlbmVyYWwgTm90ZXMKCioqR29vZC9oZWxwZnVsIHByYWN0aWNlcyoqIChfYW4gaW5jb21wbGV0ZSBhbmQgc29tZXdoYXQgc3ViamVjdGl2ZSBsaXN0Xyk6CgoqIE5hbWUgeW91ciBmaWxlcyB0byBiZSBodW1hbi1yZWFkYWJsZSwgbWFjaGluZS1yZWFkYWJsZSwgYW5kIHdvcmsgd2VsbCB3aXRoIGRlZmF1bHQgb3JkZXJpbmcgKHNlZSBKZW5ueSBCcnlhbnQncyA8YSBocmVmPSJodHRwczovL3NwZWFrZXJkZWNrLmNvbS9qZW5ueWJjL2hvdy10by1uYW1lLWZpbGVzIj5ob3cgdG8gbmFtZSBmaWxlczwvYT4pLgoqIFJlZmVyIHRvIHJvd3MvY29sdW1ucyBieSBuYW1lIHJhdGhlciB0aGFuIHBvc2l0aW9uIGluIGRhdGFmcmFtZS4KKiBVbmRlcnN0YW5kIGhvdyBSIGhhbmRsZXMgY2F0ZWdvcmljYWwgZGF0YSAoc2VlIHRoZSBwcmVwcmludCA8YSBocmVmPSJodHRwczovL3BlZXJqLmNvbS9wcmVwcmludHMvMzE2My5wZGYiPldyYW5nbGluZyBjYXRlZ29yaWNhbCBkYXRhIGluIFI8L2E+KS4KKiBOYW1lIGRpY2hvdG9tb3VzIHZhcmlhYmxlcyBpbiBhIHdheSB0aGF0IHRlbGxzIHlvdSB3aGF0IHRoZSByZWZlcmVuY2UgbGV2ZWwgaXMgKGFraW4gdG8gZHVtbXktY29kaW5nIC0gdGhpcyBpcyBoZWxwZnVsIHdoZW4geW91IHNldCB1cCBsbS9nbG0gbW9kZWxzIGxhdGVyKS4KKiBDcmVhdGUgYSBuZXcgZGF0YWZyYW1lIGZvciBlYWNoIHN0ZXAgb2YgZGF0YSBjbGVhbmluZy4gVGhpcyBhbGxvd3MgeW91IHRvIHJlLXJ1biBwb3J0aW9ucyBvZiB5b3VyIHNjcmlwdCB3aGVuIHlvdSBtYWtlIGEgbWlzdGFrZSB3aXRob3V0IGhhdmluZyB0byByZS1ydW4gdGhlIHdob2xlIHRoaW5nIGZyb20gdGhlIHZlcnkgdG9wLCBhbmQgdG8gY29tcGFyZSBjbGVhbmVkIGFuZCBub24tY2xlYW5lZCB2YWx1ZXMgKHVzZWZ1bCBmb3IgY2hlY2tpbmcgcmV2ZXJzZS1jb2RpbmcgYW5kIGZhY3RvciBsZXZlbHMpLiAgCiogQmUgYXdhcmUgZm9yIHRoZSBwb3RlbnRpYWwgZm9yIGFjY2lkZW50YWwgcmV2ZXJzZS1yZXZlcnNlLWNvZGluZyBjYXVzZWQgYnkgcnVubmluZyBhIHNjcmlwdCBhIHNlY29uZCB0aW1lIG9uIHRoZSBzYW1lIHZhcmlhYmxlLiBDb25zaWRlciBjcmVhdGluZyBuZXcgdmFyaWFibGVzIHdpdGggdGhlIHJldmVyc2VkIHZhbHVlcywgZS5nLiwgaS5lLiwgYHBzd3FfMTBgIC0tPiBgcHN3cV8xMHJgLgoqIENoZWNrIG91dCB0aGUgb3ZlcnZpZXcgaW4gPGEgaHJlZj0iaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvZGVfSm9uZ2UrdmFuX2Rlcl9Mb28tSW50cm9kdWN0aW9uX3RvX2RhdGFpbmdfd2l0aF9SLnBkZiI+QW4gaW50cm9kdWN0aW9uIHRvIGRhdGEgY2xlYW5pbmcgd2l0aCBSPC9hPiAoSSBmb3VuZCB0aGVpciB0dXRvcmlhbCBtb3JlIHVzZWZ1bCBvbiBhIGNvbmNlcHR1YWwgLSByYXRoZXIgdGhhbiBwcmFjdGljYWwgLSBsZXZlbCwgc2luY2UgdGhlIHR1dG9yaWFsIGZvY3VzZXMgb24gYmFzZSBSIGFuZCBJIHByZWZlciB1c2luZyB0aWR5dmVyc2UgdG9vbHMgZm9yIGRhdGEgY2xlYW5pbmcuKTwvYT4KCiNGaXJzdCBTdGVwcwojI0V4cG9ydGluZyBEYXRhIGZyb20gUXVhbHRyaWNzCgoqIExvZyBpbnRvIFF1YWx0cmljcyAoaHR0cDovL3F1YWx0cmljcy5hcml6b25hLmVkdSkKKiBOYXZpZ2F0ZSB0byB0aGUgc3VydmV5L3Byb2plY3QgY29udGFpbmluZyB0aGUgZGF0YSB5b3Ugd2FudCB0byBleHBvcnQuCiogTmF2aWdhdGUgdG8gRGF0YSAmIEFuYWx5c2lzID4gRXhwb3J0L0ltcG9ydC4uLiA+IERvd25sb2FkIERhdGEgVGFibGUgYXMgQ1NWIGZpbGUgCiogQ2hlY2sgX0Rvd25sb2FkIGFsbCBmaWVsZHNfCiogRGVwZW5kaW5nIG9uIHlvdXIgZGF0YSwgaXQgbWF5IG1ha2UgbW9yZSBzZW5zZSB0byBzZWxlY3QgX1VzZSBudW1lcmljIHZhbHVlc18gdnMuIF9Vc2UgY2hvaWNlIHRleHRfLCBvciB2aWNlIHZlcnNhLgoKIyNDcmVhdGluZyB0aGUgQ29kZWJvb2sKKipBIGNvZGVib29rIHNob3VsZCBjb250YWluOioqCgo8dWw+KDEpIFRoZSB0ZXh0IG9mIHRoZSBxdWVzdGlvbnMgYW5kIHJlc3BvbnNlcywgYXMgdGhlIHBhcnRpY2lwYW50IHNhdyB0aGVtLgooMikgVGhlIG5hbWUgb2YgZWFjaCB2YXJpYWJsZSAoZS5nLiwgYGJncV8xYCkgX2FzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSBmaW5hbCBkYXRhc2V0XyAobm90IHdoYXQgaXQncyBuYW1lZCBpbiBRdWFsdHJpY3MpLgooMykgVGhlIHZhbHVlcyBmb3IgZWFjaCB2YXJpYWJsZSAoZS5nLiwgMCA9IE5vdCBhdCBhbGwsIDEgPSBTb21ld2hhdCwgMiA9IEEgbG90KSBfYXMgdGhleSB3aWxsIGFwcGVhciBpbiB0aGUgZmluYWwgZGF0YXNldF8gKG5vdCB3aGF0ZXZlciB2YWx1ZXMgUXVhbHRyaWNzIGFzc2lnbmVkKS4KKDQpIEEgY2l0YXRpb24gYW5kIHNjb3JpbmcgaW5mb3JtYXRpb24gKGhvdyByZXNwb25zZXMgYXJlIGNvZGVkLCByZXZlcnNlIHNjb3JpbmcsIHN1YnNjYWxlcywgd2hldGhlciB0b3RhbCBzY29yZSBpcyBhIHN1bSBvciBhIG1lYW4sIHBvc3NpYmxlIHJhbmdlLCBub3JtcywgY2xpbmljYWwgY3V0b2ZmcywgZXRjLikgZm9yIGVhY2ggbWVhc3VyZSBpbmNsdWRlZCBpbiB0aGUgZGF0YXNldC48L3VsPgoKIVtleGFtcGxlIG9mIHRoZSBjb2RlYm9vayBzZWN0aW9uIGZvciBhIG1lYXN1cmVdKGNvZGVib29rLnBuZykKCkZvciBzdGVwcyAoMikgYW5kICgzKSwgSSBmb3VuZCBpdCBlYXNpZXN0IHRvIGNyZWF0ZSBhbiBpbml0aWFsIGRyYWZ0IG9mIHRoZSBjb2RlYm9vayBmb3IgbXkgb3duIHJlZmVyZW5jZSwgd2hlcmUgSSByZWNvcmRlZCB0aGUgdmFyaWFibGUgbmFtZXMgYW5kIHZhbHVlcyBleGFjdGx5IGFzIHRoZXkgd2VyZSBpbiBRdWFsdHJpY3MgZm9yIHVzZSB3aGlsZSB3cml0aW5nIHRoZSBwb3J0aW9ucyBvZiB0aGUgZGF0YSBjbGVhbmluZyBzY3JpcHQgd2hlcmUgdmFyaWFibGVzIHdlcmUgcmVuYW1lZCBhbmQgcmVjb2RlZC4gVGhlbiBJIG1hZGUgYSBmaW5hbCBjb3B5IG9mIHRoZSBjb2RlYm9vayB3aXRoIHRoZSBuYW1lcyBhbmQgdmFsdWVzIGFzIHJlZmxlY3RlZCBpbiB0aGUgY2xlYW5lZCBkYXRhc2V0LgoKCgojQmFzZWxpbmUKVGhpcyBzZWN0aW9uIG9mIHRoZSBzY3JpcHQgZGVhbHMgd2l0aCB0aGUgYmFzZWxpbmUgdHJhaXQgbWVhc3VyZXMgdGhhdCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIGJlZm9yZSB0aGVpciBleHBlcmltZW50YWwgc2Vzc2lvbnMuCgojI0ltcG9ydCBkYXRhIGFuZCBjbGVhbiB1cCBRdWFsdHJpY3MganVuawo+PGNlbnRlcj48Zm9udCBjb2xvcj0icmVkIj5UaGlzIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBqdXN0IGV4cG9ydGVkIHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gUXVhbHRyaWNzLCBhbmQgaGF2ZSBub3QgbWFuaXB1bGF0ZWQgaXQgaW4gYW55IHdheSAoaS5lLiwgaW4gRXhjZWwsIGV0Yy4pIGJlZm9yZWhhbmQuPC9mb250PjwvY2VudGVyPgoKVGFzazogSW1wb3J0IGRhdGEgZnJvbSBDU1YgZmlsZSAqZXhjZXB0KiBmb3IgY29sdW1ucyAyOjE4ICgyOjE3IGlzIGp1c3QgUXVhbHRyaWNzIGp1bmssIDE4IGlzIHRoZSBwYXJ0aWNpcGFudCdzIG5hbWUgYW5kIG5lZWRzIHRvIGJlIGRlbGV0ZWQpLgpXZSdsbCBrZWVwIHRoZSBmaXJzdCBjb2x1bW4gJ1N0YXJ0RGF0ZScuPGJyPgpXZSBhbHNvIHdhbnQgdG8gcmVtb3ZlIGFueSByb3dzIHdoZXJlIElEICgnUTUyJyBmb3Igbm93KSBkb2Vzbid0IGJlZ2luIHdpdGggRDEsIGluIG9yZGVyIHRvIGZpbHRlciBvdXQgYW55IHBpbG90IG9yIHRlc3QgcmVzcG9uc2VzLgoKYGBge3J9CiMgcnVuIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdXNpbmcgZHBseXIgb24geW91ciBsb2NhbCBtYWNoaW5lCmxpYnJhcnkodGlkeXZlcnNlKSAKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKCmJhc2VsaW5lIDwtIHJlYWQuY3N2KCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1QrZk1SSStCYXNlbGluZV9KYW51YXJ5KzE4JTJDKzIwMTlfMTQuMjIuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBuYS5zdHJpbmdzPSIiKVsgLC1jKDI6MTgpXSAlPiUKICBmaWx0ZXIoZ3JlcGwoIl5EMSIsIFE1MiwgaWdub3JlLmNhc2UgPSBUUlVFKSkgIyBvbmUgcGVyc29uIGlucHV0IHRoZWlyIGlkIGFzICJkMTMwIiwgc28gc2hvdWxkIE5PVCBiZSBjYXNlIHNlbnNpdGl2ZQojIG5hLnN0cmluZ3MgPSAiIiByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIHdoZXJlIG1pc3NpbmcgZGF0YSBpcyByZXByZXNlbnRlZCBieSBibGFuayBjZWxscyB3aXRoIE5BLCB3aGljaCBpcyBob3cgUiBoYW5kbGVzIG1pc3NpbmcgdmFsdWVzLgoKIyB2aWV3IElEcwpiYXNlbGluZSRRNTIKCiMgZmlsdGVyIG91dCBwYXJ0aWNpcGFudHMgd2hvIGRpZCBub3QgY29tcGxldGUgc3R1ZHkKYmFzZWxpbmUgPC0gZmlsdGVyKGJhc2VsaW5lLCAhZ3JlcGwoIkQxMDh8RDEwOXxEMTExfEQxMTJ8RDExNnxEMTI0fEQxNTAiLFE1MikpIAoKIyB2aWV3IElEcwpiYXNlbGluZSRRNTIKCmBgYApDaGVjayB0aGF0IHlvdXIgc2Vjb25kIGNvbHVtbiBpcyAiUTUyIiAoaWYgeW91J3ZlIGRlbGV0ZWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMsIGl0IHdpbGwgYmUpLiBZb3Ugc2hvdWxkIGhhdmUgNDAgb2JzZXJ2YXRpb25zIG9mIDE3MSB2YXJpYWJsZXMuCgojI1JlbmFtZSB2YXJpYWJsZXMKVGhlIG5hbWUgdG8gdGhlIF9sZWZ0XyBvZiB0aGUgZXF1YWwgc2lnbiBpcyB0aGUgbmV3IG5hbWUsIHRoZSBvbmUgb24gdGhlIHJpZ2h0IGlzIHdoYXQgdGhlIHZhcmlhYmxlIHdhcyBuYW1lZCBpbiBRdWFsdHJpY3MuCmBgYHtyfQpiYXNlbGluZV8xIDwtIHJlbmFtZShiYXNlbGluZSwgc3RhcnRkYXRlID0gU3RhcnREYXRlLApJRCA9IFE1MiwKZG9iID0gUTIsCnNleF9tID0gUTEsCmRhdGVvZmRlYXRoID0gUTM2LAprbm93YmVmb3JlX3kgPSBRMzcsCmNhcmV0YWtlcl95ID0gUTM4LAplZHVjYXRpb24gPSBRNSwKaGlnaGVzdGRlZ3JlZSA9IFE2LCAKZWR1Y2F0aW9uX290aGVyID0gUTZfNl9URVhULAplbXBsb3ltZW50ID0gUTcsCmhvdXNlaG9sZHNpemUgPSBROCwKaG91c2Vob2xkc2l6ZV9hZHVsdCA9IFExMCwKaG91c2Vob2xkc2l6ZV9pbmNvbWUgPSBRMTIsCmV0aG5pY2l0eV9oaXNwID0gUTEzLApyYWNlID0gUTE0LApyYWNlX290aGVyID0gUTE0XzZfVEVYVCwKbGVhcm5hYm91dHN0dWR5ID0gTUhRLjEsCm1lZHNfeSA9IE1IUS4yLAptZWRzX3doaWNoID0gTUhRLjMsCm1lZHNfZHggPSBNSFEuNCwKbWVkc19kb3NlID0gTUhRLjUsCm1ham9yaGVhbHRocHJvYnNfeSA9IE1IUS42LAptYWpvcmhlYWx0aHByb2JzX3doYXQgPSBNSFEuNywKcGFzdDJ3a3NfaW5qdXJ5aW5mZWN0X3kgPSBNSFEuOCwKcGFzdDJ3a3NfZGVudGlzdF95ID0gTUhRLjksCmN1cnJlbnR0eF95ID0gTUhRLjEwLApwb3N0bWVub3BhdXNhbF95ID0gTUhRLjExLApsYXN0cGVyaW9kID0gTUhRLjEyLCAKbl9wcmVnbmFuY2llcyA9IE1IUS4xMywKbl9saXZlYmlydGhzID0gTUhRLjE0LApuX251cnNlZCA9IE1IUS4xNSwKYWxsZXJnaWVzID0gTUhRLjE2LApzdXJnZXJpZXNfcGFzdDZtb3MgPSBNSFEuMTcsCmFsY29ob2wgPSBNSFEuMTgsCnNtb2tpbmdfeSA9IE1IUS4xOSwKc21va2luZ19ob3dsb25nID0gTUhRLjIwLApzbW9raW5nX3BlcmRheSA9IE1IUS4yMSwKY2FmZmVpbmVfcGVyZGF5ID0gTUhRLjIyLApleGVyY2lzZSA9IE1IUS4yNSwKcHNzXzEgPSBQU1MuMS4xMF8xLApwc3NfMiA9IFBTUy4xLjEwXzIsCnBzc18zID0gUFNTLjEuMTBfMywKcHNzXzQgPSBQU1MuMS4xMF80LApwc3NfNSA9IFBTUy4xLjEwXzUsCnBzc182ID0gUFNTLjEuMTBfNiwKcHNzXzcgPSBQU1MuMS4xMF83LApwc3NfOCA9IFBTUy4xLjEwXzgsCnBzc185ID0gUFNTLjEuMTBfOSwKcHNzXzEwID0gUFNTLjEuMTBfMTAsCnlzbF8xID0gWXJuLjEuMjFfMSwKeXNsXzIgPSBZcm4uMS4yMV8yLAp5c2xfMyA9IFlybi4xLjIxXzMsCnlzbF80ID0gWXJuLjEuMjFfNCwKeXNsXzUgPSBZcm4uMS4yMV81LAp5c2xfNiA9IFlybi4xLjIxXzYsCnlzbF83ID0gWXJuLjEuMjFfNywKeXNsXzggPSBZcm4uMS4yMV84LAp5c2xfOSA9IFlybi4xLjIxXzksCnlzbF8xMCA9IFlybi4xLjIxXzEwLAp5c2xfMTEgPSBZcm4uMS4yMV8xMSwKeXNsXzEyID0gWXJuLjEuMjFfMTIsCnlzbF8xMyA9IFlybi4xLjIxXzEzLAp5c2xfMTQgPSBZcm4uMS4yMV8xNCwKeXNsXzE1ID0gWXJuLjEuMjFfMTUsCnlzbF8xNiA9IFlybi4xLjIxXzE2LAp5c2xfMTcgPSBZcm4uMS4yMV8xNywKeXNsXzE4ID0gWXJuLjEuMjFfMTgsCnlzbF8xOSA9IFlybi4xLjIxXzE5LAp5c2xfMjAgPSBZcm4uMS4yMV8yMCwKeXNsXzIxID0gWXJuLjEuMjFfMjEsCmljZ18xID0gSUNHLlIxLjE5XzEsCmljZ18yID0gSUNHLlIxLjE5XzIsCmljZ18zID0gSUNHLlIxLjE5XzMsCmljZ180ID0gSUNHLlIxLjE5XzQsCmljZ181ID0gSUNHLlIxLjE5XzUsCmljZ182ID0gSUNHLlIxLjE5XzYsCmljZ183ID0gSUNHLlIxLjE5XzcsCmljZ184ID0gSUNHLlIxLjE5XzgsCmljZ185ID0gSUNHLlIxLjE5XzksCmljZ18xMCA9IElDRy5SMS4xOV8xMCwKaWNnXzExID0gSUNHLlIxLjE5XzExLAppY2dfMTIgPSBJQ0cuUjEuMTlfMTIsCmljZ18xMyA9IElDRy5SMS4xOV8xMywKaWNnXzE0ID0gSUNHLlIxLjE5XzE0LAppY2dfMTUgPSBJQ0cuUjEuMTlfMTUsCmljZ18xNiA9IElDRy5SMS4xOV8xNiwKaWNnXzE3ID0gSUNHLlIxLjE5XzE3LAppY2dfMTggPSBJQ0cuUjEuMTlfMTgsCmljZ18xOSA9IElDRy5SMS4xOV8xOSwKYmRpXzEgPSBCREkuMSwKYmRpXzIgPSBCREkuMiwKYmRpXzMgPSBCREkuMywKYmRpXzQgPSBCREkuNCwKYmRpXzUgPSBCREkuNSwKYmRpXzYgPSBCREkuNiwKYmRpXzcgPSBCREkuNywKYmRpXzggPSBCREkuOCwKYmRpXzkgPSBCREkuOSwKYmRpXzEwID0gQkRJLjEwLApiZGlfMTEgPSBCREkuMTEsCmJkaV8xMiA9IEJESS4xMiwKYmRpXzEzID0gQkRJLjEzLApiZGlfMTQgPSBCREkuMTQsCmJkaV8xNSA9IEJESS4xNSwKYmRpXzE2ID0gQkRJLjE2LApiZGlfMTcgPSBCREkuMTcsCmJkaV8xOCA9IEJESS4xOCwKYmRpXzE5ID0gQkRJLjE5LApiZGlfMjAgPSBCREkuMjAsCmJkaV8yMSA9IEJESS4yMSwKaGFuZF8xID0gSGFuZC4xXzEsCmhhbmRfMiA9IEhhbmQuMV8yLApoYW5kXzMgPSBIYW5kLjFfMywKaGFuZF80ID0gSGFuZC4xXzQsCmhhbmRfNSA9IEhhbmQuMV81LApoYW5kXzYgPSBIYW5kLjFfNiwKaGFuZF83ID0gSGFuZC4xXzcsCmhhbmRfOCA9IEhhbmQuMV84LApoYW5kXzkgPSBIYW5kLjFfOSwKaGFuZF8xMCA9IEhhbmQuMV8xMCwKaGFuZF8xMSA9IEhhbmQuMV8xMSwKaGFuZF8xMiA9IEhhbmQuMV8xMiwKaGFuZF9iYXRfMSA9IEhhbmQuMiwKYmlzYmFzXzEgPSBCSVNCQVNfMSwKYmlzYmFzXzIgPSBCSVNCQVNfMiwKYmlzYmFzXzMgPSBCSVNCQVNfMywKYmlzYmFzXzQgPSBCSVNCQVNfNCwKYmlzYmFzXzUgPSBCSVNCQVNfNSwKYmlzYmFzXzYgPSBCSVNCQVNfNiwKYmlzYmFzXzcgPSBCSVNCQVNfNywKYmlzYmFzXzggPSBCSVNCQVNfOCwKYmlzYmFzXzkgPSBCSVNCQVNfOSwKYmlzYmFzXzEwID0gQklTQkFTXzEwLApiaXNiYXNfMTEgPSBCSVNCQVNfMTEsCmJpc2Jhc18xMiA9IEJJU0JBU18xMiwKYmlzYmFzXzEzID0gQklTQkFTXzEzLApiaXNiYXNfMTQgPSBCSVNCQVNfMTQsCmJpc2Jhc18xNSA9IEJJU0JBU18xNSwKYmlzYmFzXzE2ID0gQklTQkFTXzE2LApiaXNiYXNfMTcgPSBCSVNCQVNfMTcsCmJpc2Jhc18xOCA9IEJJU0JBU18xOCwKYmlzYmFzXzE5ID0gQklTQkFTXzE5LApiaXNiYXNfMjAgPSBCSVNCQVNfMjAsCmJpc2Jhc18yMSA9IEJJU0JBU18yMSwKYmlzYmFzXzIyID0gQklTQkFTXzIyLApiaXNiYXNfMjMgPSBCSVNCQVNfMjMsCmJpc2Jhc18yNCA9IEJJU0JBU18yNCwKYmdxXzEgPSBCR1EuMSwKYmdxXzIgPSBCR1EuMiwKYmdxXzMgPSBCR1EuMywKYmdxXzQgPSBCR1EuNCwKYmdxXzUgPSBCR1EuNSwKZWNycnNfZ2xvYmFsXzEgPSBRMTg1XzEsCmVjcnJzX2dsb2JhbF8yID0gUTE4NV8yLAplY3Jyc19nbG9iYWxfMyA9IFExODVfMywKZWNycnNfZ2xvYmFsXzQgPSBRMTg1XzQsCmVjcnJzX2dsb2JhbF81ID0gUTE4NV81LAplY3Jyc19nbG9iYWxfNiA9IFExODVfNiwKZWNycnNfZ2xvYmFsXzcgPSBRMTg1XzcsCmVjcnJzX2dsb2JhbF84ID0gUTE4NV84LAplY3Jyc19nbG9iYWxfOSA9IFExODVfOSwKZWNycnNfc3BvdXNlXzEgPSBRMTg2XzEsCmVjcnJzX3Nwb3VzZV8yID0gUTE4Nl8yLAplY3Jyc19zcG91c2VfMyA9IFExODZfMywKZWNycnNfc3BvdXNlXzQgPSBRMTg2XzQsCmVjcnJzX3Nwb3VzZV81ID0gUTE4Nl81LAplY3Jyc19zcG91c2VfNiA9IFExODZfNiwKZWNycnNfc3BvdXNlXzcgPSBRMTg2XzcsCmVjcnJzX3Nwb3VzZV84ID0gUTE4Nl84LAplY3Jyc19zcG91c2VfOSA9IFExODZfOSkKCiMgQ2hlY2sgaXQgb3V0OgpwcmludChjb2xuYW1lcyhiYXNlbGluZV8xKSkKIyBTYXZlIGl0IGFzIGEgY3N2IGZpbGUKd3JpdGUuY3N2KGJhc2VsaW5lXzEsIGZpbGUgPSAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV8xLmNzdiIpCmBgYAoKIyNDaGFuZ2UgdmFyaWFibGUgdHlwZXMKCkZpcnN0LCBsZXQncyBjaGFuZ2UgYWxsIG91ciBzY2FsZSBpdGVtcyBmcm9tIGNociB0byAqKm51bWVyaWMqKjoKYGBge3J9CmJhc2VsaW5lXzIgPC0gYmFzZWxpbmVfMSAlPiUgbXV0YXRlX2F0KHZhcnMocHNzXzE6ZWNycnNfc3BvdXNlXzkpLCBmdW5zKGFzLm51bWVyaWMpKQpgYGAKCk5vdGU6IE9uZSB3YXkgdG8gZ2V0IHRoaXMgYWxsIGludG8gdGhlIHNhbWUgZXhwcmVzc2lvbiBtaWdodCBiZSB0byB1c2UgYmFzZSBSJ3MgKipzYXBwbHkqKiwgZS5nLiBgZGF0WywgYygzLDY6MTUsMzcpXSA8LSBzYXBwbHkoZGF0WywgYygzLDY6MTUsMzcpXSwgYXMubnVtZXJpYylgIC0gYnV0IEknbSBub3QgYSBmYW4uIENvbHVtbiBvcmRlciBtYXkgY2hhbmdlLCBhbmQgaXQncyBtdWNoIGVhc2llciB0byBtaXggdXAgY29sdW1ucyB3aGVuIHJlZmVycmluZyB0byB0aGVpciBvcmRlciBpbiB0aGUgZGF0YWZyYW1lIChlLmcuLCA4OCB2cy4gODkpIHRoYW4gaXQgaXMgdG8gbWl4IHVwIHR3byBjb2x1bW5zIHdoZW4gcmVmZXJyaW5nIHRvIHRoZWlyIG5hbWVzLgoKTGV0J3MgbGVhdmUgb3VyICoqbm9taW5hbCoqLCAqKmRhdGUqKiwgYW5kICoqZnJlZS10ZXh0IHJlc3BvbnNlKiogdmFyaWFibGVzIGFsb25lIGZvciBub3cgKGBJRCwgZG9iLCBkYXRlb2ZkZWF0aCwgcmFjZV9vdGhlciwgbGVhcm5hYm91dHN0dWR5LCBtZWRzX3doaWNoLCBtZWRzX2R4LCBtZWRzX2Rvc2UsIG1ham9yaGVhbHRocHJvYnNfd2hhdCwgbGFzdHBlcmlvZCwgbl9wcmVnbmFuY2llcywgbl9saXZlYmlydGhzLCBhbGxlcmdpZXMsIHN1cmdlcmllc19wYXN0Nm1vcywgYWxjb2hvbCwgc21va2luZ19ob3dsb25nYCkuCgpXZSBjb3VsZCBhbHNvIGNvbnZlcnQgdmFyaWFibGVzIGZyb20gY2hyIHRvIGZhY3RvciBoZXJlIC0tIGUuZy4sIGBiYXNlbGluZSA8LSBiYXNlbGluZSAlPiUgbXV0YXRlX2F0KHZhcnMoc2V4X20pLCBmdW5zKGZhY3RvcikpYCAtLSBidXQgdGhhdCB3aWxsIGJlIHRha2VuIGNhcmUgb2YgaW4gdGhlIG5leHQgc3RlcC4KCkxldCdzIHNhdmUgdGhlIGNsZWFuZWQgZGF0YSBzbyBmYXIuIFIgZGF0YSBmb3JtYXQgKC5yZHMpIHByZXNlcnZlcyBkYXRhIHN0cnVjdHVyZXMsIHN1Y2ggYXMgY29sdW1uIGRhdGEgdHlwZXMgKG51bWVyaWMsIGNoYXJhY3RlciBvciBmYWN0b3IpLiAKYGBge3J9CnNhdmVSRFMoYmFzZWxpbmVfMiwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvYmFzZWxpbmVfMi5yZHMiKQoKIyBJZiB5b3UgZXZlciB3YW50IHRvIHJlc3RvcmUgdGhlIHByZS1mYWN0b3Jpbmcgc3RlcCBkYXRhLCBzaW1wbHkgdXNlOgojIGJhc2VsaW5lXzIgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV8yLnJkcyIpCmBgYAoKIyNDcmVhdGluZyBmYWN0b3JzIGFuZCByZWNvZGluZyB2YWx1ZXMKIyMjQWJvdXQgZmFjdG9ycyBpbiBSICgqSU1QT1JUQU5UISopCklmIHlvdSBoYXZlIDUgcG9zc2libGUgbGV2ZWxzIG9mIGEgZmFjdG9yIChlLmcuLCBvcHRpb25zIGZvciAncmFjZScgd2VyZSBXaGl0ZSwgQmxhY2ssIEFzaWFuLCBOYXRpdmUgQW1lcmljYW4vQWxhc2thbiBOYXRpdmUsIE90aGVyIFJhY2UgTm90IExpc3RlZCkgYnV0IG9ubHkgMiBhY3R1YWwgbGV2ZWxzIGluIHlvdXIgZGF0YSAoZS5nLiwgYWxsIG9mIG91ciBwYXJ0aWNpcGFudHMgaWRlbnRpZnkgYXMgZWl0aGVyIFdoaXRlIG9yIE90aGVyKSwgdGhlbiBpdCB3aWxsIG1ha2UgMSA9IHRoZSBmaXJzdCBmYWN0b3IgbGlzdGVkIF9mb3Igd2hpY2ggdGhlcmUgaXMgZGF0YV8sIGFuZCAyID0gdGhlIHNlY29uZCBsaXN0ZWQgX2ZvciB3aGljaCB0aGVyZSBpcyBkYXRhXy4KClRoaXMgaXMgZGlmZmVyZW50IHRoYW4gU1BTUywgd2hpY2ggcHJlc2VydmVzIGZhY3RvciBsZXZlbHMgcmVnYXJkbGVzcyBvZiB3aGF0IHlvdXIgZGF0YSBhY3R1YWxseSBjb250YWlucy4KCllvdSBjYW4gY2hlY2sgbGV2ZWxzIGFuZCB0aGVpciBvcmRlciBsaWtlIHRoaXM6IApgYGAKbGV2ZWxzKGJhc2VsaW5lXzMkcmFjZSkKbmxldmVscyhiYXNlbGluZV8zJHJhY2UpCmBgYApGb3Igb3JkZXJlZCBmYWN0b3JzLCBjYW4gY2hlY2sgdGhlaXIgb3JkZXIgKGFuZCBsb3dlc3QvaGlnaGVzdCBsZXZlbHMpIHVzaW5nIHRoZSAqKm1pbigpKiogYW5kICoqbWF4KCkqKiBmdW5jdGlvbnMuIEZvciBleGFtcGxlLCBgbWluKGJhc2VsaW5lXzMkZWR1Y2F0aW9uKWAgcmV0dXJucyB0aGUgZm9sbG93aW5nOiAKYGBgClsxXSBoaWdoIHNjaG9vbCBncmFkCkxldmVsczogaGlnaCBzY2hvb2wgZ3JhZCA8IHNvbWUgY29sbGVnZSA8IGNvbGxlZ2UgZ3JhZCA8IDEgeWVhciBncmFkIHNjaG9vbCA8IDIgeWVhcnMgZ3JhZCBzY2hvb2wgPCAzIHllYXJzIGdyYWQgc2Nob29sIDwgNCsgeWVhcnMgZ3JhZCBzY2hvb2wKYGBgCkZvciBub24tb3JkZXJlZCBmYWN0b3JzLCB2aWV3IHRoZWlyIGxldmVscyBieSBzaW1wbHkgcHJpbnRpbmcgdGhlIGNvbHVtbi4gYGJhc2VsaW5lJHJhY2VgIHJldHVybnMgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgZGF0YToKYGBgCkxldmVsczogV2hpdGUgT3RoZXIgKHNwZWNpZnkpCmBgYAoKIyMjQSBmZXcgb3RoZXIgbm90ZXMgb24gZmFjdG9ycyBpbiBSCiogTWFrZSBzdXJlIHlvdSBkb3VibGUtY2hlY2sgdGhhdCB5b3UndmUgYXNzaWduZWQgbGV2ZWxzIHByb3Blcmx5IGJ5IGdvaW5nIGJhY2sgdG8gdGhlIHJhdyBkYXRhIGFuZCBzZWVpbmcgaWYsIGZvciBleGFtcGxlLCB0aGUgIj4xMCBjaWdhcmV0dGVzL2RheSIgaW4gdGhlIGN1cnJlbnQgZGF0YWZyYW1lIG1hdGNoZXMgdXAgd2l0aCB3aGF0IHlvdSBzZWUgaW4gdGhlIFF1YWx0cmljcyBkYXRhIGZvciB0aGF0IHBlcnNvbi4gKFNlZSBhbHNvIGh0dHBzOi8vc3djYXJwZW50cnkuZ2l0aHViLmlvL3Itbm92aWNlLWluZmxhbW1hdGlvbi8xMi1zdXBwLWZhY3RvcnMvKQoqIEkgaGF2ZW4ndCB1c2VkIGl0IGhlcmUsIGJ1dCBzb21lIHBlb3BsZSBsaWtlIHRoZSBwYWNrYWdlIGBsZmFjdG9yc2AgKCJQcm92aWRlcyBhbiBleHRlbnNpb24gdG8gZmFjdG9ycyBjYWxsZWQgJ2xmYWN0b3InIHRoYXQgYXJlIHNpbWlsYXIgdG8gZmFjdG9ycyBidXQgYWxsb3dzIHVzZXJzIHRvIHJlZmVyIHRvICdsZmFjdG9yJyBsZXZlbHMgYnkgZWl0aGVyIHRoZSBsZXZlbCBvciB0aGUgbGFiZWwiKSAoW2xpbmtdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9sZmFjdG9ycy9pbmRleC5odG1sKSkKCmBgYHtyfQojIGhvdXNlaG9sZHNpemVfaW5jb21lIHdhcyBhIGZhY3RvciBpbiBRdWFsdHJpY3MgKCIwIHBlb3BsZSBicmluZ2luZyBpbiBpbmNvbWUiIGhhZCBhIHZhbHVlIG9mIDEpCiMjIEJ1dCBoZXJlLCBsZXQncyBjb252ZXJ0IGl0IHRvIGEgbnVtZXJpYyB2YXJpYWJsZSBhbmQgc2ltcGx5IHN1YnRyYWN0IDEgZnJvbSBlYWNoIHZhbHVlLCBpbnN0ZWFkIG9mIHRyZWF0aW5nIGl0IGFzIGEgZmFjdG9yOgoKYmFzZWxpbmVfMyA8LSBiYXNlbGluZV8yICU+JSBtdXRhdGVfYXQodmFycyhob3VzZWhvbGRzaXplX2luY29tZSksIGZ1bnMoYXMubnVtZXJpYykpICU+JSBtdXRhdGUoaG91c2Vob2xkc2l6ZV9pbmNvbWUgPSBob3VzZWhvbGRzaXplX2luY29tZSAtIDEpCgojIGhvdXNlaG9sZHNpemUgYW5kIGhvdXNlaG9sZHNpemVfYWR1bHQgc2hvdWxkIGFsc28gYmUgbnVtZXJpYy4KYmFzZWxpbmVfMyA8LSBiYXNlbGluZV8yICU+JSBtdXRhdGVfYXQodmFycyhob3VzZWhvbGRzaXplLGhvdXNlaG9sZHNpemVfYWR1bHQpLCBmdW5zKGFzLm51bWVyaWMpKQoKIyBMZXQncyBjbGVhbiB1cCB0aGUgbl9wcmVnbmFuY2llcyB2YXJpYWJsZS4gVGhpcyB3YXMgYSBmcmVlLXJlc3BvbnNlIGZpZWxkLCBzbyBzZXZlcmFsIHBlb3BsZSBlbnRlcmVkICJub25lIiwgIm4vYSIsICJtYWxlIiwgZXRjLiByYXRoZXIgdGhhbiBudW1lcmljIHZhbHVlcy4KIyMgV2Ugd2FudCB0byBjaGFuZ2UgdGhlIHJlc3BvbnNlICJUd28iIHRvICIyIiwgYW5kIG1ha2UgYW55IG90aGVyIG5vbi1udW1iZXIgcmVzcG9uc2UgTkEuCgpiYXNlbGluZV8zIDwtIGJhc2VsaW5lXzIgJT4lIG11dGF0ZShuX3ByZWduYW5jaWVzID0gcmVjb2RlKG5fcHJlZ25hbmNpZXMsICJUd28iID0gIjIiKSkgIyB0aGlzIHdpbGwgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlICJOQXMgaW50cm9kdWNlZCBieSBjb2VyY2lvbiIgLSBmZWVsIGZyZWUgdG8gaWdub3JlIGl0LgpiYXNlbGluZV8zIDwtIGJhc2VsaW5lXzIgJT4lIG11dGF0ZV9hdCh2YXJzKG5fcHJlZ25hbmNpZXMpLCBmdW5zKGFzLm51bWVyaWMpKQoKIyBuYV9pZiBpcyBhbHNvIHVzZWZ1bCBmdW5jdGlvbiBpZiB0aGVyZSdzIG9ubHkgb25lIHZhbHVlIHlvdSB3YW50IHRvIG1ha2UgTkEKIyBTZWUgYWxzbyBodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL25hX2lmLmh0bWwKIyMgRXhhbXBsZTogYmFzZWxpbmUgPC0gYmFzZWxpbmUgJT4lIG11dGF0ZShuX3ByZWduYW5jaWVzID0gbmFfaWYobl9wcmVnbmFuY2llcywgIk5vbmUiKSkKIyMjIChXZSBjb3VsZCBoYXZlIGRvbmUgdGhhdCBmb3IgYWxsIG9mIHRoZSB0ZXh0IHJlc3BvbnNlcyBvdGhlciB0aGFuICJUd28iIGluIHRoaXMgZGF0YXNldCwgYnV0IGNoYW5naW5nIHRoZSBjb2x1bW4gdG8gbnVtZXJpYyBmcm9tIGNoYXJhY3RlciBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIGFueSByZW1haW5pbmcgc3RyaW5ncyB0byBOQSBzbyBpdCB3b3VsZCBiZSByZWR1bmRhbnQpLgoKIyBNYWtpbmcgb3JkZXJlZCBmYWN0b3JzOiAnLm9yZGVyZWQgPSBUUlVFJyBvcmRlcnMgeW91ciBsZXZlbHMgaW4gb3JkZXIgbGlzdGVkLCBzbyB0aGUgZmlyc3QgaXMgdGhlIHJlZmVyZW5jZSB2YWx1ZS4gCiMjIEV4YW1wbGU6IGZvciBzZXhfbSwgd2Ugd2FudCBmZW1hbGUgdG8gYmUgdGhlIHJlZmVyZW5jZSB2YWx1ZSwgc28gaXQgaXMgbGlzdGVkIGZpcnN0LgojIyBGb3IgYWxsIG9mIHRoZSB5ZXMvbm8gdmFyaWFibGVzLCB0aGV5IGFyZSBhcHBlbmRlZCAiX3kiIChmb3IgZXguLCBtZWRzX3kpLgojIyMgVGhpcyBpbmRpY2F0ZXMgdGhhdCBhICJubyIgcmVzcG9uc2UgaXMgYWx3YXlzIHRoZSByZWZlcmVuY2UgZ3JvdXAsIHNvIGl0IHNob3VsZCBiZSBsaXN0ZWQgZmlyc3QuCiMjIyBOb3RlIHRoYXQgbm90IGFsbCBmYWN0b3JzIGFyZSBvcmRlcmVkICgnLm9yZGVyZWQgPSBGQUxTRScgaXMgZGVmYXVsdCkuCgoKYmFzZWxpbmVfMyA8LSBiYXNlbGluZV8yICU+JSAKICBtdXRhdGUoc2V4X20gPSByZWNvZGVfZmFjdG9yKHNleF9tLCAiMiIgPSAiZmVtYWxlIiwgIjEiID0gIm1hbGUiLCAub3JkZXJlZCA9IFRSVUUpLAogICAgICAgIGtub3diZWZvcmVfeSA9IHJlY29kZV9mYWN0b3Ioa25vd2JlZm9yZV95LCAiMiIgPSAibm8iLCAiMSIgPSAieWVzIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBjYXJldGFrZXJfeSA9IHJlY29kZV9mYWN0b3IoY2FyZXRha2VyX3ksICIyIiA9ICJubyIsICIxIiA9ICJ5ZXMiLCAub3JkZXJlZCA9IFRSVUUpLAogICAgICAgIGVkdWNhdGlvbiA9IHJlY29kZV9mYWN0b3IoZWR1Y2F0aW9uLCAiMSIgPSAibGVzcyB0aGFuIGhpZ2ggc2Nob29sIiwgIjIiID0gImxlc3MgdGhhbiBoaWdoIHNjaG9vbCIsICIzIiA9ICJsZXNzIHRoYW4gaGlnaCBzY2hvb2wiLCAiNCIgPSAibGVzcyB0aGFuIGhpZ2ggc2Nob29sIiwgIjUiID0gImhpZ2ggc2Nob29sIGdyYWQiLCAiNiIgPSAic29tZSBjb2xsZWdlIiwgIjciID0gInNvbWUgY29sbGVnZSIsICI4IiA9ICJzb21lIGNvbGxlZ2UiLCI5IiA9ICJjb2xsZWdlIGdyYWQiLCAiMTAiID0gIjEgeWVhciBncmFkIHNjaG9vbCIsICIxMSIgPSAiMiB5ZWFycyBncmFkIHNjaG9vbCIsICIxMiIgPSAiMyB5ZWFycyBncmFkIHNjaG9vbCIsICIxMyIgPSAiNCsgeWVhcnMgZ3JhZCBzY2hvb2wiLCAub3JkZXJlZCA9IFRSVUUpLCAgICMgY29sbGFwc2VkIHRoZSAxMyBkaWZmZXJlbnQgZWR1Y2F0aW9uIGNhdGVnb3JpZXMgaW50byA4CiAgICAgICAgIGhpZ2hlc3RkZWdyZWUgPSByZWNvZGVfZmFjdG9yKGhpZ2hlc3RkZWdyZWUsICI3IiA9ICJMZXNzIHRoYW4gSFMgZGlwbG9tYSBvciBHRUQiLCAiMSIgPSAiSFMgZGlwbG9tYSBvciBHRUQiLCAiMiIgPSAiQXNzb2NpYXRlcydzIiwgIjMiID0gIkJhY2hlbG9yJ3MiLCAiNCIgPSAiTWFzdGVyJ3MiLCAiNSIgPSAiRG9jdG9yYXRlIiwgIjYiID0gIk90aGVyIChzcGVjaWZ5KSIpLCAjIGRpZCBub3QgbWFrZSB0aGlzIGFuIG9yZGVyZWQgZmFjdG9yIGJlY2F1c2Ugd2Fzbid0IHN1cmUgaG93IHRoZSBPdGhlciBjYXRlZ29yeSBzaG91bGQgYmUgcmFua2VkCiAgICAgICAgIGVtcGxveW1lbnQgPSByZWNvZGVfZmFjdG9yKGVtcGxveW1lbnQsICIxIiA9ICJ3b3JraW5nIGZ1bGwgdGltZSIsICIyIiA9ICJ3b3JraW5nIHBhcnQgdGltZSIsICIzIiA9ICJ1bmVtcGxveWVkIG9yIGxhaWQgb2ZmIiwgIjQiID0gImxvb2tpbmcgZm9yIHdvcmsiLCAiNSIgPSAia2VlcGluZyBob3VzZSBvciByYWlzaW5nIGNoaWxkcmVuIGZ1bGwgdGltZSIsICI2IiA9ICJyZXRpcmVkIiwgIjciID0gInN0dWRlbnQiKSwKICAgICAgICBldGhuaWNpdHlfaGlzcCA9IHJlY29kZV9mYWN0b3IoZXRobmljaXR5X2hpc3AsICIyIiA9ICJub3QgSGlzcGFuaWMgb3IgTGF0aW5vIiwgIjEiID0gIkhpc3BhbmljIG9yIExhdGlubyIsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgcmFjZSA9IHJlY29kZV9mYWN0b3IocmFjZSwgIjEiID0gIldoaXRlIiwgIjIiID0gIkFmcmljYW4tQW1lcmljYW4vQmxhY2siLCAiMyIgPSAiQXNpYW4gQW1lcmljYW4vQXNpYW4iLCAiNCIgPSAiTmF0aXZlIEFtZXJpY2FuIG9yIEFsYXNrYW4gTmF0aXZlIiwgIjUiID0gIlBhY2lmaWMgSXNsYW5kZXIgb3IgTmF0aXZlIEhhd2FpaWFuIiwgIjYiID0gIk90aGVyIChzcGVjaWZ5KSIpLAogICAgICAgIG1lZHNfeSA9IHJlY29kZV9mYWN0b3IobWVkc195LCAiMiIgPSAibm8iLCAiMSIgPSAieWVzIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBtYWpvcmhlYWx0aHByb2JzX3kgPSByZWNvZGVfZmFjdG9yKG1ham9yaGVhbHRocHJvYnNfeSwgIjIiID0gIm5vIiwgIjEiID0gInllcyIsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgcGFzdDJ3a3NfaW5qdXJ5aW5mZWN0X3kgPSByZWNvZGVfZmFjdG9yKHBhc3Qyd2tzX2luanVyeWluZmVjdF95LCAiMiIgPSAibm8iLCAiMSIgPSAieWVzIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBwYXN0Mndrc19kZW50aXN0X3kgPSByZWNvZGVfZmFjdG9yKHBhc3Qyd2tzX2RlbnRpc3RfeSwgIjIiID0gIm5vIiwgIjEiID0gInllcyIsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgY3VycmVudHR4X3kgPSByZWNvZGVfZmFjdG9yKGN1cnJlbnR0eF95LCAiMiIgPSAibm8iLCAiMSIgPSAieWVzIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBwb3N0bWVub3BhdXNhbF95ID0gcmVjb2RlX2ZhY3Rvcihwb3N0bWVub3BhdXNhbF95LCAiMSIgPSAibm8vcHJlIiwgIjIiID0gInllcy9wb3N0IiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBuX2xpdmViaXJ0aHMgPSByZWNvZGVfZmFjdG9yKG5fbGl2ZWJpcnRocywgIjYiID0gIjAiLCAiMSIgPSAiMSIsICIyIiA9ICIyIiwgIjMiID0gIjMiLCAiNCIgPSAiNCIsICI1IiA9ICI1IG9yIG1vcmUiLCAub3JkZXJlZCA9IFRSVUUpLAogICAgICAgIG5fbnVyc2VkID0gcmVjb2RlX2ZhY3RvcihuX251cnNlZCwgIjYiID0gIjAiLCAiMSIgPSAiMSIsICIyIiA9ICIyIiwgIjMiID0gIjMiLCAiNCIgPSAiNCIsICI1IiA9ICI1IG9yIG1vcmUiLCAub3JkZXJlZCA9IFRSVUUpLAogICAgICAgIHNtb2tpbmdfeSA9IHJlY29kZV9mYWN0b3Ioc21va2luZ195LCAiMiIgPSAibm8iLCAiMSIgPSAieWVzIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICBzbW9raW5nX3BlcmRheSA9IHJlY29kZV9mYWN0b3Ioc21va2luZ19wZXJkYXksICI0IiA9ICI8IDEgY2lnYXJldHRlL2RheSIsICIzIiA9ICIxLTEwIGNpZ2FyZXR0ZXMvZGF5IiwgIjIiID0gIj4xMCBjaWdhcmV0dGVzL2RheSIsICIxIiA9ICI+MSBwYWNrL2RheSIsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgY2FmZmVpbmVfcGVyZGF5ID0gcmVjb2RlX2ZhY3RvcihjYWZmZWluZV9wZXJkYXksICI0IiA9ICJuZXZlciBvciA8MXgiLCAiMyIgPSAiMS0zeCIsICIyIiA9ICIzLTV4IiwgIjEiID0gIj41eCIsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgZXhlcmNpc2UgPSByZWNvZGVfZmFjdG9yKGV4ZXJjaXNlLCAiMSIgPSAibm90IGF0IGFsbCIsICIyIiA9ICIxeC93ZWVrICgzMCsgbWlucykiLCAiMyIgPSAiMi0zeC93ZWVrICgzMCsgbWlucykiLCAiNCIgPSAiPjN4L3dlZWsgKDMwKyBtaW5zKSIsIC5vcmRlcmVkID0gVFJVRSkpCgojIEluIFJTdHVkaW8sIGRvdWJsZS1jaGVjayB5b3VyIHdvcmsgYnkgaGlnaGxpZ2h0aW5nIHRoZSBuYW1lIG9mIGVhY2ggdmFyaWFibGUgdG8gc2hvdyBvdGhlciBpbnN0YW5jZXMgb2YgdGhhdCB2YXJpYWJsZSAoaGVscGZ1bCB3aXRoIGNvcHkvcGFzdGUgZXJyb3JzKQoKYGBgCiMjTmV3IHZhcmlhYmxlczogYWdlIGFuZCB0aW1lIHNpbmNlIGRlYXRoCgpgYGB7cn0KIyB0aGUgbHVicmlkYXRlIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aWR5dmVyc2UsIGJ1dCBpZiBub3Q6CiMgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikKCmxpYnJhcnkobHVicmlkYXRlKQoKIyBGaXJzdCwgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBkYXRlIHRoZXkgY29tcGxldGVkIHRoZSBiYXNlbGluZSBzdXJ2ZXksIG5vdCB0aGUgdGltZQojIHNvIHdlJ2xsIHNwbGl0ICdzdGFydGRhdGUnIGludG8gdHdvIGNvbHVtbnMsIHJlbW92aW5nIHRoZSB0aW1lIGNvbHVtbi4KCnRpZHlyOjpzZXBhcmF0ZShiYXNlbGluZV8zLCBzdGFydGRhdGUsIGMoInN0YXJ0ZGF0ZSIsICJ0aW1lIiksIHNlcCA9ICIgIikgLT4gYmFzZWxpbmVfMwpiYXNlbGluZV8zJHRpbWUgPC0gTlVMTAoKIyAnZG9iJyBhbmQgJ2RhdGVvZmRlYXRoJyBib3RoIG5lZWQgdG8gYmUgY29udmVydGVkIGZyb20gY2hhcmFjdGVyIHRvIGRhdGUuCiMgTm90aWNlIHRoYXQgRDEzOCBlbnRlcmVkIGRhdGVzIHVzaW5nIGRhc2hlcyAoLSkgcmF0aGVyIHRoYW4gc2xhc2hlcyAoLyksIHNvIHdlIG5lZWQgdG8gY2hhbmdlIHRoYXQuCiMgVXNlIHRoZSBtZHkgZnVuY3Rpb24gZnJvbSBsdWJyaWRhdGUgdG8gY29udmVydCAnZG9iJyBhbmQgJ2RhdGVvZmRlYXRoJyBmcm9tIGNoYXJhY3RlciB0byBkYXRlLgoKYmFzZWxpbmVfMyA8LSBiYXNlbGluZV8zICU+JSAKIG11dGF0ZShkYXRlb2ZkZWF0aCA9IHJlY29kZShkYXRlb2ZkZWF0aCwgIjEwLTAxLTIwMTUiID0gIjEwLzAxLzIwMTUiKSwKICAgICAgICBkb2IgPSByZWNvZGUoZG9iLCAiMDMtMTMtMTk1MCIgPSAiMDMvMTMvMTk1MCIpLAogICAgICAgIGRhdGVvZmRlYXRoID0gbWR5KGRhdGVvZmRlYXRoKSwKICAgICAgICBkb2IgPSBtZHkoZG9iKSwKICAgICAgICBzdGFydGRhdGUgPSB5bWQoc3RhcnRkYXRlKQogICAgICAgICkKCiMgTm93IHdlIG5lZWQgdG8gY2FsY3VsYXRlIHR3byBuZXcgdmFyaWFibGVzOiBhZ2UgYXQgZW5yb2xsbWVudCAodXNpbmcgd2hlbiB0aGV5IGNvbXBsZXRlZCB0aGUgYmFzZWxpbmUgc3VydmV5IGFzIGEgcHJveHkgZm9yIGVucm9sbG1lbnQpLCBhbmQgdGltZSBzaW5jZSBkZWF0aCBhdCBlbnJvbGxtZW50LiAKCmJhc2VsaW5lXzMgJT4lIG11dGF0ZSh0aW1lc2luY2VkZWF0aCA9IHN0YXJ0ZGF0ZSAtIGRhdGVvZmRlYXRoLCBhZ2UgPSBzdGFydGRhdGUgLSBkb2IpICU+JSBtdXRhdGVfYXQodmFycyh0aW1lc2luY2VkZWF0aCwgYWdlKSwgZnVucyhhcy5udW1lcmljKSkgLT4gYmFzZWxpbmVfMwojIG5lZWRlZCB0byBjb252ZXJ0IHRoZSBuZXcgdGltZXNpbmNlZGVhdGggdmFyaWFibGUgdG8gbnVtZXJpYyAodnMuIGRpZmZ0aW1lKSBvYmplY3QsIGJlY2F1c2UgdGhlcmUgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIG9wZXJhdGUgb24gZGlmZnRpbWUgb2JqZWN0cy4KIyB0byBnZXQgdGhlaXIgYWdlIGluIHllYXJzIChpbnN0ZWFkIG9mIGRheXMpLCB1c2UKYmFzZWxpbmVfMyAlPiUgbXV0YXRlKGFnZV95cnMgPSBhZ2UvMzY1KSAtPiBiYXNlbGluZV8zCgpsaWJyYXJ5KHBzeWNoKQojIHRpbWUgc2luY2UgZGVhdGgKZGVzY3JpYmUoYmFzZWxpbmVfMyR0aW1lc2luY2VkZWF0aCkKIyBhZ2UgaW4geWVhcnMKZGVzY3JpYmUoYmFzZWxpbmVfMyRhZ2VfeXJzKQoKCmBgYAoKCgpgYGB7cn0KIyBzYXZlIHlvdXIgd29yayBmcmVxdWVudGx5IQpzYXZlUkRTKGJhc2VsaW5lXzMsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2Jhc2VsaW5lXzMucmRzIikKCiMgbG9hZCBpZiBuZWVkZWQ6IAojIGJhc2VsaW5lXzMgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV8zLnJkcyIpCgojICdoYXZlbicgcGFja2FnZSBzaG91bGQgYWxsb3cgeW91IHRvIHNhdmUgYXMgLnNhdiBmaWxlIGJ1dCB3b24ndCB3b3JrIGZvciBtZSAtIGZpbGUgaXMgYmxhbmsgd2hlbiBJIG9wZW4gaXQgaW4gc3BzcwojICdmb3JlaWduJyBwYWNrYWdlIGhhc24ndCB3b3JrZWQgZWl0aGVyIC0gbWF5IGJlIGNvbXBhdGliaWxpdHkgaXNzdWUgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBTUFNTPwpgYGAKCiMjIENsZWFuIG51bWVyaWNhbCB2YXJpYWJsZXMgYW5kIHNjb3Jpbmcgc2NhbGVzCk5vdywgbGV0J3MgdGFja2xlIG91ciBzY2FsZXMuPGJyPgpRdWFsdHJpY3MgYXNzaWducyB2YWx1ZXMgc3RhcnRpbmcgd2l0aCAxIGFzIGRlZmF1bHQsIGJ1dCB0aGlzIGRvZXNuJ3QgYWx3YXlzIG1hdGNoIHdoYXQgdGhlIHZhbHVlcyBzaG91bGQgYmUgKGkuZS4sIHdoZW4gYW4gaXRlbSBzaG91bGQgYmUgc2NvcmVkIDAtMywgbm90IDEtNCkuIAoKYGBge3J9CiMgRm9yIHRoaXMgc2VjdGlvbiwgeW91J2xsIG5lZWQgdGhlICdwc3ljaCcgcGFja2FnZQojIyBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpIGlmIHlvdSBkb24ndCBoYXZlIGl0IG9uIHRoaXMgbWFjaGluZQpsaWJyYXJ5KHBzeWNoKQoKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV8zICMgbWFrZSBhIG5ldyBpdGVyYXRpb24gb2YgdGhlIGRhdGFzZXQgZm9yIHNjb3JpbmcgYW5kIHJlY29kaW5nCgojIyMjIyMjIyMjIyMjIyMjIyMgIAojIyMgUGVyY2VpdmVkIFN0cmVzcyBTY2FsZQoKIyBDaXRhdGlvbjogQ29oZW4sIFMuLCBLYW1hcmNrLCBULiwgYW5kIE1lcm1lbHN0ZWluLCBSLiAoMTk4MykuIEEgZ2xvYmFsIG1lYXN1cmUgb2YgcGVyY2VpdmVkIHN0cmVzcy4gSm91cm5hbCBvZiBIZWFsdGggYW5kIFNvY2lhbCBCZWhhdmlvciwgMjQsIDM4Ni0zOTYuIAoKIyBBbnN3ZXIgY2hvaWNlcyByYW5nZSBmcm9tIDAgKE5ldmVyKSDigJMgNCAoVmVyeSBPZnRlbikuIAojIFJldmVyc2Ugc2NvcmVkIGl0ZW1zID0gNCwgNSwgNywgOC4gCiMgU3VtIGFsbCBpdGVtcyAocG9zc2libGUgcmFuZ2U6IDAg4oCTIDQwKSBbdG90X3Bzc10KCiMgRmlyc3QsIHJldmVyc2Ugc2NvcmUgKGFuZC9vciByZWNvZGUsIGlmIGFwcGxpY2FibGUpIHRoZSByZWxldmFudCBpdGVtczoKYmFzZWxpbmVfNCRwc3NfNHIgPC0gNCAtIGJhc2VsaW5lXzMkcHNzXzQKYmFzZWxpbmVfNCRwc3NfNXIgPC0gNCAtIGJhc2VsaW5lXzMkcHNzXzUKYmFzZWxpbmVfNCRwc3NfN3IgPC0gNCAtIGJhc2VsaW5lXzMkcHNzXzcKYmFzZWxpbmVfNCRwc3NfOHIgPC0gNCAtIGJhc2VsaW5lXzMkcHNzXzgKCiMgQW5vdGhlciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZToKIyMgY29scyA9IGMoInBzc180IiwgInBzc181IiwgInBzc183IiwgInBzc184IikKIyMgYmFzZWxpbmVbICxjb2xzXSA9IDUgLSBiYXNlbGluZVsgLGNvbHNdCiMjIEJVVCB0aGUgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB5b3UgY291bGQgYWNjaWRlbnRhbGx5IHJlLXJ1biB0aG9zZSBsaW5lcywgd2hpY2ggd291bGQgdW5kbyB0aGUgcmV2ZXJzZSBzY29yaW5nIGJlY2F1c2UgaXQgYXNzaWducyB0aGUgbmV3IHNjb3JpbmcgYmFjayB0byB0aGUgb2xkIHZhcmlhYmxlLgoKIyBIb3cgdG8gY3JlYXRlIGEgbmV3ICd0b3RhbCcgdmFyaWFibGU6CiMjIEZpcnN0LCBzdWJzZXQgb3V0IHRoZSBjb2x1bW5zIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdG90YWwgc2NvcmUuCiMjIFRoZW4gdXNlIHJvd1N1bXMgdG8gZ2V0IHRoZSB0b3RhbCwgYW5kIGF0dGFjaCB0b3RfcHNzIGJhY2sgdG8gdGhlIGRhdGFmcmFtZS4KdG90X3BzcyA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMocHNzXzEscHNzXzIscHNzXzMscHNzXzRyLHBzc181cixwc3NfNixwc3NfN3IscHNzXzhyLHBzc185LHBzc18xMCkpCmJhc2VsaW5lXzQkdG90X3BzcyA8LSByb3dTdW1zKHRvdF9wc3MsIG5hLnJtPVRSVUUpICMgaWYgbmEucm09RkFMU0UsIHBhcnRpY2lwYW50cyB3aXRoIG1pc3NpbmcgcmVzcG9uc2VzIG9uIGFueSBvZiB0aGUgaXRlbXMgaW4gdGhlIHN1YnNldCB3aWxsIG5vdCBoYXZlIHRoZWlyIHRvdGFsIHNjb3JlIGNhbGN1bGF0ZWQgKGkuZS4sIHRoZWlyIHRvdGFsIHdpbGwgYmUgTkEpCgoKIyBDaGVjayBvdXQgdGhlIGRlc2NyaXB0aXZlcyBpZiB5b3UgbGlrZSAodGhvdWdoIHdlJ2xsIGRvIHRoaXMgbGF0ZXIgdG9vKQpkZXNjcmliZShiYXNlbGluZV80JHRvdF9wc3MpCgoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIFllYXJuaW5nIGluIFNpdHVhdGlvbnMgb2YgTG9zcwogIAojIENpdGF0aW9uOiBPJ0Nvbm5vciwgTS4gRi4sICYgU3Vzc21hbiwgVC4gSi4gKDIwMTQpLiBEZXZlbG9waW5nIHRoZSB5ZWFybmluZyBpbiBzaXR1YXRpb25zIG9mIGxvc3Mgc2NhbGU6IENvbnZlcmdlbnQgYW5kIGRpc2NyaW1pbmFudCB2YWxpZGl0eSBmb3IgYmVyZWF2ZW1lbnQsIHNwb3VzZSBicmVha3VwLCBhbmQgaG9tZXNpY2tuZXNzLiBEZWF0aCBTdHVkaWVzLCAzOCg3KSwgNDUwLTQ1OC4KCiMgQW5zd2VyIGNob2ljZXMgcmFuZ2UgZnJvbSAxIChOZXZlcikg4oCTIDUgKEFsd2F5cykuIAojIE5PIHJldmVyc2Ugc2NvcmVkIGl0ZW1zLiAKIyBTdW0gYWxsIGl0ZW1zIChwb3NzaWJsZSByYW5nZTogMjEg4oCTIDEwNSkgW3RvdF95c2xdCgp0b3RfeXNsIDwtIHN1YnNldChiYXNlbGluZV8zLCBzZWxlY3Q9Yyh5c2xfMTp5c2xfMjEpKQpiYXNlbGluZV80JHRvdF95c2wgPC0gcm93U3Vtcyh0b3RfeXNsLCBuYS5ybT1UUlVFKQogIApkZXNjcmliZShiYXNlbGluZV80JHRvdF95c2wpCgogIAojIyMjIyMjIyMjIyMjIyMjIyMgIAojIyMgSW52ZW50b3J5IG9mIENvbXBsaWNhdGVkIEdyaWVmIChOT1QgdGhlIElDRy1SZXZpc2VkLCBhbHRob3VnaCBpdCB3YXMgbGFiZWxlZCBhcyBzdWNoIGluIFF1YWx0cmljcykKICAKIyBDaXRhdGlvbjogUHJpZ2Vyc29uLCBILiBHLiwgTWFjaWVqZXdza2ksIFAuIEsuLCBSZXlub2xkcywgQy4gRi4sIEJpZXJoYWxzLCBBLiBKLiwgTmV3c29tLCBKLiBULiwgRmFzaWN6a2EsIEEuLCAuLi4gJiBNaWxsZXIsIE0uICgxOTk1KS4gSW52ZW50b3J5IG9mIENvbXBsaWNhdGVkIEdyaWVmOiBhIHNjYWxlIHRvIG1lYXN1cmUgbWFsYWRhcHRpdmUgc3ltcHRvbXMgb2YgbG9zcy4gUHN5Y2hpYXRyeSBSZXNlYXJjaCwgNTkoMSksIDY1LTc5LgoKIyBBbnN3ZXIgY2hvaWNlcyByYW5nZSBmcm9tIDAgKE5ldmVyKSDigJMgNCAoQWx3YXlzKS4gCiMgTk8gcmV2ZXJzZSBzY29yZWQgaXRlbXMuIAojIFN1bSBhbGwgaXRlbXMgKHBvc3NpYmxlIHJhbmdlOiAwIOKAkyA3NjsgY2xpbmljYWwgY3V0LW9mZiA9IDI1KS4gW3RvdF9pY2ddCgp0b3RfaWNnIDwtIHN1YnNldChiYXNlbGluZV8zLCBzZWxlY3Q9YyhpY2dfMTppY2dfMTkpKQpiYXNlbGluZV80JHRvdF9pY2cgPC0gcm93U3Vtcyh0b3RfaWNnLCBuYS5ybT1UUlVFKQogIApkZXNjcmliZShiYXNlbGluZV80JHRvdF9pY2cpCgoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIEJlY2sgRGVwcmVzc2lvbiBJbnZlbnRvcnktSUkgIAoKIyBDaXRhdGlvbjogQmVjaywgQS5ULiwgU3RlZXIsIFIuQS4sICYgQnJvd24sIEcuSy4gKDE5OTYpLiBNYW51YWwgZm9yIHRoZSBCZWNrIERlcHJlc3Npb24gSW52ZW50b3J5LUlJLiBTYW4gQW50b25pbywgVFg6IFBzeWNob2xvZ2ljYWwgQ29ycG9yYXRpb24uCgojIEFuc3dlciBjaG9pY2VzIHJhbmdlIGZyb20gMCDigJMgMy4KIyBOTyByZXZlcnNlIHNjb3JlZCBpdGVtcy4gCiMgU3VtIGFsbCBpdGVtcyAocG9zc2libGUgcmFuZ2U6IDAg4oCTIDYzOyA8MTQgPSBNaW5pbWFsLCAxNC0yMCA9IE1pbGQsIDIwLTI5ID0gTW9kZXJhdGUsIDI5LTUxID0gU2V2ZXJlKS4gW3RvdF9iZGldCgpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzFjID0gcmVjb2RlKGJkaV8xLCAiMSIgPSAiMCIsICIyIiA9ICIxIiwgIjMiID0gIjIiLCAiNCIgPSAiMyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzJjID0gcmVjb2RlKGJkaV8yLCAiMSIgPSAiMCIsICI0IiA9ICIxIiwgIjYiID0gIjIiLCAiNyIgPSAiMyIpKSAjIG5vdGUgdGhhdCB0aGUgUXVhbHRyaWNzIGNvZGluZyBvbiBpdGVtIDIgZGlmZmVyZWQgZnJvbSB0aGUgb3RoZXIgaXRlbXMKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV8zYyA9IHJlY29kZShiZGlfMywgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV80YyA9IHJlY29kZShiZGlfNCwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV81YyA9IHJlY29kZShiZGlfNSwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV82YyA9IHJlY29kZShiZGlfNiwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV83YyA9IHJlY29kZShiZGlfNywgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV84YyA9IHJlY29kZShiZGlfOCwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV85YyA9IHJlY29kZShiZGlfOSwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV8xMGMgPSByZWNvZGUoYmRpXzEwLCAiMSIgPSAiMCIsICIyIiA9ICIxIiwgIjMiID0gIjIiLCAiNCIgPSAiMyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzExYyA9IHJlY29kZShiZGlfMTEsICIxIiA9ICIwIiwgIjIiID0gIjEiLCAiMyIgPSAiMiIsICI0IiA9ICIzIikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShiZGlfMTJjID0gcmVjb2RlKGJkaV8xMiwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV8xM2MgPSByZWNvZGUoYmRpXzEzLCAiMSIgPSAiMCIsICIyIiA9ICIxIiwgIjMiID0gIjIiLCAiNCIgPSAiMyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzE0YyA9IHJlY29kZShiZGlfMTQsICIxIiA9ICIwIiwgIjIiID0gIjEiLCAiMyIgPSAiMiIsICI0IiA9ICIzIikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShiZGlfMTVjID0gcmVjb2RlKGJkaV8xNSwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV8xNmMgPSByZWNvZGUoYmRpXzE2LCAiMSIgPSAiMCIsICIyIiA9ICIxIiwgIjMiID0gIjIiLCAiNCIgPSAiMyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzE3YyA9IHJlY29kZShiZGlfMTcsICIxIiA9ICIwIiwgIjIiID0gIjEiLCAiMyIgPSAiMiIsICI0IiA9ICIzIikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShiZGlfMThjID0gcmVjb2RlKGJkaV8xOCwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGJkaV8xOWMgPSByZWNvZGUoYmRpXzE5LCAiMSIgPSAiMCIsICIyIiA9ICIxIiwgIjMiID0gIjIiLCAiNCIgPSAiMyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoYmRpXzIwYyA9IHJlY29kZShiZGlfMjAsICIxIiA9ICIwIiwgIjIiID0gIjEiLCAiMyIgPSAiMiIsICI0IiA9ICIzIikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShiZGlfMjFjID0gcmVjb2RlKGJkaV8yMSwgIjEiID0gIjAiLCAiMiIgPSAiMSIsICIzIiA9ICIyIiwgIjQiID0gIjMiKSkKICAgICAgICAgICAgICAKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGVfYXQodmFycyhiZGlfMWM6YmRpXzIxYyksIGZ1bnMoYXMubnVtZXJpYykpICAgICAgICAgICAgICAgICAKdG90X2JkaSA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMoYmRpXzFjOmJkaV8yMWMpKSAgCmJhc2VsaW5lXzQkdG90X2JkaSA8LSByb3dTdW1zKHRvdF9iZGksIG5hLnJtPVRSVUUpCiAgCmRlc2NyaWJlKGJhc2VsaW5lXzQkdG90X2JkaSkKCiAgIAogIAojIyMjIyMjIyMjIyMjIyMjIyMgIAojIyMgSGFuZCBVc2FnZSBRdWVzdGlvbm5haXJlIAoKIyBDaXRhdGlvbjogUmFjemtvd3NraSwgRC4sIEthbGF0LCBKLiBXLiwgJiBOZWJlcywgUi4gKDE5NzQpLiBSZWxpYWJpbGl0eSBhbmQgdmFsaWRpdHkgb2Ygc29tZSBoYW5kZWRuZXNzIHF1ZXN0aW9ubmFpcmUgaXRlbXMuIE5ldXJvcHN5Y2hvbG9naWEsIDEyKDEpLCA0My00Ny4KIyBTdW0gYWxsIGl0ZW1zICgxID0gUmlnaHQsIDIgPSBFaXRoZXIsIDMgPSBMZWZ0KS4gIFt0b3RfaGFuZGVkbmVzc10KIyBQb3NzaWJsZSByYW5nZTogMTMgKGNvbXBsZXRlbHkgcmlnaHQtaGFuZGVkKSDigJMgMzkgKGNvbXBsZXRlbHkgbGVmdC1oYW5kZWQpLgoKICAKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGUoaGFuZF8xYyA9IHJlY29kZShoYW5kXzEsICIyIiA9ICIxIiwgIjEiID0gIjMiLCAiNCIgPSAiMiIpKQpiYXNlbGluZV80IDwtIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShoYW5kXzJjID0gcmVjb2RlKGhhbmRfMiwgIjIiID0gIjEiLCAiMSIgPSAiMyIsICI0IiA9ICIyIikpCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGhhbmRfM2MgPSByZWNvZGUoaGFuZF8zLCAiMiIgPSAiMSIsICIxIiA9ICIzIiwgIjQiID0gIjIiKSkKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGUoaGFuZF80YyA9IHJlY29kZShoYW5kXzQsICIyIiA9ICIxIiwgIjEiID0gIjMiLCAiNCIgPSAiMiIpKQpiYXNlbGluZV80IDwtIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShoYW5kXzVjID0gcmVjb2RlKGhhbmRfNSwgIjIiID0gIjEiLCAiMSIgPSAiMyIsICI0IiA9ICIyIikpCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGhhbmRfNmMgPSByZWNvZGUoaGFuZF82LCAiMiIgPSAiMSIsICIxIiA9ICIzIiwgIjQiID0gIjIiKSkKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGUoaGFuZF83YyA9IHJlY29kZShoYW5kXzcsICIyIiA9ICIxIiwgIjEiID0gIjMiLCAiNCIgPSAiMiIpKQpiYXNlbGluZV80IDwtIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShoYW5kXzhjID0gcmVjb2RlKGhhbmRfOCwgIjIiID0gIjEiLCAiMSIgPSAiMyIsICI0IiA9ICIyIikpCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGhhbmRfOWMgPSByZWNvZGUoaGFuZF85LCAiMiIgPSAiMSIsICIxIiA9ICIzIiwgIjQiID0gIjIiKSkKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGUoaGFuZF8xMGMgPSByZWNvZGUoaGFuZF8xMCwgIjIiID0gIjEiLCAiMSIgPSAiMyIsICI0IiA9ICIyIikpCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGhhbmRfMTFjID0gcmVjb2RlKGhhbmRfMTEsICIyIiA9ICIxIiwgIjEiID0gIjMiLCAiNCIgPSAiMiIpKQpiYXNlbGluZV80IDwtIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShoYW5kXzEyYyA9IHJlY29kZShoYW5kXzEyLCAiMiIgPSAiMSIsICIxIiA9ICIzIiwgIjQiID0gIjIiKSkKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGUoaGFuZF9iYXRfMWMgPSByZWNvZGUoaGFuZF9iYXRfMSwgIjIiID0gIjEiLCAiMSIgPSAiMyIsICIzIiA9ICIyIikpCiAgCiAgCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlX2F0KHZhcnMoaGFuZF8xYzpoYW5kX2JhdF8xYyksIGZ1bnMoYXMubnVtZXJpYykpICAgICAgICAgICAgICAgICAKdG90X2hhbmRlZG5lc3MgPC0gc3Vic2V0KGJhc2VsaW5lXzQsIHNlbGVjdD1jKGhhbmRfMWM6aGFuZF9iYXRfMWMpKSAgCmJhc2VsaW5lXzQkdG90X2hhbmRlZG5lc3MgPC0gcm93U3Vtcyh0b3RfaGFuZGVkbmVzcywgbmEucm09VFJVRSkgCiAgCmRlc2NyaWJlKGJhc2VsaW5lXzQkdG90X2hhbmRlZG5lc3MpCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyAgCiMjIyBCZWhhdmlvcmFsIEluaGliaXRpb24vQmVoYXZpb3JhbCBBY3RpdmF0aW9uIFNjYWxlcyAoQklTL0JBUykgIAoKIyBDaXRhdGlvbjogQ2FydmVyLCBDLiBTLiwgJiBXaGl0ZSwgVC4gTC4gKDE5OTQpLiBCZWhhdmlvcmFsIGluaGliaXRpb24sIGJlaGF2aW9yYWwgYWN0aXZhdGlvbiwgYW5kIGFmZmVjdGl2ZSByZXNwb25zZXMgdG8gaW1wZW5kaW5nIHJld2FyZCBhbmQgcHVuaXNobWVudDogVGhlIEJJUy9CQVMgc2NhbGVzLiBKb3VybmFsIG9mIFBlcnNvbmFsaXR5IGFuZCBTb2NpYWwgUHN5Y2hvbG9neSwgNjcsIDMxOS0zMzMuCgojIEFuc3dlciBjaG9pY2VzIHJhbmdlIGZyb20gMSAoVmVyeSB0cnVlKSDigJMgNCAoVmVyeSBmYWxzZSkuIAojIFJldmVyc2Ugc2NvcmUgQUxMIGl0ZW1zIEVYQ0VQVCBmb3IgMiBhbmQgMjIuIAojIyBCQVMgRHJpdmU6IDMsIDksIDEyLCAyMSBbdG90X2Jpc2Jhc19iYXNkcl0KIyMgQkFTIEZ1biBTZWVraW5nOiA1LCAxMCwgMTUsIDIwIFt0b3RfYmlzYmFzX2Jhc2Z1bl0KIyMgQkFTIFJld2FyZCBSZXNwb25zaXZlbmVzczogNCwgNywgMTQsIDE4LCAyMyBbdG90X2Jpc2Jhc19iYXNycl0KIyMgQklTOiAyLCA4LCAxMywgMTYsIDE5LCAyMiwgMjQgW3RvdF9iaXNiYXNfYmlzXQojIyBJdGVtcyAxLCA2LCAxMSwgMTcgYXJlIGZpbGxlcnMuCgojIHJldmVyc2Ugc2NvcmU6CmJhc2VsaW5lXzQkYmlzYmFzXzFyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18xCmJhc2VsaW5lXzQkYmlzYmFzXzNyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18zCmJhc2VsaW5lXzQkYmlzYmFzXzRyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc180CmJhc2VsaW5lXzQkYmlzYmFzXzVyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc181CmJhc2VsaW5lXzQkYmlzYmFzXzZyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc182CmJhc2VsaW5lXzQkYmlzYmFzXzdyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc183CmJhc2VsaW5lXzQkYmlzYmFzXzhyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc184CmJhc2VsaW5lXzQkYmlzYmFzXzlyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc185CmJhc2VsaW5lXzQkYmlzYmFzXzEwciA8LSA1IC0gYmFzZWxpbmVfNCRiaXNiYXNfMTAKYmFzZWxpbmVfNCRiaXNiYXNfMTFyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18xMgpiYXNlbGluZV80JGJpc2Jhc18xMnIgPC0gNSAtIGJhc2VsaW5lXzQkYmlzYmFzXzEyCmJhc2VsaW5lXzQkYmlzYmFzXzEzciA8LSA1IC0gYmFzZWxpbmVfNCRiaXNiYXNfMTMKYmFzZWxpbmVfNCRiaXNiYXNfMTRyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18xNApiYXNlbGluZV80JGJpc2Jhc18xNXIgPC0gNSAtIGJhc2VsaW5lXzQkYmlzYmFzXzE1CmJhc2VsaW5lXzQkYmlzYmFzXzE2ciA8LSA1IC0gYmFzZWxpbmVfNCRiaXNiYXNfMTYKYmFzZWxpbmVfNCRiaXNiYXNfMTdyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18xNwpiYXNlbGluZV80JGJpc2Jhc18xOHIgPC0gNSAtIGJhc2VsaW5lXzQkYmlzYmFzXzE4CmJhc2VsaW5lXzQkYmlzYmFzXzE5ciA8LSA1IC0gYmFzZWxpbmVfNCRiaXNiYXNfMTkKYmFzZWxpbmVfNCRiaXNiYXNfMjByIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18yMApiYXNlbGluZV80JGJpc2Jhc18yMXIgPC0gNSAtIGJhc2VsaW5lXzQkYmlzYmFzXzIxCmJhc2VsaW5lXzQkYmlzYmFzXzIzciA8LSA1IC0gYmFzZWxpbmVfNCRiaXNiYXNfMjMKYmFzZWxpbmVfNCRiaXNiYXNfMjRyIDwtIDUgLSBiYXNlbGluZV80JGJpc2Jhc18yNAoKCiMgQkFTLURyaXZlIHN1YnNjYWxlCnRvdF9iYXNkciA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMoYmlzYmFzXzNyLCBiaXNiYXNfOXIsIGJpc2Jhc18xMnIsIGJpc2Jhc18yMXIpKQpiYXNlbGluZV80JHRvdF9iaXNiYXNfYmFzZHIgPC0gcm93U3Vtcyh0b3RfYmFzZHIsIG5hLnJtPVRSVUUpIAoKIyBCQVMtRnVuIFNlZWtpbmcgc3Vic2NhbGUKdG90X2Jhc2Z1biA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMoYmlzYmFzXzVyLCBiaXNiYXNfMTByLCBiaXNiYXNfMTVyLCBiaXNiYXNfMjByKSkKYmFzZWxpbmVfNCR0b3RfYmlzYmFzX2Jhc2Z1biA8LSByb3dTdW1zKHRvdF9iYXNmdW4sIG5hLnJtPVRSVUUpIAoKIyBCQVMtUmV3YXJkIFJlc3BvbnNpdmVuZXNzIHN1YnNjYWxlCnRvdF9iYXNyciA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMoYmlzYmFzXzRyLCBiaXNiYXNfN3IsIGJpc2Jhc18xNHIsIGJpc2Jhc18xOHIsIGJpc2Jhc18yM3IpKQpiYXNlbGluZV80JHRvdF9iaXNiYXNfYmFzcnIgPC0gcm93U3Vtcyh0b3RfYmFzcnIsIG5hLnJtPVRSVUUpIAogIAojIEJJUyBzdWJzY2FsZQp0b3RfYmlzIDwtIHN1YnNldChiYXNlbGluZV80LCBzZWxlY3Q9YyhiaXNiYXNfMiwgYmlzYmFzXzhyLCBiaXNiYXNfMTNyLCBiaXNiYXNfMTZyLCBiaXNiYXNfMTlyLCBiaXNiYXNfMjIsIGJpc2Jhc18yNHIpKQpiYXNlbGluZV80JHRvdF9iaXNiYXNfYmlzIDwtIHJvd1N1bXModG90X2JpcywgbmEucm09VFJVRSkgCiAgCmRlc2NyaWJlKGJhc2VsaW5lXzQkdG90X2Jpc2Jhc19iYXNkcikKZGVzY3JpYmUoYmFzZWxpbmVfNCR0b3RfYmlzYmFzX2Jhc2Z1bikKZGVzY3JpYmUoYmFzZWxpbmVfNCR0b3RfYmlzYmFzX2Jhc3JyKQpkZXNjcmliZShiYXNlbGluZV80JHRvdF9iaXNiYXNfYmlzKQoKCiAgCiAgCiMjIyMjIyMjIyMjIyMjIyMjIyAgCiMjIyBCcmllZiBHcmllZiBRdWVzdGlvbm5haXJlIAoKIyBDaXRhdGlvbnM6ICgxKSBTaGVhciwgSy4sICYgRXNzb2NrLCBTLiAoMjAwMikuIEJyaWVmIGdyaWVmIHF1ZXN0aW9ubmFpcmUuIFBpdHRzYnVyZ2gsIFBBOiBVbml2ZXJzaXR5IG9mIFBpdHRzYnVyZ2guICgyKSBTaGVhciwgSy4gTS4sIEphY2tzb24sIEMuIFQuLCBFc3NvY2ssIFMuIE0uLCBEb25haHVlLCBTLiBBLiwgJiBGZWx0b24sIEMuIEouICgyMDA2KS4gU2NyZWVuaW5nIGZvciBjb21wbGljYXRlZCBncmllZiBhbW9uZyBQcm9qZWN0IExpYmVydHkgc2VydmljZSByZWNpcGllbnRzIDE4IG1vbnRocyBhZnRlciBTZXB0ZW1iZXIgMTEsIDIwMDEuIFBzeWNoaWF0cmljIFNlcnZpY2VzLCA1Nyg5KSwgMTI5MS0xMjk3LgoKIyBTdW0gYWxsIGl0ZW1zICgwID0gTm90IGF0IGFsbCwgMSA9IFNvbWV3aGF0LCAyID0gQSBsb3QpLiAgW3RvdF9iZ3FdCiMjIFBvc3NpYmxlIHJhbmdlOiAwIOKAkyAxMC4gCiMjIEN1dG9mZnMgZnJvbSBTaGVhciBldCBhbC4gKDIwMDYpOiDigJw4IG9yIGhpZ2hlciwgY29tcGxpY2F0ZWQgZ3JpZWYgd2FzIGxpa2VseTsgYmV0d2VlbiA1IGFuZCA3LCBjb21wbGljYXRlZCBncmllZiB3YXMgbGlrZWx5IGF0IGEgc3VidGhyZXNob2xkIGxldmVsOyBhbmQgbGVzcyB0aGFuIDUsIGNvbXBsaWNhdGVkIGdyaWVmIHdhcyB1bmxpa2VseS7igJ0gRm9yIGEgZGljaG90b21vdXMgdmFyaWFibGUsIGEgc2NvcmUgb2YgNSBvciBhYm92ZSB3YXMgdGFrZW4gYXMgYSBwb3NpdGl2ZSBDRyBzY3JlZW4uCiAgICAKdG90X2JncSA8LSBzdWJzZXQoYmFzZWxpbmVfNCwgc2VsZWN0PWMoYmdxXzE6YmdxXzUpKQpiYXNlbGluZV80JHRvdF9iZ3EgPC0gcm93U3Vtcyh0b3RfYmdxLCBuYS5ybT1UUlVFKQogIApkZXNjcmliZShiYXNlbGluZV80JHRvdF9iZ3EpCgoKICAKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIEV4cGVyaWVuY2VzIGluIENsb3NlIFJlbGF0aW9uc2hpcHMgLSBSZWxhdGlvbnNoaXAgU3RydWN0dXJlcyAoR2xvYmFsIFZlcnNpb24pCgojIENpdGF0aW9uczogRnJhbGV5LCBSLiBDLiwgSGVmZmVybmFuLCBNLiBFLiwgVmljYXJ5LCBBLiBNLiwgJiBCcnVtYmF1Z2gsIEMuIEMuICgyMDExKS4gVGhlIEV4cGVyaWVuY2VzIGluIENsb3NlIFJlbGF0aW9uc2hpcHMtUmVsYXRpb25zaGlwIFN0cnVjdHVyZXMgcXVlc3Rpb25uYWlyZTogQSBtZXRob2QgZm9yIGFzc2Vzc2luZyBhdHRhY2htZW50IG9yaWVudGF0aW9ucyBhY3Jvc3MgcmVsYXRpb25zaGlwcy4gUHN5Y2hvbG9naWNhbCBBc3Nlc3NtZW50LCAyMywgNjE1LTYyNS4KCiMgUmV2ZXJzZS1zY29yZWQ6IDEsIDIsIDMsIDQuCiMgVHdvIHN1YnNjYWxlcyAoTk8gb3ZlcmFsbCB0b3RhbCkKIyMgQXZvaWRhbmNlOiAxLTYgW3RvdF9lY3Jyc19nbG9iYWxfYXZvaWRdIChhdmVyYWdlKQojIyBBbnhpZXR5OiA3LTkgW3RvdF9lY3Jyc19nbG9iYWxfYW54XSAoYXZlcmFnZSkKCiMgRml4IGluY29ycmVjdCBRdWFsdHJpY3MgY29kaW5nOgpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfZ2xvYmFsXzFjID0gcmVjb2RlKGVjcnJzX2dsb2JhbF8xLCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX2dsb2JhbF8yYyA9IHJlY29kZShlY3Jyc19nbG9iYWxfMiwgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19nbG9iYWxfM2MgPSByZWNvZGUoZWNycnNfZ2xvYmFsXzMsICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfZ2xvYmFsXzRjID0gcmVjb2RlKGVjcnJzX2dsb2JhbF80LCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX2dsb2JhbF81YyA9IHJlY29kZShlY3Jyc19nbG9iYWxfNSwgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19nbG9iYWxfNmMgPSByZWNvZGUoZWNycnNfZ2xvYmFsXzYsICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfZ2xvYmFsXzdjID0gcmVjb2RlKGVjcnJzX2dsb2JhbF83LCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX2dsb2JhbF84YyA9IHJlY29kZShlY3Jyc19nbG9iYWxfOCwgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19nbG9iYWxfOWMgPSByZWNvZGUoZWNycnNfZ2xvYmFsXzksICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQoKYmFzZWxpbmVfNCA8LSBiYXNlbGluZV80ICU+JSBtdXRhdGVfYXQodmFycyhlY3Jyc19nbG9iYWxfMWM6ZWNycnNfZ2xvYmFsXzljKSwgZnVucyhhcy5udW1lcmljKSkgIAoKIyBSZXZlcnNlIGNvZGUgaXRlbXMgMS00OgpiYXNlbGluZV80JGVjcnJzX2dsb2JhbF8xciA8LSA4IC0gYmFzZWxpbmVfNCRlY3Jyc19nbG9iYWxfMWMKYmFzZWxpbmVfNCRlY3Jyc19nbG9iYWxfMnIgPC0gOCAtIGJhc2VsaW5lXzQkZWNycnNfZ2xvYmFsXzJjCmJhc2VsaW5lXzQkZWNycnNfZ2xvYmFsXzNyIDwtIDggLSBiYXNlbGluZV80JGVjcnJzX2dsb2JhbF8zYwpiYXNlbGluZV80JGVjcnJzX2dsb2JhbF80ciA8LSA4IC0gYmFzZWxpbmVfNCRlY3Jyc19nbG9iYWxfNGMKCnRvdF9lY3Jyc19nbG9iYWxfYXZvaWQgPC0gc3Vic2V0KGJhc2VsaW5lXzQsICBzZWxlY3Q9YyhlY3Jyc19nbG9iYWxfMXI6ZWNycnNfZ2xvYmFsXzRyLCBlY3Jyc19nbG9iYWxfNWMsIGVjcnJzX2dsb2JhbF82YykpCnRvdF9lY3Jyc19nbG9iYWxfYW54IDwtIHN1YnNldChiYXNlbGluZV80LCAgc2VsZWN0PWMoZWNycnNfZ2xvYmFsXzdjOmVjcnJzX2dsb2JhbF85YykpCiAgCmJhc2VsaW5lXzQkdG90X2VjcnJzX2dsb2JhbF9hdm9pZCA8LSByb3dNZWFucyh0b3RfZWNycnNfZ2xvYmFsX2F2b2lkLCBuYS5ybT1UUlVFKQpiYXNlbGluZV80JHRvdF9lY3Jyc19nbG9iYWxfYW54IDwtIHJvd01lYW5zKHRvdF9lY3Jyc19nbG9iYWxfYW54LCBuYS5ybT1UUlVFKQogCmRlc2NyaWJlKGJhc2VsaW5lXzQkdG90X2VjcnJzX2dsb2JhbF9hdm9pZCkKZGVzY3JpYmUoYmFzZWxpbmVfNCR0b3RfZWNycnNfZ2xvYmFsX2FueCkKICAgIAojIyMjIyMjIyMjIyMjIyMjIyMgIAojIyMgRXhwZXJpZW5jZXMgaW4gQ2xvc2UgUmVsYXRpb25zaGlwcyAtIFJlbGF0aW9uc2hpcCBTdHJ1Y3R1cmVzIChSb21hbnRpYyBQYXJ0bmVyL1Nwb3VzZSBWZXJzaW9uKQoKIyBDaXRhdGlvbnM6IEZyYWxleSwgUi4gQy4sIEhlZmZlcm5hbiwgTS4gRS4sIFZpY2FyeSwgQS4gTS4sICYgQnJ1bWJhdWdoLCBDLiBDLiAoMjAxMSkuIFRoZSBFeHBlcmllbmNlcyBpbiBDbG9zZSBSZWxhdGlvbnNoaXBzLVJlbGF0aW9uc2hpcCBTdHJ1Y3R1cmVzIHF1ZXN0aW9ubmFpcmU6IEEgbWV0aG9kIGZvciBhc3Nlc3NpbmcgYXR0YWNobWVudCBvcmllbnRhdGlvbnMgYWNyb3NzIHJlbGF0aW9uc2hpcHMuIFBzeWNob2xvZ2ljYWwgQXNzZXNzbWVudCwgMjMsIDYxNS02MjUuCgojIFJldmVyc2Utc2NvcmVkOiAxLCAyLCAzLCA0LgojIFR3byBzdWJzY2FsZXMgKE5PIG92ZXJhbGwgdG90YWwpIAojIyBBdm9pZGFuY2U6IDEtNiBbdG90X2VjcnJzX2dsb2JhbF9hdm9pZF0gKGF2ZXJhZ2UpCiMjIEFueGlldHk6IDctOSBbdG90X2VjcnJzX2dsb2JhbF9hbnhdIChhdmVyYWdlKQoKIyBGaXggaW5jb3JyZWN0IFF1YWx0cmljcyBjb2RpbmcKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX3Nwb3VzZV8xYyA9IHJlY29kZShlY3Jyc19zcG91c2VfMSwgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19zcG91c2VfMmMgPSByZWNvZGUoZWNycnNfc3BvdXNlXzIsICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfc3BvdXNlXzNjID0gcmVjb2RlKGVjcnJzX3Nwb3VzZV8zLCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX3Nwb3VzZV80YyA9IHJlY29kZShlY3Jyc19zcG91c2VfNCwgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19zcG91c2VfNWMgPSByZWNvZGUoZWNycnNfc3BvdXNlXzUsICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfc3BvdXNlXzZjID0gcmVjb2RlKGVjcnJzX3Nwb3VzZV82LCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKYmFzZWxpbmVfNCA8LSAgYmFzZWxpbmVfNCAlPiUgbXV0YXRlKGVjcnJzX3Nwb3VzZV83YyA9IHJlY29kZShlY3Jyc19zcG91c2VfNywgIjEiPSIxIiwgIjIiPSIyIiwgIjMiPSIzIiwgIjQiPSI0IiwgIjciPSI1IiwgIjgiPSI2IiwgIjkiPSI3IikpCmJhc2VsaW5lXzQgPC0gIGJhc2VsaW5lXzQgJT4lIG11dGF0ZShlY3Jyc19zcG91c2VfOGMgPSByZWNvZGUoZWNycnNfc3BvdXNlXzgsICIxIj0iMSIsICIyIj0iMiIsICIzIj0iMyIsICI0Ij0iNCIsICI3Ij0iNSIsICI4Ij0iNiIsICI5Ij0iNyIpKQpiYXNlbGluZV80IDwtICBiYXNlbGluZV80ICU+JSBtdXRhdGUoZWNycnNfc3BvdXNlXzljID0gcmVjb2RlKGVjcnJzX3Nwb3VzZV85LCAiMSI9IjEiLCAiMiI9IjIiLCAiMyI9IjMiLCAiNCI9IjQiLCAiNyI9IjUiLCAiOCI9IjYiLCAiOSI9IjciKSkKCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlX2F0KHZhcnMoZWNycnNfc3BvdXNlXzFjOmVjcnJzX3Nwb3VzZV85YyksIGZ1bnMoYXMubnVtZXJpYykpIAoKIyBSZXZlcnNlIGNvZGUgaXRlbXMgMS00OgpiYXNlbGluZV80JGVjcnJzX3Nwb3VzZV8xciA8LSA4IC0gYmFzZWxpbmVfNCRlY3Jyc19zcG91c2VfMWMKYmFzZWxpbmVfNCRlY3Jyc19zcG91c2VfMnIgPC0gOCAtIGJhc2VsaW5lXzQkZWNycnNfc3BvdXNlXzJjCmJhc2VsaW5lXzQkZWNycnNfc3BvdXNlXzNyIDwtIDggLSBiYXNlbGluZV80JGVjcnJzX3Nwb3VzZV8zYwpiYXNlbGluZV80JGVjcnJzX3Nwb3VzZV80ciA8LSA4IC0gYmFzZWxpbmVfNCRlY3Jyc19zcG91c2VfNGMKCnRvdF9lY3Jyc19zcG91c2VfYXZvaWQgPC0gc3Vic2V0KGJhc2VsaW5lXzQsICBzZWxlY3Q9YyhlY3Jyc19zcG91c2VfMXI6ZWNycnNfc3BvdXNlXzRyLCBlY3Jyc19zcG91c2VfNWMsIGVjcnJzX3Nwb3VzZV82YykpCnRvdF9lY3Jyc19zcG91c2VfYW54IDwtIHN1YnNldChiYXNlbGluZV80LCAgc2VsZWN0PWMoZWNycnNfc3BvdXNlXzdjOmVjcnJzX3Nwb3VzZV85YykpCiAgCmJhc2VsaW5lXzQkdG90X2VjcnJzX3Nwb3VzZV9hdm9pZCA8LSByb3dNZWFucyh0b3RfZWNycnNfc3BvdXNlX2F2b2lkLCBuYS5ybT1UUlVFKQpiYXNlbGluZV80JHRvdF9lY3Jyc19zcG91c2VfYW54IDwtIHJvd01lYW5zKHRvdF9lY3Jyc19zcG91c2VfYW54LCBuYS5ybT1UUlVFKQogCmRlc2NyaWJlKGJhc2VsaW5lXzQkdG90X2VjcnJzX3Nwb3VzZV9hdm9pZCkKZGVzY3JpYmUoYmFzZWxpbmVfNCR0b3RfZWNycnNfc3BvdXNlX2FueCkKICAKCiMgU2F2ZSB5b3VyIHdvcmsgYWdhaW4Kc2F2ZVJEUyhiYXNlbGluZV80LCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV80LnJkcyIpCmBgYAoKIyMgSGlzdG9ncmFtcyBhbmQgYm94cGxvdHMKYGBge3J9CiMgQ3JlYXRlIGEgc3Vic2V0IG9mIG9ubHkgc2NhbGUgdG90YWwgc2NvcmVzIChpLmUuLCB2YXJpYWJsZXMgdGhhdCBzdGFydCB3aXRoICJ0b3QiKQpzY2FsZXMgPC0gYmFzZWxpbmVfNFssIGdyZXAoJ150b3QnLCBuYW1lcyhiYXNlbGluZV80KSldCgojIFBsb3QgdGhlIHZhcmlhYmxlczoKZm9yKGkgaW4gMTpsZW5ndGgoc2NhbGVzKSkgYm94cGxvdChzY2FsZXNbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoc2NhbGVzW2ldKSkKZm9yKGkgaW4gMTpsZW5ndGgoc2NhbGVzKSkgaGlzdChzY2FsZXNbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoc2NhbGVzW2ldKSkKCiMgQ2hlY2sgb3V0IGFnZSBhbmQgdGltZXNpbmNlZGVhdGggYXMgd2VsbDoKYm94cGxvdChiYXNlbGluZV80JGFnZV95cnMsIG1haW49ImFnZV95cnMiKQpib3hwbG90KGJhc2VsaW5lXzQkdGltZXNpbmNlZGVhdGgvMzY1LCBtYWluPSJ0aW1lc2luY2VkZWF0aCIpICMgaW4geWVhcnMKaGlzdChiYXNlbGluZV80JGFnZV95cnMpCmhpc3QoYmFzZWxpbmVfNCR0aW1lc2luY2VkZWF0aC8zNjUpICMgaW4geWVhcnMKCmRlc2NyaWJlKGJhc2VsaW5lXzQkYWdlX3lycykKZGVzY3JpYmUoYmFzZWxpbmVfNCR0aW1lc2luY2VkZWF0aCkKYGBgCk5vdGUgdGhhdCB0aGVyZSBpcyBvbmUgcGFydGljaXBhbnQgKEQxMzApIHdob3NlIGB0aW1lc2luY2VkZWF0aGAgaXMgPDYgbW9udGhzICgxNTEgZGF5cyBvciB+NSBtb250aHMpLiBBbHRob3VnaCBoZSB3YXMgc2NyZWVuZWQgMy8zMS8xNiBhbmQgY29tcGxldGVkIHRoZSBiYXNlbGluZSBzdXJ2ZXkgNC8xMS8xNiwgd2Ugd2FpdGVkIHVudGlsIDUvMTgvMTYgdG8gc2NhbiBoaW0gYmVjYXVzZSBvZiB0aGUgdGltZSBjcml0ZXJpb24sIGF0IHdoaWNoIHBvaW50IGl0IGhhZCBiZWVuIDYuMiBtb250aHMuIAoKIyMgRGVzY3JpcHRpdmVzIChudW1lcmljYWwgdmFyaWFibGVzKQpgYGB7cn0KIyBWaWV3IGRlc2NyaXB0aXZlcyBmb3IgZWFjaCBzY2FsZQojIyBzdGFyZ2F6ZXIgbWFrZXMgbmljZS1sb29raW5nIHN1bW1hcnkgdGFibGVzIChodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3RhcmdhemVyL3ZpZ25ldHRlcy9zdGFyZ2F6ZXIucGRmKQoKbGlicmFyeShzdGFyZ2F6ZXIpICMgaW5zdGFsbC5wYWNrYWdlcygic3RhcmdhemVyIikgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB1c2luZyB0aGUgcGFja2FnZSBvbiB0aGlzIG1hY2hpbmUKc3RhcmdhemVyKHNjYWxlcywgdHlwZT0idGV4dCIpCgpgYGAKCiMjIEZyZXF1ZW5jaWVzIChjYXRlZ29yaWNhbCB2YXJpYWJsZXMpCmBgYHtyfQojIE1ha2UgYSBzdWJzZXQgb2YgT05MWSB2YXJpYWJsZXMgdGhhdCBhcmUgZmFjdG9ycwojIGFuZCBwcmludCBjb2x1bW4gbmFtZXMgKGZhc3Qgd2F5IHRvIGtub3cgZXhhY3RseSB3aGljaCB2YXJpYWJsZXMgdG8gdXNlIGhlcmUpCmZhY3RvcnMgPC0gYmFzZWxpbmVfNCAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKQpjb2xuYW1lcyhmYWN0b3JzKQoKIyBGcmVxdWVuY3kgdGFibGVzCiMgTm90ZSBiZWxvdyB0aGF0IEkndmUgZ3JvdXBlZCBzb21lIG9mIHRoZSBjb3VudHMgdG8gbWFrZSB0aGVtIG1vcmUgaW5mb3JtYXRpdmUsIGZvciBleGFtcGxlIGhpZ2hlc3QgZGVncmVlIGJ5IGVkdWNhdGlvbiBvciBldGhuaWNpdHlfaGlzcCBieSByYWNlCgojIyBkZW1vZ3JhcGhpY3M6CmNvdW50KGJhc2VsaW5lXzQsc2V4X20pCmNvdW50KGJhc2VsaW5lXzQsZWR1Y2F0aW9uLGhpZ2hlc3RkZWdyZWUpIApjb3VudChiYXNlbGluZV80LGVtcGxveW1lbnQpCmNvdW50KGJhc2VsaW5lXzQscmFjZSxldGhuaWNpdHlfaGlzcCkKCiMjIG1lZGljYWw6CmNvdW50KGJhc2VsaW5lXzQsbWVkc195KQpjb3VudChiYXNlbGluZV80LG1ham9yaGVhbHRocHJvYnNfeSkKY291bnQoYmFzZWxpbmVfNCxwYXN0Mndrc19pbmp1cnlpbmZlY3RfeSkKY291bnQoYmFzZWxpbmVfNCxwYXN0Mndrc19kZW50aXN0X3kpCmNvdW50KGJhc2VsaW5lXzQsY3VycmVudHR4X3kpCmNvdW50KGJhc2VsaW5lXzQscG9zdG1lbm9wYXVzYWxfeSkKY291bnQoYmFzZWxpbmVfNCxuX2xpdmViaXJ0aHMpCmNvdW50KGJhc2VsaW5lXzQsbl9udXJzZWQpCmNvdW50KGJhc2VsaW5lXzQsc21va2luZ19wZXJkYXksIHNtb2tpbmdfeSkKY291bnQoYmFzZWxpbmVfNCxjYWZmZWluZV9wZXJkYXkpCmNvdW50KGJhc2VsaW5lXzQsZXhlcmNpc2UpCgojIyBvdGhlcjoKY291bnQoYmFzZWxpbmVfNCxrbm93YmVmb3JlX3kpCmNvdW50KGJhc2VsaW5lXzQsY2FyZXRha2VyX3kpCgoKIyBJIGNhbiBsb29rIGF0IG4td2F5IGZyZXF1ZW5jeSB0YWJsZXMgdXNpbmcgY291bnQgYXMgd2VsbCwgdGhvdWdoIHRoZXNlIGFyZSBoYXJkZXIgdG8gdW5kZXJzdGFuZAojIyBlLmcuLCBsb29rIGF0IGtub3diZWZvcmUgYnJva2VuIGRvd24gYnkgYm90aCBzZXggYW5kIHJhY2UKY291bnQoYmFzZWxpbmVfNCxrbm93YmVmb3JlX3ksc2V4X20scmFjZSkKCmBgYAoqKmhpc3QqKiBhbmQgKipib3hwbG90Kiogd29uJ3Qgd29yayB3aXRoIG5vbi1udW1lcmljYWwgdmFyaWFibGVzLCBidXQgaGVyZSdzIGEgY29kZSBzbmlwcGV0IGZvciBhIGJhc2ljIGJhciBjaGFydCBmb3IgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSBpbiBnZ3Bsb3Q6CmBgYApsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChmYWN0b3JzLCBhZXMoeCA9IGJhc2VsaW5lJGVkdWNhdGlvbikpICsKICAgICAgICBnZW9tX2JhcigpICsKICAgICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCgojIyBFdmFsdWF0ZSBtaXNzaW5nIGRhdGEgClRoaXMgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIGJhc2VsaW5lIGFkZGVkIG1lYXN1cmVzIChzZWUgbWlzc2luZyBkYXRhIHNlY3Rpb24gdW5kZXIgKipCYXNlbGluZSBhZGRlZCBtZWFzdXJlcyoqIGhlYWRpbmcpLgoKIyMgQ2hlY2sgc2NhbGUgcmVsaWFiaWxpdGllcwpgYGB7cn0KIyBUaGUgJ2FscGhhJyBmdW5jdGlvbiBpcyBoZWxwZnVsIGJlY2F1c2UgaXQgd2lsbCBhbGVydCB5b3UgaWYgeW91ciByZXZlcnNlIGNvZGluZyB3ZW50IGF3cnkgc29tZWhvdy4gCiMjIE5vdGUgdGhhdCBFbWlseSBCdXRsZXIgc2F5cyBpdCdzIG5vdCBhbHdheXMgY29ycmVjdCAtIGlmIGl0IGZsYWdzIGFuIGlzc3VlcyBhbmQgeW91J3ZlIGRvdWJsZS0gYW5kIHRyaXBsZS1jaGVja2VkIHlvdXIgcmV2ZXJzZSBjb2RpbmcsIGlnbm9yZSBpdC4KCiMgUHJpbWFyaWx5LCB3ZSB1c2UvcmVwb3J0IHRoZSBzdGFuZGFyZCBhbHBoYS4KCmxpYnJhcnkocHN5Y2gpCnBzeWNoOjphbHBoYSh0b3RfcHNzKQpwc3ljaDo6YWxwaGEodG90X3lzbCkKcHN5Y2g6OmFscGhhKHRvdF9pY2cpCnBzeWNoOjphbHBoYSh0b3RfYmdxKQpwc3ljaDo6YWxwaGEodG90X2JkaSkKcHN5Y2g6OmFscGhhKHRvdF9oYW5kZWRuZXNzKQpwc3ljaDo6YWxwaGEodG90X2JpcykKcHN5Y2g6OmFscGhhKHRvdF9iYXNkcikKcHN5Y2g6OmFscGhhKHRvdF9iYXNmdW4pCnBzeWNoOjphbHBoYSh0b3RfYmFzcnIpCnBzeWNoOjphbHBoYSh0b3RfZWNycnNfc3BvdXNlX2F2b2lkKQpwc3ljaDo6YWxwaGEodG90X2VjcnJzX3Nwb3VzZV9hbngpCiAgCgpgYGAKYGBge3J9CiMgc2F2ZSB0aGUgY2xlYW5lZCBkYXRhCnNhdmVSRFMoYmFzZWxpbmVfNCwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvYmFzZWxpbmUucmRzIikKd3JpdGUuY3N2KGJhc2VsaW5lXzQsIGZpbGUgPSAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZS5jc3YiKQpgYGAKCiNCYXNlbGluZSBhZGRlZCBtZWFzdXJlcwpUaGlzIHNlY3Rpb24gb2YgdGhlIHNjcmlwdCBkZWFscyB3aXRoIHRoZSAicG9zdCIgYWRkZW5kdW0gdG8gdGhlIGJhc2VsaW5lIHN1cnZleSwgY29udGFpbmluZyBhZGRpdGlvbmFsIHRyYWl0IG1lYXN1cmVzIHRoYXQgcGFydGljaXBhbnRzIGNvbXBsZXRlZCBhdCBob21lIGFmdGVyIHRoZXkgZmluaXNoZWQgdGhlaXIgdHdvIGV4cGVyaW1lbnRhbCBzZXNzaW9ucy4gVWx0aW1hdGVseSwgdGhlc2UgZGF0YSB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBiYXNlbGluZSBkYXRhc2V0LgoKKldoYXQgaGFzIGJlZW4gZG9uZSB1cCB0byB0aGlzIHBvaW50OiAoMSkgY29kZWJvb2sgY3JlYXRlZCwgKDIpIGRhdGEgZXhwb3J0ZWQgZnJvbSBRdWFsdHJpY3MuKgoKIyNJbXBvcnQgZGF0YSBhbmQgY2xlYW4gdXAgUXVhbHRyaWNzIGp1bmsKVGFzazogSW1wb3J0IGRhdGEgZnJvbSBDU1YgZmlsZSAqZXhjZXB0KiBmb3IgdGhlIGZpcnN0IDE3IGNvbHVtbnMgKDE6MTcgaXMganVzdCBRdWFsdHJpY3MganVuaykuPGJyPgoKYGBge3J9CiMgcnVuIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdXNpbmcgZHBseXIgb24geW91ciBsb2NhbCBtYWNoaW5lCmxpYnJhcnkoZHBseXIpIApmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdAoKYmFzZWxpbmVfcG9zdCA8LSByZWFkLmNzdigifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL09UK2ZNUkkrUG9zdF9KYW51YXJ5KzE4JTJDKzIwMTlfMTQuMjQuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBuYS5zdHJpbmdzPSIiKVsgLC1jKDI6MTcpXQojIG5hLnN0cmluZ3MgPSAiIiByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIHdoZXJlIG1pc3NpbmcgZGF0YSBpcyByZXByZXNlbnRlZCBieSBibGFuayBjZWxscyB3aXRoIE5BLCB3aGljaCBpcyBob3cgUiBoYW5kbGVzIG1pc3NpbmcgdmFsdWVzLgpgYGAKTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29ycmVjdCBzb21lIG9mIHRoZSBJRHMgdG8gbWF0Y2ggdGhlIGJhc2VsaW5lIGRhdGFzZXQgc28gdGhhdCB0aGUgdHdvIGRhdGFzZXRzIGNhbiB1bHRpbWF0ZWx5IGJlIG1lcmdlZC4KCmBgYHtyfQojIEZvdW5kIHNvbWUgZHVwbGljYXRlIElEczoKICAjIER1cGxpY2F0ZSBJRHMgd2l0aCBub24tZHVwbGljYXRlZCBkYXRhOiBEMTMxIChyb3cgMzEgYmxhbmspLCBEMTQ1IChyb3cgNDMgYmxhbmspCiAgIyBEdXBsaWNhdGUgSURzIHdpdGggZHVwbGljYXRlZCBkYXRhOiBEMTMwIChsb29rcyBsaWtlIGRhdGEgd2FzIGVudGVyZWQgMng/IGxpbmVzIDMzIGFuZCA0OSkKYmFzZWxpbmVfcG9zdCA8LSBiYXNlbGluZV9wb3N0ICU+JSBmaWx0ZXIoIWdyZXBsKCIyMDE2LTA1LTIzIDA2OjQ4OjEzIiwgU3RhcnREYXRlKSkgJT4lIAogIGZpbHRlcighZ3JlcGwoIjIwMTYtMTAtMTkgMTk6MjY6MDQiLCBTdGFydERhdGUpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCIyMDE2LTA2LTEzIDE1OjM1OjAyIiwgU3RhcnREYXRlKSkKCiMgZHJvcCB0aG9zZSByb3dzIGJhc2VkIG9uIHRoZWlyIHZhbHVlIGluIFN0YXJ0RGF0ZSwgdGhlbiBnZXQgcmlkIG9mIFN0YXJ0RGF0ZQpiYXNlbGluZV9wb3N0JFN0YXJ0RGF0ZSA8LSBOVUxMCgojIEFsc28gY29ycmVjdGVkIHNvbWUgb2YgdGhlIElEcyBzbyB0aGF0IGRhdGEgY2FuIHVsdGltYXRlbHkgYmUgbWVyZ2VkIGJ5IElEOgpiYXNlbGluZV9wb3N0IDwtIGJhc2VsaW5lX3Bvc3QgJT4lIG11dGF0ZShJRCA9IGFzLmNoYXJhY3RlcihyZWNvZGUoSUQsICI6RDEwMSIgPSAiRDEwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZDEwNCIgPSAiRDEwNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDEyMV9iIiA9ICJEMTIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQxMTdfYyIgPSAiRDExNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEIDEyMCIgPSAiRDEyMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDEyOCAoZW50ZXJlZCBmcm9tIGhhcmQgY29weSBieSBTUyA0LzEzLzE2KSIgPSAiRDEyOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEMTMwIFtlbnRlcmVkIGZyb20gaGFyZCBjb3B5IGJ5IFNTIDYvMTMvMTYsIHN1cnZleSBwb3N0bWFya2VkIDUvMzEvMTZdIiA9ICJEMTMwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpCgoKCgpiYXNlbGluZV9wb3N0XzAgPC0gYmFzZWxpbmVfcG9zdCAlPiUgZmlsdGVyKGdyZXBsKCJeRDEiLCBJRCwgaWdub3JlLmNhc2UgPSBUUlVFKSkKVmlldyhiYXNlbGluZV9wb3N0XzApCiMgTm93IHdlIGhhdmUgNDAgb2JzZXJ2YXRpb25zIG9mIDE1MCB2YXJpYWJsZXMsIGluc3RlYWQgb2YgNDkuCmBgYAoKIyNSZW5hbWUgdmFyaWFibGVzClRoZSBuYW1lIHRvIHRoZSBfbGVmdF8gb2YgdGhlIGVxdWFsIHNpZ24gaXMgdGhlIG5ldyBuYW1lLCB0aGUgb25lIG9uIHRoZSByaWdodCBpcyB3aGF0IHRoZSB2YXJpYWJsZSB3YXMgbmFtZWQgaW4gUXVhbHRyaWNzLgpgYGB7cn0KCmJhc2VsaW5lX3Bvc3RfMSA8LSByZW5hbWUoYmFzZWxpbmVfcG9zdF8wLCBJRCA9IElELCB1Y2xhX2xvbmVsaW5lc3NfMSA9IFVDTEFfMS4yMF8xLAp1Y2xhX2xvbmVsaW5lc3NfMiA9IFVDTEFfMS4yMF8yLAp1Y2xhX2xvbmVsaW5lc3NfMyA9IFVDTEFfMS4yMF8zLAp1Y2xhX2xvbmVsaW5lc3NfNCA9IFVDTEFfMS4yMF80LAp1Y2xhX2xvbmVsaW5lc3NfNSA9IFVDTEFfMS4yMF81LAp1Y2xhX2xvbmVsaW5lc3NfNiA9IFVDTEFfMS4yMF82LAp1Y2xhX2xvbmVsaW5lc3NfNyA9IFVDTEFfMS4yMF83LAp1Y2xhX2xvbmVsaW5lc3NfOCA9IFVDTEFfMS4yMF84LAp1Y2xhX2xvbmVsaW5lc3NfOSA9IFVDTEFfMS4yMF85LAp1Y2xhX2xvbmVsaW5lc3NfMTAgPSBVQ0xBXzEuMjBfMTAsCnVjbGFfbG9uZWxpbmVzc18xMSA9IFVDTEFfMS4yMF8xMSwKdWNsYV9sb25lbGluZXNzXzEyID0gVUNMQV8xLjIwXzEyLAp1Y2xhX2xvbmVsaW5lc3NfMTMgPSBVQ0xBXzEuMjBfMTMsCnVjbGFfbG9uZWxpbmVzc18xNCA9IFVDTEFfMS4yMF8xNCwKdWNsYV9sb25lbGluZXNzXzE1ID0gVUNMQV8xLjIwXzE1LAp1Y2xhX2xvbmVsaW5lc3NfMTYgPSBVQ0xBXzEuMjBfMTYsCnVjbGFfbG9uZWxpbmVzc18xNyA9IFVDTEFfMS4yMF8xNywKdWNsYV9sb25lbGluZXNzXzE4ID0gVUNMQV8xLjIwXzE4LAp1Y2xhX2xvbmVsaW5lc3NfMTkgPSBVQ0xBXzEuMjBfMTksCnVjbGFfbG9uZWxpbmVzc18yMCA9IFVDTEFfMS4yMF8yMCwKZ2NxXzEgPSBHQ1MuMS4zOF8xLApnY3FfMiA9IEdDUy4xLjM4XzIsCmdjcV8zID0gR0NTLjEuMzhfMywKZ2NxXzQgPSBHQ1MuMS4zOF80LApnY3FfNSA9IEdDUy4xLjM4XzUsCmdjcV82ID0gR0NTLjEuMzhfNiwKZ2NxXzcgPSBHQ1MuMS4zOF83LApnY3FfOCA9IEdDUy4xLjM4XzgsCmdjcV85ID0gR0NTLjEuMzhfOSwKZ2NxXzEwID0gR0NTLjEuMzhfMTAsCmdjcV8xMSA9IEdDUy4xLjM4XzExLApnY3FfMTIgPSBHQ1MuMS4zOF8xMiwKZ2NxXzEzID0gR0NTLjEuMzhfMTMsCmdjcV8xNCA9IEdDUy4xLjM4XzE0LApnY3FfMTUgPSBHQ1MuMS4zOF8xNSwKZ2NxXzE2ID0gR0NTLjEuMzhfMTYsCmdjcV8xNyA9IEdDUy4xLjM4XzE3LApnY3FfMTggPSBHQ1MuMS4zOF8xOCwKZ2NxXzE5ID0gR0NTLjEuMzhfMTksCmdjcV8yMCA9IEdDUy4xLjM4XzIwLApnY3FfMjEgPSBHQ1MuMS4zOF8yMSwKZ2NxXzIyID0gR0NTLjEuMzhfMjIsCmdjcV8yMyA9IEdDUy4xLjM4XzIzLApnY3FfMjQgPSBHQ1MuMS4zOF8yNCwKZ2NxXzI1ID0gR0NTLjEuMzhfMjUsCmdjcV8yNiA9IEdDUy4xLjM4XzI2LApnY3FfMjcgPSBHQ1MuMS4zOF8yNywKZ2NxXzI4ID0gR0NTLjEuMzhfMjgsCmdjcV8yOSA9IEdDUy4xLjM4XzI5LApnY3FfMzAgPSBHQ1MuMS4zOF8zMCwKZ2NxXzMxID0gR0NTLjEuMzhfMzEsCmdjcV8zMiA9IEdDUy4xLjM4XzMyLApnY3FfMzMgPSBHQ1MuMS4zOF8zMywKZ2NxXzM0ID0gR0NTLjEuMzhfMzQsCmdjcV8zNSA9IEdDUy4xLjM4XzM1LApnY3FfMzYgPSBHQ1MuMS4zOF8zNiwKZ2NxXzM3ID0gR0NTLjEuMzhfMzcsCmdjcV8zOCA9IEdDUy4xLjM4XzM4LApzcnJzXzEgPSBMRVMuMS41MV8xLCAKc3Jyc18yID0gTEVTLjEuNTFfMiwgCnNycnNfMyA9IExFUy4xLjUxXzMsCnNycnNfNCA9IExFUy4xLjUxXzQsCnNycnNfNSA9IExFUy4xLjUxXzUsCnNycnNfNiA9IExFUy4xLjUxXzYsCnNycnNfNyA9IExFUy4xLjUxXzcsCnNycnNfOCA9IExFUy4xLjUxXzgsCnNycnNfOSA9IExFUy4xLjUxXzksCnNycnNfMTAgPSBMRVMuMS41MV8xMCwKc3Jyc18xMSA9IExFUy4xLjUxXzExLApzcnJzXzEyID0gTEVTLjEuNTFfMTIsCnNycnNfMTMgPSBMRVMuMS41MV8xMywKc3Jyc18xNCA9IExFUy4xLjUxXzE0LApzcnJzXzE1ID0gTEVTLjEuNTFfMTUsCnNycnNfMTYgPSBMRVMuMS41MV8xNiwKc3Jyc18xNyA9IExFUy4xLjUxXzE3LApzcnJzXzE4ID0gTEVTLjEuNTFfMTgsCnNycnNfMTkgPSBMRVMuMS41MV8xOSwKc3Jyc18yMCA9IExFUy4xLjUxXzIwLApzcnJzXzIxID0gTEVTLjEuNTFfMjEsCnNycnNfMjIgPSBMRVMuMS41MV8yMiwKc3Jyc18yMyA9IExFUy4xLjUxXzIzLApzcnJzXzI0ID0gTEVTLjEuNTFfMjQsCnNycnNfMjUgPSBMRVMuMS41MV8yNSwKc3Jyc18yNiA9IExFUy4xLjUxXzI2LApzcnJzXzI3ID0gTEVTLjEuNTFfMjcsCnNycnNfMjggPSBMRVMuMS41MV8yOCwKc3Jyc18yOSA9IExFUy4xLjUxXzI5LApzcnJzXzMwID0gTEVTLjEuNTFfMzAsCnNycnNfMzEgPSBMRVMuMS41MV8zMSwKc3Jyc18zMiA9IExFUy4xLjUxXzMyLApzcnJzXzMzID0gTEVTLjEuNTFfMzMsCnNycnNfMzQgPSBMRVMuMS41MV8zNCwKc3Jyc18zNSA9IExFUy4xLjUxXzM1LApzcnJzXzM2ID0gTEVTLjEuNTFfMzYsCnNycnNfMzcgPSBMRVMuMS41MV8zNywKc3Jyc18zOCA9IExFUy4xLjUxXzM4LApzcnJzXzM5ID0gTEVTLjEuNTFfMzksCnNycnNfNDAgPSBMRVMuMS41MV80MCwKc3Jyc180MSA9IExFUy4xLjUxXzQxLApzcnJzXzQyID0gTEVTLjEuNTFfNDIsCnNycnNfNDMgPSBMRVMuMS41MV80MywKc3Jyc180NCA9IExFUy4xLjUxXzQ0LApzcnJzXzQ1ID0gTEVTLjEuNTFfNDUsCnNycnNfNDYgPSBMRVMuMS41MV80NiwKc3Jyc180NyA9IExFUy4xLjUxXzQ3LApzcnJzXzQ4ID0gTEVTLjEuNTFfNDgsCnNycnNfNDkgPSBMRVMuMS41MV80OSwKc3Jyc181MCA9IExFUy4xLjUxXzUwLApzcnJzXzUxID0gTEVTLjEuNTFfNTEsCnBwc3NfZnJfMSA9IFBQU1MuRnJfMSwKcHBzc19mcl8yID0gUFBTUy5Gcl8yLApwcHNzX2ZyXzMgPSBQUFNTLkZyXzMsCnBwc3NfZnJfNCA9IFBQU1MuRnJfNCwKcHBzc19mcl81ID0gUFBTUy5Gcl81LApwcHNzX2ZyXzYgPSBQUFNTLkZyXzYsCnBwc3NfZnJfNyA9IFBQU1MuRnJfNywKcHBzc19mcl84ID0gUFBTUy5Gcl84LApwcHNzX2ZyXzkgPSBQUFNTLkZyXzksCnBwc3NfZnJfMTAgPSBQUFNTLkZyXzEwLApwcHNzX2ZyXzExID0gUFBTUy5Gcl8xMSwKcHBzc19mcl8xMiA9IFBQU1MuRnJfMTIsCnBwc3NfZnJfMTMgPSBQUFNTLkZyXzEzLApwcHNzX2ZyXzE0ID0gUFBTUy5Gcl8xNCwKcHBzc19mcl8xNSA9IFBQU1MuRnJfMTUsCnBwc3NfZnJfMTYgPSBQUFNTLkZyXzE2LApwcHNzX2ZyXzE3ID0gUFBTUy5Gcl8yMSwKcHBzc19mcl8xOCA9IFBQU1MuRnJfMTcsCnBwc3NfZnJfMTkgPSBQUFNTLkZyXzE4LApwcHNzX2ZyXzIwID0gUFBTUy5Gcl8xOSwKcHBzc19mYV8xID0gUFBTUy5GYV8xLApwcHNzX2ZhXzIgPSBQUFNTLkZhXzE0LApwcHNzX2ZhXzMgPSBQUFNTLkZhXzIsCnBwc3NfZmFfNCA9IFBQU1MuRmFfMTUsCnBwc3NfZmFfNSA9IFBQU1MuRmFfMywKcHBzc19mYV82ID0gUFBTUy5GYV8yNywKcHBzc19mYV83ID0gUFBTUy5GYV80LApwcHNzX2ZhXzggPSBQUFNTLkZhXzUsCnBwc3NfZmFfOSA9IFBQU1MuRmFfOCwKcHBzc19mYV8xMCA9IFBQU1MuRmFfOSwKcHBzc19mYV8xMSA9IFBQU1MuRmFfMTAsCnBwc3NfZmFfMTIgPSBQUFNTLkZhXzExLApwcHNzX2ZhXzEzID0gUFBTUy5GYV8xMiwKcHBzc19mYV8xNCA9IFBQU1MuRmFfMTMsCnBwc3NfZmFfMTUgPSBQUFNTLkZhXzYsCnBwc3NfZmFfMTYgPSBQUFNTLkZhXzI4LApwcHNzX2ZhXzE3ID0gUFBTUy5GYV8xNiwKcHBzc19mYV8xOCA9IFBQU1MuRmFfMjEsCnBwc3NfZmFfMTkgPSBQUFNTLkZhXzE3LApwcHNzX2ZhXzIwID0gUFBTUy5GYV8xOQopCgojIEZpbmFsbHksIGxldCdzIG1ha2UgYWxsIG9mIHRoZSB2YXJpYWJsZXMgKGV4Y2VwdCBJRCkgbnVtZXJpYyByYXRoZXIgdGhhbiBjaHIuCmNvbG5hbWVzKGJhc2VsaW5lX3Bvc3RfMSkKYmFzZWxpbmVfcG9zdF8xIDwtIGJhc2VsaW5lX3Bvc3RfMSAlPiUgbXV0YXRlX2F0KHZhcnModWNsYV9sb25lbGluZXNzXzE6cHBzc19mYV8yMCksIGZ1bnMoYXMubnVtZXJpYykpCgojIENoZWNrIGl0IG91dDoKY29sbmFtZXMoYmFzZWxpbmVfcG9zdF8xKQoKIyBSIGRhdGEgZm9ybWF0ICgucmRzKSBwcmVzZXJ2ZXMgZGF0YSBzdHJ1Y3R1cmVzLCBzdWNoIGFzIGNvbHVtbiBkYXRhIHR5cGVzIChudW1lcmljLCBjaGFyYWN0ZXIgb3IgZmFjdG9yKS4gCnNhdmVSRFMoYmFzZWxpbmVfcG9zdF8xLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV9wb3N0XzEucmRzIikKIyBiYXNlbGluZV9wb3N0XzEgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV9wb3N0XzEucmRzIikKYGBgCgojI0NyZWF0ZSBmYWN0b3JzIGFuZCByZWNvZGUgdmFsdWVzCmBgYHtyfQojIFRoZSBvbmx5IHZhcmlhYmxlcyB3ZSBuZWVkIHRvIG1ha2UgaW50byBmYWN0b3JzIGFyZSB0aGUgU1JSUyB2YXJpYWJsZXMsIGluIHdoaWNoIHBhcnRpY2lwYW50cyBpbmRpY2F0ZSB5ZXMgb3Igbm8gdG8gZWFjaCBzdHJlc3NmdWwgbGlmZSBldmVudC4KCmxhYmVsc195biA8LSBjKCJObyIsICJZZXMiKQpsZXZlbHNfeW4gPC0gYygiMiIsICIxIikKCmJhc2VsaW5lX3Bvc3RfMiA8LSBiYXNlbGluZV9wb3N0XzEgJT4lIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJTUiIpKSwgCiAgICAgICAgICAgICAgICAgICAgICBmdW5zKGZhY3RvciguLCBsZXZlbHMgPSBsZXZlbHNfeW4sIGxhYmVscyA9IGxhYmVsc195biwgb3JkZXJlZCA9IFRSVUUpKSkKCiMgdGhpcyBpcyBhbiBvcmRlcmVkIGZhY3RvciB3aXRoIHR3byBsZXZlbHM6ICJObyIgWzFdIDwgIlllcyIgWzJdCiMgY29uZmlybSB0aGF0IDEncyBpbiBwb3N0XzEgYXJlIDIncyBpbiBwb3N0XzIgYW5kIHZpY2UgdmVyc2E6CnN0cihiYXNlbGluZV9wb3N0XzIkc3Jyc18xKQpzdHIoYmFzZWxpbmVfcG9zdF8xJHNycnNfMSkKCiMgQW5vdGhlciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBtYWtlIGVhY2ggaXRlbSBhIGZhY3RvciB3aGVyZSAibm8iID0gMCBhbmQgInllcyIgPSB3aGF0ZXZlciB0aGUgcmF0aW5nIGlzCgp3cml0ZS5jc3YoYmFzZWxpbmVfcG9zdF8yLCBmaWxlID0gIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvYmFzZWxpbmVfcG9zdF8yLmNzdiIpCnNhdmVSRFMoYmFzZWxpbmVfcG9zdF8yLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV9wb3N0XzIucmRzIikKIyBiYXNlbGluZV9wb3N0XzIgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV9wb3N0XzIucmRzIikKYGBgCgojIyBDbGVhbiBudW1lcmljYWwgdmFyaWFibGVzIGFuZCBzY29yZSBzY2FsZXMKCmBgYHtyfQojIEZvciB0aGlzIHNlY3Rpb24sIHlvdSdsbCBuZWVkIHRoZSAncHN5Y2gnIHBhY2thZ2UKIyMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKSBpZiB5b3UgZG9uJ3QgaGF2ZSBpdCBvbiB0aGlzIG1hY2hpbmUKbGlicmFyeShwc3ljaCkKCmJhc2VsaW5lX3Bvc3RfMyA8LSBiYXNlbGluZV9wb3N0XzIgIyBiYXNlbGluZV9wb3N0XzMgd2lsbCBjb250YWluIHRoZSBzY29yZWQgbWVhc3VyZXMKCiMjIyMjIyMjIyMjIyMjIyMjIyAgCiMjIyBTb2NpYWwgUmVhZGp1c3RtZW50IFJhdGluZyBTY2FsZSDigJMgUmV2aXNlZAoKIyBDaXRhdGlvbjogSG9ic29uLCBDLiBKLiwgS2FtZW4sIEouLCBTem9zdGVrLCBKLiwgTmV0aGVyY3V0LCBDLiBNLiwgVGllZG1hbm4sIEouIFcuLCAmIFdvam5hcm93aWN6LCBTLiAoMTk5OCkuIFN0cmVzc2Z1bCBsaWZlIGV2ZW50czogQSByZXZpc2lvbiBhbmQgdXBkYXRlIG9mIHRoZSBzb2NpYWwgcmVhZGp1c3RtZW50IHJhdGluZyBzY2FsZS4gSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIFN0cmVzcyBNYW5hZ2VtZW50LCA1KDEpLCAxLTIzLgojIEVhY2ggZXZlbnQgaXMgd2VpZ2h0ZWQgb3V0IG9mIDEwMCBwb2ludHMuIAojIFRvdGFsIHNjb3JlIGlzIHN1bSBvZiBhbGwgcmVzcG9uc2VzIFt0b3Rfc3Jyc10gCgojIE51bWJlciBvZiB0b3RhbCBzdHJlc3NmdWwgbGlmZSBldmVudHM6IFt0b3Rfbl9zcnJzXQoKc3Jyc19mYWN0b3IgPC0gc2VsZWN0KGJhc2VsaW5lX3Bvc3RfMywgc3RhcnRzX3dpdGgoInNycnMiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9zcnJzX24gPC0gcm93U3VtcyhzcnJzX2ZhY3RvclstYygzLDQ3KV0gPT0gIlllcyIpIAojIGRyb3AgJ2RlYXRoIG9mIGEgY2xvc2UgZmFtaWx5IG1lbWJlcicgKGl0ZW0gMywgY29sdW1uIDMpIHNpbmNlIGl0IHNlZW1zIHRoYXQgc29tZSBwYXJ0aWNpcGFudHMgbWF5IGhhdmUgYW5zd2VyZWQgcmVmZXJyaW5nIHRvIHRoZWlyIHNwb3VzZSBidXQgaXQgaXMgdW5jbGVhcgojIGRyb3AgJ2RlYXRoIG9mIGEgc3BvdXNlJyAoaXRlbSA0NywgY29sdW1uIDQ3KSBzaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBzdHJlc3NvcnMgb3V0c2lkZSBvZiBiZXJlYXZlbWVudApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X3NycnNfbikKCgojIFRvdGFsIHNjb3JlIChub3QgY291bnRpbmcgaXRlbXMgMyBhbmQgNDcpOgpzZWxlY3QoYmFzZWxpbmVfcG9zdF8zLCBzdGFydHNfd2l0aCgic3JycyIpKSAlPiUgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInNycnMiKSksIAogICAgICAgICAgICAgICAgICAgICAgZnVucyhhcy5udW1lcmljKSkgJT4lIHJlbmFtZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJzcnJzIikpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJjIikpIC0+IHNycnMKCnNycnMkc3Jyc18xYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMWMsICIyIiA9ICIzMiIsICIxIiA9ICIwIikpICMgQ2hhbmdpbmcgd29yayByZXNwb25zaWJpbGl0aWVzIChpbmNyZWFzZWQvZGVjcmVhc2VkIGhvdXJzL3RyYXZlbCkgCnNycnMkc3Jyc18yYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMmMsICIyIiA9ICI2MiIsICIxIiA9ICIwIikpICMgRXhwZXJpZW5jaW5nIGZpbmFuY2lhbCBwcm9ibGVtcy9kaWZmaWN1bHRpZXMgKGJhbmtydXB0Y3ksIGNyZWRpdCBjYXJkIGRlYnQsIGNvbGxlZ2UgY29zdHMsIHRheCBwcm9ibGVtcykgCnNycnMkc3Jyc18zYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfM2MsICIyIiA9ICI3OSIsICIxIiA9ICIwIikpICMgRGVhdGggb2YgY2xvc2UgZmFtaWx5IG1lbWJlciAKc3JycyRzcnJzXzRjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180YywgIjIiID0gIjM1IiwgIjEiID0gIjAiKSkgIyBDaGFuZ2UgaW4gcmVzaWRlbmNlIApzcnJzJHNycnNfNWMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzVjLCAiMiIgPSAiNDMiLCAiMSIgPSAiMCIpKSAjIENoYW5naW5nIGVtcGxveWVycy9jYXJlZXIgCnNycnMkc3Jyc182YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfNmMsICIyIiA9ICI0NSIsICIxIiA9ICIwIikpICMgRW1wbG95ZXIgcmVvcmdhbml6YXRpb24vZG93bnNpemluZyAKc3JycyRzcnJzXzdjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc183YywgIjIiID0gIjM3IiwgIjEiID0gIjAiKSkgIyBNYWpvciBkaXNhZ3JlZW1lbnQgd2l0aCBib3NzL2Nvd29ya2VyIApzcnJzJHNycnNfOGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzhjLCAiMiIgPSAiMzMiLCAiMSIgPSAiMCIpKSAjIENoYW5nZSBpbiBlbXBsb3ltZW50IHBvc2l0aW9uIChpLmUuLCBsYXRlcmFsIHRyYW5zZmVyLCBwcm9tb3Rpb24pIApzcnJzJHNycnNfOWMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzljLCAiMiIgPSAiMjIiLCAiMSIgPSAiMCIpKSAjIFJlY2VpdmluZyBhIHRpY2tldCBmb3IgdmlvbGF0aW5nIHRoZSBsYXcgKHRyYWZmaWMsIHBhcmtpbmcpIApzcnJzJHNycnNfMTBjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18xMGMsICIyIiA9ICIzMyIsICIxIiA9ICIwIikpICMgR2FpbmluZyBhIG5ldyBmYW1pbHkgbWVtYmVyICh0aHJvdWdoIGJpcnRoLCBhZG9wdGlvbiwgbWFycmlhZ2UpIApzcnJzJHNycnNfMTFjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18xMWMsICIyIiA9ICI3MiIsICIxIiA9ICIwIikpICMgTWFqb3IgaW5qdXJ5L2lsbG5lc3MgdG8gY2xvc2UgZmFtaWx5IG1lbWJlciAoaS5lLiwgY2FuY2VyLCBBSURTLCBldGMuKSAKc3JycyRzcnJzXzEyYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMTJjLCAiMiIgPSAiNDciLCAiMSIgPSAiMCIpKSAjIEF0dGVtcHRpbmcgdG8gbW9kaWZ5IGFkZGljdGl2ZSBiZWhhdmlvciBvZiBzZWxmIChpLmUuLCBzbW9raW5nLCBhbGNvaG9sLCBkcnVncywgZXRjLikgCnNycnMkc3Jyc18xM2MgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzEzYywgIjIiID0gIjMwIiwgIjEiID0gIjAiKSkgIyBPYnRhaW5pbmcgYSBtYWpvciBsb2FuIG90aGVyIHRoYW4gaG9tZSBtb3J0Z2FnZSAoY2FyLCBib2F0LCBldGMuKSAKc3JycyRzcnJzXzE0YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMTRjLCAiMiIgPSAiNjEiLCAiMSIgPSAiMCIpKSAjIERlYXRoIG9mIGNsb3NlIGZyaWVuZCAKc3JycyRzcnJzXzE1YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMTVjLCAiMiIgPSAiMzAiLCAiMSIgPSAiMCIpKSAjIE9idGFpbmluZyBhIGhvbWUgbW9ydGdhZ2UgCnNycnMkc3Jyc18xNmMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzE2YywgIjIiID0gIjY0IiwgIjEiID0gIjAiKSkgIyBCZWluZyBmaXJlZC9sYWlkIG9mZi91bmVtcGxveWVkIApzcnJzJHNycnNfMTdjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18xN2MsICIyIiA9ICI1MyIsICIxIiA9ICIwIikpICMgRXhwZXJpZW5jaW5nL2ludm9sdmVkIGluIGF1dG8gYWNjaWRlbnQgCnNycnMkc3Jyc18xOGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzE4YywgIjIiID0gIjQ2IiwgIjEiID0gIjAiKSkgIyBEaXNjb3ZlcmluZy9hdHRlbXB0aW5nIHRvIG1vZGlmeSBhZGRpY3RpdmUgYmVoYXZpb3Igb2YgY2xvc2UgZmFtaWx5IG1lbWJlciAoaS5lLiwgc21va2luZywgYWxjb2hvbCwgZHJ1Z3MsIGV0Yy4pIApzcnJzJHNycnNfMTljIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18xOWMsICIyIiA9ICIzOCIsICIxIiA9ICIwIikpICMgU3BvdXNlL21hdGUgYmVnaW5zL2NlYXNlcyB3b3JrIG91dHNpZGUgdGhlIGhvbWUgCnNycnMkc3Jyc18yMGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzIwYywgIjIiID0gIjU2IiwgIjEiID0gIjAiKSkgIyBBc3N1bWluZyByZXNwb25zaWJpbGl0eSBmb3Igc2ljayBvciBlbGRlcmx5IGxvdmVkIG9uZSAKc3JycyRzcnJzXzIxYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMjFjLCAiMiIgPSAiMzAiLCAiMSIgPSAiMCIpKSAjIENoaWxkIGxlYXZpbmcgaG9tZSAoaS5lLiwgbWFycmlhZ2UsIHN0YW5kaW5nIGNvbGxlZ2UsIGV0Yy4pIApzcnJzJHNycnNfMjJjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18yMmMsICIyIiA9ICI3OCIsICIxIiA9ICIwIikpICMgTWFqb3IgaW5qdXJ5L2lsbG5lc3MgdG8gc2VsZiAoY2FuY2VyLCBBSURTLCBldGMuKSAKc3JycyRzcnJzXzIzYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMjNjLCAiMiIgPSAiNTYiLCAiMSIgPSAiMCIpKSAjIExvc3Mgb2Yvb3IgbWFqb3IgcmVkdWN0aW9uIGluIGhlYWx0aCBpbnN1cmFuY2UvYmVuZWZpdHMgCnNycnMkc3Jyc18yNGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzI0YywgIjIiID0gIjM0IiwgIjEiID0gIjAiKSkgIyBGaW5kaW5nIGFwcHJvcHJpYXRlIGNoaWxkIGNhcmUvZGF5IGNhcmUgCnNycnMkc3Jyc18yNWMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzI1YywgIjIiID0gIjY2IiwgIjEiID0gIjAiKSkgIyBTZXBhcmF0aW9uIG9yIHJlY29uY2lsaWF0aW9uIHdpdGggc3BvdXNlL21hdGUgCnNycnMkc3Jyc18yNmMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzI2YywgIjIiID0gIjcwIiwgIjEiID0gIjAiKSkgIyBCZWluZyBhIHZpY3RpbSBvZiBjcmltZSAodGhlZnQsIHJvYmJlcnksIGFzc2F1bHQsIHJhcGUsIGV0Yy4pIApzcnJzJHNycnNfMjdjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18yN2MsICIyIiA9ICI0MSIsICIxIiA9ICIwIikpICMgUHJlZ25hbmN5IG9mIHNwb3VzZS9tYXRlL3NlbGYgCnNycnMkc3Jyc18yOGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzI4YywgIjIiID0gIjUzIiwgIjEiID0gIjAiKSkgIyBNYWpvciBkaXNhZ3JlZW1lbnQgb3ZlciBjaGlsZCBzdXBwb3J0L2N1c3RvZHkvdmlzaXRhdGlvbiAKc3JycyRzcnJzXzI5YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMjljLCAiMiIgPSAiNDkiLCAiMSIgPSAiMCIpKSAjIENoaWxkIGRldmVsb3BzIGJlaGF2aW9yIG9yIGxlYXJuaW5nIHByb2JsZW1zIApzcnJzJHNycnNfMzBjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zMGMsICIyIiA9ICIyNiIsICIxIiA9ICIwIikpICMgQmVnaW5uaW5nL2NlYXNpbmcgZm9ybWFsIGVkdWNhdGlvbiAKc3JycyRzcnJzXzMxYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMzFjLCAiMiIgPSAiNTYiLCAiMSIgPSAiMCIpKSAjIFNlbGYvY2xvc2UgZmFtaWx5IG1lbWJlciBiZWluZyBhcnJlc3RlZCBmb3IgdmlvbGF0aW5nIHRoZSBsYXcgCnNycnMkc3Jyc18zMmMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzMyYywgIjIiID0gIjUwIiwgIjEiID0gIjAiKSkgIyBBZHVsdCBjaGlsZCBtb3ZpbmcgaW4gd2l0aCBwYXJlbnQvcGFyZW50IG1vdmluZyBpbiB3aXRoIGFkdWx0IGNoaWxkIApzcnJzJHNycnNfMzNjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zM2MsICIyIiA9ICI1OSIsICIxIiA9ICIwIikpICMgU3Vydml2aW5nIGEgZGlzYXN0ZXIgKGZpcmUsIGZsb29kLCBlYXJ0aHF1YWtlLCB0b3JuYWRvLCBodXJyaWNhbmUpIApzcnJzJHNycnNfMzRjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zNGMsICIyIiA9ICI0MiIsICIxIiA9ICIwIikpICMgRmFpbHVyZSB0byBvYnRhaW4vcXVhbGlmeSBmb3IgYSBtb3J0Z2FnZSAKc3JycyRzcnJzXzM1YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfMzVjLCAiMiIgPSAiMzgiLCAiMSIgPSAiMCIpKSAjIEV4cGVyaWVuY2luZyBlbXBsb3ltZW50IGRpc2NyaW1pbmF0aW9uL3NleHVhbCBoYXJhc3NtZW50IApzcnJzJHNycnNfMzZjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zNmMsICIyIiA9ICIzOSIsICIxIiA9ICIwIikpICMgRXhwZXJpZW5jaW5nIGRpc2NyaW1pbmF0aW9uL2hhcmFzc21lbnQgb3V0c2lkZSB0aGUgd29ya3BsYWNlIApzcnJzJHNycnNfMzdjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zN2MsICIyIiA9ICIyOCIsICIxIiA9ICIwIikpICMgUmV0aXJlbWVudApzcnJzJHNycnNfMzhjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc18zOGMsICIyIiA9ICI0MyIsICIxIiA9ICIwIikpICMgR2V0dGluZyBtYXJyaWVkL3JlbWFycmllZCAoc2VsZikgCnNycnMkc3Jyc18zOWMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzM5YywgIjIiID0gIjU5IiwgIjEiID0gIjAiKSkgIyBCZWNvbWluZyBhIHNpbmdsZSBwYXJlbnQgCnNycnMkc3Jyc180MGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzQwYywgIjIiID0gIjcxIiwgIjEiID0gIjAiKSkgIyBEaXZvcmNlIApzcnJzJHNycnNfNDFjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180MWMsICIyIiA9ICI2OSIsICIxIiA9ICIwIikpICMgSW5maWRlbGl0eSAoY2hlYXRpbmcgb24gc3BvdXNlL21hdGUpIApzcnJzJHNycnNfNDJjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180MmMsICIyIiA9ICIzMyIsICIxIiA9ICIwIikpICMgRXhwZXJpZW5jaW5nIGEgbGFyZ2UgdW5leHBlY3RlZCBtb25ldGFyeSBnYWluIApzcnJzJHNycnNfNDNjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180M2MsICIyIiA9ICI0NCIsICIxIiA9ICIwIikpICMgRGVhbGluZyB3aXRoIGluZmVydGlsaXR5L21pc2NhcnJpYWdlIApzcnJzJHNycnNfNDRjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180NGMsICIyIiA9ICI1MyIsICIxIiA9ICIwIikpICMgQmVpbmcgZGlzY2lwbGluZWQgYXQgd29yay9kZW1vdGVkIApzcnJzJHNycnNfNDVjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180NWMsICIyIiA9ICI2OSIsICIxIiA9ICIwIikpICMgRXhwZXJpZW5jaW5nIGRvbWVzdGljIHZpb2xlbmNlL3NleHVhbCBhYnVzZSAKc3JycyRzcnJzXzQ2YyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfNDZjLCAiMiIgPSAiNzYiLCAiMSIgPSAiMCIpKSAjIERldGVudGlvbiBpbiBqYWlsIG9yIG90aGVyIGluc3RpdHV0aW9uIChtZW50YWwsIGRydWcgcmVoYWIsIGV0Yy4pIApzcnJzJHNycnNfNDdjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180N2MsICIyIiA9ICI4NyIsICIxIiA9ICIwIikpICMgRGVhdGggb2Ygc3BvdXNlL21hdGUgCnNycnMkc3Jyc180OGMgPC0gYXMubnVtZXJpYyhyZWNvZGUoc3JycyRzcnJzXzQ4YywgIjIiID0gIjUxIiwgIjEiID0gIjAiKSkgIyBEZWFsaW5nIHdpdGggdW53YW50ZWQgcHJlZ25hbmN5IApzcnJzJHNycnNfNDljIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc180OWMsICIyIiA9ICI3MSIsICIxIiA9ICIwIikpICMgRm9yZWNsb3N1cmUgb24gbG9hbi9tb3J0Z2FnZSAKc3JycyRzcnJzXzUwYyA8LSBhcy5udW1lcmljKHJlY29kZShzcnJzJHNycnNfNTBjLCAiMiIgPSAiMzkiLCAiMSIgPSAiMCIpKSAjIFJlbGVhc2UgZnJvbSBqYWlsIApzcnJzJHNycnNfNTFjIDwtIGFzLm51bWVyaWMocmVjb2RlKHNycnMkc3Jyc181MWMsICIyIiA9ICI2OSIsICIxIiA9ICIwIikpICMgQmVpbmcgdGhlIHZpY3RpbSBvZiBwb2xpY2UgYnJ1dGFsaXR5IAoKIyBBdHRhY2ggdG90X3NycnMgYmFjayB0byB0aGUgYmFzZWxpbmVfcG9zdF8zIGRhdGFmcmFtZSwgbWludXMgdGhlICdkZWF0aCBvZiBzcG91c2UnIGFuZCAnZGVhdGggb2YgY2xvc2UgZmFtaWx5IG1lbWJlcicgaXRlbXMgbWVudGlvbmVkIGFib3ZlOgpiYXNlbGluZV9wb3N0XzMkdG90X3NycnMgPC0gcm93U3VtcyhzcnJzWy1jKDMsNDcpXSwgbmEucm09VFJVRSkKZGVzY3JpYmUoYmFzZWxpbmVfcG9zdF8zJHRvdF9zcnJzKQoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIFVDTEEgTG9uZWxpbmVzcyBTY2FsZSAtIFZlcnNpb24gMwoKIyBDaXRhdGlvbjogUnVzc2VsbCwgRC4gKDE5OTYpLiBVQ0xBIExvbmVsaW5lc3MgU2NhbGUgKFZlcnNpb24gMyk6IFJlbGlhYmlsaXR5LCB2YWxpZGl0eSwgYW5kIGZhY3RvciBzdHJ1Y3R1cmUuIEpvdXJuYWwgb2YgUGVyc29uYWxpdHkgQXNzZXNzbWVudCwgNjYsIDIwLTQwLiAKCiMgQW5zd2VyIGNob2ljZXMgcmFuZ2UgZnJvbSAxIChOZXZlcikg4oCTIDQgKE9mdGVuKS4KIyBSZXZlcnNlLXNjb3JlZDogMSwgNSwgNiwgOSwgMTAsIDE1LCAxNiwgMTksIDIwLgojIFN1bSBhbGwgaXRlbXMgZm9yIHRvdGFsIHNjb3JlIFt0b3RfdWNsYV9sb25lbGluZXNzXS4KCiMgcmV2ZXJzZS1zY29yZSBpdGVtczoKYmFzZWxpbmVfcG9zdF8zJHVjbGFfbG9uZWxpbmVzc18xciA8LSA2IC0gYmFzZWxpbmVfcG9zdF8yJHVjbGFfbG9uZWxpbmVzc18xCmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfNXIgPC0gNiAtIGJhc2VsaW5lX3Bvc3RfMiR1Y2xhX2xvbmVsaW5lc3NfNQpiYXNlbGluZV9wb3N0XzMkdWNsYV9sb25lbGluZXNzXzZyIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzYKYmFzZWxpbmVfcG9zdF8zJHVjbGFfbG9uZWxpbmVzc185ciA8LSA2IC0gYmFzZWxpbmVfcG9zdF8yJHVjbGFfbG9uZWxpbmVzc185CmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfMTByIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzEwCmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfMTVyIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzE1CmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfMTZyIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzE2CmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfMTlyIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzE5CmJhc2VsaW5lX3Bvc3RfMyR1Y2xhX2xvbmVsaW5lc3NfMjByIDwtIDYgLSBiYXNlbGluZV9wb3N0XzIkdWNsYV9sb25lbGluZXNzXzIwCgojIHRvdGFsIHNjb3JlOgp0b3RfdWNsYV9sb25lbGluZXNzIDwtIHN1YnNldChiYXNlbGluZV9wb3N0XzMsIHNlbGVjdD1jKCJ1Y2xhX2xvbmVsaW5lc3NfMXIiLCJ1Y2xhX2xvbmVsaW5lc3NfMiIsICJ1Y2xhX2xvbmVsaW5lc3NfMyIsICJ1Y2xhX2xvbmVsaW5lc3NfNCIsICJ1Y2xhX2xvbmVsaW5lc3NfNXIiLCAidWNsYV9sb25lbGluZXNzXzZyIiwgInVjbGFfbG9uZWxpbmVzc183IiwgInVjbGFfbG9uZWxpbmVzc184IiwgInVjbGFfbG9uZWxpbmVzc185ciIsICJ1Y2xhX2xvbmVsaW5lc3NfMTByIiwgInVjbGFfbG9uZWxpbmVzc18xMSIsICJ1Y2xhX2xvbmVsaW5lc3NfMTIiLCAidWNsYV9sb25lbGluZXNzXzEzIiwgInVjbGFfbG9uZWxpbmVzc18xNCIsICJ1Y2xhX2xvbmVsaW5lc3NfMTVyIiwgInVjbGFfbG9uZWxpbmVzc18xNnIiLCAidWNsYV9sb25lbGluZXNzXzE3IiwgInVjbGFfbG9uZWxpbmVzc18xOCIsICJ1Y2xhX2xvbmVsaW5lc3NfMTlyIiwgInVjbGFfbG9uZWxpbmVzc18yMHIiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF91Y2xhX2xvbmVsaW5lc3MgPC0gcm93U3Vtcyh0b3RfdWNsYV9sb25lbGluZXNzLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUoYmFzZWxpbmVfcG9zdF8zJHRvdF91Y2xhX2xvbmVsaW5lc3MpCgoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIEdyaWVmIENvZ25pdGlvbnMgU2NhbGUKCiMgQ2l0YXRpb246IEJvZWxlbiwgUC4gJiBMZW5zdmVsdC1NdWxkZXJzLCBHLiAoMjAwNSkuIFBzeWNob21ldHJpYyBwcm9wZXJ0aWVzIG9mIHRoZSBHcmllZiBDb2duaXRpb25zIFF1ZXN0aW9ubmFpcmUgKEdDUSkuIEpvdXJuYWwgb2YgUHN5Y2hvcGF0aG9sb2d5IGFuZCBCZWhhdmlvcmFsIEFzc2Vzc21lbnQsIDI3LCAyOTHigJMzMDMuIAoKIyBBbnN3ZXIgY2hvaWNlcyByYW5nZSBmcm9tIDAgKHN0cm9uZyBkaXNhZ3JlZSkgdG8gNSAoc3Ryb25nbHkgYWdyZWUpCiMgTk8gcmV2ZXJzZSBzY29yZWQgaXRlbXMuCiMgU3VtIGFsbCBpdGVtcyBmb3IgdG90YWwgc2NvcmUgW3RvdF9nY3FdLgoKIyA5IHN1YnNjYWxlczoKIyBTZWxmOiAxLCA3LCA5LCAyMiwgMjUsIDM3IFt0b3RfZ2NxX3NlbGZdCiMgV29ybGQ6IDMsIDEwLCAxOSwgMzQgW3RvdF9nY3Ffd29ybGRdCiMgTGlmZTogMTIsIDE1LCAyMCwgMzIgW3RvdF9nY3FfbGlmZV0KIyBGdXR1cmU6IDUsIDEzLCAyMSwgMjcsIDM1IFt0b3RfZ2NxX2Z1dHVyZV0KIyBTZWxmLUJsYW1lOiAyLCAxNywgMjQsIDMwLCAzMyBbdG90X2djcV9ibGFtZV0KIyBPdGhlcnM6IDQsIDE4LCAyOSBbdG90X2djcV9vdGhlcnNdCiMgQXBwcm9wcmlhdGVuZXNzIG9mIGdyaWVmOiAxMSwgMTYsIDI2LCAzMSBbdG90X2djcV9hcHByb3BdCiMgQ2hlcmlzaCBncmllZjogNiwgMTQsIDI4IFt0b3RfZ2NxX2NoZXJpc2hdCiMgVGhyZWF0ZW5pbmcgaW50ZXJwcmV0YXRpb24gb2YgZ3JpZWY6IDgsIDIzLCAzNiwgMzggW3RvdF9nY3FfdGhyZWF0XQoKIyBTZWxmOgp0b3RfZ2NxX3NlbGYgPC0gc3Vic2V0KGJhc2VsaW5lX3Bvc3RfMiwgc2VsZWN0PWMoImdjcV8xIiwgImdjcV83IiwgImdjcV85IiwgImdjcV8yMiIsICJnY3FfMjUiLCAiZ2NxXzM3IikpCmJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX3NlbGYgPC0gcm93U3Vtcyh0b3RfZ2NxX3NlbGYsIG5hLnJtPVRSVUUpIApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X2djcV9zZWxmKQoKIyBXb3JsZDogCnRvdF9nY3Ffd29ybGQgPC0gc3Vic2V0KGJhc2VsaW5lX3Bvc3RfMiwgc2VsZWN0PWMoImdjcV8zIiwgImdjcV8xMCIsICJnY3FfMTkiLCAiZ2NxXzM0IikpCmJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX3dvcmxkIDwtIHJvd1N1bXModG90X2djcV93b3JsZCwgbmEucm09VFJVRSkgCmRlc2NyaWJlKGJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX3dvcmxkKQoKIyBMaWZlOiAKdG90X2djcV9saWZlIDwtIHN1YnNldChiYXNlbGluZV9wb3N0XzIsIHNlbGVjdD1jKCJnY3FfMTIiLCAiZ2NxXzE1IiwgImdjcV8yMCIsICJnY3FfMzIiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3FfbGlmZSA8LSByb3dTdW1zKHRvdF9nY3FfbGlmZSwgbmEucm09VFJVRSkgCmRlc2NyaWJlKGJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX2xpZmUpCgojIEZ1dHVyZTogCnRvdF9nY3FfZnV0dXJlIDwtIHN1YnNldChiYXNlbGluZV9wb3N0XzIsIHNlbGVjdD1jKCJnY3FfNSIsICJnY3FfMTMiLCAiZ2NxXzIxIiwgImdjcV8yNyIsICJnY3FfMzUiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3FfZnV0dXJlIDwtIHJvd1N1bXModG90X2djcV9mdXR1cmUsIG5hLnJtPVRSVUUpIApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X2djcV9mdXR1cmUpCgojIFNlbGYtQmxhbWU6IAp0b3RfZ2NxX2JsYW1lIDwtIHN1YnNldChiYXNlbGluZV9wb3N0XzIsIHNlbGVjdD1jKCJnY3FfMiIsICJnY3FfMTciLCAiZ2NxXzI0IiwgImdjcV8zMCIsICJnY3FfMzMiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3FfYmxhbWUgPC0gcm93U3Vtcyh0b3RfZ2NxX2JsYW1lLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUoYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3FfYmxhbWUpCgojIE90aGVyczoKdG90X2djcV9vdGhlcnMgPC0gc3Vic2V0KGJhc2VsaW5lX3Bvc3RfMiwgc2VsZWN0PWMoImdjcV80IiwgImdjcV8xOCIsICJnY3FfMjkiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3Ffb3RoZXJzIDwtIHJvd1N1bXModG90X2djcV9vdGhlcnMsIG5hLnJtPVRSVUUpIApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X2djcV9vdGhlcnMpCgojIEFwcHJvcHJpYXRlbmVzcyBvZiBncmllZjoKdG90X2djcV9hcHByb3AgPC0gc3Vic2V0KGJhc2VsaW5lX3Bvc3RfMiwgc2VsZWN0PWMoImdjcV8xMSIsICJnY3FfMTYiLCAiZ2NxXzI2IiwgImdjcV8zMSIpKQpiYXNlbGluZV9wb3N0XzMkdG90X2djcV9hcHByb3AgPC0gcm93U3Vtcyh0b3RfZ2NxX2FwcHJvcCwgbmEucm09VFJVRSkgCmRlc2NyaWJlKGJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX2FwcHJvcCkKCiMgQ2hlcmlzaCBncmllZjoKdG90X2djcV9jaGVyaXNoIDwtIHN1YnNldChiYXNlbGluZV9wb3N0XzIsIHNlbGVjdD1jKCJnY3FfNiIsICJnY3FfMTQiLCAiZ2NxXzI4IikpCmJhc2VsaW5lX3Bvc3RfMyR0b3RfZ2NxX2NoZXJpc2ggPC0gcm93U3Vtcyh0b3RfZ2NxX2NoZXJpc2gsIG5hLnJtPVRSVUUpIApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X2djcV9jaGVyaXNoKQoKIyBUaHJlYXRlbmluZyBpbnRlcnByZXRhdGlvbiBvZiBncmllZjogOCwgMjMsIDM2LCAzOAojIHRocmVhdDogMywgMTAsIDE5LCAzNAp0b3RfZ2NxX3RocmVhdCA8LSBzdWJzZXQoYmFzZWxpbmVfcG9zdF8yLCBzZWxlY3Q9YygiZ2NxXzgiLCAiZ2NxXzIzIiwgImdjcV8zNiIsICJnY3FfMzgiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9nY3FfdGhyZWF0IDwtIHJvd1N1bXModG90X2djcV90aHJlYXQsIG5hLnJtPVRSVUUpIApkZXNjcmliZShiYXNlbGluZV9wb3N0XzMkdG90X2djcV90aHJlYXQpCgoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIFByb2NpZGFubyBQZXJjZWl2ZWQgU29jaWFsIFN1cHBvcnQgU2NhbGUgLSBGcmllbmRzIFZlcnNpb24KCiMgQ2l0YXRpb246IFByb2NpZGFubywgTS4gRS4sICYgSGVsbGVyLCBLLiAoMTk4MykuIE1lYXN1cmVzIG9mIHBlcmNlaXZlZCBzb2NpYWwgc3VwcG9ydCBmcm9tIGZyaWVuZHMgYW5kIGZyb20gZmFtaWx5OiBUaHJlZSB2YWxpZGF0aW9uIHN0dWRpZXMuIEFtZXJpY2FuIEpvdXJuYWwgb2YgQ29tbXVuaXR5IFBzeWNob2xvZ3ksIDExKDEpLCAxLTI0LgoKIyBBbnN3ZXIgY2hvaWNlcyBhcmUgMSAoWWVzKSwgMCAoTm8pLCBOQS9ub3Qgc2NvcmVkIChEb24ndCBrbm93KS4KIyBSZXZlcnNlIHNjb3JlZCBpdGVtczogMiwgNiwgNywgMTUsIDE4LCAyMC4gCiMgU3VtIGFsbCBpdGVtcyAocG9zc2libGUgcmFuZ2U6IDAg4oCTIDIwKSBbdG90X3Bwc3NfZnJdCgojIHJlY29kZSB0aGUgcmVzcG9uc2VzIGZyb20gUXVhbHRyaWNzICh3aGVyZSAxID0gWWVzLCAyID0gTm8pIGludG8gMSA9IFllcywgMCA9IE5vKToKYmFzZWxpbmVfcG9zdF8zIDwtIGJhc2VsaW5lX3Bvc3RfMyAlPiUgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInBwc3NfZnIiKSksIAogICAgICAgICAgICAgICAgICAgICAgZnVucyhyZWNvZGUoLiwgIjEiPSIxIiwgIjIiPSIwIikpKQpiYXNlbGluZV9wb3N0XzMgPC0gYmFzZWxpbmVfcG9zdF8zICU+JSBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgicHBzc19mciIpKSwgZnVucyhhcy5udW1lcmljKSkKCiMgY29tcGFyZSBiZWZvcmUgYW5kIGFmdGVyOgpzdHIoYmFzZWxpbmVfcG9zdF8yJHBwc3NfZnJfMSkgIyBiZWZvcmUgcmVjb2RpbmcKc3RyKGJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZyXzEpICMgYWZ0ZXIgcmVjb2RpbmcKCiMgcmV2ZXJzZS1zY29yZSBpdGVtczoKYmFzZWxpbmVfcG9zdF8zJHBwc3NfZnJfMnIgPC0gYXMubnVtZXJpYyhyZWNvZGUoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZnJfMiwgIjEiID0gIjAiLCAiMCIgPSAiMSIpKQpiYXNlbGluZV9wb3N0XzMkcHBzc19mcl82ciA8LSBhcy5udW1lcmljKHJlY29kZShiYXNlbGluZV9wb3N0XzMkcHBzc19mcl82LCAiMSIgPSAiMCIsICIwIiA9ICIxIikpCmJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZyXzdyIDwtIGFzLm51bWVyaWMocmVjb2RlKGJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZyXzcsICIxIiA9ICIwIiwgIjAiID0gIjEiKSkKYmFzZWxpbmVfcG9zdF8zJHBwc3NfZnJfMTVyIDwtIGFzLm51bWVyaWMocmVjb2RlKGJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZyXzE1LCAiMSIgPSAiMCIsICIwIiA9ICIxIikpCmJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZyXzE4ciA8LSBhcy5udW1lcmljKHJlY29kZShiYXNlbGluZV9wb3N0XzMkcHBzc19mcl8xOCwgIjEiID0gIjAiLCAiMCIgPSAiMSIpKQpiYXNlbGluZV9wb3N0XzMkcHBzc19mcl8yMHIgPC0gYXMubnVtZXJpYyhyZWNvZGUoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZnJfMjAsICIxIiA9ICIwIiwgIjAiID0gIjEiKSkKCiMgY2hlY2sgdGhhdCBpdCB3b3JrZWQ6CnN0cihiYXNlbGluZV9wb3N0XzMkcHBzc19mcl8yKQpzdHIoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZnJfMnIpCgojIHRvdGFsIHNjb3JlOgp0b3RfcHBzc19mciA8LSBzdWJzZXQoYmFzZWxpbmVfcG9zdF8zLCBzZWxlY3Q9YygicHBzc19mcl8xIiwgInBwc3NfZnJfMnIiLCAicHBzc19mcl8zIiwgInBwc3NfZnJfNCIsICJwcHNzX2ZyXzUiLCAicHBzc19mcl82ciIsICJwcHNzX2ZyXzdyIiwgInBwc3NfZnJfOCIsICJwcHNzX2ZyXzkiLCAicHBzc19mcl8xMCIsICJwcHNzX2ZyXzExIiwgInBwc3NfZnJfMTIiLCAicHBzc19mcl8xMyIsICJwcHNzX2ZyXzE0IiwgInBwc3NfZnJfMTVyIiwgInBwc3NfZnJfMTYiLCAicHBzc19mcl8xNyIsICJwcHNzX2ZyXzE4ciIsICJwcHNzX2ZyXzE5IiwgInBwc3NfZnJfMjByIikpCmJhc2VsaW5lX3Bvc3RfMyR0b3RfcHBzc19mciA8LSByb3dTdW1zKHRvdF9wcHNzX2ZyLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUoYmFzZWxpbmVfcG9zdF8zJHRvdF9wcHNzX2ZyKQoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIFByb2NpZGFubyBQZXJjZWl2ZWQgU29jaWFsIFN1cHBvcnQgU2NhbGUgLSBGYW1pbHkgVmVyc2lvbgoKIyBDaXRhdGlvbjogUHJvY2lkYW5vLCBNLiBFLiwgJiBIZWxsZXIsIEsuICgxOTgzKS4gTWVhc3VyZXMgb2YgcGVyY2VpdmVkIHNvY2lhbCBzdXBwb3J0IGZyb20gZnJpZW5kcyBhbmQgZnJvbSBmYW1pbHk6IFRocmVlIHZhbGlkYXRpb24gc3R1ZGllcy4gQW1lcmljYW4gSm91cm5hbCBvZiBDb21tdW5pdHkgUHN5Y2hvbG9neSwgMTEoMSksIDEtMjQuCgojIEFuc3dlciBjaG9pY2VzIGFyZSAxIChZZXMpLCAwIChObyksIE5BL25vdCBzY29yZWQgKERvbid0IGtub3cpLgojIFJldmVyc2Ugc2NvcmVkIGl0ZW1zOiAzLCA0LCAxNiwgMTksIDIwLiAKIyBTdW0gYWxsIGl0ZW1zIChwb3NzaWJsZSByYW5nZTogMCDigJMgMjApIFt0b3RfcHBzc19mYV0KCiMgcmVjb2RlIHRoZSByZXNwb25zZXMgZnJvbSBRdWFsdHJpY3MgKHdoZXJlIDEgPSBZZXMsIDIgPSBObykgaW50byAxID0gWWVzLCAwID0gTm8pOgpiYXNlbGluZV9wb3N0XzMgPC0gYmFzZWxpbmVfcG9zdF8zICU+JSBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgicHBzc19mYSIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5zKHJlY29kZSguLCAiMSI9IjEiLCAiMiI9IjAiKSkpCmJhc2VsaW5lX3Bvc3RfMyA8LSBiYXNlbGluZV9wb3N0XzMgJT4lIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJwcHNzX2ZhIikpLCBmdW5zKGFzLm51bWVyaWMpKQoKIyBjb21wYXJlIGJlZm9yZSBhbmQgYWZ0ZXI6CnN0cihiYXNlbGluZV9wb3N0XzIkcHBzc19mYV8xKSAjIGJlZm9yZSByZWNvZGluZwpzdHIoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZmFfMSkgIyBhZnRlciByZWNvZGluZwoKIyByZXZlcnNlLXNjb3JlIGl0ZW1zOgpiYXNlbGluZV9wb3N0XzMkcHBzc19mYV8zciA8LSBhcy5udW1lcmljKHJlY29kZShiYXNlbGluZV9wb3N0XzMkcHBzc19mYV8zLCAiMSIgPSAiMCIsICIwIiA9ICIxIikpCmJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZhXzRyIDwtIGFzLm51bWVyaWMocmVjb2RlKGJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZhXzQsICIxIiA9ICIwIiwgIjAiID0gIjEiKSkKYmFzZWxpbmVfcG9zdF8zJHBwc3NfZmFfMTZyIDwtIGFzLm51bWVyaWMocmVjb2RlKGJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZhXzE2LCAiMSIgPSAiMCIsICIwIiA9ICIxIikpCmJhc2VsaW5lX3Bvc3RfMyRwcHNzX2ZhXzE5ciA8LSBhcy5udW1lcmljKHJlY29kZShiYXNlbGluZV9wb3N0XzMkcHBzc19mYV8xOSwgIjEiID0gIjAiLCAiMCIgPSAiMSIpKQpiYXNlbGluZV9wb3N0XzMkcHBzc19mYV8yMHIgPC0gYXMubnVtZXJpYyhyZWNvZGUoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZmFfMjAsICIxIiA9ICIwIiwgIjAiID0gIjEiKSkKCiMgY2hlY2sgdGhhdCBpdCB3b3JrZWQ6CnN0cihiYXNlbGluZV9wb3N0XzMkcHBzc19mYV8zKQpzdHIoYmFzZWxpbmVfcG9zdF8zJHBwc3NfZmFfM3IpCgojIHRvdGFsIHNjb3JlOgp0b3RfcHBzc19mYSA8LSBzdWJzZXQoYmFzZWxpbmVfcG9zdF8zLCBzZWxlY3Q9YygicHBzc19mYV8xIiwgInBwc3NfZmFfMiIsICJwcHNzX2ZhXzNyIiwgInBwc3NfZmFfNHIiLCAicHBzc19mYV81IiwgInBwc3NfZmFfNiIsICJwcHNzX2ZhXzciLCAicHBzc19mYV84IiwgInBwc3NfZmFfOSIsICJwcHNzX2ZhXzEwIiwgInBwc3NfZmFfMTEiLCAicHBzc19mYV8xMiIsICJwcHNzX2ZhXzEzIiwgInBwc3NfZmFfMTQiLCAicHBzc19mYV8xNSIsICJwcHNzX2ZhXzE2ciIsICJwcHNzX2ZhXzE3IiwgInBwc3NfZmFfMTgiLCAicHBzc19mYV8xOXIiLCAicHBzc19mYV8yMHIiKSkKYmFzZWxpbmVfcG9zdF8zJHRvdF9wcHNzX2ZhIDwtIHJvd1N1bXModG90X3Bwc3NfZmEsIG5hLnJtPVRSVUUpCmRlc2NyaWJlKGJhc2VsaW5lX3Bvc3RfMyR0b3RfcHBzc19mYSkKCgojIGNoZWNrIHRoYXQgYWxsICJ0b3RfKiIgdmFyaWFibGVzIGFwcGVhcgpjb2xuYW1lcyhiYXNlbGluZV9wb3N0XzMpIAoKIyBzYXZlIHRoZSBjbGVhbmVkIGFuZCBzY29yZWQgZGF0YQpzYXZlUkRTKGJhc2VsaW5lX3Bvc3RfMywgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvYmFzZWxpbmVfcG9zdF8zLnJkcyIpCiMgYmFzZWxpbmVfcG9zdF8zIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvYmFzZWxpbmVfcG9zdF8zLnJkcyIpCmBgYAoKIyMgSGlzdG9ncmFtcyBhbmQgYm94cGxvdHMKYGBge3J9CgojIENyZWF0ZSBhIHN1YnNldCBvZiBvbmx5IHNjYWxlIHRvdGFsIHNjb3JlcyAoaS5lLiwgdmFyaWFibGVzIHRoYXQgc3RhcnQgd2l0aCAidG90IikKc2NhbGVzX3Bvc3QgPC0gYmFzZWxpbmVfcG9zdF8zWywgZ3JlcCgnXnRvdCcsIG5hbWVzKGJhc2VsaW5lX3Bvc3RfMykpXQoKIyBQbG90IHRoZSB2YXJpYWJsZXM6CmZvcihpIGluIDE6bGVuZ3RoKHNjYWxlc19wb3N0KSkgYm94cGxvdChzY2FsZXNfcG9zdFssaV0sIHhsYWI9TlVMTCwgbWFpbj1uYW1lcyhzY2FsZXNfcG9zdFtpXSkpCmZvcihpIGluIDE6bGVuZ3RoKHNjYWxlc19wb3N0KSkgaGlzdChzY2FsZXNfcG9zdFssaV0sIHhsYWI9TlVMTCwgbWFpbj1uYW1lcyhzY2FsZXNfcG9zdFtpXSkpCgoKYGBgCgojIyBEZXNjcmlwdGl2ZXMgKG51bWVyaWNhbCB2YXJpYWJsZXMpCmBgYHtyfQojIFZpZXcgZGVzY3JpcHRpdmVzIGZvciBlYWNoIHNjYWxlCiMjIHN0YXJnYXplciBtYWtlcyBuaWNlLWxvb2tpbmcgc3VtbWFyeSB0YWJsZXMgKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdGFyZ2F6ZXIvdmlnbmV0dGVzL3N0YXJnYXplci5wZGYpCgpsaWJyYXJ5KHN0YXJnYXplcikgIyBpbnN0YWxsLnBhY2thZ2VzKCJzdGFyZ2F6ZXIiKSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHVzaW5nIHRoZSBwYWNrYWdlIG9uIHRoaXMgbWFjaGluZQpzdGFyZ2F6ZXIoc2NhbGVzX3Bvc3QsIHR5cGU9InRleHQiKQoKYGBgCgojIyBGcmVxdWVuY2llcyAoY2F0ZWdvcmljYWwgdmFyaWFibGVzKQpgYGB7cn0KIyBNYWtlIGEgc3Vic2V0IG9mIE9OTFkgdmFyaWFibGVzIHRoYXQgYXJlIGZhY3RvcnMKIyBhbmQgcHJpbnQgY29sdW1uIG5hbWVzIChmYXN0IHdheSB0byBrbm93IGV4YWN0bHkgd2hpY2ggdmFyaWFibGVzIHRvIHVzZSBoZXJlKQpmYWN0b3JzIDwtIGJhc2VsaW5lX3Bvc3RfMyAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKQpjb2xuYW1lcyhmYWN0b3JzKQoKIyMgU1JSUzogRnJlcXVlbmN5IG9mIHN0cmVzc2Z1bCBsaWZlIGV2ZW50cyBpbiBwYXN0IDEyIG1vbnRocwpjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xKSAjIENoYW5naW5nIHdvcmsgcmVzcG9uc2liaWxpdGllcyAoaW5jcmVhc2VkL2RlY3JlYXNlZCBob3Vycy90cmF2ZWwpIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18yKSAjIEV4cGVyaWVuY2luZyBmaW5hbmNpYWwgcHJvYmxlbXMvZGlmZmljdWx0aWVzIChiYW5rcnVwdGN5LCBjcmVkaXQgY2FyZCBkZWJ0LCBjb2xsZWdlIGNvc3RzLCB0YXggcHJvYmxlbXMpIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18zKSAjIERlYXRoIG9mIGNsb3NlIGZhbWlseSBtZW1iZXIgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzQpICMgQ2hhbmdlIGluIHJlc2lkZW5jZSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNSkgIyBDaGFuZ2luZyBlbXBsb3llcnMvY2FyZWVyIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc182KSAjIEVtcGxveWVyIHJlb3JnYW5pemF0aW9uL2Rvd25zaXppbmcgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzcpICMgTWFqb3IgZGlzYWdyZWVtZW50IHdpdGggYm9zcy9jb3dvcmtlciAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfOCkgIyBDaGFuZ2UgaW4gZW1wbG95bWVudCBwb3NpdGlvbiAoaS5lLiwgbGF0ZXJhbCB0cmFuc2ZlciwgcHJvbW90aW9uKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfOSkgIyBSZWNlaXZpbmcgYSB0aWNrZXQgZm9yIHZpb2xhdGluZyB0aGUgbGF3ICh0cmFmZmljLCBwYXJraW5nKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMTApICMgR2FpbmluZyBhIG5ldyBmYW1pbHkgbWVtYmVyICh0aHJvdWdoIGJpcnRoLCBhZG9wdGlvbiwgbWFycmlhZ2UpIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xMSkgIyBNYWpvciBpbmp1cnkvaWxsbmVzcyB0byBjbG9zZSBmYW1pbHkgbWVtYmVyIChpLmUuLCBjYW5jZXIsIEFJRFMsIGV0Yy4pIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xMikgIyBBdHRlbXB0aW5nIHRvIG1vZGlmeSBhZGRpY3RpdmUgYmVoYXZpb3Igb2Ygc2VsZiAoaS5lLiwgc21va2luZywgYWxjb2hvbCwgZHJ1Z3MsIGV0Yy4pIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xMykgIyBPYnRhaW5pbmcgYSBtYWpvciBsb2FuIG90aGVyIHRoYW4gaG9tZSBtb3J0Z2FnZSAoY2FyLCBib2F0LCBldGMuKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMTQpICMgRGVhdGggb2YgY2xvc2UgZnJpZW5kIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xNSkgIyBPYnRhaW5pbmcgYSBob21lIG1vcnRnYWdlIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xNikgIyBCZWluZyBmaXJlZC9sYWlkIG9mZi91bmVtcGxveWVkIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18xNykgIyBFeHBlcmllbmNpbmcvaW52b2x2ZWQgaW4gYXV0byBhY2NpZGVudCAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMTgpICMgRGlzY292ZXJpbmcvYXR0ZW1wdGluZyB0byBtb2RpZnkgYWRkaWN0aXZlIGJlaGF2aW9yIG9mIGNsb3NlIGZhbWlseSBtZW1iZXIgKGkuZS4sIHNtb2tpbmcsIGFsY29ob2wsIGRydWdzLCBldGMuKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMTkpICMgU3BvdXNlL21hdGUgYmVnaW5zL2NlYXNlcyB3b3JrIG91dHNpZGUgdGhlIGhvbWUgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzIwKSAjIEFzc3VtaW5nIHJlc3BvbnNpYmlsaXR5IGZvciBzaWNrIG9yIGVsZGVybHkgbG92ZWQgb25lIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18yMSkgIyBDaGlsZCBsZWF2aW5nIGhvbWUgKGkuZS4sIG1hcnJpYWdlLCBzdGFuZGluZyBjb2xsZWdlLCBldGMuKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMjIpICMgTWFqb3IgaW5qdXJ5L2lsbG5lc3MgdG8gc2VsZiAoY2FuY2VyLCBBSURTLCBldGMuKSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMjMpICMgTG9zcyBvZi9vciBtYWpvciByZWR1Y3Rpb24gaW4gaGVhbHRoIGluc3VyYW5jZS9iZW5lZml0cyAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMjQpICMgRmluZGluZyBhcHByb3ByaWF0ZSBjaGlsZCBjYXJlL2RheSBjYXJlIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18yNSkgIyBTZXBhcmF0aW9uIG9yIHJlY29uY2lsaWF0aW9uIHdpdGggc3BvdXNlL21hdGUgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzI2KSAjIEJlaW5nIGEgdmljdGltIG9mIGNyaW1lICh0aGVmdCwgcm9iYmVyeSwgYXNzYXVsdCwgcmFwZSwgZXRjLikgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzI3KSAjIFByZWduYW5jeSBvZiBzcG91c2UvbWF0ZS9zZWxmIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18yOCkgIyBNYWpvciBkaXNhZ3JlZW1lbnQgb3ZlciBjaGlsZCBzdXBwb3J0L2N1c3RvZHkvdmlzaXRhdGlvbiAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMjkpICMgQ2hpbGQgZGV2ZWxvcHMgYmVoYXZpb3Igb3IgbGVhcm5pbmcgcHJvYmxlbXMgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzMwKSAjIEJlZ2lubmluZy9jZWFzaW5nIGZvcm1hbCBlZHVjYXRpb24gCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzMxKSAjIFNlbGYvY2xvc2UgZmFtaWx5IG1lbWJlciBiZWluZyBhcnJlc3RlZCBmb3IgdmlvbGF0aW5nIHRoZSBsYXcgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzMyKSAjIEFkdWx0IGNoaWxkIG1vdmluZyBpbiB3aXRoIHBhcmVudC9wYXJlbnQgbW92aW5nIGluIHdpdGggYWR1bHQgY2hpbGQgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzMzKSAjIFN1cnZpdmluZyBhIGRpc2FzdGVyIChmaXJlLCBmbG9vZCwgZWFydGhxdWFrZSwgdG9ybmFkbywgaHVycmljYW5lCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzM0KSAjIEZhaWx1cmUgdG8gb2J0YWluL3F1YWxpZnkgZm9yIGEgbW9ydGdhZ2UgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzM1KSAjIEV4cGVyaWVuY2luZyBlbXBsb3ltZW50IGRpc2NyaW1pbmF0aW9uL3NleHVhbCBoYXJhc3NtZW50IApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc18zNikgIyBFeHBlcmllbmNpbmcgZGlzY3JpbWluYXRpb24vaGFyYXNzbWVudCBvdXRzaWRlIHRoZSB3b3JrcGxhY2UgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzM3KSAjIFJldGlyZW1lbnQKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfMzgpICMgR2V0dGluZyBtYXJyaWVkL3JlbWFycmllZCAoc2VsZikgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzM5KSAjIEJlY29taW5nIGEgc2luZ2xlIHBhcmVudCAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNDApICMgRGl2b3JjZQpjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc180MSkgIyBJbmZpZGVsaXR5IChjaGVhdGluZyBvbiBzcG91c2UvbWF0ZSkgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzQyKSAjIEV4cGVyaWVuY2luZyBhIGxhcmdlIHVuZXhwZWN0ZWQgbW9uZXRhcnkgZ2FpbiAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNDMpICMgRGVhbGluZyB3aXRoIGluZmVydGlsaXR5L21pc2NhcnJpYWdlIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc180NCkgIyBCZWluZyBkaXNjaXBsaW5lZCBhdCB3b3JrL2RlbW90ZWQgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzQ1KSAjIEV4cGVyaWVuY2luZyBkb21lc3RpYyB2aW9sZW5jZS9zZXh1YWwgYWJ1c2UgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzQ2KSAjIERldGVudGlvbiBpbiBqYWlsIG9yIG90aGVyIGluc3RpdHV0aW9uIChtZW50YWwsIGRydWcgcmVoYWIsIGV0Yy4pIApjb3VudChiYXNlbGluZV9wb3N0XzMsc3Jyc180NykgIyBEZWF0aCBvZiBzcG91c2UvbWF0ZSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNDgpICMgRGVhbGluZyB3aXRoIHVud2FudGVkIHByZWduYW5jeSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNDkpICMgRm9yZWNsb3N1cmUgb24gbG9hbi9tb3J0Z2FnZSAKY291bnQoYmFzZWxpbmVfcG9zdF8zLHNycnNfNTApICMgUmVsZWFzZSBmcm9tIGphaWwgCmNvdW50KGJhc2VsaW5lX3Bvc3RfMyxzcnJzXzUxKSAjIEJlaW5nIHRoZSB2aWN0aW0gb2YgcG9saWNlIGJydXRhbGl0eSAKCmBgYAo8dT48Y2VudGVyPkluY2lkZW5jZSBvZiBzdHJlc3NmdWwgbGlmZSBleHBlcmllbmNlcyBpbiBvdXIgc2FtcGxlLCBpbiBvcmRlcjo8YnI+PC91Pgo0Ny4gRGVhdGggb2Ygc3BvdXNlL21hdGU6IDIxLzQwIDxicj4gKihOT1QgaW5jbHVkZWQgaW4gdG90X3NycnMgdmFyaWFibGUpKgozLiBEZWF0aCBvZiBjbG9zZSBmYW1pbHkgbWVtYmVyOiAyMC80MCAqKHN1c3BlY3Qgc29tZSBtYXkgYmUgY291bnRpbmcgc3BvdXNlIGluIHRoaXMgYnV0IHVuc3VyZTsgTk9UIGluY2x1ZGVkIGluIHRvdF9zcnJzIHZhcmlhYmxlKSogPGJyPgoxLiBDaGFuZ2luZyB3b3JrIHJlc3BvbnNpYmlsaXRpZXM6IDE2LzQwIDxicj4KMTEuIE1ham9yIGluanVyeS9pbGxuZXNzIHRvIGNsb3NlIGZhbWlseSBtZW1iZXI6IDE1LzQwIDxicj4KMTQuIERlYXRoIG9mIGNsb3NlIGZyaWVuZDogMTIvNDAgPGJyPiAKMi4gRmluYW5jaWFsIHByb2JsZW1zOiA5LzQwIDxicj4gCjIwLiBBc3N1bWluZyByZXNwb25zaWJpbGl0eSBmb3Igc2ljayBvciBlbGRlcmx5IGxvdmVkIG9uZTogOS80MCA8YnI+IAoxMC4gR2FpbmluZyBhIG5ldyBmYW1pbHkgbWVtYmVyOiA2LzQwIDxicj4gCjE4LiBEaXNjb3ZlcmluZy9hdHRlbXB0aW5nIHRvIG1vZGlmeSBhZGRpY3RpdmUgYmVoYXZpb3Igb2YgY2xvc2UgZmFtaWx5IG1lbWJlcjogNi80MCA8YnI+IAozNi4gUmV0aXJlbWVudDogNS80MCA8YnI+IAo1LiBDaGFuZ2luZyBlbXBsb3llcnMvY2FyZWVyOiA0LzQwIDxicj4gCjYuIEVtcGxveWVyIHJlb3JnYW5pemF0aW9uL2Rvd25zaXppbmc6IDQvNDAgPGJyPiAKOC4gQ2hhbmdlIGluIGVtcGxveW1lbnQgcG9zaXRpb246IDQvNDAgPGJyPiAKOS4gVHJhZmZpYyBvciBwYXJraW5nIHRpY2tldDogNC80MCA8YnI+IAozMi4gQWR1bHQgY2hpbGQgbW92aW5nIGluIHdpdGggcGFyZW50L3BhcmVudCBtb3ZpbmcgaW4gd2l0aCBhZHVsdCBjaGlsZDogNC80MCA8YnI+IAo0LiBDaGFuZ2UgaW4gcmVzaWRlbmNlOiAzLzQwIDxicj4gCjcuIE1ham9yIGRpc2FncmVlbWVudCB3aXRoIGJvc3MvY293b3JrZXI6IDMvMzAKMTIuIEF0dGVtcHRpbmcgdG8gbW9kaWZ5IGFkZGljdGl2ZSBiZWhhdmlvciBvZiBzZWxmOiAzLzQwIDxicj4gCjEzLiBPYnRhaW5pbmcgYSBtYWpvciBsb2FuIG90aGVyIHRoYW4gaG9tZSBtb3J0Z2FnZTogMy80MCA8YnI+IAoyNi4gQmVpbmcgYSB2aWN0aW0gb2YgY3JpbWU6IDMvNDAgPGJyPiAKMzguIEV4cGVyaWVuY2luZyBhIGxhcmdlIHVuZXhwZWN0ZWQgbW9uZXRhcnkgZ2FpbjogMy80MCA8YnI+IAoyMi4gTWFqb3IgaW5qdXJ5L2lsbG5lc3MgdG8gc2VsZjogMi80MCA8YnI+IAoxNS4gT2J0YWluaW5nIGhvbWUgbW9ydGFnZTogMi80MCA8YnI+IAoxNi4gRmlyZWQvbGFpZCBvZmYvdW5lbXBsb3llZDogMi80MCA8YnI+IAoyNS4gU2VwYXJhdGlvbiBvciByZWNvbmNpbGlhdGlvbiB3aXRoIHNwb3VzZS9tYXRlOiAyLzQwIDxicj4gCjIzLiBMb3NzIG9mL29yIG1ham9yIHJlZHVjdGlvbiBpbiBoZWFsdGggaW5zdXJhbmNlL2JlbmVmaXRzOiAyLzQwIDxicj4KMzEuIFNlbGYvY2xvc2UgZmFtaWx5IG1lbWJlciBiZWluZyBhcnJlc3RlZCBmb3IgdmlvbGF0aW5nIHRoZSBsYXc6IDIvNDAgPGJyPiAKMTkuIFNwb3VzZS9tYXRlIGJlZ2lucy9jZWFzZXMgd29yayBvdXRzaWRlIHRoZSBob21lOiAxLzQwIDxicj4gCjIxLiBDaGlsZCBsZWF2aW5nIGhvbWU6IDEvNDAgPGJyPiAKMzUuIEV4cGVyaWVuY2luZyBlbXBsb3ltZW50IGRpc2NyaW1pbmF0aW9uL3NleHVhbCBoYXJhc3NtZW50OiAxLzQwIDxicj4gCjQ5LiBGb3JlY2xvc3VyZSBvbiBsb2FuL21vcnRnYWdlOiAxLzQwCjwvY2VudGVyPgo8cD4KKihGb3IgYWxsIG90aGVyIGl0ZW1zLCAwIHJlcG9ydGVkIGluY2lkZW5jZSBpbiB0aGlzIHNhbXBsZSkuKgoKIyMgQ2hlY2sgc2NhbGUgcmVsaWFiaWxpdGllcwpgYGB7cn0KIyBUaGUgJ2FscGhhJyBmdW5jdGlvbiBpcyBoZWxwZnVsIGJlY2F1c2UgaXQgd2lsbCBhbGVydCB5b3UgaWYgeW91ciByZXZlcnNlIGNvZGluZyB3ZW50IGF3cnkgc29tZWhvdy4gCiMjIE5vdGUgdGhhdCBFbWlseSBCdXRsZXIgc2F5cyBpdCdzIG5vdCBhbHdheXMgY29ycmVjdCAtIGlmIGl0IGZsYWdzIGFuIGlzc3VlcyBhbmQgeW91J3ZlIGRvdWJsZS0gYW5kIHRyaXBsZS1jaGVja2VkIHlvdXIgcmV2ZXJzZSBjb2RpbmcsIGlnbm9yZSBpdC4KCiMgUHJpbWFyaWx5LCB3ZSB1c2UvcmVwb3J0IHRoZSBzdGFuZGFyZCBhbHBoYS4KCmxpYnJhcnkocHN5Y2gpCnBzeWNoOjphbHBoYSh0b3RfZ2NxX2FwcHJvcCkKcHN5Y2g6OmFscGhhKHRvdF9nY3FfYmxhbWUpCnBzeWNoOjphbHBoYSh0b3RfZ2NxX2NoZXJpc2gpCnBzeWNoOjphbHBoYSh0b3RfZ2NxX2Z1dHVyZSkKcHN5Y2g6OmFscGhhKHRvdF9nY3FfbGlmZSkKcHN5Y2g6OmFscGhhKHRvdF9nY3Ffb3RoZXJzKQpwc3ljaDo6YWxwaGEodG90X2djcV9zZWxmKQpwc3ljaDo6YWxwaGEodG90X2djcV90aHJlYXQpCnBzeWNoOjphbHBoYSh0b3RfZ2NxX3dvcmxkKQpwc3ljaDo6YWxwaGEodG90X3VjbGFfbG9uZWxpbmVzcykKcHN5Y2g6OmFscGhhKHRvdF9wcHNzX2ZhKQpwc3ljaDo6YWxwaGEodG90X3Bwc3NfZnIpCgpgYGAKCgojIyBNZXJnZSBiYXNlbGluZSBhbmQgYmFzZWxpbmVfcG9zdCBkYXRhc2V0cwpgYGB7cn0KYmFzZWxpbmVfNCA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2Jhc2VsaW5lLnJkcyIpCm5hbWVzKGJhc2VsaW5lXzQpCmJhc2VsaW5lXzQgPC0gYmFzZWxpbmVfNCAlPiUgbXV0YXRlKElEID0gcmVjb2RlKElELCAiZDEzMCIgPSAiRDEzMCIpKSAjIG1ha2UgZDEzMCAtPiBEMTMwCmJhc2VsaW5lX2FsbCA8LSBsZWZ0X2pvaW4oYmFzZWxpbmVfNCxiYXNlbGluZV9wb3N0XzMsIGJ5PSJJRCIpICNtZXJnZSBieSBJRApWaWV3KGJhc2VsaW5lX2FsbCkKbmFtZXMoYmFzZWxpbmVfYWxsKQpgYGAKVGhpcyByZXN1bHRzIGluIDQwIG9ic2VydmF0aW9ucyBvZiA0NTcgdmFyaWFibGVzLgoKYGBge3J9CgojIHNhdmUgaXQKc2F2ZVJEUyhiYXNlbGluZV9hbGwsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2Jhc2VsaW5lX3dpdGhfcG9zdC1iYXNlbGluZS5yZHMiKQoKIyBTYXZlIGl0IGFzIGEgY3N2IGZpbGUKd3JpdGUuY3N2KGJhc2VsaW5lX2FsbCwgZmlsZSA9ICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2Jhc2VsaW5lX3dpdGhfcG9zdC1iYXNlbGluZS5jc3YiKQoKYGBgCgoKCiMjIEV2YWx1YXRlIG1pc3NpbmcgZGF0YSAKYGBge3J9CmJhc2VsaW5lX05BIDwtIGJhc2VsaW5lX2FsbCAlPiUgCiAgc2VsZWN0X2lmKGZ1bmN0aW9uKHgpIGFueShpcy5uYSh4KSkpICU+JSAKICBzdW1tYXJpc2VfYWxsKGZ1bnMobWVhbihpcy5uYSguKSkpKSAjIHVzZSBzdW0oKSB0byBmaW5kIG4gbWlzc2luZyB2YWx1ZXMKCmJhc2VsaW5lX05BX2xvbmcgPC0gZ2F0aGVyKGJhc2VsaW5lX05BKSAjIGNyZWF0ZSBsb25nIGRhdGEgdGhhdCBsaXN0cyB2YXJpYWJsZXMgd2l0aCBhbnkgTkFzLCBhbmQgJSBvZiBkYXRhIG1pc3NpbmcKCiMgdGVzdHMgZm9yIE1BUi9NQ0FSPyBCYXlsb3JFZFBzeWNoIHBhY2thZ2UgZG9lc24ndCB3b3JrIGZvciBtZS4uLgoKIyBlcXVpdmFsZW50IHRvIFNVTS54KCkgaW4gU1BTUz8gKG9ubHkgY29tcHV0ZSBTVU0gaWYgcGFydGljaXBhbnQgaGFzIHJlc3BvbnNlcyBvbiBhIGNlcnRhaW4gbnVtYmVyIG9mIGl0ZW1zKQoKIyBhbm90aGVyIGFwcHJvYWNoLCBhbHRob3VnaCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCBtdWNoIHNtYWxsZXIgZGF0YXNldHMgKHRvbyBtYW55IHZhcmlhYmxlcyBoZXJlIHRvIHZpc3VhbGl6ZSkKbGlicmFyeShtaWNlKQpsaWJyYXJ5KFZJTSkKYWdnciA9IGFnZ3IoYmFzZWxpbmVfNCwgY29sPW1kYygyOjQ1NyksIG51bWJlcnM9VFJVRSwgc29ydFZhcnM9VFJVRSwgbGFiZWxzPW5hbWVzKGJhc2VsaW5lX2FsbCksIGNleC5heGlzPS43LCBnYXA9MywgeWxhYj1jKCJQcm9wb3J0aW9uIG9mIG1pc3NpbmduZXNzIiwiTWlzc2luZ25lc3MgUGF0dGVybiIpKQpgYGAKCldlIGhhdmUgODYvNDU3IHZhcmlhYmxlcyBtaXNzaW5nIHNvbWUgYW1vdW50IG9mIGRhdGEsIHRob3VnaCBzb21lIGFyZSBiZWNhdXNlIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGFwcGx5IChlLmcuLCBlZHVjYXRpb25fb3RoZXIgb3IgbGFzdHBlcmlvZCksIGFuZCBvdGhlcnMgYXJlIGJlY2F1c2UgImRvbid0IGtub3ciIHdhcyByZWNvZGVkIGFzIE5BIGFuZCBub3Qgc2NvcmVkIGZvciB0aGUgUFBTUy4gT25lIHBlcnNvbiBtaXNzZWQgQkRJIGl0ZW0gOSAoc3VpY2lkYWxpdHkpLCB3aGljaCBtYXkgbm90IGJlIGF0IHJhbmRvbS4uLgoKCiNQcmUvcG9zdCBmTVJJIApUaGlzIHNlY3Rpb24gb2YgdGhlIHNjcmlwdCBkZWFscyB3aXRoIHRoZSBzdXJ2ZXlzIHRoYXQgcGFydGljaXBhbnRzIGNvbXBsZXRlZCBwcmUtIGFuZCBwb3N0LWZNUkkuIERhdGEgZnJvbSB0aGUgdHdvIHZpc2l0cyB3ZXJlIGVudGVyZWQgYXMgKGUuZy4pIEQxNDEgYXQgdmlzaXQgMSBhbmQgRDE0MV9iIGF0IHZpc2l0IDIsIHNvIG5lZWQgdG8gb3JnYW5pemUgZGF0YSBzdWNoIHRoYXQgcmF0aGVyIHRoYW4gb25lIHZhcmlhYmxlIGZvciB0d28gY2FzZXMsIHRoZXJlIGFyZSB0d28gdmFyaWFibGVzIGZvciBvbmUgY2FzZS4gRWFjaCBwYXJ0aWNpcGFudCByZXR1cm5lZCBmb3IgdHdvIGZNUkkgc2Vzc2lvbnMsIHNvIHZhcmlhYmxlcyBhcHBlbmRlZCDigJxfdjHigJ0gYXJlIGZyb20gdGhlIGZpcnN0IHZpc2l0LCBhbmQgdmFyaWFibGVzIGFwcGVuZGVkIOKAnF92MuKAnSBhcmUgZnJvbSB0aGUgc2Vjb25kIHZpc2l0LiAKCipXaGF0IGhhcyBiZWVuIGRvbmUgdXAgdG8gdGhpcyBwb2ludDogKDEpIGNvZGVib29rIGNyZWF0ZWQsICgyKSBkYXRhIGV4cG9ydGVkIGZyb20gUXVhbHRyaWNzLioKCiMjSW1wb3J0IGRhdGEgYW5kIGNsZWFuIHVwIFF1YWx0cmljcyBqdW5rClRhc2s6IEltcG9ydCBkYXRhIGZyb20gQ1NWIGZpbGVzICpleGNlcHQqIGZvciB0aGUgZmlyc3QgMTcgY29sdW1ucyAoMToxNyBpcyBqdXN0IFF1YWx0cmljcyBqdW5rKS48YnI+CgpgYGB7cn0KIyBydW4gaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB1c2luZyBkcGx5ciBvbiB5b3VyIGxvY2FsIG1hY2hpbmUKbGlicmFyeSh0aWR5dmVyc2UpCmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyCnNlbGVjdCA8LSBkcGx5cjo6c2VsZWN0CgpwcmVfZm1yaSA8LSByZWFkLmNzdigifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL09UK2ZNUkkrQXQrVGhlK1NjYW5uZXJfSmFudWFyeSsxOCUyQysyMDE5XzE0LjIyLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwgbmEuc3RyaW5ncz0iIilbICwtYygyOjE3KV0KcG9zdF9mbXJpIDwtIHJlYWQuY3N2KCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1QrZk1SSStBdCtUaGUrU2Nhbm5lcitQb3N0LVNjYW5fSmFudWFyeSsxOCUyQysyMDE5XzE0LjIzLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwgbmEuc3RyaW5ncz0iIilbICwtYygyOjE3KV0KIyBuYS5zdHJpbmdzID0gIiIgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyB3aGVyZSBtaXNzaW5nIGRhdGEgaXMgcmVwcmVzZW50ZWQgYnkgYmxhbmsgY2VsbHMgd2l0aCBOQSwgd2hpY2ggaXMgaG93IFIgaGFuZGxlcyBtaXNzaW5nIHZhbHVlcy4KVmlldyhwcmVfZm1yaSkKVmlldyhwb3N0X2ZtcmkpCmBgYAoKPjxmb250IGNvbG9yPSJyZWQiPk5PVEU8L2ZvbnQ+OiBJbiBgcHJlX2ZtcmlgLCB0aGVyZSB3ZXJlIHR3byBjYXNlcyBsYWJlbGVkICJEMTE1X2IiIHdpdGggbm9uLW1hdGNoaW5nIGRhdGEuIEZpZ3VyZWQgb3V0IHRoYXQgdGhpcyBpcyBiZWNhdXNlIEQxMTVfYiBjb21wbGV0ZWQgdGhlIHByZSBzdXJ2ZXkgYmVmb3JlIEFORCBhZnRlciB0aGUgc2NhbiAocmF0aGVyIHRoYW4gY29tcGxldGluZyB0aGUgcG9zdCBzdXJ2ZXkgYWZ0ZXIpLiBJIGtlcHQgdGhlIGNhc2UgdGhhdCBzdGFydHMgUTE3Nl8xID0gNCwgUTE3Nl8yID0gMSwgUTE3Nl8zID0gMi4uLiBhcyBEMTE1X2IgYW5kIGNoYW5nZWQgdGhlIG90aGVyIHRvIEQxMTVfYl9wb3N0LiBXaHk/IEFjY29yZGluZyB0byB0aGUgcmF3IEFBVCBkYXRhLCB0aGUgdGFzayB3YXMgcnVuIGF0IDI6MTVwbSBhbmQgMjoyNXBtLiBJbiBRdWFsdHJpY3MsIHRoZSBmaXJzdCAobm93IEQxMTVfYikgd2FzIGNvbXBsZXRlZCBhdCAxOjE1cG0gYW5kIHRoZSBzZWNvbmQgKG5vdyBEMTE1X2JfcG9zdCkgd2FzIGNvbXBsZXRlZCBhdCAyOjU1cG0gKGJvdGggb24gMi8xMi8yMDE2KS4gVGhlc2UgdHdvIGNhc2VzIG5lZWQgdG8gYmUgc2VwYXJhdGVkIG91dCBhbmQgZGVhbHQgd2l0aCBsYXRlci4KCmBgYHtyfQojIyMjIFBSRS1GTVJJCiMgT3BlbiBkYXRhIGVkaXRvciAKZml4KHByZV9mbXJpKQoKIyBJIGNoYW5nZWQgdGhlIEQxMTUgcm93cyBhcyBkZXNjcmliZWQgaW4gbm90ZSBhYm92ZS4KIyBJIGNoYW5nZWQgdGhlIHNlY29uZCBpbnN0YW5jZSBvZiAiRDEyOF9iIiB0byBbYmxhbmtdIGFzIGl0IGlzIGEgZHVwbGljYXRlIElEIChEMTI4X2Igd2l0aCB2YWxpZCBkYXRhIGlzIHR3byByb3dzIGJlZm9yZSkKIyBJIGNoYW5nZWQgdGhlIHNlY29uZCBpbnN0YW5jZSBvZiAiRDE0MCIgKHJlY29yZGVkIDA4LzMwLzE2LCBzdGFydHMgUTE3Nl8xID0gMywgUTE3Nl8yID0gMSwgUTE3Nl8zID0gMS4uLikgdG8gRDE0MF9iIAojIEkgY2hhbmdlZCB0aGUgc2Vjb25kIGluc3RhbmNlIG9mICJEMTM3IiAocmVjb3JkZWQgMDcvMTEvMTYsIHN0YXJ0cyBRMTc2XzEgPSA0LCBRMTc2XzIgPSAxLCBRMTc2XzMgPSAzLi4uKSB0byBbYmxhbmtdLiBCYXNlZCBvbiB0YXNrIGRhdGEvcmVjb3JkcywgaGUgY29tcGxldGVkIHRoZSBzdHVkeSBvbiA3LzE0LzE2IGFuZCA3LzIxLzE2LCBidXQgd2FzIG9yaWdpbmFsbHkgc2NoZWR1bGVkIGZvciBhIGZpcnN0IHZpc2l0IG9uIDcvMTEvMTYgdGhhdCB3YXMgbm90IGFibGUgdG8gYmUgcnVuLiAKCiMgQUxTTywgaW4gdGhlIGJlbG93IHNjcmlwdC4uLgojIEkgY2hhbmdlZCAiRDEwMUIiIHRvIEQxMDFfYgojIEkgY2hhbmdlZCAiRDEwMl9CIiB0byBEMTAyX2IKIyBJIGNoYW5nZWQgIkQxMDNfQiIgdG8gRDEwM19iCiMgSSBjaGFuZ2VkICJEMTE3IiB0byBbYmxhbmtdLCAiRDExN19CIiB0byBEMTE3LCBhbmQgIkQxMTdfYyIgdG8gIkQxMTdfYiIgKHNjYW4gZGF0YSBmcm9tIDFzdCBzZXNzaW9uIGxvc3Qgc28gcGFydGljaXBhbnQgY2FtZSBpbiAzeCkKIyBJIGNoYW5nZWQgIkQxMTlfQiIgdG8gRDExOV9iCiMgSSBjaGFuZ2VkICJEMTMwIFtlbnRlcmVkIGZyb20gcGFwZXIgY29weSBieSBTUyA1LzE4LzE2XSIgdG8gRDEzMAojIEkgY2hhbmdlZCAiRDEzNF9CIiB0byBEMTM0X2IKIyBJIGNoYW5nZWQgIkQxMzVfYiIgdG8gW2JsYW5rXSBhbmQgIkQxMzVfYyIgdG8gIkQxMzVfYiIgYXMgdGhlcmUgd2VyZSB0ZWNobmljYWwgaXNzdWVzIGF0IGhlciBzZWNvbmQgdmlzaXQgdGhhdCBwcmV2ZW50ZWQgdXMgZnJvbSBydW5uaW5nIHRoZSBzY2FuIHNvIHNoZSByZXR1cm5lZCBhIGZldyBkYXlzIGxhdGVyIC0gc28gImMiIGlzIGhlciBzZWNvbmQgdmlzaXQgZGF0YS4KIyBJIGNoYW5nZWQgIkQxMjlfQiIgdG8gRDEyOV9iCiMgSSBjaGFuZ2VkICJEMTQxIFtlbnRlcmVkIGZyb20gcGFwZXIgY29weSAtIFNTXSIgdG8gRDE0MQoKcHJlX2ZtcmkgPC0gcHJlX2ZtcmkgJT4lIG11dGF0ZShJRCA9IGFzLmNoYXJhY3RlcihyZWNvZGUoSUQsICJEMTAxQiIgPSAiRDEwMV9iIiwKIkQxMDJfQiIgPSAiRDEwMl9iIiwKIkQxMDNfQiIgPSAiRDEwM19iIiwKIkQxMTciID0gTkFfY2hhcmFjdGVyXywKIkQxMTdfQiIgPSAiRDExNyIsCiJEMTE3X2MiID0gIkQxMTdfYiIsCiJEMTE5X0IiID0gIkQxMTlfYiIsCiJEMTMwIFtlbnRlcmVkIGZyb20gcGFwZXIgY29weSBieSBTUyA1LzE4LzE2XSIgPSAiRDEzMCIsCiJEMTM0X0IiID0gIkQxMzRfYiIsCiJEMTM1X2IiID0gTkFfY2hhcmFjdGVyXywKIkQxMzVfYyIgPSAiRDEzNV9iIiwKIkQxMjlfQiIgPSAiRDEyOV9iIiwKIkQxNDEgW2VudGVyZWQgZnJvbSBwYXBlciBjb3B5IC0gU1NdIiA9ICJEMTQxIiAKICApKSkKCnByZV9mbXJpXzAgPC0gcHJlX2ZtcmkgJT4lIGZpbHRlcihncmVwbCgiXkQxIiwgSUQsIGlnbm9yZS5jYXNlID0gVFJVRSkpCnByZV9mbXJpXzAkU3RhcnREYXRlIDwtIE5VTEwgIyBjYW4gZHJvcCBTdGFydERhdGUgdmFyaWFibGUKCiMgU2F2ZSBpdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdvIHRocm91Z2ggYWxsIFRIQVQgYWdhaW4Kd3JpdGUuY3N2KHByZV9mbXJpXzAsIGZpbGUgPSAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9wcmVfZm1yaV8wLmNzdiIpICMgODUgb2JzZXJ2YXRpb25zIG9mIDQxIHZhcmlhYmxlcwoKCiMjIyMgUE9TVC1GTVJJCiMgT3BlbiBkYXRhIGVkaXRvciAKZml4KHBvc3RfZm1yaSkKCiMgSSBjaGFuZ2VkICJEMTQ1X2IiIChyb3cgODMpIHRvIFtibGFua10gYXMgaXQgaXMgYSBkdXBsaWNhdGUgSUQgd2l0aCBubyBkYXRhCiMgSSBjaGFuZ2VkICJEMTQ1IiAocm93IDkzKSB0byBEMTQ5X2IgLSB3YXMgY29tcGxldGVkIG9uIDEyLzgvMTcsIHBhcnRpY2lwYW50IGp1c3QgZW50ZXJlZCB3cm9uZyBJRC4KIyBJIGNoYW5nZWQgIkQxMjMiIChyb3cgNDYpIHRvIFtibGFua10gYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSBvZiBEMTIzIChyb3cgNDIpIGJ1dCB3YXMgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkLgoKIyBBTFNPLCBpbiB0aGUgYmVsb3cgc2NyaXB0Li4uCiMgSSBjaGFuZ2VkICJEMTAxXzIiIHRvIEQxMDFfYgojIEkgY2hhbmdlZCAiRDEwMl9CIiB0byBEMTAyX2IKIyBJIGNoYW5nZWQgIkQxMTciIHRvIFtibGFua10sICJEMTE3X0IiIHRvIEQxMTcsIGFuZCAiRDExN19jIiB0byAiRDExN19iIiAoc2NhbiBkYXRhIGZyb20gMXN0IHNlc3Npb24gbG9zdCBzbyBwYXJ0aWNpcGFudCBjYW1lIGluIDN4KQojIEkgY2hhbmdlZCAiRDEzMCBbZW50ZXJlZCBmcm9tIHBhcGVyIGNvcHkgYnkgU1MgNS8xOC8xNl0iIHRvIEQxMzAKIyBJIGNoYW5nZWQgIkQxMzVfYyIgdG8gRDEzNSAtIHNlZSBhYm92ZSBpbiBwcmVfZm1yaSBjaHVuawojIEkgY2hhbmdlZCAiRDE0MSBbZW50ZXJlZCBmcm9tIHBhcGVyIGNvcHkgLSBTU10iIHRvIEQxNDEKCnBvc3RfZm1yaSA8LSBwb3N0X2ZtcmkgJT4lIG11dGF0ZShJRCA9IGFzLmNoYXJhY3RlcihyZWNvZGUoSUQsICJEMTAxXzIiID0gIkQxMDFfYiIsCiJEMTAyX0IiID0gIkQxMDJfYiIsCiJEMTE3IiA9IE5BX2NoYXJhY3Rlcl8sCiJEMTE3X2IiID0gIkQxMTciLAoiRDExN19jIiA9ICJEMTE3X2IiLAoiRDEzMCBbZW50ZXJlZCBmcm9tIHBhcGVyIGNvcHkgYnkgU1MgNS8xOC8xNl0iID0gIkQxMzAiLAoiRDEzNV9iIiA9IE5BX2NoYXJhY3Rlcl8sCiJEMTM1X2MiID0gIkQxMzVfYiIsCiJEMTQxIFtlbnRlcmVkIGZyb20gcGFwZXIgY29weSAtIFNTXSIgPSAiRDE0MSIKICApKSkKCgpwb3N0X2ZtcmlfMCA8LSBwb3N0X2ZtcmkgJT4lIGZpbHRlcihncmVwbCgiXkQxIiwgSUQsIGlnbm9yZS5jYXNlID0gVFJVRSkpClZpZXcocG9zdF9mbXJpXzApCiMgU2F2ZSBpdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdvIHRocm91Z2ggYWxsIFRIQVQgYWdhaW4Kd3JpdGUuY3N2KHBvc3RfZm1yaV8wLCBmaWxlID0gIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcG9zdF9mbXJpXzAuY3N2IikKCiMgVGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgYXQgdGhlIGVuZCBvZiBwb3N0X2ZtcmkgdGhhdCBhcmUgYWxzbyBRdWFsdHJpY3MganVuay4KIyBHZXQgdGhlaXIgbmFtZXMgYW5kIHJlbW92ZSB0aGVtOgpuYW1lcyhwb3N0X2ZtcmlfMCkgCnBvc3RfZm1yaV8wJElELi4uVG9waWNzIDwtIE5VTEwKcG9zdF9mbXJpXzAkU1JPRS4yLi4uVG9waWNzIDwtIE5VTEwgCgojIGFsc28gcmVtb3ZlIFN0YXJ0RGF0ZQpwb3N0X2ZtcmlfMCRTdGFydERhdGUgPC0gTlVMTAoKd3JpdGUuY3N2KHBvc3RfZm1yaV8wLCBmaWxlID0gIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcG9zdF9mbXJpXzAuY3N2IikgIyA4MCBvYnNlcnZhdGlvbnMgb2YgNDQgdmFyaWFibGVzCgoKIyBpZiBuZWVkIHRvIGxvYWQ6CiMgcG9zdF9mbXJpXzAgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcG9zdF9mbXJpXzAuY3N2IikKIyBwb3N0X2ZtcmlfMCRYIDwtIE5VTEwKYGBgCgoKIyNSZW5hbWUgdmFyaWFibGVzClRoZSBuYW1lIHRvIHRoZSBfbGVmdF8gb2YgdGhlIGVxdWFsIHNpZ24gaXMgdGhlIG5ldyBuYW1lLCB0aGUgb25lIG9uIHRoZSByaWdodCBpcyB3aGF0IHRoZSB2YXJpYWJsZSB3YXMgbmFtZWQgaW4gUXVhbHRyaWNzLgpgYGB7cn0KCiMjIyMgUFJFLUZNUkkKcHJlX2ZtcmlfMSA8LSByZW5hbWUocHJlX2ZtcmlfMCwgSUQgPSBJRCwgcHJlX3BhbmFzXzEgPSBRMTc2XzEsCiAgcHJlX3BhbmFzXzIgPSBRMTc2XzIsCiAgcHJlX3BhbmFzXzMgPSBRMTc2XzMsCiAgcHJlX3BhbmFzXzQgPSBRMTc2XzQsCiAgcHJlX3BhbmFzXzUgPSBRMTc2XzUsCiAgcHJlX3BhbmFzXzYgPSBRMTc2XzYsCiAgcHJlX3BhbmFzXzcgPSBRMTc2XzcsCiAgcHJlX3BhbmFzXzggPSBRMTc2XzgsCiAgcHJlX3BhbmFzXzkgPSBRMTc2XzksCiAgcHJlX3BhbmFzXzEwID0gUTE3Nl8xMCwKICBwcmVfcGFuYXNfMTEgPSBRMTc2XzExLAogIHByZV9wYW5hc18xMiA9IFExNzZfMTIsCiAgcHJlX3BhbmFzXzEzID0gUTE3Nl8xMywKICBwcmVfcGFuYXNfMTQgPSBRMTc2XzE0LAogIHByZV9wYW5hc18xNSA9IFExNzZfMTUsICAgCiAgcHJlX3BhbmFzXzE2ID0gUTE3Nl8xNiwKICBwcmVfcGFuYXNfMTcgPSBRMTc2XzE3LAogIHByZV9wYW5hc18xOCA9IFExNzZfMTgsCiAgcHJlX3BhbmFzXzE5ID0gUTE3Nl8xOSwKICBwcmVfcGFuYXNfMjAgPSBRMTc2XzIwLAogIHByZV9zdGFpXzEgPSBTVEFJLlNfMSwKICBwcmVfc3RhaV8yID0gU1RBSS5TXzIsCiAgcHJlX3N0YWlfMyA9IFNUQUkuU18zLAogIHByZV9zdGFpXzQgPSBTVEFJLlNfNCwKICBwcmVfc3RhaV81ID0gU1RBSS5TXzUsCiAgcHJlX3N0YWlfNiA9IFNUQUkuU182LAogIHByZV9zdGFpXzcgPSBTVEFJLlNfNywKICBwcmVfc3RhaV84ID0gU1RBSS5TXzgsCiAgcHJlX3N0YWlfOSA9IFNUQUkuU185LAogIHByZV9zdGFpXzEwID0gU1RBSS5TXzEwLAogIHByZV9zdGFpXzExID0gU1RBSS5TXzExLAogIHByZV9zdGFpXzEyID0gU1RBSS5TXzEyLAogIHByZV9zdGFpXzEzID0gU1RBSS5TXzEzLAogIHByZV9zdGFpXzE0ID0gU1RBSS5TXzE0LAogIHByZV9zdGFpXzE1ID0gU1RBSS5TXzE1LCAgIAogIHByZV9zdGFpXzE2ID0gU1RBSS5TXzE2LAogIHByZV9zdGFpXzE3ID0gU1RBSS5TXzE3LAogIHByZV9zdGFpXzE4ID0gU1RBSS5TXzE4LAogIHByZV9zdGFpXzE5ID0gU1RBSS5TXzE5LAogIHByZV9zdGFpXzIwID0gU1RBSS5TXzIwCikKCiMgTWFrZSBhbGwgb2YgdGhlIHZhcmlhYmxlcyAoZXhjZXB0IElEKSBudW1lcmljIHJhdGhlciB0aGFuIGNocjoKcHJlX2ZtcmlfMSA8LSBwcmVfZm1yaV8xICU+JSBtdXRhdGVfYXQodmFycygtSUQpLCBmdW5zKGFzLm51bWVyaWMpKQoKIyBDaGVjayBpdCBvdXQ6Cm5hbWVzKHByZV9mbXJpXzEpCnN0cihwcmVfZm1yaV8xKQoKIyBTYXZlIGl0OgpzYXZlUkRTKHByZV9mbXJpXzEsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3ByZV9mbXJpXzEucmRzIikKCgojIyMjIFBPU1QtRk1SSQpwb3N0X2ZtcmlfMSA8LSByZW5hbWUocG9zdF9mbXJpXzAsIElEID0gSUQsIHBvc3RfcGFuYXNfMSA9IFExNzZfMSwKICBwb3N0X3BhbmFzXzIgPSBRMTc2XzIsCiAgcG9zdF9wYW5hc18zID0gUTE3Nl8zLAogIHBvc3RfcGFuYXNfNCA9IFExNzZfNCwKICBwb3N0X3BhbmFzXzUgPSBRMTc2XzUsCiAgcG9zdF9wYW5hc182ID0gUTE3Nl82LAogIHBvc3RfcGFuYXNfNyA9IFExNzZfNywKICBwb3N0X3BhbmFzXzggPSBRMTc2XzgsCiAgcG9zdF9wYW5hc185ID0gUTE3Nl85LAogIHBvc3RfcGFuYXNfMTAgPSBRMTc2XzEwLAogIHBvc3RfcGFuYXNfMTEgPSBRMTc2XzExLAogIHBvc3RfcGFuYXNfMTIgPSBRMTc2XzEyLAogIHBvc3RfcGFuYXNfMTMgPSBRMTc2XzEzLAogIHBvc3RfcGFuYXNfMTQgPSBRMTc2XzE0LAogIHBvc3RfcGFuYXNfMTUgPSBRMTc2XzE1LCAgIAogIHBvc3RfcGFuYXNfMTYgPSBRMTc2XzE2LAogIHBvc3RfcGFuYXNfMTcgPSBRMTc2XzE3LAogIHBvc3RfcGFuYXNfMTggPSBRMTc2XzE4LAogIHBvc3RfcGFuYXNfMTkgPSBRMTc2XzE5LAogIHBvc3RfcGFuYXNfMjAgPSBRMTc2XzIwLAogIHBvc3Rfc3RhaV8xID0gU1RBSS5TXzEsCiAgcG9zdF9zdGFpXzIgPSBTVEFJLlNfMiwKICBwb3N0X3N0YWlfMyA9IFNUQUkuU18zLAogIHBvc3Rfc3RhaV80ID0gU1RBSS5TXzQsCiAgcG9zdF9zdGFpXzUgPSBTVEFJLlNfNSwKICBwb3N0X3N0YWlfNiA9IFNUQUkuU182LAogIHBvc3Rfc3RhaV83ID0gU1RBSS5TXzcsCiAgcG9zdF9zdGFpXzggPSBTVEFJLlNfOCwKICBwb3N0X3N0YWlfOSA9IFNUQUkuU185LAogIHBvc3Rfc3RhaV8xMCA9IFNUQUkuU18xMCwKICBwb3N0X3N0YWlfMTEgPSBTVEFJLlNfMTEsCiAgcG9zdF9zdGFpXzEyID0gU1RBSS5TXzEyLAogIHBvc3Rfc3RhaV8xMyA9IFNUQUkuU18xMywKICBwb3N0X3N0YWlfMTQgPSBTVEFJLlNfMTQsCiAgcG9zdF9zdGFpXzE1ID0gU1RBSS5TXzE1LCAgIAogIHBvc3Rfc3RhaV8xNiA9IFNUQUkuU18xNiwKICBwb3N0X3N0YWlfMTcgPSBTVEFJLlNfMTcsCiAgcG9zdF9zdGFpXzE4ID0gU1RBSS5TXzE4LAogIHBvc3Rfc3RhaV8xOSA9IFNUQUkuU18xOSwKICBwb3N0X3N0YWlfMjAgPSBTVEFJLlNfMjAsCiAgcG9zdF9zcm9lXzEgPSBTUk9FLjEsCiAgcG9zdF9zcm9lXzIgPSBTUk9FLjIsCiAgcG9zdF9zcm9lXzMgPSBRNwopCgojIE1ha2UgYWxsIG9mIHRoZSB2YXJpYWJsZXMgKGV4Y2VwdCBJRCBhbmQgU1JPRSAxIGFuZCAyIHZhcnMpIG51bWVyaWMgcmF0aGVyIHRoYW4gY2hyOgpwb3N0X2ZtcmlfMSA8LSBwb3N0X2ZtcmlfMSAlPiUgbXV0YXRlX2F0KHZhcnMoLWMoSUQscG9zdF9zcm9lXzEscG9zdF9zcm9lXzIpKSwgZnVucyhhcy5udW1lcmljKSkKCiMgQ2hlY2sgaXQgb3V0OgpuYW1lcyhwb3N0X2ZtcmlfMSkKc3RyKHBvc3RfZm1yaV8xKQoKIyBTYXZlIGl0OgpzYXZlUkRTKHBvc3RfZm1yaV8xLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9wb3N0X2ZtcmlfMS5yZHMiKQpgYGAKCiMjIENsZWFuIG51bWVyaWNhbCB2YXJpYWJsZXMgYW5kIHNjb3JlIHNjYWxlcwojIyNQcmUKYGBge3J9CiMgRm9yIHRoaXMgc2VjdGlvbiwgeW91J2xsIG5lZWQgdGhlICdwc3ljaCcgcGFja2FnZQojIyBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpIGlmIHlvdSBkb24ndCBoYXZlIGl0IG9uIHRoaXMgbWFjaGluZQpsaWJyYXJ5KHBzeWNoKQoKcHJlX2ZtcmlfMiA8LSBwcmVfZm1yaV8xICMgcHJlX2ZtcmlfMiB3aWxsIGNvbnRhaW4gdGhlIHNjb3JlZCBtZWFzdXJlcwoKIyMjIyMjIyMjIyMjIyMjIyMjICAKIyMjIFBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBBZmZlY3QgU2NoZWR1bGUgKFBBTkFTKSDigJMgU3RhdGUgVmVyc2lvbgoKIyBDaXRhdGlvbjogV2F0c29uLCBELiwgQ2xhcmssIEwuIEEuLCAmIFRlbGxlZ2VuLCBBLiAoMTk4OCkuIERldmVsb3BtZW50IGFuZCB2YWxpZGF0aW9uIG9mIGJyaWVmIG1lYXN1cmVzIG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBhZmZlY3Q6IHRoZSBQQU5BUyBzY2FsZXMuIEpvdXJuYWwgb2YgUGVyc29uYWxpdHkgYW5kIFNvY2lhbCBQc3ljaG9sb2d5LCA1NCg2KSwgMTA2My4gCgojIEFuc3dlciBjaG9pY2VzIHJhbmdlIGZyb20gMSAoVmVyeSBzbGlnaHRseSBvciBub3QgYXQgYWxsKSDigJMgNCAoRXh0cmVtZWx5KS4KIyBObyByZXZlcnNlLXNjb3JlZCBpdGVtcy4KIyBQb3NpdGl2ZSBhZmZlY3Q6IDEsIDMsIDUsIDksIDEwLCAxMiwgMTQsIDE2LCAxNywgMTkgW3RvdF9wcmVfcGFuYXNfcGFdCiMgTmVnYXRpdmUgYWZmZWN0OiAyLCA0LCA2LCA3LCA4LCAxMSwgMTMsIDE1LCAxOCwgMjAgW3RvdF9wcmVfcGFuYXNfbmFdCgojIHRvdGFsIHNjb3JlOgp0b3RfcHJlX3BhbmFzX3BhIDwtIHN1YnNldChwcmVfZm1yaV8yLCBzZWxlY3Q9YygicHJlX3BhbmFzXzEiLCJwcmVfcGFuYXNfMyIsICJwcmVfcGFuYXNfNSIsICJwcmVfcGFuYXNfOSIsInByZV9wYW5hc18xMCIsInByZV9wYW5hc18xMiIsInByZV9wYW5hc18xNCIsInByZV9wYW5hc18xNiIsInByZV9wYW5hc18xNyIsInByZV9wYW5hc18xOSIpKQp0b3RfcHJlX3BhbmFzX25hIDwtIHN1YnNldChwcmVfZm1yaV8yLCBzZWxlY3Q9YygicHJlX3BhbmFzXzIiLCJwcmVfcGFuYXNfNCIsICJwcmVfcGFuYXNfNiIsICJwcmVfcGFuYXNfNyIsInByZV9wYW5hc184IiwicHJlX3BhbmFzXzExIiwicHJlX3BhbmFzXzEzIiwicHJlX3BhbmFzXzE1IiwicHJlX3BhbmFzXzE4IiwicHJlX3BhbmFzXzIwIikpCgpwcmVfZm1yaV8yJHRvdF9wcmVfcGFuYXNfcGEgPC0gcm93U3Vtcyh0b3RfcHJlX3BhbmFzX3BhLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUocHJlX2ZtcmlfMiR0b3RfcHJlX3BhbmFzX3BhKQoKcHJlX2ZtcmlfMiR0b3RfcHJlX3BhbmFzX25hIDwtIHJvd1N1bXModG90X3ByZV9wYW5hc19uYSwgbmEucm09VFJVRSkgCmRlc2NyaWJlKHByZV9mbXJpXzIkdG90X3ByZV9wYW5hc19uYSkKCiMjIyMjIyMjIyMjIyMjIyMjIyAgCiMjIyBTdGF0ZS1UcmFpdCBBbnhpZXR5IEludmVudG9yeSAoU1RBSSkg4oCTIFN0YXRlIFZlcnNpb24KCgojIENpdGF0aW9uOiBTcGllbGJlcmdlciwgQy5ELiAoMTk4MykuIE1hbnVhbCBmb3IgdGhlIFN0YXRlLVRyYWl0IEFueGlldHkgSW52ZW50b3J5IChTVEFJKS4gUGFsbyBBbHRvLCBDQTogQ29uc3VsdGluZyBQc3ljaG9sb2dpc3RzIFByZXNzLiAKCiMgQW5zd2VyIGNob2ljZXMgcmFuZ2UgZnJvbSAxIChOb3QgYXQgYWxsKSDigJMgNCAoVmVyeSBtdWNoIHNvKS4KIyBSZXZlcnNlLXNjb3JlZDogMSwgMiwgNSwgOCwgMTAsIDExLCAxNSwgMTYsIDE5LCAyMC4gCiMgU3VtIHRvdGFsIHNjb3JlIFt0b3RfcHJlX3N0YWldCgpwcmVfZm1yaV8yJHByZV9zdGFpXzFyIDwtIDUgLSBwcmVfZm1yaV8yJHByZV9zdGFpXzEKcHJlX2ZtcmlfMiRwcmVfc3RhaV8yciA8LSA1IC0gcHJlX2ZtcmlfMiRwcmVfc3RhaV8yCnByZV9mbXJpXzIkcHJlX3N0YWlfNXIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfNQpwcmVfZm1yaV8yJHByZV9zdGFpXzhyIDwtIDUgLSBwcmVfZm1yaV8yJHByZV9zdGFpXzgKcHJlX2ZtcmlfMiRwcmVfc3RhaV8xMHIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMTAKcHJlX2ZtcmlfMiRwcmVfc3RhaV8xMXIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMTEKcHJlX2ZtcmlfMiRwcmVfc3RhaV8xNXIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMTUKcHJlX2ZtcmlfMiRwcmVfc3RhaV8xNnIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMTYKcHJlX2ZtcmlfMiRwcmVfc3RhaV8xOXIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMTkKcHJlX2ZtcmlfMiRwcmVfc3RhaV8yMHIgPC0gNSAtIHByZV9mbXJpXzIkcHJlX3N0YWlfMjAKCiMgdG90YWwgc2NvcmU6CnRvdF9wcmVfc3RhaSA8LSBzdWJzZXQocHJlX2ZtcmlfMiwgc2VsZWN0PWMoInByZV9zdGFpXzFyIiwicHJlX3N0YWlfMnIiLCJwcmVfc3RhaV8zIiwicHJlX3N0YWlfNCIsInByZV9zdGFpXzVyIiwicHJlX3N0YWlfNiIsInByZV9zdGFpXzciLCJwcmVfc3RhaV84ciIsICJwcmVfc3RhaV85IiwicHJlX3N0YWlfMTByIiwicHJlX3N0YWlfMTFyIiwicHJlX3N0YWlfMTIiLCJwcmVfc3RhaV8xMyIsInByZV9zdGFpXzE0IiwicHJlX3N0YWlfMTVyIiwicHJlX3N0YWlfMTZyIiwicHJlX3N0YWlfMTciLCJwcmVfc3RhaV8xOCIsInByZV9zdGFpXzE5ciIsInByZV9zdGFpXzIwciIpKQpwcmVfZm1yaV8yJHRvdF9wcmVfc3RhaSA8LSByb3dTdW1zKHRvdF9wcmVfc3RhaSwgbmEucm09VFJVRSkgCmRlc2NyaWJlKHByZV9mbXJpXzIkdG90X3ByZV9zdGFpKQoKIyBjaGVjayB0aGF0IGFsbCAidG90XyoiIHZhcmlhYmxlcyBhcHBlYXIKbmFtZXMocHJlX2ZtcmlfMikgCgojIHNhdmUgdGhlIGNsZWFuZWQgYW5kIHNjb3JlZCBkYXRhCnNhdmVSRFMocHJlX2ZtcmlfMiwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcHJlX2ZtcmlfMi5yZHMiKQpgYGAKCiMjI1Bvc3QKYGBge3J9Cgpwb3N0X2ZtcmlfMiA8LSBwb3N0X2ZtcmlfMSAjIHBvc3RfZm1yaV8yIHdpbGwgY29udGFpbiB0aGUgc2NvcmVkIG1lYXN1cmVzCgojIFJlY29kZSB0aGUgc3JvZV8zIGl0ZW0gKHJhdGUgdGFzayBkaWZmaWN1bHR5KS4KIyBTaG91bGQgYmUgb24gc2NhbGUgb2YgMSAoZWFzeSkgdG8gNSAobmVhcmx5IGltcG9zc2libGUpIAojIE5vIG9uZSBlbmRvcnNlZCAibmVhcmx5IGltcG9zc2libGUiCnBvc3RfZm1yaV8yIDwtICBwb3N0X2ZtcmlfMiAlPiUgbXV0YXRlKHBvc3Rfc3JvZV8zID0gYXMubnVtZXJpYyhyZWNvZGUocG9zdF9zcm9lXzMsICIxNyIgPSAiMSIsICIxOSIgPSAiMiIsICIyMCIgPSAiMyIsICIyMSIgPSAiNCIpKSkKCiMjIyMjIyMjIyMjIyMjIyMjIyAgCiMjIyBQb3NpdGl2ZSBhbmQgTmVnYXRpdmUgQWZmZWN0IFNjaGVkdWxlIChQQU5BUykg4oCTIFN0YXRlIFZlcnNpb24KCiMgQ2l0YXRpb246IFdhdHNvbiwgRC4sIENsYXJrLCBMLiBBLiwgJiBUZWxsZWdlbiwgQS4gKDE5ODgpLiBEZXZlbG9wbWVudCBhbmQgdmFsaWRhdGlvbiBvZiBicmllZiBtZWFzdXJlcyBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgYWZmZWN0OiB0aGUgUEFOQVMgc2NhbGVzLiBKb3VybmFsIG9mIFBlcnNvbmFsaXR5IGFuZCBTb2NpYWwgUHN5Y2hvbG9neSwgNTQoNiksIDEwNjMuIAoKIyBBbnN3ZXIgY2hvaWNlcyByYW5nZSBmcm9tIDEgKFZlcnkgc2xpZ2h0bHkgb3Igbm90IGF0IGFsbCkg4oCTIDQgKEV4dHJlbWVseSkuCiMgTm8gcmV2ZXJzZS1zY29yZWQgaXRlbXMuCiMgUG9zaXRpdmUgYWZmZWN0OiAxLCAzLCA1LCA5LCAxMCwgMTIsIDE0LCAxNiwgMTcsIDE5IFt0b3RfcG9zdF9wYW5hc19wYV0KIyBOZWdhdGl2ZSBhZmZlY3Q6IDIsIDQsIDYsIDcsIDgsIDExLCAxMywgMTUsIDE4LCAyMCBbdG90X3Bvc3RfcGFuYXNfbmFdCgojIHRvdGFsIHNjb3JlOgp0b3RfcG9zdF9wYW5hc19wYSA8LSBzdWJzZXQocG9zdF9mbXJpXzIsIHNlbGVjdD1jKCJwb3N0X3BhbmFzXzEiLCJwb3N0X3BhbmFzXzMiLCAicG9zdF9wYW5hc181IiwgInBvc3RfcGFuYXNfOSIsInBvc3RfcGFuYXNfMTAiLCJwb3N0X3BhbmFzXzEyIiwicG9zdF9wYW5hc18xNCIsInBvc3RfcGFuYXNfMTYiLCJwb3N0X3BhbmFzXzE3IiwicG9zdF9wYW5hc18xOSIpKQp0b3RfcG9zdF9wYW5hc19uYSA8LSBzdWJzZXQocG9zdF9mbXJpXzIsIHNlbGVjdD1jKCJwb3N0X3BhbmFzXzIiLCJwb3N0X3BhbmFzXzQiLCAicG9zdF9wYW5hc182IiwgInBvc3RfcGFuYXNfNyIsInBvc3RfcGFuYXNfOCIsInBvc3RfcGFuYXNfMTEiLCJwb3N0X3BhbmFzXzEzIiwicG9zdF9wYW5hc18xNSIsInBvc3RfcGFuYXNfMTgiLCJwb3N0X3BhbmFzXzIwIikpCgpwb3N0X2ZtcmlfMiR0b3RfcG9zdF9wYW5hc19wYSA8LSByb3dTdW1zKHRvdF9wb3N0X3BhbmFzX3BhLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUocG9zdF9mbXJpXzIkdG90X3Bvc3RfcGFuYXNfcGEpCgpwb3N0X2ZtcmlfMiR0b3RfcG9zdF9wYW5hc19uYSA8LSByb3dTdW1zKHRvdF9wb3N0X3BhbmFzX25hLCBuYS5ybT1UUlVFKSAKZGVzY3JpYmUocG9zdF9mbXJpXzIkdG90X3Bvc3RfcGFuYXNfbmEpCgojIyMjIyMjIyMjIyMjIyMjIyMgIAojIyMgU3RhdGUtVHJhaXQgQW54aWV0eSBJbnZlbnRvcnkgKFNUQUkpIOKAkyBTdGF0ZSBWZXJzaW9uCgoKIyBDaXRhdGlvbjogU3BpZWxiZXJnZXIsIEMuRC4gKDE5ODMpLiBNYW51YWwgZm9yIHRoZSBTdGF0ZS1UcmFpdCBBbnhpZXR5IEludmVudG9yeSAoU1RBSSkuIFBhbG8gQWx0bywgQ0E6IENvbnN1bHRpbmcgUHN5Y2hvbG9naXN0cyBQcmVzcy4gCgojIEFuc3dlciBjaG9pY2VzIHJhbmdlIGZyb20gMSAoTm90IGF0IGFsbCkg4oCTIDQgKFZlcnkgbXVjaCBzbykuCiMgUmV2ZXJzZS1zY29yZWQ6IDEsIDIsIDUsIDgsIDEwLCAxMSwgMTUsIDE2LCAxOSwgMjAuIAojIFN1bSB0b3RhbCBzY29yZSBbdG90X3Bvc3Rfc3RhaV0KCnBvc3RfZm1yaV8yJHBvc3Rfc3RhaV8xciA8LSA1IC0gcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzEKcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzJyIDwtIDUgLSBwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfMgpwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfNXIgPC0gNSAtIHBvc3RfZm1yaV8yJHBvc3Rfc3RhaV81CnBvc3RfZm1yaV8yJHBvc3Rfc3RhaV84ciA8LSA1IC0gcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzgKcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzEwciA8LSA1IC0gcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzEwCnBvc3RfZm1yaV8yJHBvc3Rfc3RhaV8xMXIgPC0gNSAtIHBvc3RfZm1yaV8yJHBvc3Rfc3RhaV8xMQpwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfMTVyIDwtIDUgLSBwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfMTUKcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzE2ciA8LSA1IC0gcG9zdF9mbXJpXzIkcG9zdF9zdGFpXzE2CnBvc3RfZm1yaV8yJHBvc3Rfc3RhaV8xOXIgPC0gNSAtIHBvc3RfZm1yaV8yJHBvc3Rfc3RhaV8xOQpwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfMjByIDwtIDUgLSBwb3N0X2ZtcmlfMiRwb3N0X3N0YWlfMjAKCiMgdG90YWwgc2NvcmU6CnRvdF9wb3N0X3N0YWkgPC0gc3Vic2V0KHBvc3RfZm1yaV8yLCBzZWxlY3Q9YygicG9zdF9zdGFpXzFyIiwicG9zdF9zdGFpXzJyIiwicG9zdF9zdGFpXzMiLCJwb3N0X3N0YWlfNCIsInBvc3Rfc3RhaV81ciIsInBvc3Rfc3RhaV82IiwicG9zdF9zdGFpXzciLCJwb3N0X3N0YWlfOHIiLCAicG9zdF9zdGFpXzkiLCJwb3N0X3N0YWlfMTByIiwicG9zdF9zdGFpXzExciIsInBvc3Rfc3RhaV8xMiIsInBvc3Rfc3RhaV8xMyIsInBvc3Rfc3RhaV8xNCIsInBvc3Rfc3RhaV8xNXIiLCJwb3N0X3N0YWlfMTZyIiwicG9zdF9zdGFpXzE3IiwicG9zdF9zdGFpXzE4IiwicG9zdF9zdGFpXzE5ciIsInBvc3Rfc3RhaV8yMHIiKSkKcG9zdF9mbXJpXzIkdG90X3Bvc3Rfc3RhaSA8LSByb3dTdW1zKHRvdF9wb3N0X3N0YWksIG5hLnJtPVRSVUUpIApkZXNjcmliZShwb3N0X2ZtcmlfMiR0b3RfcG9zdF9zdGFpKQoKIyBjaGVjayB0aGF0IGFsbCAidG90XyoiIHZhcmlhYmxlcyBhcHBlYXIKbmFtZXMocG9zdF9mbXJpXzIpIAoKIyBzYXZlIHRoZSBjbGVhbmVkIGFuZCBzY29yZWQgZGF0YQpzYXZlUkRTKHBvc3RfZm1yaV8yLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9wb3N0X2ZtcmlfMi5yZHMiKQpgYGAKCgojIyBSZW9yZ2FuaXplIGRhdGEKIyMjIEJ5IHZpc2l0Ck5vdyB3ZSBuZWVkIHRvIGNyZWF0ZSB0d28gc3Vic2V0czogb25lIGZvciB0aGUgZmlyc3QgdmlzaXQsIG9uZSBmb3IgdGhlIHNlY29uZCB2aXNpdCAod2UnbGwgcHV0IHRoZW0gYmFjayB0b2dldGhlciBsYXRlcikuCmBgYHtyfQojIHByZV9mbXJpLCBmaXJzdCB2aXNpdDoKcHJlX2ZtcmlfdjEgPC0gZmlsdGVyKHByZV9mbXJpXzIsICFncmVwbCgiX2IiLElEKSkgIyBpLmUuLCBmaWx0ZXIgaWYgZG9lcyBub3QgY29udGFpbiBzdHJpbmcgIl9iIgpWaWV3KHByZV9mbXJpX3YxKQoKIyBwcmVfZm1yaSwgc2Vjb25kIHZpc2l0OgpwcmVfZm1yaV92MiA8LSBmaWx0ZXIocHJlX2ZtcmlfMiwgZ3JlcGwoIl9iIixJRCkpClZpZXcocHJlX2ZtcmlfdjIpCm5hbWVzKHByZV9mbXJpX3YyKQoKIyBwb3N0X2ZtcmksIGZpcnN0IHZpc2l0Ogpwb3N0X2ZtcmlfdjEgPC0gZmlsdGVyKHBvc3RfZm1yaV8yLCAhZ3JlcGwoIl9iIixJRCkpClZpZXcocG9zdF9mbXJpX3YxKQoKIyBwb3N0X2ZtcmksIHNlY29uZCB2aXNpdDoKcG9zdF9mbXJpX3YyIDwtIGZpbHRlcihwb3N0X2ZtcmlfMiwgZ3JlcGwoIl9iIixJRCkpClZpZXcocG9zdF9mbXJpX3YyKQoKIyBSZW1vdmUgIl9iIiBmcm9tIHRoZSBzZWNvbmQgdmlzaXQgZGF0YXNldHMgc28gdGhhdCB3ZSBjYW4gbWVyZ2UgX3YxIGFuZCBfdjIgYmFjayB0b2dldGhlciBldmVudHVhbGx5CnByZV9mbXJpX3YyIDwtIHByZV9mbXJpX3YyICU+JSAKICBtdXRhdGUoSUQgPSBzdHJfcmVwbGFjZShJRCwgIl9iIiwgIiIpKQoKcG9zdF9mbXJpX3YyIDwtIHBvc3RfZm1yaV92MiAlPiUgCiAgbXV0YXRlKElEID0gc3RyX3JlcGxhY2UoSUQsICJfYiIsICIiKSkKCiMgQWRkIGEgc3VmZml4IHRvIHRoZSBlbmQgb2YgdmFyaWFibGVzIGRlbm90aW5nIHdoaWNoIHZpc2l0OgpwcmVfZm1yaV92MSA8LSBwcmVfZm1yaV92MSAlPiUKICByZW5hbWVfYXQodmFycygtSUQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfdjEiKSkKCnByZV9mbXJpX3YyIDwtIHByZV9mbXJpX3YyICU+JQogIHJlbmFtZV9hdCh2YXJzKC1JRCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl92MiIpKQoKcG9zdF9mbXJpX3YxIDwtIHBvc3RfZm1yaV92MSAlPiUKICByZW5hbWVfYXQodmFycygtSUQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfdjEiKSkKCnBvc3RfZm1yaV92MiA8LSBwb3N0X2ZtcmlfdjIgJT4lCiAgcmVuYW1lX2F0KHZhcnMoLUlEKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX3YyIikpCmBgYAoKVGhlbiwgZGVhbGluZyB3aXRoIEQxMTVfYidzIHBvc3QtZk1SSSBkYXRhIHRoYXQncyBpbiB0aGUgcHJlX2ZtcmkgZGF0YXNldC4uLgoKYGBge3J9CkQxMTVfcG9zdF9mbXJpX3YyIDwtIGZpbHRlcihwcmVfZm1yaV8yLCBncmVwbCgicG9zdCIsSUQpKSAjIGkuZS4sIGZpbHRlciBpZiBkb2VzIG5vdCBjb250YWluIHN0cmluZyAicG9zdCIKVmlldyhEMTE1X3Bvc3RfZm1yaV92MikKRDExNV9wb3N0X2ZtcmlfdjIgPC0gRDExNV9wb3N0X2ZtcmlfdjIgJT4lIG11dGF0ZShJRCA9IHJlY29kZShJRCwgIkQxMTVfYl9wb3N0IiA9ICJEMTE1IikpICMgY2hhbmdlZCBEMTE1X2JfcG9zdCB0byBEMTE1CgojIHJlbmFtZSAicHJlIiB0byAicG9zdCIKbmFtZXMoRDExNV9wb3N0X2ZtcmlfdjIpIDwtIGdzdWIoInByZSIsICJwb3N0IiwgbmFtZXMoRDExNV9wb3N0X2ZtcmlfdjIpKQpuYW1lcyhEMTE1X3Bvc3RfZm1yaV92MikgIyBpdCB3b3JrZWQhCgojIGFkZCBhIHN1ZmZpeCB0byB0aGUgZW5kIG9mIHZhcmlhYmxlcyBkZW5vdGluZyBzZWNvbmQgdmlzaXQ6CkQxMTVfcG9zdF9mbXJpX3YyIDwtIEQxMTVfcG9zdF9mbXJpX3YyICU+JQogIHJlbmFtZV9hdCh2YXJzKC1JRCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl92MiIpKQoKIyBhdHRhY2ggYmFjayB0byBwb3N0X2ZtcmlfdjIKcG9zdF9mbXJpX3YyIDwtIGJpbmRfcm93cyhEMTE1X3Bvc3RfZm1yaV92Mixwb3N0X2ZtcmlfdjIpClZpZXcocG9zdF9mbXJpX3YyKQoKIyBhbmQgZmluYWxseSwgZHJvcCBEMTE1X3Bvc3QgZnJvbSB0aGUgKGluY29ycmVjdCkgcHJlLWZtcmkgdmlzaXQgMiBkYXRhc2V0CnByZV9mbXJpX3YyIDwtIGZpbHRlcihwcmVfZm1yaV92MiwgIWdyZXBsKCJwb3N0IixJRCkpCmBgYAoKTWVyZ2luZyBmaXJzdCBhbmQgc2Vjb25kIHZpc2l0cyBiYWNrIHRvZ2V0aGVyLi4uCmBgYHtyfQojIyMgUFJFCiMjIFB1dCB0aGVtIGJhY2sgdG9nZXRoZXIKcHJlX2ZtcmlfMyA8LSBsZWZ0X2pvaW4ocHJlX2ZtcmlfdjEsIHByZV9mbXJpX3YyLCBieT0iSUQiKSAjIG1lcmdlIHByZV92MSBhbmQgcHJlX3YyIGJ5IElEClZpZXcocHJlX2ZtcmlfMykKbmFtZXMocHJlX2ZtcmlfMykKCnByZV9mbXJpX05BX3YyIDwtIHN1YnNldChwcmVfZm1yaV8zLCBpcy5uYSh0b3RfcHJlX3N0YWlfdjIpKQpwcmVfZm1yaV9OQV92MiRJRAojIHdlIGFyZSBtaXNzaW5nIHByZV9mbXJpX3YyIGRhdGEgZnJvbSBEMTA4LCBEMTExLCBEMTA5LCBhbmQgRDEyNC4gVGhpcyBpcyBjb3JyZWN0OiBhbGwgd2VyZSBkcm9wcGVkLgojIHRoZXJlJ3Mgc29tZXRoaW5nIHdlaXJkIGdvaW5nIG9uIHdpdGggRDEzMC4gRDEzMCBpcyBOT1QgbWlzc2luZyBkYXRhIGJ1dCBmb3Igc29tZSByZWFzb24gd2hlbiB0aGVzZSBkYXRhIGFyZSBtZXJnZWQsIHRoZSBfdjIgZGF0YSBpcyBkcm9wcGVkLiBPbmx5IHdheSBJJ3ZlIGZvdW5kIHRvIGZpeCB0aGlzIGlzIHRvIGZpeCBpdCBtYW51YWxseSBhbmQgcmV0eXBlICJEMTMwIiBpbiBwcmVfZm1yaV92Mi4KZml4KHByZV9mbXJpX3YyKQpwcmVfZm1yaV8zIDwtIGxlZnRfam9pbihwcmVfZm1yaV92MSwgcHJlX2ZtcmlfdjIsIGJ5PSJJRCIpICMgbWVyZ2UgcHJlX3YxIGFuZCBwcmVfdjIgYnkgSUQKcHJlX2ZtcmlfTkFfdjIgPC0gc3Vic2V0KHByZV9mbXJpXzMsIGlzLm5hKHRvdF9wcmVfc3RhaV92MikpCnByZV9mbXJpX05BX3YyJElECiMgbm93IG9ubHkgbWlzc2luZyBEMTA4LCBEMTA5LCBEMTExLCBEMTI0LiAKCiMgc2F2ZSBpdApzYXZlUkRTKHByZV9mbXJpXzMsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3ByZV9mbXJpXzMucmRzIikKCgojIyMgUE9TVAojIyBQdXQgdGhlbSBiYWNrIHRvZ2V0aGVyIChQT1NUKQpwb3N0X2ZtcmlfMyA8LSBsZWZ0X2pvaW4ocG9zdF9mbXJpX3YxLCBwb3N0X2ZtcmlfdjIsIGJ5PSJJRCIpICMgbWVyZ2UgcG9zdF92MSBhbmQgcG9zdF92MiBieSBJRApWaWV3KHBvc3RfZm1yaV8zKQpuYW1lcyhwb3N0X2ZtcmlfMykKCnBvc3RfZm1yaV9OQV92MiA8LSBzdWJzZXQocG9zdF9mbXJpXzMsIGlzLm5hKHRvdF9wb3N0X3N0YWlfdjIpKQpwb3N0X2ZtcmlfTkFfdjIkSUQKIyB3ZSBhcmUgbWlzc2luZyBwb3N0X2ZtcmlfdjIgZGF0YSBmcm9tIEQxMDggYW5kIEQxMTEuIFRoaXMgaXMgY29ycmVjdDogYm90aCB3ZXJlIGRyb3BwZWQuCgojIHNhdmUgaXQKc2F2ZVJEUyhwb3N0X2ZtcmlfMywgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcG9zdF9mbXJpXzMucmRzIikKCmBgYAoKClRoZW4gbWVyZ2luZyBwcmUgYW5kIHBvc3QgdG9nZXRoZXIuLi4KYGBge3J9CnByZV9wb3N0X2ZtcmkgPC0gbGVmdF9qb2luKHByZV9mbXJpXzMsIHBvc3RfZm1yaV8zLCBieT0iSUQiKQpWaWV3KHByZV9wb3N0X2ZtcmkpCm5hbWVzKHByZV9wb3N0X2ZtcmkpCgpwcmVfcG9zdF9mbXJpIDwtIGZpbHRlcihwcmVfcG9zdF9mbXJpLCAhZ3JlcGwoIkQxMDh8RDEwOXxEMTExfEQxMjQiLElEKSkgIyByZW1vdmUgRDEwOCwgRDEwOSwgRDExMSwgRDEyNCAKIyA0MCBvYnNlcnZhdGlvbnMgb2YgMjE5IHZhcmlhYmxlcwoKIyBzYXZlIGl0CnNhdmVSRFMocHJlX3Bvc3RfZm1yaSwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcHJlLXBvc3RfZm1yaS5yZHMiKQpgYGAKCgoKQW5kIGZpbmFsbHksIG1lcmdpbmcgYWxsIHNlbGYtcmVwb3J0IG1lYXN1cmVzIHRvZ2V0aGVyIChiYXNlbGluZSwgYmFzZWxpbmVfcG9zdCwgcHJlX3Bvc3RfZm1yaSk6CmBgYHtyfQpiYXNlbGluZV9hbGwgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9iYXNlbGluZV93aXRoX3Bvc3QtYmFzZWxpbmUucmRzIikgIyA0MCBvYnNlcnZhdGlvbnMgb2YgNDU3IHZhcmlhYmxlcwoKc2VsZnJlcG9ydHMgPC0gbGVmdF9qb2luKGJhc2VsaW5lX2FsbCwgcHJlX3Bvc3RfZm1yaSwgYnk9IklEIikgIyA0MCBvYnNlcnZhdGlvbnMgb2YgNjc1IHZhcmlhYmxlcwoKc2F2ZVJEUyhzZWxmcmVwb3J0cywgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHMucmRzIikKIyBzZWxmcmVwb3J0cyA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzLnJkcyIpCmBgYAoKVGhpcyB5aWVsZHMgNDAgb2JzZXJ2YXRpb25zIG9mIDY3NSB2YXJpYWJsZXMuCgojIyBIaXN0b2dyYW1zIGFuZCBib3hwbG90cwpgYGB7cn0KCiMgQ3JlYXRlIGEgc3Vic2V0IG9mIG9ubHkgc2NhbGUgdG90YWwgc2NvcmVzIChpLmUuLCB2YXJpYWJsZXMgdGhhdCBzdGFydCB3aXRoICJ0b3QiIG9yIHRoZSB0YXNrIGRpZmZpY3VsdHkgcmF0aW5nKQpzY2FsZXNfZm1yaSA8LSBwcmVfcG9zdF9mbXJpWywgZ3JlcCgnXnRvdHxwb3N0X3Nyb2VfMycsIG5hbWVzKHByZV9wb3N0X2ZtcmkpKV0KCiMgUGxvdCB0aGUgdmFyaWFibGVzOgpmb3IoaSBpbiAxOmxlbmd0aChzY2FsZXNfZm1yaSkpIGJveHBsb3Qoc2NhbGVzX2ZtcmlbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoc2NhbGVzX2ZtcmlbaV0pKQpmb3IoaSBpbiAxOmxlbmd0aChzY2FsZXNfZm1yaSkpIGhpc3Qoc2NhbGVzX2ZtcmlbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoc2NhbGVzX2ZtcmlbaV0pKQoKYGBgCgoKCiMjIERlc2NyaXB0aXZlcwpgYGB7cn0KIyBWaWV3IGRlc2NyaXB0aXZlcyBmb3IgZWFjaCBzY2FsZQojIyBzdGFyZ2F6ZXIgbWFrZXMgbmljZS1sb29raW5nIHN1bW1hcnkgdGFibGVzIChodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3RhcmdhemVyL3ZpZ25ldHRlcy9zdGFyZ2F6ZXIucGRmKQoKbGlicmFyeShzdGFyZ2F6ZXIpICMgaW5zdGFsbC5wYWNrYWdlcygic3RhcmdhemVyIikgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB1c2luZyB0aGUgcGFja2FnZSBvbiB0aGlzIG1hY2hpbmUKc3RhcmdhemVyKHNjYWxlc19mbXJpLCB0eXBlPSJ0ZXh0IikKYGBgCgojIyBULXRlc3RzOiBjb21wYXJpbmcgdmlzaXRzCmBgYHtyfQojIyMgUHJlLWZNUkkgbWVhc3VyZXMKbmFtZXMoc2NhbGVzX2ZtcmkpIAp0LnRlc3Qoc2NhbGVzX2ZtcmkkdG90X3ByZV9wYW5hc19wYV92MSwgc2NhbGVzX2ZtcmkkdG90X3ByZV9wYW5hc19wYV92MiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAjIHNpZyBkaWZmCgp0LnRlc3Qoc2NhbGVzX2ZtcmkkdG90X3ByZV9wYW5hc19uYV92MSwgc2NhbGVzX2ZtcmkkdG90X3ByZV9wYW5hc19uYV92MiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAjIG5zCgp0LnRlc3Qoc2NhbGVzX2ZtcmkkdG90X3ByZV9zdGFpX3YxLCBzY2FsZXNfZm1yaSR0b3RfcHJlX3N0YWlfdjIsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgIyBucwoKIyMjIFBvc3QtZk1SSSBtZWFzdXJlcwp0LnRlc3Qoc2NhbGVzX2ZtcmkkdG90X3Bvc3RfcGFuYXNfcGFfdjEsIHNjYWxlc19mbXJpJHRvdF9wb3N0X3BhbmFzX3BhX3YyLAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UpICMgc2lnIGRpZmYKCnQudGVzdChzY2FsZXNfZm1yaSR0b3RfcG9zdF9wYW5hc19uYV92MSwgc2NhbGVzX2ZtcmkkdG90X3Bvc3RfcGFuYXNfbmFfdjIsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgIyBucwoKdC50ZXN0KHNjYWxlc19mbXJpJHRvdF9wb3N0X3N0YWlfdjEsIHNjYWxlc19mbXJpJHRvdF9wb3N0X3N0YWlfdjIsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgIyBzaWcgZGlmZgoKdC50ZXN0KHNjYWxlc19mbXJpJHBvc3Rfc3JvZV8zX3YxLCBzY2FsZXNfZm1yaSRwb3N0X3Nyb2VfM192MiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAjIHNpZyBkaWZmCgpgYGAKRnJvbSB0aGUgdC10ZXN0cywgd2Ugc2VlIHRoYXQ6CgoxLiBQYXJ0aWNpcGFudHMgcmVwb3J0ZWQgaGlnaGVyIHByZS1mTVJJIHBvc2l0aXZlIGFmZmVjdCBhdCB0aGUgc2Vjb25kIHZpc2l0LCBjb21wYXJlZCB0byB0aGUgZmlyc3QuCjIuIFBhcnRpY2lwYW50cyByZXBvcnRlZCBoaWdoZXIgcG9zdC1mTVJJIHBvc2l0aXZlIGFmZmVjdCBhdCB0aGUgc2Vjb25kIHZpc2l0LCBjb21wYXJlZCB0byB0aGUgZmlyc3QuCjMuIFBhcnRpY2lwYW50cyByZXBvcnRlZCBsb3dlciBwb3N0LWZNUkkgYW54aWV0eSBhdCB0aGUgc2Vjb25kIHZpc2l0LCBjb21wYXJlZCB0byB0aGUgZmlyc3QuCjQuIFBhcnRpY2lwYW50cyByZXBvcnRlZCB0aGF0IHRoZSB0YXNrIHdhcyBlYXNpZXIgYXQgdGhlIHNlY29uZCB2aXNpdCwgY29tcGFyZWQgdG8gdGhlIGZpcnN0Lgo1LiBQcmUtZk1SSSBhbnhpZXR5IGFuZCBuZWdhdGl2ZSBhZmZlY3Qgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYmV0d2VlbiB2aXNpdHMuCjYuIFBvc3QtZk1SSSBuZWdhdGl2ZSBhZmZlY3Qgd2FzIG5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIHZpc2l0cy4gCgojIyBFdmFsdWF0ZSBtaXNzaW5nIGRhdGEgCmBgYHtyfQpwcmVfcG9zdF9mbXJpICU+JSAKICBzZWxlY3RfaWYoZnVuY3Rpb24oeCkgYW55KGlzLm5hKHgpKSkgJT4lIAogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKGlzLm5hKC4pKSkpIC0+IHByZV9wb3N0X2ZtcmlfTkEgIyB1c2Ugc3VtKCkgdG8gZmluZCBuIG1pc3NpbmcgdmFsdWVzCgpnYXRoZXIocHJlX3Bvc3RfZm1yaV9OQSkgLT4gcHJlX3Bvc3RfZm1yaV9OQV9sb25nICMgY3JlYXRlIGxvbmcgZGF0YSB0aGF0IGxpc3RzIHZhcmlhYmxlcyB3aXRoIGFueSBOQXMsIGFuZCAlIG9mIGRhdGEgbWlzc2luZwpwcmVfcG9zdF9mbXJpX05BX2xvbmcKYGBgCldlIGhhdmUgOSB2YXJpYWJsZXMgbWlzc2luZyBkYXRhLCB3aGVyZSBvbmUgcmVzcG9uc2Ugd2FzIG1pc3NlZCBvbiBhIG51bWJlciBvZiBQQU5BUyBpdGVtcyBhdCB2aXNpdCBvbmUuIE9uZSBwZXJzb24gaXMgYWxzbyBtaXNzaW5nIFNST0UgZGF0YSAodGhpcyBpcyBEMTE1LCB3aG8gZXJyb25lb3VzbHkgd2FzIGFkbWluaXN0ZXJlZCB0aGUgcHJlLWZNUkkgc3VydmV5IGFmdGVyIGV4aXRpbmcgdGhlIHNjYW5uZXIuKQoKIyMgQ2hlY2sgc2NhbGUgcmVsaWFiaWxpdGllcwpgYGB7cn0KIyBUaGUgJ2FscGhhJyBmdW5jdGlvbiBpcyBoZWxwZnVsIGJlY2F1c2UgaXQgd2lsbCBhbGVydCB5b3UgaWYgeW91ciByZXZlcnNlIGNvZGluZyB3ZW50IGF3cnkgc29tZWhvdy4gCiMjIE5vdGUgdGhhdCBFbWlseSBCdXRsZXIgc2F5cyBpdCdzIG5vdCBhbHdheXMgY29ycmVjdCAtIGlmIGl0IGZsYWdzIGFuIGlzc3VlcyBhbmQgeW91J3ZlIGRvdWJsZS0gYW5kIHRyaXBsZS1jaGVja2VkIHlvdXIgcmV2ZXJzZSBjb2RpbmcsIGlnbm9yZSBpdC4KCiMgUHJpbWFyaWx5LCB3ZSB1c2UvcmVwb3J0IHRoZSBzdGFuZGFyZCBhbHBoYS4KCmxpYnJhcnkocHN5Y2gpCnBzeWNoOjphbHBoYSh0b3RfcHJlX3BhbmFzX25hKSAjIGJlY2F1c2UgdGlkeXZlcnNlIGlzIGxvYWRlZCwgdGhlIGFscGhhIGZ1bmN0aW9uIGZyb20gZ2dwbG90MiBpcyBtYXNraW5nIHBzeWNoOjphbHBoYSBzbyB3ZSBoYXZlIHRvIHNwZWNpZnkKcHN5Y2g6OmFscGhhKHRvdF9wcmVfcGFuYXNfcGEpCnBzeWNoOjphbHBoYSh0b3RfcHJlX3N0YWkpCnBzeWNoOjphbHBoYSh0b3RfcG9zdF9wYW5hc19uYSkKcHN5Y2g6OmFscGhhKHRvdF9wb3N0X3BhbmFzX3BhKQpwc3ljaDo6YWxwaGEodG90X3Bvc3Rfc3RhaSkKCmBgYAoKCgojT1hUUiBnZW5vdHlwZQpUaGlzIHNlY3Rpb24gb2YgdGhlIHNjcmlwdCBkZWFscyB3aXRoIHRoZSBnZW5vdHlwZSBkYXRhIHRoYXQgd2FzIGNvbGxlY3RlZCB2aWEgYnVjY2FsIGNlbGwgc3dhYiBhdCB0aGUgZW5kIG9mIHBhcnRpY2lwYW50cycgc2Vjb25kIGV4cGVyaW1lbnRhbCBzZXNzaW9uLiAKCipXaGF0IGhhcyBiZWVuIGRvbmUgdXAgdG8gdGhpcyBwb2ludDogKDEpIGNvZGVib29rIGNyZWF0ZWQsICgyKSBkYXRhIHByb3ZpZGVkIGJ5IE1GTyBhcyBFeGNlbCBmaWxlLioKCiMjSW1wb3J0IGRhdGEgClRhc2s6IEltcG9ydCAqb25seSogcm93cyAyOjQyIG9mIHRoZSBmaXJzdCA0IGNvbHVtbnMuPGJyPgoKYGBge3J9CiMgcnVuIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdXNpbmcgZHBseXIgb24geW91ciBsb2NhbCBtYWNoaW5lCmxpYnJhcnkodGlkeXZlcnNlKQpmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdAoKbGlicmFyeShyZWFkeGwpClNOUHMgPC0gcmVhZF9leGNlbCgifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL09Db25ub3JfU05QX3Jlc3VsdHMueGxzeCIsIHNoZWV0ID0gIjAxMjUxOF9PWFRSX1NOUHMiKVtjKDI6NDEpLCBjKDE6NCkgXSAjIHJlbWVtYmVyIHRoYXQgUiB1c2VzIHRoZSBmaXJzdCByb3cgYXMgY29sdW1uIG5hbWVzLCBzbyB3aGF0IHdlIGFyZSBjYWxsaW5nICJyb3cgMiIgaGVyZSBpcyBlcXVpdmFsZW50IHRvIHJvdyAzIGluIHRoZSBleGNlbCBmaWxlClZpZXcoU05QcykKCndyaXRlLmNzdihTTlBzLCBmaWxlID0gIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvb3h0cl9TTlBzLmNzdiIpICMgNDAgb2JzZXJ2YXRpb25zIG9mIDQgdmFyaWFibGVzCiMgU05QcyA8LSByZWFkLmNzdihmaWxlID0gIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvb3h0cl9TTlBzLmNzdiIpICMgNDAgb2JzZXJ2YXRpb25zIG9mIDQgdmFyaWFibGVzCiMgU05QcyRYIDwtIE5VTEwKYGBgCgojI1JlbmFtZSB2YXJpYWJsZXMKYGBge3J9Cm5hbWVzKFNOUHMpCgpTTlBzIDwtIHJlbmFtZShTTlBzLCBJRCA9ICJTYW1wbGUgSUQiLAogICAgICAgICAgICAgICByczIyNTQyOTggPSBPWFRSX3JzMjI1NDI5OCwKICAgICAgICAgICAgICAgcnMyMjY4NDk4ID0gT1hUUl9yczIyNjg0OTgsCiAgICAgICAgICAgICAgIHJzNTM1NzYgPSBPWFRSX3JzNTM1NzYpCm5hbWVzKFNOUHMpCmBgYAoKIyNDcmVhdGUgZmFjdG9ycyBhbmQgbmV3IHZhcmlhYmxlcwoKRm9yIGVhY2ggb2YgdGhlIFNOUHMsIHdlIG5lZWQgdG8gY3JlYXRlIGZhY3RvcnMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGdlbm90eXBlcyAoYmVsb3cpLiBXZSBhbHNvIG5lZWQgdG8gY3JlYXRlIGZhY3RvcnMgdGhhdCBpbmRpY2F0ZSBwcmVzZW5jZSBvZiBtaW5vciBhbGxlbGVzIChBIGFsbGVsZSBmb3IgcnMyMjU0Mjk4IGFuZCByczUzNTc2OyBDIGFsbGVsZSBmb3IgcnMyMjY4NDk4KS4KCnwgcnMyMjU0Mjk4IHwgcnMyMjY4NDk4IHwgcnM1MzU3NiB8Cnw6LTp8Oi06fDotOnwKfEFBfENDfEFBfAp8QUd8VFR8R0d8IAp8QS9HfEMvVHxBL0d8Cgo8bGk+YHJzMjI1NDI5OGAgb25seSBoYXMgdGhyZWUgbGV2ZWxzIChBL0csIEdHLCBVbkQpIGJlY2F1c2Ugbm8gb25lIGhhcyB0aGUgQUEgZ2Vub3R5cGUgKGJ1dCB3ZSdsbCByZXBsYWNlIFVuRCB3aXRoIE5BIGluc3RlYWQpLjwvbGk+CjxsaT5gcnM1MzU3NmAgb25seSBoYXMgdHdvIGxldmVscyAoQS9HLCBHRykgYmVjYXVzZSBubyBvbmUgaGFzIHRoZSBBQSBnZW5vdHlwZS48L2xpPgo8bGk+YE9YVFI1MzU3NmAgYW5kIGBPWFRSMjI1NDI5OGAgYXJlIHRoZSBzYW1lIGFzIGByczUzNTc2YCBhbmQgYHJzMjI1NDI5OGAsIGJ1dCB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBTUFNTIGRhdGFzZXQgd2l0aCBnZW5vdHlwZSBkYXRhIGZyb20gdGhlIEdPQSBzYW1wbGUgaW4gb3JkZXIgdG8gbWFrZSBhbnkgZnV0dXJlIG1lcmdpbmcgZWFzaWVyLjwvbGk+CgpgYGB7cn0KClNOUHNfMSA8LSBTTlBzICU+JSBtdXRhdGUocnMyMjU0Mjk4ID0gcmVjb2RlX2ZhY3RvcihyczIyNTQyOTgsICJHRyIgPSAiR0ciLCAiQS9HIiA9ICJBL0ciLCAiVW5EIiA9IE5BX2NoYXJhY3Rlcl8sIC5vcmRlcmVkID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByczIyNTQyOThfQS5jYXJyaWVyID0gcmVjb2RlX2ZhY3RvcihyczIyNTQyOTgsICJHRyIgPSAwLCAiQS9HIiA9IDEsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJzMjI2ODQ5OF9DLmNhcnJpZXIgPSByZWNvZGVfZmFjdG9yKHJzMjI2ODQ5OCwgIlRUIiA9IDAsICJDL1QiID0gMSwgIkNDIiA9IDEsIC5vcmRlcmVkID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJzNTM1NzZfQS5jYXJyaWVyID0gcmVjb2RlX2ZhY3RvcihyczUzNTc2LCAiR0ciID0gMCwgIkEvRyIgPSAxLCAub3JkZXJlZCA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICBPWFRSMjI1NDI5OCA9IGFzLm51bWVyaWMocmVjb2RlKHJzMjI1NDI5OCwgIkdHIiA9IDAsICJBL0ciID0gMSwgIkFBIiA9IDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgT1hUUjUzNTc2ID0gYXMubnVtZXJpYyhyZWNvZGUocnM1MzU3NiwgIkdHIiA9IDAsICJBL0ciID0gMSwgIkFBIiA9IDIpKSkKc3RyKFNOUHNfMSkKVmlldyhTTlBzXzEpCgojIG1ha2UgSUQgY2hyIHJhdGhlciB0aGFuIGZhY3RvcgpTTlBzXzEkSUQgPC0gYXMuY2hhcmFjdGVyKFNOUHMkSUQpCgpzYXZlUkRTKFNOUHNfMSwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvb3h0cl9TTlBzLnJkcyIpCgpgYGAKCiMjIE1lcmdlIHdpdGggc2VsZi1yZXBvcnRzCmBgYHtyfQpzZWxmcmVwb3J0c19veHRyIDwtIGxlZnRfam9pbihzZWxmcmVwb3J0cywgU05Qc18xLCBieT0iSUQiKQoKIyBzYXZlIGl0CnNhdmVSRFMoc2VsZnJlcG9ydHNfb3h0ciwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0ci5yZHMiKQoKYGBgCgoKI0NvcnRpc29sClRoaXMgc2VjdGlvbiBvZiB0aGUgc2NyaXB0IGRlYWxzIHdpdGggdGhlIGNvcnRpc29sIGRhdGEgdGhhdCB3ZXJlIGNvbGxlY3RlZCB2aWEgc2FsaXZldHRlIDN4IGR1cmluZyBlYWNoIGV4cGVyaW1lbnRhbCBzZXNzaW9uOgp8ICJiYXNlbGluZSIgfCAicHJlIiB8ICJwb3N0IiB8Cnw6LTp8Oi06fDotOnwKfFVwb24gYXJyaXZhbHxKdXN0IGJlZm9yZSBlbnRlcmluZyBNUkl8IEp1c3QgYWZ0ZXIgZXhpdGluZyBNUkl8CgoqV2hhdCBoYXMgYmVlbiBkb25lIHVwIHRvIHRoaXMgcG9pbnQ6ICgxKSBjb2RlYm9vayBjcmVhdGVkLCAoMikgZGF0YSBwcm92aWRlZCBieSBNRk8gYXMgRXhjZWwgZmlsZS4qCgojI0ltcG9ydCBkYXRhIApUYXNrOiBJbXBvcnQgKm9ubHkqIHJvd3MgMjo0MiBvZiB0aGUgZmlyc3QgNCBjb2x1bW5zLjxicj4KCmBgYHtyfQojIHJ1biBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHVzaW5nIGRwbHlyIG9uIHlvdXIgbG9jYWwgbWFjaGluZQpsaWJyYXJ5KHRpZHl2ZXJzZSkKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKCmxpYnJhcnkocmVhZHhsKQpjb3J0aXNvbCA8LSByZWFkX2V4Y2VsKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1QgY29ydGlzb2wgb3V0cHV0IDE4LjEyLjE3Lnhsc3giLCBzaGVldCA9ICJTdHVkeSAxIE9UIiwgc2tpcD02KVtjKDE6MjUxKSwgYygxOjIpIF0gIyByZW1lbWJlciB0aGF0IFIgdXNlcyB0aGUgZmlyc3Qgcm93IGFzIGNvbHVtbiBuYW1lcywgc28gd2hhdCB3ZSBhcmUgY2FsbGluZyAicm93IDIiIGhlcmUgaXMgZXF1aXZhbGVudCB0byByb3cgMyBpbiB0aGUgZXhjZWwgZmlsZQpWaWV3KGNvcnRpc29sKQoKbmFtZXMoY29ydGlzb2wpCmNvcnRpc29sXzAgPC0gcmVuYW1lKGNvcnRpc29sLCBzYW1wbGUgPSAiU2FtcGxlICMiLAogICAgICAgICAgICAgICBjb3J0aXNvbCA9ICJDb3J0aXNvbCBubW9sL2wiKQpuYW1lcyhjb3J0aXNvbF8wKQoKd3JpdGUuY3N2KGNvcnRpc29sXzAsIGZpbGUgPSAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9jb3J0aXNvbF8wLmNzdiIpICMgMjUxIG9ic2VydmF0aW9ucyBvZiAyIHZhcmlhYmxlcwpzYXZlUkRTKGNvcnRpc29sXzAsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2NvcnRpc29sXzAucmRzIikKYGBgCgojI1JlcGxhY2UgdmFsdWVzCgpBY2NvcmRpbmcgdG8gdGhlIGJveCBtYXAuLi4KCmBgYHtyfQoKY29ydGlzb2xfMSA8LSBjb3J0aXNvbF8wICU+JSBtdXRhdGUoSUQgPSBhcy5jaGFyYWN0ZXIocmVjb2RlKHNhbXBsZSwgIjEiID0gIkQxMDFfUE8yIiwgCiAgICAgICAgICAgICAgICAgICAiMiIgPSAiRDEwMV9QUjIiLCAKICAgICAgICAgICAgICAgICAgICIzIiA9ICJEMTAxX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNCIgPSAiRDEwMV9QTzEiLAogICAgICAgICAgICAgICAgICAgIjUiID0gIkQxMDFfUFIxIiwKICAgICAgICAgICAgICAgICAgICI2IiA9ICJEMTAxX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNyIgPSAiRDEwMl9QTzIiLAogICAgICAgICAgICAgICAgICAgIjgiID0gIkQxMDJfUFIyIiwKICAgICAgICAgICAgICAgICAgICI5IiA9ICJEMTAyX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiMTAiID0gIkQxMDJfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMSIgPSAiRDEwMl9QUjEiLAogICAgICAgICAgICAgICAgICAgIjEyIiA9ICJEMTAyX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMTMiID0gIkQxMDNfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNCIgPSAiRDEwM19QUjIiLAogICAgICAgICAgICAgICAgICAgIjE1IiA9ICJEMTAzX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiMTYiID0gIkQxMDNfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNyIgPSAiRDEwM19QUjEiLAogICAgICAgICAgICAgICAgICAgIjE4IiA9ICJEMTAzX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMTkiID0gIkQxMDRfUE8yIiwKICAgICAgICAgICAgICAgICAgICIyMCIgPSAiRDEwNF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjIxIiA9ICJEMTA0X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiMjIiID0gIkQxMDRfUE8xIiwKICAgICAgICAgICAgICAgICAgICIyMyIgPSAiRDEwNF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjI0IiA9ICJEMTA0X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMjUiID0gIkQxMDVfUE8yIiwKICAgICAgICAgICAgICAgICAgICIyNiIgPSAiRDEwNV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjI3IiA9ICJEMTA1X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiMjgiID0gIkQxMDVfUE8xIiwKICAgICAgICAgICAgICAgICAgICIyOSIgPSAiRDEwNV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjMwIiA9ICJEMTA1X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMzEiID0gIkQxMDdfUE8yIiwKICAgICAgICAgICAgICAgICAgICIzMiIgPSAiRDEwN19QUjIiLAogICAgICAgICAgICAgICAgICAgIjMzIiA9ICJEMTA3X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiMzQiID0gIkQxMDdfUE8xIiwKICAgICAgICAgICAgICAgICAgICIzNSIgPSAiRDEwN19QUjEiLAogICAgICAgICAgICAgICAgICAgIjM2IiA9ICJEMTA3X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMzciID0gIkQxMDhfUE8xIiwKICAgICAgICAgICAgICAgICAgICIzOCIgPSAiRDEwOF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjM5IiA9ICJEMTA4X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNDAiID0gIkQxMTBfUE8yIiwKICAgICAgICAgICAgICAgICAgICI0MSIgPSAiRDExMF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjQyIiA9ICJEMTEwX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNDMiID0gIkQxMTBfUE8xIiwKICAgICAgICAgICAgICAgICAgICI0NCIgPSAiRDExMF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjQ1IiA9ICJEMTEwX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNDYiID0gIkQxMTFfUE8xIiwKICAgICAgICAgICAgICAgICAgICI0NyIgPSAiRDExMV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjQ4IiA9ICJEMTExX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNDkiID0gIkQxMTNfUE8yIiwKICAgICAgICAgICAgICAgICAgICI1MCIgPSAiRDExM19QUjIiLAogICAgICAgICAgICAgICAgICAgIjUxIiA9ICJEMTEzX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNTIiID0gIkQxMTNfUE8xIiwKICAgICAgICAgICAgICAgICAgICI1MyIgPSAiRDExM19QUjEiLAogICAgICAgICAgICAgICAgICAgIjU0IiA9ICJEMTEzX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNTUiID0gIkQxMTRfUE8yIiwKICAgICAgICAgICAgICAgICAgICI1NiIgPSAiRDExNF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjU3IiA9ICJEMTE0X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNTgiID0gIkQxMTRfUE8xIiwKICAgICAgICAgICAgICAgICAgICI1OSIgPSAiRDExNF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjYwIiA9ICJEMTE0X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNjEiID0gIkQxMTVfUE8yIiwKICAgICAgICAgICAgICAgICAgICI2MiIgPSAiRDExNV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjYzIiA9ICJEMTE1X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNjQiID0gIkQxMTVfUE8xIiwKICAgICAgICAgICAgICAgICAgICI2NSIgPSAiRDExNV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjY2IiA9ICJEMTE1X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNjciID0gIkQxMTdfUE8zIiwKICAgICAgICAgICAgICAgICAgICI2OCIgPSAiRDExN19QUjMiLAogICAgICAgICAgICAgICAgICAgIjY5IiA9ICJEMTE3X0JMMyIsCiAgICAgICAgICAgICAgICAgICAiNzAiID0gIkQxMTdfUE8yIiwKICAgICAgICAgICAgICAgICAgICI3MSIgPSAiRDExN19QUjIiLAogICAgICAgICAgICAgICAgICAgIjcyIiA9ICJEMTE3X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNzMiID0gIkQxMTdfUE8xIiwKICAgICAgICAgICAgICAgICAgICI3NCIgPSAiRDExN19QUjEiLAogICAgICAgICAgICAgICAgICAgIjc1IiA9ICJEMTE3X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiNzYiID0gIkQxMThfUE8yIiwKICAgICAgICAgICAgICAgICAgICI3NyIgPSAiRDExOF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjc4IiA9ICJEMTE4X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiNzkiID0gIkQxMThfUE8xIiwKICAgICAgICAgICAgICAgICAgICI4MCIgPSAiRDExOF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjgxIiA9ICJEMTE4X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiODIiID0gIkQxMTlfUE8yIiwKICAgICAgICAgICAgICAgICAgICI4MyIgPSAiRDExOV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjg0IiA9ICJEMTE5X0JMMiIsCiAgICAgICAgICAgICAgICAgICAiODUiID0gIkQxMTlfUE8xIiwKICAgICAgICAgICAgICAgICAgICI4NiIgPSAiRDExOV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjg3IiA9ICJEMTE5X0JMMSIsCiAgICAgICAgICAgICAgICAgICAiODgiID0gIkQxMjBfUE8yIiwKICAgICAgICAgICAgICAgICAgICI4OSIgPSAiRDEyMF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjkwIiA9ICJEMTIwX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiOTEiID0gIkQxMjBfUE8xIiwKICAgICAgICAgICAgICAgICAgICI5MiIgPSAiRDEyMF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjkzIiA9ICJEMTIwX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiOTQiID0gIkQxMjFfUE8yIiwKICAgICAgICAgICAgICAgICAgICI5NSIgPSAiRDEyMV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjk2IiA9ICJEMTIxX0JMMiIsCiAgICAgICAgICAgICAgICAgICAiOTciID0gIkQxMjFfUE8xIiwKICAgICAgICAgICAgICAgICAgICI5OCIgPSAiRDEyMV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjk5IiA9ICJEMTIxX0JMMSIsCiAgICAgICAgICAgICAgICAgICAiMTAwIiA9ICJEMTIyX1BPMiIsCiAgICAgICAgICAgICAgICAgICAiMTAxIiA9ICJEMTIyX1BSMiIsIAogICAgICAgICAgICAgICAgICAgIjEwMiIgPSAiRDEyMl9CTDIiLCAKICAgICAgICAgICAgICAgICAgICIxMDMiID0gIkQxMjJfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMDQiID0gIkQxMjJfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMDUiID0gIkQxMjJfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMDYiID0gIkQxMjNfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMDciID0gIkQxMjNfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMDgiID0gIkQxMjNfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMDkiID0gIkQxMjNfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMTAiID0gIkQxMjNfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMTEiID0gIkQxMjNfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMTIiID0gIkQxMjVfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMTMiID0gIkQxMjVfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMTQiID0gIkQxMjVfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMTUiID0gIkQxMjVfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMTYiID0gIkQxMjVfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMTciID0gIkQxMjVfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMTgiID0gIkQxMjZfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMTkiID0gIkQxMjZfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMjAiID0gIkQxMjZfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMjEiID0gIkQxMjZfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMjIiID0gIkQxMjZfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMjMiID0gIkQxMjZfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMjQiID0gIkQxMjdfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMjUiID0gIkQxMjdfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMjYiID0gIkQxMjdfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMjciID0gIkQxMjdfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMjgiID0gIkQxMjdfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMjkiID0gIkQxMjdfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMzAiID0gIkQxMjhfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMzEiID0gIkQxMjhfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMzIiID0gIkQxMjhfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMzMiID0gIkQxMjhfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxMzQiID0gIkQxMjhfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxMzUiID0gIkQxMjhfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxMzYiID0gIkQxMjlfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxMzciID0gIkQxMjlfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxMzgiID0gIkQxMjlfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxMzkiID0gIkQxMjlfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNDAiID0gIkQxMjlfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNDEiID0gIkQxMjlfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNDIiID0gIkQxMzBfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNDMiID0gIkQxMzBfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNDQiID0gIkQxMzBfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNDUiID0gIkQxMzBfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNDYiID0gIkQxMzBfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNDciID0gIkQxMzBfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNDgiID0gIkQxMzFfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNDkiID0gIkQxMzFfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNTAiID0gIkQxMzFfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNTEiID0gIkQxMzFfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNTIiID0gIkQxMzFfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNTMiID0gIkQxMzFfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNTQiID0gIkQxMzJfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNTUiID0gIkQxMzJfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNTYiID0gIkQxMzJfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNTciID0gIkQxMzJfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNTgiID0gIkQxMzJfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNTkiID0gIkQxMzJfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNjAiID0gIkQxMzNfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNjEiID0gIkQxMzNfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNjIiID0gIkQxMzNfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNjMiID0gIkQxMzNfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNjQiID0gIkQxMzNfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNjUiID0gIkQxMzNfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNjYiID0gIkQxMzRfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNjciID0gIkQxMzRfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNjgiID0gIkQxMzRfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNjkiID0gIkQxMzRfUDAxIiwKICAgICAgICAgICAgICAgICAgICIxNzAiID0gIkQxMzRfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNzEiID0gIkQxMzRfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNzIiID0gIkQxMzVfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNzMiID0gIkQxMzVfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxNzQiID0gIkQxMzVfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxNzUiID0gIkQxMzVfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxNzYiID0gIkQxMzVfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxNzciID0gIkQxMzVfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxNzgiID0gIkQxMzdfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxNzkiID0gIkQxMzdfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxODAiID0gIkQxMzdfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxODEiID0gIkQxMzdfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxODIiID0gIkQxMzdfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxODMiID0gIkQxMzdfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxODQiID0gIkQxMzhfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxODUiID0gIkQxMzhfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxODYiID0gIkQxMzhfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxODciID0gIkQxMzhfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxODgiID0gIkQxMzhfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxODkiID0gIkQxMzhfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxOTAiID0gIkQxMzlfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxOTEiID0gIkQxMzlfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxOTIiID0gIkQxMzlfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxOTMiID0gIkQxMzlfUE8xIiwKICAgICAgICAgICAgICAgICAgICIxOTQiID0gIkQxMzlfUFIxIiwKICAgICAgICAgICAgICAgICAgICIxOTUiID0gIkQxMzlfQkwxIiwKICAgICAgICAgICAgICAgICAgICIxOTYiID0gIkQxNDBfUE8yIiwKICAgICAgICAgICAgICAgICAgICIxOTciID0gIkQxNDBfUFIyIiwKICAgICAgICAgICAgICAgICAgICIxOTgiID0gIkQxNDBfQkwyIiwKICAgICAgICAgICAgICAgICAgICIxOTkiID0gIkQxNDBfUE8xIiwKICAgICAgICAgICAgICAgICAgICIyMDAiID0gIkQxNDBfUFIxIiwKICAgICAgICAgICAgICAgICAgICIyMDEiID0gIkQxNDBfQkwxIiwgCiAgICAgICAgICAgICAgICAgICAiMjAyIiA9ICJEMTQxX1AwMiIsIAogICAgICAgICAgICAgICAgICAgIjIwMyIgPSAiRDE0MV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjIwNCIgPSAiRDE0MV9CTDIiLAogICAgICAgICAgICAgICAgICAgIjIwNSIgPSAiRDE0MV9QTzEiLAogICAgICAgICAgICAgICAgICAgIjIwNiIgPSAiRDE0MV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjIwNyIgPSAiRDE0MV9CTDEiLAogICAgICAgICAgICAgICAgICAgIjIwOCIgPSAiRDE0Ml9QTzIiLAogICAgICAgICAgICAgICAgICAgIjIwOSIgPSAiRDE0Ml9QUjIiLAogICAgICAgICAgICAgICAgICAgIjIxMCIgPSAiRDE0Ml9CTDIiLAogICAgICAgICAgICAgICAgICAgIjIxMSIgPSAiRDE0Ml9QTzEiLAogICAgICAgICAgICAgICAgICAgIjIxMiIgPSAiRDE0Ml9QUjEiLAogICAgICAgICAgICAgICAgICAgIjIxMyIgPSAiRDE0Ml9CTDEiLAogICAgICAgICAgICAgICAgICAgIjIxNCIgPSAiRDE0M19QTzEiLAogICAgICAgICAgICAgICAgICAgIjIxNSIgPSAiRDE0M19QUjEiLAogICAgICAgICAgICAgICAgICAgIjIxNiIgPSAiRDE0M19CTDEiLAogICAgICAgICAgICAgICAgICAgIjIxNyIgPSAiRDE0NF9QTzIiLAogICAgICAgICAgICAgICAgICAgIjIxOCIgPSAiRDE0NF9CTDIiLAogICAgICAgICAgICAgICAgICAgIjIxOSIgPSAiRDE0NF9QTzEiLAogICAgICAgICAgICAgICAgICAgIjIyMCIgPSAiRDE0NF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjIyMSIgPSAiRDE0NF9CTDEiLAogICAgICAgICAgICAgICAgICAgIjIyMiIgPSAiRDE0NV9QTzIiLAogICAgICAgICAgICAgICAgICAgIjIyMyIgPSAiRDE0NV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjIyNCIgPSAiRDE0NV9CTDIiLAogICAgICAgICAgICAgICAgICAgIjIyNSIgPSAiRDE0NV9QTzEiLAogICAgICAgICAgICAgICAgICAgIjIyNiIgPSAiRDE0NV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjIyNyIgPSAiRDE0NV9CTDEiLAogICAgICAgICAgICAgICAgICAgIjIyOCIgPSAiRDE0Nl9QTzIiLAogICAgICAgICAgICAgICAgICAgIjIyOSIgPSAiRDE0Nl9QUjIiLAogICAgICAgICAgICAgICAgICAgIjIzMCIgPSAiRDE0Nl9CTDIiLAogICAgICAgICAgICAgICAgICAgIjIzMSIgPSAiRDE0Nl9QTzEiLAogICAgICAgICAgICAgICAgICAgIjIzMiIgPSAiRDE0Nl9QUjEiLAogICAgICAgICAgICAgICAgICAgIjIzMyIgPSAiRDE0Nl9CTDEiLAogICAgICAgICAgICAgICAgICAgIjIzNCIgPSAiRDE0N19QTzIiLAogICAgICAgICAgICAgICAgICAgIjIzNSIgPSAiRDE0N19QUjIiLAogICAgICAgICAgICAgICAgICAgIjIzNiIgPSAiRDE0N19CTDIiLAogICAgICAgICAgICAgICAgICAgIjIzNyIgPSAiRDE0N19QTzEiLAogICAgICAgICAgICAgICAgICAgIjIzOCIgPSAiRDE0N19QUjEiLAogICAgICAgICAgICAgICAgICAgIjIzOSIgPSAiRDE0N19CTDEiLAogICAgICAgICAgICAgICAgICAgIjI0MCIgPSAiRDE0OF9QTzIiLAogICAgICAgICAgICAgICAgICAgIjI0MSIgPSAiRDE0OF9QUjIiLAogICAgICAgICAgICAgICAgICAgIjI0MiIgPSAiRDE0OF9CTDIiLAogICAgICAgICAgICAgICAgICAgIjI0MyIgPSAiRDE0OF9QTzEiLAogICAgICAgICAgICAgICAgICAgIjI0NCIgPSAiRDE0OF9QUjEiLAogICAgICAgICAgICAgICAgICAgIjI0NSIgPSAiRDE0OF9CTDEiLAogICAgICAgICAgICAgICAgICAgIjI0NiIgPSAiRDE0OV9QTzIiLAogICAgICAgICAgICAgICAgICAgIjI0NyIgPSAiRDE0OV9QUjIiLAogICAgICAgICAgICAgICAgICAgIjI0OCIgPSAiRDE0OV9CTDIiLAogICAgICAgICAgICAgICAgICAgIjI0OSIgPSAiRDE0OV9QTzEiLAogICAgICAgICAgICAgICAgICAgIjI1MCIgPSAiRDE0OV9QUjEiLAogICAgICAgICAgICAgICAgICAgIjI1MSIgPSAiRDE0OV9CTDEiKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKVmlldyhjb3J0aXNvbF8xKQoKIyBtYWtlIElEIGNociByYXRoZXIgdGhhbiBmYWN0b3IKY29ydGlzb2xfMSRJRCA8LSBhcy5jaGFyYWN0ZXIoY29ydGlzb2xfMSRJRCkKCnNhdmVSRFMoY29ydGlzb2xfMSwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvY29ydGlzb2xfMS5yZHMiKQoKYGBgCgojIyBSZW9yZ2FuaXplIGRhdGEKCk5vdyB3ZSBuZWVkIHRvIGNyZWF0ZSBzaXggc3Vic2V0cyAoMyBzYW1wbGVzIHggMiB2aXNpdHMpOgpgYGB7cn0KCiMgVXNlIEQxMTcncyBzZWNvbmQgYW5kIHRoaXJkIHZpc2l0cywgYW5kIGRyb3AgMXN0IHZpc2l0IChmTVJJIGRhdGEgbG9zdCk6Cgpjb3J0aXNvbF8yIDwtIGNvcnRpc29sXzEgJT4lIG11dGF0ZShJRCA9IGFzLmNoYXJhY3RlcihyZWNvZGUoSUQsICJEMTE3X0JMMSIgPSBOQV9jaGFyYWN0ZXJfLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQxMTdfUFIxIiA9IE5BX2NoYXJhY3Rlcl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEMTE3X1BPMSIgPSBOQV9jaGFyYWN0ZXJfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDExN19CTDIiID0gIkQxMTdfQkwxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEMTE3X1BSMiIgPSAiRDExN19QUjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDExN19QTzIiID0gIkQxMTdfUE8xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQxMTdfQkwzIiA9ICJEMTE3X0JMMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRDExN19QUjMiID0gIkQxMTdfUFIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQxMTdfUE8zIiA9ICJEMTE3X1BPMiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKQoKIyBiYXNlbGluZSBzYW1wbGUsIGZpcnN0IHZpc2l0OgpCTF92MSA8LSBmaWx0ZXIoY29ydGlzb2xfMlsgLCAyOjNdLCBncmVwbCgiQkwxIixJRCkpICMgZHJvcHBpbmcgJ3NhbXBsZScgY29sdW1uClZpZXcoQkxfdjEpCgojIGJhc2VsaW5lIHNhbXBsZSwgc2Vjb25kIHZpc2l0OgpCTF92MiA8LSBmaWx0ZXIoY29ydGlzb2xfMlsgLCAyOjNdLCBncmVwbCgiQkwyIixJRCkpIApWaWV3KEJMX3YyKQoKIyBwcmUtZk1SSSBzYW1wbGUsIGZpcnN0IHZpc2l0OgpQUl92MSA8LSBmaWx0ZXIoY29ydGlzb2xfMlsgLCAyOjNdLCBncmVwbCgiUFIxIixJRCkpIApWaWV3KFBSX3YxKQoKIyBwcmUtZk1SSSBzYW1wbGUsIHNlY29uZCB2aXNpdDoKUFJfdjIgPC0gZmlsdGVyKGNvcnRpc29sXzJbICwgMjozXSwgZ3JlcGwoIlBSMiIsSUQpKSAKVmlldyhQUl92MikKCiMgcG9zdC1mTVJJIHNhbXBsZSwgZmlyc3QgdmlzaXQ6ClBPX3YxIDwtIGZpbHRlcihjb3J0aXNvbF8yWyAsIDI6M10sIGdyZXBsKCJQTzEiLElEKSkgClZpZXcoUE9fdjEpCgojIHBvc3QtZk1SSSBzYW1wbGUsIHNlY29uZCB2aXNpdDoKUE9fdjIgPC0gZmlsdGVyKGNvcnRpc29sXzJbICwgMjozXSwgZ3JlcGwoIlBPMiIsSUQpKSAKVmlldyhQT192MikKYGBgCgpOb3csIGFkZGluZyBhIHN1ZmZpeCB0byB0aGUgZW5kIG9mICdjb3J0aXNvbCcgKHdpbGwgZ28gaW50byB3aWRlIGZvcm1hdCBkYXRhc2V0KToKYGBge3J9CkJMX3YxIDwtIEJMX3YxICU+JQogIHJlbmFtZV9hdCh2YXJzKGNvcnRpc29sKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX0JMX3YxIikpCgpCTF92MiA8LSBCTF92MiAlPiUKICByZW5hbWVfYXQodmFycyhjb3J0aXNvbCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9CTF92MiIpKQoKUFJfdjEgPC0gUFJfdjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoY29ydGlzb2wpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfUFJfdjEiKSkKClBSX3YyIDwtIFBSX3YyICU+JQogIHJlbmFtZV9hdCh2YXJzKGNvcnRpc29sKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX1BSX3YyIikpCgpQT192MSA8LSBQT192MSAlPiUKICByZW5hbWVfYXQodmFycyhjb3J0aXNvbCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9QT192MSIpKQoKUE9fdjIgPC0gUE9fdjIgJT4lCiAgcmVuYW1lX2F0KHZhcnMoY29ydGlzb2wpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfUE9fdjIiKSkKCgojIFJlbW92ZSAiX1hYbiIgZnJvbSBJRCAgKHdpbGwgZ28gaW50byB3aWRlIGZvcm1hdCBkYXRhc2V0KToKCkJMX3YxIDwtIEJMX3YxICU+JSAKICBtdXRhdGUoSUQgPSBzdHJfcmVwbGFjZShJRCwgIl9CTDEiLCAiIikpCgpCTF92MiA8LSBCTF92MiAlPiUgCiAgbXV0YXRlKElEID0gc3RyX3JlcGxhY2UoSUQsICJfQkwyIiwgIiIpKQoKUFJfdjEgPC0gUFJfdjEgJT4lIAogIG11dGF0ZShJRCA9IHN0cl9yZXBsYWNlKElELCAiX1BSMSIsICIiKSkKClBSX3YyIDwtIFBSX3YyICU+JSAKICBtdXRhdGUoSUQgPSBzdHJfcmVwbGFjZShJRCwgIl9QUjIiLCAiIikpCgpQT192MSA8LSBQT192MSAlPiUgCiAgbXV0YXRlKElEID0gc3RyX3JlcGxhY2UoSUQsICJfUE8xIiwgIiIpKQoKUE9fdjIgPC0gUE9fdjIgJT4lIAogIG11dGF0ZShJRCA9IHN0cl9yZXBsYWNlKElELCAiX1BPMiIsICIiKSkKYGBgCgojI01lcmdlIHdpdGggc2VsZi1yZXBvcnRzIGFuZCBPWFRSIGRhdGEKCmBgYHtyfQpqb2luMSA8LSBsZWZ0X2pvaW4oc2VsZnJlcG9ydHNfb3h0ciwgQkxfdjEsIGJ5PSJJRCIpCmpvaW4yIDwtIGxlZnRfam9pbihqb2luMSwgQkxfdjIsIGJ5PSJJRCIpCmpvaW4zIDwtIGxlZnRfam9pbihqb2luMiwgUFJfdjEsIGJ5PSJJRCIpCmpvaW40IDwtIGxlZnRfam9pbihqb2luMywgUFJfdjIsIGJ5PSJJRCIpCmpvaW41IDwtIGxlZnRfam9pbihqb2luNCwgUE9fdjEsIGJ5PSJJRCIpCmpvaW42IDwtIGxlZnRfam9pbihqb2luNSwgUE9fdjIsIGJ5PSJJRCIpCgoKIyBtYWtpbmcgYSBjb3J0aXNvbCB3aWRlIGRhdGFzZXQ6CmNvcnRpc29sX3dpZGUgPC0gam9pbjZbICwgYygyLDY4NDo2ODkpXQpuYW1lcyhjb3J0aXNvbF93aWRlKQpzYXZlUkRTKGNvcnRpc29sX3dpZGUsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2NvcnRpc29sX3dpZGUucmRzIikKCiMgYWRkaW5nIHRvIHRoZSBvdmVyYWxsIGRhdGFzZXQKc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbCA8LSBqb2luNgpuYW1lcyhzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sKSAjIDQwIG9ic2VydmF0aW9ucyBvZiA2ODkgdmFyaWFibGVzCnNhdmVSRFMoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbCwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbC5yZHMiKQoKYGBgCgojIyBIaXN0b2dyYW1zIGFuZCBib3hwbG90cwpgYGB7cn0KIyBVc2luZyB0aGUgc3Vic2V0IHdlIGNyZWF0ZWQgZm9yIHRoZSB3aWRlIGRhdGFzZXQuLi4KY29ydGlzb2xfcGxvdHMgPC0gY29ydGlzb2xfd2lkZVssIGdyZXAoJ15jJywgbmFtZXMoY29ydGlzb2xfd2lkZSkpXQoKIyBQbG90IHRoZSB2YXJpYWJsZXM6CmZvcihpIGluIDE6bGVuZ3RoKGNvcnRpc29sX3Bsb3RzKSkgYm94cGxvdChjb3J0aXNvbF9wbG90c1ssaV0sIHhsYWI9TlVMTCwgbWFpbj1uYW1lcyhjb3J0aXNvbF9wbG90c1tpXSkpCmZvcihpIGluIDE6bGVuZ3RoKGNvcnRpc29sX3Bsb3RzKSkgaGlzdChjb3J0aXNvbF9wbG90c1ssaV0sIHhsYWI9TlVMTCwgbWFpbj1uYW1lcyhjb3J0aXNvbF9wbG90c1tpXSkpCmBgYAoKCiMjIERlc2NyaXB0aXZlcwpgYGB7cn0KIyBWaWV3IGRlc2NyaXB0aXZlcyBmb3IgZWFjaCBzY2FsZQojIyBzdGFyZ2F6ZXIgbWFrZXMgbmljZS1sb29raW5nIHN1bW1hcnkgdGFibGVzIChodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc3RhcmdhemVyL3ZpZ25ldHRlcy9zdGFyZ2F6ZXIucGRmKQoKbGlicmFyeShzdGFyZ2F6ZXIpICMgaW5zdGFsbC5wYWNrYWdlcygic3RhcmdhemVyIikgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB1c2luZyB0aGUgcGFja2FnZSBvbiB0aGlzIG1hY2hpbmUKc3RhcmdhemVyKGNvcnRpc29sX3Bsb3RzLCB0eXBlPSJ0ZXh0IikKYGBgCgoKIyNNaXNzaW5nIGRhdGEKYGBge3J9CmNvcnRpc29sX3dpZGUgJT4lIAogIHNlbGVjdF9pZihmdW5jdGlvbih4KSBhbnkoaXMubmEoeCkpKSAlPiUgCiAgc3VtbWFyaXNlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImMiKSksZnVucyhzdW0oaXMubmEoLikpKSkgLT4gY29ydGlzb2xfTkEKCmdhdGhlcihjb3J0aXNvbF9OQSkgLT4gY29ydGlzb2xfTkFfbG9uZyAjIGNyZWF0ZSBsb25nIGRhdGEgdGhhdCBsaXN0cyB2YXJpYWJsZXMgd2l0aCBhbnkgTkFzLCBhbmQgJSBvZiBkYXRhIG1pc3NpbmcKY29ydGlzb2xfTkFfbG9uZwpgYGAKQXQgdGhlIGZpcnN0IHZpc2l0LCB3ZSBhcmUgbWlzc2luZyBjb3J0aXNvbCBkYXRhIGZyb20gbj0xOCAoNDUlKSBhdCBiYXNlbGluZSwgbj0xMyAoMzMlKSBhdCBwcmUtZk1SSSwgbj0xMSAoMjglKSBhdCBwb3N0LWZNUkkuCkF0IHRoZSBzZWNvbmQgdmlzaXQsIHdlIGFyZSBtaXNzaW5nIGNvcnRpc29sIGRhdGEgZnJvbSBuPTEzICgzMyUpIGF0IGJhc2VsaW5lLCBuPTExICgyOCUpIGF0IHByZS1mTVJJLCBuPTExICgyOCUpIGF0IHBvc3QtZk1SSS4KCgojI1QtdGVzdHM6IGNvbXBhcmluZyB2aXNpdHMKYGBge3J9CnQudGVzdChjb3J0aXNvbF93aWRlJGNvcnRpc29sX0JMX3YxLCBjb3J0aXNvbF93aWRlJGNvcnRpc29sX0JMX3YyLAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UpICMgbnMKCnQudGVzdChjb3J0aXNvbF93aWRlJGNvcnRpc29sX1BSX3YxLCBjb3J0aXNvbF93aWRlJGNvcnRpc29sX1BSX3YyLAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UpICMgbnMKCnQudGVzdChjb3J0aXNvbF93aWRlJGNvcnRpc29sX1BPX3YxLCBjb3J0aXNvbF93aWRlJGNvcnRpc29sX1BPX3YyLAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UpICMgbnMKYGBgCk5vIHNpZ25pZmljYW50IGVmZmVjdCBvZiB2aXNpdCBhdCBhbnkgb2YgdGhlIHRocmVlIHRpbWVwb2ludHMuCgojUmFuZG9taXphdGlvbgpUaGlzIHNlY3Rpb24gb2YgdGhlIHNjcmlwdCBkZWFscyB3aXRoIGhvdyBwYXJ0aWNpcGFudHMgd2VyZSByYW5kb21pemVkICgxKSB0byByZWNlaXZlIFRyZWF0bWVudCBBIChPVC9QTCkgb3IgVHJlYXRtZW50IEIgKE9UL1BMKSBhdCB0aGVpciBmaXJzdCB2aXNpdCwgYW5kICgyKSB3aGV0aGVyIHRoZXkgd2VyZSByYW5kb21pemVkIHRvIHJlY2VpdmUgQUFUIHRhc2sgaW5zdHJ1Y3Rpb25zIHRvICJwdXNoIGJsdWUiIG9yICJwdXNoIHllbGxvdyIgYXQgdGhlaXIgZmlyc3QgdmlzaXQuCgojI0ltcG9ydCwgY2xlYW4sIGFuZCBtZXJnZSBkYXRhCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCnJhbmRvbSA8LSByZWFkX2V4Y2VsKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1RfUmFuZG9taXphdGlvbl9GSU5BTC54bHN4Iiwgc2hlZXQgPSAiRDEwMS1EMTQ5Iiwgc2tpcD0xKVssIGMoMTo1KSBdClZpZXcocmFuZG9tKQoKIyB0YWtlIG91dCBEMTE3IHNpbmNlIHdlIG5lZWQgdG8gdXNlIGhlciAybmQgYW5kIDNyZCB2aXNpdHMuLi4KcmFuZG9tIDwtIGZpbHRlcihyYW5kb20sICFncmVwbCgiRDExNyIsSUQpKQpyYW5kb21fRDExNyA8LSByZWFkX2V4Y2VsKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L09UX1JhbmRvbWl6YXRpb25fRklOQUwueGxzeCIsIHNoZWV0ID0gIkQxMDEtRDE0OSIsIHNraXA9MSlbMTcsIGMoMSw0OjcpIF0gCgojIGp1c3QgZ2V0IGhlciB2aXNpdCAyIGFuZCAzIGRhdGEgYW5kIGNsZWFuIGl0IHVwCm5hbWVzKHJhbmRvbV9EMTE3KQpyYW5kb21fRDExNyAlPiUgcmVuYW1lKCJ0eF92MSIgPSBWaWFsX18xLCAiQUFUcHVzaDFfdjEiID0gUHVzaF9fMSwgInR4X3YyIiA9IFhfXzEsICJBQVRwdXNoMV92MiIgPSBYX18yKSAlPiUgCiAgbXV0YXRlKHR4X3YxID0gcmVjb2RlKHR4X3YxLCAiQSIgPSAiQSIsICJCIiA9ICJCIiksIHR4X3YyID0gcmVjb2RlKHR4X3YyLCAiQSIgPSAiQSIsICJCIiA9ICJCIiksIEFBVHB1c2gxX3YxID0gcmVjb2RlKEFBVHB1c2gxX3YxLCAiUHVzaCBibHVlIiA9ICJCTFVFIiwgIlB1c2ggeWVsbG93IiA9ICJZRUxMT1ciKSwgQUFUcHVzaDFfdjIgPSByZWNvZGUoQUFUcHVzaDFfdjIsICJQdXNoIGJsdWUiID0gIkJMVUUiLCAiUHVzaCB5ZWxsb3ciID0gIllFTExPVyIpKSAtPiByYW5kb21fRDExNwpWaWV3KHJhbmRvbV9EMTE3KSAgICAKCiMgZG8gdGhlIHNhbWUgZm9yIHRoZSByZXN0IG9mIHRoZSBzYW1wbGUKcmFuZG9tICU+JSByZW5hbWUoInR4X3YxIiA9IFZpYWwsICJBQVRwdXNoMV92MSIgPSBQdXNoLCAidHhfdjIiID0gVmlhbF9fMSwgIkFBVHB1c2gxX3YyIiA9IFB1c2hfXzEpICU+JSAKICBtdXRhdGUodHhfdjEgPSByZWNvZGUodHhfdjEsICJBIiA9ICJBIiwgIkIiID0gIkIiKSwgdHhfdjIgPSByZWNvZGUodHhfdjIsICJBIiA9ICJBIiwgIkIiID0gIkIiKSwgQUFUcHVzaDFfdjEgPSByZWNvZGUoQUFUcHVzaDFfdjEsICJQdXNoIGJsdWUiID0gIkJMVUUiLCAiUHVzaCB5ZWxsb3ciID0gIllFTExPVyIsICJZRUxMT1ciID0gIllFTExPVyIsICJCTFVFIiA9ICJCTFVFIiksIEFBVHB1c2gxX3YyID0gcmVjb2RlKEFBVHB1c2gxX3YyLCAiUHVzaCBibHVlIiA9ICJCTFVFIiwgIlB1c2ggeWVsbG93IiA9ICJZRUxMT1ciLCAiWUVMTE9XIiA9ICJZRUxMT1ciLCAiQkxVRSIgPSAiQkxVRSIpKSAtPiByYW5kb20KVmlldyhyYW5kb20pICAgIAoKIyBtZXJnZQpyYW5kb20gPC0gYmluZF9yb3dzKHJhbmRvbSwgcmFuZG9tX0QxMTcpCnJhbmRvbSR0eF92MSA8LSBhcy5mYWN0b3IocmFuZG9tJHR4X3YxKQpyYW5kb20kdHhfdjIgPC0gYXMuZmFjdG9yKHJhbmRvbSR0eF92MikKcmFuZG9tJEFBVHB1c2gxX3YxIDwtIGFzLmZhY3RvcihyYW5kb20kQUFUcHVzaDFfdjEpCnJhbmRvbSRBQVRwdXNoMV92MiA8LSBhcy5mYWN0b3IocmFuZG9tJEFBVHB1c2gxX3YyKQoKc2F2ZVJEUyhyYW5kb20sICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3JhbmRvbWl6YXRpb24ucmRzIikKCiMgbWVyZ2UgCnNlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tIDwtIGxlZnRfam9pbihzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sLCByYW5kb20sIEJZPSJJRCIpClZpZXcoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb20pICMgNDAgb2JzIG9mIDY4OCB2YXJzCgpzYXZlUkRTKHNlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9zZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbS5yZHMiKQp3cml0ZS5jc3Yoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb20sICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tLmNzdiIpCgojIHRvIHByaW50IHZhcmlhYmxlIG5hbWVzIG9uZSBwZXIgcm93OgpjYXQobmFtZXMoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb20pLHNlcD0iXG4iKQoKYGBgCgojRWZmZWN0IG9mIHRyZWF0bWVudCAoT1QvUEwpCmBgYHtyfQpzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbSA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tLnJkcyIpCgojIFBhcnRpY2lwYW50cyB3aG8gZ290IHRyZWF0bWVudCBBIGF0IHZpc2l0IDE6CnNlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tICU+JSAKICBzZWxlY3QoSUQsIHRvdF9wcmVfcGFuYXNfcGFfdjEsCnRvdF9wcmVfcGFuYXNfbmFfdjEsCnRvdF9wcmVfc3RhaV92MSwKdG90X3ByZV9wYW5hc19wYV92MiwKdG90X3ByZV9wYW5hc19uYV92MiwKdG90X3ByZV9zdGFpX3YyLAp0b3RfcG9zdF9wYW5hc19wYV92MSwKdG90X3Bvc3RfcGFuYXNfbmFfdjEsCnRvdF9wb3N0X3N0YWlfdjEsCnRvdF9wb3N0X3BhbmFzX3BhX3YyLAp0b3RfcG9zdF9wYW5hc19uYV92MiwKdG90X3Bvc3Rfc3RhaV92MiwKcG9zdF9zcm9lXzFfdjEsCnBvc3Rfc3JvZV8yX3YxLApwb3N0X3Nyb2VfM192MSwKcG9zdF9zcm9lXzFfdjIsCnBvc3Rfc3JvZV8yX3YyLApwb3N0X3Nyb2VfM192MiwKY29ydGlzb2xfQkxfdjEsCmNvcnRpc29sX0JMX3YyLApjb3J0aXNvbF9QUl92MSwKY29ydGlzb2xfUFJfdjIsCmNvcnRpc29sX1BPX3YxLApjb3J0aXNvbF9QT192MiwKdHhfdjEpICU+JSBmaWx0ZXIodHhfdjEgPT0gIkEiKSAgLT4gdjFfdHhfQQpWaWV3KHYxX3R4X0EpICMgMjEgb2JzIG9mIDI2IHZhcnMKCiMgdGhlbiBzcGxpdCB1cCBieSBfdjEvX3YyOgp2MV90eF9BIDwtIHYxX3R4X0FbLCBncmVwKCdJRHxfdjEnLCBuYW1lcyh2MV90eF9BKSldICMgMjEgb2JzIG9mIDE0IHZhcnMKCiMgdGhlbiBzdHJpcCBvdXQgdGhlICJfdjEiIGZyb20gY29sdW1uIG5hbWVzCnYxX3R4X0EgJT4lCiAgIHJlbmFtZV9hbGwoLmZ1bnMgPSBmdW5zKHN1YigiXFxfdjEiLCAiIiwgbmFtZXModjFfdHhfQSkpKSkgLT4gdjFfdHhfQSAKaGVhZCh2MV90eF9BKQoKIyBQYXJ0aWNpcGFudHMgd2hvIGdvdCB0cmVhdG1lbnQgQSBhdCB2aXNpdCAyOgpzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbSAlPiUgCiAgc2VsZWN0KElELCB0b3RfcHJlX3BhbmFzX3BhX3YxLAp0b3RfcHJlX3BhbmFzX25hX3YxLAp0b3RfcHJlX3N0YWlfdjEsCnRvdF9wcmVfcGFuYXNfcGFfdjIsCnRvdF9wcmVfcGFuYXNfbmFfdjIsCnRvdF9wcmVfc3RhaV92MiwKdG90X3Bvc3RfcGFuYXNfcGFfdjEsCnRvdF9wb3N0X3BhbmFzX25hX3YxLAp0b3RfcG9zdF9zdGFpX3YxLAp0b3RfcG9zdF9wYW5hc19wYV92MiwKdG90X3Bvc3RfcGFuYXNfbmFfdjIsCnRvdF9wb3N0X3N0YWlfdjIsCnBvc3Rfc3JvZV8xX3YxLApwb3N0X3Nyb2VfMl92MSwKcG9zdF9zcm9lXzNfdjEsCnBvc3Rfc3JvZV8xX3YyLApwb3N0X3Nyb2VfMl92MiwKcG9zdF9zcm9lXzNfdjIsCmNvcnRpc29sX0JMX3YxLApjb3J0aXNvbF9CTF92MiwKY29ydGlzb2xfUFJfdjEsCmNvcnRpc29sX1BSX3YyLApjb3J0aXNvbF9QT192MSwKY29ydGlzb2xfUE9fdjIsCnR4X3YyKSAlPiUgZmlsdGVyKHR4X3YyID09ICJBIikgIC0+IHYyX3R4X0EKVmlldyh2Ml90eF9BKSAjIDIxIG9icyBvZiAyNiB2YXJzCgojIHRoZW4gc3BsaXQgdXAgYnkgX3YxL192Mgp2Ml90eF9BIDwtIHYyX3R4X0FbLCBncmVwKCdJRHxfdjInLCBuYW1lcyh2Ml90eF9BKSldICMgMTkgb2JzIG9mIDE0IHZhcnMKCiMgdGhlbiBzdHJpcCBvdXQgdGhlICJfdjIiIGZyb20gY29sdW1uIG5hbWVzCnYyX3R4X0EgJT4lCiAgIHJlbmFtZV9hbGwoLmZ1bnMgPSBmdW5zKHN1YigiXFxfdjIiLCAiIiwgbmFtZXModjJfdHhfQSkpKSkgLT4gdjJfdHhfQSAKaGVhZCh2Ml90eF9BKQoKIyBtZXJnZSBib3RoIEEnczoKQSA8LSBiaW5kX3Jvd3ModjFfdHhfQSwgdjJfdHhfQSkKVmlldyhBKQoKCiMgUGFydGljaXBhbnRzIHdobyBnb3QgdHJlYXRtZW50IEIgYXQgdmlzaXQgMToKc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb20gJT4lIAogIHNlbGVjdChJRCwgdG90X3ByZV9wYW5hc19wYV92MSwKdG90X3ByZV9wYW5hc19uYV92MSwKdG90X3ByZV9zdGFpX3YxLAp0b3RfcHJlX3BhbmFzX3BhX3YyLAp0b3RfcHJlX3BhbmFzX25hX3YyLAp0b3RfcHJlX3N0YWlfdjIsCnRvdF9wb3N0X3BhbmFzX3BhX3YxLAp0b3RfcG9zdF9wYW5hc19uYV92MSwKdG90X3Bvc3Rfc3RhaV92MSwKdG90X3Bvc3RfcGFuYXNfcGFfdjIsCnRvdF9wb3N0X3BhbmFzX25hX3YyLAp0b3RfcG9zdF9zdGFpX3YyLApwb3N0X3Nyb2VfMV92MSwKcG9zdF9zcm9lXzJfdjEsCnBvc3Rfc3JvZV8zX3YxLApwb3N0X3Nyb2VfMV92MiwKcG9zdF9zcm9lXzJfdjIsCnBvc3Rfc3JvZV8zX3YyLApjb3J0aXNvbF9CTF92MSwKY29ydGlzb2xfQkxfdjIsCmNvcnRpc29sX1BSX3YxLApjb3J0aXNvbF9QUl92MiwKY29ydGlzb2xfUE9fdjEsCmNvcnRpc29sX1BPX3YyLAp0eF92MSkgJT4lIGZpbHRlcih0eF92MSA9PSAiQiIpICAtPiB2MV90eF9CClZpZXcodjFfdHhfQikgIyAyMSBvYnMgb2YgMjYgdmFycwoKIyB0aGVuIHNwbGl0IHVwIGJ5IF92MS9fdjI6CnYxX3R4X0IgPC0gdjFfdHhfQlssIGdyZXAoJ0lEfF92MScsIG5hbWVzKHYxX3R4X0IpKV0gIyAyMSBvYnMgb2YgMTQgdmFycwoKIyB0aGVuIHN0cmlwIG91dCB0aGUgIl92MSIgZnJvbSBjb2x1bW4gbmFtZXMKdjFfdHhfQiAlPiUKICAgcmVuYW1lX2FsbCguZnVucyA9IGZ1bnMoc3ViKCJcXF92MSIsICIiLCBuYW1lcyh2MV90eF9CKSkpKSAtPiB2MV90eF9CIApoZWFkKHYxX3R4X0IpCgojIFBhcnRpY2lwYW50cyB3aG8gZ290IHRyZWF0bWVudCBCIGF0IHZpc2l0IDI6CnNlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tICU+JSAKICBzZWxlY3QoSUQsIHRvdF9wcmVfcGFuYXNfcGFfdjEsCnRvdF9wcmVfcGFuYXNfbmFfdjEsCnRvdF9wcmVfc3RhaV92MSwKdG90X3ByZV9wYW5hc19wYV92MiwKdG90X3ByZV9wYW5hc19uYV92MiwKdG90X3ByZV9zdGFpX3YyLAp0b3RfcG9zdF9wYW5hc19wYV92MSwKdG90X3Bvc3RfcGFuYXNfbmFfdjEsCnRvdF9wb3N0X3N0YWlfdjEsCnRvdF9wb3N0X3BhbmFzX3BhX3YyLAp0b3RfcG9zdF9wYW5hc19uYV92MiwKdG90X3Bvc3Rfc3RhaV92MiwKcG9zdF9zcm9lXzFfdjEsCnBvc3Rfc3JvZV8yX3YxLApwb3N0X3Nyb2VfM192MSwKcG9zdF9zcm9lXzFfdjIsCnBvc3Rfc3JvZV8yX3YyLApwb3N0X3Nyb2VfM192MiwKY29ydGlzb2xfQkxfdjEsCmNvcnRpc29sX0JMX3YyLApjb3J0aXNvbF9QUl92MSwKY29ydGlzb2xfUFJfdjIsCmNvcnRpc29sX1BPX3YxLApjb3J0aXNvbF9QT192MiwKdHhfdjIpICU+JSBmaWx0ZXIodHhfdjIgPT0gIkIiKSAgLT4gdjJfdHhfQgpWaWV3KHYyX3R4X0IpICMgMjEgb2JzIG9mIDI2IHZhcnMKCiMgdGhlbiBzcGxpdCB1cCBieSBfdjEvX3YyCnYyX3R4X0IgPC0gdjJfdHhfQlssIGdyZXAoJ0lEfF92MicsIG5hbWVzKHYyX3R4X0IpKV0gIyAxOSBvYnMgb2YgMTQgdmFycwoKIyB0aGVuIHN0cmlwIG91dCB0aGUgIl92MiIgZnJvbSBjb2x1bW4gbmFtZXMKdjJfdHhfQiAlPiUKICAgcmVuYW1lX2FsbCguZnVucyA9IGZ1bnMoc3ViKCJcXF92MiIsICIiLCBuYW1lcyh2Ml90eF9CKSkpKSAtPiB2Ml90eF9CIApoZWFkKHYyX3R4X0IpCgojIG1lcmdlIGJvdGggQidzOgpCIDwtIGJpbmRfcm93cyh2MV90eF9CLCB2Ml90eF9CKQpWaWV3KEIpCgoKIyMgcmVuYW1lOgpBICU+JQogIHJlbmFtZV9hdCh2YXJzKC1JRCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9BIikpIC0+IEEKaGVhZChBKQoKQiAlPiUKICByZW5hbWVfYXQodmFycygtSUQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfQiIpKSAtPiBCCmhlYWQoQikKCiMgbWVyZ2U6CkFCIDwtIGxlZnRfam9pbihBLCBCLCBCWT0iSUQiKSAjIDQwIG9icyBvZiAyNyB2YXJpYWJsZXMKCnNlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCIDwtIGxlZnRfam9pbihzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbSwgQUIsIEJZPSJJRCIpICMgNDAgb2JzIG9mIDcxOSB2YXJpYWJsZXMKc2F2ZVJEUyhzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbV9BQiwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUIucmRzIikKCmBgYAoKIyMgSGlzdG9ncmFtcyBhbmQgYm94cGxvdHMKYGBge3J9CgojIENyZWF0ZSBhIHN1YnNldCBvZiBvbmx5IG51bWVyaWMgdmFyaWFibGVzIChpLmUuLCBub3QgSUQgYW5kIHF1YWxpdGF0aXZlIFNST0UgaXRlbXMpIGFuZCBvcmRlciB0aGVtIGFscGhhYmV0aWNhbGx5IHNvIHRoZXkncmUgZWFzaWVyIHRvIGNvbXBhcmUKc2VsZWN0X2lmKEFCLCBpcy5udW1lcmljKSAlPiUgc2VsZWN0KG9yZGVyKGNvbG5hbWVzKC4pKSkgLT4gQUJfdml6CgojIFBsb3QgdGhlIHZhcmlhYmxlczoKZm9yKGkgaW4gMTpsZW5ndGgoQUJfdml6KSkgYm94cGxvdChBQl92aXpbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoQUJfdml6W2ldKSkKZm9yKGkgaW4gMTpsZW5ndGgoQUJfdml6KSkgaGlzdChBQl92aXpbLGldLCB4bGFiPU5VTEwsIG1haW49bmFtZXMoQUJfdml6W2ldKSkKCmBgYAojIyBEZXNjcmlwdGl2ZXMKYGBge3J9CnN0YXJnYXplcihBQl92aXosIHR5cGU9InRleHQiKQpgYGAKCiMjIFQtdGVzdHMKIyMjIENvcnRpc29sCmBgYHtyfQojIGJhc2VsaW5lCnQudGVzdChBQl92aXokY29ydGlzb2xfQkxfQSwgQUJfdml6JGNvcnRpc29sX0JMX0IsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgCgojIHByZSAKdC50ZXN0KEFCX3ZpeiRjb3J0aXNvbF9QUl9BLCBBQl92aXokY29ydGlzb2xfUFJfQiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAKCiMgcG9zdAp0LnRlc3QoQUJfdml6JGNvcnRpc29sX1BPX0EsIEFCX3ZpeiRjb3J0aXNvbF9QT19CLAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UpIApgYGAKQ29ydGlzb2wgdW5kZXIgdHggQSBpcyBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBjb3J0aXNvbCB1bmRlciB0eCBCLCBhdCBhbnkgdGltZXBvaW50LgoKIyMjIFNlbGYtcmVwb3J0cwpgYGB7cn0KCnQudGVzdChBQl92aXokcG9zdF9zcm9lXzNfQSwgQUJfdml6JHBvc3Rfc3JvZV8zX0IsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgCgp0LnRlc3QoQUJfdml6JHRvdF9wcmVfcGFuYXNfbmFfQSwgQUJfdml6JHRvdF9wcmVfcGFuYXNfbmFfQiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAKCnQudGVzdChBQl92aXokdG90X3Bvc3RfcGFuYXNfbmFfQSwgQUJfdml6JHRvdF9wb3N0X3BhbmFzX25hX0IsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgCgp0LnRlc3QoQUJfdml6JHRvdF9wcmVfcGFuYXNfcGFfQSwgQUJfdml6JHRvdF9wcmVfcGFuYXNfcGFfQiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAKCnQudGVzdChBQl92aXokdG90X3Bvc3RfcGFuYXNfcGFfQSwgQUJfdml6JHRvdF9wb3N0X3BhbmFzX3BhX0IsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgCgp0LnRlc3QoQUJfdml6JHRvdF9wcmVfc3RhaV9BLCBBQl92aXokdG90X3ByZV9zdGFpX0IsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSkgCgp0LnRlc3QoQUJfdml6JHRvdF9wb3N0X3N0YWlfQSwgQUJfdml6JHRvdF9wb3N0X3N0YWlfQiwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFKSAKCmBgYApOb25lIG9mIHRoZSBzZWxmLXJlcG9ydCBzY29yZXMgc2lnbmlmaWNhbnRseSBkaWZmZXIgdW5kZXIgdHggQSB2cy4gdHggQiwgZXhjZXB0IGZvciB0aGUgcHJlLWZNUkkgU1RBSSwgYXMgc2hvd24gYmVsb3c6CgpgYGB7ciBlY2hvPSJmYWxzZSJ9CnByZV9zdGFpIDwtIHNlbGVjdChBQl92aXosIHRvdF9wcmVfc3RhaV9BLCB0b3RfcHJlX3N0YWlfQikKc3RhcmdhemVyKHByZV9zdGFpLCB0eXBlPSJ0ZXh0IikKYGBgCgojIFJldmlldyBlbnRpcmUgZGF0YXNldCB1c2luZyBzdW1tYXJ5dG9vbHMKYGBge3J9CgojaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKbGlicmFyeShzdW1tYXJ5dG9vbHMpCmxpYnJhcnkodGlkeXZlcnNlKQoKIyB0aGlzIHdpbGwgcHJpbnQgdG8gY29uc29sZQpkZlN1bW1hcnkoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUIpIAoKIyB0aGlzIHdpbGwgY3JlYXRlIGEgTVVDSCBuaWNlciBsb29raW5nIGRpc3BsYXkgaW4geW91ciBwbG90cyB2aWV3ZXIKdmlldyhkZlN1bW1hcnkoc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUIpKSAKCiNwcmludCB2YXJpYWJsZSBuYW1lcyBvbmUgcGVyIHJvdywgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOgpuYW1lcyA8LSBuYW1lcyhzZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbV9BQikKY2F0KHNvcnQobmFtZXMpLCBzZXA9IlxuIikKYGBgCgojIDIwLW1vbnRoIGZvbGxvdyB1cApQYXJ0aWNpcGFudHMgd2VyZSBhc2tlZCB0byByZXBlYXQgdGhlIElDRyAyMC0yNCBtb250aHMgYWZ0ZXIgdGhlaXIgcGFydGljaXBhdGlvbiBpbiB0aGUgc3R1ZHksIGVpdGhlciB2aWEgbWFpbCBvciBvbmxpbmUuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyCnNlbGVjdCA8LSBkcGx5cjo6c2VsZWN0CgojIEltcG9ydCBDU1YgZnJvbSBRdWFsdHJpY3MKZnUgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9yYXctZGF0YS9PVCtmTVJJK0ludmVudG9yeStvZitDb21wbGljYXRlZCtHcmllZistKzIwLW1vLitGb2xsb3crVXBfSmFudWFyeSsxNiUyQysyMDE5XzEzLjQ1LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwgbmEuc3RyaW5ncz0iIilbICwtYygyOjE3KV0gJT4lCiAgZmlsdGVyKGdyZXBsKCJeRDEiLCBDb25zZW50LCBpZ25vcmUuY2FzZSA9IFRSVUUpKSAjIHJlbW92ZSByb3dzIHRoYXQgYXJlbid0IElEcyAKCiMgTk9URTogRDExNCBvbmx5IGNvbXBsZXRlZCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgSUNHIChpdGVtcyAxLTEwKS4gSGVyIGRhdGUgb2YgY29tcGxldGlvbiB3YXMgaW5wdXQgYXMgMiB3ZWVrcyBwb3N0LXNlbnQgZGF0ZS4KCiMgUmVuYW1lIHZhcmlhYmxlcwpmdSA8LSByZW5hbWUoZnUsIGRhdGVfZm9sbG93dXAgPSBTdGFydERhdGUsCklEID0gQ29uc2VudCwKZnVfaWNnXzEgPSBJQ0cuUjEuMTlfMSwKZnVfaWNnXzIgPSBJQ0cuUjEuMTlfMiwKZnVfaWNnXzMgPSBJQ0cuUjEuMTlfMywKZnVfaWNnXzQgPSBJQ0cuUjEuMTlfNCwKZnVfaWNnXzUgPSBJQ0cuUjEuMTlfNSwKZnVfaWNnXzYgPSBJQ0cuUjEuMTlfNiwKZnVfaWNnXzcgPSBJQ0cuUjEuMTlfNywKZnVfaWNnXzggPSBJQ0cuUjEuMTlfOCwKZnVfaWNnXzkgPSBJQ0cuUjEuMTlfOSwKZnVfaWNnXzEwID0gSUNHLlIxLjE5XzEwLApmdV9pY2dfMTEgPSBJQ0cuUjEuMTlfMTEsCmZ1X2ljZ18xMiA9IElDRy5SMS4xOV8xMiwKZnVfaWNnXzEzID0gSUNHLlIxLjE5XzEzLApmdV9pY2dfMTQgPSBJQ0cuUjEuMTlfMTQsCmZ1X2ljZ18xNSA9IElDRy5SMS4xOV8xNSwKZnVfaWNnXzE2ID0gSUNHLlIxLjE5XzE2LApmdV9pY2dfMTcgPSBJQ0cuUjEuMTlfMTcsCmZ1X2ljZ18xOCA9IElDRy5SMS4xOV8xOCwKZnVfaWNnXzE5ID0gSUNHLlIxLjE5XzE5KQoKIyBNYWtlIGFsbCBvZiB0aGUgSUNHIHZhcmlhYmxlcyBudW1lcmljIGFuZCBtYWtlIGRhdGVfZm9sbG93dXAgaW50byBQT1NJWGN0IChkYXRlIGZvcm1hdCk6CmZ1IDwtIGZ1ICU+JSBtdXRhdGVfYXQodmFycygtYyhJRCxkYXRlX2ZvbGxvd3VwKSksIGZ1bnMoYXMubnVtZXJpYykpICU+JSBtdXRhdGUoZGF0ZV9mb2xsb3d1cCA9IHltZF9obShkYXRlX2ZvbGxvd3VwKSkKCmZ1IDwtIGZ1ICU+JSBmaWx0ZXIoIWdyZXBsKCIyMDE4LTAxLTA4IDE1OjMyIiwgZGF0ZV9mb2xsb3d1cCkpICMgcmVtb3ZlIEQxMjUncyByZXNwb25zZSBmcm9tIDEtMDgtMjAxOCAoc2hlIGhhcyBhIGR1cGxpY2F0ZSkKCiMgU2NvcmluZwoKIAojIyMgSW52ZW50b3J5IG9mIENvbXBsaWNhdGVkIEdyaWVmCiAgCiMgQ2l0YXRpb246IFByaWdlcnNvbiwgSC4gRy4sIE1hY2llamV3c2tpLCBQLiBLLiwgUmV5bm9sZHMsIEMuIEYuLCBCaWVyaGFscywgQS4gSi4sIE5ld3NvbSwgSi4gVC4sIEZhc2ljemthLCBBLiwgLi4uICYgTWlsbGVyLCBNLiAoMTk5NSkuIEludmVudG9yeSBvZiBDb21wbGljYXRlZCBHcmllZjogYSBzY2FsZSB0byBtZWFzdXJlIG1hbGFkYXB0aXZlIHN5bXB0b21zIG9mIGxvc3MuIFBzeWNoaWF0cnkgUmVzZWFyY2gsIDU5KDEpLCA2NS03OS4KCiMgQW5zd2VyIGNob2ljZXMgcmFuZ2UgZnJvbSAwIChOZXZlcikg4oCTIDQgKEFsd2F5cykuIAojIE5PIHJldmVyc2Ugc2NvcmVkIGl0ZW1zLiAKIyBTdW0gYWxsIGl0ZW1zIChwb3NzaWJsZSByYW5nZTogMCDigJMgNzY7IGNsaW5pY2FsIGN1dC1vZmYgPSAyNSkuIFt0b3RfaWNnXQoKdG90X2ljZ18yMG1GVSA8LSBzdWJzZXQoZnUsIHNlbGVjdD1jKGZ1X2ljZ18xOmZ1X2ljZ18xOSkpCmZ1JHRvdF9pY2dfMjBtRlUgPC0gcm93U3Vtcyh0b3RfaWNnXzIwbUZVLCBuYS5ybT1UUlVFKQogIApkZXNjcmliZShmdSR0b3RfaWNnXzIwbUZVKQpxcW5vcm0oZnUkdG90X2ljZ18yMG1GVSkKCiMgTWVyZ2UgdGhlc2UgdmFyaWFibGVzIGludG8gdGhlIG1hc3RlcgpkYXRhIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUIucmRzIikKZGF0YSA8LSBsZWZ0X2pvaW4oZGF0YSxmdSwgYnk9IklEIikgIyBtZXJnZSBieSBJRApzYXZlUkRTKGRhdGEsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCXzIwbWZ1LnJkcyIpCgojIEhvdyBjb3JyZWxhdGVkIGFyZSB0aGUgSUNHIG1lYXN1cmVtZW50cz8KY29yci50ZXN0KGRhdGEkdG90X2ljZywgZGF0YSR0b3RfaWNnXzIwbUZVKQpwbG90KGRhdGEkdG90X2ljZywgZGF0YSR0b3RfaWNnXzIwbUZVKQp0LnRlc3QoZGF0YSR0b3RfaWNnLCBkYXRhJHRvdF9pY2dfMjBtRlUsIHBhaXJlZD1UUlVFKQoKIyBEZXNjcmlwdGl2ZSBzdGF0cyBhbmQgZGlzdHJpYnV0aW9ucyAob25seSBwYXJ0aWNpcGFudHMgd2l0aCBGVSBkYXRhKQp0dGVzdCA8LSBkYXRhICU+JSBmaWx0ZXIodG90X2ljZ18yMG1GVSAhPSAiTkEiKQpkZXNjcmliZSh0dGVzdCR0b3RfaWNnKQpkZXNjcmliZSh0dGVzdCR0b3RfaWNnXzIwbUZVKQpib3hwbG90KHR0ZXN0JHRvdF9pY2csdHRlc3QkdG90X2ljZ18yMG1GVSkKCiMgQ3JlYXRlIGEgY2hhbmdlIHZhcmlhYmxlCiMjIHF1ZXN0aW9uIGZvciBkb3duIHRoZSBsaW5lOiBpZiB3ZSB1c2UgdGhlIGNoYW5nZSBzY29yZSwgZG8gd2Ugd2FudCB0byB1c2UgZGlmZmVyZW5jZSBzY29yZXMgb3Igc3RhbmRhcmRpemVkIHJlc2lkdWFscz8KZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUoY2hhbmdlX2ljZyA9IHRvdF9pY2dfMjBtRlUgLSB0b3RfaWNnKQpkZXNjcmliZShkYXRhJGNoYW5nZV9pY2cpCmhpc3QoZGF0YSRjaGFuZ2VfaWNnKQpib3hwbG90KGRhdGEkY2hhbmdlX2ljZykKcXFub3JtKGRhdGEkY2hhbmdlX2ljZykKCiMgVHJhbnNmb3JtIGRhdGEgdG8gbG9uZyBmb3JtYXQsIGZvciB2aXN1YWxpemluZyBjaGFuZ2Ugb3ZlciB0aW1lCmljZyA8LSBzdWJzZXQoZGF0YSwgc2VsZWN0PWMoSUQsIHRvdF9pY2cpKSAlPiUgbXV0YXRlKHRpbWUgPSByZXAoIjEiKSkKaWNnX2Z1IDwtIHN1YnNldChkYXRhLCBzZWxlY3Q9YyhJRCwgdG90X2ljZ18yMG1GVSkpICU+JSByZW5hbWUodG90X2ljZyA9IHRvdF9pY2dfMjBtRlUpICU+JSBtdXRhdGUodGltZSA9IHJlcCgiMiIpKQpjaGFuZ2UgPC0gYmluZF9yb3dzKGljZywgaWNnX2Z1KSAlPiUgbXV0YXRlKElEPWFzLmZhY3RvcihJRCkpCgojIFBsb3QgdHJhamVjdG9yaWVzCnAgPC0gZ2dwbG90KGRhdGEgPSBjaGFuZ2UsIGFlcyh4ID0gdGltZSwgeSA9IHRvdF9pY2csIGdyb3VwID0gSUQsIGNvbG91cj1mYWN0b3IoSUQpKSkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MjUpCnAgIyBJIGNhbiBsYWJlbCB0aGVzZSB3aXRoIHBhcnRpY2lwYW50IElEcyBidXQgZGlkbid0IGZvciBub3cgc28gdGhhdCBJIGRvbid0IHNlZSB3aG8ncyBpbiB3aGljaCBncm91cAoKIyBJcyB0aW1lIHNpbmNlIHRoZSBkZWF0aCBhc3NvY2lhdGVkIHdpdGggSUNHIGF0IGVpdGhlciB0aW1lcG9pbnQsIG9yIGNoYW5nZSBpbiBJQ0c/CmNvcnIudGVzdChkYXRhJHRpbWVzaW5jZWRlYXRoLCBkYXRhJHRvdF9pY2cpCnBsb3QoZGF0YSR0aW1lc2luY2VkZWF0aCwgZGF0YSR0b3RfaWNnKQoKY29yci50ZXN0KGRhdGEkdGltZXNpbmNlZGVhdGgsIGRhdGEkdG90X2ljZ18yMG1GVSkKcGxvdChkYXRhJHRpbWVzaW5jZWRlYXRoLCBkYXRhJHRvdF9pY2dfMjBtRlUpCgpjb3JyLnRlc3QoZGF0YSR0aW1lc2luY2VkZWF0aCwgZGF0YSRjaGFuZ2VfaWNnKQpwbG90KGRhdGEkdGltZXNpbmNlZGVhdGgsIGRhdGEkY2hhbmdlX2ljZykKCiMjIyBDQU4nVCBURVNUIFRIRSBGT0xMT1dJTkcgVElMIFlPVSBDUkVBVEUgeXJzX3RvZ2V0aGVyIFZBUklBQkxFIElOIFRIRSBORVhUIENIVU5LCiMgSG93IGFib3V0IHllYXJzIHRvZ2V0aGVyPwpjb3JyLnRlc3QoZGF0YSR5cnNfdG9nZXRoZXIsIGRhdGEkdG90X2ljZykKcGxvdChkYXRhJHlyc190b2dldGhlciwgZGF0YSR0b3RfaWNnKQoKY29yci50ZXN0KGRhdGEkeXJzX3RvZ2V0aGVyLCBkYXRhJHRvdF9pY2dfMjBtRlUpCnBsb3QoZGF0YSR5cnNfdG9nZXRoZXIsIGRhdGEkdG90X2ljZ18yMG1GVSkKCmNvcnIudGVzdChkYXRhJHlyc190b2dldGhlciwgZGF0YSRjaGFuZ2VfaWNnKQpwbG90KGRhdGEkeXJzX3RvZ2V0aGVyLCBkYXRhJGNoYW5nZV9pY2cpCmBgYAoKCiMjIEFkZGVkIHZhcmlhYmxlcwpBZGRpbmcgdmFyaWFibGVzIGZvciBncm91cCAoQ0cgdnMuIE5DRyksIGxlbmd0aCBvZiByZWxhdGlvbnNoaXAsIHRpbWUgZnJvbSBzdHVkeSB0byBmb2xsb3ctdXAsIC4uLgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCgojIFJFTEFUSU9OU0hJUCBMRU5HVEgKZGF0YSA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCXzIwbWZ1LnJkcyIpCnJlbCA8LSByZWFkLmNzdigifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL3JlbGF0aW9uc2hpcC1sZW5ndGgtZnJvbS1zY3JlZW4uY3N2IikKCmRhdGEgPC0gbGVmdF9qb2luKGRhdGEscmVsLCBieT0iSUQiKSAjIG1lcmdlIGJ5IElECgpkYXRhICU+JSBzZWxlY3QoSUQsIHlyc190b2dldGhlcikgIyBkb3VibGUtY2hlY2sgdGhlc2UgYXJlIGNvcnJlY3QKCiMgVElNRSBGUk9NIFNUVURZIFRPIEZPTExPVy1VUAojIEZpcnN0LCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGRhdGUgdGhleSBjb21wbGV0ZWQgdGhlIGZvbGxvdy11cCBzdXJ2ZXksIG5vdCB0aGUgdGltZQojIHNvIHdlJ2xsIHNwbGl0ICdkYXRlX2ZvbGxvd3VwJyBpbnRvIHR3byB2YXJpYWJsZXMsIHRoZW4gcmVtb3ZlIHRoZSAndGltZScgdmFyaWFsYmxlLgpkYXRhIDwtIHRpZHlyOjpzZXBhcmF0ZShkYXRhLCBkYXRlX2ZvbGxvd3VwLCBjKCJkYXRlX2ZvbGxvd3VwIiwgInRpbWUiKSwgc2VwID0gIiAiKQpkYXRhJHRpbWUgPC0gTlVMTAoKY2xhc3MoZGF0YSRkYXRlX2ZvbGxvd3VwKQoKIyAnZGF0ZV9mb2xsb3d1cCcgbmVlZCB0byBiZSBjb252ZXJ0ZWQgZnJvbSBjaGFyYWN0ZXIgdG8gZGF0ZSB1c2luZyBsdWJyaWRhdGUncyB5bWQgZnVuY3Rpb24gKHltZCB0byBtYXRjaCAnc3RhcnRfZGF0ZScgW3doZW4gdGhleSB3ZXJlIGVucm9sbGVkXSkKIyBVc2UgdGhlIG1keSBmdW5jdGlvbiBmcm9tIGx1YnJpZGF0ZSB0byBjb252ZXJ0ICdkb2InIGFuZCAnZGF0ZW9mZGVhdGgnIGZyb20gY2hhcmFjdGVyIHRvIGRhdGUuCmRhdGEgPC0gZGF0YSAlPiUgCiBtdXRhdGUoZGF0ZV9mb2xsb3d1cCA9IHltZChkYXRlX2ZvbGxvd3VwKSkKCiMgTm93IHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRpbWUgYmV0d2VlbiBzdHVkeSBhbmQgZm9sbG93LXVwCmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRpbWV0bzIwbUZVID0gZGF0ZV9mb2xsb3d1cCAtIHN0YXJ0ZGF0ZSkgJT4lIG11dGF0ZV9hdCh2YXJzKHRpbWV0bzIwbUZVKSwgZnVucyhhcy5udW1lcmljKSkgJT4lIG11dGF0ZSh0aW1ldG8yMG1GVV9tb3MgPSB0aW1ldG8yMG1GVS8zMC40MTcpCiMgaGF2ZSB0byBjb252ZXJ0IHRoZSBuZXcgdGltZXNpbmNlZGVhdGggdmFyaWFibGUgdG8gbnVtZXJpYyAodnMuIGRpZmZ0aW1lKSBvYmplY3QsIGJlY2F1c2UgdGhlcmUgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIG9wZXJhdGUgb24gZGlmZnRpbWUgb2JqZWN0cywgdGhlbiBjcmVhdGVkIGEgdmFyaWFibGUgZm9yIHRpbWUgZnJvbSBzdHVkeSB0byBGVSBpbiBtb250aHMgKGluc3RlYWQgb2YgZGF5cykKZGVzY3JpYmUoZGF0YSR0aW1ldG8yMG1GVV9tb3MpCmNvcnIudGVzdChkYXRhJHRvdF9pY2dfMjBtRlUsIGRhdGEkdGltZXRvMjBtRlVfbW9zKQpwbG90KGRhdGEkdG90X2ljZ18yMG1GVSwgZGF0YSR0aW1ldG8yMG1GVV9tb3MpICMgdGltZSBiZXR3ZWVuIHN0dWR5IHBhcnRpY2lwYXRpb24gYW5kIGZvbGxvdy11cCBpcyB3ZWFrbHkgbmVnYXRpdmVseSBjb3JyZWxhdGVkIHdpdGggSUNHIHNjb3JlIGF0IGZvbGxvdy11cCwgciA9IC0uMzIsIHAgPSAuMDcuIEhvd2V2ZXIsIG5vdGUgdGhlIHBvdGVudGlhbCBvdXRsaWVyIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjYXR0ZXJwbG90LgoKIyBDRyB2cy4gTkNHIEdST1VQCmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKGdyb3VwID0gYXMuZmFjdG9yKGlmZWxzZSh0b3RfaWNnID4gMjUsICJDRyIsICJOQ0ciKSkpICMgYXQgc3R1ZHkKZGF0YSRncm91cCA8LSByZWxldmVsKGRhdGEkZ3JvdXAsIHJlZj0iTkNHIikgIyBtYWtlIE5DRyB0aGUgcmVmZXJlbmNlIGdyb3VwCgpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZShncm91cF8yMG1GVSA9IGFzLmZhY3RvcihpZmVsc2UodG90X2ljZ18yMG1GVSA+IDI1LCAiQ0ciLCAiTkNHIikpKSAjIGF0IGZvbGxvdy11cApkYXRhJGdyb3VwXzIwbUZVIDwtIHJlbGV2ZWwoZGF0YSRncm91cF8yMG1GVSwgcmVmPSJOQ0ciKSAjIG1ha2UgTkNHIHRoZSByZWZlcmVuY2UgZ3JvdXAKCiMgSG93IG1hbnkgaW4gZWFjaCBncm91cD8KZGF0YSAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBjb3VudCgpICMgbiA9IDIzIE5DRywgbiA9IDE3IENHCmRhdGEgJT4lIGdyb3VwX2J5KGdyb3VwLGdyb3VwXzIwbUZVKSAlPiUgY291bnQoKSAjIG4gPSAyOCBOQ0csIG4gPSA1IENHLCA3IG1pc3NpbmcgKDIgTkNHLCA1IENHKQoKc2F2ZVJEUyhkYXRhLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9zZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbV9BQl8yMG1mdV9hZGR2YXJzLnJkcyIpCgpgYGAKCiMgUmVzdGluZyBzdGF0ZSB0aW1pbmcKCmBgYHtyfQojIFJlc3Rpbmcgc3RhdGUgdGltaW5nIGRlc2NyaXB0aXZlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwc3ljaCkKbGlicmFyeShjYXIpCgpkYXRhIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUJfMjBtZnVfYWRkdmFycy5yZHMiKQoKcnMgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvTVJJIHByb3RvY29scy9SZXN0aW5nIFN0YXRlIFRpbWluZyBmb3IgUi5jc3YiKQpycyA8LSBzdWJzZXQocnMsIHNlbGVjdCA9IGMoSUQsIFZpc2l0LCBWaWFsLCBNaW5zKSkKCnJzJHR4IDwtIGZhY3RvcihycyRWaWFsLCBsZXZlbHM9YygiQSIsIkIiKSwgbGFiZWxzPWMoIkEiLCJCIikpCnJzJHZpc2l0IDwtIGZhY3RvcihycyRWaXNpdCwgbGV2ZWxzPWMoMSwyKSwgbGFiZWxzPWMoInYxIiwidjIiKSkKCnJzX3YxQSA8LSBycyAlPiUgZmlsdGVyKFZpYWwgPT0gIkEiICYgVmlzaXQgPT0gMSkgJT4lIG11dGF0ZSh0eF92MSA9ICJBIikKcnNfdjFCIDwtIHJzICU+JSBmaWx0ZXIoVmlhbCA9PSAiQiIgJiBWaXNpdCA9PSAxKSAlPiUgbXV0YXRlKHR4X3YxID0gIkIiKQpyc192MkEgPC0gcnMgJT4lIGZpbHRlcihWaWFsID09ICJBIiAmIFZpc2l0ID09IDIpICU+JSBtdXRhdGUodHhfdjIgPSAiQSIpCnJzX3YyQiA8LSBycyAlPiUgZmlsdGVyKFZpYWwgPT0gIkIiICYgVmlzaXQgPT0gMikgJT4lIG11dGF0ZSh0eF92MiA9ICJCIikKCnJzQSA8LSBiaW5kX3Jvd3MocnNfdjFBLHJzX3YyQSkgJT4lIHJlbmFtZSgidGltZXRvcmVzdF9BIiA9IE1pbnMpCnJzQiA8LSBiaW5kX3Jvd3MocnNfdjFCLHJzX3YyQikgJT4lIHJlbmFtZSgidGltZXRvcmVzdF9CIiA9IE1pbnMpCnJlc3QgPC0gbGVmdF9qb2luKHJzQSwgcnNCLCBieT0iSUQiKSAlPiUgc2VsZWN0KElELHRpbWV0b3Jlc3RfQSwgdGltZXRvcmVzdF9CKQoKZGF0YSA8LSBsZWZ0X2pvaW4oZGF0YSwgcmVzdCwgYnk9IklEIikKCgpkZXNjcmliZShyZXN0JHRpbWV0b3Jlc3RfQSkKZGVzY3JpYmUocmVzdCR0aW1ldG9yZXN0X0IpIAp0LnRlc3QocmVzdCR0aW1ldG9yZXN0X0EsIHJlc3QkdGltZXRvcmVzdF9CKSAjIEEgYW5kIEIgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50CgojIGRvIHNvbWUgc3BvdC1jaGVja2luZyBhZ2FpbnN0IHRoZSAncnMnIGl0ZW0gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIElEcywgdHJlYXRtZW50LCBhbmQgdGltZXMgbWF0Y2ggdXAgbGlrZSB0aGV5IHNob3VsZApzdWJzZXQoZGF0YSwgc2VsZWN0ID0gYyhJRCwgdHhfQSwgdGltZXRvcmVzdF9BKSkKCnNhdmVSRFMoZGF0YSwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUJfMjBtZnVfYWRkdmFyc19yZXN0LnJkcyIpCmBgYAoKIyBCZWhhdmlvcmFsIGRhdGEKCiMjIERhdGEgY2xlYW5pbmcKPGI+UHJlLVIgc3RlcHM8L2I+OgoKMS4gUmVtb3ZlZCBhbGwgLmlxZGF0IGZpbGVzIHVuZGVyIDI1S0Igb3Igc28gaW4gb3JkZXIgdG8gZmlsdGVyIG91dCBwaWxvdCBkYXRhIGFuZCBmYWxzZSBzdGFydHMuPGJyPgoyLiBSZW1vdmVkIG5vbi1zdHVkeSBkYXRhIChpLmUuLCB0ZXN0cyBhbmQgT1QgdW5kZXJncmFkIGZpbGVzKS4gPGJyPgozLiBPcmdhbml6ZWQgcmF3IC5pcWRhdCBmaWxlcyBmb3IgZWFjaCB2aXNpdCBieSBydW4gMS9ydW4gMiAodHdvIHNlcGFyYXRlIGZvbGRlcnMpIGJhc2VkIG9uIGRhdGUvdGltZSBzdGFtcC4gPHA+CjxpPkluIFRlcm1pbmFsLCB3aXRoaW4gZWFjaCBvZiB0aGUgZm9sZGVycyBpbiB0dXJuLi4uPC9pPjxwPgo0LiBDaGFuZ2VkIGZpbGUgZXh0ZW5zaW9ucyB0byAudHN2ICh0YWItc2VwYXJhdGVkKSBmcm9tIC5pcWRhdDogYGZpbmQgLiAtaW5hbWUgIiouaXFkYXQiIC1leGVjIGJhc2ggLWMgJ212ICIkMCIgIiR7MCVcLmlxZGF0fS50c3YiJyB7fSBcO2A8YnI+CjUuIE1lcmdlZCB0aGUgZmlsZXM6IGBjYXQgKi50c3YgPiBPVF9nQUFUX3J1bi0xLnRzdmAgKG9yIGBPVF9nQUFUX3J1bi0yLnRzdmApCjxzdHJpa2U+NS4gTWVyZ2VkIHRoZSBmaWxlczogYG1sciAtLXRzdmxpdGUgY2F0ICoudHN2ID4gT1RfZ0FBVF9ydW4tMS50c3ZgIChvciBgT1RfZ0FBVF9ydW4tMi50c3ZgKQo8dWw+NWEuIGBtbHIgLS10c3ZsaXRlYCBkcm9wcyB0aGUgaGVhZGVyIGZyb20gYWxsIGJ1dCB0aGUgZmlyc3QgZmlsZSwgc28gY29sdW1uIG5hbWVzIGFyZSBub3QgcmVwZWF0ZWQgdGhyb3VnaG91dCB0aGUgZGF0YXNldC48L3VsPgo8dWw+NWIuIFRoaXMgcmVxdWlyZXMgTWlsbGVyLCB3aGljaCBjYW4gYmUgaW5zdGFsbGVkIHZpYSBIb21lYnJldyBvbiBPU1ggKGh0dHA6Ly9qb2hua2VybC5vcmcvbWlsbGVyL2RvYy9idWlsZC5odG1sKTwvc3RyaWtlPiA8aT50cmllZCB0byBtYWtlIHRoaXMgd29yayBidXQgbm8gbHVjazwvaT48L3VsPgoKPGk+Tm90ZXM6PGJyPgo8dWw+PGxpPkQxMTc6IEhhZCAzIHZpc2l0cyBkdWUgdG8gc2Nhbm5lciB0ZWNobmljYWwgaXNzdWVzLiBVc2UgIl9iIiBhbmQgIl9jIiBhcyB2aXNpdCAxIGFuZCB2aXNpdCAyIHJlc3BlY3RpdmVseS48L2xpPgo8bGk+RDExNDogSGFzIG11bHRpcGxlIGZpbGVzIGZyb20gdmlzaXQgMi4gVXNlIHRoZSBsYXN0IHR3by48L2xpPgo8bGk+RDEzNTogVXNlIGZpbGVzIGZyb20gNi8wNi8xNiBhbmQgNi8xNy8xOCAoc2Nhbm5lciBpc3N1ZXMgb24gMDYvMTMvMTYpLiBVc2UgIl9iIiBhbmQgIl9jIiBhcyB2aXNpdCAxIGFuZCB2aXNpdCAyIHJlc3BlY3RpdmVseS48L2xpPgo8bGk+RDE0NzogVmlzaXQgMSBydW4gMiBpcyBwYXJ0aWFsIGRhdGEgZm9yIHNvbWUgcmVhc29uIChJIGRvIGhhdmUgbm90ZXMgdGhhdCBzaGUgc3dpdGNoZWQgYmFjayB0byA8aT5QVVNILVlFTExPVzwvaT4gZHVyaW5nIHJ1biAyLCBidXQgZGlkIG5vdCByZS1ydW4gYmVjYXVzZSBydW5uaW5nIHdheSBvdmVyIHRpbWUuKTwvbGk+PC91bD48L2k+CgpgYGB7cn0KIyBCZWhhdmlvcmFsIGRhdGEgKGdBQVQpCmxpYnJhcnkodGlkeXZlcnNlKQpmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdAoKIyByZWFkIGluIHRoZSBkYXRhIChvbmx5IGltcG9ydGluZyBhIHN1YnNldCBvZiBjb2x1bW5zKQpyYXdfcjEgPC0gZGF0YS5mcmFtZShyZWFkX3Rzdigifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL3Jhdy1kYXRhL09ULWdBQVQtYmVoYXZpb3JhbC1kYXRhL1J1bjFfdHN2L09UX2dBQVRfcnVuLTEudHN2IiwgY29sX3R5cGVzPWNvbHNfb25seSgKICBkYXRlID0gY29sX2ludGVnZXIoKSwKICB0aW1lID0gY29sX2NoYXJhY3RlcigpLAogIHN1YmplY3QgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIGJsb2NrbnVtID0gY29sX2NoYXJhY3RlcigpLAogIHRyaWFsY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMudHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5zdGltdWx1cyA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMuaW5pdGlhbHJlc3BvbnNlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5SVCA9IGNvbF9udW1iZXIoKQopKSkKCnJhd19yMiA8LSBkYXRhLmZyYW1lKHJlYWRfdHN2KCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvcmF3LWRhdGEvT1QtZ0FBVC1iZWhhdmlvcmFsLWRhdGEvUnVuMl90c3YvT1RfZ0FBVF9ydW4tMi50c3YiLCBjb2xfdHlwZXM9Y29sc19vbmx5KAogIGRhdGUgPSBjb2xfaW50ZWdlcigpLAogIHRpbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgc3ViamVjdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBibG9ja2NvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tudW0gPSBjb2xfY2hhcmFjdGVyKCksCiAgdHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy50cmlhbGNvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLnN0aW11bHVzID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5pbml0aWFscmVzcG9uc2UgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLlJUID0gY29sX251bWJlcigpCikpKQoKIyBoZWFkZXIgbGluZSByZXBlYXRzIHdoZW4gSSB1c2VkIGNhdCB0byBtZXJnZSwgc28gZ2V0IHRob3NlIG91dCBvZiB0aGVyZQpyYXdfcjEgPC0gcmF3X3IxICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQpyYXdfcjIgPC0gcmF3X3IyICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQoKdW5pcXVlKHJhd19yMSRzdWJqZWN0KQojIEQxMTggaXMgc2hvd2luZyB1cCBhcyAidGVzdCIgZm9yIHNvbWUgcmVhc29uIChjaGVja2VkIGFnYWluc3QgdGhlIC5pcWRhdCBmaWxlKSwgYW5kIEQxMzBfYiBpcyBtaXNzaW5nCiMgYm90aCBvZiBEMTMwJ3MgYW5kIEQxNDIncyB2aXNpdHMgd2VyZSBlbnRlcmVkIGFzICJEMTMwIi8iRDE0MiIsIHNvIGNoYW5nZSB0aGUgc3ViamVjdCBJRCBmb3IgdGhlIHZpc2l0IG9uIDA1MjQxNiB0byBEMTMwX2IgYW5kIG9uIApyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwMjA5MTZdIDwtICJEMTE4IgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwNTI0MTZdIDwtICJEMTMwX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCiMgZml4aW5nIHNvbWUgb3RoZXIgc3R1ZmYgaW4gYSBzaW1pbGFyIHZlaW4KcmF3X3IxJHN1YmplY3RbcmF3X3IxJHN1YmplY3QgPT0gIkQxMDFfMiJdIDwtICJEMTAxX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDEzNV9jIl0gPC0gIkQxMzVfYiIKCnUgPC0gdW5pcXVlKHJhd19yMSRzdWJqZWN0KQpsZW5ndGgodSkgIyA3OCB1bmlxdWUgLSB0aGF0IGlzIGNvcnJlY3QKCnVuaXF1ZShyYXdfcjIkc3ViamVjdCkKIyBzb21lIHNpbWlsYXIgaXNzdWVzIHRvIGZpeApyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwMV8yWSJdIDwtICJEMTAxX2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwN19CXzIiXSA8LSAiRDEwN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEyNl9CIl0gPC0gIkQxMjZfYiIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJHN1YmplY3QgPT0gIkQxMzVfYyJdIDwtICJEMTM1X2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCnUgPC0gdW5pcXVlKHJhd19yMiRzdWJqZWN0KSAKbGVuZ3RoKHUpICMgNzggdW5pcXVlIC0gdGhhdCBpcyBjb3JyZWN0CgpzdHIocmF3X3IxKQpzdHIocmF3X3IyKQpgYGAKCmBgYHtyfQojIHRha2Ugb3V0IElUSXMgKGludGVyLXRyaWFsIGludGVydmFscykKdW5pcXVlKHJhd19yMSR0cmlhbGNvZGUpCnIxIDwtIGZpbHRlcihyYXdfcjEsIGdyZXBsKCJeQSIsdHJpYWxjb2RlKSkKdW5pcXVlKHIxJHRyaWFsY29kZSkKCnVuaXF1ZShyYXdfcjIkdHJpYWxjb2RlKQpyMiA8LSBmaWx0ZXIocmF3X3IyLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShyMiR0cmlhbGNvZGUpCgojIGFkZCBhICJ0cmlhbG51bSIgdmFyaWFibGUsIGdyb3VwZWQgYnkgSUQKcjEgPC0gcjEgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBtdXRhdGUodHJpYWxudW0gPSByb3dfbnVtYmVyKCkpClZpZXcocjIpCnIyIDwtIHIyICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgbXV0YXRlKHRyaWFsbnVtID0gcm93X251bWJlcigpKQpWaWV3KHIyKQoKcjEgJT4lIGdyb3VwX2J5KHRyaWFsbnVtKSAlPiUgY291bnQodHJpYWxudW0pICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIGhvb3JheSEgKGxvb2sgYXQgbiBmb3IgZWFjaCB0cmlhbG51bSwgc2hvdWxkID0gNzgpCnIyICU+JSBncm91cF9ieSh0cmlhbG51bSkgJT4lIGNvdW50KHRyaWFsbnVtKSAjIGV2ZXJ5b25lIGhhcyAxNDQgdHJpYWxzLCBvbmUgcGVyc29uIGhhcyAxNzcKcjIgJT4lIGZpbHRlcih0cmlhbG51bSA+MTQ0KQpgYGAKCkkgZG8gcmVjYWxsIG9uZSBzY2FuIHNlc3Npb24gd2hlcmUgSW5xdWlzaXQgaGFkIHNvbWUga2luZCBvZiBoaWNjdXAgYW5kIHRoZSB0YXNrIGtlcHQgZ29pbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZNUkkgc2VxdWVuY2Ugc28gd2UgaGFkIHRvIGZvcmNlLXF1aXQgaXQuIEQxMjIgaGFzIGNvbXBsZXRlIGRhdGEgZnJvbSB0aGUgZmlyc3QgMTQ0IHRyaWFscywgc28gd2UgY2FuIGp1c3QgZHJvcCB0aGUgZXh0cmEgb25lcy4KYGBge3J9CnIyIDwtIGZpbHRlcihyMiwgdHJpYWxudW0gPD0xNDQpICMgcmVtb3ZlIHRyaWFscyAxNDUtMTc3IGZvciBEMTIyX2IKcjIgJT4lIGZpbHRlcih0cmlhbG51bSA+MTQ0KQojIG5vdyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwoKIyBhZGQgYSBjb2x1bW4gZm9yICJydW4iCnIxJHJ1biA8LSAiMSIKcjIkcnVuIDwtICIyIgoKIyBhZGQgYSBjb2x1bW4gZm9yICJ2aXNpdCIKcjEkdmlzaXQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9iIiwgcjEkc3ViamVjdCksICIyIiwgIjEiKSkKcjIkdmlzaXQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9iIiwgcjIkc3ViamVjdCksICIyIiwgIjEiKSkKCnIxICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgY291bnQodmlzaXQpICMgYWxsIGxvb2tzIGdvb2QKcjIgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBjb3VudCh2aXNpdCkgIyBhbGwgbG9va3MgZ29vZAoKIyBub3cgcmVtb3ZlIHRoZSAiX2IiIGZyb20gdmlzaXQgMiBJRHMKcjEgPC0gcjEgJT4lIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoc3ViamVjdCA9IHN0cl9yZXBsYWNlKHN1YmplY3QsICJfYiIsICIiKSkKdW5pcXVlKHIxJHN1YmplY3QpCgpyMiA8LSByMiAlPiUgdW5ncm91cCgpICU+JQogIG11dGF0ZShzdWJqZWN0ID0gc3RyX3JlcGxhY2Uoc3ViamVjdCwgIl9iIiwgIiIpKQp1bmlxdWUocjIkc3ViamVjdCkKCiMgbWVyZ2UgZGF0YSBmcm9tIHRoZSAyIHJ1bnMgCmJ4IDwtIGJpbmRfcm93cyhyMSwgcjIpCgojIHNwbGl0IHVwIGJ5IHZpc2l0CnYxIDwtIGJ4ICU+JSBmaWx0ZXIodmlzaXQgPT0gIjEiKQp2MiA8LSBieCAlPiUgZmlsdGVyKHZpc2l0ID09ICIyIikKCiMgY2hlY2sgdGhhdCBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwp2MSAlPiUgZmlsdGVyKHRyaWFsbnVtID4xNDQpICMgc2hvdWxkIHJldHVybiBhIHRhYmxlIHdpdGggMCByb3dzCnYyICU+JSBmaWx0ZXIodHJpYWxudW0gPjE0NCkgIyBzaG91bGQgcmV0dXJuIGEgdGFibGUgd2l0aCAwIHJvd3MKYGBgCgpgYGB7cn0KIyBhZGQgY29sdW1ucyBmb3IgInR4IiBhdCB2aXNpdCAxIGFuZCB2aXNpdCAyIFt0cmVhdG1lbnQ6IEEgb3IgQl0KIyBsb2FkIGluIHRoZSByYW5kb21pemF0aW9uIGRhdGEKcmFuZG9taXplIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvcmFuZG9taXphdGlvbi5yZHMiKQpoZWFkKHJhbmRvbWl6ZSkKCnYxIDwtIHYxICU+JQogIHJlbmFtZSgiSUQiID0gc3ViamVjdCkKCnYyIDwtIHYyICU+JQogIHJlbmFtZSgiSUQiID0gc3ViamVjdCkKCiMgZ2V0IHRoZSBJRHMgZm9yIGV2ZXJ5b25lIHdobyBnb3QgdHJlYXRtZW50IEEgYXQgdmlzaXQgMSAKSURzX3YxX3R4QSA8LSByYW5kb21pemUgJT4lIGZpbHRlcih0eF92MSA9PSAiQSIpCklEc192MV90eEEKCiMgaWZlbHNlIHN0YXRlbWVudDogaWYgSUQgPSBhbnkgb2YgdGhvc2UgbGlzdGVkIGluIElEc192MV90eEEsIG1ha2UgdHhfdjEgPSAiQSIsIGVsc2UgbWFrZSBpdCAiQiIKdjEgPC0gdjEgJT4lCiAgbXV0YXRlKHR4X3YxID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJBIiwgIkIiKSksIHR4X3YyID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJCIiwgIkEiKSkpCmhlYWQodjEpCgojIGlmZWxzZSBzdGF0ZW1lbnQ6IGlmIElEID0gYW55IG9mIHRob3NlIGxpc3RlZCBpbiBJRHNfdjFfdHhBLCBtYWtlIHR4X3YyID0gIkIiLCBlbHNlIG1ha2UgaXQgIkEiIChwZW9wbGUgd2hvIHdlcmUgQSBhdCB2aXNpdCAxIHNob3VsZCBiZSBCIGZvciB2aXNpdCAyLCBhbmQgdmljZSB2ZXJzYSkKdjIgPC0gdjIgJT4lCiAgbXV0YXRlKHR4X3YyID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJCIiwgIkEiKSksIHR4X3YxID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJBIiwgIkIiKSkpCgpsZXZlbHModjEkdHhfdjEpCmxldmVscyh2MiR0eF92MikKCmhlYWQodjEpCiAgCklEc192MV90eEEkSUQKdjEgJT4lIGdyb3VwX2J5KHR4X3YxKSAlPiUgY291bnQoSUQpICMgSURzIGFuZCB0eCBtYXRjaCB0eEFfbGlzdAp2MiAlPiUgZ3JvdXBfYnkodHhfdjIpICU+JSBjb3VudChJRCkgIyBJRHMgYW5kIHR4IG1hdGNoIHR4QV9saXN0CgpieCA8LSBiaW5kX3Jvd3ModjEsdjIpClZpZXcoYngpCgojIHJlbmFtZSBzb21lIHZhcmlhYmxlcwpjb2xuYW1lcyhieCkKYnggPC0gYnggJT4lIHJlbmFtZSgicHVzaF9wdWxsIiA9IHZhbHVlcy5pbml0aWFscmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICJnQUFUX1JUIiA9IHZhbHVlcy5SVCkgJT4lIG11dGF0ZShwdXNoX3B1bGwgPSBhcy5mYWN0b3IocHVzaF9wdWxsKSkKaGVhZChieCkKCiMgYWRkIGEgbmV3IHZhcmlhYmxlIGZvciB0cmVhdG1lbnQgdG8gYngKYngxIDwtIGJ4ICU+JSBtdXRhdGUodHggPSBhcy5mYWN0b3IoaWZlbHNlKHR4X3YxID09ICJBIiAmIHZpc2l0ID09ICIxIiwgIkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHhfdjIgPT0gIkEiICYgdmlzaXQgPT0gIjIiLCAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eF92MSA9PSAiQiIgJiB2aXNpdCA9PSAiMSIsICJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eF92MiA9PSAiQiIgJiB2aXNpdCA9PSAiMiIsICJCIiwgTkEpKSkpKSkKCiMgY2hlY2sgdGhhdCBpdCBjb2RlZCB0aGUgJ3R4JyBjb2x1bW4gY29ycmVjdGx5ICAKYngxICU+JSBmaWx0ZXIoSUQgPT0gIkQxMDEiICYgdmlzaXQgPT0gIjEiKSAjICd0eCcgc2hvdWxkIGJlIEEKYngxICU+JSBmaWx0ZXIoSUQgPT0gIkQxMDEiICYgdmlzaXQgPT0gIjIiKSAjICd0eCcgc2hvdWxkIGJlIEIKCiMgYWRkIGEgbmV3IHZhcmlhYmxlIGZvciBzdGltdWx1cyBjYXRlZ29yeQojIGluIHZhbHVlcy5zdGltdWx1czoKIyAxID0gc3BvdXNlLCAyID0gbGl2aW5nIGxvdmVkIG9uZS9XSE9UTywgMyA9IHN0cmFuZ2VyLCA0ID0gbm9tb3RoZXRpYyBkZWF0aC1yZWxhdGVkLCA1ID0gbmV1dHJhbCBpbWFnZXMKCnNvcnQodW5pcXVlKGJ4MSR2YWx1ZXMuc3RpbXVsdXMpKQoKYngyIDwtIGJ4MSAlPiUKICBtdXRhdGUoc3RpbSA9IGFzLmZhY3RvcihpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIxQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8zLmpwZyIsICJzcG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIyQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8zLmpwZyIsICJsaXZpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIzQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8zLmpwZyIsICJzdHJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICI0Ql8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8zLmpwZyIsICJkZWF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMy5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMy5qcGciLCAibmV1dHJhbCIsIE5BKSkpKSkpKQoKbGV2ZWxzKGJ4MiRzdGltKQpieDIkc3RpbSA8LSByZWxldmVsKGJ4MiRzdGltLCByZWYgPSAibmV1dHJhbCIpICMgbWFrZSBuZXV0cmFsIHRoZSByZWZlcmVuY2UgbGV2ZWwKCmBgYAoKIyMjIFJlbW92ZSBvdXRsaWVycwpUaGUgdG9wIGFuZCBib3R0b20gMSUgb2YgUlRzIHdpbGwgYmUgcmVtb3ZlZCBhcyBwYXJ0IG9mIGNvbnZlbnRpb25hbCBkYXRhIGNsZWFuaW5nIGZvciB0aGlzIHRhc2suCmBgYHtyfQpwOTkgPC0gcXVhbnRpbGUoYngyJGdBQVRfUlQsIDAuOTkpIApwMDEgPC0gcXVhbnRpbGUoYngyJGdBQVRfUlQsIDAuMDEpIAoKIyBkcm9wIHRvcCBhbmQgYm90dG9tIDElIG9mIFJUcyBhbmQgcmVtb3ZlIG91dGxpZXJzIGZyb20gZGF0YQpieDIgPC0gYngyICU+JSBtdXRhdGUob3V0bGllcl9SVCA9IGFzLmZhY3RvcihpZmVsc2UoZ0FBVF9SVCA8PSBwMDEgfCBnQUFUX1JUID49IHA5OSwgMSwgMCkpKSAlPiUgZmlsdGVyKG91dGxpZXJfUlQgPT0gIjAiKSAKYGBgCgpBc3N1bWluZyBhIDEwJSB0aHJlc2hvbGQgZm9yIG1pc3NlZCB0cmlhbHMsIGZpbmQgb3V0IGlmIGFueW9uZSdzIG1pc3NpbmcgbW9yZSB0aGFuIHRoaXMuCmBgYHtyfQoKMjg4LSgyODgqLjEwKSAjIGJhc2VkIG9uIHRoZSAxMCUgY3V0b2ZmLCBwZW9wbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMjU5IHRyaWFscwpuIDwtIGJ4MiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBncm91cF9ieSh0eCkgJT4lIGNvdW50KElEKQpuICU+JSBmaWx0ZXIobiA8IDI1OSkgIyBkb2VzIGFueW9uZSBoYXZlIGZld2VyIHRoYW4gMjU5PyB5ZXMsIEQxMDcgaGFzIG9ubHkgMjQ4CmBgYAoKU2F2ZSB0aGUgbG9uZyBkYXRhc2V0LgpgYGB7cn0gICAgICAgICAgICAgICAgICAgICAKIyBzYXZlIGl0CnNhdmVSRFMoYngyLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9nQUFUX2xvbmcucmRzIikKd3JpdGUuY3N2KGJ4MiwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvZ0FBVF9sb25nLmNzdiIpCgpgYGAKCiMjIyBMb25nIHRvIHdpZGUKTmV4dCBzdGVwOiBzdWJzZXR0aW5nIGFuZCB0YWtpbmcgZGF0YSBmcm9tIGxvbmcgdG8gd2lkZS4KYGBge3J9CiMgU3Vic2V0IGJ5IHN0aW11bHVzIGNhdGVnb3J5IGFuZCB0cmVhdG1lbnQKIyMgaW1hZ2UgZmlsZW5hbWVzICgndmFsdWVzLnN0aW11bHVzJykgc3RhcnRpbmcgd2l0aCAxID0gc3BvdXNlLCAyID0gV0hPVE8sIDMgPSBzdHJhbmdlciwgNCA9IG5vbW90aGV0aWMgZGVhdGgsIDUgPSBuZXV0cmFsIGltYWdlcwoKc3BvdXNlX3B1c2hfQSA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMUJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkEiLHR4KSkKc3BvdXNlX3B1c2hfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMUJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKc3BvdXNlX3B1bGxfQSA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMUJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVUxMIixwdXNoX3B1bGwpICYgZ3JlcGwoIkEiLHR4KSkKc3BvdXNlX3B1bGxfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMUJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVUxMIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKCndob3RvX3B1c2hfQSA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMkJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkEiLHR4KSkKd2hvdG9fcHVzaF9CIDwtIGZpbHRlcihieDIsIGdyZXBsKCIyQl98MVlfIix2YWx1ZXMuc3RpbXVsdXMpICYgZ3JlcGwoIlBVU0giLHB1c2hfcHVsbCkgJiBncmVwbCgiQiIsdHgpKQp3aG90b19wdWxsX0EgPC0gZmlsdGVyKGJ4MiwgZ3JlcGwoIjJCX3wxWV8iLHZhbHVlcy5zdGltdWx1cykgJiBncmVwbCgiUFVMTCIscHVzaF9wdWxsKSAmIGdyZXBsKCJBIix0eCkpCndob3RvX3B1bGxfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiMkJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVUxMIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKCnN0cmFuZ2VyX3B1c2hfQSA8LSBmaWx0ZXIoYngyLCBncmVwbCgiM0JffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkEiLHR4KSkKc3RyYW5nZXJfcHVzaF9CIDwtIGZpbHRlcihieDIsIGdyZXBsKCIzQl98MVlfIix2YWx1ZXMuc3RpbXVsdXMpICYgZ3JlcGwoIlBVU0giLHB1c2hfcHVsbCkgJiBncmVwbCgiQiIsdHgpKQpzdHJhbmdlcl9wdWxsX0EgPC0gZmlsdGVyKGJ4MiwgZ3JlcGwoIjNCX3wxWV8iLHZhbHVlcy5zdGltdWx1cykgJiBncmVwbCgiUFVMTCIscHVzaF9wdWxsKSAmIGdyZXBsKCJBIix0eCkpCnN0cmFuZ2VyX3B1bGxfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiM0JffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVUxMIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKCmRlYXRoX3B1c2hfQSA8LSBmaWx0ZXIoYngyLCBncmVwbCgiNEJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkEiLHR4KSkKZGVhdGhfcHVzaF9CIDwtIGZpbHRlcihieDIsIGdyZXBsKCI0Ql98MVlfIix2YWx1ZXMuc3RpbXVsdXMpICYgZ3JlcGwoIlBVU0giLHB1c2hfcHVsbCkgJiBncmVwbCgiQiIsdHgpKQpkZWF0aF9wdWxsX0EgPC0gZmlsdGVyKGJ4MiwgZ3JlcGwoIjRCX3wxWV8iLHZhbHVlcy5zdGltdWx1cykgJiBncmVwbCgiUFVMTCIscHVzaF9wdWxsKSAmIGdyZXBsKCJBIix0eCkpCmRlYXRoX3B1bGxfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiNEJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVUxMIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKCm5ldXRyYWxfcHVzaF9BIDwtIGZpbHRlcihieDIsIGdyZXBsKCI1Ql98MVlfIix2YWx1ZXMuc3RpbXVsdXMpICYgZ3JlcGwoIlBVU0giLHB1c2hfcHVsbCkgJiBncmVwbCgiQSIsdHgpKQpuZXV0cmFsX3B1c2hfQiA8LSBmaWx0ZXIoYngyLCBncmVwbCgiNUJffDFZXyIsdmFsdWVzLnN0aW11bHVzKSAmIGdyZXBsKCJQVVNIIixwdXNoX3B1bGwpICYgZ3JlcGwoIkIiLHR4KSkKbmV1dHJhbF9wdWxsX0EgPC0gZmlsdGVyKGJ4MiwgZ3JlcGwoIjVCX3wxWV8iLHZhbHVlcy5zdGltdWx1cykgJiBncmVwbCgiUFVMTCIscHVzaF9wdWxsKSAmIGdyZXBsKCJBIix0eCkpCm5ldXRyYWxfcHVsbF9CIDwtIGZpbHRlcihieDIsIGdyZXBsKCI1Ql98MVlfIix2YWx1ZXMuc3RpbXVsdXMpICYgZ3JlcGwoIlBVTEwiLHB1c2hfcHVsbCkgJiBncmVwbCgiQiIsdHgpKQoKIyBTdW1tYXJpemUgUlRzCnNwb3VzZV9wdXNoX0EgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gc3BvdXNlX3B1c2hfQS4xCnNwb3VzZV9wdXNoX0IgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gc3BvdXNlX3B1c2hfQi4xCnNwb3VzZV9wdWxsX0EgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gc3BvdXNlX3B1bGxfQS4xCnNwb3VzZV9wdWxsX0IgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gc3BvdXNlX3B1bGxfQi4xCgp3aG90b19wdXNoX0EgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gd2hvdG9fcHVzaF9BLjEKd2hvdG9fcHVzaF9CICU+JSBncm91cF9ieShJRCkgJT4lIHN1bW1hcmlzZV9hdCh2YXJzKGdBQVRfUlQpLCBtZWRpYW4sIG5hLnJtID0gRkFMU0UpIC0+IHdob3RvX3B1c2hfQi4xCndob3RvX3B1bGxfQSAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiB3aG90b19wdWxsX0EuMQp3aG90b19wdWxsX0IgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gd2hvdG9fcHVsbF9CLjEKCnN0cmFuZ2VyX3B1c2hfQSAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiBzdHJhbmdlcl9wdXNoX0EuMQpzdHJhbmdlcl9wdXNoX0IgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gc3RyYW5nZXJfcHVzaF9CLjEKc3RyYW5nZXJfcHVsbF9BICU+JSBncm91cF9ieShJRCkgJT4lIHN1bW1hcmlzZV9hdCh2YXJzKGdBQVRfUlQpLCBtZWRpYW4sIG5hLnJtID0gRkFMU0UpIC0+IHN0cmFuZ2VyX3B1bGxfQS4xCnN0cmFuZ2VyX3B1bGxfQiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiBzdHJhbmdlcl9wdWxsX0IuMQoKZGVhdGhfcHVzaF9BICU+JSBncm91cF9ieShJRCkgJT4lIHN1bW1hcmlzZV9hdCh2YXJzKGdBQVRfUlQpLCBtZWRpYW4sIG5hLnJtID0gRkFMU0UpIC0+IGRlYXRoX3B1c2hfQS4xCmRlYXRoX3B1c2hfQiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiBkZWF0aF9wdXNoX0IuMQpkZWF0aF9wdWxsX0EgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gZGVhdGhfcHVsbF9BLjEKZGVhdGhfcHVsbF9CICU+JSBncm91cF9ieShJRCkgJT4lIHN1bW1hcmlzZV9hdCh2YXJzKGdBQVRfUlQpLCBtZWRpYW4sIG5hLnJtID0gRkFMU0UpIC0+IGRlYXRoX3B1bGxfQi4xCgpuZXV0cmFsX3B1c2hfQSAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiBuZXV0cmFsX3B1c2hfQS4xCm5ldXRyYWxfcHVzaF9CICU+JSBncm91cF9ieShJRCkgJT4lIHN1bW1hcmlzZV9hdCh2YXJzKGdBQVRfUlQpLCBtZWRpYW4sIG5hLnJtID0gRkFMU0UpIC0+IG5ldXRyYWxfcHVzaF9CLjEKbmV1dHJhbF9wdWxsX0EgJT4lIGdyb3VwX2J5KElEKSAlPiUgc3VtbWFyaXNlX2F0KHZhcnMoZ0FBVF9SVCksIG1lZGlhbiwgbmEucm0gPSBGQUxTRSkgLT4gbmV1dHJhbF9wdWxsX0EuMQpuZXV0cmFsX3B1bGxfQiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBzdW1tYXJpc2VfYXQodmFycyhnQUFUX1JUKSwgbWVkaWFuLCBuYS5ybSA9IEZBTFNFKSAtPiBuZXV0cmFsX3B1bGxfQi4xCgojIGFkZCBhIHN1ZmZpeCAoZm9yIHRoZSB3aWRlIGRhdGFzZXQpCnNwb3VzZV9wdXNoX0EuMiA8LSBzcG91c2VfcHVzaF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zcG91c2VfcHVzaF9BIikpCnNwb3VzZV9wdXNoX0IuMiA8LSBzcG91c2VfcHVzaF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zcG91c2VfcHVzaF9CIikpCnNwb3VzZV9wdWxsX0EuMiA8LSBzcG91c2VfcHVsbF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zcG91c2VfcHVsbF9BIikpCnNwb3VzZV9wdWxsX0IuMiA8LSBzcG91c2VfcHVsbF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zcG91c2VfcHVsbF9CIikpCgp3aG90b19wdXNoX0EuMiA8LSB3aG90b19wdXNoX0EuMSAlPiUKICByZW5hbWVfYXQodmFycyhnQUFUX1JUKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX3dob3RvX3B1c2hfQSIpKQp3aG90b19wdXNoX0IuMiA8LSB3aG90b19wdXNoX0IuMSAlPiUKICByZW5hbWVfYXQodmFycyhnQUFUX1JUKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX3dob3RvX3B1c2hfQiIpKQp3aG90b19wdWxsX0EuMiA8LSB3aG90b19wdWxsX0EuMSAlPiUKICByZW5hbWVfYXQodmFycyhnQUFUX1JUKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX3dob3RvX3B1bGxfQSIpKQp3aG90b19wdWxsX0IuMiA8LSB3aG90b19wdWxsX0IuMSAlPiUKICByZW5hbWVfYXQodmFycyhnQUFUX1JUKSxmdW5jdGlvbih4KSBwYXN0ZTAoeCwiX3dob3RvX3B1bGxfQiIpKQoKc3RyYW5nZXJfcHVzaF9BLjIgPC0gc3RyYW5nZXJfcHVzaF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zdHJhbmdlcl9wdXNoX0EiKSkKc3RyYW5nZXJfcHVzaF9CLjIgPC0gc3RyYW5nZXJfcHVzaF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zdHJhbmdlcl9wdXNoX0IiKSkKc3RyYW5nZXJfcHVsbF9BLjIgPC0gc3RyYW5nZXJfcHVsbF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zdHJhbmdlcl9wdWxsX0EiKSkKc3RyYW5nZXJfcHVsbF9CLjIgPC0gc3RyYW5nZXJfcHVsbF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9zdHJhbmdlcl9wdWxsX0IiKSkKCmRlYXRoX3B1c2hfQS4yIDwtIGRlYXRoX3B1c2hfQS4xICU+JQogIHJlbmFtZV9hdCh2YXJzKGdBQVRfUlQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfZGVhdGhfcHVzaF9BIikpCmRlYXRoX3B1c2hfQi4yIDwtIGRlYXRoX3B1c2hfQi4xICU+JQogIHJlbmFtZV9hdCh2YXJzKGdBQVRfUlQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfZGVhdGhfcHVzaF9CIikpCmRlYXRoX3B1bGxfQS4yIDwtIGRlYXRoX3B1bGxfQS4xICU+JQogIHJlbmFtZV9hdCh2YXJzKGdBQVRfUlQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfZGVhdGhfcHVsbF9BIikpCmRlYXRoX3B1bGxfQi4yIDwtIGRlYXRoX3B1bGxfQi4xICU+JQogIHJlbmFtZV9hdCh2YXJzKGdBQVRfUlQpLGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCJfZGVhdGhfcHVsbF9CIikpCgpuZXV0cmFsX3B1c2hfQS4yIDwtIG5ldXRyYWxfcHVzaF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9uZXV0cmFsX3B1c2hfQSIpKQpuZXV0cmFsX3B1c2hfQi4yIDwtIG5ldXRyYWxfcHVzaF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9uZXV0cmFsX3B1c2hfQiIpKQpuZXV0cmFsX3B1bGxfQS4yIDwtIG5ldXRyYWxfcHVsbF9BLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9uZXV0cmFsX3B1bGxfQSIpKQpuZXV0cmFsX3B1bGxfQi4yIDwtIG5ldXRyYWxfcHVsbF9CLjEgJT4lCiAgcmVuYW1lX2F0KHZhcnMoZ0FBVF9SVCksZnVuY3Rpb24oeCkgcGFzdGUwKHgsIl9uZXV0cmFsX3B1bGxfQiIpKQoKIyBtZXJnZQpkYXRhIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUJfMjBtZnVfYWRkdmFyc19yZXN0LnJkcyIpCklEcyA8LSBkYXRhLmZyYW1lKGRhdGEkSUQpCklEcyA8LSBJRHMgJT4lIHJlbmFtZShJRCA9IGRhdGEuSUQpCgpqb2luMWJ4IDwtIGxlZnRfam9pbihkYXRhLCBzcG91c2VfcHVsbF9BLjIsIGJ5PSJJRCIpCmpvaW4yYnggPC0gbGVmdF9qb2luKGpvaW4xYngsIHNwb3VzZV9wdWxsX0IuMiwgYnk9IklEIikKam9pbjNieCA8LSBsZWZ0X2pvaW4oam9pbjJieCwgc3BvdXNlX3B1c2hfQS4yLCBieT0iSUQiKQpqb2luNGJ4IDwtIGxlZnRfam9pbihqb2luM2J4LCBzcG91c2VfcHVzaF9CLjIsIGJ5PSJJRCIpCgpqb2luNWJ4IDwtIGxlZnRfam9pbihqb2luNGJ4LCBzdHJhbmdlcl9wdWxsX0EuMiwgYnk9IklEIikKam9pbjZieCA8LSBsZWZ0X2pvaW4oam9pbjVieCwgc3RyYW5nZXJfcHVsbF9CLjIsIGJ5PSJJRCIpCmpvaW43YnggPC0gbGVmdF9qb2luKGpvaW42YngsIHN0cmFuZ2VyX3B1c2hfQS4yLCBieT0iSUQiKQpqb2luOGJ4IDwtIGxlZnRfam9pbihqb2luN2J4LCBzdHJhbmdlcl9wdXNoX0IuMiwgYnk9IklEIikKCmpvaW45YnggPC0gbGVmdF9qb2luKGpvaW44YngsIHdob3RvX3B1bGxfQS4yLCBieT0iSUQiKQpqb2luMTBieCA8LSBsZWZ0X2pvaW4oam9pbjlieCwgd2hvdG9fcHVsbF9CLjIsIGJ5PSJJRCIpCmpvaW4xMWJ4IDwtIGxlZnRfam9pbihqb2luMTBieCwgd2hvdG9fcHVzaF9BLjIsIGJ5PSJJRCIpCmpvaW4xMmJ4IDwtIGxlZnRfam9pbihqb2luMTFieCwgd2hvdG9fcHVzaF9CLjIsIGJ5PSJJRCIpCgpqb2luMTNieCA8LSBsZWZ0X2pvaW4oam9pbjEyYngsIG5ldXRyYWxfcHVsbF9BLjIsIGJ5PSJJRCIpCmpvaW4xNGJ4IDwtIGxlZnRfam9pbihqb2luMTNieCwgbmV1dHJhbF9wdWxsX0IuMiwgYnk9IklEIikKam9pbjE1YnggPC0gbGVmdF9qb2luKGpvaW4xNGJ4LCBuZXV0cmFsX3B1c2hfQS4yLCBieT0iSUQiKQpqb2luMTZieCA8LSBsZWZ0X2pvaW4oam9pbjE1YngsIG5ldXRyYWxfcHVzaF9CLjIsIGJ5PSJJRCIpCgpqb2luMTdieCA8LSBsZWZ0X2pvaW4oam9pbjE2YngsIGRlYXRoX3B1bGxfQS4yLCBieT0iSUQiKQpqb2luMThieCA8LSBsZWZ0X2pvaW4oam9pbjE3YngsIGRlYXRoX3B1bGxfQi4yLCBieT0iSUQiKQpqb2luMTlieCA8LSBsZWZ0X2pvaW4oam9pbjE4YngsIGRlYXRoX3B1c2hfQS4yLCBieT0iSUQiKQpqb2luMjBieCA8LSBsZWZ0X2pvaW4oam9pbjE5YngsIGRlYXRoX3B1c2hfQi4yLCBieT0iSUQiKQpkYXRhIDwtIGpvaW4yMGJ4CgpzYXZlUkRTKGRhdGEsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCXzIwbWZ1X2FkZHZhcnNfcmVzdF9nQUFULnJkcyIpCgpnQUFUX3dpZGUgPC0gam9pbjIwYnhbLCBncmVwKCdeSUR8Z0FBVCcsIG5hbWVzKGRhdGEpKV0Kc2F2ZVJEUyhnQUFUX3dpZGUsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL2dBQVRfd2lkZS5yZHMiKQp3cml0ZS5jc3YoZ0FBVF93aWRlLCAifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9nQUFUX3dpZGUuY3N2IikKYGBgCgojIE1lZGljYXRpb24gdmFyaWFibGVzCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmRhdGEgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9zZWxmcmVwb3J0c19veHRyX2NvcnRpc29sX3JhbmRvbV9BQl8yMG1mdV9hZGR2YXJzX3Jlc3RfZ0FBVC5yZHMiKQpWaWV3KGRhdGEkbWVkc193aGljaCkKZGF0YV9tZWRzIDwtIGRhdGEgJT4lIG11dGF0ZShtZWRzX3J4b25seSA9IHJlY29kZShtZWRzX3doaWNoLCAiTGV2b3RoeXJveGluZSBhbmQgRG94eXpvc2luIiA9CSAibGV2b3RoeXJveGluZSwgZG94YXpvc2luIiwKICAgICAgICAgICAgICAgICAgICAgICJkaXBoZW5oeWRyYW1pbmUgIiA9CSBOQV9jaGFyYWN0ZXJfLAogICAgICAgICAgICAgICAgICAgICAgIkFscHJhem9sYW07IEFjeWNsb3ZpciIgCT0JICJhbHByYXpvbGFtLCBhY3ljbG92aXIgKHRvcGljYWwpIiwKICAgICAgICAgICAgICAgICAgICAgICJjcmVzdG9yLCBsZXZvdGh5cm94aW5lLCBjaXRhbG9wcmFtIiAgPSAgInJvc3V2YXN0YXRpbiBjYWxjaXVtLCBsZXZvdGh5cm94aW5lLCBjaXRhbG9wcmFtIiwKICAgICAgICAgICAgICAgICAgICAgICJHYWJhcGVudGVuLCBWYWdpZmVtLCBDaWNsb3Bpcm94IE9sYW1pbmUgQ3JlYW0gMC43NyUsIEZpbmFzdGVyaWRlIiAJPQkgImdhYmFwZW50aW4sIEVzdHJhZGlvbCAodG9waWNhbCksIGNpY2xvcGlyb3ggKHRvcGljYWwpLCBmaW5hc3RlcmlkZSIsCiAgICAgICAgICAgICAgICAgICAgICAiTGV2b3RoeXJveGluLGZsdW94ZXRpbmUsaHlkcm9jaGxvcm90aGlhemlkZSIgCT0JICJsZXZvdGh5cm94aW5lLCBmbHVveGV0aW5lLCBoeWRyb2NobG9yb3RoaWF6aWRlIiwKICAgICAgICAgICAgICAgICAgICAgICJzZWVzY3JlZW5pbmcgZm9ybSIgCT0JICJ2YWxzYXJ0YW4sIGFjeWNsb3ZpciAodG9waWNhbCksIHRlbWF6ZXBhbSwgYWxwcmF6b2xhbSBQUk4iLAogICAgICAgICAgICAgICAgICAgICAgIkluc3VsaW4zMHUgYmlkLCBNZXRmb3JtaW4gNTAwbWcgYmlkLCBBY3RvcyAzMG1nIHFkLCBNZXRyb3BvbG9sIDEwMG1nIHFkLCBWYWxzYXJ0YW4vSENUWiAzMjAvMjVtZyBxcG0sIFNpbXZpc3RhdGluIDIwbWcgcXBtLiAgIiAJPQkgImluc3VsaW4sIG1ldGZvcm1pbiwgcGlvZ2xpdGF6b25lLCBtZXRvcHJvbG9sLCB2YWxzYXJ0YW4sIGh5ZHJvY2hsb3JvdGhpYXppZGUsIHNpbXZhc3RhdGluIiwKICAgICAgICAgICAgICAgICAgICAgICJUUkktRVNUL1BST0dFU1RFUk9ORSIgCT0JICJwaHl0b2VzdHJvZ2VucywgcHJvZ2VzdGVyb25lIiwKICAgICAgICAgICAgICAgICAgICAgICJBc3RlbGluLEZsdXZhc3RhdGluLEVmZmV4b3IgWFIsU2luZ3VsYWlyLFN5bnRocm9pZCxMYW5zb3ByYXpvbGUsIEZpc2ggT2lsLCBNYWduZXNpdW0sIEQtMywgQXNwcmluIC44MSIgCT0JICJhemVsYXN0aW5lLCBmbHV2YXN0YXRpbiwgdmVubGFmYXhpbmUgWFIsIG1vbnRlbHVrYXN0LCBsZXZvdGh5cm94aW5lLCBsYW5zb3ByYXpvbGUiLAogICAgICAgICAgICAgICAgICAgICAgIk5PTkUiIAk9CSBOQV9jaGFyYWN0ZXJfLAogICAgICAgICAgICAgICAgICAgICAgIkh5ZHJveHl1cmVhLCBTaW12YXN0YXRpbiwgRmFtb3RpZGluZSwgQWNldGFtaW5hcGhlbiIgCT0JICJoeWRyb3h5dXJlYSwgc2ltdmFzdGF0aW4sIGZhbW90aWRpbmUiLAogICAgICAgICAgICAgICAgICAgICAgIkxvdmFzdGF0aW4sIFZpdGFtaW4gRCB0YWJsZXQsIDgxbWcgQXNwaXJpbiwgMS8yIHRhYmxldCBzbGVlcCBhaWQgKG92ZXIgdGhlIGNvdW50ZXIpIiAJPQkgImxvdmFzdGF0aW4iLAogICAgICAgICAgICAgICAgICAgICAgIkxpc2lub3ByaWwiIAk9CSAibGlzaW5vcHJpbCIsCiAgICAgICAgICAgICAgICAgICAgICAiVmFsc2FydGFuIEhDVCBhbmQgQ3Jlc3RvciIgCT0JICJ2YWxzYXJ0YW4sIGh5ZHJvY2hsb3JvdGhpYXppZGUsIHJvc3V2YXN0YXRpbiBjYWxjaXVtIiwKICAgICAgICAgICAgICAgICAgICAgICJMZXZvdGh5cm94aW5lIGFuZCBBbGVuZHJvbmF0ZSIgCT0JICJsZXZvdGh5cm94aW5lLCBhbGVuZHJvbmF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAiQXRvcnZhc3RhdGluIiAJPQkgImF0b3J2YXN0YXRpbiIsCiAgICAgICAgICAgICAgICAgICAgICAibWV0b3Byb2xvbCxtZWxveGljYW0sIGNlbGV4YSwgYWN5Y2xvdmlyLCBwcmlsb3NlYywgbGlwaXRvciBhbmQgdmFyaW91cyB2aXRzICYgc3VwcGxlbWVudHMgaW5jLiBtYWduZXNpdW0sIHZpdHMgIEIxMiwgRDMsIENvIFExMCwgR2x1Y2FzYW1pbmUvIE1TTSwgRmlzaCBPaWwiIAk9CSAibWV0b3Byb2xvbCwgbWVsb3hpY2FtLCBhY3ljbG92aXIgKHRvcGljYWwpLCBvbWVwcmF6b2xlLCBhdG9ydmFzdGF0aW4iLAogICAgICAgICAgICAgICAgICAgICAgIkxldm90aHlyb3hpbmUsIHRvcGlyYW1hdGUsc3VtYXRyaXB0YW4iIAk9CSAibGV2b3RoeXJveGluZSwgdG9wYW1pcmF0ZSwgc3VtYXRyaXB0YW4iLAogICAgICAgICAgICAgICAgICAgICAgIjIwIG1nIFByYXZhc3RhdGluLCA1MCBtY2cgTGV2b3RoeXJveGluLCAxNTAgbWcgQnVwcm9waW9uIiAJPQkgInByYXZhc3RhdGluLCBsZXZvdGh5cm94aW5lLCBidXByb3Bpb24iLAogICAgICAgICAgICAgICAgICAgICAgIjEuIEF0ZW5vbG9sICAyLiBMb3NhcnRhbiBQb3Rhc3NpdW0gIDIuIFByYXZhc3RhdGluIFNvZGl1bSAgNC4gU3ludGhyb2lkIiAJPQkgImF0ZW5vbG9sLCBsb3NhcnRhbiwgcHJhdmFzdGF0aW4sIGxldm90aHlyb3hpbmUiLAogICAgICAgICAgICAgICAgICAgICAgIk1ldGZvcm1pbiwgSHlkcm9jaGxvcm90aGlhemlkZSwgVmFsc2FydGFuIiAJPQkgIm1ldGZvcm1pbiwgaHlkcm9jaGxvcm90aGlhemlkZSwgdmFsc2FydGFuIiwKICAgICAgICAgICAgICAgICAgICAgICJQcmF2YXN0YXRpbiBMaXNpbm9wcmlsLCBIeWRyb2NobG9yb3RoaXppZGUsIFNlcHRyYWxpbmUsIEFscHJhem9sYW0iIAk9CSAicHJhdmFzdGF0aW4sIGxpc2lub3ByaWwsIGh5ZHJvY2hsb3JvdGhpYXppZGUsIHNlcnRyYWxpbmUsIGFscHJhem9sYW0iLAogICAgICAgICAgICAgICAgICAgICAgImxldm90aHlyb3hpbmUsIGxvcmF6ZXBhbSIgCT0JICJsZXZvdGh5cm94aW5lLCBsb3JhemVwYW0iLAogICAgICAgICAgICAgICAgICAgICAgIkxvc2FydGFuLCBQcmF2YXN0YXRpbiwgSmFseW4sIG1vbnRlbGthc3QsIFByb3ByYW5vbG9sLCBMZXZvdGhyb3hpbmUsIDgzIG1nIGFzcGlyaW4sIGdsdWNvc2FtaW5lLCBBbGV2ZSIgCT0JICJsb3NhcnRhbiwgcHJhdmFzdGF0aW4sIGR1dGFzdGVyaWRlL3RhbXN1bG9zaW4sIG1vbnRlbHVrYXN0LCBwcm9wYW5vbG9sLCBsZXZvdGh5cm94aW5lIiwKICAgICAgICAgICAgICAgICAgICAgICJMb3NvcnRhbi9IQ1QsIHBhbnRvcGhhem9sZSwgYXRvcnZhc3RhdGluIiAJPQkgImxvc2FydGFuLCBoeWRyb2NobG9yb3RoaWF6aWRlLCBwYW50b3ByYXpvbGUsIGF0b3J2YXN0YXRpbiIsCiAgICAgICAgICAgICAgICAgICAgICAiMSkgTGV2b3RoeXJveGluZSwgMikgRXN0cmFkaW9sLCAzKSBWaXRhbWlucy9taW5lcmFscy9hbnRpb3hpZGFudHMvaGVyYmFscyIgCT0JICJsZXZvdGh5cm94aW5lLCBlc3RyYWRpb2wiLAogICAgICAgICAgICAgICAgICAgICAgIlN0YXRpbiIgCT0JICJzdGF0aW4gKHVuc3BlY2lmaWVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAiU3ludGhyb2lkLCAgTmlhY2luIiA9ICJsZXZvdGh5cm94aW5lIiwKICAgICAgICAgICAgICAgICAgICAgICJNZXRmb3JtYW4sIEdsaXBpemlkZSwgRnVyb3NpbWlkZSwgTC1UaHlyb3hjaW5lLCBTZXJ0cmFsaW5lLCBMaXNpbmlwcmlsZSwgTGFudGlzIiAJPQkgIm1ldGZvcm1pbiwgZ2xpcGl6aWRlLCBmdXJvc2VtaWRlLCBsZXZvdGh5cm94aW5lLCBzZXJ0cmFsaW5lLCBsaXNpbm9wcmlsLCBpbnN1bGluIiwKICAgICAgICAgICAgICAgICAgICAgICJjaGxvcnRoYWxpZG9uZSwgYXRvcnZhc3RhdGluLCB0cmFtYWRvbCwgdml0YW1pbnMsIG90YyBhbmFsZ2VzaWNzLCBjb2xhY2UiIAk9CSAiY2hsb3J0aGFsaWRvbmUsIGF0b3J2YXN0YXRpbiwgdHJhbWFkb2wiLAogICAgICAgICAgICAgICAgICAgICAgIlN5bnRocm9pZCwgcHJvcHJhbm9sb2wiIAk9CSAibGV2b3RoeXJveGluZSwgcHJvcGFub2xvbCIsCiAgICAgICAgICAgICAgICAgICAgICAiWGFyZWx0bywgUG90YXNzaXVtLCBGdXJvc2VtaWRlLCBRdWluYXByaWwsIEdhYmFwZW50aW4sIEFsbG9wdXJpbm9sLCBDZWxlYnJleCwgUHJhdmFzdGF0aW4iIAk9CSAicml2YXJveGFiYW4sIGZ1cm9zZW1pZGUsIHF1aW5hcHJpbCwgZ2FiYXBlbnRpbiwgYWxsb3B1cmlub2wsIGNlbGVjb3hpYiwgcHJhdmFzdGF0aW4iLAogICAgICAgICAgICAgICAgICAgICAgIlRyYXphZG9uZSBkYWlseSIgCT0JICJ0cmF6b2RvbmUiKSkgIyMgbm90ZSB0aGF0IHRvcGljYWwgZXN0cmFkaW9sIGlzIHJhbmRvbWx5IGNhcGl0YWxpemVkLi4udGhpcyBpcyBiZWNhdXNlIEkgZGlkbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3b3JrYXJvdW5kIHlldCBmb3IgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgc2VjdGlvbiBiZWxvdyBmb3IgdGhlIG1lZHNfaHJ0IHZhcmlhYmxlIChkb24ndCB3YW50IHRvIGluY2x1ZGUgdG9waWNhbCBlc3RyYWRpb2wpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgojIHN1YnNldCB0byBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgd29ya2VkCm1lZHMgPC0gc2VsZWN0KGRhdGFfbWVkcywgSUQsIG1lZHNfeSwgbWVkc193aGljaCwgbWVkc19yeG9ubHkpClZpZXcobWVkcykKCiMgaGFkIHRyb3VibGUgd2l0aCBzb21lIG9mIHRoZXNlIChwcm9ibGVtcyB3L2V4dHJhIHNwYWNlcykgc28gaW5kZXhlZCBpbiBpbiBvcmRlciB0byBnZXQgdGhlIGV4YWN0IHZhbHVlIGZvciB0aGUgYWJvdmUgcmVwbGFjZW1lbnQgc2NyaXB0IHVzaW5nICdwcmludCcKIyMgcHJpbnQobWVkc1szLDNdKQojIyBwcmludChtZWRzWzExLDNdKQojIyBwcmludChtZWRzWzI0LDNdKSAgCiMjIHByaW50KG1lZHNbMjcsM10pICAKIyMgcHJpbnQobWVkc1szNSwzXSkgICAKCiMgTWVkcyAtIGRpY2hvdG9tb3VzIHZhcmlhYmxlcwojIyBkcnVnIGNsYXNzZXMgZnJvbSBmaWxlOiAiT1QtZk1SSS1tZWQtY2F0ZWdvcml6YXRpb24ueGxzeCIgdW5kZXIgL3Jhdy1kYXRhLwpmaXZlX2FscGhhX3JlZHVjdGFzZV9pbmhpYml0b3IgPC0gYygiZmluYXN0ZXJpZGUiLCAiZHV0YXN0ZXJpZGUvdGFtc3Vsb3NpbiIpCmFjZV9pbmhpYml0b3IgPC0gYygibGlzaW5vcHJpbCIsICJxdWluYXByaWwiKQphbHBoYV9ibG9ja2VyIDwtIGMoImRveGF6b3NpbiIpCmFuZ2lvdGVuc2luX3JlY2VwdG9yX2Jsb2NrZXIgPC0gYygibG9zYXJ0YW4iLCAidmFsc2FydGFuIikKYW50aWNvbnZ1bHNhbnQgPC0gYygiZ2FiYXBlbnRpbiIsICJ0b3BhbWlyYXRlIikKYW50aWNvYWd1bGFudCA8LSBjKCJyaXZhcm94YWJhbiIpCmFudGlkZXByZXNzYW50IDwtIGMoImJ1cHJvcGlvbiIsICJ2ZW5sYWZheGluZSBYUiIsICJjaXRhbG9wcmFtIiwgInNlcnRyYWxpbmUiLCAiZmx1b3hldGluZSIsICJ0cmF6b2RvbmUiKQpzbnJpX3NzcmkgPC0gYygidmVubGFmYXhpbmUgWFIiLCAiY2l0YWxvcHJhbSIsICJzZXJ0cmFsaW5lIiwgImZsdW94ZXRpbmUiKQp0b3BpY2FsX2FudGlmdW5nYWxfYW50aXZpcmFsIDwtIGMoImNpY2xvcGlyb3ggKHRvcGljYWwpIiwgImFjeWNsb3ZpciAodG9waWNhbCkiKQphbnRpaGlzdGFtaW5lIDwtIGMoImF6ZWxhc3RpbmUiKQphbnRpbWV0YWJvbGl0ZSA8LSBjKCJoeWRyb3h5dXJlYSIpCmJlbnpvIDwtIGMoImFscHJhem9sYW0iLCAiYWxwcmF6b2xhbSBQUk4iLCAibG9yYXplcGFtIiwgInRlbWF6ZXBhbSIpCmJldGFfYmxvY2tlciA8LSBjKCJtZXRvcHJvbG9sIiwgInByb3Bhbm9sb2wiKQpub25faW5zdWxpbl9hbnRpZGlhYmV0aWMgPC0gYygibWV0Zm9ybWluIiwgImdsaXBpemlkZSIsICJwaW9nbGl0YXpvbmUiKQppbnN1bGluIDwtIGMoImluc3VsaW4iKQpsdHJhIDwtIGMoIm1vbnRlbHVrYXN0IikgIyBsZXVrb3RyaWVuZSByZWNlcHRvciBhbnRhZ29uaXN0Cm5zYWlkIDwtIGMoImNlbGVjb3hpYiIsICJtZWxveGljYW0iKQpvcGlhdGUgPC0gYygidHJhbWFkb2wiKQpwcGkgPC0gYygibGFuc29wcmF6b2xlIiwgIm9tZXByYXpvbGUiLCAicGFudG9wcmF6b2xlIikKc3RhdGluIDwtIGMoImF0b3J2YXN0YXRpbiIsICJmbHV2YXN0YXRpbiIsICJsb3Zhc3RhdGluIiwgInByYXZhc3RhdGluIiwgInJvc3V2YXN0YXRpbiBjYWxjaXVtIiwgInNpbXZhc3RhdGluIiwgInNpbXZhc3RhdGluIiwgInN0YXRpbiAodW5zcGVjaWZpZWQpIikKdGh5cm9pZCA8LSBjKCJsZXZvdGh5cm94aW5lIikKdHJpcHRhbiA8LSBjKCJzdW1hdHJpcHRhbiIpICMgYWxzbyBhY3RzIG9uIHNlcm90b25pbi4uLgp4b2kgPC0gYygiYWxsb3B1cmlub2wiKSAjIHhhbnRoaW5lIG94aWRhc2UgaW5oaWJpdG9yCmhydCA8LSBjKCJlc3RyYWRpb2wiLCJwcm9nZXN0ZXJvbmUiKSAjIGFzIHBlciBNRk8gbWVldGluZyAxLzMxLzE5LCBub3QgaW5jbHVkaW5nIHRvcGljYWwgcHJlcGFyYXRpb25zIG9yIHBoeXRvZXN0cm9nZW5zIGFzIHRob3NlIGFyZSBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBzYW1lIHN5c3RlbWljIGVmZmVjdHMKCiMgRHVtbXktY29kaW5nIG1lZGljYXRpb24gY2F0ZWdvcmllcwojIyAzIGNhdGVnb3JpZXMgZGVjaWRlZCBpbiBtZWV0aW5nIHdpdGggTUZPIDEvMzEvMTkKZGF0YV9tZWRzJG1lZHNfcHN5Y2hvYWN0aXZlIDwtIGFzLmZhY3RvcihpZmVsc2UoZ3JlcGwocGFzdGUoYW50aWNvbnZ1bHNhbnQsY29sbGFwc2U9InwiKSxkYXRhX21lZHMkbWVkc19yeG9ubHksaWdub3JlLmNhc2U9VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiwgaWZlbHNlKGdyZXBsKHBhc3RlKGFudGlkZXByZXNzYW50LGNvbGxhcHNlPSJ8IiksZGF0YV9tZWRzJG1lZHNfcnhvbmx5LGlnbm9yZS5jYXNlPVRSVUUpLCJ5ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbChwYXN0ZShiZW56byxjb2xsYXBzZT0ifCIpLGRhdGFfbWVkcyRtZWRzX3J4b25seSxpZ25vcmUuY2FzZT1UUlVFKSwieWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIikpKSkgIyBub3RlIG5vdCBhbGwgcGFydGljaXBhbnRzIHRha2luZyBwc3ljaG9hY3RpdmUgbWVkcyBmb3IgcHN5Y2hpYXRyaWMgcHVycG9zZXMgKGkuZS4sIHRyYXpvZG9uZSAmIGJlbnpvcyBmb3Igc2xlZXAsIGFudGljb252dWxzYW50cyBmb3IgcGFpbiBhbmQgbWlncmFpbmVzKQoKZGF0YV9tZWRzJG1lZHNfaHJ0IDwtIGFzLmZhY3RvcihpZmVsc2UoZ3JlcGwocGFzdGUoaHJ0LGNvbGxhcHNlPSJ8IiksZGF0YV9tZWRzJG1lZHNfcnhvbmx5LGlnbm9yZS5jYXNlPUZBTFNFKSwgInllcyIsICJubyIpKQoKZGF0YV9tZWRzJG1lZHNfaG9ybW9uZV9vcGlhdGUgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbChwYXN0ZShvcGlhdGUsY29sbGFwc2U9InwiKSxkYXRhX21lZHMkbWVkc19yeG9ubHksaWdub3JlLmNhc2U9VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiwgaWZlbHNlKGdyZXBsKHBhc3RlKGluc3VsaW4sY29sbGFwc2U9InwiKSxkYXRhX21lZHMkbWVkc19yeG9ubHksaWdub3JlLmNhc2U9VFJVRSksInllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKHBhc3RlKHRoeXJvaWQsY29sbGFwc2U9InwiKSxkYXRhX21lZHMkbWVkc19yeG9ubHksaWdub3JlLmNhc2U9VFJVRSksInllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIpKSkpCgojIG1ha2UgYSB2YXJpYWJsZSBmb3IgdG90YWwgbnVtYmVyIG9mIFJ4IG1lZHMKZGF0YV9tZWRzIDwtIGRhdGFfbWVkcyAlPiUgCiAgc2VwYXJhdGVfcm93cyhtZWRzX3J4b25seSkgJT4lIAogIGZpbHRlcihtZWRzX3J4b25seSAhPSAnJykgJT4lIAogIGdyb3VwX2J5KElEKSAlPiUgCiAgc3VtbWFyaXNlKG1lZHNfdG90YWwgPSBuX2Rpc3RpbmN0KG1lZHNfcnhvbmx5KSkgJT4lIGxlZnRfam9pbihkYXRhX21lZHMsIC4pIAogIApkYXRhX21lZHMkbWVkc190b3RhbCA8LSBkYXRhX21lZHMkbWVkc190b3RhbCAlPiUgcmVwbGFjZV9uYSgwKSAjIHJlcGxhY2UgTkEncyB3aXRoIDAKCiMgY2hlY2tpbmcgaXQgb3V0Li4uCm1lZHMgPC0gc2VsZWN0KGRhdGFfbWVkcywgSUQsIG1lZHNfeSwgbWVkc193aGljaCwgbWVkc19yeG9ubHksIG1lZHNfdG90YWwpClZpZXcobWVkcykKCiMgc2F2ZSBpdCEKc2F2ZVJEUyhkYXRhX21lZHMsICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCXzIwbWZ1X2FkZHZhcnNfcmVzdF9nQUFUX21lZHMucmRzIikKYGBgCgojIEFwcGVuZGl4CiMjIE1pbm9yIGZpeGVzClJlbW92aW5nL3JlbmFtaW5nIHZhcmlhYmxlcyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgaW4gdGhlcmU6CmBgYHtyfQpkYXRhIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9jbGVhbmVkLWRhdGEvc2VsZnJlcG9ydHNfb3h0cl9jb3J0aXNvbF9yYW5kb21fQUJfMjBtZnVfYWRkdmFyc19yZXN0X2dBQVRfbWVkcy5yZHMiKQoKZGF0YSR0eF9BIDwtIE5VTEwgIyB0aGlzIHdhcyBhIGhvbGRvdmVyIGZyb20gd2hlbiB0aGUgcmFuZG9taXphdGlvbiBkYXRhIHdlcmUgbWVyZ2VkIGFuZCBpcyBtZWFuaW5nbGVzcyAoanVzdCByZXBlYXRzICJBIiBmb3IgZXZlcnlvbmUpCmRhdGEkdHhfQiA8LSBOVUxMICMgdGhpcyB3YXMgYSBob2xkb3ZlciBmcm9tIHdoZW4gdGhlIHJhbmRvbWl6YXRpb24gZGF0YSB3ZXJlIG1lcmdlZCBhbmQgaXMgbWVhbmluZ2xlc3MgKGp1c3QgcmVwZWF0cyAiQSIgZm9yIGV2ZXJ5b25lKQpkYXRhIDwtIHJlbmFtZShkYXRhLCBnQUFUX3B1c2hfdjEgPSBBQVRwdXNoMV92MSwKICAgICAgICAgICAgICBnQUFUX3B1c2hfdjIgPSBBQVRwdXNoMV92MikKCnNhdmVSRFMoZGF0YSwgIn4vRHJvcGJveC9HTEFTUyBMYWIvT1QgU3R1ZHkvZGF0YS9tYXN0ZXItZGF0YXNldC9vdC1mbXJpX21hc3Rlci1kYXRhc2V0XzAyMDcxOS5yZHMiKQp3cml0ZS5jc3YoZGF0YSwgZmlsZSA9ICJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvbWFzdGVyLWRhdGFzZXQvb3QtZm1yaV9tYXN0ZXItZGF0YXNldF8wMjA3MTkuY3N2IikKYGBgCgojIyBBbHBoYWJldGl6ZWQgbGlzdCBvZiB2YXJpYWJsZXMKYGBge3J9Cm5hbWVzIDwtIG5hbWVzKGRhdGEpCmNhdChzb3J0KG5hbWVzKSwgc2VwPSJcbiIpCmBgYA==