From 23b0b7d0084e6eb210eec7f97022a8b4ae20c88f Mon Sep 17 00:00:00 2001 From: "Sander W. van der Laan" Date: Tue, 23 Aug 2022 16:37:55 +0200 Subject: [PATCH] * v1.0.3 Updated baseline characteristics. --- AEDB.EM.baseline.Rmd | 11 +- AEDB.EM.baseline.nb.html | 1783 +++++++++-------- ...220823.EntropyMasker.AE.BaselineTable.xlsx | Bin 0 -> 7234 bytes ....EntropyMasker.AE.EM.56.BaselineTable.xlsx | Bin 0 -> 7011 bytes ....EntropyMasker.AE.EM.59.BaselineTable.xlsx | Bin 0 -> 6731 bytes 5 files changed, 932 insertions(+), 862 deletions(-) create mode 100644 ae_baseline/20220823.EntropyMasker.AE.BaselineTable.xlsx create mode 100644 ae_baseline/20220823.EntropyMasker.AE.EM.56.BaselineTable.xlsx create mode 100644 ae_baseline/20220823.EntropyMasker.AE.EM.59.BaselineTable.xlsx 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 @@ - + Baseline characteristics @@ -2998,7 +2998,7 @@

Baseline characteristics

Accompanying ‘EntropyMasker’

Sander W. van der Laan, PhD | @swvanderlaan |

-

2022-08-18

+

2022-08-23

@@ -3044,9 +3044,64 @@

General Setup

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 @@

General Setup

-

-Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
-Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")
-
-source("scripts/colors.R")
+

+Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
+Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")
+
+source("scripts/colors.R")
@@ -3085,7 +3140,7 @@

Load relevant samples

-
EM_samples <- fread(paste0(ANALYSIS_loc, "/dataverse/EntropyMasker_image_files_used.txt"))
+
EM_samples <- fread(paste0(ANALYSIS_loc, "/dataverse/EntropyMasker_image_files_used.txt"))
@@ -3096,42 +3151,42 @@

Load data

-
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
-AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))
-
-# 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()
-
-AEDB[1:10, 1:10]
+
# 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
+AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))
+
+# 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()
+
+AEDB[1:10, 1:10]
@@ -3141,7 +3196,7 @@

Load data

-
dim(AEDB)
+
dim(AEDB)
[1] 3791 1091
@@ -3212,41 +3267,41 @@

Symptoms

-

