diff --git a/AEDB.EM.baseline.Rmd b/AEDB.EM.baseline.Rmd index 5cd1f53..b706ea8 100644 --- a/AEDB.EM.baseline.Rmd +++ b/AEDB.EM.baseline.Rmd @@ -52,7 +52,6 @@ _... and load those packages._ ```{r loading_packages, message=FALSE, warning=FALSE} source("scripts/pack01.packages.R") - ``` _We will create a datestamp and define the Utrecht Science Park Colour Scheme_. @@ -1011,7 +1010,7 @@ cat("CREATE BASELINE TABLE\n") # Baseline table variables basetable_vars = c("Hospital", "Artery_summary", - "Age", "Gender") + "Age", "Gender", # "ORyear", # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", # "TC_final", "LDL_final", "HDL_final", "TG_final", @@ -1033,7 +1032,8 @@ basetable_vars = c("Hospital", # "IPH.bin", "VesselDensity_rankNorm", # "Calc.bin", "Collagen.bin", # "Fat.bin_10", "Fat.bin_40", - # "OverallPlaquePhenotype", "Plaque_Vulnerability_Index") + "OverallPlaquePhenotype" ) + # , "Plaque_Vulnerability_Index") basetable_bin = c("Hospital", "Artery_summary", @@ -1183,8 +1183,8 @@ saveRDS(AEDB, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.raw.RDS")) ------------------------------------------------------------------------------------------------------------------------ - Version: v1.0.2 - Last update: 2022-07-12 + Version: v1.0.3 + Last update: 2022-08-23 Written by: Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl). Description: Script to get some Athero-Express Biobank Study baseline characteristics. Minimum requirements: R version 3.4.3 (2017-06-30) -- 'Single Candle', Mac OS X El Capitan @@ -1200,6 +1200,7 @@ saveRDS(AEDB, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.raw.RDS")) _W_ **Changes log** + * v1.0.3 Updated baseline characteristics. * v1.0.2 Simplified the initial script. It now outputs the relevant R-objects (as .RDS). * v1.0.1 Update to main AEDB (there is an error in the Age-variable in the new version). * v1.0.0 Initial version. Add 'plaque vulnerability index', Fixed baseline table, added codes, and results. Major update to WORCS system. diff --git a/AEDB.EM.baseline.nb.html b/AEDB.EM.baseline.nb.html index 6645fca..fc620b1 100644 --- a/AEDB.EM.baseline.nb.html +++ b/AEDB.EM.baseline.nb.html @@ -11,7 +11,7 @@ - +
source("scripts/pack01.packages.R")
-* General packages...
+* General packages...
+These packages have more recent versions available.
+It is recommended to update all of them.
+Which would you like to update?
+
+1: All
+2: CRAN packages only
+3: None
+4: rlang (1.0.2 -> 1.0.4) [CRAN]
+5: pillar (1.7.0 -> 1.8.1) [CRAN]
+6: viridisLite (0.4.0 -> 0.4.1) [CRAN]
+7: farver (2.1.0 -> 2.1.1) [CRAN]
+8: tibble (3.1.7 -> 3.1.8) [CRAN]
+9: scales (1.2.0 -> 1.2.1) [CRAN]
+
+
+3
+ checking for file ‘/private/var/folders/qr/ycksfpsx091f_xhvzv9r35x00000gq/T/RtmpxOqdin/remotes10e0f4fc624be/thomasp85-patchwork-c14c960/DESCRIPTION’ ...
+
+✔ checking for file ‘/private/var/folders/qr/ycksfpsx091f_xhvzv9r35x00000gq/T/RtmpxOqdin/remotes10e0f4fc624be/thomasp85-patchwork-c14c960/DESCRIPTION’ (442ms)
+
+
+─ preparing ‘patchwork’:
+ checking DESCRIPTION meta-information ...
+
+✔ checking DESCRIPTION meta-information
+
+
+─ checking for LF line-endings in source and make files and shell scripts
+
+
+─ checking for empty or unneeded directories
+
+
+─ building ‘patchwork_1.1.2.9000.tar.gz’
+
+
+
+
+
+* installing *source* package ‘patchwork’ ...
+** using staged installation
+** R
+** byte-compile and prepare package for lazy loading
+** help
+*** installing help indices
+*** copying figures
+** building package indices
+** installing vignettes
+** testing if installed package can be loaded from temporary location
+** testing if installed package can be loaded from final location
+** testing if installed package keeps a record of temporary installation path
+* DONE (patchwork)
@@ -3055,11 +3110,11 @@
-= format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
- Today = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")
- Today.Report
-source("scripts/colors.R")
+= format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
+ Today = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")
+ Today.Report
+source("scripts/colors.R")
<- fread(paste0(ANALYSIS_loc, "/dataverse/EntropyMasker_image_files_used.txt")) EM_samples
<- fread(paste0(ANALYSIS_loc, "/dataverse/EntropyMasker_image_files_used.txt")) EM_samples
cat("* get Athero-Express Biobank Study Database...")
cat("* get Athero-Express Biobank Study Database...")
* get Athero-Express Biobank Study Database...
-# METHOD 1: It seems this method gives loads of errors and warnings, which all are hard to comprehend
-# or debug. We expect 3,527 samples, and 927 variables; we get 927 variables!!!
-# AEdata = as.data.table(read.spss(paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.sav"),
-# trim.factor.names = TRUE, trim_values = TRUE, # we trim spaces in values
-# reencode = TRUE, # we re-encode to the local locale encoding
-# add.undeclared.levels = "append", # we do *not* want to convert to R-factors
-# use.value.labels = FALSE, # we do *not* convert variables with value labels into R factors
-# use.missings = TRUE, sub = "NA", # we will set every missing variable to NA
-# duplicated.value.labels = "condense", # we will condense duplicated value labels
-# to.data.frame = TRUE))
-# AEdata.labels <- as.data.table(attr(AEdata, "variable.labels"))
-# names(AEdata.labels) <- "Variable"
-
-# METHOD 2: Using library("haven") importing seems flawless; best argument being:
-# we expect 3,527 samples and 888 variables, which is what you'd get with this method
-# So for now, METHOD 2 is prefered.
-#
-require(haven)
-
-# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2022_1_NEW_AtheroExpressDatabase_ScientificAE_15-02-2022.sav")) # something wrong with Age-variable
-# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_30-09-2020.sav")) # duplicate studynumbers in it
-<- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))
- AEDB
-# writing off the SPSS data to an Excel.
-# fwrite(AEdata, file = paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.values.xlsx"),
-# sep = ";", na = "NA", dec = ".", col.names = TRUE, row.names = FALSE,
-# dateTimeAs = "ISO", showProgress = TRUE, verbose = TRUE)
-# warnings()
-
-1:10, 1:10] AEDB[
# METHOD 1: It seems this method gives loads of errors and warnings, which all are hard to comprehend
+# or debug. We expect 3,527 samples, and 927 variables; we get 927 variables!!!
+# AEdata = as.data.table(read.spss(paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.sav"),
+# trim.factor.names = TRUE, trim_values = TRUE, # we trim spaces in values
+# reencode = TRUE, # we re-encode to the local locale encoding
+# add.undeclared.levels = "append", # we do *not* want to convert to R-factors
+# use.value.labels = FALSE, # we do *not* convert variables with value labels into R factors
+# use.missings = TRUE, sub = "NA", # we will set every missing variable to NA
+# duplicated.value.labels = "condense", # we will condense duplicated value labels
+# to.data.frame = TRUE))
+# AEdata.labels <- as.data.table(attr(AEdata, "variable.labels"))
+# names(AEdata.labels) <- "Variable"
+
+# METHOD 2: Using library("haven") importing seems flawless; best argument being:
+# we expect 3,527 samples and 888 variables, which is what you'd get with this method
+# So for now, METHOD 2 is prefered.
+#
+require(haven)
+
+# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2022_1_NEW_AtheroExpressDatabase_ScientificAE_15-02-2022.sav")) # something wrong with Age-variable
+# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_30-09-2020.sav")) # duplicate studynumbers in it
+<- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))
+ AEDB
+# writing off the SPSS data to an Excel.
+# fwrite(AEdata, file = paste0(INP_loc,"/2017-1NEW_AtheroExpressDatabase_ScientificAE_20171306_v1.0.values.xlsx"),
+# sep = ";", na = "NA", dec = ".", col.names = TRUE, row.names = FALSE,
+# dateTimeAs = "ISO", showProgress = TRUE, verbose = TRUE)
+# warnings()
+
+1:10, 1:10] AEDB[
dim(AEDB)
dim(AEDB)
[1] 3791 1091
@@ -3212,41 +3267,41 @@
-# Fix symptoms
-
-attach(AEDB)
-"Symptoms.5G"] <- NA
- AEDB[,$Symptoms.5G[sympt == 0] <- "Asymptomatic"
- AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
- AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
- AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
- AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
- AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"
- AEDB
-
-# AsymptSympt
-"AsymptSympt"] <- NA
- AEDB[,$AsymptSympt[sympt == -999] <- NA
- AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
- AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
- AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"
- AEDB
-# AsymptSympt
-"AsymptSympt2G"] <- NA
- AEDB[,$AsymptSympt2G[sympt == -999] <- NA
- AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
- AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"
- AEDB
-detach(AEDB)
-
-# table(AEDB$sympt, useNA = "ifany")
-# table(AEDB$AsymptSympt2G, useNA = "ifany")
-# table(AEDB$Symptoms.5G, useNA = "ifany")
-#
-# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
-# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
-table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
+# Fix symptoms
+
+attach(AEDB)
+"Symptoms.5G"] <- NA
+ AEDB[,$Symptoms.5G[sympt == 0] <- "Asymptomatic"
+ AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
+ AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
+ AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
+ AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
+ AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"
+ AEDB
+
+# AsymptSympt
+"AsymptSympt"] <- NA
+ AEDB[,$AsymptSympt[sympt == -999] <- NA
+ AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
+ AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
+ AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"
+ AEDB
+# AsymptSympt
+"AsymptSympt2G"] <- NA
+ AEDB[,$AsymptSympt2G[sympt == -999] <- NA
+ AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
+ AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"
+ AEDB
+detach(AEDB)
+
+# table(AEDB$sympt, useNA = "ifany")
+# table(AEDB$AsymptSympt2G, useNA = "ifany")
+# table(AEDB$Symptoms.5G, useNA = "ifany")
+#
+# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
+# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
+table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
@@ -3256,17 +3311,17 @@ Symptoms
<NA> 0 0 0 0 0 0 1103
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
-#
-# rm(AEDB.temp)
# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
+#
+# rm(AEDB.temp)
-$indexsymptoms_worst AEDB
+$indexsymptoms_worst AEDB
<labelled<double>[3791]>: Latest cerebrovascular symptoms (indication CEA).
@@ -3317,7 +3372,7 @@ Re-assessed symptoms
-$indexsymptoms_worst_4g AEDB
+$indexsymptoms_worst_4g AEDB
<labelled<double>[3791]>: symptoms strokefenotype en symptoms.4g .
@@ -3354,7 +3409,7 @@ Re-assessed symptoms
-$indexsymptoms_latest AEDB
+$indexsymptoms_latest AEDB
<labelled<double>[3791]>: Latest cerebrovascular symptoms (indication CEA).
@@ -3391,7 +3446,7 @@ Re-assessed symptoms
-$indexsymptoms_latest_4g AEDB
+$indexsymptoms_latest_4g AEDB
<labelled<double>[3791]>: symptoms strokefenotype en symptoms.4g .
@@ -3433,13 +3488,13 @@ Re-assessed symptoms
-cat("New 'worst' vs 'latest' symptom categories.\n")
+cat("New 'worst' vs 'latest' symptom categories.\n")
New 'worst' vs 'latest' symptom categories.
-table(as_factor(AEDB$indexsymptoms_worst_4g), as_factor(AEDB$indexsymptoms_latest_4g))
+table(as_factor(AEDB$indexsymptoms_worst_4g), as_factor(AEDB$indexsymptoms_latest_4g))
@@ -3451,14 +3506,14 @@ Re-assessed symptoms
unclear 0 0 0 0 55
-cat("\nNew 'worst' symptom categories.\n")
+cat("\nNew 'worst' symptom categories.\n")
New 'worst' symptom categories.
-table((AEDB$indexsymptoms_worst_4g))
+table((AEDB$indexsymptoms_worst_4g))
@@ -3466,14 +3521,14 @@ Re-assessed symptoms
1000 345 723 580 55
-cat("\nNew 'latest' symptom categories.\n")
+cat("\nNew 'latest' symptom categories.\n")
New 'latest' symptom categories.
-table(as_factor(AEDB$indexsymptoms_latest_4g))
+table(as_factor(AEDB$indexsymptoms_latest_4g))
@@ -3486,13 +3541,13 @@ Re-assessed symptoms
-cat("New 'latest' vs original symptom 2G categories.\n")
+cat("New 'latest' vs original symptom 2G categories.\n")
New 'latest' vs original symptom 2G categories.
-table((AEDB$indexsymptoms_latest_4g), AEDB$AsymptSympt2G)
+table((AEDB$indexsymptoms_latest_4g), AEDB$AsymptSympt2G)
@@ -3504,14 +3559,14 @@ Re-assessed symptoms
9 7 74
-cat("\nNew 'latest' vs original symptom 5G categories.\n")
+cat("\nNew 'latest' vs original symptom 5G categories.\n")
New 'latest' vs original symptom 5G categories.
-table((AEDB$indexsymptoms_latest_4g), AEDB$Symptoms.5G)
+table((AEDB$indexsymptoms_latest_4g), AEDB$Symptoms.5G)
@@ -3523,7 +3578,7 @@ Re-assessed symptoms
9 7 11 10 0 13 40
-
+
@@ -3550,25 +3605,25 @@ Re-assessed symptoms
-
-# Fix symptoms
-attach(AEDB)
-
-# Symptoms.Update2G
-"Symptoms.Update2G"] <- NA
- AEDB[,$Symptoms.Update2G[indexsymptoms_latest_4g == 0] <- "Asymptomatic"
- AEDB$Symptoms.Update2G[indexsymptoms_latest_4g == 1 | indexsymptoms_latest_4g == 2 | indexsymptoms_latest_4g == 3] <- "Symptomatic"
- AEDB$Symptoms.Update2G[indexsymptoms_latest_4g == 9 ] <- NA
- AEDB
-# Symptoms.Update3G
-"Symptoms.Update3G"] <- NA
- AEDB[,$Symptoms.Update3G[indexsymptoms_latest_4g == 0] <- "Asymptomatic"
- AEDB$Symptoms.Update3G[indexsymptoms_latest_4g == 1 | indexsymptoms_latest_4g == 2 | indexsymptoms_latest_4g == 3] <- "Symptomatic"
- AEDB$Symptoms.Update3G[indexsymptoms_latest_4g == 9 ] <- "Unclear"
- AEDB
-detach(AEDB)
-
-table(AEDB$Symptoms.Update2G, AEDB$Symptoms.5G, useNA = "ifany")
+
+# Fix symptoms
+attach(AEDB)
+
+# Symptoms.Update2G
+"Symptoms.Update2G"] <- NA
+ AEDB[,$Symptoms.Update2G[indexsymptoms_latest_4g == 0] <- "Asymptomatic"
+ AEDB$Symptoms.Update2G[indexsymptoms_latest_4g == 1 | indexsymptoms_latest_4g == 2 | indexsymptoms_latest_4g == 3] <- "Symptomatic"
+ AEDB$Symptoms.Update2G[indexsymptoms_latest_4g == 9 ] <- NA
+ AEDB
+# Symptoms.Update3G
+"Symptoms.Update3G"] <- NA
+ AEDB[,$Symptoms.Update3G[indexsymptoms_latest_4g == 0] <- "Asymptomatic"
+ AEDB$Symptoms.Update3G[indexsymptoms_latest_4g == 1 | indexsymptoms_latest_4g == 2 | indexsymptoms_latest_4g == 3] <- "Symptomatic"
+ AEDB$Symptoms.Update3G[indexsymptoms_latest_4g == 9 ] <- "Unclear"
+ AEDB
+detach(AEDB)
+
+table(AEDB$Symptoms.Update2G, AEDB$Symptoms.5G, useNA = "ifany")
@@ -3578,7 +3633,7 @@ Re-assessed symptoms
<NA> 7 11 10 0 13 40 1088
-table(AEDB$Symptoms.Update3G, AEDB$Symptoms.5G, useNA = "ifany")
+table(AEDB$Symptoms.Update3G, AEDB$Symptoms.5G, useNA = "ifany")
@@ -3597,16 +3652,16 @@ Other clinical characteristics
-
-# Fix diabetes
-attach(AEDB)
-"DiabetesStatus"] <- NA
- AEDB[,$DiabetesStatus[DM.composite == -999] <- NA
- AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
- AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
- AEDBdetach(AEDB)
-
-table(AEDB$DM.composite, AEDB$DiabetesStatus)
+
+# Fix diabetes
+attach(AEDB)
+"DiabetesStatus"] <- NA
+ AEDB[,$DiabetesStatus[DM.composite == -999] <- NA
+ AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
+ AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
+ AEDBdetach(AEDB)
+
+table(AEDB$DM.composite, AEDB$DiabetesStatus)
@@ -3615,16 +3670,16 @@ Other clinical characteristics
1 0 985
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# rm(AEDB.temp)
+# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# rm(AEDB.temp)
@@ -3644,51 +3699,51 @@ Other clinical characteristics
-require(labelled)
-$diet801 <- to_factor(AEDB$diet801)
- AEDB$diet802 <- to_factor(AEDB$diet802)
- AEDB$diet805 <- to_factor(AEDB$diet805)
- AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
- AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
- AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)
- AEDB
-# table(AEDB$diet801)
-# table(AEDB$diet802)
-# table(AEDB$SmokingReported)
-# table(AEDB$SmokerCurrent)
-# table(AEDB$SmokingYearOR)
-# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
-#
-# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))
-
-cat("\nFixing smoking status.\n")
+require(labelled)
+$diet801 <- to_factor(AEDB$diet801)
+ AEDB$diet802 <- to_factor(AEDB$diet802)
+ AEDB$diet805 <- to_factor(AEDB$diet805)
+ AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
+ AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
+ AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)
+ AEDB
+# table(AEDB$diet801)
+# table(AEDB$diet802)
+# table(AEDB$SmokingReported)
+# table(AEDB$SmokerCurrent)
+# table(AEDB$SmokingYearOR)
+# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
+#
+# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))
+
+cat("\nFixing smoking status.\n")
Fixing smoking status.
-attach(AEDB)
-"SmokerStatus"] <- NA
- AEDB[,$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
- AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
- AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
- AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
- AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
- AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
- AEDB# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
-detach(AEDB)
-
-cat("\n* Current smoking status.\n")
+attach(AEDB)
+"SmokerStatus"] <- NA
+ AEDB[,$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
+ AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
+ AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
+ AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
+ AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
+ AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
+ AEDB# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
+detach(AEDB)
+
+cat("\n* Current smoking status.\n")
* Current smoking status.
-table(AEDB$SmokerCurrent,
-useNA = "ifany",
- dnn = c("Current smoker"))
+table(AEDB$SmokerCurrent,
+useNA = "ifany",
+ dnn = c("Current smoker"))
Current smoker
@@ -3696,16 +3751,16 @@ Other clinical characteristics
0 2364 1308 119
-cat("\n* Updated smoking status.\n")
+cat("\n* Updated smoking status.\n")
* Updated smoking status.
-table(AEDB$SmokerStatus,
-useNA = "ifany",
- dnn = c("Updated smoking status"))
+table(AEDB$SmokerStatus,
+useNA = "ifany",
+ dnn = c("Updated smoking status"))
Updated smoking status
@@ -3713,16 +3768,16 @@ Other clinical characteristics
1308 1814 389 280
-cat("\n* Comparing to 'SmokerCurrent'.\n")
+cat("\n* Comparing to 'SmokerCurrent'.\n")
* Comparing to 'SmokerCurrent'.
-table(AEDB$SmokerStatus, AEDB$SmokerCurrent,
-useNA = "ifany",
- dnn = c("Updated smoking status", "Current smoker"))
+table(AEDB$SmokerStatus, AEDB$SmokerCurrent,
+useNA = "ifany",
+ dnn = c("Updated smoking status", "Current smoker"))
Current smoker
@@ -3733,16 +3788,16 @@ Other clinical characteristics
<NA> 0 161 0 119
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# rm(AEDB.temp)
+# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# rm(AEDB.temp)
@@ -3750,25 +3805,25 @@ Other clinical characteristics
-
-# Fix diabetes
-attach(AEDB)
-"AlcoholUse"] <- NA
- AEDB[,$AlcoholUse[diet810 == -999] <- NA
- AEDB$AlcoholUse[diet810 == 0] <- "No"
- AEDB$AlcoholUse[diet810 == 1] <- "Yes"
- AEDBdetach(AEDB)
-
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# rm(AEDB.temp)
+
+# Fix diabetes
+attach(AEDB)
+"AlcoholUse"] <- NA
+ AEDB[,$AlcoholUse[diet810 == -999] <- NA
+ AEDB$AlcoholUse[diet810 == 0] <- "No"
+ AEDB$AlcoholUse[diet810 == 1] <- "Yes"
+ AEDBdetach(AEDB)
+
+# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# rm(AEDB.temp)
@@ -3778,15 +3833,15 @@ Other clinical characteristics
-
-# Fix diabetes
-attach(AEDB)
-"MedHx_CVD"] <- NA
- AEDB[,$MedHx_CVD[CAD_history == 0 | Stroke_history == 0 | Peripheral.interv == 0] <- "No"
- AEDB$MedHx_CVD[CAD_history == 1 | Stroke_history == 1 | Peripheral.interv == 1] <- "yes"
- AEDBdetach(AEDB)
-
-table(AEDB$CAD_history)
+
+# Fix diabetes
+attach(AEDB)
+"MedHx_CVD"] <- NA
+ AEDB[,$MedHx_CVD[CAD_history == 0 | Stroke_history == 0 | Peripheral.interv == 0] <- "No"
+ AEDB$MedHx_CVD[CAD_history == 1 | Stroke_history == 1 | Peripheral.interv == 1] <- "yes"
+ AEDBdetach(AEDB)
+
+table(AEDB$CAD_history)
@@ -3794,7 +3849,7 @@ Other clinical characteristics
2430 1285
-table(AEDB$Stroke_history)
+table(AEDB$Stroke_history)
@@ -3802,7 +3857,7 @@ Other clinical characteristics
2763 947
-table(AEDB$Peripheral.interv)
+table(AEDB$Peripheral.interv)
@@ -3810,7 +3865,7 @@ Other clinical characteristics
2579 1099
-table(AEDB$MedHx_CVD)
+table(AEDB$MedHx_CVD)
@@ -3818,16 +3873,16 @@ Other clinical characteristics
1309 2475
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# rm(AEDB.temp)
+# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# rm(AEDB.temp)
@@ -3849,26 +3904,26 @@ Plaque phenotypes
-
-# Fix plaquephenotypes
-attach(AEDB)
-"OverallPlaquePhenotype"] <- NA
- AEDB[,$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
- AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
- AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
- AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
- AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
- AEDBdetach(AEDB)
-
-# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
-# require(labelled)
-# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
-# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
-# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
-#
-# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
-#
-# rm(AEDB.temp)
+
+# Fix plaquephenotypes
+attach(AEDB)
+"OverallPlaquePhenotype"] <- NA
+ AEDB[,$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
+ AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
+ AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
+ AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
+ AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
+ AEDBdetach(AEDB)
+
+# AEDB.temp <- subset(AEDB, select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
+# require(labelled)
+# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
+# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
+# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
+#
+# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
+#
+# rm(AEDB.temp)
@@ -3877,236 +3932,236 @@ Plaque phenotypes
-$macmean0 <- as.numeric(AEDB$macmean0)
- AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
- AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
- AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
- AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)
- AEDB
-$MAC_rankNorm <- qnorm((rank(AEDB$macmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$macmean0)))
- AEDB$SMC_rankNorm <- qnorm((rank(AEDB$smcmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$smcmean0)))
- AEDB$Neutrophils_rankNorm <- qnorm((rank(AEDB$neutrophils, na.last = "keep") - 0.5) / sum(!is.na(AEDB$neutrophils)))
- AEDB$MastCells_rankNorm <- qnorm((rank(AEDB$Mast_cells_plaque, na.last = "keep") - 0.5) / sum(!is.na(AEDB$Mast_cells_plaque)))
- AEDB$VesselDensity_rankNorm <- qnorm((rank(AEDB$vessel_density_averaged, na.last = "keep") - 0.5) / sum(!is.na(AEDB$vessel_density_averaged))) AEDB
+$macmean0 <- as.numeric(AEDB$macmean0)
+ AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
+ AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
+ AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
+ AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)
+ AEDB
+$MAC_rankNorm <- qnorm((rank(AEDB$macmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$macmean0)))
+ AEDB$SMC_rankNorm <- qnorm((rank(AEDB$smcmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$smcmean0)))
+ AEDB$Neutrophils_rankNorm <- qnorm((rank(AEDB$neutrophils, na.last = "keep") - 0.5) / sum(!is.na(AEDB$neutrophils)))
+ AEDB$MastCells_rankNorm <- qnorm((rank(AEDB$Mast_cells_plaque, na.last = "keep") - 0.5) / sum(!is.na(AEDB$Mast_cells_plaque)))
+ AEDB$VesselDensity_rankNorm <- qnorm((rank(AEDB$vessel_density_averaged, na.last = "keep") - 0.5) / sum(!is.na(AEDB$vessel_density_averaged))) AEDB
-library(labelled)
-$Gender <- to_factor(AEDB$Gender)
- AEDBlibrary(patchwork)
-
-<- ggpubr::gghistogram(AEDB, "macmean0",
- p1 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "% of macrophages (CD68)",
- xlab = "% per region of interest",
- ggtheme = theme_minimal())
+library(labelled)
+$Gender <- to_factor(AEDB$Gender)
+ AEDBlibrary(patchwork)
+
+<- ggpubr::gghistogram(AEDB, "macmean0",
+ p1 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "% of macrophages (CD68)",
+ xlab = "% per region of interest",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-<- ggpubr::gghistogram(AEDB, "MAC_rankNorm",
- p2 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "% of macrophages (CD68)",
- xlab = "% per region of interest\ninverse-rank normalized number",
- ggtheme = theme_minimal())
+<- ggpubr::gghistogram(AEDB, "MAC_rankNorm",
+ p2 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "% of macrophages (CD68)",
+ xlab = "% per region of interest\ninverse-rank normalized number",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-| p2 p1
+| p2 p1

-
-<- ggpubr::gghistogram(AEDB, "smcmean0",
- p1 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "% of smooth muscle cells (SMA)",
- xlab = "% per region of interest",
- ggtheme = theme_minimal())
+
+<- ggpubr::gghistogram(AEDB, "smcmean0",
+ p1 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "% of smooth muscle cells (SMA)",
+ xlab = "% per region of interest",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-<- ggpubr::gghistogram(AEDB, "SMC_rankNorm",
- p2 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "% of smooth muscle cells (SMA)",
- xlab = "% per region of interest\ninverse-rank normalized number",
- ggtheme = theme_minimal())
+<- ggpubr::gghistogram(AEDB, "SMC_rankNorm",
+ p2 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "% of smooth muscle cells (SMA)",
+ xlab = "% per region of interest\ninverse-rank normalized number",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-| p2 p1
+| p2 p1

-
-
-<- ggpubr::gghistogram(AEDB, "neutrophils",
- p1 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of neutrophils (CD66b)",
- xlab = "counts per plaque",
- ggtheme = theme_minimal())
+
+
+<- ggpubr::gghistogram(AEDB, "neutrophils",
+ p1 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of neutrophils (CD66b)",
+ xlab = "counts per plaque",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-<- ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm",
- p2 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of neutrophils (CD66b)",
- xlab = "counts per plaque\ninverse-rank normalized number",
- ggtheme = theme_minimal())
+<- ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm",
+ p2 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of neutrophils (CD66b)",
+ xlab = "counts per plaque\ninverse-rank normalized number",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-| p2 p1
+| p2 p1

-
-
-<- ggpubr::gghistogram(AEDB, "Mast_cells_plaque",
- p1 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of mast cells",
- xlab = "counts per plaque",
- ggtheme = theme_minimal())
+
+
+<- ggpubr::gghistogram(AEDB, "Mast_cells_plaque",
+ p1 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of mast cells",
+ xlab = "counts per plaque",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-<- ggpubr::gghistogram(AEDB, "MastCells_rankNorm",
- p2 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of mast cells",
- xlab = "counts per plaque\ninverse-rank normalized number",
- ggtheme = theme_minimal())
+<- ggpubr::gghistogram(AEDB, "MastCells_rankNorm",
+ p2 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of mast cells",
+ xlab = "counts per plaque\ninverse-rank normalized number",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-| p2 p1
+| p2 p1

-
-
-<- ggpubr::gghistogram(AEDB, "vessel_density_averaged",
- p1 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of intraplaque neovessels",
- xlab = "counts per 3-4 hotspots",
- ggtheme = theme_minimal())
+
+
+<- ggpubr::gghistogram(AEDB, "vessel_density_averaged",
+ p1 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of intraplaque neovessels",
+ xlab = "counts per 3-4 hotspots",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-<- ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm",
- p2 # y = "..count..",
- color = "white",
- fill = "Gender",
- palette = c("#1290D9", "#DB003F"),
- add = "median",
- #add_density = TRUE,
- rug = TRUE,
- #add.params = list(color = "black", linetype = 2),
- title = "number of intraplaque neovessels",
- xlab = "counts per 3-4 hotspots\ninverse-rank normalized number",
- ggtheme = theme_minimal())
+<- ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm",
+ p2 # y = "..count..",
+ color = "white",
+ fill = "Gender",
+ palette = c("#1290D9", "#DB003F"),
+ add = "median",
+ #add_density = TRUE,
+ rug = TRUE,
+ #add.params = list(color = "black", linetype = 2),
+ title = "number of intraplaque neovessels",
+ xlab = "counts per 3-4 hotspots\ninverse-rank normalized number",
+ ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
-| p2 p1
+| p2 p1

-
-rm(p1, p2)
+
+rm(p1, p2)
@@ -4115,17 +4170,17 @@ Plaque phenotypes
-# Plaque vulnerability
-require(labelled)
-$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
- AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
- AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
- AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
- AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
- AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
- AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
- AEDB
-table(AEDB$Macrophages.bin)
+# Plaque vulnerability
+require(labelled)
+$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
+ AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
+ AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
+ AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
+ AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
+ AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
+ AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
+ AEDB
+table(AEDB$Macrophages.bin)
@@ -4133,7 +4188,7 @@ Plaque phenotypes
1602 1215
-table(AEDB$Fat.bin_10)
+table(AEDB$Fat.bin_10)
@@ -4141,7 +4196,7 @@ Plaque phenotypes
1226 1628
-table(AEDB$Collagen.bin)
+table(AEDB$Collagen.bin)
@@ -4149,7 +4204,7 @@ Plaque phenotypes
540 2297
-table(AEDB$SMC.bin)
+table(AEDB$SMC.bin)
@@ -4157,7 +4212,7 @@ Plaque phenotypes
870 1962
-table(AEDB$IPH.bin)
+table(AEDB$IPH.bin)
@@ -4165,74 +4220,74 @@ Plaque phenotypes
1223 1628
-# SPSS code
-
-#
-# *** syntax- Plaque vulnerability**.
-# COMPUTE Macro_instab = -999.
-# IF macrophages.bin=2 Macro_instab=1.
-# IF macrophages.bin=1 Macro_instab=0.
-# EXECUTE.
-#
-# COMPUTE Fat10_instab = -999.
-# IF Fat.bin_10=2 Fat10_instab=1.
-# IF Fat.bin_10=1 Fat10_instab=0.
-# EXECUTE.
-#
-# COMPUTE coll_instab=-999.
-# IF Collagen.bin=2 coll_instab=0.
-# IF Collagen.bin=1 coll_instab=1.
-# EXECUTE.
-#
-#
-# COMPUTE SMC_instab=-999.
-# IF SMC.bin=2 SMC_instab=0.
-# IF SMC.bin=1 SMC_instab=1.
-# EXECUTE.
-#
-# COMPUTE IPH_instab=-999.
-# IF IPH.bin=0 IPH_instab=0.
-# IF IPH.bin=1 IPH_instab=1.
-# EXECUTE.
-#
-# COMPUTE Instability=Macro_instab + Fat10_instab + coll_instab + SMC_instab + IPH_instab.
-# EXECUTE.
-
-# Fix plaquephenotypes
-attach(AEDB)
-# mac instability
-"MAC_Instability"] <- NA
- AEDB[,$MAC_Instability[Macrophages.bin == -999] <- NA
- AEDB$MAC_Instability[Macrophages.bin == "no/minor"] <- 0
- AEDB$MAC_Instability[Macrophages.bin == "moderate/heavy"] <- 1
- AEDB
-# fat instability
-"FAT10_Instability"] <- NA
- AEDB[,$FAT10_Instability[Fat.bin_10 == -999] <- NA
- AEDB$FAT10_Instability[Fat.bin_10 == " <10%"] <- 0
- AEDB$FAT10_Instability[Fat.bin_10 == " >10%"] <- 1
- AEDB
-# col instability
-"COL_Instability"] <- NA
- AEDB[,$COL_Instability[Collagen.bin == -999] <- NA
- AEDB$COL_Instability[Collagen.bin == "no/minor"] <- 1
- AEDB$COL_Instability[Collagen.bin == "moderate/heavy"] <- 0
- AEDB
-# smc instability
-"SMC_Instability"] <- NA
- AEDB[,$SMC_Instability[SMC.bin == -999] <- NA
- AEDB$SMC_Instability[SMC.bin == "no/minor"] <- 1
- AEDB$SMC_Instability[SMC.bin == "moderate/heavy"] <- 0
- AEDB
-# iph instability
-"IPH_Instability"] <- NA
- AEDB[,$IPH_Instability[IPH.bin == -999] <- NA
- AEDB$IPH_Instability[IPH.bin == "no"] <- 0
- AEDB$IPH_Instability[IPH.bin == "yes"] <- 1
- AEDB
-detach(AEDB)
-
-table(AEDB$MAC_Instability, useNA = "ifany")
+# SPSS code
+
+#
+# *** syntax- Plaque vulnerability**.
+# COMPUTE Macro_instab = -999.
+# IF macrophages.bin=2 Macro_instab=1.
+# IF macrophages.bin=1 Macro_instab=0.
+# EXECUTE.
+#
+# COMPUTE Fat10_instab = -999.
+# IF Fat.bin_10=2 Fat10_instab=1.
+# IF Fat.bin_10=1 Fat10_instab=0.
+# EXECUTE.
+#
+# COMPUTE coll_instab=-999.
+# IF Collagen.bin=2 coll_instab=0.
+# IF Collagen.bin=1 coll_instab=1.
+# EXECUTE.
+#
+#
+# COMPUTE SMC_instab=-999.
+# IF SMC.bin=2 SMC_instab=0.
+# IF SMC.bin=1 SMC_instab=1.
+# EXECUTE.
+#
+# COMPUTE IPH_instab=-999.
+# IF IPH.bin=0 IPH_instab=0.
+# IF IPH.bin=1 IPH_instab=1.
+# EXECUTE.
+#
+# COMPUTE Instability=Macro_instab + Fat10_instab + coll_instab + SMC_instab + IPH_instab.
+# EXECUTE.
+
+# Fix plaquephenotypes
+attach(AEDB)
+# mac instability
+"MAC_Instability"] <- NA
+ AEDB[,$MAC_Instability[Macrophages.bin == -999] <- NA
+ AEDB$MAC_Instability[Macrophages.bin == "no/minor"] <- 0
+ AEDB$MAC_Instability[Macrophages.bin == "moderate/heavy"] <- 1
+ AEDB
+# fat instability
+"FAT10_Instability"] <- NA
+ AEDB[,$FAT10_Instability[Fat.bin_10 == -999] <- NA
+ AEDB$FAT10_Instability[Fat.bin_10 == " <10%"] <- 0
+ AEDB$FAT10_Instability[Fat.bin_10 == " >10%"] <- 1
+ AEDB
+# col instability
+"COL_Instability"] <- NA
+ AEDB[,$COL_Instability[Collagen.bin == -999] <- NA
+ AEDB$COL_Instability[Collagen.bin == "no/minor"] <- 1
+ AEDB$COL_Instability[Collagen.bin == "moderate/heavy"] <- 0
+ AEDB
+# smc instability
+"SMC_Instability"] <- NA
+ AEDB[,$SMC_Instability[SMC.bin == -999] <- NA
+ AEDB$SMC_Instability[SMC.bin == "no/minor"] <- 1
+ AEDB$SMC_Instability[SMC.bin == "moderate/heavy"] <- 0
+ AEDB
+# iph instability
+"IPH_Instability"] <- NA
+ AEDB[,$IPH_Instability[IPH.bin == -999] <- NA
+ AEDB$IPH_Instability[IPH.bin == "no"] <- 0
+ AEDB$IPH_Instability[IPH.bin == "yes"] <- 1
+ AEDB
+detach(AEDB)
+
+table(AEDB$MAC_Instability, useNA = "ifany")
@@ -4240,7 +4295,7 @@ Plaque phenotypes
1602 1215 974
-table(AEDB$FAT10_Instability, useNA = "ifany")
+table(AEDB$FAT10_Instability, useNA = "ifany")
@@ -4248,7 +4303,7 @@ Plaque phenotypes
1226 1628 937
-table(AEDB$COL_Instability, useNA = "ifany")
+table(AEDB$COL_Instability, useNA = "ifany")
@@ -4256,7 +4311,7 @@ Plaque phenotypes
2297 540 954
-table(AEDB$SMC_Instability, useNA = "ifany")
+table(AEDB$SMC_Instability, useNA = "ifany")
@@ -4264,7 +4319,7 @@ Plaque phenotypes
1962 870 959
-table(AEDB$IPH_Instability, useNA = "ifany")
+table(AEDB$IPH_Instability, useNA = "ifany")
@@ -4272,11 +4327,11 @@ Plaque phenotypes
1223 1628 940
-# creating vulnerability index
-<- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
- AEDB
- )
-table(AEDB$Plaque_Vulnerability_Index, useNA = "ifany")
+# creating vulnerability index
+<- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
+ AEDB
+ )
+table(AEDB$Plaque_Vulnerability_Index, useNA = "ifany")
@@ -4284,7 +4339,7 @@ Plaque phenotypes
1324 655 728 676 298 110
-# str(AEDB$Plaque_Vulnerability_Index)
+# str(AEDB$Plaque_Vulnerability_Index)
@@ -4319,86 +4374,86 @@ Prepare baseline summary
-cat("====================================================================================================\n")
+cat("====================================================================================================\n")
====================================================================================================
-cat("SELECTION THE SHIZZLE\n")
+cat("SELECTION THE SHIZZLE\n")
SELECTION THE SHIZZLE
-### Artery levels
-# AEdata$Artery_summary:
-# value label
-# NOT USE - 0 No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA
-# USE - 1 carotid (left & right)
-# USE - 2 femoral/iliac (left, right or both sides)
-# NOT USE - 3 other carotid arteries (common, external)
-# NOT USE - 4 carotid bypass and injury (left, right or both sides)
-# NOT USE - 5 aneurysmata (carotid & femoral)
-# NOT USE - 6 aorta
-# NOT USE - 7 other arteries (renal, popliteal, vertebral)
-# NOT USE - 8 femoral bypass, angioseal and injury (left, right or both sides)
-
-### AEdata$informedconsent
-# value label
-# NOT USE - -999 missing
-# NOT USE - 0 no, died
-# USE - 1 yes
-# USE - 2 yes, health treatment when possible
-# USE - 3 yes, no health treatment
-# USE - 4 yes, no health treatment, no commercial business
-# NOT USE - 5 yes, no tissue, no commerical business
-# NOT USE - 6 yes, no tissue, no questionnaires, no medical info, no commercial business
-# USE - 7 yes, no questionnaires, no health treatment, no commercial business
-# USE - 8 yes, no questionnaires, health treatment when possible
-# NOT USE - 9 yes, no tissue, no questionnaires, no health treatment, no commerical business
-# USE - 10 yes, no health treatment, no medical info, no commercial business
-# NOT USE - 11 yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business
-# USE - 12 yes, no questionnaires, no health treatment
-# NOT USE - 13 yes, no tissue, no health treatment
-# NOT USE - 14 yes, no tissue, no questionnaires
-# NOT USE - 15 yes, no tissue, health treatment when possible
-# NOT USE - 16 yes, no tissue
-# USE - 17 yes, no commerical business
-# USE - 18 yes, health treatment when possible, no commercial business
-# USE - 19 yes, no medical info, no commercial business
-# USE - 20 yes, no questionnaires
-# NOT USE - 21 yes, no tissue, no questionnaires, no health treatment, no medical info
-# NOT USE - 22 yes, no tissue, no questionnaires, no health treatment, no commercial business
-# USE - 23 yes, no medical info
-# USE - 24 yes, no questionnaires, no commercial business
-# USE - 25 yes, no questionnaires, no health treatment, no medical info
-# USE - 26 yes, no questionnaires, health treatment when possible, no commercial business
-# USE - 27 yes, no health treatment, no medical info
-# NOT USE - 28 no, doesn't want to
-# NOT USE - 29 no, unable to sign
-# NOT USE - 30 no, no reaction
-# NOT USE - 31 no, lost
-# NOT USE - 32 no, too old
-# NOT USE - 34 yes, no medical info, health treatment when possible
-# NOT USE - 35 no (never asked for IC because there was no tissue)
-# USE - 36 yes, no medical info, no commercial business, health treatment when possible
-# NOT USE - 37 no, endpoint
-# USE - 38 wil niets invullen, wel alles gebruiken
-# USE - 39 second informed concents: yes, no commercial business
-# NOT USE - 40 nooit geincludeerd
-
-cat("- sanity checking PRIOR to selection")
+### Artery levels
+# AEdata$Artery_summary:
+# value label
+# NOT USE - 0 No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA
+# USE - 1 carotid (left & right)
+# USE - 2 femoral/iliac (left, right or both sides)
+# NOT USE - 3 other carotid arteries (common, external)
+# NOT USE - 4 carotid bypass and injury (left, right or both sides)
+# NOT USE - 5 aneurysmata (carotid & femoral)
+# NOT USE - 6 aorta
+# NOT USE - 7 other arteries (renal, popliteal, vertebral)
+# NOT USE - 8 femoral bypass, angioseal and injury (left, right or both sides)
+
+### AEdata$informedconsent
+# value label
+# NOT USE - -999 missing
+# NOT USE - 0 no, died
+# USE - 1 yes
+# USE - 2 yes, health treatment when possible
+# USE - 3 yes, no health treatment
+# USE - 4 yes, no health treatment, no commercial business
+# NOT USE - 5 yes, no tissue, no commerical business
+# NOT USE - 6 yes, no tissue, no questionnaires, no medical info, no commercial business
+# USE - 7 yes, no questionnaires, no health treatment, no commercial business
+# USE - 8 yes, no questionnaires, health treatment when possible
+# NOT USE - 9 yes, no tissue, no questionnaires, no health treatment, no commerical business
+# USE - 10 yes, no health treatment, no medical info, no commercial business
+# NOT USE - 11 yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business
+# USE - 12 yes, no questionnaires, no health treatment
+# NOT USE - 13 yes, no tissue, no health treatment
+# NOT USE - 14 yes, no tissue, no questionnaires
+# NOT USE - 15 yes, no tissue, health treatment when possible
+# NOT USE - 16 yes, no tissue
+# USE - 17 yes, no commerical business
+# USE - 18 yes, health treatment when possible, no commercial business
+# USE - 19 yes, no medical info, no commercial business
+# USE - 20 yes, no questionnaires
+# NOT USE - 21 yes, no tissue, no questionnaires, no health treatment, no medical info
+# NOT USE - 22 yes, no tissue, no questionnaires, no health treatment, no commercial business
+# USE - 23 yes, no medical info
+# USE - 24 yes, no questionnaires, no commercial business
+# USE - 25 yes, no questionnaires, no health treatment, no medical info
+# USE - 26 yes, no questionnaires, health treatment when possible, no commercial business
+# USE - 27 yes, no health treatment, no medical info
+# NOT USE - 28 no, doesn't want to
+# NOT USE - 29 no, unable to sign
+# NOT USE - 30 no, no reaction
+# NOT USE - 31 no, lost
+# NOT USE - 32 no, too old
+# NOT USE - 34 yes, no medical info, health treatment when possible
+# NOT USE - 35 no (never asked for IC because there was no tissue)
+# USE - 36 yes, no medical info, no commercial business, health treatment when possible
+# NOT USE - 37 no, endpoint
+# USE - 38 wil niets invullen, wel alles gebruiken
+# USE - 39 second informed concents: yes, no commercial business
+# NOT USE - 40 nooit geincludeerd
+
+cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
-library(data.table)
-require(labelled)
-<- to_factor(AEDB$Gender)
- ae.gender <- to_factor(AEDB$Hospital)
- ae.hospital table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
+library(data.table)
+require(labelled)
+<- to_factor(AEDB$Gender)
+ ae.gender <- to_factor(AEDB$Hospital)
+ ae.hospital table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
Hospital
@@ -4407,8 +4462,8 @@ Prepare baseline summary
male 1211 1420
-<- to_factor(AEDB$Artery_summary)
- ae.artery table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
+<- to_factor(AEDB$Artery_summary)
+ ae.artery table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
Artery
@@ -4424,109 +4479,109 @@ Prepare baseline summary
femoral bypass, angioseal and injury (left, right or both sides) 4 2
-rm(ae.gender, ae.hospital, ae.artery)
-
-# I change numeric and factors manually because, well, I wouldn't know how to fix it otherwise
-# to have this 'tibble' work with 'tableone'... :-)
-
-$Age <- as.numeric(AEDB$Age)
- AEDB$diastoli <- as.numeric(AEDB$diastoli)
- AEDB$systolic <- as.numeric(AEDB$systolic)
- AEDB
-$TC_finalCU <- as.numeric(AEDB$TC_finalCU)
- AEDB$LDL_finalCU <- as.numeric(AEDB$LDL_finalCU)
- AEDB$HDL_finalCU <- as.numeric(AEDB$HDL_finalCU)
- AEDB$TG_finalCU <- as.numeric(AEDB$TG_finalCU)
- AEDB
-$TC_final <- as.numeric(AEDB$TC_final)
- AEDB$LDL_final <- as.numeric(AEDB$LDL_final)
- AEDB$HDL_final <- as.numeric(AEDB$HDL_final)
- AEDB$TG_final <- as.numeric(AEDB$TG_final)
- AEDB
-$Age <- as.numeric(AEDB$Age)
- AEDB$GFR_MDRD <- as.numeric(AEDB$GFR_MDRD)
- AEDB$BMI <- as.numeric(AEDB$BMI)
- AEDB$eCigarettes <- as.numeric(AEDB$eCigarettes)
- AEDB$ePackYearsSmoking <- as.numeric(AEDB$ePackYearsSmoking)
- AEDB$EP_composite_time <- as.numeric(AEDB$EP_composite_time)
- AEDB$EP_major_time <- as.numeric(AEDB$EP_major_time)
- AEDB
-require(labelled)
-$Artery_summary <- to_factor(AEDB$Artery_summary)
- AEDB$ORyear <- to_factor(AEDB$ORyear)
- AEDB$Gender <- to_factor(AEDB$Gender)
- AEDB$Hospital <- to_factor(AEDB$Hospital)
- AEDB$KDOQI <- to_factor(AEDB$KDOQI)
- AEDB$BMI_WHO <- to_factor(AEDB$BMI_WHO)
- AEDB$DiabetesStatus <- to_factor(AEDB$DiabetesStatus)
- AEDB$SmokerStatus <- to_factor(AEDB$SmokerStatus)
- AEDB$AlcoholUse <- to_factor(AEDB$AlcoholUse)
- AEDB
-$Hypertension.selfreport <- to_factor(AEDB$Hypertension1)
- AEDB$Hypertension.selfreportdrug <- to_factor(AEDB$Hypertension2)
- AEDB$Hypertension.composite <- to_factor(AEDB$Hypertension.composite)
- AEDB$Hypertension.drugs <- to_factor(AEDB$Hypertension.drugs)
- AEDB
-$Med.anticoagulants <- to_factor(AEDB$Med.anticoagulants)
- AEDB$Med.all.antiplatelet <- to_factor(AEDB$Med.all.antiplatelet)
- AEDB$Med.Statin.LLD <- to_factor(AEDB$Med.Statin.LLD)
- AEDB
-$Stroke_Dx <- to_factor(AEDB$Stroke_Dx)
- AEDB$CAD_history <- to_factor(AEDB$CAD_history)
- AEDB$PAOD <- to_factor(AEDB$PAOD)
- AEDB$Peripheral.interv <- to_factor(AEDB$Peripheral.interv)
- AEDB
-$sympt <- to_factor(AEDB$sympt)
- AEDB$Symptoms.3g <- to_factor(AEDB$Symptoms.3g)
- AEDB$Symptoms.4g <- to_factor(AEDB$Symptoms.4g)
- AEDB$Symptoms.5G <- to_factor(AEDB$Symptoms.5G)
- AEDB$AsymptSympt <- to_factor(AEDB$AsymptSympt)
- AEDB$AsymptSympt2G <- to_factor(AEDB$AsymptSympt2G)
- AEDB$Symptoms.Update2G <- to_factor(AEDB$Symptoms.Update2G)
- AEDB$Symptoms.Update3G <- to_factor(AEDB$Symptoms.Update3G)
- AEDB
-$restenos <- to_factor(AEDB$restenos)
- AEDB$stenose <- to_factor(AEDB$stenose)
- AEDB$EP_composite <- to_factor(AEDB$EP_composite)
- AEDB$EP_major <- to_factor(AEDB$EP_major)
- AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
- AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
- AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
- AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
- AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
- AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
- AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
- AEDB$OverallPlaquePhenotype <- to_factor(AEDB$OverallPlaquePhenotype)
- AEDB$Plaque_Vulnerability_Index <- to_factor(AEDB$Plaque_Vulnerability_Index)
- AEDB
-$Artery_summary <- to_factor(AEDB$Artery_summary)
- AEDB
-$informedconsent <- to_factor(AEDB$informedconsent)
- AEDB
-<- subset(AEDB,
- AEDB.full != "missing" & # we are really strict in selecting based on 'informed consent'!
- informedconsent != "no, died" &
- informedconsent != "yes, no tissue, no commerical business" &
- informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
- informedconsent != "yes, no tissue, no health treatment" &
- informedconsent != "yes, no tissue, no questionnaires" &
- informedconsent != "yes, no tissue, health treatment when possible" &
- informedconsent != "yes, no tissue" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
- informedconsent != "no, doesn't want to" &
- informedconsent != "no, unable to sign" &
- informedconsent != "no, no reaction" &
- informedconsent != "no, lost" &
- informedconsent != "no, too old" &
- informedconsent != "yes, no medical info, health treatment when possible" &
- informedconsent != "no (never asked for IC because there was no tissue)" &
- informedconsent != "no, endpoint" &
- informedconsent != "nooit geincludeerd")
- informedconsent # AEDB.CEA[1:10, 1:10]
-dim(AEDB.full)
+rm(ae.gender, ae.hospital, ae.artery)
+
+# I change numeric and factors manually because, well, I wouldn't know how to fix it otherwise
+# to have this 'tibble' work with 'tableone'... :-)
+
+$Age <- as.numeric(AEDB$Age)
+ AEDB$diastoli <- as.numeric(AEDB$diastoli)
+ AEDB$systolic <- as.numeric(AEDB$systolic)
+ AEDB
+$TC_finalCU <- as.numeric(AEDB$TC_finalCU)
+ AEDB$LDL_finalCU <- as.numeric(AEDB$LDL_finalCU)
+ AEDB$HDL_finalCU <- as.numeric(AEDB$HDL_finalCU)
+ AEDB$TG_finalCU <- as.numeric(AEDB$TG_finalCU)
+ AEDB
+$TC_final <- as.numeric(AEDB$TC_final)
+ AEDB$LDL_final <- as.numeric(AEDB$LDL_final)
+ AEDB$HDL_final <- as.numeric(AEDB$HDL_final)
+ AEDB$TG_final <- as.numeric(AEDB$TG_final)
+ AEDB
+$Age <- as.numeric(AEDB$Age)
+ AEDB$GFR_MDRD <- as.numeric(AEDB$GFR_MDRD)
+ AEDB$BMI <- as.numeric(AEDB$BMI)
+ AEDB$eCigarettes <- as.numeric(AEDB$eCigarettes)
+ AEDB$ePackYearsSmoking <- as.numeric(AEDB$ePackYearsSmoking)
+ AEDB$EP_composite_time <- as.numeric(AEDB$EP_composite_time)
+ AEDB$EP_major_time <- as.numeric(AEDB$EP_major_time)
+ AEDB
+require(labelled)
+$Artery_summary <- to_factor(AEDB$Artery_summary)
+ AEDB$ORyear <- to_factor(AEDB$ORyear)
+ AEDB$Gender <- to_factor(AEDB$Gender)
+ AEDB$Hospital <- to_factor(AEDB$Hospital)
+ AEDB$KDOQI <- to_factor(AEDB$KDOQI)
+ AEDB$BMI_WHO <- to_factor(AEDB$BMI_WHO)
+ AEDB$DiabetesStatus <- to_factor(AEDB$DiabetesStatus)
+ AEDB$SmokerStatus <- to_factor(AEDB$SmokerStatus)
+ AEDB$AlcoholUse <- to_factor(AEDB$AlcoholUse)
+ AEDB
+$Hypertension.selfreport <- to_factor(AEDB$Hypertension1)
+ AEDB$Hypertension.selfreportdrug <- to_factor(AEDB$Hypertension2)
+ AEDB$Hypertension.composite <- to_factor(AEDB$Hypertension.composite)
+ AEDB$Hypertension.drugs <- to_factor(AEDB$Hypertension.drugs)
+ AEDB
+$Med.anticoagulants <- to_factor(AEDB$Med.anticoagulants)
+ AEDB$Med.all.antiplatelet <- to_factor(AEDB$Med.all.antiplatelet)
+ AEDB$Med.Statin.LLD <- to_factor(AEDB$Med.Statin.LLD)
+ AEDB
+$Stroke_Dx <- to_factor(AEDB$Stroke_Dx)
+ AEDB$CAD_history <- to_factor(AEDB$CAD_history)
+ AEDB$PAOD <- to_factor(AEDB$PAOD)
+ AEDB$Peripheral.interv <- to_factor(AEDB$Peripheral.interv)
+ AEDB
+$sympt <- to_factor(AEDB$sympt)
+ AEDB$Symptoms.3g <- to_factor(AEDB$Symptoms.3g)
+ AEDB$Symptoms.4g <- to_factor(AEDB$Symptoms.4g)
+ AEDB$Symptoms.5G <- to_factor(AEDB$Symptoms.5G)
+ AEDB$AsymptSympt <- to_factor(AEDB$AsymptSympt)
+ AEDB$AsymptSympt2G <- to_factor(AEDB$AsymptSympt2G)
+ AEDB$Symptoms.Update2G <- to_factor(AEDB$Symptoms.Update2G)
+ AEDB$Symptoms.Update3G <- to_factor(AEDB$Symptoms.Update3G)
+ AEDB
+$restenos <- to_factor(AEDB$restenos)
+ AEDB$stenose <- to_factor(AEDB$stenose)
+ AEDB$EP_composite <- to_factor(AEDB$EP_composite)
+ AEDB$EP_major <- to_factor(AEDB$EP_major)
+ AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
+ AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
+ AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
+ AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
+ AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
+ AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
+ AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
+ AEDB$OverallPlaquePhenotype <- to_factor(AEDB$OverallPlaquePhenotype)
+ AEDB$Plaque_Vulnerability_Index <- to_factor(AEDB$Plaque_Vulnerability_Index)
+ AEDB
+$Artery_summary <- to_factor(AEDB$Artery_summary)
+ AEDB
+$informedconsent <- to_factor(AEDB$informedconsent)
+ AEDB
+<- subset(AEDB,
+ AEDB.full != "missing" & # we are really strict in selecting based on 'informed consent'!
+ informedconsent != "no, died" &
+ informedconsent != "yes, no tissue, no commerical business" &
+ informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
+ informedconsent != "yes, no tissue, no health treatment" &
+ informedconsent != "yes, no tissue, no questionnaires" &
+ informedconsent != "yes, no tissue, health treatment when possible" &
+ informedconsent != "yes, no tissue" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
+ informedconsent != "no, doesn't want to" &
+ informedconsent != "no, unable to sign" &
+ informedconsent != "no, no reaction" &
+ informedconsent != "no, lost" &
+ informedconsent != "no, too old" &
+ informedconsent != "yes, no medical info, health treatment when possible" &
+ informedconsent != "no (never asked for IC because there was no tissue)" &
+ informedconsent != "no, endpoint" &
+ informedconsent != "nooit geincludeerd")
+ informedconsent # AEDB.CEA[1:10, 1:10]
+dim(AEDB.full)
[1] 3458 1114
@@ -4536,52 +4591,53 @@ Prepare baseline summary
-cat("===========================================================================================\n")
+cat("===========================================================================================\n")
===========================================================================================
-cat("CREATE BASELINE TABLE\n")
+cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
-
-# Baseline table variables
-= c("Hospital",
- basetable_vars "Artery_summary",
- "Age", "Gender")
- # "ORyear",
- # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU",
- # "TC_final", "LDL_final", "HDL_final", "TG_final",
- # "hsCRP_plasma",
- # "systolic", "diastoli", "GFR_MDRD", "BMI",
- # "KDOQI", "BMI_WHO",
- # "SmokerStatus", "AlcoholUse",
- # "DiabetesStatus",
- # "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs",
- # "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD",
- # "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
- # "Symptoms.Update2G",
- # "Symptoms.Update3G",
- # "restenos", "stenose",
- # "CAD_history", "PAOD", "Peripheral.interv",
- # "EP_composite", "EP_composite_time", "EP_major", "EP_major_time",
- # "MAC_rankNorm", "SMC_rankNorm", "Macrophages.bin", "SMC.bin",
- # "Neutrophils_rankNorm", "MastCells_rankNorm",
- # "IPH.bin", "VesselDensity_rankNorm",
- # "Calc.bin", "Collagen.bin",
- # "Fat.bin_10", "Fat.bin_40",
- # "OverallPlaquePhenotype", "Plaque_Vulnerability_Index")
-
-= c("Hospital",
- basetable_bin "Artery_summary",
- "Gender")
- # basetable_bin
-
-= basetable_vars[!basetable_vars %in% basetable_bin]
- basetable_con # basetable_con
+
+# Baseline table variables
+= c("Hospital",
+ basetable_vars "Artery_summary",
+ "Age", "Gender",
+ # "ORyear",
+ # "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU",
+ # "TC_final", "LDL_final", "HDL_final", "TG_final",
+ # "hsCRP_plasma",
+ # "systolic", "diastoli", "GFR_MDRD", "BMI",
+ # "KDOQI", "BMI_WHO",
+ # "SmokerStatus", "AlcoholUse",
+ # "DiabetesStatus",
+ # "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs",
+ # "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD",
+ # "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
+ # "Symptoms.Update2G",
+ # "Symptoms.Update3G",
+ # "restenos", "stenose",
+ # "CAD_history", "PAOD", "Peripheral.interv",
+ # "EP_composite", "EP_composite_time", "EP_major", "EP_major_time",
+ # "MAC_rankNorm", "SMC_rankNorm", "Macrophages.bin", "SMC.bin",
+ # "Neutrophils_rankNorm", "MastCells_rankNorm",
+ # "IPH.bin", "VesselDensity_rankNorm",
+ # "Calc.bin", "Collagen.bin",
+ # "Fat.bin_10", "Fat.bin_40",
+ "OverallPlaquePhenotype" )
+ # , "Plaque_Vulnerability_Index")
+
+= c("Hospital",
+ basetable_bin "Artery_summary",
+ "Gender")
+ # basetable_bin
+
+= basetable_vars[!basetable_vars %in% basetable_bin]
+ basetable_con # basetable_con
@@ -4593,34 +4649,38 @@ Athero-Express Biobank Study Baseline Characteristics
-# Create baseline tables
-# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
-= print(CreateTableOne(vars = basetable_vars,
- AEDB.tableOne factorVars = basetable_bin,
- # strata = "Symptoms.4g",
- data = AEDB.full, includeNA = TRUE),
- nonnormal = c(), missing = TRUE,
- quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
- format = "pf",
- contDigits = 3)[,1:3]
+# Create baseline tables
+# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
+= print(CreateTableOne(vars = basetable_vars,
+ AEDB.tableOne factorVars = basetable_bin,
+ # strata = "Symptoms.4g",
+ data = AEDB.full, includeNA = TRUE),
+ nonnormal = c(), missing = TRUE,
+ quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
+ format = "pf",
+ contDigits = 3)[,1:3]
-
-
- level Overall Missing
- n 3458
- Hospital % (freq) St. Antonius, Nieuwegein 45.3 (1567) 0.0
- UMC Utrecht 54.7 (1891)
- Artery_summary % (freq) carotid (left & right) 69.0 (2387) 0.0
- femoral/iliac (left, right or both sides) 28.8 ( 995)
- other carotid arteries (common, external) 1.3 ( 45)
- carotid bypass and injury (left, right or both sides) 0.2 ( 7)
- aneurysmata (carotid & femoral) 0.0 ( 1)
- aorta 0.2 ( 6)
- other arteries (renal, popliteal, vertebral) 0.3 ( 12)
- femoral bypass, angioseal and injury (left, right or both sides) 0.1 ( 5)
- Age (mean (SD)) 68.733 (9.214) 0.0
- Gender % (freq) female 29.7 (1026) 0.0
- male 70.3 (2432)
+
+
+ level Overall Missing
+ n 3458
+ Hospital % (freq) St. Antonius, Nieuwegein 45.3 (1567) 0.0
+ UMC Utrecht 54.7 (1891)
+ Artery_summary % (freq) carotid (left & right) 69.0 (2387) 0.0
+ femoral/iliac (left, right or both sides) 28.8 ( 995)
+ other carotid arteries (common, external) 1.3 ( 45)
+ carotid bypass and injury (left, right or both sides) 0.2 ( 7)
+ aneurysmata (carotid & femoral) 0.0 ( 1)
+ aorta 0.2 ( 6)
+ other arteries (renal, popliteal, vertebral) 0.3 ( 12)
+ femoral bypass, angioseal and injury (left, right or both sides) 0.1 ( 5)
+ Age (mean (SD)) 68.733 (9.214) 0.0
+ Gender % (freq) female 29.7 (1026) 0.0
+ male 70.3 (2432)
+ OverallPlaquePhenotype % (freq) atheromatous 14.7 ( 507) 25.9
+ fibroatheromatous 22.2 ( 769)
+ fibrous 37.2 (1285)
+ <NA> 25.9 ( 897)
@@ -4631,94 +4691,98 @@ Match samples used
-# Remove duplicate rows of the dataframe
-library(dplyr)
-<- EM_samples %>% select(., "Studynumber") %>%
- temp distinct(.)
-
-<- merge(temp,
- AEDB_EM
- AEDB,by.x = "Studynumber",
- by.y = "STUDY_NUMBER",
- sort = FALSE)
-
-<- subset(AEDB_EM,
- AEDB_EM.full != "missing" & # we are really strict in selecting based on 'informed consent'!
- informedconsent != "no, died" &
- informedconsent != "yes, no tissue, no commerical business" &
- informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
- informedconsent != "yes, no tissue, no health treatment" &
- informedconsent != "yes, no tissue, no questionnaires" &
- informedconsent != "yes, no tissue, health treatment when possible" &
- informedconsent != "yes, no tissue" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
- informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
- informedconsent != "no, doesn't want to" &
- informedconsent != "no, unable to sign" &
- informedconsent != "no, no reaction" &
- informedconsent != "no, lost" &
- informedconsent != "no, too old" &
- informedconsent != "yes, no medical info, health treatment when possible" &
- informedconsent != "no (never asked for IC because there was no tissue)" &
- informedconsent != "no, endpoint" &
- informedconsent != "nooit geincludeerd")
- informedconsent # AEDB_EM.full[1:10, 1:10]
-
-rm(temp)
+# Remove duplicate rows of the dataframe
+library(dplyr)
+<- EM_samples %>% select(., "Studynumber") %>%
+ temp distinct(.)
+
+<- merge(temp,
+ AEDB_EM
+ AEDB,by.x = "Studynumber",
+ by.y = "STUDY_NUMBER",
+ sort = FALSE)
+
+<- subset(AEDB_EM,
+ AEDB_EM.full != "missing" & # we are really strict in selecting based on 'informed consent'!
+ informedconsent != "no, died" &
+ informedconsent != "yes, no tissue, no commerical business" &
+ informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
+ informedconsent != "yes, no tissue, no health treatment" &
+ informedconsent != "yes, no tissue, no questionnaires" &
+ informedconsent != "yes, no tissue, health treatment when possible" &
+ informedconsent != "yes, no tissue" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
+ informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
+ informedconsent != "no, doesn't want to" &
+ informedconsent != "no, unable to sign" &
+ informedconsent != "no, no reaction" &
+ informedconsent != "no, lost" &
+ informedconsent != "no, too old" &
+ informedconsent != "yes, no medical info, health treatment when possible" &
+ informedconsent != "no (never asked for IC because there was no tissue)" &
+ informedconsent != "no, endpoint" &
+ informedconsent != "nooit geincludeerd")
+ informedconsent # AEDB_EM.full[1:10, 1:10]
+
+rm(temp)
-# Create baseline tables
-# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
-= print(CreateTableOne(vars = basetable_vars,
- AEDB_EM.full.tableOne factorVars = basetable_bin,
- # strata = "Symptoms.4g",
- data = AEDB_EM.full, includeNA = TRUE),
- nonnormal = c(), missing = TRUE,
- quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
- format = "pf",
- contDigits = 3)[,1:3]
+# Create baseline tables
+# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
+= print(CreateTableOne(vars = basetable_vars,
+ AEDB_EM.full.tableOne factorVars = basetable_bin,
+ # strata = "Symptoms.4g",
+ data = AEDB_EM.full, includeNA = TRUE),
+ nonnormal = c(), missing = TRUE,
+ quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
+ format = "pf",
+ contDigits = 3)[,1:3]
-
-
- level Overall Missing
- n 56
- Hospital % (freq) St. Antonius, Nieuwegein 21.4 (12) 0.0
- UMC Utrecht 78.6 (44)
- Artery_summary % (freq) carotid (left & right) 85.7 (48) 0.0
- femoral/iliac (left, right or both sides) 12.5 ( 7)
- other arteries (renal, popliteal, vertebral) 1.8 ( 1)
- Age (mean (SD)) 69.500 (9.260) 0.0
- Gender % (freq) female 33.9 (19) 0.0
- male 66.1 (37)
+
+
+ level Overall Missing
+ n 56
+ Hospital % (freq) St. Antonius, Nieuwegein 21.4 (12) 0.0
+ UMC Utrecht 78.6 (44)
+ Artery_summary % (freq) carotid (left & right) 85.7 (48) 0.0
+ femoral/iliac (left, right or both sides) 12.5 ( 7)
+ other arteries (renal, popliteal, vertebral) 1.8 ( 1)
+ Age (mean (SD)) 69.500 (9.260) 0.0
+ Gender % (freq) female 33.9 (19) 0.0
+ male 66.1 (37)
+ OverallPlaquePhenotype % (freq) atheromatous 21.4 (12) 17.9
+ fibroatheromatous 19.6 (11)
+ fibrous 41.1 (23)
+ <NA> 17.9 (10)
-
-= c("Hospital",
- basetable_vars "Artery_summary")
-
-= c("Hospital",
- basetable_bin "Artery_summary")
-
-# Create baseline tables
-# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
-= print(CreateTableOne(vars = basetable_vars,
- AEDB_EM.tableOne factorVars = basetable_bin,
- # strata = "Symptoms.4g",
- data = AEDB_EM, includeNA = TRUE),
- nonnormal = c(), missing = TRUE,
- quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
- format = "pf",
- contDigits = 3)[,1:3]
+
+= c("Hospital",
+ basetable_vars "Artery_summary")
+
+= c("Hospital",
+ basetable_bin "Artery_summary")
+
+# Create baseline tables
+# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
+= print(CreateTableOne(vars = basetable_vars,
+ AEDB_EM.tableOne factorVars = basetable_bin,
+ # strata = "Symptoms.4g",
+ data = AEDB_EM, includeNA = TRUE),
+ nonnormal = c(), missing = TRUE,
+ quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
+ format = "pf",
+ contDigits = 3)[,1:3]
@@ -4739,28 +4803,32 @@ Baseline writing
Study.
-
-# Write basetable
-
-require(openxlsx)
-
-write.xlsx(as.data.frame(AEDB.tableOne),
-file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.xlsx"),
- rowNames = TRUE,
- colNames = TRUE,
- sheetName = "AE_Base", overwrite = TRUE)
-
-write.xlsx(as.data.frame(AEDB_EM.tableOne),
-file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.EM.59.BaselineTable.xlsx"),
- rowNames = TRUE,
- colNames = TRUE,
- sheetName = "AE_Base_EM_59", overwrite = TRUE)
-
-write.xlsx(as.data.frame(AEDB_EM.full.tableOne),
-file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.EM.56.BaselineTable.xlsx"),
- rowNames = TRUE,
- colNames = TRUE,
- sheetName = "AE_Base_EM_56", overwrite = TRUE)
+
+# Write basetable
+
+require(openxlsx)
+
+
+Loading required package: openxlsx
+
+
+write.xlsx(as.data.frame(AEDB.tableOne),
+file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.xlsx"),
+ rowNames = TRUE,
+ colNames = TRUE,
+ sheetName = "AE_Base", overwrite = TRUE)
+
+write.xlsx(as.data.frame(AEDB_EM.tableOne),
+file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.EM.59.BaselineTable.xlsx"),
+ rowNames = TRUE,
+ colNames = TRUE,
+ sheetName = "AE_Base_EM_59", overwrite = TRUE)
+
+write.xlsx(as.data.frame(AEDB_EM.full.tableOne),
+file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.EM.56.BaselineTable.xlsx"),
+ rowNames = TRUE,
+ colNames = TRUE,
+ sheetName = "AE_Base_EM_56", overwrite = TRUE)
@@ -4769,9 +4837,9 @@ Baseline writing
-saveRDS(AEDB_EM.full, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.EM.FULL.RDS"))
-saveRDS(AEDB.full, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.FULL.RDS"))
-saveRDS(AEDB, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.raw.RDS"))
+saveRDS(AEDB_EM.full, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.EM.FULL.RDS"))
+saveRDS(AEDB.full, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.FULL.RDS"))
+saveRDS(AEDB, file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AEDB.raw.RDS"))
@@ -4780,8 +4848,8 @@ Baseline writing
Session information
-Version: v1.0.2
-Last update: 2022-07-12
+Version: v1.0.3
+Last update: 2022-08-23
Written by: Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description: Script to get some Athero-Express Biobank Study baseline characteristics.
Minimum requirements: R version 3.4.3 (2017-06-30) -- 'Single Candle', Mac OS X El Capitan
@@ -4797,6 +4865,7 @@ Session information
_W_
**Changes log**
+* v1.0.3 Updated baseline characteristics.
* v1.0.2 Simplified the initial script. It now outputs the relevant R-objects (as .RDS).
* v1.0.1 Update to main AEDB (there is an error in the Age-variable in the new version).
* v1.0.0 Initial version. Add 'plaque vulnerability index', Fixed baseline table, added codes, and results. Major update to WORCS system.
@@ -4804,9 +4873,9 @@ Session information
-sessionInfo()
+sessionInfo()
-
+
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin21.5.0 (64-bit)
Running under: macOS Ventura 13.0
@@ -4821,32 +4890,32 @@ Session information
[1] grid tools stats graphics grDevices utils datasets methods base
other attached packages:
- [1] openxlsx_4.2.5 patchwork_1.1.0.9000 labelled_2.9.1 sjPlot_2.8.10 UpSetR_1.4.0 ggpubr_0.4.0
- [7] forestplot_2.0.1 checkmate_2.1.0 magrittr_2.0.3 pheatmap_1.0.12 devtools_2.4.3 usethis_2.1.6
-[13] BlandAltmanLeh_0.3.1 tableone_0.13.2 haven_2.5.0 eeptools_1.2.4 DT_0.23 knitr_1.39
-[19] forcats_0.5.1 stringr_1.4.0 purrr_0.3.4 tibble_3.1.7 ggplot2_3.3.6 tidyverse_1.3.1
-[25] data.table_1.14.2 naniar_0.6.1 tidyr_1.2.0 dplyr_1.0.9 optparse_1.7.1 readr_2.1.2
-[31] R.utils_2.11.0 R.oo_1.25.0 R.methodsS3_1.8.2 credentials_1.3.2
+ [1] openxlsx_4.2.5 sjPlot_2.8.10 UpSetR_1.4.0 ggpubr_0.4.0 forestplot_2.0.1 checkmate_2.1.0
+ [7] magrittr_2.0.3 pheatmap_1.0.12 devtools_2.4.3 usethis_2.1.6 BlandAltmanLeh_0.3.1 tableone_0.13.2
+[13] haven_2.5.0 eeptools_1.2.4 DT_0.23 knitr_1.39 forcats_0.5.1 stringr_1.4.0
+[19] purrr_0.3.4 tibble_3.1.7 ggplot2_3.3.6 tidyverse_1.3.1 data.table_1.14.2 naniar_0.6.1
+[25] tidyr_1.2.0 dplyr_1.0.9 optparse_1.7.1 readr_2.1.2 R.utils_2.11.0 R.oo_1.25.0
+[31] R.methodsS3_1.8.2 credentials_1.3.2
loaded via a namespace (and not attached):
[1] readxl_1.4.0 backports_1.4.1 plyr_1.8.7 sp_1.5-0 splines_4.2.1 TH.data_1.1-1 digest_0.6.29
- [8] htmltools_0.5.2 fansi_1.0.3 memoise_2.0.1 remotes_2.4.2 tzdb_0.3.0 modelr_0.1.8 sandwich_3.0-2
+ [8] htmltools_0.5.2 fansi_1.0.3 memoise_2.0.1 tzdb_0.3.0 remotes_2.4.2 modelr_0.1.8 sandwich_3.0-2
[15] askpass_1.1 prettyunits_1.1.1 colorspace_2.0-3 rvest_1.0.2 mitools_2.4 xfun_0.31 callr_3.7.0
[22] crayon_1.5.1 jsonlite_1.8.0 lme4_1.1-29 survival_3.3-1 zoo_1.8-10 glue_1.6.2 gtable_0.3.0
[29] emmeans_1.7.5 sjstats_0.18.1 sjmisc_2.8.9 car_3.1-0 pkgbuild_1.3.1 abind_1.4-5 scales_1.2.0
- [36] mvtnorm_1.1-3 DBI_1.1.3 rstatix_0.7.0 ggeffects_1.1.2 Rcpp_1.0.8.3 xtable_1.8-4 performance_0.9.1
+ [36] mvtnorm_1.1-3 DBI_1.1.3 ggeffects_1.1.2 rstatix_0.7.0 Rcpp_1.0.8.3 performance_0.9.1 xtable_1.8-4
[43] proxy_0.4-27 foreign_0.8-82 survey_4.1-1 vcd_1.4-10 datawizard_0.4.1 htmlwidgets_1.5.4 httr_1.4.3
- [50] getopt_1.20.3 RColorBrewer_1.1-3 ellipsis_0.3.2 farver_2.1.0 pkgconfig_2.0.3 sass_0.4.1 dbplyr_2.2.0
- [57] utf8_1.2.2 labeling_0.4.2 tidyselect_1.1.2 rlang_1.0.2 effectsize_0.7.0 munsell_0.5.0 cellranger_1.1.0
- [64] cachem_1.0.6 cli_3.3.0 generics_0.1.2 sjlabelled_1.2.0 broom_0.8.0 evaluate_0.15 fastmap_1.1.0
- [71] arm_1.12-2 yaml_2.3.5 sys_3.4 processx_3.6.1 fs_1.5.2 zip_2.2.0 pander_0.6.5
- [78] visdat_0.5.3 nlme_3.1-157 xml2_1.3.3 brio_1.1.3 compiler_4.2.1 rstudioapi_0.13 curl_4.3.2
- [85] e1071_1.7-11 testthat_3.1.4 ggsignif_0.6.3 reprex_2.0.1 bslib_0.3.1 stringi_1.7.6 ps_1.7.1
- [92] parameters_0.18.1 desc_1.4.1 lattice_0.20-45 Matrix_1.4-1 nloptr_2.0.3 vctrs_0.4.1 pillar_1.7.0
- [99] lifecycle_1.0.1 jquerylib_0.1.4 lmtest_0.9-40 estimability_1.3 maptools_1.1-4 insight_0.17.1 R6_2.5.1
-[106] gridExtra_2.3 sessioninfo_1.2.2 codetools_0.2-18 boot_1.3-28 MASS_7.3-57 assertthat_0.2.1 pkgload_1.2.4
-[113] openssl_2.0.2 rprojroot_2.0.3 withr_2.5.0 multcomp_1.4-19 bayestestR_0.12.1 hms_1.1.1 class_7.3-20
-[120] coda_0.19-4 minqa_1.2.4 rmarkdown_2.14 carData_3.0-5 lubridate_1.8.0
+ [50] getopt_1.20.3 RColorBrewer_1.1-3 ellipsis_0.3.2 pkgconfig_2.0.3 dbplyr_2.2.0 utf8_1.2.2 tidyselect_1.1.2
+ [57] rlang_1.0.2 effectsize_0.7.0 munsell_0.5.0 cellranger_1.1.0 cachem_1.0.6 cli_3.3.0 generics_0.1.2
+ [64] sjlabelled_1.2.0 broom_0.8.0 evaluate_0.15 fastmap_1.1.0 arm_1.12-2 yaml_2.3.5 sys_3.4
+ [71] processx_3.6.1 fs_1.5.2 zip_2.2.0 pander_0.6.5 visdat_0.5.3 nlme_3.1-157 xml2_1.3.3
+ [78] brio_1.1.3 compiler_4.2.1 rstudioapi_0.13 curl_4.3.2 e1071_1.7-11 testthat_3.1.4 ggsignif_0.6.3
+ [85] reprex_2.0.1 stringi_1.7.6 ps_1.7.1 parameters_0.18.1 desc_1.4.1 lattice_0.20-45 Matrix_1.4-1
+ [92] nloptr_2.0.3 vctrs_0.4.1 pillar_1.7.0 lifecycle_1.0.1 lmtest_0.9-40 estimability_1.3 maptools_1.1-4
+ [99] insight_0.17.1 R6_2.5.1 gridExtra_2.3 codetools_0.2-18 sessioninfo_1.2.2 boot_1.3-28 MASS_7.3-57
+[106] assertthat_0.2.1 pkgload_1.2.4 openssl_2.0.2 rprojroot_2.0.3 withr_2.5.0 multcomp_1.4-19 bayestestR_0.12.1
+[113] hms_1.1.1 labelled_2.9.1 class_7.3-20 coda_0.19-4 minqa_1.2.4 rmarkdown_2.14 carData_3.0-5
+[120] lubridate_1.8.0
@@ -4856,7 +4925,7 @@ Saving environment
-save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".AEDB.EM.baseline.RData"))
+save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".AEDB.EM.baseline.RData"))
@@ -4874,7 +4943,7 @@ Saving environment
-LS0tCnRpdGxlOiAiQmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIgphdXRob3I6ICJbU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiwgUGhEXShodHRwczovL3N3dmFuZGVybGFhbi5naXRodWIuaW8pIHwgQHN3dmFuZGVybGFhbiB8IHMudy52YW5kZXJsYWFuQGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNhY2hlOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29sbGFwc2U6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWcuYWxpZ246IGNlbnRlcgogICAgZmlnX2NhcHRpb246IHllcwogICAgZmlnX2hlaWdodDogNgogICAgZmlnX3JldGluYTogMgogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogbHVtZW4KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogeWVzCm1haW5mb250OiBBcmlhbApzdWJ0aXRsZTogQWNjb21wYW55aW5nICdFbnRyb3B5TWFza2VyJwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCiMgYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgojIGtuaXQ6IHdvcmNzOjpjaXRlX2FsbAotLS0KCiMgR2VuZXJhbCBTZXR1cApXZSB3aWxsIGNsZWFuIHRoZSBlbnZpcm9ubWVudCwgc2V0dXAgdGhlIGxvY2F0aW9ucywgZGVmaW5lIGNvbG9ycywgYW5kIGNyZWF0ZSBhIGRhdGVzdGFtcC4KCl9DbGVhbiB0aGUgZW52aXJvbm1lbnQuXwpgYGB7ciBlY2hvID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQpgYGAKCl9TZXQgbG9jYXRpb25zIGFuZCB3b3JraW5nIGRpcmVjdG9yaWVzLi4uXwpgYGB7ciBMb2NhbFN5c3RlbSwgZWNobyA9IEZBTFNFfQpzb3VyY2UoInNjcmlwdHMvbG9jYWwuc3lzdGVtLlIiKQoKYGBgCgpfLi4uIGEgcGFja2FnZS1pbnN0YWxsYXRpb24gZnVuY3Rpb24gLi4uXwpgYGB7ciBGdW5jdGlvbjogaW5zdGFsbGF0aW9uc30Kc291cmNlKCJzY3JpcHRzL2Z1bmN0aW9ucy5SIikKCmBgYAoKCl8uLi4gYW5kIGxvYWQgdGhvc2UgcGFja2FnZXMuXwpgYGB7ciBsb2FkaW5nX3BhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoInNjcmlwdHMvcGFjazAxLnBhY2thZ2VzLlIiKQoKCmBgYAoKX1dlIHdpbGwgY3JlYXRlIGEgZGF0ZXN0YW1wIGFuZCBkZWZpbmUgdGhlIFV0cmVjaHQgU2NpZW5jZSBQYXJrIENvbG91ciBTY2hlbWVfLgpgYGB7ciBTZXR0aW5nOiBDb2xvcnN9CgpUb2RheSA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJVklbSVkIikKVG9kYXkuUmVwb3J0ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlQSwgJUIgJWQsICVZIikKCnNvdXJjZSgic2NyaXB0cy9jb2xvcnMuUiIpCgpgYGAKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CiMgZnVydGhlciBkZWZpbmUgc29tZSBrbml0ci1vcHRpb25zLgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWd1cmVzLycsIAogICAgICAgICAgICAgICAgICAgICAgd3dhcm5pbmcgPSBUUlVFLCAjIHNob3cgd2FybmluZ3MgZHVyaW5nIGNvZGVib29rIGdlbmVyYXRpb24KICBtZXNzYWdlID0gVFJVRSwgIyBzaG93IG1lc3NhZ2VzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgZXJyb3IgPSBUUlVFLCAjIGRvIG5vdCBpbnRlcnJ1cHQgY29kZWJvb2sgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGVycm9ycywKICAgICAgICAgICAgICAgICMgdXN1YWxseSBiZXR0ZXIgZm9yIGRlYnVnZ2luZwogIGVjaG8gPSBUUlVFLCAgIyBzaG93IFIgY29kZQogICAgICAgICAgICAgICAgICAgICAgZXZhbCA9IFRSVUUpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCnBhbmRlcjo6cGFuZGVyT3B0aW9ucygidGFibGUuc3BsaXQudGFibGUiLCBJbmYpCmBgYAoKIyBUaGlzIG5vdGVib29rIAoKSW4gdGhpcyBub3RlYm9vayB3ZSBjcmVhdGUgYSBiYXNlbGluZSB0YWJsZSBvZiB0aGUgc2FtcGxlcyB1c2VkIGluICoqYEVudHJvcHlNYXNrZXJgKiouIAoKIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5CgpUaGUgWypBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5IChBRSkqXShodHRwczovL2RvaS5vcmcvMTAuMTAwNy9zMTA1NjQtMDA0LTIzMDQtNikgY29udGFpbnMgcGxhcXVlIG1hdGVyaWFsIG9mIHBhdGllbnRzIHRoYXQgdW5kZXJ3ZW50IGVuZGFydGVyZWN0b215YXQgdHdvIER1dGNoIHRlcnRpYXJ5IHJlZmVycmFsIGNlbnRlcnMuIERldGFpbHMgb2YgdGhlIHN0dWR5IGRlc2lnbiB3ZXJlIGRlc2NyaWJlZCBiZWZvcmUuIEJyaWVmbHksIGJsb29kIGFuZCBwbGFxdWUgbWF0ZXJpYWwgd2VyZSBvYnRhaW5lZCBkdXJpbmcgZW5kYXJ0ZXJlY3RvbXkgYW5kIHN0b3JlZCBhdCAtODAg4oSDLiBBbGwgcGF0aWVudHMgcHJvdmlkZWQgaW5mb3JtZWQgY29uc2VudCBhbmQgdGhlIHN0dWR5IHdhcyBhcHByb3ZlZCBieSB0aGUgbWVkaWNhbCBldGhpY3MgY29tbWl0dGVlLgoKIyMgTG9hZCByZWxldmFudCBzYW1wbGVzCgpgYGB7cn0KRU1fc2FtcGxlcyA8LSBmcmVhZChwYXN0ZTAoQU5BTFlTSVNfbG9jLCAiL2RhdGF2ZXJzZS9FbnRyb3B5TWFza2VyX2ltYWdlX2ZpbGVzX3VzZWQudHh0IikpCmBgYAoKIyMgTG9hZCBkYXRhCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgY2xpbmljYWwgYW5kIGJpb2JhbmsgZGF0YS4KCmBgYHtyIExvYWRBRURCfQpjYXQoIiogZ2V0IEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgRGF0YWJhc2UuLi4iKQojIE1FVEhPRCAxOiBJdCBzZWVtcyB0aGlzIG1ldGhvZCBnaXZlcyBsb2FkcyBvZiBlcnJvcnMgYW5kIHdhcm5pbmdzLCB3aGljaCBhbGwgYXJlIGhhcmQgdG8gY29tcHJlaGVuZAojICAgICAgICAgICBvciBkZWJ1Zy4gV2UgZXhwZWN0IDMsNTI3IHNhbXBsZXMsIGFuZCA5MjcgdmFyaWFibGVzOyB3ZSBnZXQgOTI3IHZhcmlhYmxlcyEhIQojIEFFZGF0YSA9IGFzLmRhdGEudGFibGUocmVhZC5zcHNzKHBhc3RlMChJTlBfbG9jLCIvMjAxNy0xTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMjAxNzEzMDZfdjEuMC5zYXYiKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltLmZhY3Rvci5uYW1lcyA9IFRSVUUsIHRyaW1fdmFsdWVzID0gVFJVRSwgIyB3ZSB0cmltIHNwYWNlcyBpbiB2YWx1ZXMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWVuY29kZSA9IFRSVUUsICMgd2UgcmUtZW5jb2RlIHRvIHRoZSBsb2NhbCBsb2NhbGUgZW5jb2RpbmcKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQudW5kZWNsYXJlZC5sZXZlbHMgPSAiYXBwZW5kIiwgIyB3ZSBkbyAqbm90KiB3YW50IHRvIGNvbnZlcnQgdG8gUi1mYWN0b3JzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLnZhbHVlLmxhYmVscyA9IEZBTFNFLCAjIHdlIGRvICpub3QqIGNvbnZlcnQgdmFyaWFibGVzIHdpdGggdmFsdWUgbGFiZWxzIGludG8gUiBmYWN0b3JzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLm1pc3NpbmdzID0gVFJVRSwgc3ViID0gIk5BIiwgIyB3ZSB3aWxsIHNldCBldmVyeSBtaXNzaW5nIHZhcmlhYmxlIHRvIE5BCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZC52YWx1ZS5sYWJlbHMgPSAiY29uZGVuc2UiLCAjIHdlIHdpbGwgY29uZGVuc2UgZHVwbGljYXRlZCB2YWx1ZSBsYWJlbHMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5kYXRhLmZyYW1lID0gVFJVRSkpCiMgQUVkYXRhLmxhYmVscyA8LSBhcy5kYXRhLnRhYmxlKGF0dHIoQUVkYXRhLCAidmFyaWFibGUubGFiZWxzIikpCiMgbmFtZXMoQUVkYXRhLmxhYmVscykgPC0gIlZhcmlhYmxlIgoKIyBNRVRIT0QgMjogVXNpbmcgbGlicmFyeSgiaGF2ZW4iKSBpbXBvcnRpbmcgc2VlbXMgZmxhd2xlc3M7IGJlc3QgYXJndW1lbnQgYmVpbmc6CiMgICAgICAgICAgIHdlIGV4cGVjdCAzLDUyNyBzYW1wbGVzIGFuZCA4ODggdmFyaWFibGVzLCB3aGljaCBpcyB3aGF0IHlvdSdkIGdldCB3aXRoIHRoaXMgbWV0aG9kCiMgICAgICAgICAgIFNvIGZvciBub3csIE1FVEhPRCAyIGlzIHByZWZlcmVkLiAKIyAgICAgICAgICAgIApyZXF1aXJlKGhhdmVuKQoKIyBBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAyMl8xX05FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzE1LTAyLTIwMjIuc2F2IikpICMgc29tZXRoaW5nIHdyb25nIHdpdGggQWdlLXZhcmlhYmxlCiMgQUVEQiA8LSBoYXZlbjo6cmVhZF9zYXYocGFzdGUwKEFFREJfbG9jLCAiLzIwMjBfMV9ORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8zMC0wOS0yMDIwLnNhdiIpKSAjIGR1cGxpY2F0ZSBzdHVkeW51bWJlcnMgaW4gaXQKQUVEQiA8LSBoYXZlbjo6cmVhZF9zYXYocGFzdGUwKEFFREJfbG9jLCAiLzIwMjBfMV9ORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8xNi0wMy0yMDIwLnNhdiIpKQoKIyB3cml0aW5nIG9mZiB0aGUgU1BTUyBkYXRhIHRvIGFuIEV4Y2VsLgojIGZ3cml0ZShBRWRhdGEsIGZpbGUgPSBwYXN0ZTAoSU5QX2xvYywiLzIwMTctMU5FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzIwMTcxMzA2X3YxLjAudmFsdWVzLnhsc3giKSwgCiMgICAgICAgIHNlcCA9ICI7IiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIGNvbC5uYW1lcyA9IFRSVUUsIHJvdy5uYW1lcyA9IEZBTFNFLAojICAgICAgICBkYXRlVGltZUFzID0gIklTTyIsIHNob3dQcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQojIHdhcm5pbmdzKCkKCkFFREJbMToxMCwgMToxMF0KZGltKEFFREIpCgpgYGAKCgoKPCEtLSAjIyBFeGFtaW5lIEFFREIgLS0+Cgo8IS0tIFdlIGNhbiBleGFtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBkYXRhc2V0IHRvIGtub3cgd2hhdCBlYWNoIHZhcmlhYmxlIGlzIGNhbGxlZCwgd2hhdCBjbGFzcyAtLT4KPCEtLSAodHlwZSkgaXQgaGFzLCBhbmQgd2hhdCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gaXMuIC0tPgoKPCEtLSBUaGVyZSBpcyBhbiBleGNlbGxlbnQgcG9zdCBvbiB0aGlzOiA8aHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vd29ya2luZy13aXRoLXNwc3MtbGFiZWxzLWluLXIvPi4gLS0+Cgo8IS0tIGBgYHtyIEFFREI6IGRlc2NyaWJlfSAtLT4KPCEtLSBBRURCICU+JSBzalBsb3Q6OnZpZXdfZGYoc2hvdy50eXBlID0gVFJVRSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cuZnJxID0gVFJVRSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cucHJjID0gVFJVRSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cubmEgPSBUUlVFLCAgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heC5sZW4gPSBUUlVFLCAgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAubGFiZWxzID0gMjAsIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsICAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlLnZpZXdlciA9IEZBTFNFLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFREIuZGljdGlvbmFyeS5odG1sIikpICAtLT4KPCEtLSBgYGAgLS0+CgojIyBGaXhpbmcgYW5kIGNyZWF0aW5nIHZhcmlhYmxlcwoKV2UgaGF2ZSB0byBmaXggY2VydGFpbiBjbGluaWNhbCBwYXJhbWV0ZXJzOgoKLSAgIHN5bXB0b21zCi0gICBkaWFiZXRlcwotICAgYWxjb2hvbCB1c2UKLSAgIHNtb2tpbmcKLSAgIHBsYXF1ZSBwaGVub3R5cGVzCgojIyMgU3ltcHRvbXMKCldlIG5lZWQgdG8gYmUgdmVyeSBzdHJpY3QgaW4gZGVmaW5pbmcgKnN5bXB0b21zLiogVGhlcmVmb3JlIHdlIHdpbGwgZml4IGEgbmV3CnZhcmlhYmxlIHRoYXQgZ3JvdXBzICpzeW1wdG9tcyogYXQgaW5jbHVzaW9uLgoKQ29kaW5nIG9mICpzeW1wdG9tcyogaXMgYXMgZm9sbG93czoKCi0gICBtaXNzaW5nIC05OTkKLSAgIEFzeW1wdG9tYXRpYyAwCi0gICBUSUEgMQotICAgbWlub3Igc3Ryb2tlIDIKLSAgIE1ham9yIHN0cm9rZSAzCi0gICBBbWF1cm9zaXMgZnVnYXggNAotICAgRm91ciB2ZXNzZWwgZGlzZWFzZSA1Ci0gICBWZXJ0ZWJyb2Jhc2lsYXJ5IFRJQSA3Ci0gICBSZXRpbmFsIGluZmFyY3Rpb24gOAotICAgU3ltcHRvbWF0aWMsIGJ1dCBhc3BlY2lmaWMgc3ltdG9tcyA5Ci0gICBDb250cmFsYXRlcmFsIHN5bXB0b21hdGljIG9jY2x1c2lvbiAxMAotICAgcmV0aW5hbCBpbmZhcmN0aW9uIDExCi0gICBhcm1jbGF1ZGljYXRpb24gZHVlIHRvIG9jY2x1c2lvbiBzdWJjbGF2aWFuIGFydGVyeSwgQ0VBIG5lZWRlZCBmb3IgYnlwYXNzCiAgICAxMgotICAgcmV0aW5hbCBpbmZhcmN0aW9uICsgVElBcyAxMwotICAgT2N1bGFyIGlzY2hlbWljIHN5bmRyb21lIDE0Ci0gICBpc2NoZW1pc2NoIGdsYXVjb29tIDE1Ci0gICBzdWJjbGF2aWFuIHN0ZWFsIHN5bmRyb21lIDE2Ci0gICBUR0EgMTcKCldlIHdpbGwgZ3JvdXAgYXMgZm9sbG93czoKCjEuICBBc3ltcHRvbWF0aWMgPiAwCjIuICBUSUEgPiAxLCA3LCAxMwozLiAgU3Ryb2tlID4gMiwgMwo0LiAgT2N1bGFyID4gNCwgMTQsIDE1CjUuICBSZXRpbmFsIGluZmFyY3Rpb24gPiA4LCAxMQo2LiAgT3RoZXIgPiA1LCA5LCAxMCwgMTIsIDE2LCAxNwoKYGBge3IgRml4U3ltcHRvbXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBzeW1wdG9tcwoKYXR0YWNoKEFFREIpCkFFREJbLCJTeW1wdG9tcy41RyJdIDwtIE5BCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzXSA8LSAiVElBIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDIgfCBzeW1wdCA9PSAzXSA8LSAiU3Ryb2tlIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDQgfCBzeW1wdCA9PSAxNCB8IHN5bXB0ID09IDE1IF0gPC0gIk9jdWxhciIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTFdIDwtICJSZXRpbmFsIGluZmFyY3Rpb24iCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNSB8IHN5bXB0ID09IDkgfCBzeW1wdCA9PSAxMCB8IHN5bXB0ID09IDEyIHwgc3ltcHQgPT0gMTYgfCBzeW1wdCA9PSAxN10gPC0gIk90aGVyIgoKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0Il0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAtOTk5XSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMSB8IHN5bXB0ID09IDcgfCBzeW1wdCA9PSAxMyB8IHN5bXB0ID09IDIgfCBzeW1wdCA9PSAzXSA8LSAiU3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgfCBzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTEgfCBzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT2N1bGFyIGFuZCBvdGhlcnMiCgojIEFzeW1wdFN5bXB0CkFFREJbLCJBc3ltcHRTeW1wdDJHIl0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gMSB8IHN5bXB0ID09IDcgfCBzeW1wdCA9PSAxMyB8IHN5bXB0ID09IDIgfCBzeW1wdCA9PSAzIHwgc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgfCBzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTEgfCBzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiU3ltcHRvbWF0aWMiCgpkZXRhY2goQUVEQikKCiMgdGFibGUoQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIHVzZU5BID0gImlmYW55IikKIyAKIyB0YWJsZShBRURCJEFzeW1wdFN5bXB0MkcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKIyB0YWJsZShBRURCJFN5bXB0b21zLjVHLCBBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgdGFibGUoQUVEQi50ZW1wJFN5bXB0b21zLjVHLCBBRURCLnRlbXAkQXN5bXB0U3ltcHQpCiMgCiMgcm0oQUVEQi50ZW1wKQpgYGAKCiMjIyBSZS1hc3Nlc3NlZCBzeW1wdG9tcwoKV2UgcmUtYXNzZXNzZWQgdGhlIGNhdGVnb3JpemF0aW9uIG9mIHN5bXB0b21zLiBUaGVzZSBhcmUgc3VtbWFyaXplZCBhbmQgcGFyc2VkCmluIHRoaXMgc2VjdGlvbi4KCkxhYmVsaW5nIG9mIG5ldyBzeW1wdG9tIGNhdGVnb3JpZXMuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQoKQUVEQiRpbmRleHN5bXB0b21zX3dvcnN0CkFFREIkaW5kZXhzeW1wdG9tc193b3JzdF80ZwpBRURCJGluZGV4c3ltcHRvbXNfbGF0ZXN0CkFFREIkaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcKCmBgYAoKR2V0dGluZyBjb3VudHMgZm9yIGVhY2ggb2YgdGhlIG1vc3QgaW1wb3J0YW50IGNhdGVnb3JpZXMuCgpgYGB7cn0KY2F0KCJOZXcgJ3dvcnN0JyB2cyAnbGF0ZXN0JyBzeW1wdG9tIGNhdGVnb3JpZXMuXG4iKQp0YWJsZShhc19mYWN0b3IoQUVEQiRpbmRleHN5bXB0b21zX3dvcnN0XzRnKSwgYXNfZmFjdG9yKEFFREIkaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcpKQoKY2F0KCJcbk5ldyAnd29yc3QnIHN5bXB0b20gY2F0ZWdvcmllcy5cbiIpCnRhYmxlKChBRURCJGluZGV4c3ltcHRvbXNfd29yc3RfNGcpKQoKY2F0KCJcbk5ldyAnbGF0ZXN0JyBzeW1wdG9tIGNhdGVnb3JpZXMuXG4iKQp0YWJsZShhc19mYWN0b3IoQUVEQiRpbmRleHN5bXB0b21zX2xhdGVzdF80ZykpCmBgYAoKQ29tcGFyaW5nIHdpdGggdGhlIG9yaWdpbmFsIHN5bXB0b20gY2F0ZWdvcmllcy4KCmBgYHtyfQpjYXQoIk5ldyAnbGF0ZXN0JyB2cyBvcmlnaW5hbCBzeW1wdG9tIDJHIGNhdGVnb3JpZXMuXG4iKQp0YWJsZSgoQUVEQiRpbmRleHN5bXB0b21zX2xhdGVzdF80ZyksIEFFREIkQXN5bXB0U3ltcHQyRykKCmNhdCgiXG5OZXcgJ2xhdGVzdCcgdnMgb3JpZ2luYWwgc3ltcHRvbSA1RyBjYXRlZ29yaWVzLlxuIikKdGFibGUoKEFFREIkaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcpLCBBRURCJFN5bXB0b21zLjVHKQogICAKYGBgCgpXZSBuZWVkIHRvIGJlIHZlcnkgc3RyaWN0IGluIGRlZmluaW5nICpzeW1wdG9tcy4qIFRoZXJlZm9yZSB3ZSB3aWxsIGZpeCBhIG5ldwp2YXJpYWJsZSB0aGF0IGdyb3VwcyAqc3ltcHRvbXMqIGF0IGluY2x1c2lvbi4KCkNvZGluZyBvZiAqc3ltcHRvbXMqIGlzIGFzIGZvbGxvd3M6CgotICAgYXN5bXB0IDBcCi0gICBvY3VsYXIgMVwKLSAgIFRJQSAyXAotICAgc3Ryb2tlIDNcCi0gICB1bmNsZWFyIDkKCldlIHdpbGwgZ3JvdXAgYXMgZm9sbG93czoKCjEuICBBc3ltcHRvbWF0aWMgPiAwCjIuICBTeW1wdG9tYXRpYyA+IDEsIDIsIDMKMy4gIE5BID4gOQoKYGBge3IgRml4TmV3U3ltcHRvbXN9CgojIEZpeCBzeW1wdG9tcwphdHRhY2goQUVEQikKCiMgU3ltcHRvbXMuVXBkYXRlMkcKQUVEQlssIlN5bXB0b21zLlVwZGF0ZTJHIl0gPC0gTkEKQUVEQiRTeW1wdG9tcy5VcGRhdGUyR1tpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLlVwZGF0ZTJHW2luZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDEgfCBpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSAyIHwgaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gM10gPC0gIlN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLlVwZGF0ZTJHW2luZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDkgXSA8LSBOQQoKIyBTeW1wdG9tcy5VcGRhdGUzRwpBRURCWywiU3ltcHRvbXMuVXBkYXRlM0ciXSA8LSBOQQpBRURCJFN5bXB0b21zLlVwZGF0ZTNHW2luZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkU3ltcHRvbXMuVXBkYXRlM0dbaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gMSB8IGluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDIgfCBpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSAzXSA8LSAiU3ltcHRvbWF0aWMiCkFFREIkU3ltcHRvbXMuVXBkYXRlM0dbaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gOSBdIDwtICJVbmNsZWFyIgoKZGV0YWNoKEFFREIpCgp0YWJsZShBRURCJFN5bXB0b21zLlVwZGF0ZTJHLCBBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkU3ltcHRvbXMuVXBkYXRlM0csIEFFREIkU3ltcHRvbXMuNUcsIHVzZU5BID0gImlmYW55IikKCmBgYAoKIyMjIE90aGVyIGNsaW5pY2FsIGNoYXJhY3RlcmlzdGljcwoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgKmRpYWJldGVzKiBzdGF0dXMgdmFyaWFibGUuCgpgYGB7ciBGaXhEaWFiZXRlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IGRpYWJldGVzCmF0dGFjaChBRURCKQpBRURCWywiRGlhYmV0ZXNTdGF0dXMiXSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAtOTk5XSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAwXSA8LSAiQ29udHJvbCAobm8gRGlhYmV0ZXMgRHgvTWVkKSIKQUVEQiREaWFiZXRlc1N0YXR1c1tETS5jb21wb3NpdGUgPT0gMV0gPC0gIkRpYWJldGVzIgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkRE0uY29tcG9zaXRlLCBBRURCJERpYWJldGVzU3RhdHVzKQojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiRE0uY29tcG9zaXRlIiwgIkRpYWJldGVzU3RhdHVzIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqc21va2luZyogc3RhdHVzIHZhcmlhYmxlLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyCnNvbWVvbmUgbmV2ZXIsIGV2ZXIgb3IgaXMgY3VycmVudGx5IChhdCB0aGUgdGltZSBvZiBpbmNsdXNpb24pIHNtb2tpbmcuIFRoaXMgaXMKYmFzZWQgb24gdGhlIHF1ZXN0aW9ubmFpcmUuCgotICAgYGRpZXQ4MDFgOiBhcmUgeW91IGEgc21va2VyPwotICAgYGRpZXQ4MDJgOiBkaWQgeW91IHNtb2tlIGluIHRoZSBwYXN0PwoKV2UgYWxyZWFkeSBoYXZlIHNvbWUgdmFyaWFibGVzIGluZGljYXRpbmcgc21va2luZyBzdGF0dXM6CgotICAgYFNtb2tpbmdSZXBvcnRlZGA6IHBhdGllbnQgaGFzIHJlcG9ydGVkIHRvIHNtb2tlLgotICAgYFNtb2tpbmdZZWFyT1JgOiBzbW9raW5nIGluIHRoZSB5ZWFyIG9mIHN1cmdlcnk/Ci0gICBgU21va2VyQ3VycmVudGA6IGN1cnJlbnRseSBzbW9raW5nPwoKYGBge3IgRml4U21va2luZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmVxdWlyZShsYWJlbGxlZCkKQUVEQiRkaWV0ODAxIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDEpCkFFREIkZGlldDgwMiA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODAyKQpBRURCJGRpZXQ4MDUgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwNSkKQUVEQiRTbW9raW5nUmVwb3J0ZWQgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1JlcG9ydGVkKQpBRURCJFNtb2tlckN1cnJlbnQgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyQ3VycmVudCkKQUVEQiRTbW9raW5nWWVhck9SIDwtIHRvX2ZhY3RvcihBRURCJFNtb2tpbmdZZWFyT1IpCgojIHRhYmxlKEFFREIkZGlldDgwMSkKIyB0YWJsZShBRURCJGRpZXQ4MDIpCiMgdGFibGUoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCiMgdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50KQojIHRhYmxlKEFFREIkU21va2luZ1llYXJPUikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCwgQUVEQiRTbW9rZXJDdXJyZW50LCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlJlcG9ydGVkIHNtb2tpbmciLCAiQ3VycmVudCBzbW9rZXIiKSkKIyAKIyB0YWJsZShBRURCJGRpZXQ4MDEsIEFFREIkZGlldDgwMiwgdXNlTkEgPSAiaWZhbnkiLCBkbm4gPSBjKCJTbW9rZXIiLCAiUGFzdCBzbW9rZXIiKSkKCmNhdCgiXG5GaXhpbmcgc21va2luZyBzdGF0dXMuXG4iKQphdHRhY2goQUVEQikKQUVEQlssIlNtb2tlclN0YXR1cyJdIDwtIE5BCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gImRvbid0IGtub3ciXSA8LSAiTmV2ZXIgc21va2VkIgpBRURCJFNtb2tlclN0YXR1c1tkaWV0ODAyID09ICJJIHN0aWxsIHNtb2tlIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyIgJiBkaWV0ODAyID09ICJubyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gInllcyJdIDwtICJFeC1zbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gInllcyJdIDwtICJDdXJyZW50IHNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8gZGF0YSBhdmFpbGFibGUvbWlzc2luZyJdIDwtIE5BCiMgQUVEQiRTbW9rZXJTdGF0dXNbaXMubmEoU21va2VyQ3VycmVudCldIDwtICJOZXZlciBzbW9rZWQiCmRldGFjaChBRURCKQoKY2F0KCJcbiogQ3VycmVudCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyQ3VycmVudCwKICAgICAgdXNlTkEgPSAiaWZhbnkiLCAKICAgICAgZG5uID0gYygiQ3VycmVudCBzbW9rZXIiKSkKCmNhdCgiXG4qIFVwZGF0ZWQgc21va2luZyBzdGF0dXMuXG4iKQp0YWJsZShBRURCJFNtb2tlclN0YXR1cywKICAgICAgdXNlTkEgPSAiaWZhbnkiLCAKICAgICAgZG5uID0gYygiVXBkYXRlZCBzbW9raW5nIHN0YXR1cyIpKQoKY2F0KCJcbiogQ29tcGFyaW5nIHRvICdTbW9rZXJDdXJyZW50Jy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLCBBRURCJFNtb2tlckN1cnJlbnQsIAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIiwgIkN1cnJlbnQgc21va2VyIikpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiRE0uY29tcG9zaXRlIiwgIkRpYWJldGVzU3RhdHVzIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgKmFsY29ob2wqIHN0YXR1cyB2YXJpYWJsZS4KCmBgYHtyIEZpeEFsY29ob2wsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkFsY29ob2xVc2UiXSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAtOTk5XSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAwXSA8LSAiTm8iCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDFdIDwtICJZZXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IGEgaGlzdG9yeSBvZiBDQUQsIHN0cm9rZSBvciBwZXJpcGhlcmFsIGludGVydmVudGlvbiBzdGF0dXMgdmFyaWFibGUuIFRoaXMgd2lsbCBiZSBiYXNlZCBvbiBgQ0FEX2hpc3RvcnlgLCBgU3Ryb2tlX2hpc3RvcnlgLCBhbmQgYFBlcmlwaGVyYWwuaW50ZXJ2YAoKYGBge3IgRml4Q0FEX0hpc3RvcnksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIk1lZEh4X0NWRCJdIDwtIE5BCkFFREIkTWVkSHhfQ1ZEW0NBRF9oaXN0b3J5ID09IDAgfCBTdHJva2VfaGlzdG9yeSA9PSAwIHwgUGVyaXBoZXJhbC5pbnRlcnYgPT0gMF0gPC0gIk5vIgpBRURCJE1lZEh4X0NWRFtDQURfaGlzdG9yeSA9PSAxIHwgU3Ryb2tlX2hpc3RvcnkgPT0gMSB8IFBlcmlwaGVyYWwuaW50ZXJ2ID09IDFdIDwtICJ5ZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRDQURfaGlzdG9yeSkKdGFibGUoQUVEQiRTdHJva2VfaGlzdG9yeSkKdGFibGUoQUVEQiRQZXJpcGhlcmFsLmludGVydikKdGFibGUoQUVEQiRNZWRIeF9DVkQpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiZGlldDgxMCIsICJBbGNvaG9sVXNlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCRBbGNvaG9sVXNlIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQWxjb2hvbFVzZSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCgpgYGAKCiMjIyBQbGFxdWUgcGhlbm90eXBlcwoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgKnBsYXF1ZXBoZW5vdHlwZXMqIHZhcmlhYmxlLgoKQ29kaW5nIG9mIHN5bXB0b21zIGlzIGFzIGZvbGxvd3M6CgotICAgbWlzc2luZyAtOTk5XAotICAgbm90IHJlbGV2YW50IC04ODgKLSAgIGZpYnJvdXMgMVwKLSAgIGZpYnJvYXRoZXJvbWF0b3VzIDJcCi0gICBhdGhlcm9tYXRvdXMgMwoKYGBge3IgRml4UGxhcXVlUGhlbm90eXBlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCkFFREJbLCJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIl0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IC05OTldIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMV0gPC0gImZpYnJvdXMiCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMl0gPC0gImZpYnJvYXRoZXJvbWF0b3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDNdIDwtICJhdGhlcm9tYXRvdXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInBsYXF1ZXBoZW5vdHlwZSIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IGFuZCBpbnZlcnNlLXJhbmsgbm9ybWFsIHRyYW5zZm9ybSB0aGUgY29udGludW91cyAobWFudWFsbHkpCnNjb3JlZCBwbGFxdWUgcGhlbm90eXBlcy4KCmBgYHtyIElSTlQgUGxhcXVlUGhlbm90eXBlc30KQUVEQiRtYWNtZWFuMCA8LSBhcy5udW1lcmljKEFFREIkbWFjbWVhbjApCkFFREIkc21jbWVhbjAgPC0gYXMubnVtZXJpYyhBRURCJHNtY21lYW4wKQpBRURCJG5ldXRyb3BoaWxzIDwtIGFzLm51bWVyaWMoQUVEQiRuZXV0cm9waGlscykKQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSA8LSBhcy5udW1lcmljKEFFREIkTWFzdF9jZWxsc19wbGFxdWUpCkFFREIkdmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQgPC0gYXMubnVtZXJpYyhBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkKQoKQUVEQiRNQUNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRtYWNtZWFuMCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJG1hY21lYW4wKSkpCkFFREIkU01DX3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkc21jbWVhbjAsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiRzbWNtZWFuMCkpKQpBRURCJE5ldXRyb3BoaWxzX3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkbmV1dHJvcGhpbHMsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiRuZXV0cm9waGlscykpKQpBRURCJE1hc3RDZWxsc19yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJE1hc3RfY2VsbHNfcGxhcXVlLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkTWFzdF9jZWxsc19wbGFxdWUpKSkKQUVEQiRWZXNzZWxEZW5zaXR5X3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkdmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCkpKQoKYGBgCgpgYGB7ciBJUk5UIFBsYXF1ZVBoZW5vdHlwZXM6IFZpc3VhbGlzYXRpb259CmxpYnJhcnkobGFiZWxsZWQpCkFFREIkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCJEdlbmRlcikKbGlicmFyeShwYXRjaHdvcmspCgpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJtYWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiJSBwZXIgcmVnaW9uIG9mIGludGVyZXN0IiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1BQ19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3RcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMSB8IHAyIAoKcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAic21jbWVhbjAiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2Ygc21vb3RoIG11c2NsZSBjZWxscyAoU01BKSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3QiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiU01DX3JhbmtOb3JtIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlIG9mIHNtb290aCBtdXNjbGUgY2VsbHMgKFNNQSkiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3RcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMSB8IHAyIAoKCnAxIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIm5ldXRyb3BoaWxzIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbmV1dHJvcGhpbHMgKENENjZiKSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMiA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJOZXV0cm9waGlsc19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIG5ldXRyb3BoaWxzIChDRDY2YikiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZVxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIHwgcDIgCgoKcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiTWFzdF9jZWxsc19wbGFxdWUiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBtYXN0IGNlbGxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImNvdW50cyBwZXIgcGxhcXVlIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIG1hc3QgY2VsbHMiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZVxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIHwgcDIgCgoKcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAidmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBpbnRyYXBsYXF1ZSBuZW92ZXNzZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImNvdW50cyBwZXIgMy00IGhvdHNwb3RzIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIlZlc3NlbERlbnNpdHlfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBpbnRyYXBsYXF1ZSBuZW92ZXNzZWxzIiwKICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciAzLTQgaG90c3BvdHNcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMSB8IHAyIAoKcm0ocDEsIHAyKQpgYGAKCkhlcmUgd2UgY2FsY3VsYXRlIHRoZSAqcGxhcXVlIGluc3RhYmlsaXR5L3Z1bG5lcmFiaWxpdHkqIGluZGV4CgpgYGB7ciBQbGFxdWUgVnVsbmVyYWJpbGl0eX0KIyBQbGFxdWUgdnVsbmVyYWJpbGl0eQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJE1hY3JvcGhhZ2VzLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRNYWNyb3BoYWdlcy5iaW4pCkFFREIkU01DLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRTTUMuYmluKQpBRURCJElQSC5iaW4gPC0gdG9fZmFjdG9yKEFFREIkSVBILmJpbikKQUVEQiRDYWxjLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDYWxjLmJpbikKQUVEQiRDb2xsYWdlbi5iaW4gPC0gdG9fZmFjdG9yKEFFREIkQ29sbGFnZW4uYmluKQpBRURCJEZhdC5iaW5fMTAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl8xMCkKQUVEQiRGYXQuYmluXzQwIDwtIHRvX2ZhY3RvcihBRURCJEZhdC5iaW5fNDApCgp0YWJsZShBRURCJE1hY3JvcGhhZ2VzLmJpbikKdGFibGUoQUVEQiRGYXQuYmluXzEwKQp0YWJsZShBRURCJENvbGxhZ2VuLmJpbikKdGFibGUoQUVEQiRTTUMuYmluKQp0YWJsZShBRURCJElQSC5iaW4pCgojIFNQU1MgY29kZQoKIyAKIyAqKiogc3ludGF4LSBQbGFxdWUgdnVsbmVyYWJpbGl0eSoqLgojIENPTVBVVEUgTWFjcm9faW5zdGFiID0gLTk5OS4KIyBJRiBtYWNyb3BoYWdlcy5iaW49MiBNYWNyb19pbnN0YWI9MS4KIyBJRiBtYWNyb3BoYWdlcy5iaW49MSBNYWNyb19pbnN0YWI9MC4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgRmF0MTBfaW5zdGFiID0gLTk5OS4KIyBJRiBGYXQuYmluXzEwPTIgRmF0MTBfaW5zdGFiPTEuCiMgSUYgRmF0LmJpbl8xMD0xIEZhdDEwX2luc3RhYj0wLgojIEVYRUNVVEUuCiMgCiMgQ09NUFVURSBjb2xsX2luc3RhYj0tOTk5LgojIElGIENvbGxhZ2VuLmJpbj0yIGNvbGxfaW5zdGFiPTAuCiMgSUYgQ29sbGFnZW4uYmluPTEgY29sbF9pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIAojIENPTVBVVEUgU01DX2luc3RhYj0tOTk5LgojIElGIFNNQy5iaW49MiBTTUNfaW5zdGFiPTAuCiMgSUYgU01DLmJpbj0xIFNNQ19pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgSVBIX2luc3RhYj0tOTk5LgojIElGIElQSC5iaW49MCBJUEhfaW5zdGFiPTAuCiMgSUYgSVBILmJpbj0xIElQSF9pbnN0YWI9MS4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgSW5zdGFiaWxpdHk9TWFjcm9faW5zdGFiICsgRmF0MTBfaW5zdGFiICsgIGNvbGxfaW5zdGFiICsgU01DX2luc3RhYiArIElQSF9pbnN0YWIuCiMgRVhFQ1VURS4KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCiMgbWFjIGluc3RhYmlsaXR5CkFFREJbLCJNQUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJE1BQ19JbnN0YWJpbGl0eVtNYWNyb3BoYWdlcy5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09ICJuby9taW5vciJdIDwtIDAKQUVEQiRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDEKCiMgZmF0IGluc3RhYmlsaXR5CkFFREJbLCJGQVQxMF9JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkRkFUMTBfSW5zdGFiaWxpdHlbRmF0LmJpbl8xMCA9PSAtOTk5XSA8LSBOQQpBRURCJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gIiA8MTAlIl0gPC0gMApBRURCJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gIiA+MTAlIl0gPC0gMQoKIyBjb2wgaW5zdGFiaWxpdHkgCkFFREJbLCJDT0xfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRDT0xfSW5zdGFiaWxpdHlbQ29sbGFnZW4uYmluID09ICJuby9taW5vciJdIDwtIDEKQUVEQiRDT0xfSW5zdGFiaWxpdHlbQ29sbGFnZW4uYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDAKCiMgc21jIGluc3RhYmlsaXR5CkFFREJbLCJTTUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09IC05OTldIDwtIE5BCkFFREIkU01DX0luc3RhYmlsaXR5W1NNQy5iaW4gPT0gIm5vL21pbm9yIl0gPC0gMQpBRURCJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDAKCiMgaXBoIGluc3RhYmlsaXR5CkFFREJbLCJJUEhfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJElQSF9JbnN0YWJpbGl0eVtJUEguYmluID09IC05OTldIDwtIE5BCkFFREIkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gIm5vIl0gPC0gMApBRURCJElQSF9JbnN0YWJpbGl0eVtJUEguYmluID09ICJ5ZXMiXSA8LSAxCgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkTUFDX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkRkFUMTBfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRDT0xfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRTTUNfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRJUEhfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKCiMgY3JlYXRpbmcgdnVsbmVyYWJpbGl0eSBpbmRleApBRURCIDwtIEFFREIgJT4lIG11dGF0ZShQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCA9IGZhY3Rvcihyb3dTdW1zKC5bZ3JlcCgiX0luc3RhYmlsaXR5IiwgbmFtZXMoLikpXSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKdGFibGUoQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCwgdXNlTkEgPSAiaWZhbnkiKQoKIyBzdHIoQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCkKCmBgYAoKIyMgUHJlcGFyZSBiYXNlbGluZSBzdW1tYXJ5CgpXZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhdCBiYXNlbGluZSBpbiB0aGUgd2hvbGUgY29ob3J0LgoKLSAgIEFnZSAoeWVhcnMpCi0gICBGZW1hbGUgc2V4IChOLCAlKQotICAgQXJ0ZXJ5IHR5cGUgKE4sICUpCi0gICBIb3NwaXRhbCAoTiwgJSkKPCEtLSAtICAgSHlwZXJ0ZW5zaW9uIChOLCAlKSAtLT4KPCEtLSAtICAgU0JQIChtbUhnKSAtLT4KPCEtLSAtICAgREJQIChtbUhnKSAtLT4KPCEtLSAtICAgRGlhYmV0ZXMgbWVsbGl0dXMgKE4sICUpIC0tPgo8IS0tIC0gICBUb3RhbCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKSAtLT4KPCEtLSAtICAgTERMIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpIC0tPgo8IS0tIC0gICBIREwgY2hvbGVzdGVyb2wgbGV2ZWxzIChtZy9kTCkgLS0+CjwhLS0gLSAgIFRyaWdseWNlcmlkZSBsZXZlbHMgKG1nL2RMKSAtLT4KPCEtLSAtICAgVXNlIG9mIHN0YXRpbnMgKE4sICUpIC0tPgo8IS0tIC0gICBVc2Ugb2YgYW50aXBsYXRlbGV0IGRydWdzIChOLCAlKSAtLT4KPCEtLSAtICAgQk1JIChrZy9twrIpIC0tPgo8IS0tIC0gICBTbW9raW5nIHN0YXR1cyAoTiwgJSkgLS0+CjwhLS0gICAgIC0gICBOZXZlciBzbW9rZXJzIC0tPgo8IS0tICAgICAtICAgRXgtc21va2VycyAtLT4KPCEtLSAgICAgLSAgIEN1cnJlbnQgc21va2VycyAtLT4KPCEtLSAtICAgSGlzdG9yeSBvZiBDQUQgKE4sICUpIC0tPgo8IS0tIC0gICBIaXN0b3J5IG9mIFBBRCAoTiwgJSkgLS0+CjwhLS0gLSAgIENsaW5pY2FsIG1hbmlmZXN0YXRpb25zIC0tPgo8IS0tICAgICAtICAgQXN5bXB0b21hdGljIC0tPgo8IS0tICAgICAtICAgQW1hdXJvc2lzIGZ1Z2F4IC0tPgo8IS0tICAgICAtICAgVElBIC0tPgo8IS0tICAgICAtICAgU3Ryb2tlIC0tPgo8IS0tIC0gICBlR0ZSIChtTC9taW4vMS43MyBtwrIpIC0tPgo8IS0tIC0gICBzdGVub3NpcyAtLT4KPCEtLSAtICAgeWVhciBvZiBzdXJnZXJ5IC0tPgo8IS0tIC0gICBwbGFxdWUgY2hhcmFjdGVyaXN0aWNzIC0tPgoKYGBge3IgQmFzZWxpbmUgQUVEQjogcHJlcGFyYXRpb259CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCJTRUxFQ1RJT04gVEhFIFNISVpaTEVcbiIpCgojIyMgQXJ0ZXJ5IGxldmVscwojIEFFZGF0YSRBcnRlcnlfc3VtbWFyeTogCiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbAojIE5PVCBVU0UgLSAwIE5vIGFydGVyeSBrbm93biAoeWV0KSwgbm8gc3VyZ2VyeSAocGF0aWVudCBpbGwsIGRpZWQsIGV4aXRlZCBzdHVkeSksIHJlLW51bWJlcmVkIHRvIEFBQQojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIChsZWZ0ICYgcmlnaHQpCiMgVVNFIC0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbC9pbGlhYyAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2Fyb3RpZCBhcnRlcmllcyAoY29tbW9uLCBleHRlcm5hbCkKIyBOT1QgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fyb3RpZCBieXBhc3MgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZXVyeXNtYXRhIChjYXJvdGlkICYgZmVtb3JhbCkKIyBOT1QgVVNFIC0gNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9ydGEKIyBOT1QgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYXJ0ZXJpZXMgKHJlbmFsLCBwb3BsaXRlYWwsIHZlcnRlYnJhbCkKIyBOT1QgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgIGZlbW9yYWwgYnlwYXNzLCBhbmdpb3NlYWwgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKCiMjIyBBRWRhdGEkaW5mb3JtZWRjb25zZW50CiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIC05OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcKIyBOT1QgVVNFIC0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgZGllZAojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIFVTRSAtIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gOSAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDExIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMKIyBOT1QgVVNFIC0gMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUKIyBVU0UgLSAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAyMSAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyMiAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIFVTRSAtIDI2ICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsICBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8KIyBOT1QgVVNFIC0gMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkb2Vzbid0IHdhbnQgdG8KIyBOT1QgVVNFIC0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdW5hYmxlIHRvIHNpZ24KIyBOT1QgVVNFIC0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbm8gcmVhY3Rpb24KIyBOT1QgVVNFIC0gMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGxvc3QKIyBOT1QgVVNFIC0gMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIHRvbyBvbGQKIyBOT1QgVVNFIC0gMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkKIyBVU0UgLSAzNiAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBlbmRwb2ludAojIFVTRSAtIDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsIG5pZXRzIGludnVsbGVuLCB3ZWwgYWxsZXMgZ2VicnVpa2VuCiMgVVNFIC0gMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIGluZm9ybWVkIGNvbmNlbnRzOiB5ZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub29pdCBnZWluY2x1ZGVlcmQKCmNhdCgiLSBzYW5pdHkgY2hlY2tpbmcgUFJJT1IgdG8gc2VsZWN0aW9uIikKbGlicmFyeShkYXRhLnRhYmxlKQpyZXF1aXJlKGxhYmVsbGVkKQphZS5nZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQphZS5ob3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQiRIb3NwaXRhbCkKdGFibGUoYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgZG5uID0gYygiU2V4IiwgIkhvc3BpdGFsIikpCmFlLmFydGVyeSA8LSB0b19mYWN0b3IoQUVEQiRBcnRlcnlfc3VtbWFyeSkKdGFibGUoYWUuYXJ0ZXJ5LCBhZS5nZW5kZXIsIGRubiA9IGMoIlNleCIsICJBcnRlcnkiKSkKCnJtKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGFlLmFydGVyeSkKCiMgSSBjaGFuZ2UgbnVtZXJpYyBhbmQgZmFjdG9ycyBtYW51YWxseSBiZWNhdXNlLCB3ZWxsLCBJIHdvdWxkbid0IGtub3cgaG93IHRvIGZpeCBpdCBvdGhlcndpc2UKIyB0byBoYXZlIHRoaXMgJ3RpYmJsZScgd29yayB3aXRoICd0YWJsZW9uZScuLi4gOi0pCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJGRpYXN0b2xpIDwtIGFzLm51bWVyaWMoQUVEQiRkaWFzdG9saSkKQUVEQiRzeXN0b2xpYyA8LSBhcy5udW1lcmljKEFFREIkc3lzdG9saWMpCgpBRURCJFRDX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRDX2ZpbmFsQ1UpCkFFREIkTERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbENVKQpBRURCJEhETF9maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRIRExfZmluYWxDVSkKQUVEQiRUR19maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRUR19maW5hbENVKQoKQUVEQiRUQ19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWwpCkFFREIkTERMX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRMRExfZmluYWwpCkFFREIkSERMX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRIRExfZmluYWwpCkFFREIkVEdfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsKQoKQUVEQiRBZ2UgPC0gYXMubnVtZXJpYyhBRURCJEFnZSkKQUVEQiRHRlJfTURSRCA8LSBhcy5udW1lcmljKEFFREIkR0ZSX01EUkQpCkFFREIkQk1JIDwtIGFzLm51bWVyaWMoQUVEQiRCTUkpCkFFREIkZUNpZ2FyZXR0ZXMgPC0gYXMubnVtZXJpYyhBRURCJGVDaWdhcmV0dGVzKQpBRURCJGVQYWNrWWVhcnNTbW9raW5nIDwtIGFzLm51bWVyaWMoQUVEQiRlUGFja1llYXJzU21va2luZykKQUVEQiRFUF9jb21wb3NpdGVfdGltZSA8LSBhcy5udW1lcmljKEFFREIkRVBfY29tcG9zaXRlX3RpbWUpCkFFREIkRVBfbWFqb3JfdGltZSA8LSBhcy5udW1lcmljKEFFREIkRVBfbWFqb3JfdGltZSkKCnJlcXVpcmUobGFiZWxsZWQpCkFFREIkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIkQXJ0ZXJ5X3N1bW1hcnkpCkFFREIkT1J5ZWFyIDwtIHRvX2ZhY3RvcihBRURCJE9SeWVhcikKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpBRURCJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQpBRURCJEtET1FJIDwtIHRvX2ZhY3RvcihBRURCJEtET1FJKQpBRURCJEJNSV9XSE8gPC0gdG9fZmFjdG9yKEFFREIkQk1JX1dITykKQUVEQiREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiREaWFiZXRlc1N0YXR1cykKQUVEQiRTbW9rZXJTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyU3RhdHVzKQpBRURCJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIkQWxjb2hvbFVzZSkKCkFFREIkSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMSkKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWcgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMikKQUVEQiRIeXBlcnRlbnNpb24uY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUpCkFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5kcnVncykKCkFFREIkTWVkLmFudGljb2FndWxhbnRzIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbnRpY29hZ3VsYW50cykKQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCkKQUVEQiRNZWQuU3RhdGluLkxMRCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuU3RhdGluLkxMRCkKCkFFREIkU3Ryb2tlX0R4IDwtIHRvX2ZhY3RvcihBRURCJFN0cm9rZV9EeCkKQUVEQiRDQURfaGlzdG9yeSA8LSB0b19mYWN0b3IoQUVEQiRDQURfaGlzdG9yeSkKQUVEQiRQQU9EIDwtIHRvX2ZhY3RvcihBRURCJFBBT0QpCkFFREIkUGVyaXBoZXJhbC5pbnRlcnYgPC0gdG9fZmFjdG9yKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCgpBRURCJHN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJHN5bXB0KQpBRURCJFN5bXB0b21zLjNnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjNnKQpBRURCJFN5bXB0b21zLjRnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjRnKQpBRURCJFN5bXB0b21zLjVHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjVHKQpBRURCJEFzeW1wdFN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJEFzeW1wdFN5bXB0KQpBRURCJEFzeW1wdFN5bXB0MkcgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQyRykKQUVEQiRTeW1wdG9tcy5VcGRhdGUyRyA8LSB0b19mYWN0b3IoQUVEQiRTeW1wdG9tcy5VcGRhdGUyRykKQUVEQiRTeW1wdG9tcy5VcGRhdGUzRyA8LSB0b19mYWN0b3IoQUVEQiRTeW1wdG9tcy5VcGRhdGUzRykKCkFFREIkcmVzdGVub3MgPC0gdG9fZmFjdG9yKEFFREIkcmVzdGVub3MpCkFFREIkc3Rlbm9zZSA8LSB0b19mYWN0b3IoQUVEQiRzdGVub3NlKQpBRURCJEVQX2NvbXBvc2l0ZSA8LSB0b19mYWN0b3IoQUVEQiRFUF9jb21wb3NpdGUpCkFFREIkRVBfbWFqb3IgPC0gdG9fZmFjdG9yKEFFREIkRVBfbWFqb3IpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlIDwtIHRvX2ZhY3RvcihBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUpCkFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXggPC0gdG9fZmFjdG9yKEFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgpCgpBRURCJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQoKQUVEQiRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFREIkaW5mb3JtZWRjb25zZW50KQoKQUVEQi5mdWxsIDwtIHN1YnNldChBRURCLAogICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibWlzc2luZyIgJiAjIHdlIGFyZSByZWFsbHkgc3RyaWN0IGluIHNlbGVjdGluZyBiYXNlZCBvbiAnaW5mb3JtZWQgY29uc2VudCchCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZGllZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBsb3N0IiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYgCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBlbmRwb2ludCIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vb2l0IGdlaW5jbHVkZWVyZCIpCiMgQUVEQi5DRUFbMToxMCwgMToxMF0KZGltKEFFREIuZnVsbCkKCmBgYAoKYGBge3IgQmFzZWxpbmUgQUVEQjogY3JlYXRpb259CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCJDUkVBVEUgQkFTRUxJTkUgVEFCTEVcbiIpCgojIEJhc2VsaW5lIHRhYmxlIHZhcmlhYmxlcwpiYXNldGFibGVfdmFycyA9IGMoIkhvc3BpdGFsIiwgCiAgICAgICAgICAgICAgICAgICAiQXJ0ZXJ5X3N1bW1hcnkiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiKQogICAgICAgICAgICAgICAgICAgIyAiT1J5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAjICJUQ19maW5hbENVIiwgIkxETF9maW5hbENVIiwgIkhETF9maW5hbENVIiwgIlRHX2ZpbmFsQ1UiLCAKICAgICAgICAgICAgICAgICAgICMgIlRDX2ZpbmFsIiwgIkxETF9maW5hbCIsICJIRExfZmluYWwiLCAiVEdfZmluYWwiLCAKICAgICAgICAgICAgICAgICAgICMgImhzQ1JQX3BsYXNtYSIsCiAgICAgICAgICAgICAgICAgICAjICJzeXN0b2xpYyIsICJkaWFzdG9saSIsICJHRlJfTURSRCIsICJCTUkiLCAKICAgICAgICAgICAgICAgICAgICMgIktET1FJIiwgIkJNSV9XSE8iLAogICAgICAgICAgICAgICAgICAgIyAiU21va2VyU3RhdHVzIiwgIkFsY29ob2xVc2UiLAogICAgICAgICAgICAgICAgICAgIyAiRGlhYmV0ZXNTdGF0dXMiLCAKICAgICAgICAgICAgICAgICAgICMgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyIsICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgIkh5cGVydGVuc2lvbi5kcnVncyIsIAogICAgICAgICAgICAgICAgICAgIyAiTWVkLmFudGljb2FndWxhbnRzIiwgIk1lZC5hbGwuYW50aXBsYXRlbGV0IiwgIk1lZC5TdGF0aW4uTExEIiwgCiAgICAgICAgICAgICAgICAgICAjICJTdHJva2VfRHgiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiLCAiQXN5bXB0U3ltcHQyRyIsCiAgICAgICAgICAgICAgICAgICAjICJTeW1wdG9tcy5VcGRhdGUyRyIsIAogICAgICAgICAgICAgICAgICAgIyAiU3ltcHRvbXMuVXBkYXRlM0ciLAogICAgICAgICAgICAgICAgICAgIyAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICAjICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICAjICJFUF9jb21wb3NpdGUiLCAiRVBfY29tcG9zaXRlX3RpbWUiLCAiRVBfbWFqb3IiLCAiRVBfbWFqb3JfdGltZSIsCiAgICAgICAgICAgICAgICAgICAjICJNQUNfcmFua05vcm0iLCAiU01DX3JhbmtOb3JtIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKICAgICAgICAgICAgICAgICAgICMgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgIk1hc3RDZWxsc19yYW5rTm9ybSIsCiAgICAgICAgICAgICAgICAgICAjICJJUEguYmluIiwgIlZlc3NlbERlbnNpdHlfcmFua05vcm0iLAogICAgICAgICAgICAgICAgICAgIyAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICAjICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAKICAgICAgICAgICAgICAgICAgICMgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiLCAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiKQoKYmFzZXRhYmxlX2JpbiA9IGMoIkhvc3BpdGFsIiwgCiAgICAgICAgICAgICAgICAgICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICJHZW5kZXIiKQojIGJhc2V0YWJsZV9iaW4KCmJhc2V0YWJsZV9jb24gPSBiYXNldGFibGVfdmFyc1shYmFzZXRhYmxlX3ZhcnMgJWluJSBiYXNldGFibGVfYmluXQojIGJhc2V0YWJsZV9jb24KYGBgCgojIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgQmFzZWxpbmUgQ2hhcmFjdGVyaXN0aWNzCgpTaG93aW5nIHRoZSBiYXNlbGluZSB0YWJsZSBvZiB0aGUgd2hvbGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuay4KCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZSBBRURCfQojIENyZWF0ZSBiYXNlbGluZSB0YWJsZXMKIyBodHRwOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzEzMzIxX2RhMzE0NjMzZGI5MjRkYzc4OTg2YTg1MDgxM2E1MGQ1Lmh0bWwKQUVEQi50YWJsZU9uZSA9IHByaW50KENyZWF0ZVRhYmxlT25lKHZhcnMgPSBiYXNldGFibGVfdmFycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiU3ltcHRvbXMuNGciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLmZ1bGwsIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjNdCmBgYAoKCiMjIE1hdGNoIHNhbXBsZXMgdXNlZAoKSGVyZSB3ZSBtYXRjaCB0aGUgZnVsbCBkYXRhYmFzZSB3aXRoIHRoZSBzYW1wbGVzIHVzZWQgaW4gKipgRW50cm9weU1hc2tlcmAqKi4gCgpgYGB7cn0KIyBSZW1vdmUgZHVwbGljYXRlIHJvd3Mgb2YgdGhlIGRhdGFmcmFtZQpsaWJyYXJ5KGRwbHlyKQp0ZW1wIDwtIEVNX3NhbXBsZXMgJT4lIHNlbGVjdCguLCAiU3R1ZHludW1iZXIiKSAlPiUKICBkaXN0aW5jdCguKQoKQUVEQl9FTSA8LSBtZXJnZSh0ZW1wLAogICAgICAgICAgICAgICAgIEFFREIsCiAgICAgICAgICAgICAgICAgYnkueCA9ICJTdHVkeW51bWJlciIsCiAgICAgICAgICAgICAgICAgYnkueSA9ICJTVFVEWV9OVU1CRVIiLCAKICAgICAgICAgICAgICAgICBzb3J0ID0gRkFMU0UpCgpBRURCX0VNLmZ1bGwgPC0gc3Vic2V0KEFFREJfRU0sCiAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRvZXNuJ3Qgd2FudCB0byIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHVuYWJsZSB0byBzaWduIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYgCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdG9vIG9sZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIikKIyBBRURCX0VNLmZ1bGxbMToxMCwgMToxMF0KCnJtKHRlbXApCmBgYAoKCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBFTSBGVUxMfQojIENyZWF0ZSBiYXNlbGluZSB0YWJsZXMKIyBodHRwOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzEzMzIxX2RhMzE0NjMzZGI5MjRkYzc4OTg2YTg1MDgxM2E1MGQ1Lmh0bWwKQUVEQl9FTS5mdWxsLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREJfRU0uZnVsbCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicGYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6M10KYGBgCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBFTX0KCmJhc2V0YWJsZV92YXJzID0gYygiSG9zcGl0YWwiLCAKICAgICAgICAgICAgICAgICAgICJBcnRlcnlfc3VtbWFyeSIpCgpiYXNldGFibGVfYmluID0gYygiSG9zcGl0YWwiLCAKICAgICAgICAgICAgICAgICAgIkFydGVyeV9zdW1tYXJ5IikKCiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCX0VNLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREJfRU0sIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjNdCmBgYAoKIyMgQmFzZWxpbmUgd3JpdGluZwoKTGV0J3Mgc2F2ZSB0aGUgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5LgoKYGBge3IgQmFzZWxpbmUgU2FtcGxlU2VsZWN0aW9uOiB3cml0ZX0KIyBXcml0ZSBiYXNldGFibGUKCnJlcXVpcmUob3Blbnhsc3gpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQi50YWJsZU9uZSksIAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuQmFzZWxpbmVUYWJsZS54bHN4IiksIAogICAgICAgICAgIHJvd05hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sTmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVfQmFzZSIsIG92ZXJ3cml0ZSA9IFRSVUUpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQl9FTS50YWJsZU9uZSksIAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuRU0uNTkuQmFzZWxpbmVUYWJsZS54bHN4IiksIAogICAgICAgICAgIHJvd05hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sTmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVfQmFzZV9FTV81OSIsIG92ZXJ3cml0ZSA9IFRSVUUpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQl9FTS5mdWxsLnRhYmxlT25lKSwgCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5FTS41Ni5CYXNlbGluZVRhYmxlLnhsc3giKSwgCiAgICAgICAgICAgcm93TmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBjb2xOYW1lcyA9IFRSVUUsIAogICAgICAgICAgIHNoZWV0TmFtZSA9ICJBRV9CYXNlX0VNXzU2Iiwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKV2Ugd2lsbCBhbHNvIHdyaXRlIHRoZSBuZXdseSBwcmVwYXJlZCBBRURCIHNlbGVjdGVkIGZvciB0aGlzIHN0dWR5IHdoaWNoIHdlIGNhbiB1c2UgaW4gZG93bnN0cmVhbSBhbmFseXNlcy4gCgpgYGB7cn0Kc2F2ZVJEUyhBRURCX0VNLmZ1bGwsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFREIuRU0uRlVMTC5SRFMiKSkKc2F2ZVJEUyhBRURCLmZ1bGwsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFREIuRlVMTC5SRFMiKSkKc2F2ZVJEUyhBRURCLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRURCLnJhdy5SRFMiKSkKCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjIKICAgIExhc3QgdXBkYXRlOiAgMjAyMi0wNy0xMgogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gZ2V0IHNvbWUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNC4zICgyMDE3LTA2LTMwKSAtLSAnU2luZ2xlIENhbmRsZScsIE1hYyBPUyBYIEVsIENhcGl0YW4KCiAgICAqKk1vU0NvVyBUby1EbyBMaXN0KioKICAgIFRoZSB0aGluZ3Mgd2UgTXVzdCwgU2hvdWxkLCBDb3VsZCwgYW5kIFdvdWxkIGhhdmUgZ2l2ZW4gdGhlIHRpbWUgd2UgaGF2ZS4KICAgIF9NXwoKICAgIF9TXwoKICAgIF9DXwoKICAgIF9XXwoKICAgICoqQ2hhbmdlcyBsb2cqKgogICAgKiB2MS4wLjIgU2ltcGxpZmllZCB0aGUgaW5pdGlhbCBzY3JpcHQuIEl0IG5vdyBvdXRwdXRzIHRoZSByZWxldmFudCBSLW9iamVjdHMgKGFzIC5SRFMpLgogICAgKiB2MS4wLjEgVXBkYXRlIHRvIG1haW4gQUVEQiAodGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIEFnZS12YXJpYWJsZSBpbiB0aGUgbmV3IHZlcnNpb24pLgogICAgKiB2MS4wLjAgSW5pdGlhbCB2ZXJzaW9uLiBBZGQgJ3BsYXF1ZSB2dWxuZXJhYmlsaXR5IGluZGV4JywgRml4ZWQgYmFzZWxpbmUgdGFibGUsIGFkZGVkIGNvZGVzLCBhbmQgcmVzdWx0cy4gTWFqb3IgdXBkYXRlIHRvIFdPUkNTIHN5c3RlbS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZXZhbCA9IFRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgojIFNhdmluZyBlbnZpcm9ubWVudAoKYGBge3IgU2F2aW5nfQpzYXZlLmltYWdlKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFREIuRU0uYmFzZWxpbmUuUkRhdGEiKSkKYGBgCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgPHN1cD7CqSAxOTc5LTIwMjIgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiB8IHMudy52YW5kZXJsYWFuW2F0XWdtYWlsLmNvbSB8IFtzd3ZhbmRlcmxhYW4uZ2l0aHViLmlvXShodHRwczovL3N3dmFuZGVybGFhbi5naXRodWIuaW8pLjwvc3VwPiB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsK
+LS0tCnRpdGxlOiAiQmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIgphdXRob3I6ICJbU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiwgUGhEXShodHRwczovL3N3dmFuZGVybGFhbi5naXRodWIuaW8pIHwgQHN3dmFuZGVybGFhbiB8IHMudy52YW5kZXJsYWFuQGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNhY2hlOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29sbGFwc2U6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWcuYWxpZ246IGNlbnRlcgogICAgZmlnX2NhcHRpb246IHllcwogICAgZmlnX2hlaWdodDogNgogICAgZmlnX3JldGluYTogMgogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogbHVtZW4KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogeWVzCm1haW5mb250OiBBcmlhbApzdWJ0aXRsZTogQWNjb21wYW55aW5nICdFbnRyb3B5TWFza2VyJwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCiMgYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgojIGtuaXQ6IHdvcmNzOjpjaXRlX2FsbAotLS0KCiMgR2VuZXJhbCBTZXR1cApXZSB3aWxsIGNsZWFuIHRoZSBlbnZpcm9ubWVudCwgc2V0dXAgdGhlIGxvY2F0aW9ucywgZGVmaW5lIGNvbG9ycywgYW5kIGNyZWF0ZSBhIGRhdGVzdGFtcC4KCl9DbGVhbiB0aGUgZW52aXJvbm1lbnQuXwpgYGB7ciBlY2hvID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQpgYGAKCl9TZXQgbG9jYXRpb25zIGFuZCB3b3JraW5nIGRpcmVjdG9yaWVzLi4uXwpgYGB7ciBMb2NhbFN5c3RlbSwgZWNobyA9IEZBTFNFfQpzb3VyY2UoInNjcmlwdHMvbG9jYWwuc3lzdGVtLlIiKQoKYGBgCgpfLi4uIGEgcGFja2FnZS1pbnN0YWxsYXRpb24gZnVuY3Rpb24gLi4uXwpgYGB7ciBGdW5jdGlvbjogaW5zdGFsbGF0aW9uc30Kc291cmNlKCJzY3JpcHRzL2Z1bmN0aW9ucy5SIikKCmBgYAoKCl8uLi4gYW5kIGxvYWQgdGhvc2UgcGFja2FnZXMuXwpgYGB7ciBsb2FkaW5nX3BhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoInNjcmlwdHMvcGFjazAxLnBhY2thZ2VzLlIiKQoKYGBgCgpfV2Ugd2lsbCBjcmVhdGUgYSBkYXRlc3RhbXAgYW5kIGRlZmluZSB0aGUgVXRyZWNodCBTY2llbmNlIFBhcmsgQ29sb3VyIFNjaGVtZV8uCmBgYHtyIFNldHRpbmc6IENvbG9yc30KClRvZGF5ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlWSVtJWQiKQpUb2RheS5SZXBvcnQgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVBLCAlQiAlZCwgJVkiKQoKc291cmNlKCJzY3JpcHRzL2NvbG9ycy5SIikKCmBgYAoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0KIyBmdXJ0aGVyIGRlZmluZSBzb21lIGtuaXRyLW9wdGlvbnMuCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgsIGZpZy5wYXRoID0gJ0ZpZ3VyZXMvJywgCiAgICAgICAgICAgICAgICAgICAgICB3d2FybmluZyA9IFRSVUUsICMgc2hvdyB3YXJuaW5ncyBkdXJpbmcgY29kZWJvb2sgZ2VuZXJhdGlvbgogIG1lc3NhZ2UgPSBUUlVFLCAjIHNob3cgbWVzc2FnZXMgZHVyaW5nIGNvZGVib29rIGdlbmVyYXRpb24KICBlcnJvciA9IFRSVUUsICMgZG8gbm90IGludGVycnVwdCBjb2RlYm9vayBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgZXJyb3JzLAogICAgICAgICAgICAgICAgIyB1c3VhbGx5IGJldHRlciBmb3IgZGVidWdnaW5nCiAgZWNobyA9IFRSVUUsICAjIHNob3cgUiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICBldmFsID0gVFJVRSkKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKcGFuZGVyOjpwYW5kZXJPcHRpb25zKCJ0YWJsZS5zcGxpdC50YWJsZSIsIEluZikKYGBgCgojIFRoaXMgbm90ZWJvb2sgCgpJbiB0aGlzIG5vdGVib29rIHdlIGNyZWF0ZSBhIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSBzYW1wbGVzIHVzZWQgaW4gKipgRW50cm9weU1hc2tlcmAqKi4gCgojIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkKClRoZSBbKkF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgKEFFKSpdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L3MxMDU2NC0wMDQtMjMwNC02KSBjb250YWlucyBwbGFxdWUgbWF0ZXJpYWwgb2YgcGF0aWVudHMgdGhhdCB1bmRlcndlbnQgZW5kYXJ0ZXJlY3RvbXlhdCB0d28gRHV0Y2ggdGVydGlhcnkgcmVmZXJyYWwgY2VudGVycy4gRGV0YWlscyBvZiB0aGUgc3R1ZHkgZGVzaWduIHdlcmUgZGVzY3JpYmVkIGJlZm9yZS4gQnJpZWZseSwgYmxvb2QgYW5kIHBsYXF1ZSBtYXRlcmlhbCB3ZXJlIG9idGFpbmVkIGR1cmluZyBlbmRhcnRlcmVjdG9teSBhbmQgc3RvcmVkIGF0IC04MCDihIMuIEFsbCBwYXRpZW50cyBwcm92aWRlZCBpbmZvcm1lZCBjb25zZW50IGFuZCB0aGUgc3R1ZHkgd2FzIGFwcHJvdmVkIGJ5IHRoZSBtZWRpY2FsIGV0aGljcyBjb21taXR0ZWUuCgojIyBMb2FkIHJlbGV2YW50IHNhbXBsZXMKCmBgYHtyfQpFTV9zYW1wbGVzIDwtIGZyZWFkKHBhc3RlMChBTkFMWVNJU19sb2MsICIvZGF0YXZlcnNlL0VudHJvcHlNYXNrZXJfaW1hZ2VfZmlsZXNfdXNlZC50eHQiKSkKYGBgCgojIyBMb2FkIGRhdGEKCkxvYWRpbmcgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBjbGluaWNhbCBhbmQgYmlvYmFuayBkYXRhLgoKYGBge3IgTG9hZEFFREJ9CmNhdCgiKiBnZXQgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBEYXRhYmFzZS4uLiIpCiMgTUVUSE9EIDE6IEl0IHNlZW1zIHRoaXMgbWV0aG9kIGdpdmVzIGxvYWRzIG9mIGVycm9ycyBhbmQgd2FybmluZ3MsIHdoaWNoIGFsbCBhcmUgaGFyZCB0byBjb21wcmVoZW5kCiMgICAgICAgICAgIG9yIGRlYnVnLiBXZSBleHBlY3QgMyw1Mjcgc2FtcGxlcywgYW5kIDkyNyB2YXJpYWJsZXM7IHdlIGdldCA5MjcgdmFyaWFibGVzISEhCiMgQUVkYXRhID0gYXMuZGF0YS50YWJsZShyZWFkLnNwc3MocGFzdGUwKElOUF9sb2MsIi8yMDE3LTFORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8yMDE3MTMwNl92MS4wLnNhdiIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW0uZmFjdG9yLm5hbWVzID0gVFJVRSwgdHJpbV92YWx1ZXMgPSBUUlVFLCAjIHdlIHRyaW0gc3BhY2VzIGluIHZhbHVlcwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RlID0gVFJVRSwgIyB3ZSByZS1lbmNvZGUgdG8gdGhlIGxvY2FsIGxvY2FsZSBlbmNvZGluZwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC51bmRlY2xhcmVkLmxldmVscyA9ICJhcHBlbmQiLCAjIHdlIGRvICpub3QqIHdhbnQgdG8gY29udmVydCB0byBSLWZhY3RvcnMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UudmFsdWUubGFiZWxzID0gRkFMU0UsICMgd2UgZG8gKm5vdCogY29udmVydCB2YXJpYWJsZXMgd2l0aCB2YWx1ZSBsYWJlbHMgaW50byBSIGZhY3RvcnMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UubWlzc2luZ3MgPSBUUlVFLCBzdWIgPSAiTkEiLCAjIHdlIHdpbGwgc2V0IGV2ZXJ5IG1pc3NpbmcgdmFyaWFibGUgdG8gTkEKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkLnZhbHVlLmxhYmVscyA9ICJjb25kZW5zZSIsICMgd2Ugd2lsbCBjb25kZW5zZSBkdXBsaWNhdGVkIHZhbHVlIGxhYmVscwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmRhdGEuZnJhbWUgPSBUUlVFKSkKIyBBRWRhdGEubGFiZWxzIDwtIGFzLmRhdGEudGFibGUoYXR0cihBRWRhdGEsICJ2YXJpYWJsZS5sYWJlbHMiKSkKIyBuYW1lcyhBRWRhdGEubGFiZWxzKSA8LSAiVmFyaWFibGUiCgojIE1FVEhPRCAyOiBVc2luZyBsaWJyYXJ5KCJoYXZlbiIpIGltcG9ydGluZyBzZWVtcyBmbGF3bGVzczsgYmVzdCBhcmd1bWVudCBiZWluZzoKIyAgICAgICAgICAgd2UgZXhwZWN0IDMsNTI3IHNhbXBsZXMgYW5kIDg4OCB2YXJpYWJsZXMsIHdoaWNoIGlzIHdoYXQgeW91J2QgZ2V0IHdpdGggdGhpcyBtZXRob2QKIyAgICAgICAgICAgU28gZm9yIG5vdywgTUVUSE9EIDIgaXMgcHJlZmVyZWQuIAojICAgICAgICAgICAgCnJlcXVpcmUoaGF2ZW4pCgojIEFFREIgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDIyXzFfTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMTUtMDItMjAyMi5zYXYiKSkgIyBzb21ldGhpbmcgd3Jvbmcgd2l0aCBBZ2UtdmFyaWFibGUKIyBBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAyMF8xX05FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzMwLTA5LTIwMjAuc2F2IikpICMgZHVwbGljYXRlIHN0dWR5bnVtYmVycyBpbiBpdApBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAyMF8xX05FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzE2LTAzLTIwMjAuc2F2IikpCgojIHdyaXRpbmcgb2ZmIHRoZSBTUFNTIGRhdGEgdG8gYW4gRXhjZWwuCiMgZndyaXRlKEFFZGF0YSwgZmlsZSA9IHBhc3RlMChJTlBfbG9jLCIvMjAxNy0xTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMjAxNzEzMDZfdjEuMC52YWx1ZXMueGxzeCIpLCAKIyAgICAgICAgc2VwID0gIjsiLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgY29sLm5hbWVzID0gVFJVRSwgcm93Lm5hbWVzID0gRkFMU0UsCiMgICAgICAgIGRhdGVUaW1lQXMgPSAiSVNPIiwgc2hvd1Byb2dyZXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUpCiMgd2FybmluZ3MoKQoKQUVEQlsxOjEwLCAxOjEwXQpkaW0oQUVEQikKCmBgYAoKCgo8IS0tICMjIEV4YW1pbmUgQUVEQiAtLT4KCjwhLS0gV2UgY2FuIGV4YW1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIGRhdGFzZXQgdG8ga25vdyB3aGF0IGVhY2ggdmFyaWFibGUgaXMgY2FsbGVkLCB3aGF0IGNsYXNzIC0tPgo8IS0tICh0eXBlKSBpdCBoYXMsIGFuZCB3aGF0IHRoZSB2YXJpYWJsZSBkZXNjcmlwdGlvbiBpcy4gLS0+Cgo8IS0tIFRoZXJlIGlzIGFuIGV4Y2VsbGVudCBwb3N0IG9uIHRoaXM6IDxodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS93b3JraW5nLXdpdGgtc3Bzcy1sYWJlbHMtaW4tci8+LiAtLT4KCjwhLS0gYGBge3IgQUVEQjogZGVzY3JpYmV9IC0tPgo8IS0tIEFFREIgJT4lIHNqUGxvdDo6dmlld19kZihzaG93LnR5cGUgPSBUUlVFLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5mcnEgPSBUUlVFLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5wcmMgPSBUUlVFLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5uYSA9IFRSVUUsICAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4LmxlbiA9IFRSVUUsICAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcC5sYWJlbHMgPSAyMCwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Uudmlld2VyID0gRkFMU0UsIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVEQi5kaWN0aW9uYXJ5Lmh0bWwiKSkgIC0tPgo8IS0tIGBgYCAtLT4KCiMjIEZpeGluZyBhbmQgY3JlYXRpbmcgdmFyaWFibGVzCgpXZSBoYXZlIHRvIGZpeCBjZXJ0YWluIGNsaW5pY2FsIHBhcmFtZXRlcnM6CgotICAgc3ltcHRvbXMKLSAgIGRpYWJldGVzCi0gICBhbGNvaG9sIHVzZQotICAgc21va2luZwotICAgcGxhcXVlIHBoZW5vdHlwZXMKCiMjIyBTeW1wdG9tcwoKV2UgbmVlZCB0byBiZSB2ZXJ5IHN0cmljdCBpbiBkZWZpbmluZyAqc3ltcHRvbXMuKiBUaGVyZWZvcmUgd2Ugd2lsbCBmaXggYSBuZXcKdmFyaWFibGUgdGhhdCBncm91cHMgKnN5bXB0b21zKiBhdCBpbmNsdXNpb24uCgpDb2Rpbmcgb2YgKnN5bXB0b21zKiBpcyBhcyBmb2xsb3dzOgoKLSAgIG1pc3NpbmcgLTk5OQotICAgQXN5bXB0b21hdGljIDAKLSAgIFRJQSAxCi0gICBtaW5vciBzdHJva2UgMgotICAgTWFqb3Igc3Ryb2tlIDMKLSAgIEFtYXVyb3NpcyBmdWdheCA0Ci0gICBGb3VyIHZlc3NlbCBkaXNlYXNlIDUKLSAgIFZlcnRlYnJvYmFzaWxhcnkgVElBIDcKLSAgIFJldGluYWwgaW5mYXJjdGlvbiA4Ci0gICBTeW1wdG9tYXRpYywgYnV0IGFzcGVjaWZpYyBzeW10b21zIDkKLSAgIENvbnRyYWxhdGVyYWwgc3ltcHRvbWF0aWMgb2NjbHVzaW9uIDEwCi0gICByZXRpbmFsIGluZmFyY3Rpb24gMTEKLSAgIGFybWNsYXVkaWNhdGlvbiBkdWUgdG8gb2NjbHVzaW9uIHN1YmNsYXZpYW4gYXJ0ZXJ5LCBDRUEgbmVlZGVkIGZvciBieXBhc3MKICAgIDEyCi0gICByZXRpbmFsIGluZmFyY3Rpb24gKyBUSUFzIDEzCi0gICBPY3VsYXIgaXNjaGVtaWMgc3luZHJvbWUgMTQKLSAgIGlzY2hlbWlzY2ggZ2xhdWNvb20gMTUKLSAgIHN1YmNsYXZpYW4gc3RlYWwgc3luZHJvbWUgMTYKLSAgIFRHQSAxNwoKV2Ugd2lsbCBncm91cCBhcyBmb2xsb3dzOgoKMS4gIEFzeW1wdG9tYXRpYyA+IDAKMi4gIFRJQSA+IDEsIDcsIDEzCjMuICBTdHJva2UgPiAyLCAzCjQuICBPY3VsYXIgPiA0LCAxNCwgMTUKNS4gIFJldGluYWwgaW5mYXJjdGlvbiA+IDgsIDExCjYuICBPdGhlciA+IDUsIDksIDEwLCAxMiwgMTYsIDE3CgpgYGB7ciBGaXhTeW1wdG9tcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHN5bXB0b21zCgphdHRhY2goQUVEQikKQUVEQlssIlN5bXB0b21zLjVHIl0gPC0gTkEKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTNdIDwtICJUSUEiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTdHJva2UiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgXSA8LSAiT2N1bGFyIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDggfCBzeW1wdCA9PSAxMV0gPC0gIlJldGluYWwgaW5mYXJjdGlvbiIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT3RoZXIiCgoKIyBBc3ltcHRTeW1wdApBRURCWywiQXN5bXB0U3ltcHQiXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJPY3VsYXIgYW5kIG90aGVycyIKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0MkciXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDMgfCBzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJTeW1wdG9tYXRpYyIKCmRldGFjaChBRURCKQoKIyB0YWJsZShBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQojIAojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCBBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyB0YWJsZShBRURCLnRlbXAkU3ltcHRvbXMuNUcsIEFFREIudGVtcCRBc3ltcHRTeW1wdCkKIyAKIyBybShBRURCLnRlbXApCmBgYAoKIyMjIFJlLWFzc2Vzc2VkIHN5bXB0b21zCgpXZSByZS1hc3Nlc3NlZCB0aGUgY2F0ZWdvcml6YXRpb24gb2Ygc3ltcHRvbXMuIFRoZXNlIGFyZSBzdW1tYXJpemVkIGFuZCBwYXJzZWQKaW4gdGhpcyBzZWN0aW9uLgoKTGFiZWxpbmcgb2YgbmV3IHN5bXB0b20gY2F0ZWdvcmllcy4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9CgpBRURCJGluZGV4c3ltcHRvbXNfd29yc3QKQUVEQiRpbmRleHN5bXB0b21zX3dvcnN0XzRnCkFFREIkaW5kZXhzeW1wdG9tc19sYXRlc3QKQUVEQiRpbmRleHN5bXB0b21zX2xhdGVzdF80ZwoKYGBgCgpHZXR0aW5nIGNvdW50cyBmb3IgZWFjaCBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgY2F0ZWdvcmllcy4KCmBgYHtyfQpjYXQoIk5ldyAnd29yc3QnIHZzICdsYXRlc3QnIHN5bXB0b20gY2F0ZWdvcmllcy5cbiIpCnRhYmxlKGFzX2ZhY3RvcihBRURCJGluZGV4c3ltcHRvbXNfd29yc3RfNGcpLCBhc19mYWN0b3IoQUVEQiRpbmRleHN5bXB0b21zX2xhdGVzdF80ZykpCgpjYXQoIlxuTmV3ICd3b3JzdCcgc3ltcHRvbSBjYXRlZ29yaWVzLlxuIikKdGFibGUoKEFFREIkaW5kZXhzeW1wdG9tc193b3JzdF80ZykpCgpjYXQoIlxuTmV3ICdsYXRlc3QnIHN5bXB0b20gY2F0ZWdvcmllcy5cbiIpCnRhYmxlKGFzX2ZhY3RvcihBRURCJGluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnKSkKYGBgCgpDb21wYXJpbmcgd2l0aCB0aGUgb3JpZ2luYWwgc3ltcHRvbSBjYXRlZ29yaWVzLgoKYGBge3J9CmNhdCgiTmV3ICdsYXRlc3QnIHZzIG9yaWdpbmFsIHN5bXB0b20gMkcgY2F0ZWdvcmllcy5cbiIpCnRhYmxlKChBRURCJGluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnKSwgQUVEQiRBc3ltcHRTeW1wdDJHKQoKY2F0KCJcbk5ldyAnbGF0ZXN0JyB2cyBvcmlnaW5hbCBzeW1wdG9tIDVHIGNhdGVnb3JpZXMuXG4iKQp0YWJsZSgoQUVEQiRpbmRleHN5bXB0b21zX2xhdGVzdF80ZyksIEFFREIkU3ltcHRvbXMuNUcpCiAgIApgYGAKCldlIG5lZWQgdG8gYmUgdmVyeSBzdHJpY3QgaW4gZGVmaW5pbmcgKnN5bXB0b21zLiogVGhlcmVmb3JlIHdlIHdpbGwgZml4IGEgbmV3CnZhcmlhYmxlIHRoYXQgZ3JvdXBzICpzeW1wdG9tcyogYXQgaW5jbHVzaW9uLgoKQ29kaW5nIG9mICpzeW1wdG9tcyogaXMgYXMgZm9sbG93czoKCi0gICBhc3ltcHQgMFwKLSAgIG9jdWxhciAxXAotICAgVElBIDJcCi0gICBzdHJva2UgM1wKLSAgIHVuY2xlYXIgOQoKV2Ugd2lsbCBncm91cCBhcyBmb2xsb3dzOgoKMS4gIEFzeW1wdG9tYXRpYyA+IDAKMi4gIFN5bXB0b21hdGljID4gMSwgMiwgMwozLiAgTkEgPiA5CgpgYGB7ciBGaXhOZXdTeW1wdG9tc30KCiMgRml4IHN5bXB0b21zCmF0dGFjaChBRURCKQoKIyBTeW1wdG9tcy5VcGRhdGUyRwpBRURCWywiU3ltcHRvbXMuVXBkYXRlMkciXSA8LSBOQQpBRURCJFN5bXB0b21zLlVwZGF0ZTJHW2luZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkU3ltcHRvbXMuVXBkYXRlMkdbaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gMSB8IGluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDIgfCBpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSAzXSA8LSAiU3ltcHRvbWF0aWMiCkFFREIkU3ltcHRvbXMuVXBkYXRlMkdbaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gOSBdIDwtIE5BCgojIFN5bXB0b21zLlVwZGF0ZTNHCkFFREJbLCJTeW1wdG9tcy5VcGRhdGUzRyJdIDwtIE5BCkFFREIkU3ltcHRvbXMuVXBkYXRlM0dbaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRTeW1wdG9tcy5VcGRhdGUzR1tpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSAxIHwgaW5kZXhzeW1wdG9tc19sYXRlc3RfNGcgPT0gMiB8IGluZGV4c3ltcHRvbXNfbGF0ZXN0XzRnID09IDNdIDwtICJTeW1wdG9tYXRpYyIKQUVEQiRTeW1wdG9tcy5VcGRhdGUzR1tpbmRleHN5bXB0b21zX2xhdGVzdF80ZyA9PSA5IF0gPC0gIlVuY2xlYXIiCgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkU3ltcHRvbXMuVXBkYXRlMkcsIEFFREIkU3ltcHRvbXMuNUcsIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRTeW1wdG9tcy5VcGRhdGUzRywgQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQoKYGBgCgojIyMgT3RoZXIgY2xpbmljYWwgY2hhcmFjdGVyaXN0aWNzCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqZGlhYmV0ZXMqIHN0YXR1cyB2YXJpYWJsZS4KCmBgYHtyIEZpeERpYWJldGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggZGlhYmV0ZXMKYXR0YWNoKEFFREIpCkFFREJbLCJEaWFiZXRlc1N0YXR1cyJdIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IC05OTldIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IDBdIDwtICJDb250cm9sIChubyBEaWFiZXRlcyBEeC9NZWQpIgpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAxXSA8LSAiRGlhYmV0ZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRETS5jb21wb3NpdGUsIEFFREIkRGlhYmV0ZXNTdGF0dXMpCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggdGhlICpzbW9raW5nKiBzdGF0dXMgdmFyaWFibGUuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHdoZXRoZXIKc29tZW9uZSBuZXZlciwgZXZlciBvciBpcyBjdXJyZW50bHkgKGF0IHRoZSB0aW1lIG9mIGluY2x1c2lvbikgc21va2luZy4gVGhpcyBpcwpiYXNlZCBvbiB0aGUgcXVlc3Rpb25uYWlyZS4KCi0gICBgZGlldDgwMWA6IGFyZSB5b3UgYSBzbW9rZXI/Ci0gICBgZGlldDgwMmA6IGRpZCB5b3Ugc21va2UgaW4gdGhlIHBhc3Q/CgpXZSBhbHJlYWR5IGhhdmUgc29tZSB2YXJpYWJsZXMgaW5kaWNhdGluZyBzbW9raW5nIHN0YXR1czoKCi0gICBgU21va2luZ1JlcG9ydGVkYDogcGF0aWVudCBoYXMgcmVwb3J0ZWQgdG8gc21va2UuCi0gICBgU21va2luZ1llYXJPUmA6IHNtb2tpbmcgaW4gdGhlIHllYXIgb2Ygc3VyZ2VyeT8KLSAgIGBTbW9rZXJDdXJyZW50YDogY3VycmVudGx5IHNtb2tpbmc/CgpgYGB7ciBGaXhTbW9raW5nLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJGRpZXQ4MDEgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwMSkKQUVEQiRkaWV0ODAyIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDIpCkFFREIkZGlldDgwNSA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODA1KQpBRURCJFNtb2tpbmdSZXBvcnRlZCA8LSB0b19mYWN0b3IoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCkFFREIkU21va2VyQ3VycmVudCA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJDdXJyZW50KQpBRURCJFNtb2tpbmdZZWFyT1IgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1llYXJPUikKCiMgdGFibGUoQUVEQiRkaWV0ODAxKQojIHRhYmxlKEFFREIkZGlldDgwMikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCkKIyB0YWJsZShBRURCJFNtb2tlckN1cnJlbnQpCiMgdGFibGUoQUVEQiRTbW9raW5nWWVhck9SKQojIHRhYmxlKEFFREIkU21va2luZ1JlcG9ydGVkLCBBRURCJFNtb2tlckN1cnJlbnQsIHVzZU5BID0gImlmYW55IiwgZG5uID0gYygiUmVwb3J0ZWQgc21va2luZyIsICJDdXJyZW50IHNtb2tlciIpKQojIAojIHRhYmxlKEFFREIkZGlldDgwMSwgQUVEQiRkaWV0ODAyLCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlNtb2tlciIsICJQYXN0IHNtb2tlciIpKQoKY2F0KCJcbkZpeGluZyBzbW9raW5nIHN0YXR1cy5cbiIpCmF0dGFjaChBRURCKQpBRURCWywiU21va2VyU3RhdHVzIl0gPC0gTkEKQUVEQiRTbW9rZXJTdGF0dXNbZGlldDgwMiA9PSAiZG9uJ3Qga25vdyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gIkkgc3RpbGwgc21va2UiXSA8LSAiQ3VycmVudCBzbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gIm5vIl0gPC0gIk5ldmVyIHNtb2tlZCIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8iICYgZGlldDgwMiA9PSAieWVzIl0gPC0gIkV4LXNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAieWVzIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIl0gPC0gTkEKIyBBRURCJFNtb2tlclN0YXR1c1tpcy5uYShTbW9rZXJDdXJyZW50KV0gPC0gIk5ldmVyIHNtb2tlZCIKZGV0YWNoKEFFREIpCgpjYXQoIlxuKiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzLlxuIikKdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50LAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJDdXJyZW50IHNtb2tlciIpKQoKY2F0KCJcbiogVXBkYXRlZCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIikpCgpjYXQoIlxuKiBDb21wYXJpbmcgdG8gJ1Ntb2tlckN1cnJlbnQnLlxuIikKdGFibGUoQUVEQiRTbW9rZXJTdGF0dXMsIEFFREIkU21va2VyQ3VycmVudCwgCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIlVwZGF0ZWQgc21va2luZyBzdGF0dXMiLCAiQ3VycmVudCBzbW9rZXIiKSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqYWxjb2hvbCogc3RhdHVzIHZhcmlhYmxlLgoKYGBge3IgRml4QWxjb2hvbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IGRpYWJldGVzCmF0dGFjaChBRURCKQpBRURCWywiQWxjb2hvbFVzZSJdIDwtIE5BCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IC05OTldIDwtIE5BCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDBdIDwtICJObyIKQUVEQiRBbGNvaG9sVXNlW2RpZXQ4MTAgPT0gMV0gPC0gIlllcyIKZGV0YWNoKEFFREIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiZGlldDgxMCIsICJBbGNvaG9sVXNlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCRBbGNvaG9sVXNlIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQWxjb2hvbFVzZSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggYSBoaXN0b3J5IG9mIENBRCwgc3Ryb2tlIG9yIHBlcmlwaGVyYWwgaW50ZXJ2ZW50aW9uIHN0YXR1cyB2YXJpYWJsZS4gVGhpcyB3aWxsIGJlIGJhc2VkIG9uIGBDQURfaGlzdG9yeWAsIGBTdHJva2VfaGlzdG9yeWAsIGFuZCBgUGVyaXBoZXJhbC5pbnRlcnZgCgpgYGB7ciBGaXhDQURfSGlzdG9yeSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IGRpYWJldGVzCmF0dGFjaChBRURCKQpBRURCWywiTWVkSHhfQ1ZEIl0gPC0gTkEKQUVEQiRNZWRIeF9DVkRbQ0FEX2hpc3RvcnkgPT0gMCB8IFN0cm9rZV9oaXN0b3J5ID09IDAgfCBQZXJpcGhlcmFsLmludGVydiA9PSAwXSA8LSAiTm8iCkFFREIkTWVkSHhfQ1ZEW0NBRF9oaXN0b3J5ID09IDEgfCBTdHJva2VfaGlzdG9yeSA9PSAxIHwgUGVyaXBoZXJhbC5pbnRlcnYgPT0gMV0gPC0gInllcyIKZGV0YWNoKEFFREIpCgp0YWJsZShBRURCJENBRF9oaXN0b3J5KQp0YWJsZShBRURCJFN0cm9rZV9oaXN0b3J5KQp0YWJsZShBRURCJFBlcmlwaGVyYWwuaW50ZXJ2KQp0YWJsZShBRURCJE1lZEh4X0NWRCkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJkaWV0ODEwIiwgIkFsY29ob2xVc2UiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBbGNvaG9sVXNlKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKCmBgYAoKIyMjIFBsYXF1ZSBwaGVub3R5cGVzCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqcGxhcXVlcGhlbm90eXBlcyogdmFyaWFibGUuCgpDb2Rpbmcgb2Ygc3ltcHRvbXMgaXMgYXMgZm9sbG93czoKCi0gICBtaXNzaW5nIC05OTlcCi0gICBub3QgcmVsZXZhbnQgLTg4OAotICAgZmlicm91cyAxXAotICAgZmlicm9hdGhlcm9tYXRvdXMgMlwKLSAgIGF0aGVyb21hdG91cyAzCgpgYGB7ciBGaXhQbGFxdWVQaGVub3R5cGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggcGxhcXVlcGhlbm90eXBlcwphdHRhY2goQUVEQikKQUVEQlssIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiXSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IC05OTldIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gLTk5OV0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAxXSA8LSAiZmlicm91cyIKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAyXSA8LSAiZmlicm9hdGhlcm9tYXRvdXMiCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gM10gPC0gImF0aGVyb21hdG91cyIKZGV0YWNoKEFFREIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAicGxhcXVlcGhlbm90eXBlIiwgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggYW5kIGludmVyc2UtcmFuayBub3JtYWwgdHJhbnNmb3JtIHRoZSBjb250aW51b3VzIChtYW51YWxseSkKc2NvcmVkIHBsYXF1ZSBwaGVub3R5cGVzLgoKYGBge3IgSVJOVCBQbGFxdWVQaGVub3R5cGVzfQpBRURCJG1hY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRtYWNtZWFuMCkKQUVEQiRzbWNtZWFuMCA8LSBhcy5udW1lcmljKEFFREIkc21jbWVhbjApCkFFREIkbmV1dHJvcGhpbHMgPC0gYXMubnVtZXJpYyhBRURCJG5ldXRyb3BoaWxzKQpBRURCJE1hc3RfY2VsbHNfcGxhcXVlIDwtIGFzLm51bWVyaWMoQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSkKQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCA8LSBhcy5udW1lcmljKEFFREIkdmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQpCgpBRURCJE1BQ19yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJG1hY21lYW4wLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkbWFjbWVhbjApKSkKQUVEQiRTTUNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRzbWNtZWFuMCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJHNtY21lYW4wKSkpCkFFREIkTmV1dHJvcGhpbHNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRuZXV0cm9waGlscywgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJG5ldXRyb3BoaWxzKSkpCkFFREIkTWFzdENlbGxzX3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkTWFzdF9jZWxsc19wbGFxdWUsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSkpKQpBRURCJFZlc3NlbERlbnNpdHlfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkKSkpCgpgYGAKCmBgYHtyIElSTlQgUGxhcXVlUGhlbm90eXBlczogVmlzdWFsaXNhdGlvbn0KbGlicmFyeShsYWJlbGxlZCkKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpsaWJyYXJ5KHBhdGNod29yaykKCnAxIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIm1hY21lYW4wIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlIG9mIG1hY3JvcGhhZ2VzIChDRDY4KSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3QiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiTUFDX3JhbmtOb3JtIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlIG9mIG1hY3JvcGhhZ2VzIChDRDY4KSIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdFxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIHwgcDIgCgpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJzbWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBzbW9vdGggbXVzY2xlIGNlbGxzIChTTUEpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdCIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMiA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJTTUNfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2Ygc21vb3RoIG11c2NsZSBjZWxscyAoU01BKSIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdFxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIHwgcDIgCgoKcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAibmV1dHJvcGhpbHMiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBuZXV0cm9waGlscyAoQ0Q2NmIpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImNvdW50cyBwZXIgcGxhcXVlIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk5ldXRyb3BoaWxzX3JhbmtOb3JtIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbmV1dHJvcGhpbHMgKENENjZiKSIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gImNvdW50cyBwZXIgcGxhcXVlXG5pbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBudW1iZXIiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDEgfCBwMiAKCgpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJNYXN0X2NlbGxzX3BsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIG1hc3QgY2VsbHMiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciBwbGFxdWUiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiTWFzdENlbGxzX3JhbmtOb3JtIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbWFzdCBjZWxscyIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gImNvdW50cyBwZXIgcGxhcXVlXG5pbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBudW1iZXIiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDEgfCBwMiAKCgpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciAzLTQgaG90c3BvdHMiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIDMtNCBob3RzcG90c1xuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIHwgcDIgCgpybShwMSwgcDIpCmBgYAoKSGVyZSB3ZSBjYWxjdWxhdGUgdGhlICpwbGFxdWUgaW5zdGFiaWxpdHkvdnVsbmVyYWJpbGl0eSogaW5kZXgKCmBgYHtyIFBsYXF1ZSBWdWxuZXJhYmlsaXR5fQojIFBsYXF1ZSB2dWxuZXJhYmlsaXR5CnJlcXVpcmUobGFiZWxsZWQpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKCnRhYmxlKEFFREIkTWFjcm9waGFnZXMuYmluKQp0YWJsZShBRURCJEZhdC5iaW5fMTApCnRhYmxlKEFFREIkQ29sbGFnZW4uYmluKQp0YWJsZShBRURCJFNNQy5iaW4pCnRhYmxlKEFFREIkSVBILmJpbikKCiMgU1BTUyBjb2RlCgojIAojICoqKiBzeW50YXgtIFBsYXF1ZSB2dWxuZXJhYmlsaXR5KiouCiMgQ09NUFVURSBNYWNyb19pbnN0YWIgPSAtOTk5LgojIElGIG1hY3JvcGhhZ2VzLmJpbj0yIE1hY3JvX2luc3RhYj0xLgojIElGIG1hY3JvcGhhZ2VzLmJpbj0xIE1hY3JvX2luc3RhYj0wLgojIEVYRUNVVEUuCiMgCiMgQ09NUFVURSBGYXQxMF9pbnN0YWIgPSAtOTk5LgojIElGIEZhdC5iaW5fMTA9MiBGYXQxMF9pbnN0YWI9MS4KIyBJRiBGYXQuYmluXzEwPTEgRmF0MTBfaW5zdGFiPTAuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIGNvbGxfaW5zdGFiPS05OTkuCiMgSUYgQ29sbGFnZW4uYmluPTIgY29sbF9pbnN0YWI9MC4KIyBJRiBDb2xsYWdlbi5iaW49MSBjb2xsX2luc3RhYj0xLgojIEVYRUNVVEUuCiMgCiMgCiMgQ09NUFVURSBTTUNfaW5zdGFiPS05OTkuCiMgSUYgU01DLmJpbj0yIFNNQ19pbnN0YWI9MC4KIyBJRiBTTUMuYmluPTEgU01DX2luc3RhYj0xLgojIEVYRUNVVEUuCiMgCiMgQ09NUFVURSBJUEhfaW5zdGFiPS05OTkuCiMgSUYgSVBILmJpbj0wIElQSF9pbnN0YWI9MC4KIyBJRiBJUEguYmluPTEgSVBIX2luc3RhYj0xLgojIEVYRUNVVEUuCiMgCiMgQ09NUFVURSBJbnN0YWJpbGl0eT1NYWNyb19pbnN0YWIgKyBGYXQxMF9pbnN0YWIgKyAgY29sbF9pbnN0YWIgKyBTTUNfaW5zdGFiICsgSVBIX2luc3RhYi4KIyBFWEVDVVRFLgoKIyBGaXggcGxhcXVlcGhlbm90eXBlcwphdHRhY2goQUVEQikKIyBtYWMgaW5zdGFiaWxpdHkKQUVEQlssIk1BQ19JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkTUFDX0luc3RhYmlsaXR5W01hY3JvcGhhZ2VzLmJpbiA9PSAtOTk5XSA8LSBOQQpBRURCJE1BQ19JbnN0YWJpbGl0eVtNYWNyb3BoYWdlcy5iaW4gPT0gIm5vL21pbm9yIl0gPC0gMApBRURCJE1BQ19JbnN0YWJpbGl0eVtNYWNyb3BoYWdlcy5iaW4gPT0gIm1vZGVyYXRlL2hlYXZ5Il0gPC0gMQoKIyBmYXQgaW5zdGFiaWxpdHkKQUVEQlssIkZBVDEwX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQiRGQVQxMF9JbnN0YWJpbGl0eVtGYXQuYmluXzEwID09IC05OTldIDwtIE5BCkFFREIkRkFUMTBfSW5zdGFiaWxpdHlbRmF0LmJpbl8xMCA9PSAiIDwxMCUiXSA8LSAwCkFFREIkRkFUMTBfSW5zdGFiaWxpdHlbRmF0LmJpbl8xMCA9PSAiID4xMCUiXSA8LSAxCgojIGNvbCBpbnN0YWJpbGl0eSAKQUVEQlssIkNPTF9JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkQ09MX0luc3RhYmlsaXR5W0NvbGxhZ2VuLmJpbiA9PSAtOTk5XSA8LSBOQQpBRURCJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gIm5vL21pbm9yIl0gPC0gMQpBRURCJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gIm1vZGVyYXRlL2hlYXZ5Il0gPC0gMAoKIyBzbWMgaW5zdGFiaWxpdHkKQUVEQlssIlNNQ19JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkU01DX0luc3RhYmlsaXR5W1NNQy5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRTTUNfSW5zdGFiaWxpdHlbU01DLmJpbiA9PSAibm8vbWlub3IiXSA8LSAxCkFFREIkU01DX0luc3RhYmlsaXR5W1NNQy5iaW4gPT0gIm1vZGVyYXRlL2hlYXZ5Il0gPC0gMAoKIyBpcGggaW5zdGFiaWxpdHkKQUVEQlssIklQSF9JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQiRJUEhfSW5zdGFiaWxpdHlbSVBILmJpbiA9PSAibm8iXSA8LSAwCkFFREIkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gInllcyJdIDwtIDEKCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRNQUNfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRGQVQxMF9JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCJENPTF9JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCJFNNQ19JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCJElQSF9JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQoKIyBjcmVhdGluZyB2dWxuZXJhYmlsaXR5IGluZGV4CkFFREIgPC0gQUVEQiAlPiUgbXV0YXRlKFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4ID0gZmFjdG9yKHJvd1N1bXMoLltncmVwKCJfSW5zdGFiaWxpdHkiLCBuYW1lcyguKSldLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgp0YWJsZShBRURCJFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4LCB1c2VOQSA9ICJpZmFueSIpCgojIHN0cihBRURCJFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4KQoKYGBgCgojIyBQcmVwYXJlIGJhc2VsaW5lIHN1bW1hcnkKCldlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF0IGJhc2VsaW5lIGluIHRoZSB3aG9sZSBjb2hvcnQuCgotICAgQWdlICh5ZWFycykKLSAgIEZlbWFsZSBzZXggKE4sICUpCi0gICBBcnRlcnkgdHlwZSAoTiwgJSkKLSAgIEhvc3BpdGFsIChOLCAlKQo8IS0tIC0gICBIeXBlcnRlbnNpb24gKE4sICUpIC0tPgo8IS0tIC0gICBTQlAgKG1tSGcpIC0tPgo8IS0tIC0gICBEQlAgKG1tSGcpIC0tPgo8IS0tIC0gICBEaWFiZXRlcyBtZWxsaXR1cyAoTiwgJSkgLS0+CjwhLS0gLSAgIFRvdGFsIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpIC0tPgo8IS0tIC0gICBMREwgY2hvbGVzdGVyb2wgbGV2ZWxzIChtZy9kTCkgLS0+CjwhLS0gLSAgIEhETCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKSAtLT4KPCEtLSAtICAgVHJpZ2x5Y2VyaWRlIGxldmVscyAobWcvZEwpIC0tPgo8IS0tIC0gICBVc2Ugb2Ygc3RhdGlucyAoTiwgJSkgLS0+CjwhLS0gLSAgIFVzZSBvZiBhbnRpcGxhdGVsZXQgZHJ1Z3MgKE4sICUpIC0tPgo8IS0tIC0gICBCTUkgKGtnL23CsikgLS0+CjwhLS0gLSAgIFNtb2tpbmcgc3RhdHVzIChOLCAlKSAtLT4KPCEtLSAgICAgLSAgIE5ldmVyIHNtb2tlcnMgLS0+CjwhLS0gICAgIC0gICBFeC1zbW9rZXJzIC0tPgo8IS0tICAgICAtICAgQ3VycmVudCBzbW9rZXJzIC0tPgo8IS0tIC0gICBIaXN0b3J5IG9mIENBRCAoTiwgJSkgLS0+CjwhLS0gLSAgIEhpc3Rvcnkgb2YgUEFEIChOLCAlKSAtLT4KPCEtLSAtICAgQ2xpbmljYWwgbWFuaWZlc3RhdGlvbnMgLS0+CjwhLS0gICAgIC0gICBBc3ltcHRvbWF0aWMgLS0+CjwhLS0gICAgIC0gICBBbWF1cm9zaXMgZnVnYXggLS0+CjwhLS0gICAgIC0gICBUSUEgLS0+CjwhLS0gICAgIC0gICBTdHJva2UgLS0+CjwhLS0gLSAgIGVHRlIgKG1ML21pbi8xLjczIG3CsikgLS0+CjwhLS0gLSAgIHN0ZW5vc2lzIC0tPgo8IS0tIC0gICB5ZWFyIG9mIHN1cmdlcnkgLS0+CjwhLS0gLSAgIHBsYXF1ZSBjaGFyYWN0ZXJpc3RpY3MgLS0+CgpgYGB7ciBCYXNlbGluZSBBRURCOiBwcmVwYXJhdGlvbn0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRVxuIikKCiMjIyBBcnRlcnkgbGV2ZWxzCiMgQUVkYXRhJEFydGVyeV9zdW1tYXJ5OiAKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIDAgTm8gYXJ0ZXJ5IGtub3duICh5ZXQpLCBubyBzdXJnZXJ5IChwYXRpZW50IGlsbCwgZGllZCwgZXhpdGVkIHN0dWR5KSwgcmUtbnVtYmVyZWQgdG8gQUFBCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcm90aWQgKGxlZnQgJiByaWdodCkKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW1vcmFsL2lsaWFjIChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKQojIE5PVCBVU0UgLSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIGJ5cGFzcyBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ldXJ5c21hdGEgKGNhcm90aWQgJiBmZW1vcmFsKQojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3J0YQojIE5PVCBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBhcnRlcmllcyAocmVuYWwsIHBvcGxpdGVhbCwgdmVydGVicmFsKQojIE5PVCBVU0UgLSA4ICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbCBieXBhc3MsIGFuZ2lvc2VhbCBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQoKIyMjIEFFZGF0YSRpbmZvcm1lZGNvbnNlbnQKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwKIyBOT1QgVVNFIC0gLTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZwojIE5PVCBVU0UgLSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkaWVkCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcwojIFVTRSAtIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50CiMgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDYgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSA5ICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gMTEgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZQojIFVTRSAtIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzCiMgTk9UIFVTRSAtIDIxICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgTk9UIFVTRSAtIDIyICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8KIyBVU0UgLSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjYgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGRvZXNuJ3Qgd2FudCB0bwojIE5PVCBVU0UgLSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCB1bmFibGUgdG8gc2lnbgojIE5PVCBVU0UgLSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBubyByZWFjdGlvbgojIE5PVCBVU0UgLSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbG9zdAojIE5PVCBVU0UgLSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdG9vIG9sZAojIE5PVCBVU0UgLSAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKQojIFVTRSAtIDM2ICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgTk9UIFVTRSAtIDM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGVuZHBvaW50CiMgVVNFIC0gMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWwgbmlldHMgaW52dWxsZW4sIHdlbCBhbGxlcyBnZWJydWlrZW4KIyBVU0UgLSAzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgaW5mb3JtZWQgY29uY2VudHM6IHllcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb2l0IGdlaW5jbHVkZWVyZAoKY2F0KCItIHNhbml0eSBjaGVja2luZyBQUklPUiB0byBzZWxlY3Rpb24iKQpsaWJyYXJ5KGRhdGEudGFibGUpCnJlcXVpcmUobGFiZWxsZWQpCmFlLmdlbmRlciA8LSB0b19mYWN0b3IoQUVEQiRHZW5kZXIpCmFlLmhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSkKYWUuYXJ0ZXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQp0YWJsZShhZS5hcnRlcnksIGFlLmdlbmRlciwgZG5uID0gYygiU2V4IiwgIkFydGVyeSIpKQoKcm0oYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgYWUuYXJ0ZXJ5KQoKIyBJIGNoYW5nZSBudW1lcmljIGFuZCBmYWN0b3JzIG1hbnVhbGx5IGJlY2F1c2UsIHdlbGwsIEkgd291bGRuJ3Qga25vdyBob3cgdG8gZml4IGl0IG90aGVyd2lzZQojIHRvIGhhdmUgdGhpcyAndGliYmxlJyB3b3JrIHdpdGggJ3RhYmxlb25lJy4uLiA6LSkKCkFFREIkQWdlIDwtIGFzLm51bWVyaWMoQUVEQiRBZ2UpCkFFREIkZGlhc3RvbGkgPC0gYXMubnVtZXJpYyhBRURCJGRpYXN0b2xpKQpBRURCJHN5c3RvbGljIDwtIGFzLm51bWVyaWMoQUVEQiRzeXN0b2xpYykKCkFFREIkVENfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWxDVSkKQUVEQiRMRExfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkTERMX2ZpbmFsQ1UpCkFFREIkSERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbENVKQpBRURCJFRHX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsQ1UpCgpBRURCJFRDX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRUQ19maW5hbCkKQUVEQiRMRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbCkKQUVEQiRIRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbCkKQUVEQiRUR19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVEdfZmluYWwpCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJEdGUl9NRFJEIDwtIGFzLm51bWVyaWMoQUVEQiRHRlJfTURSRCkKQUVEQiRCTUkgPC0gYXMubnVtZXJpYyhBRURCJEJNSSkKQUVEQiRlQ2lnYXJldHRlcyA8LSBhcy5udW1lcmljKEFFREIkZUNpZ2FyZXR0ZXMpCkFFREIkZVBhY2tZZWFyc1Ntb2tpbmcgPC0gYXMubnVtZXJpYyhBRURCJGVQYWNrWWVhcnNTbW9raW5nKQpBRURCJEVQX2NvbXBvc2l0ZV90aW1lIDwtIGFzLm51bWVyaWMoQUVEQiRFUF9jb21wb3NpdGVfdGltZSkKQUVEQiRFUF9tYWpvcl90aW1lIDwtIGFzLm51bWVyaWMoQUVEQiRFUF9tYWpvcl90aW1lKQoKcmVxdWlyZShsYWJlbGxlZCkKQUVEQiRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQiRBcnRlcnlfc3VtbWFyeSkKQUVEQiRPUnllYXIgPC0gdG9fZmFjdG9yKEFFREIkT1J5ZWFyKQpBRURCJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQiRHZW5kZXIpCkFFREIkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIkSG9zcGl0YWwpCkFFREIkS0RPUUkgPC0gdG9fZmFjdG9yKEFFREIkS0RPUUkpCkFFREIkQk1JX1dITyA8LSB0b19mYWN0b3IoQUVEQiRCTUlfV0hPKQpBRURCJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCJERpYWJldGVzU3RhdHVzKQpBRURCJFNtb2tlclN0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJTdGF0dXMpCkFFREIkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQiRBbGNvaG9sVXNlKQoKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCA8LSB0b19mYWN0b3IoQUVEQiRIeXBlcnRlbnNpb24xKQpBRURCJEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyA8LSB0b19mYWN0b3IoQUVEQiRIeXBlcnRlbnNpb24yKQpBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSkKQUVEQiRIeXBlcnRlbnNpb24uZHJ1Z3MgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzKQoKQUVEQiRNZWQuYW50aWNvYWd1bGFudHMgPC0gdG9fZmFjdG9yKEFFREIkTWVkLmFudGljb2FndWxhbnRzKQpBRURCJE1lZC5hbGwuYW50aXBsYXRlbGV0IDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbGwuYW50aXBsYXRlbGV0KQpBRURCJE1lZC5TdGF0aW4uTExEIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5TdGF0aW4uTExEKQoKQUVEQiRTdHJva2VfRHggPC0gdG9fZmFjdG9yKEFFREIkU3Ryb2tlX0R4KQpBRURCJENBRF9oaXN0b3J5IDwtIHRvX2ZhY3RvcihBRURCJENBRF9oaXN0b3J5KQpBRURCJFBBT0QgPC0gdG9fZmFjdG9yKEFFREIkUEFPRCkKQUVEQiRQZXJpcGhlcmFsLmludGVydiA8LSB0b19mYWN0b3IoQUVEQiRQZXJpcGhlcmFsLmludGVydikKCkFFREIkc3ltcHQgPC0gdG9fZmFjdG9yKEFFREIkc3ltcHQpCkFFREIkU3ltcHRvbXMuM2cgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuM2cpCkFFREIkU3ltcHRvbXMuNGcgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuNGcpCkFFREIkU3ltcHRvbXMuNUcgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuNUcpCkFFREIkQXN5bXB0U3ltcHQgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQpCkFFREIkQXN5bXB0U3ltcHQyRyA8LSB0b19mYWN0b3IoQUVEQiRBc3ltcHRTeW1wdDJHKQpBRURCJFN5bXB0b21zLlVwZGF0ZTJHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLlVwZGF0ZTJHKQpBRURCJFN5bXB0b21zLlVwZGF0ZTNHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLlVwZGF0ZTNHKQoKQUVEQiRyZXN0ZW5vcyA8LSB0b19mYWN0b3IoQUVEQiRyZXN0ZW5vcykKQUVEQiRzdGVub3NlIDwtIHRvX2ZhY3RvcihBRURCJHN0ZW5vc2UpCkFFREIkRVBfY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEVQX2NvbXBvc2l0ZSkKQUVEQiRFUF9tYWpvciA8LSB0b19mYWN0b3IoQUVEQiRFUF9tYWpvcikKQUVEQiRNYWNyb3BoYWdlcy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkTWFjcm9waGFnZXMuYmluKQpBRURCJFNNQy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkU01DLmJpbikKQUVEQiRJUEguYmluIDwtIHRvX2ZhY3RvcihBRURCJElQSC5iaW4pCkFFREIkQ2FsYy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkQ2FsYy5iaW4pCkFFREIkQ29sbGFnZW4uYmluIDwtIHRvX2ZhY3RvcihBRURCJENvbGxhZ2VuLmJpbikKQUVEQiRGYXQuYmluXzEwIDwtIHRvX2ZhY3RvcihBRURCJEZhdC5iaW5fMTApCkFFREIkRmF0LmJpbl80MCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzQwKQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUgPC0gdG9fZmFjdG9yKEFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSkKQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCA8LSB0b19mYWN0b3IoQUVEQiRQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCkKCkFFREIkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIkQXJ0ZXJ5X3N1bW1hcnkpCgpBRURCJGluZm9ybWVkY29uc2VudCA8LSB0b19mYWN0b3IoQUVEQiRpbmZvcm1lZGNvbnNlbnQpCgpBRURCLmZ1bGwgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRvZXNuJ3Qgd2FudCB0byIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHVuYWJsZSB0byBzaWduIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYgCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdG9vIG9sZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIikKIyBBRURCLkNFQVsxOjEwLCAxOjEwXQpkaW0oQUVEQi5mdWxsKQoKYGBgCgpgYGB7ciBCYXNlbGluZSBBRURCOiBjcmVhdGlvbn0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIkNSRUFURSBCQVNFTElORSBUQUJMRVxuIikKCiMgQmFzZWxpbmUgdGFibGUgdmFyaWFibGVzCmJhc2V0YWJsZV92YXJzID0gYygiSG9zcGl0YWwiLCAKICAgICAgICAgICAgICAgICAgICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICAiQWdlIiwgIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAjICJPUnllYXIiLCAKICAgICAgICAgICAgICAgICAgICMgIlRDX2ZpbmFsQ1UiLCAiTERMX2ZpbmFsQ1UiLCAiSERMX2ZpbmFsQ1UiLCAiVEdfZmluYWxDVSIsIAogICAgICAgICAgICAgICAgICAgIyAiVENfZmluYWwiLCAiTERMX2ZpbmFsIiwgIkhETF9maW5hbCIsICJUR19maW5hbCIsIAogICAgICAgICAgICAgICAgICAgIyAiaHNDUlBfcGxhc21hIiwKICAgICAgICAgICAgICAgICAgICMgInN5c3RvbGljIiwgImRpYXN0b2xpIiwgIkdGUl9NRFJEIiwgIkJNSSIsIAogICAgICAgICAgICAgICAgICAgIyAiS0RPUUkiLCAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgICAjICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICAjICJEaWFiZXRlc1N0YXR1cyIsIAogICAgICAgICAgICAgICAgICAgIyAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgCiAgICAgICAgICAgICAgICAgICAjICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgICMgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsICJBc3ltcHRTeW1wdDJHIiwKICAgICAgICAgICAgICAgICAgICMgIlN5bXB0b21zLlVwZGF0ZTJHIiwgCiAgICAgICAgICAgICAgICAgICAjICJTeW1wdG9tcy5VcGRhdGUzRyIsCiAgICAgICAgICAgICAgICAgICAjICJyZXN0ZW5vcyIsICJzdGVub3NlIiwKICAgICAgICAgICAgICAgICAgICMgIkNBRF9oaXN0b3J5IiwgIlBBT0QiLCAiUGVyaXBoZXJhbC5pbnRlcnYiLCAKICAgICAgICAgICAgICAgICAgICMgIkVQX2NvbXBvc2l0ZSIsICJFUF9jb21wb3NpdGVfdGltZSIsICJFUF9tYWpvciIsICJFUF9tYWpvcl90aW1lIiwKICAgICAgICAgICAgICAgICAgICMgIk1BQ19yYW5rTm9ybSIsICJTTUNfcmFua05vcm0iLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAgIyAiTmV1dHJvcGhpbHNfcmFua05vcm0iLCAiTWFzdENlbGxzX3JhbmtOb3JtIiwKICAgICAgICAgICAgICAgICAgICMgIklQSC5iaW4iLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIsCiAgICAgICAgICAgICAgICAgICAjICJDYWxjLmJpbiIsICJDb2xsYWdlbi5iaW4iLCAKICAgICAgICAgICAgICAgICAgICMgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsIAogICAgICAgICAgICAgICAgICAgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiICkKICAgICAgICAgICAgICAgICAgICMgLCAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiKQoKYmFzZXRhYmxlX2JpbiA9IGMoIkhvc3BpdGFsIiwgCiAgICAgICAgICAgICAgICAgICJBcnRlcnlfc3VtbWFyeSIsCiAgICAgICAgICAgICAgICAgICJHZW5kZXIiKQojIGJhc2V0YWJsZV9iaW4KCmJhc2V0YWJsZV9jb24gPSBiYXNldGFibGVfdmFyc1shYmFzZXRhYmxlX3ZhcnMgJWluJSBiYXNldGFibGVfYmluXQojIGJhc2V0YWJsZV9jb24KYGBgCgojIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkgQmFzZWxpbmUgQ2hhcmFjdGVyaXN0aWNzCgpTaG93aW5nIHRoZSBiYXNlbGluZSB0YWJsZSBvZiB0aGUgd2hvbGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuay4KCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZSBBRURCfQojIENyZWF0ZSBiYXNlbGluZSB0YWJsZXMKIyBodHRwOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzEzMzIxX2RhMzE0NjMzZGI5MjRkYzc4OTg2YTg1MDgxM2E1MGQ1Lmh0bWwKQUVEQi50YWJsZU9uZSA9IHByaW50KENyZWF0ZVRhYmxlT25lKHZhcnMgPSBiYXNldGFibGVfdmFycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiU3ltcHRvbXMuNGciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLmZ1bGwsIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjNdCmBgYAoKCiMjIE1hdGNoIHNhbXBsZXMgdXNlZAoKSGVyZSB3ZSBtYXRjaCB0aGUgZnVsbCBkYXRhYmFzZSB3aXRoIHRoZSBzYW1wbGVzIHVzZWQgaW4gKipgRW50cm9weU1hc2tlcmAqKi4gCgpgYGB7cn0KIyBSZW1vdmUgZHVwbGljYXRlIHJvd3Mgb2YgdGhlIGRhdGFmcmFtZQpsaWJyYXJ5KGRwbHlyKQp0ZW1wIDwtIEVNX3NhbXBsZXMgJT4lIHNlbGVjdCguLCAiU3R1ZHludW1iZXIiKSAlPiUKICBkaXN0aW5jdCguKQoKQUVEQl9FTSA8LSBtZXJnZSh0ZW1wLAogICAgICAgICAgICAgICAgIEFFREIsCiAgICAgICAgICAgICAgICAgYnkueCA9ICJTdHVkeW51bWJlciIsCiAgICAgICAgICAgICAgICAgYnkueSA9ICJTVFVEWV9OVU1CRVIiLCAKICAgICAgICAgICAgICAgICBzb3J0ID0gRkFMU0UpCgpBRURCX0VNLmZ1bGwgPC0gc3Vic2V0KEFFREJfRU0sCiAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRvZXNuJ3Qgd2FudCB0byIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHVuYWJsZSB0byBzaWduIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYgCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdG9vIG9sZCIgJiAKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmIAogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIikKIyBBRURCX0VNLmZ1bGxbMToxMCwgMToxMF0KCnJtKHRlbXApCmBgYAoKCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBFTSBGVUxMfQojIENyZWF0ZSBiYXNlbGluZSB0YWJsZXMKIyBodHRwOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzEzMzIxX2RhMzE0NjMzZGI5MjRkYzc4OTg2YTg1MDgxM2E1MGQ1Lmh0bWwKQUVEQl9FTS5mdWxsLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREJfRU0uZnVsbCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicGYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6M10KYGBgCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBFTX0KCmJhc2V0YWJsZV92YXJzID0gYygiSG9zcGl0YWwiLCAKICAgICAgICAgICAgICAgICAgICJBcnRlcnlfc3VtbWFyeSIpCgpiYXNldGFibGVfYmluID0gYygiSG9zcGl0YWwiLCAKICAgICAgICAgICAgICAgICAgIkFydGVyeV9zdW1tYXJ5IikKCiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCX0VNLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREJfRU0sIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjNdCmBgYAoKIyMgQmFzZWxpbmUgd3JpdGluZwoKTGV0J3Mgc2F2ZSB0aGUgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5LgoKYGBge3IgQmFzZWxpbmUgU2FtcGxlU2VsZWN0aW9uOiB3cml0ZX0KIyBXcml0ZSBiYXNldGFibGUKCnJlcXVpcmUob3Blbnhsc3gpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQi50YWJsZU9uZSksIAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuQmFzZWxpbmVUYWJsZS54bHN4IiksIAogICAgICAgICAgIHJvd05hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sTmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVfQmFzZSIsIG92ZXJ3cml0ZSA9IFRSVUUpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQl9FTS50YWJsZU9uZSksIAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuRU0uNTkuQmFzZWxpbmVUYWJsZS54bHN4IiksIAogICAgICAgICAgIHJvd05hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sTmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBzaGVldE5hbWUgPSAiQUVfQmFzZV9FTV81OSIsIG92ZXJ3cml0ZSA9IFRSVUUpCgp3cml0ZS54bHN4KGFzLmRhdGEuZnJhbWUoQUVEQl9FTS5mdWxsLnRhYmxlT25lKSwgCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5FTS41Ni5CYXNlbGluZVRhYmxlLnhsc3giKSwgCiAgICAgICAgICAgcm93TmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBjb2xOYW1lcyA9IFRSVUUsIAogICAgICAgICAgIHNoZWV0TmFtZSA9ICJBRV9CYXNlX0VNXzU2Iiwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKV2Ugd2lsbCBhbHNvIHdyaXRlIHRoZSBuZXdseSBwcmVwYXJlZCBBRURCIHNlbGVjdGVkIGZvciB0aGlzIHN0dWR5IHdoaWNoIHdlIGNhbiB1c2UgaW4gZG93bnN0cmVhbSBhbmFseXNlcy4gCgpgYGB7cn0Kc2F2ZVJEUyhBRURCX0VNLmZ1bGwsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFREIuRU0uRlVMTC5SRFMiKSkKc2F2ZVJEUyhBRURCLmZ1bGwsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFREIuRlVMTC5SRFMiKSkKc2F2ZVJEUyhBRURCLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRURCLnJhdy5SRFMiKSkKCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjMKICAgIExhc3QgdXBkYXRlOiAgMjAyMi0wOC0yMwogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gZ2V0IHNvbWUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNC4zICgyMDE3LTA2LTMwKSAtLSAnU2luZ2xlIENhbmRsZScsIE1hYyBPUyBYIEVsIENhcGl0YW4KCiAgICAqKk1vU0NvVyBUby1EbyBMaXN0KioKICAgIFRoZSB0aGluZ3Mgd2UgTXVzdCwgU2hvdWxkLCBDb3VsZCwgYW5kIFdvdWxkIGhhdmUgZ2l2ZW4gdGhlIHRpbWUgd2UgaGF2ZS4KICAgIF9NXwoKICAgIF9TXwoKICAgIF9DXwoKICAgIF9XXwoKICAgICoqQ2hhbmdlcyBsb2cqKgogICAgKiB2MS4wLjMgVXBkYXRlZCBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MuCiAgICAqIHYxLjAuMiBTaW1wbGlmaWVkIHRoZSBpbml0aWFsIHNjcmlwdC4gSXQgbm93IG91dHB1dHMgdGhlIHJlbGV2YW50IFItb2JqZWN0cyAoYXMgLlJEUykuCiAgICAqIHYxLjAuMSBVcGRhdGUgdG8gbWFpbiBBRURCICh0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgQWdlLXZhcmlhYmxlIGluIHRoZSBuZXcgdmVyc2lvbikuCiAgICAqIHYxLjAuMCBJbml0aWFsIHZlcnNpb24uIEFkZCAncGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgnLCBGaXhlZCBiYXNlbGluZSB0YWJsZSwgYWRkZWQgY29kZXMsIGFuZCByZXN1bHRzLiBNYWpvciB1cGRhdGUgdG8gV09SQ1Mgc3lzdGVtLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBldmFsID0gVFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCiMgU2F2aW5nIGVudmlyb25tZW50CgpgYGB7ciBTYXZpbmd9CnNhdmUuaW1hZ2UocGFzdGUwKFBST0pFQ1RfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUVEQi5FTS5iYXNlbGluZS5SRGF0YSIpKQpgYGAKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCA8c3VwPsKpIDE5NzktMjAyMiBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIHwgcy53LnZhbmRlcmxhYW5bYXRdZ21haWwuY29tIHwgW3N3dmFuZGVybGFhbi5naXRodWIuaW9dKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykuPC9zdXA+IHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo=
diff --git a/ae_baseline/20220823.EntropyMasker.AE.BaselineTable.xlsx b/ae_baseline/20220823.EntropyMasker.AE.BaselineTable.xlsx
new file mode 100644
index 0000000..0a975e5
Binary files /dev/null and b/ae_baseline/20220823.EntropyMasker.AE.BaselineTable.xlsx differ
diff --git a/ae_baseline/20220823.EntropyMasker.AE.EM.56.BaselineTable.xlsx b/ae_baseline/20220823.EntropyMasker.AE.EM.56.BaselineTable.xlsx
new file mode 100644
index 0000000..592e79a
Binary files /dev/null and b/ae_baseline/20220823.EntropyMasker.AE.EM.56.BaselineTable.xlsx differ
diff --git a/ae_baseline/20220823.EntropyMasker.AE.EM.59.BaselineTable.xlsx b/ae_baseline/20220823.EntropyMasker.AE.EM.59.BaselineTable.xlsx
new file mode 100644
index 0000000..a14caee
Binary files /dev/null and b/ae_baseline/20220823.EntropyMasker.AE.EM.59.BaselineTable.xlsx differ