Fig. S2 B

Hierarchical clustering

Scrattch.hicat perform hierarchical clustering on a cluster correlation matrix based on median expression values for the top 50 most DEGs between every pair of clusters. It estimates branch confidence level using a bootstrap approach implemented by the pvclust package

## Bootstrap (r = 0.5)... Done.
## Bootstrap (r = 0.6)... Done.
## Bootstrap (r = 0.7)... Done.
## Bootstrap (r = 0.8)... Done.
## Bootstrap (r = 0.9)... Done.
## Bootstrap (r = 1.0)... Done.
## Bootstrap (r = 1.1)... Done.
## Bootstrap (r = 1.2)... Done.
## Bootstrap (r = 1.3)... Done.
## Bootstrap (r = 1.4)... Done.
## Bootstrap (r = 0.5)... Done.
## Bootstrap (r = 0.6)... Done.
## Bootstrap (r = 0.7)... Done.
## Bootstrap (r = 0.8)... Done.
## Bootstrap (r = 0.9)... Done.
## Bootstrap (r = 1.0)... Done.
## Bootstrap (r = 1.1)... Done.
## Bootstrap (r = 1.2)... Done.
## Bootstrap (r = 1.3)... Done.
## Bootstrap (r = 1.4)... Done.

Session Info

## [1] "30 novembre, 2020, 11,36"
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.5 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] pvclust_2.2-0         matrixStats_0.55.0    dendextend_1.12.0    
##  [4] RColorBrewer_1.1-2    scrattch.vis_0.0.210  purrr_0.3.3          
##  [7] ggbeeswarm_0.6.0      dplyr_0.8.3           scrattch.hicat_0.0.16
## [10] Seurat_2.3.4          Matrix_1.2-17         cowplot_1.0.0        
## [13] ggplot2_3.2.1        
## 
## loaded via a namespace (and not attached):
##   [1] Rtsne_0.15          colorspace_1.4-1    class_7.3-17       
##   [4] modeltools_0.2-22   ggridges_0.5.1      mclust_5.4.5       
##   [7] htmlTable_1.13.2    base64enc_0.1-3     rstudioapi_0.11    
##  [10] proxy_0.4-23        farver_2.0.1        npsurv_0.4-0       
##  [13] flexmix_2.3-15      bit64_4.0.2         codetools_0.2-16   
##  [16] splines_3.6.3       R.methodsS3_1.7.1   lsei_1.2-0         
##  [19] robustbase_0.93-5   knitr_1.26          zeallot_0.1.0      
##  [22] jsonlite_1.7.0      Formula_1.2-3       ica_1.0-2          
##  [25] cluster_2.1.0       kernlab_0.9-29      png_0.1-7          
##  [28] R.oo_1.23.0         compiler_3.6.3      httr_1.4.1         
##  [31] backports_1.1.5     assertthat_0.2.1    lazyeval_0.2.2     
##  [34] lars_1.2            acepack_1.4.1       htmltools_0.5.0    
##  [37] tools_3.6.3         igraph_1.2.5        gtable_0.3.0       
##  [40] glue_1.4.1          RANN_2.6.1          reshape2_1.4.3     
##  [43] Rcpp_1.0.5          vctrs_0.2.0         gdata_2.18.0       
##  [46] ape_5.3             nlme_3.1-141        iterators_1.0.12   
##  [49] fpc_2.2-3           gbRd_0.4-11         lmtest_0.9-37      
##  [52] xfun_0.18           stringr_1.4.0       lifecycle_0.1.0    
##  [55] irlba_2.3.3         gtools_3.8.1        DEoptimR_1.0-8     
##  [58] MASS_7.3-53         zoo_1.8-6           scales_1.1.0       
##  [61] doSNOW_1.0.18       parallel_3.6.3      yaml_2.2.1         
##  [64] reticulate_1.13     pbapply_1.4-2       gridExtra_2.3      
##  [67] rpart_4.1-15        segmented_1.0-0     latticeExtra_0.6-28
##  [70] stringi_1.4.6       highr_0.8           foreach_1.4.7      
##  [73] checkmate_1.9.4     caTools_1.17.1.2    bibtex_0.4.2       
##  [76] Rdpack_0.11-0       SDMTools_1.1-221.1  rlang_0.4.7        
##  [79] pkgconfig_2.0.3     dtw_1.21-3          prabclus_2.3-1     
##  [82] bitops_1.0-6        evaluate_0.14       lattice_0.20-41    
##  [85] ROCR_1.0-7          labeling_0.3        htmlwidgets_1.5.1  
##  [88] bit_4.0.4           tidyselect_0.2.5    plyr_1.8.4         
##  [91] magrittr_1.5        R6_2.4.1            snow_0.4-3         
##  [94] gplots_3.0.1.1      Hmisc_4.3-0         pillar_1.4.2       
##  [97] foreign_0.8-72      withr_2.1.2         fitdistrplus_1.0-14
## [100] mixtools_1.1.0      survival_2.44-1.1   nnet_7.3-14        
## [103] tsne_0.1-3          tibble_2.1.3        crayon_1.3.4       
## [106] hdf5r_1.3.2.9000    KernSmooth_2.23-15  rmarkdown_2.5      
## [109] viridis_0.5.1       grid_3.6.3          data.table_1.12.6  
## [112] metap_1.1           digest_0.6.25       diptest_0.75-7     
## [115] tidyr_1.0.0         R.utils_2.9.0       stats4_3.6.3       
## [118] munsell_0.5.0       viridisLite_0.3.0   beeswarm_0.2.3     
## [121] vipor_0.4.5

  1. Institute of Psychiatry and Neuroscience of Paris, INSERM U1266, 75014, Paris, France,

