diff --git a/analyses/fusion-summary/01-fusion-summary.Rmd b/analyses/fusion-summary/01-fusion-summary.Rmd index c0ce5a4a13..1296831101 100644 --- a/analyses/fusion-summary/01-fusion-summary.Rmd +++ b/analyses/fusion-summary/01-fusion-summary.Rmd @@ -70,7 +70,7 @@ dataDir <- file.path("..", "..", "data") fusDir <- file.path("..", "..", "analyses", "fusion_filtering", "results") annotDir <- file.path("..", "..", "analyses", "fusion_filtering", "references") #' Annotation file to be used for identifying kinase genes -annot <- read.delim2(file.path(annotDir, "genelistreference.txt"), sep = "\t", header = TRUE, stringsAsFactors = FALSE) +annot <- read_tsv(file.path(annotDir, "genelistreference.txt")) #' The putative oncogenic fusion file is what we'll use to check for the #' presence or absence of the fusions. putativeOncogenicDF <- read_tsv(file.path(fusDir, "pbta-fusion-putative-oncogenic.tsv")) diff --git a/analyses/fusion-summary/01-fusion-summary.nb.html b/analyses/fusion-summary/01-fusion-summary.nb.html index b9c2b69d83..ae80a933f3 100644 --- a/analyses/fusion-summary/01-fusion-summary.nb.html +++ b/analyses/fusion-summary/01-fusion-summary.nb.html @@ -1837,13 +1837,23 @@

Libraries and functions

Read in data

- +
dataDir <- file.path("..", "..", "data")
 fusDir <- file.path("..", "..", "analyses", "fusion_filtering", "results")
 annotDir <- file.path("..", "..", "analyses", "fusion_filtering", "references")
 #' Annotation file to be used for identifying kinase genes
-annot <- read.delim2(file.path(annotDir, "genelistreference.txt"), sep = "\t", header = TRUE, stringsAsFactors = FALSE)
-#' The putative oncogenic fusion file is what we'll use to check for the #' presence or absence of the fusions.
+annot <- read_tsv(file.path(annotDir, "genelistreference.txt"))
+ + +
Parsed with column specification:
+cols(
+  Gene_Symbol = col_character(),
+  file = col_character(),
+  type = col_character()
+)
+ + +
#' The putative oncogenic fusion file is what we'll use to check for the #' presence or absence of the fusions.
 putativeOncogenicDF <- 
   read_tsv(file.path(fusDir, "pbta-fusion-putative-oncogenic.tsv"))
@@ -2322,7 +2332,7 @@

Session Info