-# Fix symptoms
-
-attach(AEDB)
-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"
-
-
-# AsymptSympt
-AEDB[,"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"
-
-# AsymptSympt
-AEDB[,"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"
-
-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)
+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"
+
+
+# AsymptSympt
+AEDB[,"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"
+
+# AsymptSympt
+AEDB[,"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"
+
+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)
@@ -3279,8 +3334,8 @@

Re-assessed symptoms

-

-AEDB$indexsymptoms_worst
+

+AEDB$indexsymptoms_worst
<labelled<double>[3791]>: Latest cerebrovascular symptoms (indication CEA).
@@ -3317,7 +3372,7 @@ 

Re-assessed symptoms

-
AEDB$indexsymptoms_worst_4g
+
AEDB$indexsymptoms_worst_4g
<labelled<double>[3791]>:  symptoms strokefenotype en symptoms.4g .
@@ -3354,7 +3409,7 @@ 

Re-assessed symptoms

-
AEDB$indexsymptoms_latest
+
AEDB$indexsymptoms_latest
<labelled<double>[3791]>: Latest cerebrovascular symptoms (indication CEA).
@@ -3391,7 +3446,7 @@ 

Re-assessed symptoms

-
AEDB$indexsymptoms_latest_4g
+
AEDB$indexsymptoms_latest_4g
<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
-AEDB[,"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
-
-# Symptoms.Update3G
-AEDB[,"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"
-
-detach(AEDB)
-
-table(AEDB$Symptoms.Update2G, AEDB$Symptoms.5G, useNA = "ifany")
+

+# Fix symptoms
+attach(AEDB)
+
+# Symptoms.Update2G
+AEDB[,"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
+
+# Symptoms.Update3G
+AEDB[,"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"
+
+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)
-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"
-detach(AEDB)
-
-table(AEDB$DM.composite, AEDB$DiabetesStatus)
+

+# Fix diabetes
+attach(AEDB)
+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"
+detach(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)
-AEDB$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)
-
-# 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)
+AEDB$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)
+
+# 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)
-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$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
-detach(AEDB)
-
-cat("\n* Current smoking status.\n")
+
attach(AEDB)
+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$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)
-AEDB[,"AlcoholUse"] <- NA
-AEDB$AlcoholUse[diet810 == -999] <- NA
-AEDB$AlcoholUse[diet810 == 0] <- "No"
-AEDB$AlcoholUse[diet810 == 1] <- "Yes"
-detach(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)
+AEDB[,"AlcoholUse"] <- NA
+AEDB$AlcoholUse[diet810 == -999] <- NA
+AEDB$AlcoholUse[diet810 == 0] <- "No"
+AEDB$AlcoholUse[diet810 == 1] <- "Yes"
+detach(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)
-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"
-detach(AEDB)
-
-table(AEDB$CAD_history)
+

+# Fix diabetes
+attach(AEDB)
+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"
+detach(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)
-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"
-detach(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)
+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"
+detach(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

-
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$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)))
-
library(labelled)
-AEDB$Gender <- to_factor(AEDB$Gender)
-library(patchwork)
-
-p1 <- ggpubr::gghistogram(AEDB, "macmean0", 
-                    # 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)
+AEDB$Gender <- to_factor(AEDB$Gender)
+library(patchwork)
+
+p1 <- ggpubr::gghistogram(AEDB, "macmean0", 
+                    # 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`.
-
p2 <- ggpubr::gghistogram(AEDB, "MAC_rankNorm", 
-                    # 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())
+
p2 <- ggpubr::gghistogram(AEDB, "MAC_rankNorm", 
+                    # 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`.
-
p1 | p2 
+
p1 | p2 

-

-p1 <- ggpubr::gghistogram(AEDB, "smcmean0", 
-                    # 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())
+

+p1 <- ggpubr::gghistogram(AEDB, "smcmean0", 
+                    # 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`.
-
p2 <- ggpubr::gghistogram(AEDB, "SMC_rankNorm", 
-                    # 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())
+
p2 <- ggpubr::gghistogram(AEDB, "SMC_rankNorm", 
+                    # 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`.
-
p1 | p2 
+
p1 | p2 

-

-
-p1 <- ggpubr::gghistogram(AEDB, "neutrophils", 
-                    # 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())
+

+
+p1 <- ggpubr::gghistogram(AEDB, "neutrophils", 
+                    # 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`.
-
p2 <- ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm", 
-                    # 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())
+
p2 <- ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm", 
+                    # 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`.
-
p1 | p2 
+
p1 | p2 

-

-
-p1 <- ggpubr::gghistogram(AEDB, "Mast_cells_plaque", 
-                    # 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())
+

+
+p1 <- ggpubr::gghistogram(AEDB, "Mast_cells_plaque", 
+                    # 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`.
-
p2 <- ggpubr::gghistogram(AEDB, "MastCells_rankNorm", 
-                    # 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())
+
p2 <- ggpubr::gghistogram(AEDB, "MastCells_rankNorm", 
+                    # 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`.
-
p1 | p2 
+
p1 | p2 

-

-
-p1 <- ggpubr::gghistogram(AEDB, "vessel_density_averaged", 
-                    # 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())
+

+
+p1 <- ggpubr::gghistogram(AEDB, "vessel_density_averaged", 
+                    # 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`.
-
p2 <- ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm", 
-                    # 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())
+
p2 <- ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm", 
+                    # 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`.
-
p1 | p2 
+
p1 | p2 

-

-rm(p1, p2)
+

+rm(p1, p2)
@@ -4115,17 +4170,17 @@

Plaque phenotypes

-
# Plaque vulnerability
-require(labelled)
-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)
-
-table(AEDB$Macrophages.bin)
+
# Plaque vulnerability
+require(labelled)
+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)
+
+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
-AEDB[,"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
-
-# fat instability
-AEDB[,"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
-
-# col instability 
-AEDB[,"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
-
-# smc instability
-AEDB[,"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
-
-# iph instability
-AEDB[,"IPH_Instability"] <- NA
-AEDB$IPH_Instability[IPH.bin == -999] <- NA
-AEDB$IPH_Instability[IPH.bin == "no"] <- 0
-AEDB$IPH_Instability[IPH.bin == "yes"] <- 1
-
-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
+AEDB[,"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
+
+# fat instability
+AEDB[,"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
+
+# col instability 
+AEDB[,"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
+
+# smc instability
+AEDB[,"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
+
+# iph instability
+AEDB[,"IPH_Instability"] <- NA
+AEDB$IPH_Instability[IPH.bin == -999] <- NA
+AEDB$IPH_Instability[IPH.bin == "no"] <- 0
+AEDB$IPH_Instability[IPH.bin == "yes"] <- 1
+
+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 <- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
-                                )
-
-table(AEDB$Plaque_Vulnerability_Index, useNA = "ifany")
+
# creating vulnerability index
+AEDB <- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
+                                )
+
+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)
-ae.gender <- to_factor(AEDB$Gender)
-ae.hospital <- to_factor(AEDB$Hospital)
-table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
+
library(data.table)
+require(labelled)
+ae.gender <- to_factor(AEDB$Gender)
+ae.hospital <- to_factor(AEDB$Hospital)
+table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
        Hospital
@@ -4407,8 +4462,8 @@ 

Prepare baseline summary

male 1211 1420
-
ae.artery <- to_factor(AEDB$Artery_summary)
-table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
+
ae.artery <- to_factor(AEDB$Artery_summary)
+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'... :-)
-
-AEDB$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)
-
-require(labelled)
-AEDB$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.full <- subset(AEDB,
-                    informedconsent != "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")
-# 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'... :-)
+
+AEDB$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)
+
+require(labelled)
+AEDB$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.full <- subset(AEDB,
+                    informedconsent != "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")
+# 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
-basetable_vars = c("Hospital", 
-                   "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")
-
-basetable_bin = c("Hospital", 
-                  "Artery_summary",
-                  "Gender")
-# basetable_bin
-
-basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
-# basetable_con
+ +
# Baseline table variables
+basetable_vars = c("Hospital", 
+                   "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")
+
+basetable_bin = c("Hospital", 
+                  "Artery_summary",
+                  "Gender")
+# basetable_bin
+
+basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
+# 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
-AEDB.tableOne = print(CreateTableOne(vars = basetable_vars, 
-                                         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
+AEDB.tableOne = print(CreateTableOne(vars = basetable_vars, 
+                                         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)
-temp <- EM_samples %>% select(., "Studynumber") %>%
-  distinct(.)
-
-AEDB_EM <- merge(temp,
-                 AEDB,
-                 by.x = "Studynumber",
-                 by.y = "STUDY_NUMBER", 
-                 sort = FALSE)
-
-AEDB_EM.full <- subset(AEDB_EM,
-                    informedconsent != "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")
-# AEDB_EM.full[1:10, 1:10]
-
-rm(temp)
+
# Remove duplicate rows of the dataframe
+library(dplyr)
+temp <- EM_samples %>% select(., "Studynumber") %>%
+  distinct(.)
+
+AEDB_EM <- merge(temp,
+                 AEDB,
+                 by.x = "Studynumber",
+                 by.y = "STUDY_NUMBER", 
+                 sort = FALSE)
+
+AEDB_EM.full <- subset(AEDB_EM,
+                    informedconsent != "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")
+# AEDB_EM.full[1:10, 1:10]
+
+rm(temp)
-
# Create baseline tables
-# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
-AEDB_EM.full.tableOne = print(CreateTableOne(vars = basetable_vars, 
-                                         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
+AEDB_EM.full.tableOne = print(CreateTableOne(vars = basetable_vars, 
+                                         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)           
-

-basetable_vars = c("Hospital", 
-                   "Artery_summary")
-
-basetable_bin = c("Hospital", 
-                  "Artery_summary")
-
-# Create baseline tables
-# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
-AEDB_EM.tableOne = print(CreateTableOne(vars = basetable_vars, 
-                                         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]
+

+basetable_vars = c("Hospital", 
+                   "Artery_summary")
+
+basetable_bin = c("Hospital", 
+                  "Artery_summary")
+
+# Create baseline tables
+# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
+AEDB_EM.tableOne = print(CreateTableOne(vars = basetable_vars, 
+                                         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 0000000000000000000000000000000000000000..0a975e53d4728e2f725248b8e1ccc2ca5b84499a GIT binary patch literal 7234 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 b4*y-%v{Y{)!-s-`hy1W0^9hsc`s)7yOx##a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..592e79a8eabf6bf778f9380f869d57bd9b7dbd31 GIT binary patch literal 7011 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 J(}SO?{|A4D+qeJ# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a14caee52f20e5ce6b429696ea4ad8e5f41d8be6 GIT binary patch literal 6731 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