LS0tCnRpdGxlOiAiU3ViLXBhbGxpYWwgbmV1cm9ucyBGaWcuUzIiCmF1dGhvcjoKICAgLSBNYXR0aGlldSBNb3JlYXVeW0luc3RpdHV0ZSBvZiBQc3ljaGlhdHJ5IGFuZCBOZXVyb3NjaWVuY2Ugb2YgUGFyaXMsIElOU0VSTSBVMTI2NiwgNzUwMTQsIFBhcmlzLCBGcmFuY2UsIG1hdHRoaWV1Lm1vcmVhdUBpbnNlcm0uZnJdIFshW10oaHR0cHM6Ly9vcmNpZC5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy9pbWFnZXMvb3JjaWRfMTZ4MTYucG5nKV0oaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAyLTI1OTItMjM3MykKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBkZl9wcmludDogdGliYmxlCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sKICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKLS0tCgpgYGB7Y3NzLCBlY2hvPUZBTFNFfQpoMSB7CiAgZm9udC1zaXplOiAzNHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogI2U2NGQwMDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogNDBweDsKICBtYXJnaW4tdG9wOiAycmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICBjb2xvcjogIzAwMDAwMDsKfQpoMiB7CiAgZm9udC1zaXplOiAzMHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoMyB7CiAgZm9udC1zaXplOiAyNHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoNCB7CiAgZm9udC1zaXplOiAyMHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQpoNSB7CiAgZm9udC1zaXplOiAxOHB4OwogIG1hcmdpbi10b3A6IDJyZW07CiAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICBjb2xvcjogIzAwMDAwMDsKfQoKLnNjcm9sbC0xMDAgewogIG1heC1oZWlnaHQ6IDIwMHB4OwogIG92ZXJmbG93LXk6IGF1dG87CiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKfQoKcCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduID0gJ2NlbnRlcicsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UpCmBgYAoKIyBMb2FkIGxpYnJhcmllcyBhbmQgUUNGaWx0ZXJlZCBkYXRhc2V0CgpgYGB7ciB9CiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoc2NyYXR0Y2guaGljYXQpCmxpYnJhcnkoc2NyYXR0Y2gudmlzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShkZW5kZXh0ZW5kKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KE1hdHJpeCkKCgojIFNldCBnZ3Bsb3QgdGhlbWUKdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkKYGBgCgpgYGB7cn0KIyBMb2FkIHRoZSBmdWxsIGFubm90YXRlZCBkYXRhc2V0CkFsbGNlbGxzLmRhdGEgPC0gcmVhZFJEUygiLi9DbHVzdGVyZWQuY2VsbHMuUkRTIikKYGBgCgpgYGB7cn0KIyBFeHRyYWN0IFN1YnBhbGxpYWwgbmV1cm9uIGNsdXN0ZXJzCmdhYmEuY2x1c3RlcnMgPC0gcGFzdGUwKCBjKCJMTi5HQUJBLiIpLGMoIjEiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAiMTEiKSkKR0FCQS5MTi5kYXRhIDwtIFN1YnNldERhdGEoQWxsY2VsbHMuZGF0YSwgaWRlbnQudXNlID0gZ2FiYS5jbHVzdGVycywgc3Vic2V0LnJhdyA9IFQsICBkby5jbGVhbiA9IEYpCgojIEV4Y2x1ZGUgb25lIG91dGxpZXIgY2VsbCBvbiBTcHJpbmcgY29vcmRpbmF0ZXMKb3V0bGllciA8LSByb3duYW1lcyhzdWJzZXQoR0FCQS5MTi5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3MsIEdBQkEuTE4uZGF0YUBkciRzcHJpbmdAY2VsbC5lbWJlZGRpbmdzWywyXSA9PSBtYXgoR0FCQS5MTi5kYXRhQGRyJHNwcmluZ0BjZWxsLmVtYmVkZGluZ3NbLDJdKSkpCkNlbGx0b2tlZXAgPC0gR0FCQS5MTi5kYXRhQG1ldGEuZGF0YSRCYXJjb2Rlc1tHQUJBLkxOLmRhdGFAbWV0YS5kYXRhJEJhcmNvZGVzICE9IG91dGxpZXJdCkdBQkEuTE4uZGF0YSA8LSBTdWJzZXREYXRhKEdBQkEuTE4uZGF0YSwgY2VsbHMudXNlID0gIENlbGx0b2tlZXAgLCBzdWJzZXQucmF3ID0gVCwgIGRvLmNsZWFuID0gRikKCnJtKGxpc3QgPSBscygpWyFscygpICVpbiUgYygiR0FCQS5MTi5kYXRhIildKQpgYGAKCiMgRmlnIFMyIEEKCmBgYHtyfQojIExvYWQgdGhlIGZ1bGwgZGF0YXNldApBbGxjZWxscy5kYXRhIDwtIHJlYWRSRFMoIi4vUUMuZmlsdGVyZWQuY2VsbHMuUkRTIikKCiMgVHJhbnNmZXIgdGhlIGlkZW50aXRpZXMKUmVuYW1lLkNsdXN0IDwtICBmdW5jdGlvbihDbHVzdGRhdGEsIFJhd1FDZGF0YSkgewogIHVuQ2x1c3RlcmVkLmNlbGxzIDwtIFJhd1FDZGF0YUBtZXRhLmRhdGEkQmFyY29kZXMKICBSYXdRQ2RhdGEgPC0gU2V0SWRlbnQoUmF3UUNkYXRhLCBjZWxscy51c2UgPSB1bkNsdXN0ZXJlZC5jZWxscywgaWRlbnQudXNlID0gIkFsbC5VbmNsdXN0ZXJlZC5DZWxscyIpCiAgCiAgZm9yKGkgaW4gdW5pcXVlKENsdXN0ZGF0YUBtZXRhLmRhdGEkQ2x1c3Rlci5pZGVudCkpewogIE5ldy5pZGVudCA8LSBpCiAgQmFyY29kZXMgPC0gcm93bmFtZXMoc3Vic2V0KENsdXN0ZGF0YUBtZXRhLmRhdGEsIENsdXN0ZGF0YUBtZXRhLmRhdGEkQ2x1c3Rlci5pZGVudCA9PSBpKSkKICBwcmludChwYXN0ZTAoIkNsdXN0ZXJfIixpLCI6ICIsbGVuZ3RoKEJhcmNvZGVzKSwgIiBDZWxscyIpKQogIEJhcmNvZGVzIDwtIEJhcmNvZGVzW0JhcmNvZGVzICVpbiUgcm93bmFtZXMoUmF3UUNkYXRhQG1ldGEuZGF0YSldCiAgUmF3UUNkYXRhIDwtIFNldElkZW50KFJhd1FDZGF0YSwgY2VsbHMudXNlID0gQmFyY29kZXMgLGlkZW50LnVzZSA9IHBhc3RlMCgiTE4uR2x1dC4iLGkpKQogIH0KICByZXR1cm4oUmF3UUNkYXRhKQp9CgpBbGxjZWxscy5kYXRhIDwtIFJlbmFtZS5DbHVzdChDbHVzdGRhdGEgPSBHQUJBLkxOLmRhdGEsIFJhd1FDZGF0YSA9IEFsbGNlbGxzLmRhdGEpCmBgYAoKYGBge3IgZmlnLmRpbT1jKDUuMywgNCl9CkRpbVBsb3QoQWxsY2VsbHMuZGF0YSwKICAgICAgICByZWR1Y3Rpb24udXNlID0gInNwcmluZyIsIAogICAgICAgIGRpbS4xID0gMSwKICAgICAgICBkaW0uMiA9IDIsCiAgICAgICAgZG8ubGFiZWw9VCwKICAgICAgICBsYWJlbC5zaXplID0gMiwKICAgICAgICBuby5sZWdlbmQgPSBULAogICAgICAgIGNvbHMudXNlID0gYygiIzk2OTY5NiIsIiNlYzc1NmQiLCAiI2M3NzNhNyIsICIjNzI5M2M4IiwgIiNiNzlmMGIiLCAiIzNjYTczZiIsIiMzMWI2YmQiKSkKYGBgCgojIEZpZy4gUzIgQgoKIyMgQW5ub3RhdGlvbiBkYXRhLmZyYW1lCgpgYGB7cn0KY29sb3JzIDwtIGMoIiNjNzczYTciLCAiI2I3OWYwYiIsICIjM2NhNzNmIiwgIiMzMWI2YmQiLCAiI2VjNzU2ZCIsICIjNzI5M2M4IikKCiMgUHJlcGFyZSBhbm5vdGF0aW9uIGZvciBoaWNhdCBwaXBlbGluZQpjb2xvcnNpZGVudCA8LSBjYmluZChpZGVudCA9IHVuaXF1ZShhcy5jaGFyYWN0ZXIoR0FCQS5MTi5kYXRhQGlkZW50KSksCiAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IGNvbG9ycywKICAgICAgICAgICAgICAgICAgICAgaWQgPSB1bmlxdWUoYXMuY2hhcmFjdGVyKEdBQkEuTE4uZGF0YUBpZGVudCkpKQoKIyBDcmVhdGUgYW5ub3RhdGlvbiBkYXRhLmZyYW1lCmFubm8uZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZCgKICBzYW1wbGVfbmFtZSA9IHJvdy5uYW1lcyhHQUJBLkxOLmRhdGFAbWV0YS5kYXRhKSwKICBwcmltYXJ5X3R5cGVfaWQgPSBjb2xvcnNpZGVudFttYXRjaChhcy5jaGFyYWN0ZXIoR0FCQS5MTi5kYXRhQGlkZW50KSwgY29sb3JzaWRlbnRbLDFdKSwzXSwKICBwcmltYXJ5X3R5cGVfbGFiZWwgPSBhcy5jaGFyYWN0ZXIoR0FCQS5MTi5kYXRhQGlkZW50KSwKICBwcmltYXJ5X3R5cGVfY29sb3IgPSBjb2xvcnNpZGVudFttYXRjaChhcy5jaGFyYWN0ZXIoR0FCQS5MTi5kYXRhQGlkZW50KSwgY29sb3JzaWRlbnRbLDFdKSwyXQopKQoKIyBNYWtlIGEgZGF0YS5mcmFtZSBvZiB1bmlxdWUgY2x1c3RlciBpZCwgdHlwZSwgY29sb3IsIGFuZCBicm9hZCB0eXBlCmNsLmRmIDwtIGFubm8uZGYgJT4lCiAgICAgICAgIHNlbGVjdChwcmltYXJ5X3R5cGVfaWQsIHByaW1hcnlfdHlwZV9sYWJlbCwgcHJpbWFyeV90eXBlX2NvbG9yKSAlPiUKICAgICAgICAgdW5pcXVlKCkKCmNvbG5hbWVzKGNsLmRmKVsxOjNdIDwtIGMoImNsdXN0ZXJfaWQiLCAiY2x1c3Rlcl9sYWJlbCIsICJjbHVzdGVyX2NvbG9yIikKCiMgU29ydCBieSBjbHVzdGVyX2lkCmNsLmRmIDwtIGFycmFuZ2UoY2wuZGYsIGNsdXN0ZXJfaWQpCnJvdy5uYW1lcyhjbC5kZikgPC0gY2wuZGYkY2x1c3Rlcl9pZAoKY2wuZmFjdCA8LSBzZXROYW1lcyhmYWN0b3IoYW5uby5kZiRwcmltYXJ5X3R5cGVfaWQpLCBhbm5vLmRmJHNhbXBsZV9uYW1lKQpgYGAKCiMjIEV4cHJlc3Npb24gbWF0cml4CgpgYGB7cn0KIyBGaWx0ZXIgZ2VuZXMKbnVtLmNlbGxzIDwtIE1hdHJpeDo6cm93U3VtcyhHQUJBLkxOLmRhdGFAZGF0YSA+IDApIApnZW5lcy51c2UgPC0gbmFtZXMoeCA9IG51bS5jZWxsc1t3aGljaCh4ID0gbnVtLmNlbGxzID49IDEwKV0pIApHZW5lc1RvUmVtb3ZlIDwtIGMoZ3JlcChwYXR0ZXJuID0gIiheUnBsfF5ScHN8Xk1ycCkiLCB4ID0gZ2VuZXMudXNlLCB2YWx1ZSA9IFRSVUUpLCBncmVwKHBhdHRlcm4gPSAiXm10LSIsIHggPSBnZW5lcy51c2UsIHZhbHVlID0gVFJVRSksICJYaXN0IikKCmdlbmVzLnVzZSA8LSBnZW5lcy51c2VbIWdlbmVzLnVzZSAlaW4lIEdlbmVzVG9SZW1vdmVdIDsgcm0oR2VuZXNUb1JlbW92ZSwgbnVtLmNlbGxzKQoKR0FCQS5MTi5kYXRhQHJhdy5kYXRhIDwtIEdBQkEuTE4uZGF0YUByYXcuZGF0YVtnZW5lcy51c2UsIF0KR0FCQS5MTi5kYXRhIDwtIE5vcm1hbGl6ZURhdGEob2JqZWN0ID0gR0FCQS5MTi5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLmZhY3RvciA9IHJvdW5kKG1lZGlhbihHQUJBLkxOLmRhdGFAbWV0YS5kYXRhJG5VTUkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LnByb2dyZXNzID0gRikKCiMgRmluZCBhbGwgdmFyIGdlbmVzCkdBQkEuTE4uZGF0YSA8LSBGaW5kVmFyaWFibGVHZW5lcyhvYmplY3QgPSBHQUJBLkxOLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4uZnVuY3Rpb24gPSBFeHBNZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwZXJzaW9uLmZ1bmN0aW9uID0gTG9nVk1SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Lmxvdy5jdXRvZmYgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LmhpZ2guY3V0b2ZmID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5jdXRvZmYgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8ucGxvdCA9IEYsIGRpc3BsYXkucHJvZ3Jlc3MgPSBGKQoKZGdlTWF0cml4X2NvdW50IDwtIGFzLm1hdHJpeChHQUJBLkxOLmRhdGFAcmF3LmRhdGEpW3Jvd25hbWVzKEdBQkEuTE4uZGF0YUByYXcuZGF0YSkgJWluJSBHQUJBLkxOLmRhdGFAdmFyLmdlbmVzLF0KZGdlTWF0cml4X2NwbSA8LSBjcG0oZGdlTWF0cml4X2NvdW50KSAKbm9ybS5kYXQgPC0gbG9nMihkZ2VNYXRyaXhfY3BtICsgMSkgOyBybShkZ2VNYXRyaXhfY3BtKQoKRGF0YS5tYXRyaXggPC0gbGlzdChyYXcuZGF0PWRnZU1hdHJpeF9jb3VudCwgbm9ybS5kYXQ9bm9ybS5kYXQpIDsgYXR0YWNoKERhdGEubWF0cml4KQoKcm0oZGdlTWF0cml4X2NvdW50LG5vcm0uZGF0KQpgYGAKCiMjIEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nCgpTY3JhdHRjaC5oaWNhdCBwZXJmb3JtIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIG9uIGEgY2x1c3RlciBjb3JyZWxhdGlvbiBtYXRyaXggYmFzZWQgb24gbWVkaWFuIGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGUgdG9wIDUwIG1vc3QgREVHcyBiZXR3ZWVuIGV2ZXJ5IHBhaXIgb2YgY2x1c3RlcnMuIEl0IGVzdGltYXRlcyBicmFuY2ggY29uZmlkZW5jZSBsZXZlbCB1c2luZyBhIGJvb3RzdHJhcCBhcHByb2FjaCBpbXBsZW1lbnRlZCBieSB0aGUgcHZjbHVzdCBwYWNrYWdlCgpgYGB7cn0KIyBUYWtlIG1lZGlhbiBleHByZXNzaW9uIG92ZXIgY2x1c3RlcgpjbC5tZWQgPC0gZ2V0X2NsX21lZGlhbnMobm9ybS5kYXQsIGNsLmZhY3QpCmBgYAoKYGBge3J9CiMgQnVpbGQgdGhlIGRlbmRyb2dyYW0KZGVuZC5yZXN1bHQgPC0gYnVpbGRfZGVuZChjbC5tZWRbLGxldmVscyhjbC5mYWN0KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbC5jb2xvcj0gc2V0TmFtZXMoYXMuY2hhcmFjdGVyKGNsLmRmJGNsdXN0ZXJfY29sb3IpLCByb3cubmFtZXMoY2wuZGYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYm9vdCA9IDEwMCkKCiMgQXR0YWNoIGNsdXN0ZXIgbGFiZWxzIHRvIHRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUKZGVuZC5sYWJlbGVkIDwtIGRlbmQucmVzdWx0JGRlbmQKbGFiZWxzKGRlbmQubGFiZWxlZCkgPC0gY2wuZGZbbGFiZWxzKGRlbmQubGFiZWxlZCksICJjbHVzdGVyX2xhYmVsIl0KYGBgCgpgYGB7ciBmaWcuZGltPWMoNSwgMy41KX0KIyBSb3RhdGUgZGVuZHJvZ3JhbW1lIGxlYWZzCk5ld09yZGVyIDwtIHBhc3RlMCgiTE4uR0FCQS4iLCBjKDEsMTEsOCw3LDEwLDkpKQpjbC5mYWN0IDwtIGZhY3RvcihjbC5mYWN0LCBsZXZlbHMgPSBOZXdPcmRlcikKbC5yYW5rIDwtIHNldE5hbWVzKDE6bnJvdyhjbC5kZiksIE5ld09yZGVyKSAjc2V0IHRoZSBjbHVzdGVyIG9yZGVyIAoKIyBDb2xvciBvZiB0aGUgbGVhZiBub2Rlcy4KbC5jb2xvciA8LSBzZXROYW1lcyhhcy5jaGFyYWN0ZXIoY2wuZGYkY2x1c3Rlcl9jb2xvciksIHJvdy5uYW1lcyhjbC5kZikpIAoKZGVuZC5yZXN1bHQgPC0gYnVpbGRfZGVuZChjbC5tZWRbLGxldmVscyhjbC5mYWN0KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbC5yYW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgIGwuY29sb3I9bC5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYm9vdCA9IDEwMCkgCgpkZW5kIDwtIGRlbmQucmVzdWx0JGRlbmQKCmRlbmQubGFiZWxlZCA8LSBkZW5kLnJlc3VsdCRkZW5kCmxhYmVscyhkZW5kLmxhYmVsZWQpIDwtIGNsLmRmW2xhYmVscyhkZW5kLmxhYmVsZWQpLCAiY2x1c3Rlcl9sYWJlbCJdCgpwbG90KGRlbmQubGFiZWxlZCkgCmBgYAoKIyMgQnVpbGQgdGhlIG1hcmtlcnMgYmFycGxvdAoKYGBge3IgZmlnLmRpbT1jKDcsIDEwKSwgZmlnLmNhcD0gIk1hbnVzY3JpcHQgRmlnLiBTMkIifQpkYXRhIDwtIGNiaW5kKHNhbXBsZV9uYW1lID0gY29sbmFtZXMoR0FCQS5MTi5kYXRhQGRhdGEpLAogICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUodChhcy5tYXRyaXgoR0FCQS5MTi5kYXRhQGRhdGEpKSkpCgpTZWxlY3RlZC5tYXJrZXJzIDwtIGMoIkZveGcxIiwiQmNsMTFiIiwiR2FkMSIsICJHYWQyIiwiRGx4MSIsIkRseDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRGx4NSIsIkRseDYiLCAiTGh4NiIsIlNzdCIsIkNhbGIxIiwiR20xNzc1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJOcHkiLCAiTnhwaDEiLCAiUnBybSIsICJFbG1vMSIsIkFyeCIsIk1laXMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJiZm94MSIsIlpmcDUwMyIsIlBvdTNmMSIsICJJc2wxIiwgIkViZjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRGxjMSIsIkRsazEiLCJOZWZtIiwiTmVmbCIsIlN5YnUiLCJMeXBkMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ2YiIsICJGZ2YxNSIsICJaaWMxIiwgIlRoIiwiUG5vYyIsICJDcmFicDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiS2xoZGM4YiIsIlBheDYiLCAiU3A4IiwiU2l4MyIsIlRzaHoyIiwgIlBobGRhMSIpCgpzYW1wbGVfYmFyX3Bsb3QoZGF0YSwgCiAgICAgICAgICAgICAgICBhbm5vLmRmLCAKICAgICAgICAgICAgICAgIGdlbmVzID0gU2VsZWN0ZWQubWFya2VycywKICAgICAgICAgICAgICAgIGdyb3VwX29yZGVyID0gbGV2ZWxzKGNsLmZhY3QpLAogICAgICAgICAgICAgICAgZ3JvdXBpbmcgPSAicHJpbWFyeV90eXBlIiwKICAgICAgICAgICAgICAgIGxvZ19zY2FsZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgZm9udF9zaXplID0gNywKICAgICAgICAgICAgICAgIGxhYmVsX2hlaWdodCA9IDEwLAogICAgICAgICAgICAgICAgbGFiZWxfdHlwZSA9ICJhbmdsZSIsCiAgICAgICAgICAgICAgICBiZ19jb2xvciA9IiNmN2Y3ZjciKQpgYGAKCiMgRmlnLiBTMiBDCgpgYGB7ciBmaWcuY2FwPSAiTWFudXNjcmlwdCBGaWcuIFMyQyJ9CkZlYXR1cmVQbG90KG9iamVjdCA9IEdBQkEuTE4uZGF0YSwKICAgICAgICAgICAgZmVhdHVyZXMucGxvdCA9IGMoIlBheDYiLCAiU3A4IiwgIlNpeDMiLCAiSXNsMSIsICJFYmYxIiwgIkRsazEiLCAiVHNoejIiLCAiVGgiLCAiTGh4NiIpLAogICAgICAgICAgICBjb2xzLnVzZSA9IGMoImdyZXk5MCIsIGJyZXdlci5wYWwoOSwiWWxHbkJ1IikpLAogICAgICAgICAgICByZWR1Y3Rpb24udXNlID0gInNwcmluZyIsCiAgICAgICAgICAgIG5vLmxlZ2VuZCA9IFQsCiAgICAgICAgICAgIG5Db2wgPSAzLAogICAgICAgICAgICBvdmVybGF5ID0gRiwKICAgICAgICAgICAgZGFyay50aGVtZSA9IEYpCmBgYAoKIyBTZXNzaW9uIEluZm8KYGBge3J9CiNkYXRlCmZvcm1hdChTeXMudGltZSgpLCAiJWQgJUIsICVZLCAlSCwlTSIpCgojUGFja2FnZXMgdXNlZApzZXNzaW9uSW5mbygpCmBgYAo=