-
LS0tCnRpdGxlOiAiR2VuZXJhdGUgRnVzaW9uIFN1bW1hcnkgRmlsZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IERhbmllbCBNaWxsZXIgKEQzYiksIEphY2x5biBUYXJvbmkgKENDREwpLCBKbyBMeW5uZSBSb2tpdGEgKEQzYikKZGF0ZTogSmFudWFyeSAyMDIwLCBOb3ZlbWJlciAyMDIwCi0tLQoKR2VuZXJhdGUgZnVzaW9uIGZpbGVzIHNwZWNpZmljYWxseSBmb3IgY29uc3VtcHRpb24gYnkgbW9sZWN1bGFyIHN1YnR5cGluZyBhbmFseXNlcwoKIyMgU2V0IHVwCgojIyMgTGlicmFyaWVzIGFuZCBmdW5jdGlvbnMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpgYGB7cn0KIycgR2VuZXJhdGUgZmlsdGVyZWQgZnVzaW9uIGZyYW1lCiMnIEBwYXJhbSBkZiBVbmZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCiMnIEBwYXJhbSBiaW9pZCBMaXN0IG9mIGJpb3NwZWNpbWVuIElEcwojJyBAcGFyYW0gZnVzZXMgTGlzdCBvZiBleHBsaWNpdCBmdXNpb24gbmFtZXMKIycgQHBhcmFtIGdlbmVzIExpc3Qgb2YgZ2VuZSBuYW1lcwojJyBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBmdXNpb24gZGF0YSBmcmFtZQpmaWx0ZXJGdXNpb24gPC0gZnVuY3Rpb24oZGYsIGJpb2lkLCBmdXNlcywgZ2VuZXMpIHsKICBpZiAoIW1pc3NpbmcoYmlvaWQpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIFNhbXBsZSAlaW4lIGJpb2lkKQogIH0KICBpZiAoIW1pc3NpbmcoZnVzZXMpICYgIW1pc3NpbmcoZ2VuZXMpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIEZ1c2lvbk5hbWUgJWluJSBmdXNlcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUIgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkIgJWluJSBnZW5lcykKICB9IGVsc2UgaWYgKCFtaXNzaW5nKGZ1c2VzKSkgewogICAgZGYgPC0gZmlsdGVyKGRmLCBGdXNpb25OYW1lICVpbiUgZnVzZXMpCiAgfSBlbHNlIGlmICghbWlzc2luZyhnZW5lcykpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwKICAgICAgICAgICAgICAgICBHZW5lMUEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUIgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkIgJWluJSBnZW5lcykKICB9CiAgcmV0dXJuKGRmICU+JSAKICAgICAgICAgICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lLCBGdXNpb25fVHlwZSwgR2VuZTFBLCBHZW5lMUIsIEdlbmUyQSwgR2VuZTJCLCBHZW5lMUFfYW5ubywgR2VuZTFCX2Fubm8sIHJlY2lwcm9jYWxfZXhpc3RzLCBEb21haW5SZXRhaW5lZEdlbmUxQSwgRG9tYWluUmV0YWluZWRHZW5lMUIpICU+JQogICAgICAgICAgIGRpc3RpbmN0KCkpCn0KCiMnIEdlbmVyYXRlIG1hdHJpeCB3aXRoIGZ1c2lvbiBjb3VudHMKIycgQHBhcmFtIGZ1c2VERiBGaWx0ZXJlZCBmdXNpb24gZGF0YSBmcmFtZQojJyBAcGFyYW0gYmlvaWQgTGlzdCBvZiBiaW9zcGVjaW1lbiBJRHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZmluYWwgdGFibGUKIycgQHJldHVybiBEYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZnVzaW9uIGNvdW50cwpwcmVwYXJlT3V0cHV0IDwtIGZ1bmN0aW9uKGZ1c2VERiwgYmlvaWQpIHsKICBmdXNlREYgJT4lIAogICAgIyBzb21lIGZ1c2lvbnMgaGF2ZSBpbi1mcmFtZSBhbmQgZnJhbWVzaGlmdCBmdXNpb24gY2FsbHMgZm9yIGEgc2FtcGxlCiAgICAjIHRoaXMgd2lsbCBtYWtlIHVuaXF1ZSBmdXNpb25OYW1lIGFuZCBTYW1wbGUgZGF0YXNldCB0byBnZXQgMS8wIHZhbHVlcwogICAgZHBseXI6OnNlbGVjdChTYW1wbGUsRnVzaW9uTmFtZSkgJT4lCiAgICB1bmlxdWUoKSAlPiUKICAgIHJlc2hhcGUyOjpkY2FzdChTYW1wbGUgfiBGdXNpb25OYW1lLGZ1bi5hZ2dyZWdhdGUgPSBsZW5ndGgpICU+JQogICAgcmlnaHRfam9pbihkYXRhLmZyYW1lKFNhbXBsZSA9IGJpb2lkKSkgJT4lCiAgICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUKICAgIHJlbmFtZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID0gU2FtcGxlKQp9CmBgYAoKIyMjIFJlYWQgaW4gZGF0YQoKYGBge3J9CmRhdGFEaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIikKZnVzRGlyIDwtIGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiYW5hbHlzZXMiLCAiZnVzaW9uX2ZpbHRlcmluZyIsICJyZXN1bHRzIikKYW5ub3REaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJhbmFseXNlcyIsICJmdXNpb25fZmlsdGVyaW5nIiwgInJlZmVyZW5jZXMiKQojJyBBbm5vdGF0aW9uIGZpbGUgdG8gYmUgdXNlZCBmb3IgaWRlbnRpZnlpbmcga2luYXNlIGdlbmVzCmFubm90IDwtIHJlYWQuZGVsaW0yKGZpbGUucGF0aChhbm5vdERpciwgImdlbmVsaXN0cmVmZXJlbmNlLnR4dCIpLCBzZXAgPSAiXHQiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMnIFRoZSBwdXRhdGl2ZSBvbmNvZ2VuaWMgZnVzaW9uIGZpbGUgaXMgd2hhdCB3ZSdsbCB1c2UgdG8gY2hlY2sgZm9yIHRoZSAjJyBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZSBmdXNpb25zLgpwdXRhdGl2ZU9uY29nZW5pY0RGIDwtIAogIHJlYWRfdHN2KGZpbGUucGF0aChmdXNEaXIsICJwYnRhLWZ1c2lvbi1wdXRhdGl2ZS1vbmNvZ2VuaWMudHN2IikpCiMnIEhvd2V2ZXIsIHNvbWUgYmlvc3BlY2ltZW5zIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhpcyBmaWx0ZXJlZCwgcHJpb3JpdGl6ZWQKIycgZmlsZSBidXQgKmFyZSogcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgZmlsZXMgLS0gdGhpcyB3aWxsIGNhdXNlIHRoZW0gdG8gYmUKIycgIm1pc3NpbmciIGluIHRoZSBmaW5hbCBmaWxlcyBmb3IgY29uc3VtcHRpb24gd2hpY2ggY291bGQgbWlzbGVhZCBhbmFseXN0cy4KYXJyaWJhREYgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGRhdGFEaXIsICJwYnRhLWZ1c2lvbi1hcnJpYmEudHN2Lmd6IikpCnN0YXJmdXNpb25ERiA8LSByZWFkX3RzdihmaWxlLnBhdGgoZGF0YURpciwgInBidGEtZnVzaW9uLXN0YXJmdXNpb24udHN2Lmd6IikpCmBgYAoKIyMjIE91dHB1dAoKYGBge3J9CnJlc3VsdHNEaXIgPC0gInJlc3VsdHMiCmlmICghZGlyLmV4aXN0cyhyZXN1bHRzRGlyKSkgewogIGRpci5jcmVhdGUocmVzdWx0c0RpcikKfQplcGVuZEZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNEaXIsICJmdXNpb25fc3VtbWFyeV9lcGVuZHltb21hX2ZvaS50c3YiKQplbWJyeUZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNEaXIsICJmdXNpb25fc3VtbWFyeV9lbWJyeW9uYWxfZm9pLnRzdiIpCmV3aW5nc0ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNEaXIsICJmdXNpb25fc3VtbWFyeV9ld2luZ3NfZm9pLnRzdiIpCmxnYXRGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfbGdhdF9mb2kudHN2IikKYGBgCgojIyBGdXNpb25zIGFuZCBnZW5lcyBvZiBpbnRlcmVzdAoKVGFrZW4gZnJvbSBbYEFsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMjMjQ1YF0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzI0NSksIFtgQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcyMyNTFgXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjUxKSwgW2BBbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzIzYyM2BdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy82MjMpIHJlc3BlY3RpdmVseSwgYW5kIFtgQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcyM4MDhgXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvODA4KSAKCmBgYHtyfQojJyAqKkZpbHRlcnMqKgojJwojJyAqRnVzaW9ucyBGaWx0ZXJzKgojJyAxOiBFeGFjdCBtYXRjaCBhIGxpc3Qgb2YgZnVzaW9ucyBjb21tb24gaW4gRXBlbmR5bW9tYSB0dW1vcnMKZXBlbmRGdXNlcyA8LSBjKAogICJDMTFvcmY5NS0tTUFNTDIiLAogICJDMTFvcmY5NS0tUkVMQSIsCiAgIkMxMW9yZjk1LS1ZQVAxIiwKICAiTFRCUDMtLVJFTEEiLAogICJQVEVOLS1UQVMyUjEiLAogICJZQVAxLS1GQU0xMThCIiwKICAiWUFQMS0tTUFNTEQxIiwKICAiWUFQMS0tTUFNTEQyIgopCmVwZW5kR2VuZXMgPC0gYygKICAiUkVMQSIKKQojJyAyOiBFeGFjdCBtYXRjaCBhIGxpc3Qgb2YgZnVzaW9ucyBjb21tb24gaW4gRW1icnlvbmFsIHR1bW9ycwojJyBhcyB3ZWxsIGFzIGZ1c2lvbnMgY29udGFpbmluZyBhIHBhcnRpY3VsYXIgZ2VuZSB3aXRoIGFueSBvdGhlciBnZW5lCmVtYnJ5RnVzZXMgPC0gYygKICAiQ0lDLS1OVVRNMSIsCiAgIk1OMS0tQkVORDIiLAogICJNTjEtLUNYWEM1IgopCmVtYnJ5R2VuZXMgPC0gYygKICAiRk9YUjIiLAogICJNTjEiLAogICJUVFlIMSIKKQoKIycgMzogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgd2hpY2ggYXJlIGhhbGxtYXJrIGZ1c2lvbnMgaW4gRXdpbmdzIFNhcmNvbWEKZXdpbmdzRnVzZXM8LSBjKAogICJFV1NSMS0tRkxJMSIsIAogICJFV1NSMS0tRVJHIiwKICAiRlVTLS1FUkciCikKCiMnIDQ6IEV4YWN0IG1hdGNoIGEgbGlzdCBvZiBmdXNpb25zIGNvbW1vbiBpbiBsb3ctZ3JhZGUgYXN0cm9jeXRpYyAoTEdBVCkgdHVtb3JzCiMnIGFzIHdlbGwgYXMgZnVzaW9ucyBjb250YWluaW5nIGEgcGFydGljdWxhciBnZW5lIHdpdGggYW55IG90aGVyIGdlbmUKbGdhdEZ1c2VzIDwtIGMoCiAgIktJQUExNTQ5LS1CUkFGIiwKICAiRkdGUjEtLVRBQ0MxIiwKICAiTVlCLS1RS0kiCikKbGdhdEdlbmVzIDwtIGMoCiAgIkJSQUYiLAogICJBTEsiLAogICJST1MxIiwKICAiTlRSSzEiLAogICJOVFJLMiIsCiAgIk5UUkszIiwKICAiUERHRlJBIiwKICAiRkdGUjIiLAogICJGR0ZSMSIsCiAgIk1ZQiIsCiAgIk1ZQkwxIiwKICAiUkFGMSIKKQoKYGBgCgojIyMgRmlsdGVyIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb25zIGxpc3QKCmBgYHtyfQphbGxGdXNlRXBlbmQgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVwZW5kRnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlcGVuZEdlbmVzKQphbGxGdXNlRW1icnkgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVtYnJ5RnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlbWJyeUdlbmVzKQphbGxGdXNlRXdpbmcgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGV3aW5nc0Z1c2VzKQphbGxGdXNlTEdBVCA8LSBmaWx0ZXJGdXNpb24oZGYgPSBwdXRhdGl2ZU9uY29nZW5pY0RGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1c2VzID0gbGdhdEZ1c2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVzID0gbGdhdEdlbmVzKQoKYGBgCgpHZXQgdGhlIGJpb3NwZWNpbWVuIElEcyB0aGF0IGFyZSBwcmVzZW50IGluICplaXRoZXIqIGNhbGxlciBmaWxlIChBcnJpYmEsIFNUQVJGdXNpb24pLgpUaGUgZnVzaW9ucyBpbiB0aGUgcHV0YXRpdmUgb25jb2dlbmljIGZ1c2lvbiBmaWxlIGNhbiBiZSByZXRhaW5lZCBldmVuIGlmIHRoZXkgYXJlIG5vdCBpbiBib3RoIGNhbGxlcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2Jsb2IvOGZiYTE3NTM2MDhkOGFjMGFhM2Q1ZDdkNjNjNDgwYjhmMDBmZjBlOS9hbmFseXNlcy9mdXNpb25fZmlsdGVyaW5nLzA0LXByb2plY3Qtc3BlY2lmaWMtZmlsdGVyaW5nLlJtZCNMMjQyCldlIHVzZSB0aGUgcHV0YXRpdmUgb25jb2dlbmljIGZpbGUgaGVyZSwgdGhlcmVmb3JlIGFueSBzYW1wbGUgdGhhdCBpcyBpbiBlaXRoZXIgZmlsZSBidXQgZG9lcyBub3QgaGF2ZSBhIGZ1c2lvbiB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBzdWJ0eXBpbmcgdGlja2V0cyBpcyBub3QgX21pc3NpbmdfIGJ1dCBpbnN0ZWFkIGhhcyBubyBldmlkZW5jZSBvZiB0aGUgcmVsZXZhbnQgZnVzaW9ucy4KCmBgYHtyfQpzcGVjaW1lbnNVbmlvbjwtIHVuaW9uKGFycmliYURGJHR1bW9yX2lkLCBzdGFyZnVzaW9uREYkdHVtb3JfaWQpCmBgYAoKIyMjIyBXcml0ZSBub24tTUIsIG5vbi1BVFJUIGVtYnJ5b25hbCBmdXNpb25zIHRvIGZpbGUKCmBgYHtyfQphbGxGdXNlRW1icnkgPC0gYWxsRnVzZUVtYnJ5ICU+JQogIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pCgojIFdoaWNoIGZ1c2lvbnMgb2YgaW50ZXJlc3QgYXJlIG5vdCBwcmVzZW50IGluIGFueSBzYW1wbGVzPwptaXNzaW5nRW1icnlGdXNpb24gPC0gc2V0ZGlmZihlbWJyeUZ1c2VzLCBjb2xuYW1lcyhhbGxGdXNlRW1icnkpWy0xXSkKIyBGb3IgdGhlIGZ1c2lvbnMgdGhhdCBhcmUgbm90IHByZXNlbnQsIGZpbGwgdGhvc2UgY29sdW1ucyB3aXRoIDAKYWxsRnVzZUVtYnJ5WywgbWlzc2luZ0VtYnJ5RnVzaW9uXSA8LSAwCgojIFdyaXRlIHRvIGZpbGUKYWxsRnVzZUVtYnJ5ICU+JQogIHdyaXRlX3RzdihlbWJyeUZpbGUpCmBgYAoKIyMjIyBXcml0ZSBlcGVuZHltb21hIGZ1c2lvbnMgdG8gZmlsZQoKYGBge3J9CmFsbEZ1c2VFcGVuZCA8LSBhbGxGdXNlRXBlbmQgJT4lCiAgcHJlcGFyZU91dHB1dChzcGVjaW1lbnNVbmlvbikgCgojIFdoaWNoIGZ1c2lvbnMgb2YgaW50ZXJlc3QgYXJlIG5vdCBwcmVzZW50IGluIGFueSBzYW1wbGVzPwptaXNzaW5nRXBlbmRGdXNpb24gPC0gc2V0ZGlmZihlcGVuZEZ1c2VzLCBjb2xuYW1lcyhhbGxGdXNlRXBlbmQpWy0xXSkKIyBGb3IgdGhlIGZ1c2lvbnMgdGhhdCBhcmUgbm90IHByZXNlbnQsIGZpbGwgdGhvc2UgY29sdW1ucyB3aXRoIDAKYWxsRnVzZUVwZW5kWywgbWlzc2luZ0VwZW5kRnVzaW9uXSA8LSAwCgphbGxGdXNlRXBlbmQgJT4lCiAgd3JpdGVfdHN2KGVwZW5kRmlsZSkKYGBgCgoKIyMjIyBXcml0ZSBld2luZ3Mgc2FyY29tYSBmdXNpb25zIHRvIGZpbGUKCmBgYHtyfQphbGxGdXNlRXdpbmcgPC0gYWxsRnVzZUV3aW5nICU+JQogIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pCgojIFdoaWNoIGZ1c2lvbnMgb2YgaW50ZXJlc3QgYXJlIG5vdCBwcmVzZW50IGluIGFueSBzYW1wbGVzPwptaXNzaW5nRXdpbmdGdXNpb24gPC0gc2V0ZGlmZihld2luZ3NGdXNlcywgY29sbmFtZXMoYWxsRnVzZUV3aW5nKVstMV0pCiMgRm9yIHRoZSBmdXNpb25zIHRoYXQgYXJlIG5vdCBwcmVzZW50LCBmaWxsIHRob3NlIGNvbHVtbnMgd2l0aCAwCmFsbEZ1c2VFd2luZ1ssIG1pc3NpbmdFd2luZ0Z1c2lvbl0gPC0gMAoKYWxsRnVzZUV3aW5nICU+JQogIHdyaXRlX3Rzdihld2luZ3NGaWxlKQpgYGAKCiMjIyMgUGVyZm9ybSBzZWxlY3Rpb24gZm9yIExHQVQgZnVzaW9ucwpGaXJzdCBwdWxsIHRoZSBmdXNpb25zIG9yIGdlbmVzIGZyb20gdGhlIGdvaSBsaXN0IHdoaWNoIGFyZSBub3Qga2luYXNlcyBmb3IgdGhlIGZpbmFsIG91dHB1dCBmaWxlLCBzaW5jZSB0aGVzZSB3aWxsIG5vdCBuZWVkIGZ1cnRoZXIgaW50ZXJyb2dhdGlvbi4KYGBge3J9CiMgV2hpY2ggZ2VuZXMvZnVzaW9ucyBhcmUgbm90IGtpbmFzZXMsIGJ1dCBpbiB0aGUgbGlzdD8KIyBTZXBhcmF0ZSBMR0FUIGZ1c2lvbnMgaW50byBnZW5lcywgY29tYmluZSB3aXRoIGdlbmUgbGlzdCwgY2hlY2sgZm9yIG5vdCBraW5hc2UKbGdhdEZ1c2VzX2RmIDwtIGFzLmRhdGEuZnJhbWUobGdhdEZ1c2VzKSAlPiUKICBzZXBhcmF0ZShsZ2F0RnVzZXMsIGludG8gPSBjKCJHZW5lMUEiLCAiR2VuZTFCIiksIHJlbW92ZSA9IEYpCgpraW5hc2VzIDwtIGFubm90ICU+JQogIGZpbHRlcih0eXBlID09ICJLaW5hc2UiKSAlPiUKICBwdWxsKEdlbmVfU3ltYm9sKQoKbGdhdEZ1c2VzX2RmIDwtIGxnYXRGdXNlc19kZiAlPiUgCiAgZHBseXI6Om11dGF0ZShHZW5lMUFfYW5ubyA9IGNhc2Vfd2hlbihHZW5lMUEgJWluJSBraW5hc2VzIH4gIktpbmFzZSIsIFRSVUUgfiAiTm9uLUtpbmFzZSIpLCAKICAgICAgICAgICAgICAgIEdlbmUxQl9hbm5vID0gY2FzZV93aGVuKEdlbmUxQiAlaW4lIGtpbmFzZXMgfiAiS2luYXNlIiwgVFJVRSB+ICJOb24tS2luYXNlIikpCgojIE9ubHkgcHVsbCBmdXNpb25zIHRoYXQgZG8gbm90IGNvbnRhaW4ga2luYXNlIGdlbmVzLCBhcyBvbmVzIHdpdGgga2luYXNlcyB3aWxsIGJlIGRlYWx0IHdpdGggc2VwYXJhdGVseSBsYXRlcgpub25raW5hc2VfbGdhdEZ1c2VzIDwtIGxnYXRGdXNlc19kZiAlPiUKICBmaWx0ZXIoR2VuZTFBX2Fubm8gPT0gIk5vbi1LaW5hc2UiICYgR2VuZTFCX2Fubm8gPT0gIk5vbi1LaW5hc2UiKSAlPiUKICBwdWxsKGxnYXRGdXNlcykKCiMgSWRlbnRpZnkgbm9uLWtpbmFzZSBnZW5lcyBpbiBMR0FUIGdvaSBsaXN0Cm5vbmtpbmFzZV9sZ2F0R2VuZXMgPC0gc2V0ZGlmZihsZ2F0R2VuZXMsIGtpbmFzZXMpCgojIFB1bGwgTEdBVCBub24ta2luYXNlIGZ1c2lvbnMKbm9ua2luYXNlTEdBVCA8LSBmaWx0ZXJGdXNpb24oZGYgPSBwdXRhdGl2ZU9uY29nZW5pY0RGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1c2VzID0gbm9ua2luYXNlX2xnYXRGdXNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcyA9IG5vbmtpbmFzZV9sZ2F0R2VuZXMpICU+JQogIGRpc3RpbmN0KCkKYGBgCgpOZXh0LCBjb2xsZWN0IGZ1c2lvbnMgd2hpY2ggY29udGFpbiAzJyBraW5hc2VzIHdoaWNoIGFyZSBpbi1mcmFtZSBhbmQgcmV0YWluIHRoZSBraW5hc2UgZG9tYWluLiAKS2VlcCB0aGVzZSBmb3IgdGhlIGZpbmFsIG91dHB1dCBmaWxlLgpgYGB7cn0KdGhyZWVfcHJpbWVfa2luYXNlX2luZnJhbWUgPC0gYWxsRnVzZUxHQVQgJT4lCiAgZmlsdGVyKGdyZXBsKCJLaW5hc2UiLCBHZW5lMUJfYW5ubykgJiBGdXNpb25fVHlwZSA9PSAiaW4tZnJhbWUiICYgRG9tYWluUmV0YWluZWRHZW5lMUIgPT0gIlllcyIpICU+JQogIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUsIEdlbmUxQSwgR2VuZTFCKSAlPiUKICBkaXN0aW5jdCgpCgojIEFyZSB0aGVyZSBhbnkgZnVzaW9ucyB0aGF0IGFyZSBpbi1mcmFtZSwgYnV0IGRvIG5vdCByZXRhaW4gdGhlIGtpbmFzZSBkb21haW4/IERvIHRoZXkgaGF2ZSBpbi1mcmFtZSBmdXNpb25zIHJldGFpbmluZyB0aGUga2luYXNlIGRvbWFpbiBpbiB0aGUgc2FtZSBmdXNpb24/CnRocmVlX3ByaW1lX2tpbmFzZV9vdXRmcmFtZSA8LSBhbGxGdXNlTEdBVCAlPiUKICBmaWx0ZXIoZ3JlcGwoIktpbmFzZSIsIEdlbmUxQl9hbm5vKSAmIEZ1c2lvbl9UeXBlID09ICJpbi1mcmFtZSIgJiBEb21haW5SZXRhaW5lZEdlbmUxQiA9PSAiTm8iKSAlPiUKICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lKSAlPiUKICBkaXN0aW5jdCgpCgp0aHJlZV9wcmltZV9raW5hc2Vfb3V0ZnJhbWUKYGBgCgpMZXQncyBsb29rIGF0IHRoZXNlIGp1c3QgdG8gYmUgc3VyZSB0aGUgcmVzdWx0cyBhcmUgYXMgZXhwZWN0ZWQuCmBgYHtyfQojIGBCU19LRTU2TU1ZMCBBUkhHRUYyLS1OVFJLMWAgb25lIGRvZXMgYW5kIHdpbGwgYmUgY2FwdHVyZWQgaW4gdGhlIGB0aHJlZV9wcmltZV9raW5hc2VfaW5mcmFtZWAgbGlzdCwgYnV0IGBCU19CMUM2R1o4NCBDSElDMi0tUERHRlJBMmAgZG9lcyBub3QgcmV0YWluIHRoZSBraW5hc2UgZG9tYWluLCBzbyB3ZSBkbyBub3Qgd2FudCB0byBhZGQgaXQuCmludGVyc2VjdCh0aHJlZV9wcmltZV9raW5hc2Vfb3V0ZnJhbWVbLGMoIlNhbXBsZSIsICJGdXNpb25OYW1lIildLCB0aHJlZV9wcmltZV9raW5hc2VfaW5mcmFtZVssYygiU2FtcGxlIiwgIkZ1c2lvbk5hbWUiKV0pCmBgYAoKYGBge3J9CiMgV2hpY2ggZnVzaW9ucyBhcmUgbm90IGluLWZyYW1lPwp0aHJlZV9wcmltZV9raW5hc2Vfb3V0ZnJhbWUgPC0gYWxsRnVzZUxHQVQgJT4lCiAgZmlsdGVyKGdyZXBsKCJLaW5hc2UiLCBHZW5lMUJfYW5ubykgJiBGdXNpb25fVHlwZSAhPSAiaW4tZnJhbWUiKSAlPiUKICBkaXN0aW5jdCgpCiMgQ2hlY2sgdGhleSBkb24ndCByZXRhaW4gdGhlIGtpbmFzZSBkb21haW4uIFRoZXkgZG8gbm90LCBzbyBsZWF2ZSBvdXQuCnRhYmxlKHRocmVlX3ByaW1lX2tpbmFzZV9vdXRmcmFtZSREb21haW5SZXRhaW5lZEdlbmUxQikKYGBgCgpOZXh0LCBmaWx0ZXIgYWxsIGZ1c2lvbnMgZm9yIDUnIGtpbmFzZSBmdXNpb25zIHdoaWNoIGhhdmUgcmVjaXByb2NhbCBmdXNpb25zIGFuZCByZXRhaW4gdGhlIGtpbmFzZSBkb21haW4uCktlZXAgdGhlc2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KYGBge3J9CiMgS2VlcCB0aG9zZSB3aXRoIGtpbmFzZSBkb21haW4gcmV0YWluZWQgYW5kIGZ1c2lvbiBpbi1mcmFtZSAtIGtlZXAgdGhpcyBsaXN0CmZpdmVfcHJpbWVfZG9tYWluX2ludGFjdCA8LSBhbGxGdXNlTEdBVCAlPiUKICBmaWx0ZXIoZ3JlcGwoIktpbmFzZSIsIEdlbmUxQV9hbm5vKSAmIERvbWFpblJldGFpbmVkR2VuZTFBID09ICJZZXMiICYgRnVzaW9uX1R5cGUgPT0gImluLWZyYW1lIikgJT4lCiAgc2VsZWN0KFNhbXBsZSwgRnVzaW9uTmFtZSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKCk5leHQsIGZpbHRlciBhbGwgZnVzaW9ucyBmb3IgNScga2luYXNlIGZ1c2lvbnMgd2hpY2ggaGF2ZSBsb3N0IHRoZSBraW5hc2UgZG9tYWluIGZvciByZWNpcHJvY2FsIGZ1c2lvbnMgd2hpY2ggaGF2ZSBhIGtpbmFzZSBkb21haW4gaW50YWN0IGFuZCBhcmUgaW4tZnJhbWUuCktlZXAgdGhlc2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KYGBge3J9CiMgRmlyc3QsIGdldCBmdXNpb25zIHdpdGggNScga2luYXNlcyB3aGljaCBsb3N0IHRoZSBraW5hc2UgZG9tYWluIGFuZCBoYXZlIGEgcmVjaXByb2NhbCwgdGhlbiBhZGQgdGhlIHJlY2lwcm9jYWwgZnVzaW9uLgpmaXZlX3ByaW1lX2RvbWFpbl9sb3N0IDwtIGFsbEZ1c2VMR0FUICU+JQogIGZpbHRlcihncmVwbCgiS2luYXNlIiwgR2VuZTFBX2Fubm8pICYgcmVjaXByb2NhbF9leGlzdHMgPT0gIlRSVUUiKSAlPiUKICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lLCBHZW5lMUEsIEdlbmUxQiwgRnVzaW9uX1R5cGUsIERvbWFpblJldGFpbmVkR2VuZTFBKSAlPiUKICBmaWx0ZXIoRG9tYWluUmV0YWluZWRHZW5lMUEgPT0gIk5vIikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUodGhyZWVfcHJpbWVfa2luYXNlID0gcGFzdGUoR2VuZTFCLCBHZW5lMUEsIHNlcCA9Ii0tIikpCgojIFRoZW4sIHNlbGVjdCB0aGUgaW4tZnJhbWUgcmVjaXByb2NhbHMgd2hpY2ggaGF2ZSB0aGUga2luYXNlIGRvbWFpbiBpbiB0YWN0LiBSZXRhaW4gNScga2luYXNlIGZ1c2lvbiBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlIDMnIGZ1c2lvbiBjb2x1bW4gbmFtZSB0byBGdXNpb25OYW1lIGZvciBtZXJnaW5nIHdpdGggYWxsRnVzZUxHQVQuCmZpdmVfcHJpbWVfa2luYXNlX2tlZXAgPC0gZml2ZV9wcmltZV9kb21haW5fbG9zdCAlPiUgCiAgc2VsZWN0KFNhbXBsZSwgZml2ZV9wcmltZV9raW5hc2UgPSBGdXNpb25OYW1lLCBGdXNpb25OYW1lID0gdGhyZWVfcHJpbWVfa2luYXNlKSAlPiUKICBsZWZ0X2pvaW4oYWxsRnVzZUxHQVQsIGJ5ID0gYygiU2FtcGxlIiwgIkZ1c2lvbk5hbWUiKSkgJT4lCiAgZmlsdGVyKEZ1c2lvbl9UeXBlID09ICJpbi1mcmFtZSIgJiBEb21haW5SZXRhaW5lZEdlbmUxQiA9PSAiWWVzIikgJT4lCiAgc2VsZWN0KFNhbXBsZSwgRnVzaW9uTmFtZSA9IGZpdmVfcHJpbWVfa2luYXNlKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKUmJpbmQgbGlzdHMgZm9yIGZpbmFsIHRhYmxlIG9mIExHQVQgZnVzaW9ucyBvZiBpbnRlcmVzdApgYGB7cn0KIyBSYmluZCBsaXN0cyBmb3IgZmluYWwgdGFibGUgb2YgTEdBVCBmdXNpb25zIG9mIGludGVyZXN0CnN1YnNldEZ1c2VMR0FUIDwtIGJpbmRfcm93cyhub25raW5hc2VMR0FULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVfcHJpbWVfa2luYXNlX2luZnJhbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml2ZV9wcmltZV9kb21haW5faW50YWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdmVfcHJpbWVfa2luYXNlX2tlZXApICU+JQogIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUpICU+JQogIGRpc3RpbmN0KCkKYGBgCgojIyMjIFdyaXRlIExHQVQgZnVzaW9ucyB0byBmaWxlCgpgYGB7cn0Kc3Vic2V0RnVzZUxHQVQgPC0gc3Vic2V0RnVzZUxHQVQgJT4lCiAgcHJlcGFyZU91dHB1dChzcGVjaW1lbnNVbmlvbikKCiMgV2hpY2ggZnVzaW9ucyBvZiBpbnRlcmVzdCBhcmUgbm90IHByZXNlbnQgaW4gYW55IHNhbXBsZXM/Cm1pc3NpbmdMZ2F0RnVzaW9uIDwtIHNldGRpZmYobGdhdEZ1c2VzLCBjb2xuYW1lcyhzdWJzZXRGdXNlTEdBVClbLTFdKQojIEZvciB0aGUgZnVzaW9ucyB0aGF0IGFyZSBub3QgcHJlc2VudCwgZmlsbCB0aG9zZSBjb2x1bW5zIHdpdGggMApzdWJzZXRGdXNlTEdBVFssIG1pc3NpbmdMZ2F0RnVzaW9uXSA8LSAwCgpzdWJzZXRGdXNlTEdBVCAlPiUKICB3cml0ZV90c3YobGdhdEZpbGUpCmBgYAoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK
+
LS0tCnRpdGxlOiAiR2VuZXJhdGUgRnVzaW9uIFN1bW1hcnkgRmlsZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IERhbmllbCBNaWxsZXIgKEQzYiksIEphY2x5biBUYXJvbmkgKENDREwpLCBKbyBMeW5uZSBSb2tpdGEgKEQzYikKZGF0ZTogSmFudWFyeSAyMDIwLCBOb3ZlbWJlciAyMDIwCi0tLQoKR2VuZXJhdGUgZnVzaW9uIGZpbGVzIHNwZWNpZmljYWxseSBmb3IgY29uc3VtcHRpb24gYnkgbW9sZWN1bGFyIHN1YnR5cGluZyBhbmFseXNlcwoKIyMgU2V0IHVwCgojIyMgTGlicmFyaWVzIGFuZCBmdW5jdGlvbnMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpgYGB7cn0KIycgR2VuZXJhdGUgZmlsdGVyZWQgZnVzaW9uIGZyYW1lCiMnIEBwYXJhbSBkZiBVbmZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCiMnIEBwYXJhbSBiaW9pZCBMaXN0IG9mIGJpb3NwZWNpbWVuIElEcwojJyBAcGFyYW0gZnVzZXMgTGlzdCBvZiBleHBsaWNpdCBmdXNpb24gbmFtZXMKIycgQHBhcmFtIGdlbmVzIExpc3Qgb2YgZ2VuZSBuYW1lcwojJyBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBmdXNpb24gZGF0YSBmcmFtZQpmaWx0ZXJGdXNpb24gPC0gZnVuY3Rpb24oZGYsIGJpb2lkLCBmdXNlcywgZ2VuZXMpIHsKICBpZiAoIW1pc3NpbmcoYmlvaWQpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIFNhbXBsZSAlaW4lIGJpb2lkKQogIH0KICBpZiAoIW1pc3NpbmcoZnVzZXMpICYgIW1pc3NpbmcoZ2VuZXMpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIEZ1c2lvbk5hbWUgJWluJSBmdXNlcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUIgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkIgJWluJSBnZW5lcykKICB9IGVsc2UgaWYgKCFtaXNzaW5nKGZ1c2VzKSkgewogICAgZGYgPC0gZmlsdGVyKGRmLCBGdXNpb25OYW1lICVpbiUgZnVzZXMpCiAgfSBlbHNlIGlmICghbWlzc2luZyhnZW5lcykpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwKICAgICAgICAgICAgICAgICBHZW5lMUEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkEgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMUIgJWluJSBnZW5lcyB8CiAgICAgICAgICAgICAgICAgICBHZW5lMkIgJWluJSBnZW5lcykKICB9CiAgcmV0dXJuKGRmICU+JSAKICAgICAgICAgICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lLCBGdXNpb25fVHlwZSwgR2VuZTFBLCBHZW5lMUIsIEdlbmUyQSwgR2VuZTJCLCBHZW5lMUFfYW5ubywgR2VuZTFCX2Fubm8sIHJlY2lwcm9jYWxfZXhpc3RzLCBEb21haW5SZXRhaW5lZEdlbmUxQSwgRG9tYWluUmV0YWluZWRHZW5lMUIpICU+JQogICAgICAgICAgIGRpc3RpbmN0KCkpCn0KCiMnIEdlbmVyYXRlIG1hdHJpeCB3aXRoIGZ1c2lvbiBjb3VudHMKIycgQHBhcmFtIGZ1c2VERiBGaWx0ZXJlZCBmdXNpb24gZGF0YSBmcmFtZQojJyBAcGFyYW0gYmlvaWQgTGlzdCBvZiBiaW9zcGVjaW1lbiBJRHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZmluYWwgdGFibGUKIycgQHJldHVybiBEYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZnVzaW9uIGNvdW50cwpwcmVwYXJlT3V0cHV0IDwtIGZ1bmN0aW9uKGZ1c2VERiwgYmlvaWQpIHsKICBmdXNlREYgJT4lIAogICAgIyBzb21lIGZ1c2lvbnMgaGF2ZSBpbi1mcmFtZSBhbmQgZnJhbWVzaGlmdCBmdXNpb24gY2FsbHMgZm9yIGEgc2FtcGxlCiAgICAjIHRoaXMgd2lsbCBtYWtlIHVuaXF1ZSBmdXNpb25OYW1lIGFuZCBTYW1wbGUgZGF0YXNldCB0byBnZXQgMS8wIHZhbHVlcwogICAgZHBseXI6OnNlbGVjdChTYW1wbGUsRnVzaW9uTmFtZSkgJT4lCiAgICB1bmlxdWUoKSAlPiUKICAgIHJlc2hhcGUyOjpkY2FzdChTYW1wbGUgfiBGdXNpb25OYW1lLGZ1bi5hZ2dyZWdhdGUgPSBsZW5ndGgpICU+JQogICAgcmlnaHRfam9pbihkYXRhLmZyYW1lKFNhbXBsZSA9IGJpb2lkKSkgJT4lCiAgICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUKICAgIHJlbmFtZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID0gU2FtcGxlKQp9CmBgYAoKIyMjIFJlYWQgaW4gZGF0YQoKYGBge3J9CmRhdGFEaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIikKZnVzRGlyIDwtIGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiYW5hbHlzZXMiLCAiZnVzaW9uX2ZpbHRlcmluZyIsICJyZXN1bHRzIikKYW5ub3REaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJhbmFseXNlcyIsICJmdXNpb25fZmlsdGVyaW5nIiwgInJlZmVyZW5jZXMiKQojJyBBbm5vdGF0aW9uIGZpbGUgdG8gYmUgdXNlZCBmb3IgaWRlbnRpZnlpbmcga2luYXNlIGdlbmVzCmFubm90IDwtIHJlYWRfdHN2KGZpbGUucGF0aChhbm5vdERpciwgImdlbmVsaXN0cmVmZXJlbmNlLnR4dCIpKQojJyBUaGUgcHV0YXRpdmUgb25jb2dlbmljIGZ1c2lvbiBmaWxlIGlzIHdoYXQgd2UnbGwgdXNlIHRvIGNoZWNrIGZvciB0aGUgIycgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiB0aGUgZnVzaW9ucy4KcHV0YXRpdmVPbmNvZ2VuaWNERiA8LSAKICByZWFkX3RzdihmaWxlLnBhdGgoZnVzRGlyLCAicGJ0YS1mdXNpb24tcHV0YXRpdmUtb25jb2dlbmljLnRzdiIpKQojJyBIb3dldmVyLCBzb21lIGJpb3NwZWNpbWVucyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgZmlsdGVyZWQsIHByaW9yaXRpemVkCiMnIGZpbGUgYnV0ICphcmUqIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIGZpbGVzIC0tIHRoaXMgd2lsbCBjYXVzZSB0aGVtIHRvIGJlCiMnICJtaXNzaW5nIiBpbiB0aGUgZmluYWwgZmlsZXMgZm9yIGNvbnN1bXB0aW9uIHdoaWNoIGNvdWxkIG1pc2xlYWQgYW5hbHlzdHMuCmFycmliYURGIDwtIHJlYWRfdHN2KGZpbGUucGF0aChkYXRhRGlyLCAicGJ0YS1mdXNpb24tYXJyaWJhLnRzdi5neiIpKQpzdGFyZnVzaW9uREYgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGRhdGFEaXIsICJwYnRhLWZ1c2lvbi1zdGFyZnVzaW9uLnRzdi5neiIpKQpgYGAKCiMjIyBPdXRwdXQKCmBgYHtyfQpyZXN1bHRzRGlyIDwtICJyZXN1bHRzIgppZiAoIWRpci5leGlzdHMocmVzdWx0c0RpcikpIHsKICBkaXIuY3JlYXRlKHJlc3VsdHNEaXIpCn0KZXBlbmRGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZXBlbmR5bW9tYV9mb2kudHN2IikKZW1icnlGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZW1icnlvbmFsX2ZvaS50c3YiKQpld2luZ3NGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZXdpbmdzX2ZvaS50c3YiKQpsZ2F0RmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0c0RpciwgImZ1c2lvbl9zdW1tYXJ5X2xnYXRfZm9pLnRzdiIpCmBgYAoKIyMgRnVzaW9ucyBhbmQgZ2VuZXMgb2YgaW50ZXJlc3QKClRha2VuIGZyb20gW2BBbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzIzI0NWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNDUpLCBbYEFsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMjMjUxYF0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzI1MSksIFtgQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcyM2MjNgXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvNjIzKSByZXNwZWN0aXZlbHksIGFuZCBbYEFsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMjODA4YF0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzgwOCkgCgpgYGB7cn0KIycgKipGaWx0ZXJzKioKIycKIycgKkZ1c2lvbnMgRmlsdGVycyoKIycgMTogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVwZW5keW1vbWEgdHVtb3JzCmVwZW5kRnVzZXMgPC0gYygKICAiQzExb3JmOTUtLU1BTUwyIiwKICAiQzExb3JmOTUtLVJFTEEiLAogICJDMTFvcmY5NS0tWUFQMSIsCiAgIkxUQlAzLS1SRUxBIiwKICAiUFRFTi0tVEFTMlIxIiwKICAiWUFQMS0tRkFNMTE4QiIsCiAgIllBUDEtLU1BTUxEMSIsCiAgIllBUDEtLU1BTUxEMiIKKQplcGVuZEdlbmVzIDwtIGMoCiAgIlJFTEEiCikKIycgMjogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVtYnJ5b25hbCB0dW1vcnMKIycgYXMgd2VsbCBhcyBmdXNpb25zIGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIGdlbmUgd2l0aCBhbnkgb3RoZXIgZ2VuZQplbWJyeUZ1c2VzIDwtIGMoCiAgIkNJQy0tTlVUTTEiLAogICJNTjEtLUJFTkQyIiwKICAiTU4xLS1DWFhDNSIKKQplbWJyeUdlbmVzIDwtIGMoCiAgIkZPWFIyIiwKICAiTU4xIiwKICAiVFRZSDEiCikKCiMnIDM6IEV4YWN0IG1hdGNoIGEgbGlzdCBvZiBmdXNpb25zIHdoaWNoIGFyZSBoYWxsbWFyayBmdXNpb25zIGluIEV3aW5ncyBTYXJjb21hCmV3aW5nc0Z1c2VzPC0gYygKICAiRVdTUjEtLUZMSTEiLCAKICAiRVdTUjEtLUVSRyIsCiAgIkZVUy0tRVJHIgopCgojJyA0OiBFeGFjdCBtYXRjaCBhIGxpc3Qgb2YgZnVzaW9ucyBjb21tb24gaW4gbG93LWdyYWRlIGFzdHJvY3l0aWMgKExHQVQpIHR1bW9ycwojJyBhcyB3ZWxsIGFzIGZ1c2lvbnMgY29udGFpbmluZyBhIHBhcnRpY3VsYXIgZ2VuZSB3aXRoIGFueSBvdGhlciBnZW5lCmxnYXRGdXNlcyA8LSBjKAogICJLSUFBMTU0OS0tQlJBRiIsCiAgIkZHRlIxLS1UQUNDMSIsCiAgIk1ZQi0tUUtJIgopCmxnYXRHZW5lcyA8LSBjKAogICJCUkFGIiwKICAiQUxLIiwKICAiUk9TMSIsCiAgIk5UUksxIiwKICAiTlRSSzIiLAogICJOVFJLMyIsCiAgIlBER0ZSQSIsCiAgIkZHRlIyIiwKICAiRkdGUjEiLAogICJNWUIiLAogICJNWUJMMSIsCiAgIlJBRjEiCikKCmBgYAoKIyMjIEZpbHRlciBwdXRhdGl2ZSBvbmNvZ2VuaWMgZnVzaW9ucyBsaXN0CgpgYGB7cn0KYWxsRnVzZUVwZW5kIDwtIGZpbHRlckZ1c2lvbihkZiA9IHB1dGF0aXZlT25jb2dlbmljREYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVzZXMgPSBlcGVuZEZ1c2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVzID0gZXBlbmRHZW5lcykKYWxsRnVzZUVtYnJ5IDwtIGZpbHRlckZ1c2lvbihkZiA9IHB1dGF0aXZlT25jb2dlbmljREYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVzZXMgPSBlbWJyeUZ1c2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVzID0gZW1icnlHZW5lcykKYWxsRnVzZUV3aW5nIDwtIGZpbHRlckZ1c2lvbihkZiA9IHB1dGF0aXZlT25jb2dlbmljREYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVzZXMgPSBld2luZ3NGdXNlcykKYWxsRnVzZUxHQVQgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGxnYXRGdXNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcyA9IGxnYXRHZW5lcykKCmBgYAoKR2V0IHRoZSBiaW9zcGVjaW1lbiBJRHMgdGhhdCBhcmUgcHJlc2VudCBpbiAqZWl0aGVyKiBjYWxsZXIgZmlsZSAoQXJyaWJhLCBTVEFSRnVzaW9uKS4KVGhlIGZ1c2lvbnMgaW4gdGhlIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb24gZmlsZSBjYW4gYmUgcmV0YWluZWQgZXZlbiBpZiB0aGV5IGFyZSBub3QgaW4gYm90aCBjYWxsZXJzOiBodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9ibG9iLzhmYmExNzUzNjA4ZDhhYzBhYTNkNWQ3ZDYzYzQ4MGI4ZjAwZmYwZTkvYW5hbHlzZXMvZnVzaW9uX2ZpbHRlcmluZy8wNC1wcm9qZWN0LXNwZWNpZmljLWZpbHRlcmluZy5SbWQjTDI0MgpXZSB1c2UgdGhlIHB1dGF0aXZlIG9uY29nZW5pYyBmaWxlIGhlcmUsIHRoZXJlZm9yZSBhbnkgc2FtcGxlIHRoYXQgaXMgaW4gZWl0aGVyIGZpbGUgYnV0IGRvZXMgbm90IGhhdmUgYSBmdXNpb24gdGhhdCBpcyByZWxldmFudCB0byB0aGUgc3VidHlwaW5nIHRpY2tldHMgaXMgbm90IF9taXNzaW5nXyBidXQgaW5zdGVhZCBoYXMgbm8gZXZpZGVuY2Ugb2YgdGhlIHJlbGV2YW50IGZ1c2lvbnMuCgpgYGB7cn0Kc3BlY2ltZW5zVW5pb248LSB1bmlvbihhcnJpYmFERiR0dW1vcl9pZCwgc3RhcmZ1c2lvbkRGJHR1bW9yX2lkKQpgYGAKCiMjIyMgV3JpdGUgbm9uLU1CLCBub24tQVRSVCBlbWJyeW9uYWwgZnVzaW9ucyB0byBmaWxlCgpgYGB7cn0KYWxsRnVzZUVtYnJ5IDwtIGFsbEZ1c2VFbWJyeSAlPiUKICBwcmVwYXJlT3V0cHV0KHNwZWNpbWVuc1VuaW9uKQoKIyBXaGljaCBmdXNpb25zIG9mIGludGVyZXN0IGFyZSBub3QgcHJlc2VudCBpbiBhbnkgc2FtcGxlcz8KbWlzc2luZ0VtYnJ5RnVzaW9uIDwtIHNldGRpZmYoZW1icnlGdXNlcywgY29sbmFtZXMoYWxsRnVzZUVtYnJ5KVstMV0pCiMgRm9yIHRoZSBmdXNpb25zIHRoYXQgYXJlIG5vdCBwcmVzZW50LCBmaWxsIHRob3NlIGNvbHVtbnMgd2l0aCAwCmFsbEZ1c2VFbWJyeVssIG1pc3NpbmdFbWJyeUZ1c2lvbl0gPC0gMAoKIyBXcml0ZSB0byBmaWxlCmFsbEZ1c2VFbWJyeSAlPiUKICB3cml0ZV90c3YoZW1icnlGaWxlKQpgYGAKCiMjIyMgV3JpdGUgZXBlbmR5bW9tYSBmdXNpb25zIHRvIGZpbGUKCmBgYHtyfQphbGxGdXNlRXBlbmQgPC0gYWxsRnVzZUVwZW5kICU+JQogIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pIAoKIyBXaGljaCBmdXNpb25zIG9mIGludGVyZXN0IGFyZSBub3QgcHJlc2VudCBpbiBhbnkgc2FtcGxlcz8KbWlzc2luZ0VwZW5kRnVzaW9uIDwtIHNldGRpZmYoZXBlbmRGdXNlcywgY29sbmFtZXMoYWxsRnVzZUVwZW5kKVstMV0pCiMgRm9yIHRoZSBmdXNpb25zIHRoYXQgYXJlIG5vdCBwcmVzZW50LCBmaWxsIHRob3NlIGNvbHVtbnMgd2l0aCAwCmFsbEZ1c2VFcGVuZFssIG1pc3NpbmdFcGVuZEZ1c2lvbl0gPC0gMAoKYWxsRnVzZUVwZW5kICU+JQogIHdyaXRlX3RzdihlcGVuZEZpbGUpCmBgYAoKCiMjIyMgV3JpdGUgZXdpbmdzIHNhcmNvbWEgZnVzaW9ucyB0byBmaWxlCgpgYGB7cn0KYWxsRnVzZUV3aW5nIDwtIGFsbEZ1c2VFd2luZyAlPiUKICBwcmVwYXJlT3V0cHV0KHNwZWNpbWVuc1VuaW9uKQoKIyBXaGljaCBmdXNpb25zIG9mIGludGVyZXN0IGFyZSBub3QgcHJlc2VudCBpbiBhbnkgc2FtcGxlcz8KbWlzc2luZ0V3aW5nRnVzaW9uIDwtIHNldGRpZmYoZXdpbmdzRnVzZXMsIGNvbG5hbWVzKGFsbEZ1c2VFd2luZylbLTFdKQojIEZvciB0aGUgZnVzaW9ucyB0aGF0IGFyZSBub3QgcHJlc2VudCwgZmlsbCB0aG9zZSBjb2x1bW5zIHdpdGggMAphbGxGdXNlRXdpbmdbLCBtaXNzaW5nRXdpbmdGdXNpb25dIDwtIDAKCmFsbEZ1c2VFd2luZyAlPiUKICB3cml0ZV90c3YoZXdpbmdzRmlsZSkKYGBgCgojIyMjIFBlcmZvcm0gc2VsZWN0aW9uIGZvciBMR0FUIGZ1c2lvbnMKRmlyc3QgcHVsbCB0aGUgZnVzaW9ucyBvciBnZW5lcyBmcm9tIHRoZSBnb2kgbGlzdCB3aGljaCBhcmUgbm90IGtpbmFzZXMgZm9yIHRoZSBmaW5hbCBvdXRwdXQgZmlsZSwgc2luY2UgdGhlc2Ugd2lsbCBub3QgbmVlZCBmdXJ0aGVyIGludGVycm9nYXRpb24uCmBgYHtyfQojIFdoaWNoIGdlbmVzL2Z1c2lvbnMgYXJlIG5vdCBraW5hc2VzLCBidXQgaW4gdGhlIGxpc3Q/CiMgU2VwYXJhdGUgTEdBVCBmdXNpb25zIGludG8gZ2VuZXMsIGNvbWJpbmUgd2l0aCBnZW5lIGxpc3QsIGNoZWNrIGZvciBub3Qga2luYXNlCmxnYXRGdXNlc19kZiA8LSBhcy5kYXRhLmZyYW1lKGxnYXRGdXNlcykgJT4lCiAgc2VwYXJhdGUobGdhdEZ1c2VzLCBpbnRvID0gYygiR2VuZTFBIiwgIkdlbmUxQiIpLCByZW1vdmUgPSBGKQoKa2luYXNlcyA8LSBhbm5vdCAlPiUKICBmaWx0ZXIodHlwZSA9PSAiS2luYXNlIikgJT4lCiAgcHVsbChHZW5lX1N5bWJvbCkKCmxnYXRGdXNlc19kZiA8LSBsZ2F0RnVzZXNfZGYgJT4lIAogIGRwbHlyOjptdXRhdGUoR2VuZTFBX2Fubm8gPSBjYXNlX3doZW4oR2VuZTFBICVpbiUga2luYXNlcyB+ICJLaW5hc2UiLCBUUlVFIH4gIk5vbi1LaW5hc2UiKSwgCiAgICAgICAgICAgICAgICBHZW5lMUJfYW5ubyA9IGNhc2Vfd2hlbihHZW5lMUIgJWluJSBraW5hc2VzIH4gIktpbmFzZSIsIFRSVUUgfiAiTm9uLUtpbmFzZSIpKQoKIyBPbmx5IHB1bGwgZnVzaW9ucyB0aGF0IGRvIG5vdCBjb250YWluIGtpbmFzZSBnZW5lcywgYXMgb25lcyB3aXRoIGtpbmFzZXMgd2lsbCBiZSBkZWFsdCB3aXRoIHNlcGFyYXRlbHkgbGF0ZXIKbm9ua2luYXNlX2xnYXRGdXNlcyA8LSBsZ2F0RnVzZXNfZGYgJT4lCiAgZmlsdGVyKEdlbmUxQV9hbm5vID09ICJOb24tS2luYXNlIiAmIEdlbmUxQl9hbm5vID09ICJOb24tS2luYXNlIikgJT4lCiAgcHVsbChsZ2F0RnVzZXMpCgojIElkZW50aWZ5IG5vbi1raW5hc2UgZ2VuZXMgaW4gTEdBVCBnb2kgbGlzdApub25raW5hc2VfbGdhdEdlbmVzIDwtIHNldGRpZmYobGdhdEdlbmVzLCBraW5hc2VzKQoKIyBQdWxsIExHQVQgbm9uLWtpbmFzZSBmdXNpb25zCm5vbmtpbmFzZUxHQVQgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IG5vbmtpbmFzZV9sZ2F0RnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBub25raW5hc2VfbGdhdEdlbmVzKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKTmV4dCwgY29sbGVjdCBmdXNpb25zIHdoaWNoIGNvbnRhaW4gMycga2luYXNlcyB3aGljaCBhcmUgaW4tZnJhbWUgYW5kIHJldGFpbiB0aGUga2luYXNlIGRvbWFpbi4gCktlZXAgdGhlc2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4KYGBge3J9CnRocmVlX3ByaW1lX2tpbmFzZV9pbmZyYW1lIDwtIGFsbEZ1c2VMR0FUICU+JQogIGZpbHRlcihncmVwbCgiS2luYXNlIiwgR2VuZTFCX2Fubm8pICYgRnVzaW9uX1R5cGUgPT0gImluLWZyYW1lIiAmIERvbWFpblJldGFpbmVkR2VuZTFCID09ICJZZXMiKSAlPiUKICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lLCBHZW5lMUEsIEdlbmUxQikgJT4lCiAgZGlzdGluY3QoKQoKIyBBcmUgdGhlcmUgYW55IGZ1c2lvbnMgdGhhdCBhcmUgaW4tZnJhbWUsIGJ1dCBkbyBub3QgcmV0YWluIHRoZSBraW5hc2UgZG9tYWluPyBEbyB0aGV5IGhhdmUgaW4tZnJhbWUgZnVzaW9ucyByZXRhaW5pbmcgdGhlIGtpbmFzZSBkb21haW4gaW4gdGhlIHNhbWUgZnVzaW9uPwp0aHJlZV9wcmltZV9raW5hc2Vfb3V0ZnJhbWUgPC0gYWxsRnVzZUxHQVQgJT4lCiAgZmlsdGVyKGdyZXBsKCJLaW5hc2UiLCBHZW5lMUJfYW5ubykgJiBGdXNpb25fVHlwZSA9PSAiaW4tZnJhbWUiICYgRG9tYWluUmV0YWluZWRHZW5lMUIgPT0gIk5vIikgJT4lCiAgc2VsZWN0KFNhbXBsZSwgRnVzaW9uTmFtZSkgJT4lCiAgZGlzdGluY3QoKQoKdGhyZWVfcHJpbWVfa2luYXNlX291dGZyYW1lCmBgYAoKTGV0J3MgbG9vayBhdCB0aGVzZSBqdXN0IHRvIGJlIHN1cmUgdGhlIHJlc3VsdHMgYXJlIGFzIGV4cGVjdGVkLgpgYGB7cn0KIyBgQlNfS0U1Nk1NWTAgQVJIR0VGMi0tTlRSSzFgIG9uZSBkb2VzIGFuZCB3aWxsIGJlIGNhcHR1cmVkIGluIHRoZSBgdGhyZWVfcHJpbWVfa2luYXNlX2luZnJhbWVgIGxpc3QsIGJ1dCBgQlNfQjFDNkdaODQgQ0hJQzItLVBER0ZSQTJgIGRvZXMgbm90IHJldGFpbiB0aGUga2luYXNlIGRvbWFpbiwgc28gd2UgZG8gbm90IHdhbnQgdG8gYWRkIGl0LgppbnRlcnNlY3QodGhyZWVfcHJpbWVfa2luYXNlX291dGZyYW1lWyxjKCJTYW1wbGUiLCAiRnVzaW9uTmFtZSIpXSwgdGhyZWVfcHJpbWVfa2luYXNlX2luZnJhbWVbLGMoIlNhbXBsZSIsICJGdXNpb25OYW1lIildKQpgYGAKCmBgYHtyfQojIFdoaWNoIGZ1c2lvbnMgYXJlIG5vdCBpbi1mcmFtZT8KdGhyZWVfcHJpbWVfa2luYXNlX291dGZyYW1lIDwtIGFsbEZ1c2VMR0FUICU+JQogIGZpbHRlcihncmVwbCgiS2luYXNlIiwgR2VuZTFCX2Fubm8pICYgRnVzaW9uX1R5cGUgIT0gImluLWZyYW1lIikgJT4lCiAgZGlzdGluY3QoKQojIENoZWNrIHRoZXkgZG9uJ3QgcmV0YWluIHRoZSBraW5hc2UgZG9tYWluLiBUaGV5IGRvIG5vdCwgc28gbGVhdmUgb3V0Lgp0YWJsZSh0aHJlZV9wcmltZV9raW5hc2Vfb3V0ZnJhbWUkRG9tYWluUmV0YWluZWRHZW5lMUIpCmBgYAoKTmV4dCwgZmlsdGVyIGFsbCBmdXNpb25zIGZvciA1JyBraW5hc2UgZnVzaW9ucyB3aGljaCBoYXZlIHJlY2lwcm9jYWwgZnVzaW9ucyBhbmQgcmV0YWluIHRoZSBraW5hc2UgZG9tYWluLgpLZWVwIHRoZXNlIGZvciB0aGUgZmluYWwgb3V0cHV0IGZpbGUuCmBgYHtyfQojIEtlZXAgdGhvc2Ugd2l0aCBraW5hc2UgZG9tYWluIHJldGFpbmVkIGFuZCBmdXNpb24gaW4tZnJhbWUgLSBrZWVwIHRoaXMgbGlzdApmaXZlX3ByaW1lX2RvbWFpbl9pbnRhY3QgPC0gYWxsRnVzZUxHQVQgJT4lCiAgZmlsdGVyKGdyZXBsKCJLaW5hc2UiLCBHZW5lMUFfYW5ubykgJiBEb21haW5SZXRhaW5lZEdlbmUxQSA9PSAiWWVzIiAmIEZ1c2lvbl9UeXBlID09ICJpbi1mcmFtZSIpICU+JQogIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUpICU+JQogIGRpc3RpbmN0KCkKYGBgCgpOZXh0LCBmaWx0ZXIgYWxsIGZ1c2lvbnMgZm9yIDUnIGtpbmFzZSBmdXNpb25zIHdoaWNoIGhhdmUgbG9zdCB0aGUga2luYXNlIGRvbWFpbiBmb3IgcmVjaXByb2NhbCBmdXNpb25zIHdoaWNoIGhhdmUgYSBraW5hc2UgZG9tYWluIGludGFjdCBhbmQgYXJlIGluLWZyYW1lLgpLZWVwIHRoZXNlIGZvciB0aGUgZmluYWwgb3V0cHV0IGZpbGUuCmBgYHtyfQojIEZpcnN0LCBnZXQgZnVzaW9ucyB3aXRoIDUnIGtpbmFzZXMgd2hpY2ggbG9zdCB0aGUga2luYXNlIGRvbWFpbiBhbmQgaGF2ZSBhIHJlY2lwcm9jYWwsIHRoZW4gYWRkIHRoZSByZWNpcHJvY2FsIGZ1c2lvbi4KZml2ZV9wcmltZV9kb21haW5fbG9zdCA8LSBhbGxGdXNlTEdBVCAlPiUKICBmaWx0ZXIoZ3JlcGwoIktpbmFzZSIsIEdlbmUxQV9hbm5vKSAmIHJlY2lwcm9jYWxfZXhpc3RzID09ICJUUlVFIikgJT4lCiAgc2VsZWN0KFNhbXBsZSwgRnVzaW9uTmFtZSwgR2VuZTFBLCBHZW5lMUIsIEZ1c2lvbl9UeXBlLCBEb21haW5SZXRhaW5lZEdlbmUxQSkgJT4lCiAgZmlsdGVyKERvbWFpblJldGFpbmVkR2VuZTFBID09ICJObyIpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKHRocmVlX3ByaW1lX2tpbmFzZSA9IHBhc3RlKEdlbmUxQiwgR2VuZTFBLCBzZXAgPSItLSIpKQoKIyBUaGVuLCBzZWxlY3QgdGhlIGluLWZyYW1lIHJlY2lwcm9jYWxzIHdoaWNoIGhhdmUgdGhlIGtpbmFzZSBkb21haW4gaW4gdGFjdC4gUmV0YWluIDUnIGtpbmFzZSBmdXNpb24gaW5mb3JtYXRpb24gYW5kIHVwZGF0ZSAzJyBmdXNpb24gY29sdW1uIG5hbWUgdG8gRnVzaW9uTmFtZSBmb3IgbWVyZ2luZyB3aXRoIGFsbEZ1c2VMR0FULgpmaXZlX3ByaW1lX2tpbmFzZV9rZWVwIDwtIGZpdmVfcHJpbWVfZG9tYWluX2xvc3QgJT4lIAogIHNlbGVjdChTYW1wbGUsIGZpdmVfcHJpbWVfa2luYXNlID0gRnVzaW9uTmFtZSwgRnVzaW9uTmFtZSA9IHRocmVlX3ByaW1lX2tpbmFzZSkgJT4lCiAgbGVmdF9qb2luKGFsbEZ1c2VMR0FULCBieSA9IGMoIlNhbXBsZSIsICJGdXNpb25OYW1lIikpICU+JQogIGZpbHRlcihGdXNpb25fVHlwZSA9PSAiaW4tZnJhbWUiICYgRG9tYWluUmV0YWluZWRHZW5lMUIgPT0gIlllcyIpICU+JQogIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUgPSBmaXZlX3ByaW1lX2tpbmFzZSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKClJiaW5kIGxpc3RzIGZvciBmaW5hbCB0YWJsZSBvZiBMR0FUIGZ1c2lvbnMgb2YgaW50ZXJlc3QKYGBge3J9CiMgUmJpbmQgbGlzdHMgZm9yIGZpbmFsIHRhYmxlIG9mIExHQVQgZnVzaW9ucyBvZiBpbnRlcmVzdApzdWJzZXRGdXNlTEdBVCA8LSBiaW5kX3Jvd3Mobm9ua2luYXNlTEdBVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlX3ByaW1lX2tpbmFzZV9pbmZyYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdmVfcHJpbWVfZG9tYWluX2ludGFjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXZlX3ByaW1lX2tpbmFzZV9rZWVwKSAlPiUKICBzZWxlY3QoU2FtcGxlLCBGdXNpb25OYW1lKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKIyMjIyBXcml0ZSBMR0FUIGZ1c2lvbnMgdG8gZmlsZQoKYGBge3J9CnN1YnNldEZ1c2VMR0FUIDwtIHN1YnNldEZ1c2VMR0FUICU+JQogIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pCgojIFdoaWNoIGZ1c2lvbnMgb2YgaW50ZXJlc3QgYXJlIG5vdCBwcmVzZW50IGluIGFueSBzYW1wbGVzPwptaXNzaW5nTGdhdEZ1c2lvbiA8LSBzZXRkaWZmKGxnYXRGdXNlcywgY29sbmFtZXMoc3Vic2V0RnVzZUxHQVQpWy0xXSkKIyBGb3IgdGhlIGZ1c2lvbnMgdGhhdCBhcmUgbm90IHByZXNlbnQsIGZpbGwgdGhvc2UgY29sdW1ucyB3aXRoIDAKc3Vic2V0RnVzZUxHQVRbLCBtaXNzaW5nTGdhdEZ1c2lvbl0gPC0gMAoKc3Vic2V0RnVzZUxHQVQgJT4lCiAgd3JpdGVfdHN2KGxnYXRGaWxlKQpgYGAKCiMjIFNlc3Npb24gSW5mbwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCg==