diff --git a/README.md b/README.md
index ccef47c..4300bfb 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,19 @@
An R package (compatible with SCope) to create generic .loom files and extend them with other data e.g.: SCENIC regulons, Seurat clusters and markers, ... The package can also be used to extract
data from .loom files.
+## Requirements
+- HDF5 >= 1.10.1
+
+Version 1.10.1 can be installed with this snippet:
+```
+wget https://support.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.10.1.tar
+cd hdf5-1.10.1
+./configure
+make -j4
+make check
+make install
+```
+
## Installation
Installation should take less than one minute.
diff --git a/vignettes/SCopeLoomR_tutorial.Rmd b/vignettes/SCopeLoomR_tutorial.Rmd
index 481e88a..b636d90 100644
--- a/vignettes/SCopeLoomR_tutorial.Rmd
+++ b/vignettes/SCopeLoomR_tutorial.Rmd
@@ -99,7 +99,6 @@ add_col_attr(loom=loom, key = "Cell type", value=cell.info$cellType, as.annotati
add_col_attr(loom=loom, key = "nGene", value=cell.info$nGene, as.metric = T)
```
-
## Add SCENIC results (Optional)
*(Not run in this example)*
@@ -117,7 +116,6 @@ add_scenic_regulons_auc_matrix(loom=loom, regulons.AUC=getAUC(regulons.AUC))
load(paste0(scenic.dir, "int/3.0_regulons_forAUCell.RData"), verbose=TRUE)
regulon.enrichment.table<-read.table(file = "output/Step2_MotifEnrichment.tsv", header = T, sep = "\t", quote = '', stringsAsFactors = F)
add_scenic_regulons(loom=loom
- , dgem=dgem
, regulons=regulons
, regulon.threshold.assignments=...$threshold.assignment # Optional
, regulon.enrichment.table = regulon.enrichment.table # Optional)
@@ -216,7 +214,7 @@ dgem<-get_dgem(loom = loom)
```{r}
loom<-open_loom(loom = "Aerts_Fly_AdultBrain_Filtered_57k.loom")
-cluster.10.dgem<-get_cluster_dgem_by_name(loom = loom, cluster.name = "MBON - Cluster 57")
+cluster.10.dgem<-get_cluster_dgem_by_name(loom = loom, cluster.name = "Astrocyte-like - Cluster 10")
```
diff --git a/vignettes/SCopeLoomR_tutorial.nb.html b/vignettes/SCopeLoomR_tutorial.nb.html
index 7e15a74..fc5f9d5 100644
--- a/vignettes/SCopeLoomR_tutorial.nb.html
+++ b/vignettes/SCopeLoomR_tutorial.nb.html
@@ -310,7 +310,7 @@
Add SCENIC results (Optional)
(Not run in this example)
-
+
scenic.dir <- "./" # Modify if needed
# Regulons AUC matrix
@@ -323,7 +323,6 @@ Add SCENIC results (Optional)
load(paste0(scenic.dir, "int/3.0_regulons_forAUCell.RData"), verbose=TRUE)
regulon.enrichment.table<-read.table(file = "output/Step2_MotifEnrichment.tsv", header = T, sep = "\t", quote = '', stringsAsFactors = F)
add_scenic_regulons(loom=loom
- , dgem=dgem
, regulons=regulons
, regulon.threshold.assignments=...$threshold.assignment # Optional
, regulon.enrichment.table = regulon.enrichment.table # Optional)
@@ -470,9 +469,9 @@ Get the gene expression matrix
Get the gene expression matrix of a given cluster
-
+
loom<-open_loom(loom = "Aerts_Fly_AdultBrain_Filtered_57k.loom")
-cluster.10.dgem<-get_cluster_dgem_by_name(loom = loom, cluster.name = "MBON - Cluster 57")
+cluster.10.dgem<-get_cluster_dgem_by_name(loom = loom, cluster.name = "Astrocyte-like - Cluster 10")
@@ -480,7 +479,7 @@ Get the gene expression matrix of a given cluster
-LS0tCnRpdGxlOiAiU0NvcGVMb29tUiBUdXRvcmlhbCAtIENyZWF0ZSBhIC5sb29tIGZpbGUgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIGEgLmxvb20iCnBhY2thZ2U6IHIgcGtnX3ZlcignU0NvcGVMb29tUicpCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAga2VlcF9tZDogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwp2aWduZXR0ZTogfAogICVcVmlnbmV0dGVJbmRleEVudHJ5e1NDb3BlTG9vbVJ9IAogICVcVmlnbmV0dGVFbmNvZGluZ3tVVEYtOH0gCiAgJVxWaWduZXR0ZUVuZ2luZXtrbml0cjo6cm1hcmtkb3dufQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoU0NvcGVMb29tUikKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKYGBgCgojIEludHJvZHVjdGlvbgoKVGhlIC5sb29tIGZvcm1hdCBpcyBhIGZpbGUgZm9ybWF0IGRlc2lnbmVkIHRvIHN0b3JlIHZlcnkgbGFyZ2Ugb21pY3MgZGF0YXNldHMuIEl0IGhhcyBiZWVuIGNyZWF0ZWQgaXMgbWFpbnRhaW5lZCBieSB0aGUgW0xpbm5hcnNzb24gbGFiXShodHRwOi8vbGlubmFyc3NvbmxhYi5vcmcvKS4gYFNDb3BlTG9vbVJgIGlzIGFuIFIgcGFja2FnZSB0aGF0IGhlbHBzIHlvdSB0byBjcmVhdGUgZWFzaWx5IC5sb29tIGZpbGVzIHRoYXQgZm9sbG93IHRoZSBkYXRhIFtuYW1pbmcgY29udmVudGlvbnNdKGh0dHA6Ly9saW5uYXJzc29ubGFiLm9yZy9sb29tcHkvY29udmVudGlvbnMvaW5kZXguaHRtbCkgZnJvbSBsb29tcHkuIAoKYFNDb3BlTG9vbVJgIHdhcyBjcmVhdGVkIGFsb25nIHRoZSBkZXZlbG9wbWVudCBvZiBTQ29wZSB0byBoZWxwIHRvIHN0b3JlIGRpZmZlcmVudCBkYXRhIGluc2lkZSB0aGUgLmxvb20gZS5nLjogcmVndWxvbiwgcmVndWxvbiBhY3Rpdml0aWVzIGZyb20gU0NFTklDOyAgLiBUaGVyZWZvcmUsIGl0IAoKIyBJbnN0YWxsYXRpb24KRm9yIGV4YW1wbGU6CmBgYHtyIGluc3RhbGwsIGV2YWw9RkFMU0V9CmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYWVydHNsYWIvU0NvcGVMb29tUiIpCmBgYAoKIyBDcmVhdGluZyBhIGxvb20gb2JqZWN0CgojIyBMb2FkIERhdGEKCihtaW5pbXVtIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0KQoKYGBge3IgbG9hZERhdGF9CmxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCmxpYnJhcnkoU0NvcGVMb29tUikKZGF0YShzY2UpICMgZS5nLiBhIFNpbmdsZUNlbGxFeHBlcmltZW50IAoKIyBER0VNIChEaWdpdGFsIGdlbmUgZXhwcmVzc2lvbiBtYXRyaXgpCmRnZW0gPC0gY291bnRzKHNjZSkKICBkaW0oZGdlbSkKICBjbGFzcyhkZ2VtKQogIGhlYWQoY29sbmFtZXMoZGdlbSkpICAjc2hvdWxkIGNvbnRhaW4gdGhlIENlbGwgSUQvbmFtZQoKIyBLbm93biBjZWxsIGluZm9ybWF0aW9uL2Fubm90YXRpb24gIApjZWxsLmluZm8gPC0gY29sRGF0YShzY2UpCmNlbGwuaW5mbyRuR2VuZSA8LSBjb2xTdW1zKGRnZW0+MCkKICBoZWFkKGNlbGwuaW5mbykKCiMgRGVmYXVsdCBlbWJlZGRpbmcgKGUuZy4gdC1TTkUgb3IgUENBIGNvb3JkaW5hdGVzKQpkYXRhKHRTTkVfZXhwcikKZGVmYXVsdC50c25lIDwtIHRTTkVfZXhwcgpkZWZhdWx0LnRuZS5uYW1lIDwtICJ0LVNORSBvbiBmdWxsIGV4cHJlc3Npb24gbWF0cml4IgpoZWFkKGRlZmF1bHQudHNuZSkKYGBgCgojIyBDcmVhdGUgbG9vbSBmaWxlIAoKYGBge3IgY3JlYXRlTG9vbX0KbGlicmFyeShTQ29wZUxvb21SKQoKIyMjIENyZWF0ZSB0aGUgbWluaW1hbCBsb29tIGZpbGUKZmlsZS5uYW1lIDwtICJleGFtcGxlLmxvb20iCmxvb20gPC0gYnVpbGRfbG9vbShmaWxlLm5hbWU9ZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgICAgZGdlbT1kZ2VtLAogICAgICAgICAgICAgICAgICAgdGl0bGU9IkZha2UgZXhwcmVzc2lvbiBkYXRhc2V0IGZvciBleGFtcGxlcyIsCiAgICAgICAgICAgICAgICAgICBnZW5vbWU9Ik1vdXNlIiwgIyBKdXN0IGZvciB1c2VyIGluZm9ybWF0aW9uLCBub3QgdXNlZCBpbnRlcm5hbGx5CiAgICAgICAgICAgICAgICAgICBkZWZhdWx0LmVtYmVkZGluZz1kZWZhdWx0LnRzbmUsCiAgICAgICAgICAgICAgICAgICBkZWZhdWx0LmVtYmVkZGluZy5uYW1lPWRlZmF1bHQudG5lLm5hbWUpCmBgYAoKIyMgQWRkIGhpZXJhcmNoeQoKWW91IGNhbiBvcmdhbml6ZS9ncm91cCB5b3VyIC5sb29tIGZpbGVzIGluIFNDb3BlIGJ5IHNwZWNpZml5aW5nIGRpZmZlcmVudHMgZ3JvdXBpbmcgbGV2ZWxzLiBUaGUgY3VycmVudCAubG9vbSBmaWxlIHdpbGwgYmUgcHV0IGluIGBNb3VzZSAtPiBUb3kgRGF0YXNldHNgIGJyYW5jaCBvZiB0aGUgU0NvcGUgbG9vbSB0cmVlLiAKCmBgYHtyfQphZGRfaGllcmFyY2h5KGxvb20gPSBsb29tLCBoaWVyYXJjaHkgPSBjcmVhdGVfaGllcmFyY2h5KGxldmVsLjEubmFtZSA9ICJNb3VzZSIsIGxldmVsLjIubmFtZSA9ICJUb3kgRGF0YXNldHMiLCBsZXZlbC4zLm5hbWUgPSAiIikpCmBgYAoKIyMgQWRkIGFubm90YXRpb25zL21ldHJpY3MKCllvdSBjYW4gYWRkIGRpZmZlcmVudCBhbm5vdGF0aW9ucyBhbmQvb3IgbWV0cmljcyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gcXVlcnkgaW4gU0NvcGUuCgpgYGB7cn0KIyBBZGQgYW5ub3RhdGlvbgphZGRfY29sX2F0dHIobG9vbT1sb29tLCBrZXkgPSAiQ2VsbCB0eXBlIiwgdmFsdWU9Y2VsbC5pbmZvJGNlbGxUeXBlLCBhcy5hbm5vdGF0aW9uPVQpCiMgQWRkIG1ldHJpYwphZGRfY29sX2F0dHIobG9vbT1sb29tLCBrZXkgPSAibkdlbmUiLCB2YWx1ZT1jZWxsLmluZm8kbkdlbmUsIGFzLm1ldHJpYyA9IFQpCmBgYAoKCiMjIEFkZCBTQ0VOSUMgcmVzdWx0cyAoT3B0aW9uYWwpCgoqKE5vdCBydW4gaW4gdGhpcyBleGFtcGxlKSoKCmBgYHtyIGFkZFNDRU5JQywgZXZhbD1GQUxTRX0Kc2NlbmljLmRpciA8LSAiLi8iICMgTW9kaWZ5IGlmIG5lZWRlZAoKIyBSZWd1bG9ucyBBVUMgbWF0cml4CmxpYnJhcnkoQVVDZWxsKQpsb2FkKHBhc3RlMChzY2VuaWMuZGlyLCAiaW50LzMuMl9yZWd1bG9uQVVDLlJEYXRhIiksIHZlcmJvc2U9VFJVRSkKcmVndWxvbnMuQVVDIDwtIHVwZGF0ZUF1Y2VsbFJlc3VsdHMocmVndWxvbkFVQykKYWRkX3NjZW5pY19yZWd1bG9uc19hdWNfbWF0cml4KGxvb209bG9vbSwgcmVndWxvbnMuQVVDPWdldEFVQyhyZWd1bG9ucy5BVUMpKQoKIyBSZWd1bG9ucyAoZ2VuZSBsaXN0KSwgcmVndWxvbiB0aHJlc2hvbGRzIChvcHRpb25hbCkgYW5kIHJlZ3Vsb24gbW90aWZzIChvcHRpb25hbCkKbG9hZChwYXN0ZTAoc2NlbmljLmRpciwgImludC8zLjBfcmVndWxvbnNfZm9yQVVDZWxsLlJEYXRhIiksIHZlcmJvc2U9VFJVRSkKcmVndWxvbi5lbnJpY2htZW50LnRhYmxlPC1yZWFkLnRhYmxlKGZpbGUgPSAib3V0cHV0L1N0ZXAyX01vdGlmRW5yaWNobWVudC50c3YiLCBoZWFkZXIgPSBULCBzZXAgPSAiXHQiLCBxdW90ZSA9ICcnLCBzdHJpbmdzQXNGYWN0b3JzID0gRikKYWRkX3NjZW5pY19yZWd1bG9ucyhsb29tPWxvb20KICAgICAgICAgICAgICAgICAgICAsIGRnZW09ZGdlbQogICAgICAgICAgICAgICAgICAgICwgcmVndWxvbnM9cmVndWxvbnMKICAgICAgICAgICAgICAgICAgICAsIHJlZ3Vsb24udGhyZXNob2xkLmFzc2lnbm1lbnRzPS4uLiR0aHJlc2hvbGQuYXNzaWdubWVudCAjIE9wdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgLCByZWd1bG9uLmVucmljaG1lbnQudGFibGUgPSByZWd1bG9uLmVucmljaG1lbnQudGFibGUgIyBPcHRpb25hbCkgCgojIEFsdGVybmF0aXZlIHQtU05FCmxvYWQocGFzdGUwKHNjZW5pYy5kaXIsICJpbnQvMy4zX3RzbmVSZWd1bG9uQVVDX1BDQV81MHBjNTBwZXJwbC5SRGF0YSIpKQphZGRfZW1iZWRkaW5nKGxvb209bG9vbSwgZW1iZWRkaW5nPXRTTkUkWSwgbmFtZT0iU0NFTklDICh0LVNORSBvbiBBVUMpIikKYGBgCgojIyBBZGQgU2V1cmF0IHJlc3VsdHMgKE9wdGlvbmFsKQoKKihOb3QgcnVuIGluIHRoaXMgZXhhbXBsZS4gWW91IHdvdWxkIG5lZWQgdG8gdXNlIHlvdXIgb3duIGZpbGUgbmFtZXMpKgoKYGBge3IgYWRkU0VVUkFULCBldmFsPUZBTFNFfQpzZXVyYXQuZGlyIDwtICJTZXVyYXRfb3V0cHV0LyIKc2V1cmF0LnRzbmUgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKHNldXJhdC5kaXIsICJzZXVyYXRfdHNuZS5yZHMuZ3oiKSkKc2V1cmF0IDwtIHJlYWRSRFMocGFzdGUwKHNldXJhdC5kaXIsICJzZXVyYXRPYmplY3QucmRzLmd6IikpCgojIEFkZCBleHRyYSBlbWJlZGRpbmdzCmFkZF9lbWJlZGRpbmcobG9vbT1sb29tLCBlbWJlZGRpbmc9c2V1cmF0LnRzbmUsIG5hbWU9IlNldXJhdCA4MlBDLCAzMHBlcnAiKSkKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmdzCgpgYGB7cn0KYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdCkKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmcocykgYWxvbmcgd2l0aCBhbm5vdGF0aW9uIGZvciBhIGdpdmVuIHJlc29sdXRpb24gKGRlZmF1bHQgb25lIGlmIHNldCkKYGBge3J9CnNldXJhdC5hbm5vdGF0aW9uPC1yZWFkLnRhYmxlKGZpbGUgPSBwYXN0ZTAoc2V1cmF0RGlyLCAiUmVzMl9DbHVzdGVycy50c3YiLCBoZWFkZXI9VCwgcXVvdGUgPSAnJywgc2VwID0gIlx0Iiwgc3RyaW5nc0FzRmFjdG9ycz1GKSkKYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBkZWZhdWx0LmNsdXN0ZXJpbmcucmVzb2x1dGlvbiA9ICJyZXMuMiIKICAgICAgICAgICAgICAgICAgICAgICwgYW5ub3RhdGlvbiA9IHNldXJhdC5hbm5vdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAsIGFubm90YXRpb24uY2x1c3Rlci5pZC5jbiA9ICJyZXMuMiIgCiAgICAgICAgICAgICAgICAgICAgICAsIGFubm90YXRpb24uY2x1c3Rlci5kZXNjcmlwdGlvbi5jbiA9ICJBbm5vdGF0aW9uIikKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmcocykgYWxvbmcgd2l0aCBjbHVzdGVyIG1hcmtlcnMgCmBgYHtyfQpzZXVyYXQucmVzb2x1dGlvbnMgPC0gZ2V0X3NldXJhdF9jbHVzdGVyaW5nX3Jlc29sdXRpb25zKHNldXJhdCA9IHNldXJhdCkKc2V1cmF0Lm1hcmtlcnMuZmlsZS5wYXRoLmxpc3Q8LWRvLmNhbGwod2hhdCA9ICJjIiwgbGFwcGx5KFg9c2V1cmF0LnJlc29sdXRpb25zLCBGVU49ZnVuY3Rpb24ocmVzb2x1dGlvbikgewogIGw8LWxpc3QoKQogIGxbcGFzdGUwKCJyZXMuIixyZXNvbHV0aW9uKV08LXBhc3RlMChzZXVyYXREaXIsICJyZXMuIixyZXNvbHV0aW9uLCIvU2V1cmF0X1BDODJfcmVzIixyZXNvbHV0aW9uLCJfYmltb2RfQ2x1c3Rlcl9NYXJrZXJzLnJkcy5neiIpCiAgcmV0dXJuIChsKQp9KSkKYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2Vycy5maWxlLnBhdGgubGlzdCA9IHNldXJhdC5tYXJrZXJzLmZpbGUucGF0aC5saXN0KQpgYGAKCiMjIyBBZGQgY2x1c3RlcmluZyhzKSwgYWxvbmcgd2l0aCBjbHVzdGVyIG1hcmtlcnMgYW5kIG1ldHJpY3MgKGUuZy46IGxvZ0ZDLCBwLXZhbHVlLCAuLi4pCgpgYGB7cn0KYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2Vycy5maWxlLnBhdGgubGlzdCA9IHNldXJhdC5tYXJrZXJzLmZpbGUucGF0aC5saXN0CiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdC5tYXJrZXIubWV0cmljLmFjY2Vzc29ycyA9IGMoImF2Z19sb2dGQyIsICJwX3ZhbF9hZGoiKQogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2VyLm1ldHJpYy5uYW1lcyA9IGMoIkF2Zy4gbG9nRkMiLCAiQWRqLiBwLXZhbHVlIikKICAgICAgICAgICAgICAgICAgICAgICwgc2V1cmF0Lm1hcmtlci5tZXRyaWMuZGVzY3JpcHRpb24gPSBjKCJBdmVyYWdlIGxvZyBmb2xkIGNoYW5nZSBmcm9tIFdpbGNveCBkaWZmZXJlbnRpYWwgdGVzdCAoY2ZyLiBTZXVyYXQpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiQWRqdXN0ZWQgcC12YWx1ZSB1c2luZyBCb25mZXJyb25pIGNvcnJlY3Rpb24gYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBnZW5lcyBpbiB0aGUgZGF0YXNldCAoY2ZyLiBTZXVyYXQpIikpCmBgYAoKIyMgQWRkIHNpbmdsZS1jZWxsIHRyYWplY3RvcnkgZGF0YQoKIyMjIE1vbm9jbGUKQWRkIHRoZSB0cmFqZWN0b3J5IGRhdGEgZnJvbSBhIENlbGxEYXRhU2V0IG9iamVjdCBnZW5lcmF0ZWQgYnkgbW9ub2NsZS4KCmBgYHtyfQojIEFkZCBtb25vY2xlIGVtYmVkZGluZyBhbmQgdHJhamVjdG9yeQpTX21hdHJpeCA8LSByZWR1Y2VkRGltUyhjZHMpCm1vbm9jbGUuZW1iZWRkaW5nPC1kYXRhLmZyYW1lKHQoU19tYXRyaXhbYygxLCAyKSwgXSkpCmFkZF9lbWJlZGRpbmcobG9vbSA9IGxvb20sIGVtYmVkZGluZyA9IG1vbm9jbGUuZW1iZWRkaW5nLCBuYW1lID0gIk1vbm9jbGUgKEREUlRyZWUpIiwgdHJhamVjdG9yeSA9IGNyZWF0ZV90cmFqZWN0b3J5X2Zyb21fbW9ub2NsZShjZHMgPSBjZHMpKQpgYGAKCgojIyBGaW5hbGl6ZSAoc2F2ZSkKYGBge3IgZmluYWxpemV9CmZpbmFsaXplKGxvb209bG9vbSkKYGBgCgojIEV4dHJhY3QgZGF0YSBmcm9tIGEgbG9vbSBvYmplY3QKClRoZSAubG9vbSBmaWxlIHJlbGF0ZWQgdG8gdGhpcyBwYXJ0IG9mIHRoZSB0dXRvcmlhbCBjYW4gYmUgZG93bmxvYWRlZCBhdCBodHRwOi8vc2NvcGUuYWVydHNsYWIub3JnIGluIHRoZSBsZWZ0IHBhbmVsIHVuZGVyIGBEcm9zb3BoaWxhYCA+IGBCcmFpbmAuCgojIyBHZXQgdGhlIGdlbmUgZXhwcmVzc2lvbiBtYXRyaXgKCmBgYHtyfQpsb29tPC1vcGVuX2xvb20obG9vbSA9ICJBZXJ0c19GbHlfQWR1bHRCcmFpbl9GaWx0ZXJlZF81N2subG9vbSIpCmRnZW08LWdldF9kZ2VtKGxvb20gPSBsb29tKQpgYGAKCiMjIEdldCB0aGUgZ2VuZSBleHByZXNzaW9uIG1hdHJpeCBvZiBhIGdpdmVuIGNsdXN0ZXIKCmBgYHtyfQpsb29tPC1vcGVuX2xvb20obG9vbSA9ICJBZXJ0c19GbHlfQWR1bHRCcmFpbl9GaWx0ZXJlZF81N2subG9vbSIpCmNsdXN0ZXIuMTAuZGdlbTwtZ2V0X2NsdXN0ZXJfZGdlbV9ieV9uYW1lKGxvb20gPSBsb29tLCBjbHVzdGVyLm5hbWUgPSAiTUJPTiAtIENsdXN0ZXIgNTciKQpgYGAKCgoKCg==
+LS0tCnRpdGxlOiAiU0NvcGVMb29tUiBUdXRvcmlhbCAtIENyZWF0ZSBhIC5sb29tIGZpbGUgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIGEgLmxvb20iCnBhY2thZ2U6IHIgcGtnX3ZlcignU0NvcGVMb29tUicpCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAga2VlcF9tZDogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwp2aWduZXR0ZTogfAogICVcVmlnbmV0dGVJbmRleEVudHJ5e1NDb3BlTG9vbVJ9IAogICVcVmlnbmV0dGVFbmNvZGluZ3tVVEYtOH0gCiAgJVxWaWduZXR0ZUVuZ2luZXtrbml0cjo6cm1hcmtkb3dufQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkoU0NvcGVMb29tUikKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKYGBgCgojIEludHJvZHVjdGlvbgoKVGhlIC5sb29tIGZvcm1hdCBpcyBhIGZpbGUgZm9ybWF0IGRlc2lnbmVkIHRvIHN0b3JlIHZlcnkgbGFyZ2Ugb21pY3MgZGF0YXNldHMuIEl0IGhhcyBiZWVuIGNyZWF0ZWQgaXMgbWFpbnRhaW5lZCBieSB0aGUgW0xpbm5hcnNzb24gbGFiXShodHRwOi8vbGlubmFyc3NvbmxhYi5vcmcvKS4gYFNDb3BlTG9vbVJgIGlzIGFuIFIgcGFja2FnZSB0aGF0IGhlbHBzIHlvdSB0byBjcmVhdGUgZWFzaWx5IC5sb29tIGZpbGVzIHRoYXQgZm9sbG93IHRoZSBkYXRhIFtuYW1pbmcgY29udmVudGlvbnNdKGh0dHA6Ly9saW5uYXJzc29ubGFiLm9yZy9sb29tcHkvY29udmVudGlvbnMvaW5kZXguaHRtbCkgZnJvbSBsb29tcHkuIAoKYFNDb3BlTG9vbVJgIHdhcyBjcmVhdGVkIGFsb25nIHRoZSBkZXZlbG9wbWVudCBvZiBTQ29wZSB0byBoZWxwIHRvIHN0b3JlIGRpZmZlcmVudCBkYXRhIGluc2lkZSB0aGUgLmxvb20gZS5nLjogcmVndWxvbiwgcmVndWxvbiBhY3Rpdml0aWVzIGZyb20gU0NFTklDOyAgLiBUaGVyZWZvcmUsIGl0IAoKIyBJbnN0YWxsYXRpb24KRm9yIGV4YW1wbGU6CmBgYHtyIGluc3RhbGwsIGV2YWw9RkFMU0V9CmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYWVydHNsYWIvU0NvcGVMb29tUiIpCmBgYAoKIyBDcmVhdGluZyBhIGxvb20gb2JqZWN0CgojIyBMb2FkIERhdGEKCihtaW5pbXVtIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0KQoKYGBge3IgbG9hZERhdGF9CmxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCmxpYnJhcnkoU0NvcGVMb29tUikKZGF0YShzY2UpICMgZS5nLiBhIFNpbmdsZUNlbGxFeHBlcmltZW50IAoKIyBER0VNIChEaWdpdGFsIGdlbmUgZXhwcmVzc2lvbiBtYXRyaXgpCmRnZW0gPC0gY291bnRzKHNjZSkKICBkaW0oZGdlbSkKICBjbGFzcyhkZ2VtKQogIGhlYWQoY29sbmFtZXMoZGdlbSkpICAjc2hvdWxkIGNvbnRhaW4gdGhlIENlbGwgSUQvbmFtZQoKIyBLbm93biBjZWxsIGluZm9ybWF0aW9uL2Fubm90YXRpb24gIApjZWxsLmluZm8gPC0gY29sRGF0YShzY2UpCmNlbGwuaW5mbyRuR2VuZSA8LSBjb2xTdW1zKGRnZW0+MCkKICBoZWFkKGNlbGwuaW5mbykKCiMgRGVmYXVsdCBlbWJlZGRpbmcgKGUuZy4gdC1TTkUgb3IgUENBIGNvb3JkaW5hdGVzKQpkYXRhKHRTTkVfZXhwcikKZGVmYXVsdC50c25lIDwtIHRTTkVfZXhwcgpkZWZhdWx0LnRuZS5uYW1lIDwtICJ0LVNORSBvbiBmdWxsIGV4cHJlc3Npb24gbWF0cml4IgpoZWFkKGRlZmF1bHQudHNuZSkKYGBgCgojIyBDcmVhdGUgbG9vbSBmaWxlIAoKYGBge3IgY3JlYXRlTG9vbX0KbGlicmFyeShTQ29wZUxvb21SKQoKIyMjIENyZWF0ZSB0aGUgbWluaW1hbCBsb29tIGZpbGUKZmlsZS5uYW1lIDwtICJleGFtcGxlLmxvb20iCmxvb20gPC0gYnVpbGRfbG9vbShmaWxlLm5hbWU9ZmlsZS5uYW1lLAogICAgICAgICAgICAgICAgICAgZGdlbT1kZ2VtLAogICAgICAgICAgICAgICAgICAgdGl0bGU9IkZha2UgZXhwcmVzc2lvbiBkYXRhc2V0IGZvciBleGFtcGxlcyIsCiAgICAgICAgICAgICAgICAgICBnZW5vbWU9Ik1vdXNlIiwgIyBKdXN0IGZvciB1c2VyIGluZm9ybWF0aW9uLCBub3QgdXNlZCBpbnRlcm5hbGx5CiAgICAgICAgICAgICAgICAgICBkZWZhdWx0LmVtYmVkZGluZz1kZWZhdWx0LnRzbmUsCiAgICAgICAgICAgICAgICAgICBkZWZhdWx0LmVtYmVkZGluZy5uYW1lPWRlZmF1bHQudG5lLm5hbWUpCmBgYAoKIyMgQWRkIGhpZXJhcmNoeQoKWW91IGNhbiBvcmdhbml6ZS9ncm91cCB5b3VyIC5sb29tIGZpbGVzIGluIFNDb3BlIGJ5IHNwZWNpZml5aW5nIGRpZmZlcmVudHMgZ3JvdXBpbmcgbGV2ZWxzLiBUaGUgY3VycmVudCAubG9vbSBmaWxlIHdpbGwgYmUgcHV0IGluIGBNb3VzZSAtPiBUb3kgRGF0YXNldHNgIGJyYW5jaCBvZiB0aGUgU0NvcGUgbG9vbSB0cmVlLiAKCmBgYHtyfQphZGRfaGllcmFyY2h5KGxvb20gPSBsb29tLCBoaWVyYXJjaHkgPSBjcmVhdGVfaGllcmFyY2h5KGxldmVsLjEubmFtZSA9ICJNb3VzZSIsIGxldmVsLjIubmFtZSA9ICJUb3kgRGF0YXNldHMiLCBsZXZlbC4zLm5hbWUgPSAiIikpCmBgYAoKIyMgQWRkIGFubm90YXRpb25zL21ldHJpY3MKCllvdSBjYW4gYWRkIGRpZmZlcmVudCBhbm5vdGF0aW9ucyBhbmQvb3IgbWV0cmljcyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gcXVlcnkgaW4gU0NvcGUuCgpgYGB7cn0KIyBBZGQgYW5ub3RhdGlvbgphZGRfY29sX2F0dHIobG9vbT1sb29tLCBrZXkgPSAiQ2VsbCB0eXBlIiwgdmFsdWU9Y2VsbC5pbmZvJGNlbGxUeXBlLCBhcy5hbm5vdGF0aW9uPVQpCiMgQWRkIG1ldHJpYwphZGRfY29sX2F0dHIobG9vbT1sb29tLCBrZXkgPSAibkdlbmUiLCB2YWx1ZT1jZWxsLmluZm8kbkdlbmUsIGFzLm1ldHJpYyA9IFQpCmBgYAoKIyMgQWRkIFNDRU5JQyByZXN1bHRzIChPcHRpb25hbCkKCiooTm90IHJ1biBpbiB0aGlzIGV4YW1wbGUpKgoKYGBge3IgYWRkU0NFTklDLCBldmFsPUZBTFNFfQpzY2VuaWMuZGlyIDwtICIuLyIgIyBNb2RpZnkgaWYgbmVlZGVkCgojIFJlZ3Vsb25zIEFVQyBtYXRyaXgKbGlicmFyeShBVUNlbGwpCmxvYWQocGFzdGUwKHNjZW5pYy5kaXIsICJpbnQvMy4yX3JlZ3Vsb25BVUMuUkRhdGEiKSwgdmVyYm9zZT1UUlVFKQpyZWd1bG9ucy5BVUMgPC0gdXBkYXRlQXVjZWxsUmVzdWx0cyhyZWd1bG9uQVVDKQphZGRfc2NlbmljX3JlZ3Vsb25zX2F1Y19tYXRyaXgobG9vbT1sb29tLCByZWd1bG9ucy5BVUM9Z2V0QVVDKHJlZ3Vsb25zLkFVQykpCgojIFJlZ3Vsb25zIChnZW5lIGxpc3QpLCByZWd1bG9uIHRocmVzaG9sZHMgKG9wdGlvbmFsKSBhbmQgcmVndWxvbiBtb3RpZnMgKG9wdGlvbmFsKQpsb2FkKHBhc3RlMChzY2VuaWMuZGlyLCAiaW50LzMuMF9yZWd1bG9uc19mb3JBVUNlbGwuUkRhdGEiKSwgdmVyYm9zZT1UUlVFKQpyZWd1bG9uLmVucmljaG1lbnQudGFibGU8LXJlYWQudGFibGUoZmlsZSA9ICJvdXRwdXQvU3RlcDJfTW90aWZFbnJpY2htZW50LnRzdiIsIGhlYWRlciA9IFQsIHNlcCA9ICJcdCIsIHF1b3RlID0gJycsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQphZGRfc2NlbmljX3JlZ3Vsb25zKGxvb209bG9vbQogICAgICAgICAgICAgICAgICAgICwgcmVndWxvbnM9cmVndWxvbnMKICAgICAgICAgICAgICAgICAgICAsIHJlZ3Vsb24udGhyZXNob2xkLmFzc2lnbm1lbnRzPS4uLiR0aHJlc2hvbGQuYXNzaWdubWVudCAjIE9wdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgLCByZWd1bG9uLmVucmljaG1lbnQudGFibGUgPSByZWd1bG9uLmVucmljaG1lbnQudGFibGUgIyBPcHRpb25hbCkgCgojIEFsdGVybmF0aXZlIHQtU05FCmxvYWQocGFzdGUwKHNjZW5pYy5kaXIsICJpbnQvMy4zX3RzbmVSZWd1bG9uQVVDX1BDQV81MHBjNTBwZXJwbC5SRGF0YSIpKQphZGRfZW1iZWRkaW5nKGxvb209bG9vbSwgZW1iZWRkaW5nPXRTTkUkWSwgbmFtZT0iU0NFTklDICh0LVNORSBvbiBBVUMpIikKYGBgCgojIyBBZGQgU2V1cmF0IHJlc3VsdHMgKE9wdGlvbmFsKQoKKihOb3QgcnVuIGluIHRoaXMgZXhhbXBsZS4gWW91IHdvdWxkIG5lZWQgdG8gdXNlIHlvdXIgb3duIGZpbGUgbmFtZXMpKgoKYGBge3IgYWRkU0VVUkFULCBldmFsPUZBTFNFfQpzZXVyYXQuZGlyIDwtICJTZXVyYXRfb3V0cHV0LyIKc2V1cmF0LnRzbmUgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKHNldXJhdC5kaXIsICJzZXVyYXRfdHNuZS5yZHMuZ3oiKSkKc2V1cmF0IDwtIHJlYWRSRFMocGFzdGUwKHNldXJhdC5kaXIsICJzZXVyYXRPYmplY3QucmRzLmd6IikpCgojIEFkZCBleHRyYSBlbWJlZGRpbmdzCmFkZF9lbWJlZGRpbmcobG9vbT1sb29tLCBlbWJlZGRpbmc9c2V1cmF0LnRzbmUsIG5hbWU9IlNldXJhdCA4MlBDLCAzMHBlcnAiKSkKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmdzCgpgYGB7cn0KYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdCkKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmcocykgYWxvbmcgd2l0aCBhbm5vdGF0aW9uIGZvciBhIGdpdmVuIHJlc29sdXRpb24gKGRlZmF1bHQgb25lIGlmIHNldCkKYGBge3J9CnNldXJhdC5hbm5vdGF0aW9uPC1yZWFkLnRhYmxlKGZpbGUgPSBwYXN0ZTAoc2V1cmF0RGlyLCAiUmVzMl9DbHVzdGVycy50c3YiLCBoZWFkZXI9VCwgcXVvdGUgPSAnJywgc2VwID0gIlx0Iiwgc3RyaW5nc0FzRmFjdG9ycz1GKSkKYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBkZWZhdWx0LmNsdXN0ZXJpbmcucmVzb2x1dGlvbiA9ICJyZXMuMiIKICAgICAgICAgICAgICAgICAgICAgICwgYW5ub3RhdGlvbiA9IHNldXJhdC5hbm5vdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAsIGFubm90YXRpb24uY2x1c3Rlci5pZC5jbiA9ICJyZXMuMiIgCiAgICAgICAgICAgICAgICAgICAgICAsIGFubm90YXRpb24uY2x1c3Rlci5kZXNjcmlwdGlvbi5jbiA9ICJBbm5vdGF0aW9uIikKYGBgCgojIyMgQWRkIGNsdXN0ZXJpbmcocykgYWxvbmcgd2l0aCBjbHVzdGVyIG1hcmtlcnMgCmBgYHtyfQpzZXVyYXQucmVzb2x1dGlvbnMgPC0gZ2V0X3NldXJhdF9jbHVzdGVyaW5nX3Jlc29sdXRpb25zKHNldXJhdCA9IHNldXJhdCkKc2V1cmF0Lm1hcmtlcnMuZmlsZS5wYXRoLmxpc3Q8LWRvLmNhbGwod2hhdCA9ICJjIiwgbGFwcGx5KFg9c2V1cmF0LnJlc29sdXRpb25zLCBGVU49ZnVuY3Rpb24ocmVzb2x1dGlvbikgewogIGw8LWxpc3QoKQogIGxbcGFzdGUwKCJyZXMuIixyZXNvbHV0aW9uKV08LXBhc3RlMChzZXVyYXREaXIsICJyZXMuIixyZXNvbHV0aW9uLCIvU2V1cmF0X1BDODJfcmVzIixyZXNvbHV0aW9uLCJfYmltb2RfQ2x1c3Rlcl9NYXJrZXJzLnJkcy5neiIpCiAgcmV0dXJuIChsKQp9KSkKYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2Vycy5maWxlLnBhdGgubGlzdCA9IHNldXJhdC5tYXJrZXJzLmZpbGUucGF0aC5saXN0KQpgYGAKCiMjIyBBZGQgY2x1c3RlcmluZyhzKSwgYWxvbmcgd2l0aCBjbHVzdGVyIG1hcmtlcnMgYW5kIG1ldHJpY3MgKGUuZy46IGxvZ0ZDLCBwLXZhbHVlLCAuLi4pCgpgYGB7cn0KYWRkX3NldXJhdF9jbHVzdGVyaW5nKGxvb20gPSBsb29tCiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdCA9IHNldXJhdAogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2Vycy5maWxlLnBhdGgubGlzdCA9IHNldXJhdC5tYXJrZXJzLmZpbGUucGF0aC5saXN0CiAgICAgICAgICAgICAgICAgICAgICAsIHNldXJhdC5tYXJrZXIubWV0cmljLmFjY2Vzc29ycyA9IGMoImF2Z19sb2dGQyIsICJwX3ZhbF9hZGoiKQogICAgICAgICAgICAgICAgICAgICAgLCBzZXVyYXQubWFya2VyLm1ldHJpYy5uYW1lcyA9IGMoIkF2Zy4gbG9nRkMiLCAiQWRqLiBwLXZhbHVlIikKICAgICAgICAgICAgICAgICAgICAgICwgc2V1cmF0Lm1hcmtlci5tZXRyaWMuZGVzY3JpcHRpb24gPSBjKCJBdmVyYWdlIGxvZyBmb2xkIGNoYW5nZSBmcm9tIFdpbGNveCBkaWZmZXJlbnRpYWwgdGVzdCAoY2ZyLiBTZXVyYXQpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAiQWRqdXN0ZWQgcC12YWx1ZSB1c2luZyBCb25mZXJyb25pIGNvcnJlY3Rpb24gYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBnZW5lcyBpbiB0aGUgZGF0YXNldCAoY2ZyLiBTZXVyYXQpIikpCmBgYAoKIyMgQWRkIHNpbmdsZS1jZWxsIHRyYWplY3RvcnkgZGF0YQoKIyMjIE1vbm9jbGUKQWRkIHRoZSB0cmFqZWN0b3J5IGRhdGEgZnJvbSBhIENlbGxEYXRhU2V0IG9iamVjdCBnZW5lcmF0ZWQgYnkgbW9ub2NsZS4KCmBgYHtyfQojIEFkZCBtb25vY2xlIGVtYmVkZGluZyBhbmQgdHJhamVjdG9yeQpTX21hdHJpeCA8LSByZWR1Y2VkRGltUyhjZHMpCm1vbm9jbGUuZW1iZWRkaW5nPC1kYXRhLmZyYW1lKHQoU19tYXRyaXhbYygxLCAyKSwgXSkpCmFkZF9lbWJlZGRpbmcobG9vbSA9IGxvb20sIGVtYmVkZGluZyA9IG1vbm9jbGUuZW1iZWRkaW5nLCBuYW1lID0gIk1vbm9jbGUgKEREUlRyZWUpIiwgdHJhamVjdG9yeSA9IGNyZWF0ZV90cmFqZWN0b3J5X2Zyb21fbW9ub2NsZShjZHMgPSBjZHMpKQpgYGAKCgojIyBGaW5hbGl6ZSAoc2F2ZSkKYGBge3IgZmluYWxpemV9CmZpbmFsaXplKGxvb209bG9vbSkKYGBgCgojIEV4dHJhY3QgZGF0YSBmcm9tIGEgbG9vbSBvYmplY3QKClRoZSAubG9vbSBmaWxlIHJlbGF0ZWQgdG8gdGhpcyBwYXJ0IG9mIHRoZSB0dXRvcmlhbCBjYW4gYmUgZG93bmxvYWRlZCBhdCBodHRwOi8vc2NvcGUuYWVydHNsYWIub3JnIGluIHRoZSBsZWZ0IHBhbmVsIHVuZGVyIGBEcm9zb3BoaWxhYCA+IGBCcmFpbmAuCgojIyBHZXQgdGhlIGdlbmUgZXhwcmVzc2lvbiBtYXRyaXgKCmBgYHtyfQpsb29tPC1vcGVuX2xvb20obG9vbSA9ICJBZXJ0c19GbHlfQWR1bHRCcmFpbl9GaWx0ZXJlZF81N2subG9vbSIpCmRnZW08LWdldF9kZ2VtKGxvb20gPSBsb29tKQpgYGAKCiMjIEdldCB0aGUgZ2VuZSBleHByZXNzaW9uIG1hdHJpeCBvZiBhIGdpdmVuIGNsdXN0ZXIKCmBgYHtyfQpsb29tPC1vcGVuX2xvb20obG9vbSA9ICJBZXJ0c19GbHlfQWR1bHRCcmFpbl9GaWx0ZXJlZF81N2subG9vbSIpCmNsdXN0ZXIuMTAuZGdlbTwtZ2V0X2NsdXN0ZXJfZGdlbV9ieV9uYW1lKGxvb20gPSBsb29tLCBjbHVzdGVyLm5hbWUgPSAiQXN0cm9jeXRlLWxpa2UgLSBDbHVzdGVyIDEwIikKYGBgCgoKCgo=