Warning message:
In system("timedatectl", intern = TRUE) :
  running command 'timedatectl' had status 1

Total dataset

1. Preprocessing

Load & reformat data

[1]  23337 116707

Calculate QC Metrics

 [1] "ENSMUSG00000064341.mt-Nd1"  "ENSMUSG00000064345.mt-Nd2"  "ENSMUSG00000064351.mt-Co1"  "ENSMUSG00000064354.mt-Co2"  "ENSMUSG00000064356.mt-Atp8"
 [6] "ENSMUSG00000064357.mt-Atp6" "ENSMUSG00000064358.mt-Co3"  "ENSMUSG00000064360.mt-Nd3"  "ENSMUSG00000065947.mt-Nd4l" "ENSMUSG00000064363.mt-Nd4" 
[11] "ENSMUSG00000064367.mt-Nd5"  "ENSMUSG00000064368.mt-Nd6"  "ENSMUSG00000064370.mt-Cytb"

Filtering

                        sum_drop detected_drop subsets_Mt_percent_drop
sum_drop                     288           102                      64
detected_drop                102          1115                     976
subsets_Mt_percent_drop       64           976                   11665
`aes_string()` was deprecated in ggplot2 3.0.0.

           GSM4475127_Female_saline_1 GSM4475128_Male_saline_1 GSM4475129_Female_saline_2 GSM4475130_Male_saline_2 GSM4475131_Female_saline_3
unfiltered                       4604                     5724                       5696                     3271                       7242
filtered                         4604                     5724                       5696                     3271                       7242
%                                 100                      100                        100                      100                        100
           GSM4475132_Male_saline_3 GSM4475133_Female_LPS_1 GSM4475134_Male_LPS_1 GSM4475135_Female_LPS_2 GSM4475136_Male_LPS_2 GSM4475137_Female_LPS_3
unfiltered                     5178%#24.0-1e                  7983                    6208%#22.0-1e                    9305
filtered                       5178%#24.0-1e                  7983                    6208%#22.0-1e                    9305
%                               100%#24.0-1e                   100                     100%#22.0-1e                     100
           GSM4475138_Male_LPS_3
unfiltered%#22.0-1e
filtered  %#22.0-1e
%         %#22.0-1e
[1] 12499 91104
[1] 12499 91104

2. Total cells unsupervized clustering

Load data

Error in file.path(dir.objects, "SCE_preprocessing.rds") : 
  object 'dir.objects' not found

Integration

'as(<dgCMatrix>, "dgTMatrix")' is deprecated.
Use 'as(., "TsparseMatrix")' instead.
See help("Deprecated") and help("Matrix-deprecated").
UNRELIABLE VALUE: One of the ‘future.apply’ iterations (‘future_lapply-1’) unexpectedly generated random numbers without declaring so. There is a risk that those random numbers are not statistically sound and the overall results might be invalid. To fix this, specify 'future.seed=TRUE'. This ensures that proper, parallel-safe random numbers are produced via the L'Ecuyer-CMRG method. To disable this check, use 'future.seed = NULL', or set option 'future.rng.onMisuse' to "ignore".

3. Cluster annotation

Nb. of clusters by resolution

integrated_snn_res.0.1 integrated_snn_res.0.4 integrated_snn_res.0.6   integrated_snn_res.1 
                    10                     18                     23                     31 

Known marker genes

Astrocyte subset

1. Clustering

Filter and process


      Astrocytes          Neurons      Endothelial        Microglia Oligodendrocytes 
           75456             3600             1274              815             1595 
       Pericytes     Erythrocytes           Remove 
             478               29             7878 

Find cluster markers using FindAllMarkers

At res = 0.2 (10 clusters)

sparse->dense coercion: allocating vector of size 1.1 GiBsparse->dense coercion: allocating vector of size 1.1 GiBsparse->dense coercion: allocating vector of size 1.1 GiBsparse->dense coercion: allocating vector of size 1.1 GiBsparse->dense coercion: allocating vector of size 1.1 GiBsparse->dense coercion: allocating vector of size 1.2 GiBsparse->dense coercion: allocating vector of size 1.2 GiBsparse->dense coercion: allocating vector of size 1.2 GiB

Subset of genes used for plotting

Visium dataset connection

Load data

 [1] "GSM5026144_S7_barcodes.tsv.gz"               "GSM5026144_S7_features.tsv.gz"               "GSM5026144_S7_filtered_feature_bc_matrix.h5"
 [4] "GSM5026144_S7_matrix.mtx.gz"                 "GSM5026144_S7_module_scores.csv"             "GSM5026144_S7_tissue_hires_image.png.gz"    
 [7] "GSM5026145_S3_barcodes.tsv.gz"               "GSM5026145_S3_features.tsv.gz"               "GSM5026145_S3_filtered_feature_bc_matrix.h5"
[10] "GSM5026145_S3_matrix.mtx.gz"                 "GSM5026145_S3_module_scores.csv"             "GSM5026145_S3_tissue_hires_image.png.gz"    
[13] "GSM5026146_S4_barcodes.tsv.gz"               "GSM5026146_S4_features.tsv.gz"               "GSM5026146_S4_filtered_feature_bc_matrix.h5"
[16] "GSM5026146_S4_matrix.mtx.gz"                 "GSM5026146_S4_module_scores.csv"             "GSM5026146_S4_tissue_hires_image.png.gz"    
[19] "GSM5026147_S1_barcodes.tsv.gz"               "GSM5026147_S1_features.tsv.gz"               "GSM5026147_S1_filtered_feature_bc_matrix.h5"
[22] "GSM5026147_S1_matrix.mtx.gz"                 "GSM5026147_S1_module_scores.csv"             "GSM5026147_S1_tissue_hires_image.png.gz"    
[25] "GSM5026148_S2_barcodes.tsv.gz"               "GSM5026148_S2_features.tsv.gz"               "GSM5026148_S2_filtered_feature_bc_matrix.h5"
[28] "GSM5026148_S2_matrix.mtx.gz"                 "GSM5026148_S2_module_scores.csv"             "GSM5026148_S2_tissue_hires_image.png.gz"    
[31] "GSM5026149_S6_barcodes.tsv.gz"               "GSM5026149_S6_features.tsv.gz"               "GSM5026149_S6_filtered_feature_bc_matrix.h5"
[34] "GSM5026149_S6_matrix.mtx.gz"                 "GSM5026149_S6_module_scores.csv"             "GSM5026149_S6_tissue_hires_image.png.gz"    
[1] "GSM5026144_S7"
[1] "GSM5026145_S3"
[1] "GSM5026146_S4"
[1] "GSM5026147_S1"
[1] "GSM5026148_S2"
[1] "GSM5026149_S6"
LS0tCnRpdGxlOiAiTW91c2UgYnJhaW4gU0MgZGF0YSBwcm9jZXNzaW5nIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgdG9jX2NvbGxhcHNlZDogZmFsc2UKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgaGlnaGxpZ2h0OiBrYXRlCi0tLQoKYGBge3Igc2V0dXB9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KERyb3BsZXRVdGlscykKbGlicmFyeShMU0QpCmxpYnJhcnkoTWF0cml4KQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShzY2F0ZXIpCmxpYnJhcnkoc2NkcykKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeShzY3JhbikKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkobXVzY2F0KQpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KFVwU2V0UikKCndkIDwtICIvaG9tZS9yc3R1ZGlvL2RhdGEiCmRpci5pbnB1dHMgPC0gZmlsZS5wYXRoKHdkLCAic2Mtcm5hc2VxL0NlbGxSYW5nZXJfb3V0cHV0cy9vdXRzLWNlbGxyYW5nZXIiKQpkaXIub2JqZWN0cyA8LSBmaWxlLnBhdGgod2QsICJzYy1ybmFzZXEvb2JqZWN0cyIpCmRpci5jcmVhdGUoZGlyLm9iamVjdHMsIHJlY3Vyc2l2ZSA9IFQsIHNob3dXYXJuaW5ncyA9IEYpCgojIGluY3JlYXNlIGZ1dHVyZSdzIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIG9iamVjdHMKIyB0byBiZSBleHBvcnRlZCBmcm9tIGRlZmF1bHQgb2YgNTAwIE1CIHRvIDE2IEdCCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDggKiAyMDQ4ICogMTAyNCBeIDIpCmBgYAoKIyBUb3RhbCBkYXRhc2V0CgojIyAxLiBQcmVwcm9jZXNzaW5nCgojIyMgTG9hZCAmIHJlZm9ybWF0IGRhdGEKCmBgYHtyfQpzYW1wbGVzLmRmIDwtIGRhdGEuZnJhbWUoCiAgc2FtcGxlLm5hbWUgPSBsaXN0LmZpbGVzKGRpci5pbnB1dHMpLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopICU+JSAKICBtdXRhdGUoCiAgICBzYW1wbGUubmFtZSA9IHN0cl9yZW1vdmUoc2FtcGxlLm5hbWUsICJfKGZlYXR1cmVzfGJhcmNvZGVzfG1hdHJpeCkuK2d6JCIpCiAgKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKAogICAgYWNjZXNzaW9uID0gd29yZChzYW1wbGUubmFtZSwgMSwgc2VwID0gIl8iKSwKICAgIHNleCA9IHdvcmQoc2FtcGxlLm5hbWUsIDIsIHNlcCA9ICJfIiksCiAgICB0cmVhdG1lbnQgPSB3b3JkKHNhbXBsZS5uYW1lLCAzLCBzZXAgPSAiXyIpLAogICAgcmVwbGljYXRlID0gd29yZChzYW1wbGUubmFtZSwgNCwgc2VwID0gIl8iKQogICkgJT4lIAogIG11dGF0ZSgKICAgIHNleCA9IGZhY3RvcihzZXgsIGxldmVscyA9IGMoIk1hbGUiLCAiRmVtYWxlIikpLAogICAgdHJlYXRtZW50ID0gZmFjdG9yKHRyZWF0bWVudCwgbGV2ZWxzID0gYygic2FsaW5lIiwgIkxQUyIpKQogICkKc2FtcGxlcy5kZgpgYGAKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0V9CiMgbG9hZCByYXcgY291bnRzCm1hdHJpeF9kaXJzIDwtIGxpc3QuZGlycyhkaXIuaW5wdXRzLCByZWN1cnNpdmUgPSBGQUxTRSwgZnVsbC5uYW1lcyA9IFRSVUUpCm5hbWVzKG1hdHJpeF9kaXJzKSA8LSBiYXNlbmFtZShtYXRyaXhfZGlycykKc2NlIDwtIHJlYWQxMHhDb3VudHMobWF0cml4X2RpcnMpCgojIHJlbmFtZSByb3cvY29sRGF0YSBjb2xuYW1lcyAmIFNDRSBkaW1uYW1lcwpuYW1lcyhyb3dEYXRhKHNjZSkpIDwtIGMoIkVOU0VNQkwiLCAiU1lNQk9MIiwgIlR5cGUiKQpuYW1lcyhjb2xEYXRhKHNjZSkpIDwtIGMoInNhbXBsZV9pZCIsICJiYXJjb2RlIikKc2NlJHNhbXBsZV9pZCA8LSBmYWN0b3IoYmFzZW5hbWUoc2NlJHNhbXBsZV9pZCksIGxldmVscyA9IHNhbXBsZXMuZGYkc2FtcGxlLm5hbWUpCmRpbW5hbWVzKHNjZSkgPC0gbGlzdCgKICAgIHdpdGgocm93RGF0YShzY2UpLCBwYXN0ZShFTlNFTUJMLCBTWU1CT0wsIHNlcCA9ICIuIikpLAogICAgd2l0aChjb2xEYXRhKHNjZSksIHBhc3RlKGJhcmNvZGUsIHNhbXBsZV9pZCwgc2VwID0gIi4iKSkpCgojIGxvYWQgbWV0YWRhdGEKbSA8LSBtYXRjaChzY2Ukc2FtcGxlX2lkLCBzYW1wbGVzLmRmJHNhbXBsZS5uYW1lKQpzY2Ukc2V4IDwtIHNhbXBsZXMuZGYkc2V4W21dCnNjZSR0cmVhdG1lbnQgPC0gc2FtcGxlcy5kZiR0cmVhdG1lbnRbbV0Kc2NlJHJlcGxpY2F0ZSA8LSBzYW1wbGVzLmRmJHJlcGxpY2F0ZVttXQoKIyByZW1vdmUgdW5kZXRlY3RlZCBnZW5lcwpzY2UgPC0gc2NlW3Jvd1N1bXMoY291bnRzKHNjZSkgPiAwKSA+IDAsIF0KZGltKHNjZSkKYGBgCgojIyMgRG91YmxldCByZW1vdmFsCgpgYGB7ciBkb3VibGV0LXJlbW92YWwsIHJlc3VsdHMgPSAiaGlkZSJ9CiMgc3BsaXQgU0NFIGJ5IHNhbXBsZQpjc19ieV9zIDwtIHNwbGl0KGNvbG5hbWVzKHNjZSksIHNjZSRzYW1wbGVfaWQpCnNjZV9ieV9zIDwtIGxhcHBseShjc19ieV9zLCBmdW5jdGlvbihjcykgc2NlWywgY3NdKQoKIyBydW4gJ3NjZHMnCnNjZV9ieV9zIDwtIGxhcHBseShzY2VfYnlfcywgZnVuY3Rpb24odSkgCiAgICBjeGRzX2JjZHNfaHlicmlkKGJjZHMoY3hkcyh1KSkpKQoKIyByZW1vdmUgZG91YmxldHMKc2NlX2J5X3MgPC0gbGFwcGx5KHNjZV9ieV9zLCBmdW5jdGlvbih1KSB7CiAgICAjIGNvbXB1dGUgZXhwZWN0ZWQgbmIuIG9mIGRvdWJsZXRzICgxMHgpCiAgICBuX2RibCA8LSBjZWlsaW5nKDAuMDEgKiBuY29sKHUpXjIgLyAxZTMpCiAgICAjIHJlbW92ZSAnbl9kYmwnIGNlbGxzIHcvIGhpZ2hlc3QgZG91YmxldCBzY29yZQogICAgbyA8LSBvcmRlcih1JGh5YnJpZF9zY29yZSwgZGVjcmVhc2luZyA9IFRSVUUpCiAgICB1WywgLW9bc2VxX2xlbihuX2RibCldXQp9KQoKIyBtZXJnZSBiYWNrIGludG8gc2luZ2xlIFNDRQpzY2UgPC0gZG8uY2FsbCgiY2JpbmQiLCBzY2VfYnlfcykKYGBgCgojIyMgQ2FsY3VsYXRlIFFDIE1ldHJpY3MKCmBgYHtyfQoobWl0byA8LSBncmVwKCJtdC0iLCByb3duYW1lcyhzY2UpLCB2YWx1ZSA9IFRSVUUpKQpzY2UgPC0gYWRkUGVyQ2VsbFFDKHNjZSwgc3Vic2V0cyA9IGxpc3QoTXQgPSBtaXRvKSkKcGxvdEhpZ2hlc3RFeHBycyhzY2UsIG4gPSAyMCkKYGBgCgojIyMgRmlsdGVyaW5nCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEyfQojIGdldCBzYW1wbGUtc3BlY2lmaWMgb3V0bGllcnMKY29scyA8LSBjKCJzdW0iLCAiZGV0ZWN0ZWQiLCAic3Vic2V0c19NdF9wZXJjZW50IikKbG9nIDwtIGMoVFJVRSwgVFJVRSwgRkFMU0UpCnR5cGUgPC0gYygiYm90aCIsICJib3RoIiwgImhpZ2hlciIpCgpkcm9wX2NvbHMgPC0gcGFzdGUwKGNvbHMsICJfZHJvcCIpCmZvciAoaSBpbiBzZXFfYWxvbmcoY29scykpCiAgY29sRGF0YShzY2UpW1tkcm9wX2NvbHNbaV1dXSA8LSBpc091dGxpZXIoCiAgICBzY2VbW2NvbHNbaV1dXSwKICAgIG5tYWRzID0gMi41LAogICAgdHlwZSA9IHR5cGVbaV0sCiAgICBsb2cgPSBsb2dbaV0sCiAgICBiYXRjaCA9IHNjZSRzYW1wbGVfaWQKICApCgpzYXBwbHkoZHJvcF9jb2xzLCBmdW5jdGlvbihpKQogIHNhcHBseShkcm9wX2NvbHMsIGZ1bmN0aW9uKGopCiAgICBzdW0oc2NlW1tpXV0gJiBzY2VbW2pdXSkpKQoKY2QgPC0gZGF0YS5mcmFtZShjb2xEYXRhKHNjZSkpCnBzIDwtIGxhcHBseShzZXFfYWxvbmcoY29scyksIGZ1bmN0aW9uIChpKSB7CiAgcCA8LSBnZ3Bsb3QoY2QsIGFlc19zdHJpbmcoeCA9IGNvbHNbaV0sIGFscGhhID0gZHJvcF9jb2xzW2ldKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIkZBTFNFIiA9IDEsICJUUlVFIiA9IDAuNCkpICsKICAgIGZhY2V0X3dyYXAofiBzYW1wbGVfaWQsIG5jb2wgPSAxLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpCiAgaWYgKGxvZ1tpXSkKICAgIHAgPC0gcCArIHNjYWxlX3hfbG9nMTAoKQogIHJldHVybihwKQp9KQpwbG90X2dyaWQocGxvdGxpc3QgPSBwcywgbmNvbCA9IDMpCmBgYAoKYGBge3IgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA1fQpsYXlvdXQobWF0cml4KDE6MiwgbnJvdyA9IDEpKQpvbCA8LSByb3dTdW1zKGFzLm1hdHJpeChjb2xEYXRhKHNjZSlbZHJvcF9jb2xzXSkpICE9IDAKeCA8LSBzY2Ukc3VtCnkgPC0gc2NlJGRldGVjdGVkCmhlYXRzY2F0dGVyKHgsIHksIGxvZz0ieHkiLCBtYWluID0gInVuZmlsdGVyZWQiLCAKICAgIHhsYWIgPSAiVG90YWwgY291bnRzIiwgeWxhYiA9ICJOb24temVybyBmZWF0dXJlcyIpCmhlYXRzY2F0dGVyKHhbIW9sXSwgeVshb2xdLCBsb2c9Inh5IiwgbWFpbiA9ICJmaWx0ZXJlZCIsIAogICAgeGxhYiA9ICJUb3RhbCBjb3VudHMiLCB5bGFiID0gIk5vbi16ZXJvIGZlYXR1cmVzIikKYGBgCgoKYGBge3IgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA1fQojIHN1bW1hcnkgb2YgY2VsbHMga2VwdApucyA8LSB0YWJsZShzY2Ukc2FtcGxlX2lkKQpuc19maWwgPC0gdGFibGUoc2NlJHNhbXBsZV9pZFshb2xdKQpwcmludChyYmluZCgKICAgIHVuZmlsdGVyZWQgPSBucywgZmlsdGVyZWQgPSBuc19maWwsIAogICAgIiUiID0gbnNfZmlsIC8gbnMgKiAxMDApLCBkaWdpdHMgPSAwKQpgYGAKCgpgYGB7ciBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDV9CiMgZHJvcCBvdXRsaWVyIGNlbGxzCnNjZSA8LSBzY2VbLCAhb2xdCmRpbShzY2UpCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNX0KIyByZXF1aXJlIGNvdW50ID4gMSBpbiBhdCBsZWFzdCAyMCBjZWxscwpzY2UgPC0gc2NlW3Jvd1N1bXMoY291bnRzKHNjZSkgPiAxKSA+PSAyMCwgXQpkaW0oc2NlKQpgYGAKCiMjIyBTYXZlIFNDRQoKYGBge3J9CnNhdmVSRFMoc2NlLCBmaWxlLnBhdGgoZGlyLm9iamVjdHMsICJTQ0VfcHJlcHJvY2Vzc2luZy5yZHMiKSkKYGBgCgotLS1DaGVja3BvaW50LS0tCgojIyAyLiBUb3RhbCBjZWxscyB1bnN1cGVydml6ZWQgY2x1c3RlcmluZwoKIyMjIExvYWQgZGF0YQoKYGBge3J9CnNjZSA8LSByZWFkUkRTKGZpbGUucGF0aChkaXIub2JqZWN0cywgIlNDRV9wcmVwcm9jZXNzaW5nLnJkcyIpKQpgYGAKCiMjIyBVTUkgZmlsdGVyCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MTB9CnBsb3RDb2xEYXRhKHNjZSwgeCA9ICJzYW1wbGVfaWQiLCB5ID0gImRldGVjdGVkIiwgY29sb3VyX2J5ID0gInN1bSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA3MDAsIGNvbG9yID0gInJlZCIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMgSW50ZWdyYXRpb24KCmBgYHtyIGludGVncmF0aW9ufQojIGNyZWF0ZSBTZXVyYXRPYmplY3QKc28gPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KAogICAgY291bnRzID0gY291bnRzKHNjZSksCiAgICBtZXRhLmRhdGEgPSBkYXRhLmZyYW1lKGNvbERhdGEoc2NlKSksCiAgICBwcm9qZWN0ID0gIkxQUyIpCiMgc3Vic2V0IGJ5IFVNSSBjb3VudApzby5VTUk3MDAgPC0gc3Vic2V0KHNvLCBzdWJzZXQgPSBuQ291bnRfUk5BID4gNzAwKQoKIyBzcGxpdCBieSBzYW1wbGUKY2VsbHNfYnlfc2FtcGxlIDwtIHNwbGl0KGNvbG5hbWVzKHNjZSksIHNjZSRzYW1wbGVfaWQpCnNvLlVNSTcwMCA8LSBsYXBwbHkoY2VsbHNfYnlfc2FtcGxlLCBmdW5jdGlvbihpKSBzdWJzZXQoc28uVU1JNzAwLCBjZWxscyA9IGkpKQoKIyBub3JtYWxpemUsIGZpbmQgdmFyaWFibGUgZ2VuZXMsIGFuZCBzY2FsZQpzby5VTUk3MDAgPC0gbGFwcGx5KHNvLlVNSTcwMCwgTm9ybWFsaXplRGF0YSwgdmVyYm9zZSA9IEZBTFNFKQpzby5VTUk3MDAgPC0gbGFwcGx5KHNvLlVNSTcwMCwgRmluZFZhcmlhYmxlRmVhdHVyZXMsIG5mZWF0dXJlcyA9IDJlMywgCiAgICBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIHZlcmJvc2UgPSBGQUxTRSkKc28uVU1JNzAwIDwtIGxhcHBseShzby5VTUk3MDAsIFNjYWxlRGF0YSwgdmVyYm9zZSA9IEZBTFNFKQoKIyBmaW5kIGFuY2hvcnMgJiBpbnRlZ3JhdGUKYXMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhzby5VTUk3MDAsIHZlcmJvc2UgPSBGQUxTRSkKc28uVU1JNzAwIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gYXMsIGRpbXMgPSBzZXFfbGVuKDMwKSwgdmVyYm9zZSA9IEZBTFNFKQoKIyBzY2FsZSBpbnRlZ3JhdGVkIGRhdGEKRGVmYXVsdEFzc2F5KHNvLlVNSTcwMCkgPC0gImludGVncmF0ZWQiCnNvLlVNSTcwMCA8LSBTY2FsZURhdGEoc28uVU1JNzAwLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIERpbWVuc2lvbiByZWR1Y3Rpb24KCmBgYHtyIGRpbXJlZCwgd2FybmluZyA9IEZBTFNFfQpzby5VTUk3MDAgPC0gUnVuUENBKHNvLlVNSTcwMCwgbnBjcyA9IDMwLCB2ZXJib3NlID0gRkFMU0UpCgpzby5VTUk3MDAgPC0gUnVuVFNORShzby5VTUk3MDAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gc2VxX2xlbigyMCksCiAgICBzZWVkLnVzZSA9IDEsIGRvLmZhc3QgPSBUUlVFLCB2ZXJib3NlID0gRkFMU0UpCgpzby5VTUk3MDAgPC0gUnVuVU1BUChzby5VTUk3MDAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gc2VxX2xlbigyMCksCiAgICBzZWVkLnVzZSA9IDEsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMgQ2x1c3RlcmluZwoKYGBge3IgY2x1c3RlcmluZ30Kc28uVU1JNzAwIDwtIEZpbmROZWlnaGJvcnMoc28uVU1JNzAwLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IHNlcV9sZW4oMjApLCB2ZXJib3NlID0gRkFMU0UpCmZvciAocmVzIGluIGMoMC4xLCAwLjQsIDAuNiwgMSkpCiAgc28uVU1JNzAwIDwtIEZpbmRDbHVzdGVycyhzby5VTUk3MDAsIHJlc29sdXRpb24gPSByZXMsIHJhbmRvbS5zZWVkID0gMSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CnNubi5jb2xuYW1lcyA8LQogIGNvbG5hbWVzKHNvLlVNSTcwMEBtZXRhLmRhdGEpICU+JSBzdHJfc3Vic2V0KCJpbnRlZ3JhdGVkX3Nubl9yZXMiKQoKdGhtIDwtIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKcHMgPC0gbGFwcGx5KHNubi5jb2xuYW1lcywgZnVuY3Rpb24odSkgewogIHAxIDwtIERpbVBsb3Qoc28uVU1JNzAwLCByZWR1Y3Rpb24gPSAidHNuZSIsIGdyb3VwLmJ5ID0gdSkgKyB0aG0gKwogICAgbGFicyh0aXRsZSA9IHUpCiAgcGxvdF9ncmlkKHAxKQp9KQpwbG90X2dyaWQocGxvdGxpc3QgPSBwcykKYGBgCgpgYGB7cn0Kc28uVU1JNzAwJGdyb3VwX2lkIDwtIHBhc3RlKHNvLlVNSTcwMCRzZXgsIHNvLlVNSTcwMCR0cmVhdG1lbnQsIHNlcCA9ICJfIikKc28uVU1JNzAwIDwtIFNldElkZW50KHNvLlVNSTcwMCwgdmFsdWUgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuNiIpCmBgYAoKIyMjIERSIHBsb3RzCgpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDE0fQp0aG0gPC0gdGhlbWUoYXNwZWN0LnJhdGlvID0gMSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpwcyA8LSBsYXBwbHkoYygic2FtcGxlX2lkIiwgImdyb3VwX2lkIiwgImlkZW50IiksIGZ1bmN0aW9uKHUpIHsKICAgIHAxIDwtIERpbVBsb3Qoc28uVU1JNzAwLCByZWR1Y3Rpb24gPSAidHNuZSIsIGdyb3VwLmJ5ID0gdSkgKyB0aG0KICAgIHAyIDwtIERpbVBsb3Qoc28uVU1JNzAwLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gdSkKICAgIGxnZCA8LSBnZXRfbGVnZW5kKHAyKQogICAgcDIgPC0gcDIgKyB0aG0KICAgIGxpc3QocDEsIHAyLCBsZ2QpCiAgICBwbG90X2dyaWQocDEsIHAyLCBsZ2QsIG5yb3cgPSAxLAogICAgICAgIHJlbF93aWR0aHMgPSBjKDEsIDEsIDAuNSkpCn0pCnBsb3RfZ3JpZChwbG90bGlzdCA9IHBzLCBuY29sID0gMSkKYGBgCgojIyMgU2F2ZSBTZXVyYXRPYmplY3QKCmBgYHtyfQpzYXZlUkRTKHNvLlVNSTcwMCwgZmlsZS5wYXRoKGRpci5vYmplY3RzLCAiU09fY2x1c3RlcmluZy5yZHMiKSkKYGBgCgotLS1DaGVja3BvaW50LS0tCgojIyAzLiBDbHVzdGVyIGFubm90YXRpb24KCiMjIyBMb2FkIGRhdGEgJiBjb252ZXJ0IHRvIFNDRQoKYGBge3J9CnNvIDwtIHJlYWRSRFMoZmlsZS5wYXRoKGRpci5vYmplY3RzLCAiU09fY2x1c3RlcmluZy5yZHMiKSkKc2NlIDwtIGFzLlNpbmdsZUNlbGxFeHBlcmltZW50KHNvLCBhc3NheSA9ICJSTkEiKQpjb2xEYXRhKHNjZSkgPC0gYXMuZGF0YS5mcmFtZShjb2xEYXRhKHNjZSkpICU+JQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikgJT4lCiAgRGF0YUZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHNjZSkpCmBgYAoKIyMjIE5iLiBvZiBjbHVzdGVycyBieSByZXNvbHV0aW9uCgpgYGB7cn0KY2x1c3Rlcl9jb2xzIDwtIGdyZXAoInJlcy5bMC05XSIsIGNvbG5hbWVzKGNvbERhdGEoc2NlKSksIHZhbHVlID0gVFJVRSkKc2FwcGx5KGNvbERhdGEoc2NlKVtjbHVzdGVyX2NvbHNdLCBubGV2ZWxzKQpgYGAKCiMjIyBDbHVzdGVyLXNhbXBsZSBjb3VudHMKCmBgYHtyfQojIFJlLWxldmVsaW5nCnNjZSRncm91cF9pZCA8LSBmYWN0b3Ioc2NlJGdyb3VwX2lkLCAKICBsZXZlbHMgPSBjKCJGZW1hbGVfc2FsaW5lIiwgIk1hbGVfc2FsaW5lIiwgIkZlbWFsZV9MUFMiLCAiTWFsZV9MUFMiKSkKCiMgc2V0IGNsdXN0ZXIgSURzIHRvIHNlbGVjdGVkIHJlc29sdXRpb24gY2x1c3RlcmluZwpjdXJyZW50X3Nubl9yZXMgPC0gImludGVncmF0ZWRfc25uX3Jlcy4xIgpzbyA8LSBTZXRJZGVudChzbywgdmFsdWUgPSBjdXJyZW50X3Nubl9yZXMpCgpyZW9yZGVyZWRfY2x1c3RlcnNfbGV2ZWxzIDwtIGxldmVscyhJZGVudHMoc28pKSAlPiUgCiAgbGVuZ3RoKCkgJT4lIHNlcSgwLCAuKQpJZGVudHMoc28pIDwtIGZhY3RvcihJZGVudHMoc28pLCBsZXZlbHMgPSByZW9yZGVyZWRfY2x1c3RlcnNfbGV2ZWxzKQoKc29AbWV0YS5kYXRhJGNsdXN0ZXJfaWQgPC0gSWRlbnRzKHNvKQpzY2UkY2x1c3Rlcl9pZCA8LSBJZGVudHMoc28pCmxldmVscyhzY2UkY2x1c3Rlcl9pZCkKYGBgCgojIyMgUmVsYXRpdmUgY2x1c3Rlci1hYnVuZGFuY2VzCgpgYGB7ciBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30Kbl9jZWxscyA8LSB0YWJsZShzY2UkY2x1c3Rlcl9pZCwgc2NlJHNhbXBsZV9pZCkKZnFzIDwtIHByb3AudGFibGUobl9jZWxscywgbWFyZ2luID0gMikKbWF0IDwtIGFzLm1hdHJpeCh1bmNsYXNzKGZxcykpCgptYXQgPC0gYXMubWF0cml4KHVuY2xhc3Mobl9jZWxscykpCkhlYXRtYXAobWF0LAogICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsICJSZEd5IilbLTZdKSwKICAgIGNvbHVtbl90aXRsZSA9IGN1cnJlbnRfc25uX3JlcywgCiAgICBuYW1lID0gIk4gY2VsbHMiLAogICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgIHJvd19uYW1lc19zaWRlID0gImxlZnQiLAogICAgcm93X3RpdGxlID0gImNsdXN0ZXJfaWQiLAogICAgcmVjdF9ncCA9IGdwYXIoY29sID0gIndoaXRlIiksCiAgICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGksIGosIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpCiAgICAgICAgZ3JpZC50ZXh0KG1hdFtqLCBpXSwgeCA9IHgsIHkgPSB5LCAKICAgICAgICAgICAgZ3AgPSBncGFyKGNvbCA9ICJ3aGl0ZSIsIGZvbnRzaXplID0gOCkpKQpgYGAKCiMjIyBLbm93biBtYXJrZXIgZ2VuZXMKCmBgYHtyIGtub3duLW1hcmtlcnN9CmZzIDwtIGxpc3QoCiAgQXN0cm9jeXRlcyA9IGMoCiAgICAiQXFwNCIsCiAgICAiQWxkb2MiLAogICAgIkdmYXAiLAogICAgIkNsdSIsCiAgICAiQXBvZSIsCiAgICAiSGVzNSIsCiAgICAiRGlvMiIsCiAgICAiQWd0IiwKICAgICJTcGFyY2wxIiwKICAgICJHbHVsIiwKICAgICJJdGloMyIKICApLAogIAogIE5ldXJvbnMgPSBjKAogICAgIlJ0bjEiLAogICAgIlN5dDEiLAogICAgIkNhbG0yIiwKICAgICJDYW1rMmIiLAogICAgIkNoZ2IiLAogICAgIkNhbWsyYSIsCiAgICAiTWVnMyIsCiAgICAiU25oZzExIiwKICAgICJTbGMxN2E3IiwKICAgICJHcmluMmIiLAogICAgIkdyaW4yYSIKICApLAogIAogIEVuZG90aGVsaWFsID0gYygKICAgICJDbGRuNSIsCiAgICAiSXRtMmEiLAogICAgIkx5NmMxIiwKICAgICJCc2ciLAogICAgIkZsdDEiLAogICAgIlBsdHAiLAogICAgIktsZjIiLAogICAgIlNsY28xYTQiCiAgKSwKICAKICBNaWNyb2dsaWEgPSBjKAogICAgIkMxcWEiLAogICAgIkMxcWIiLAogICAgIkN0c3MiLAogICAgIkhleGIiLAogICAgIlAycnkxMiIsCiAgICAiVHlyb2JwIiwKICAgICJUcmVtMiIsCiAgICAiQzFxYyIKICApLAogIAogIE9saWdvZGVuZHJvY3l0ZXMgPSBjKAogICAgIk1icCIsCiAgICAiTW9icCIsCiAgICAiUGxwMSIsCiAgICAiS2lmNWEiLAogICAgIlBsZWtoYjEiLAogICAgIlN0bW4xIiwKICAgICJRZHByIiwKICAgICJQZGdmcmEiLAogICAgIlBsbHAiLAogICAgIk9saWcxIiwKICAgICJHamMzIiwKICAgICJOZXU0IgogICksCiAgUGVyaWN5dGVzID0gYygiVnRuIiwKICAgICAgICAgICAgICAgICJJZ2ZicDciLAogICAgICAgICAgICAgICAgIkNhbGQxIiwKICAgICAgICAgICAgICAgICJOZHVmYTRsMiIsCiAgICAgICAgICAgICAgICAiSGlnZDFiIiwKICAgICAgICAgICAgICAgICJNeWw5IiwKICAgICAgICAgICAgICAgICJHbmcxMSIpLAogIEVyeXRocm9jeXRlcyA9IGMoIkFsYXMyIiwKICAgICAgICAgICAgICAgICAgIkhiYS1hMiIsCiAgICAgICAgICAgICAgICAgICJIYmItYnQiLAogICAgICAgICAgICAgICAgICAiSGJhLWExIiwKICAgICAgICAgICAgICAgICAgIkhiYi1icyIpCikKCmZzIDwtIGxhcHBseShmcywgc2FwcGx5LCBmdW5jdGlvbihnKQogIGdyZXAocGFzdGUwKGcsICIkIiksIHJvd25hbWVzKHNjZSksIHZhbHVlID0gVFJVRSkpCgpncyA8LSBnc3ViKCIuKlxcLiIsICIiLCB1bmxpc3QoZnMpKQpucyA8LSB2YXBwbHkoZnMsIGxlbmd0aCwgbnVtZXJpYygxKSkKa3MgPC0gcmVwLmludChuYW1lcyhmcyksIG5zKQpsYWJzIDwtIHNwcmludGYoIiVzKCVzKSIsIGdzLCBrcykKYGBgCgojIyMjIEhlYXRtYXAgb2YgbWVhbiBtYXJrZXItZXhwcnMuIGJ5IGNsdXN0ZXIKCmBgYHtyIGtub3duLW1hcmtlcnMtaGVhdG1hcCwgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodCA9IDE1fQojIHNwbGl0IGNlbGxzIGJ5IGNsdXN0ZXIKY3NfYnlfayA8LSBzcGxpdChjb2xuYW1lcyhzY2UpLCBzY2UkY2x1c3Rlcl9pZCkKCiMgY29tcHV0ZSBjbHVzdGVyLW1hcmtlciBtZWFucwptc19ieV9jbHVzdGVyIDwtIGxhcHBseShmcywgZnVuY3Rpb24oZ3MpCiAgdmFwcGx5KGNzX2J5X2ssIGZ1bmN0aW9uKGkpCiAgICBNYXRyaXg6OnJvd01lYW5zKGxvZ2NvdW50cyhzY2UpW2dzLCBpLCBkcm9wID0gRkFMU0VdKSwKICAgIG51bWVyaWMobGVuZ3RoKGdzKSkpKQoKIyBwcmVwLiBmb3IgcGxvdHRpbmcgJiBzY2FsZSBiL3cgMCBhbmQgMQptYXQgPC0gZG8uY2FsbCgicmJpbmQiLCBtc19ieV9jbHVzdGVyKQptYXQgPC0gbXVzY2F0Ojo6LnNjYWxlKG1hdCkKcm93bmFtZXMobWF0KSA8LSB3b3JkKHJvd25hbWVzKG1hdCksIDIsIHNlcCA9ICJcXC4iKQoKY29scyA8LSBtdXNjYXQ6OjouY2x1c3Rlcl9jb2xvcnNbc2VxX2Fsb25nKGZzKV0KY29scyA8LSBzZXROYW1lcyhjb2xzLCBuYW1lcyhmcykpCgpyb3dfYW5ubyA8LSByb3dBbm5vdGF0aW9uKGRmID0gZGF0YS5mcmFtZShsYWJlbCA9IGZhY3RvcihrcywgbGV2ZWxzID0gbmFtZXMoZnMpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbGlzdChsYWJlbCA9IGNvbHMpLCBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFKQoKSGVhdG1hcCgKICBtYXQsCiAgY29sdW1uX3RpdGxlID0gY3VycmVudF9zbm5fcmVzLAogIG5hbWUgPSAic2NhbGVkIGF2Zy5cbmV4cHJlc3Npb24iLAogIGNvbCA9IHZpcmlkaXMoMTApLAogIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogIHJvd19uYW1lc19zaWRlID0gImxlZnQiLAogIGNvbHVtbl9uYW1lc19yb3QgPSAwLAogIGNvbHVtbl9uYW1lc19jZW50ZXJlZCA9IFQsCiAgcm93X25hbWVzX2dwID0gIGdwYXIoZm9udGZhbWlseSA9ICJtb25vIiwgZm9udGZhY2UgPSAiaXRhbGljIiksCiAgbGVmdF9hbm5vdGF0aW9uID0gcm93X2Fubm8KKQpgYGAKCiMjIyMgQ2x1c3RlciBhbm5vdGF0aW9uCgpJbiBjb25zaWRlcmF0aW9uIG9mIHRoZSBhYm92ZSB2aXN1YWxpemF0aW9ucyB+fmFuZCBhZGRpdGlvbmFsIGV4cGxvcmF0aW9uIHdpdGggYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJpU0VFIilgfn4sIHdlIGFycml2ZSBhdCB0aGUgZm9sbG93aW5nIGNsdXN0ZXIgYW5ub3RhdGlvbnM6IAoKYGBge3IgY2x1c3Rlci1hbm5vLCB3YXJuaW5nID0gRkFMU0V9CiMgYXQgc25uIHJlcyAxCmFubm8ucmVzLjEgPC0gbGlzdCgKICAgICJBc3Ryb2N5dGVzIiA9IGMoMDoxNCwgMTYsIDIyLCAyMyksCiAgICAiTmV1cm9ucyIgPSBjKDE1LCAxOCwgMjEsIDI0KSwKICAgICJFbmRvdGhlbGlhbCIgPSBjKDE3LCAyOCwgMjkpLAogICAgIk1pY3JvZ2xpYSIgPSAxOSwKICAgICJPbGlnb2RlbmRyb2N5dGVzIiA9IGMoMjAsIDI1LCAyNyksCiAgICAiUGVyaWN5dGVzIiA9IGMoMjYpLAogICAgIkVyeXRocm9jeXRlcyIgPSAzMAogICAgKQpgYGAKCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQphbm5vIDwtIGFubm8ucmVzLjEKICAKY29scyA8LSBtdXNjYXQ6OjouY2x1c3Rlcl9jb2xvcnNbc2VxX2Fsb25nKGFubm8pXQpjb2xzIDwtIHNldE5hbWVzKGNvbHMsIG5hbWVzKGFubm8pKQoKbSA8LSBtYXRjaChzY2UkY2x1c3Rlcl9pZCwgdW5saXN0KGFubm8pKQpucyA8LSB2YXBwbHkoYW5ubywgbGVuZ3RoLCBudW1lcmljKDEpKQpsYWIgPC0gcmVwLmludChuYW1lcyhhbm5vKSwgbnMpW21dCnNjZSRjZWxsX3R5cGUgPC0gZmFjdG9yKGxhYiwgbGV2ZWxzID0gbmFtZXMoYW5ubykpCgojIElzIGFueSBjZWxsJ3MgY2VsbCB0eXBlIE5BPyAKdGFibGUoaXMubmEoc2NlJGNlbGxfdHlwZSkpCgojIFdoYXQgY2x1c3RlcnMgYXJlIHVuYXNzaWduZWQ/CmFzc2lnbmVkIDwtIHVubGlzdChhbm5vKSAlPiUgdW5uYW1lKCkKY2x1c3RlcnMgPC0gMDptYXgoYXMubnVtZXJpYyhsZXZlbHMoc2NlJGNsdXN0ZXJfaWQpKSkKY2x1c3RlcnNbIShjbHVzdGVycyAlaW4lIGFzc2lnbmVkKV0KYGBgCgojIyMgRmluZCBtYXJrZXJzIHVuc3VwZXJ2aXplZCB1c2luZyBgc2NyYW5gCgpgYGB7ciBzY3Jhbi1maW5kTWFya2Vyc30Kc2NyYW5fbWFya2VycyA8LSBmaW5kTWFya2VycyhzY2UsIAogICAgZ3JvdXBzID0gc2NlJGNsdXN0ZXJfaWQsIGJsb2NrID0gc2NlJHNhbXBsZV9pZCwKICAgIGRpcmVjdGlvbiA9ICJ1cCIsIGxmYyA9IDIsIGZ1bGwuc3RhdHMgPSBUUlVFKQpgYGAKCiMjIyMgSGVhdG1hcCBvZiBtZWFuIG1hcmtlci1leHBycy4gYnkgY2x1c3RlcgoKYGBge3Igc2NyYW4tbWFya2Vycy1oZWF0bWFwLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQpncyA8LSBsYXBwbHkoc2NyYW5fbWFya2VycywgZnVuY3Rpb24odSkKICByb3duYW1lcyh1KVt1JFRvcCA9PSAxXSkKc3ViIDwtIHNjZVt1bmlxdWUodW5saXN0KGdzKSksXQpwYnMgPC0KICBhZ2dyZWdhdGVEYXRhKHN1YiwKICAgICAgICAgICAgICAgIGFzc2F5ID0gImxvZ2NvdW50cyIsCiAgICAgICAgICAgICAgICBieSA9ICJjbHVzdGVyX2lkIiwKICAgICAgICAgICAgICAgIGZ1biA9ICJtZWFuIikKbWF0IDwtIG11c2NhdDo6Oi5zY2FsZShhc3NheShwYnMpKQpyb3duYW1lcyhtYXQpIDwtIHdvcmQocm93bmFtZXMobWF0KSwgMiwgc2VwID0gIlxcLiIpCgpjb2wuY2x1c3RlcnMuZGYgPC0KICBlbmZyYW1lKGFubm8sIG5hbWUgPSAiY2VsbF90eXBlIiwgdmFsdWUgPSAiY2x1c3RlciIpICU+JQogIHVubmVzdF9sb25nZXIoY2x1c3RlcikgJT4lCiAgYXJyYW5nZShjbHVzdGVyKSAlPiUKICBsZWZ0X2pvaW4oLiwKICAgICAgICAgICAgZW5mcmFtZShjb2xzLCBuYW1lID0gImNlbGxfdHlwZSIsIHZhbHVlID0gImNvbG9yIiksCiAgICAgICAgICAgIGJ5ID0gImNlbGxfdHlwZSIpCgpjb2wuYW5uby5jbHVzdGVycyA8LSBjb2x1bW5Bbm5vdGF0aW9uKCJjZWxsIHR5cGUiID0gY29sLmNsdXN0ZXJzLmRmJGNlbGxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBsaXN0KCJjZWxsIHR5cGUiID0gY29scykpCgpIZWF0bWFwKAogIG1hdCwKICBuYW1lID0gInNjYWxlZCBhdmcuXG5leHByZXNzaW9uIiwKICBjb2wgPSB2aXJpZGlzKDEwKSwKICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogIHNob3dfcm93X2RlbmQgPSBGQUxTRSwKICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICBjb2x1bW5fbmFtZXNfc2lkZSA9ICJ0b3AiLAogIGNvbHVtbl9uYW1lc19yb3QgPSAwLAogIGNvbHVtbl9uYW1lc19jZW50ZXJlZCA9IFRSVUUsCiAgcm93X3RpdGxlID0gImNsdXN0ZXJfaWQiLAogIGNvbHVtbl90aXRsZSA9IGN1cnJlbnRfc25uX3JlcywKICByZWN0X2dwID0gZ3Bhcihjb2wgPSAid2hpdGUiKSwKICB0b3BfYW5ub3RhdGlvbiA9IGNvbC5hbm5vLmNsdXN0ZXJzCikKYGBgCgojIyMgQ2x1c3Rlci1zYW1wbGUgY2VsbCB0eXBlIGNvdW50cwoKYGBge3Igd2FybmluZyA9IEZBTFNFfQpjZWxsX3R5cGVzIDwtIHRhYmxlKHNjZSRjZWxsX3R5cGUsIHNjZSRzYW1wbGVfaWQpCm1hdCA8LSBhcy5tYXRyaXgodW5jbGFzcyhjZWxsX3R5cGVzKSkKSGVhdG1hcChtYXQsCiAgICBjb2wgPSBjKCIjN0E5MkZGIiwgIndoaXRlIiwgIiNGRjg0OTIiKSwKICAgIG5hbWUgPSAiTiBjZWxscyIsCiAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgcm93X25hbWVzX3NpZGUgPSAibGVmdCIsCiAgICBjb2x1bW5fdGl0bGUgPSBjdXJyZW50X3Nubl9yZXMsCiAgICByZWN0X2dwID0gZ3Bhcihjb2wgPSAid2hpdGUiKSwKICAgIGNlbGxfZnVuID0gZnVuY3Rpb24oaSwgaiwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCkKICAgICAgICBncmlkLnRleHQobWF0W2osIGldLCB4ID0geCwgeSA9IHksIAogICAgICAgICAgICBncCA9IGdwYXIoY29sID0gImJsYWNrIiwgZm9udHNpemUgPSA4KSkpCmBgYAoKIyMjIENlbGwgdHlwZSBjb3VudHMgYnkgZ3JvdXAKCmBgYHtyfQpjZWxsX3R5cGVzX3Blcl9ncm91cCA8LSB0YWJsZShzY2UkY2VsbF90eXBlLCBzY2UkZ3JvdXBfaWQpCm1hdCA8LSBhcy5tYXRyaXgodW5jbGFzcyhjZWxsX3R5cGVzX3Blcl9ncm91cCkpCgpIZWF0bWFwKAogIG1hdCwKICBjb2wgPSBjKCIjN0E5MkZGIiwgIndoaXRlIiwgIiNGRjg0OTIiKSwKICBuYW1lID0gIk4gY2VsbHMiLAogIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogIHJvd19uYW1lc19zaWRlID0gImxlZnQiLAogIGNvbHVtbl90aXRsZSA9IGN1cnJlbnRfc25uX3JlcywKICByZWN0X2dwID0gZ3Bhcihjb2wgPSAid2hpdGUiKSwKICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGksIGosIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpCiAgICBncmlkLnRleHQoCiAgICAgIG1hdFtqLCBpXSwKICAgICAgeCA9IHgsCiAgICAgIHkgPSB5LAogICAgICBncCA9IGdwYXIoY29sID0gImJsYWNrIiwgZm9udHNpemUgPSAxMikKICAgICkKKQpgYGAKCiMjIyBDZWxsIHR5cGUgY291bnRzIGJ5IGNsdXN0ZXIKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0KY2VsbF90eXBlc19wZXJfZ3JvdXAgPC0gdGFibGUoc2NlJGNsdXN0ZXJfaWQsIHNjZSRjZWxsX3R5cGUpCm1hdCA8LSBhcy5tYXRyaXgodW5jbGFzcyhjZWxsX3R5cGVzX3Blcl9ncm91cCkpCgpIZWF0bWFwKAogIG1hdCwKICBjb2wgPSBjKCIjN0E5MkZGIiwgIndoaXRlIiwgIiNGRjg0OTIiKSwKICBuYW1lID0gIk4gY2VsbHMiLAogIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogIHJvd19uYW1lc19zaWRlID0gImxlZnQiLAogIGNvbHVtbl90aXRsZSA9IGN1cnJlbnRfc25uX3JlcywKICByZWN0X2dwID0gZ3Bhcihjb2wgPSAid2hpdGUiKSwKICBjZWxsX2Z1biA9IGZ1bmN0aW9uKGksIGosIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwpCiAgICBncmlkLnRleHQoCiAgICAgIG1hdFtqLCBpXSwKICAgICAgeCA9IHgsCiAgICAgIHkgPSB5LAogICAgICBncCA9IGdwYXIoY29sID0gImJsYWNrIiwgZm9udHNpemUgPSAxMikKICAgICkKKQpgYGAKCiMjIyBDZWxsIHR5cGUgcmF0aW9zCgpgYGB7cn0KY29scyA8LSBtdXNjYXQ6OjouY2x1c3Rlcl9jb2xvcnNbc2VxX2Fsb25nKGFubm8pXQpjb2xzIDwtIHNldE5hbWVzKGNvbHMsIG5hbWVzKGFubm8pKQoKdGFibGUoc2NlJGNlbGxfdHlwZSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgbXV0YXRlKAogICAgdGV4dCA9IEZyZXEgLyBzdW0oRnJlcSkgKiAxMDAsCiAgICB0ZXh0ID0gcGFzdGUoRnJlcSwgImNlbGxzLCIsIHJvdW5kKHRleHQsIGRpZ2l0cyA9IDIpLCAiJSIpCiAgKSAlPiUgCiAgZ2dwbG90KGFlcyh5ID0gVmFyMSwgeCA9IEZyZXEpKSArCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBWYXIxKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSB0ZXh0LCB4ID0gbWF4KEZyZXEpIC8gNSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHkgPSBOVUxMLCB4ID0gIkNlbGxzIiwgdGl0bGUgPSBjdXJyZW50X3Nubl9yZXMsKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29scykKYGBgCgojIyMgSGVhdG1hcCBvZiBtZWFuIGdlbmUgZXhwcmVzc2lvbiBieSBjZWxsIHR5cGUKCmBgYHtyIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSAxNX0KIyBzcGxpdCBjZWxscyBieSBjbHVzdGVyCmNzX2J5X2sgPC0gc3BsaXQoY29sbmFtZXMoc2NlKSwgc2NlJGNlbGxfdHlwZSkKCiMgY29tcHV0ZSBjbHVzdGVyLW1hcmtlciBtZWFucwptc19ieV9jbHVzdGVyIDwtIGxhcHBseShmcywgZnVuY3Rpb24oZ3MpCiAgICB2YXBwbHkoY3NfYnlfaywgZnVuY3Rpb24oaSkKICAgICAgICBNYXRyaXg6OnJvd01lYW5zKGxvZ2NvdW50cyhzY2UpW2dzLCBpLCBkcm9wID0gRkFMU0VdKSwgCiAgICAgICAgbnVtZXJpYyhsZW5ndGgoZ3MpKSkpCgojIHByZXAuIGZvciBwbG90dGluZyAmIHNjYWxlIGIvdyAwIGFuZCAxCm1hdCA8LSBkby5jYWxsKCJyYmluZCIsIG1zX2J5X2NsdXN0ZXIpCm1hdCA8LSBtdXNjYXQ6Ojouc2NhbGUobWF0KQpyb3duYW1lcyhtYXQpIDwtIHdvcmQocm93bmFtZXMobWF0KSwgMiwgc2VwID0gIlxcLiIpCgpjb2xzIDwtIG11c2NhdDo6Oi5jbHVzdGVyX2NvbG9yc1tzZXFfYWxvbmcoYW5ubyldCmNvbHMgPC0gc2V0TmFtZXMoY29scywgbmFtZXMoYW5ubykpCgpyb3dfYW5ubyA8LSByb3dBbm5vdGF0aW9uKAogIGRmID0gZGF0YS5mcmFtZShsYWJlbCA9IGZhY3RvcihrcywgbGV2ZWxzID0gbmFtZXMoZnMpKSksCiAgY29sID0gbGlzdChsYWJlbCA9IGNvbHMpLAogIHNob3dfbGVnZW5kID0gRkFMU0UsIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UKKQoKY29sX2Fubm8gPC0gY29sdW1uQW5ub3RhdGlvbigKICBkZiA9IGRhdGEuZnJhbWUodGV4dCA9IGZhY3RvcihuYW1lcyhmcyksIGxldmVscyA9IG5hbWVzKGZzKSkpLAogIGNvbCA9IGxpc3QodGV4dCA9IGNvbHMpLAogIHNob3dfbGVnZW5kID0gRkFMU0UsIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UKKQoKSGVhdG1hcChtYXQsCiAgICBuYW1lID0gInNjYWxlZCBhdmcuXG5leHByZXNzaW9uIiwKICAgIGNvbCA9IHZpcmlkaXM6Om1hZ21hKDEwKVszOjEwXSwKICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICByb3dfbmFtZXNfc2lkZSA9ICJsZWZ0IiwKICAgIGNvbHVtbl90aXRsZSA9IE5VTEwsCiAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLAogICAgY29sdW1uX25hbWVzX3JvdCA9IDkwLAogICAgcm93X25hbWVzX2dwID0gIGdwYXIoZm9udGZhbWlseSA9ICJtb25vIiwgZm9udGZhY2UgPSAiaXRhbGljIiksCiAgICBsZWZ0X2Fubm90YXRpb24gPSByb3dfYW5ubwogICAgKQpgYGAKCiMjIyBEaW1SZWQgcGxvdHMKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0Kc28kY2VsbF90eXBlIDwtIHNjZSRjZWxsX3R5cGUKCmNzIDwtIHNhbXBsZShjb2xuYW1lcyhzbyksIDVlMykKLnBsb3RfZHIgPC0gZnVuY3Rpb24oc28sIGRyLCBpZCkKICAgIERpbVBsb3Qoc28sIGNlbGxzID0gY3MsIGdyb3VwLmJ5ID0gaWQsIHJlZHVjdGlvbiA9IGRyLCBwdC5zaXplID0gMC40KSArCiAgICAgICAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0gMTEsIAogICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogICAgICAgIHRoZW1lX3ZvaWQoKSArIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCgppZHMgPC0gYygic2FtcGxlX2lkIiwgImdyb3VwX2lkIiwgImNsdXN0ZXJfaWQiLCAiY2VsbF90eXBlIikKZm9yIChpZCBpbiBpZHMpIHsKICAgIHAxIDwtIC5wbG90X2RyKHNvLCAidHNuZSIsIGlkKQogICAgcDIgPC0gLnBsb3RfZHIoc28sICJ1bWFwIiwgaWQpCiAgICBpZihpZCA9PSAiY2VsbF90eXBlIil7CiAgICAgIHAxIDwtIHAxICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMpCiAgICAgIHAyIDwtIHAyICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMpCiAgICB9CiAgICBsZ2QgPC0gZ2V0X2xlZ2VuZChwMSkKICAgIHAxIDwtIHAxICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogICAgcDIgPC0gcDIgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgICBwcyA8LSBwbG90X2dyaWQocGxvdGxpc3QgPSBsaXN0KHAxLCBwMiksIG5yb3cgPSAxKQogICAgcCA8LSBwbG90X2dyaWQocHMsIGxnZCwgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDEsIDAuMikpCiAgICAKICAgIHByaW50KHApCn0KYGBgCgojIyMgU2F2ZSBTQ0UgdG8gLnJkcwoKYGBge3Igc2F2ZS1kYXRhfQojIG5vcm1hbGl6ZSBmb3IgdmlzdWFsaXphdGlvbgpzY2UgPC0gbG9nTm9ybUNvdW50cyhzY2UpCgojIHJlb3JkZXIgc2FtcGxlIGxldmVscwptIDwtIG1hdGNoKGxldmVscyhzY2Ukc2FtcGxlX2lkKSwgc2NlJHNhbXBsZV9pZCkKbyA8LSBvcmRlcihzY2UkZ3JvdXBfaWRbbV0pCnNjZSRzYW1wbGVfaWQgPC0gZmFjdG9yKHNjZSRzYW1wbGVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhzY2Ukc2FtcGxlX2lkKVtvXSkKCiMgc2VwYXJhdGUgZW5zZW1ibCBJRHMgJiBnZW5lIHN5bWJvbHMKc3MgPC0gc3Ryc3BsaXQocm93bmFtZXMoc2NlKSwgIi4iLCBmaXhlZCA9IFRSVUUpCnJvd0RhdGEoc2NlKSRlbnNlbWJsX2lkIDwtIHNhcHBseShzcywgLnN1YnNldCwgMSkKcm93RGF0YShzY2UpJHN5bWJvbCA8LSBzYXBwbHkoc3MsIC5zdWJzZXQsIDIpCgojIHByZXAuIFNDRSBmb3IgYG11c2NhdGAgJiB3cml0ZSB0byAucmRzCnNhdmVSRFMoCiAgcHJlcFNDRSgKICAgIHNjZSwKICAgIGNsdXN0ZXJfaWQgPSAiY2x1c3Rlcl9pZCIsCiAgICBzYW1wbGVfaWQgPSAic2FtcGxlX2lkIiwKICAgIGdyb3VwX2lkID0gImdyb3VwX2lkIgogICksCiAgZmlsZS5wYXRoKGRpci5vYmplY3RzLCAiU0NFX2Fubm90YXRpb24ucmRzIikKKQpgYGAKCi0tLUNoZWNrcG9pbnQtLS0KCiMgQXN0cm9jeXRlIHN1YnNldAoKIyMgMS4gQ2x1c3RlcmluZwoKIyMjIExvYWQgZGF0YQoKYGBge3J9CiMgbG9hZCBkYXRhLCBEUyByZXN1bHRzICYgc291cmNlIHV0aWxzCnNjZSA8LSByZWFkUkRTKGZpbGUucGF0aChkaXIub2JqZWN0cywgIlNDRV9hbm5vdGF0aW9uLnJkcyIpKQpgYGAKCiMjIyBGaWx0ZXIgYW5kIHByb2Nlc3MKCmBgYHtyfQp0YWJsZShzY2UkY2VsbF90eXBlKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTV9CiMgRmlsdGVyIGFzdHJvY3l0ZXMKc2NlLmFzdHJvIDwtIHNjZVssIHNjZSRjZWxsX3R5cGUgPT0gIkFzdHJvY3l0ZXMiXQoKIyBjcmVhdGUgU2V1cmF0T2JqZWN0CnNvLmFzdHJvIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBjb3VudHMoc2NlLmFzdHJvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuZGF0YSA9IGRhdGEuZnJhbWUoY29sRGF0YShzY2UuYXN0cm8pKSkKc28uYXN0cm8kc2V4IDwtIGZhY3Rvcihzby5hc3RybyRzZXgsIGxldmVscyA9IGMoIkZlbWFsZSIsICJNYWxlIikpCnNvLmFzdHJvJHRyZWF0bWVudCA8LQogIGZhY3Rvcihzby5hc3RybyR0cmVhdG1lbnQsIGxldmVscyA9IGMoInNhbGluZSIsICJMUFMiKSkKc28uYXN0cm8kZ3JvdXBfaWQgPC0KICBmYWN0b3IoCiAgICBzby5hc3RybyRncm91cF9pZCwKICAgIGxldmVscyA9IGMoIkZlbWFsZV9zYWxpbmUiLCAiTWFsZV9zYWxpbmUiLCAiRmVtYWxlX0xQUyIsICJNYWxlX0xQUyIpCiAgKQoKIyBzcGxpdCBieSBzYW1wbGUKY2VsbHNfYnlfc2FtcGxlIDwtIHNwbGl0KGNvbG5hbWVzKHNjZS5hc3RybyksIHNjZS5hc3RybyRzYW1wbGVfaWQpCnNvLmFzdHJvIDwtCiAgbGFwcGx5KGNlbGxzX2J5X3NhbXBsZSwgZnVuY3Rpb24oaSkKICAgIHN1YnNldChzby5hc3RybywgY2VsbHMgPSBpKSkKCiMgbm9ybWFsaXplLCBmaW5kIHZhcmlhYmxlIGdlbmVzLCBhbmQgc2NhbGUKc28uYXN0cm8gPC0gbGFwcGx5KHNvLmFzdHJvLCBOb3JtYWxpemVEYXRhLCB2ZXJib3NlID0gRkFMU0UpCnNvLmFzdHJvIDwtIGxhcHBseSgKICBzby5hc3RybywKICBGaW5kVmFyaWFibGVGZWF0dXJlcywKICBuZmVhdHVyZXMgPSAyZTMsCiAgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLAogIHZlcmJvc2UgPSBGQUxTRQopCnNvLmFzdHJvIDwtIGxhcHBseShzby5hc3RybywgU2NhbGVEYXRhLCB2ZXJib3NlID0gRkFMU0UpCgojIGZpbmQgYW5jaG9ycyAmIHJlLWludGVncmF0ZQphcyA8LSBGaW5kSW50ZWdyYXRpb25BbmNob3JzKHNvLmFzdHJvLCB2ZXJib3NlID0gRkFMU0UpCnNvLmFzdHJvIDwtCiAgSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBhcywKICAgICAgICAgICAgICAgIGRpbXMgPSBzZXFfbGVuKDMwKSwKICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCiMgc2NhbGUgaW50ZWdyYXRlZCBkYXRhCkRlZmF1bHRBc3NheShzby5hc3RybykgPC0gImludGVncmF0ZWQiCnNvLmFzdHJvIDwtIFNjYWxlRGF0YShzby5hc3RybywgdmVyYm9zZSA9IEZBTFNFKQoKIyBSdW4gUENBCnNvLmFzdHJvIDwtIFJ1blBDQShzby5hc3RybywgbnBjcyA9IDUwLCB2ZXJib3NlID0gRkFMU0UpCkVsYm93UGxvdChzby5hc3RybywgbmRpbXMgPSA1MCkKCiMgUnVuIHQtU05FCnNvLmFzdHJvIDwtIFJ1blRTTkUoCiAgc28uYXN0cm8sCiAgcmVkdWN0aW9uID0gInBjYSIsCiAgZGltcyA9IHNlcV9sZW4oMjApLAogIHNlZWQudXNlID0gMSwKICBkby5mYXN0ID0gVFJVRSwKICB2ZXJib3NlID0gRkFMU0UKKQoKRGltUGxvdChzby5hc3RybywgcmVkdWN0aW9uID0gInRzbmUiLCBncm91cC5ieSA9ICJncm91cF9pZCIpCmBgYAoKIyMjIEZpbmQgY2x1c3RlcnMgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zCgpgYGB7cn0KIyBSZW1vdmUgY29sdW1ucyB3aXRoIHByZXZpb3VzbHkgZGV0ZWN0ZWQgY2x1c3RlcnMKc28uYXN0cm9AbWV0YS5kYXRhW2dyZXAoImludGVncmF0ZWRfc25uIiwgbmFtZXMoc28uYXN0cm9AbWV0YS5kYXRhKSldIDwtCiAgTlVMTAoKIyBSZS1kZXRlY3QgY2x1c3RlcnMgYXQgZ2l2ZW4gcmVzCnNvLmFzdHJvIDwtCiAgRmluZE5laWdoYm9ycyhzby5hc3RybywKICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJwY2EiLAogICAgICAgICAgICAgICAgZGltcyA9IHNlcV9sZW4oMjApLAogICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQpmb3IgKHJlcyBpbiBjKDAuMSwgMC4yLCAwLjQpKQogIHNvLmFzdHJvIDwtCiAgRmluZENsdXN0ZXJzKAogICAgc28uYXN0cm8sCiAgICByZXNvbHV0aW9uID0gcmVzLAogICAgcmFuZG9tLnNlZWQgPSAxLAogICAgdmVyYm9zZSA9IEZBTFNFCiAgKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9My41fQpjbHVzdGVyc19jb2xuYW1lcyA8LQogIHN0cl9zdWJzZXQobmFtZXMoc28uYXN0cm9AbWV0YS5kYXRhKSwgImludGVncmF0ZWRfc25uX3JlcyIpCgp0U05FLmJ5Q2x1c3Rlci5wbG90Lmxpc3QgPC0gbGlzdCgpCmZvciAoY2x1c3RlcnNfY29sbmFtZSBpbiBjbHVzdGVyc19jb2xuYW1lcykgewogIHJlb3JkZXJlZF9jbHVzdGVyc19sZXZlbHMgPC0KICAgIHNvLmFzdHJvQG1ldGEuZGF0YVtbY2x1c3RlcnNfY29sbmFtZV1dICU+JQogICAgbGV2ZWxzKCkgJT4lIGxlbmd0aCgpICU+JSBzZXEoMCwgLikKICAKICBzby5hc3Ryb0BtZXRhLmRhdGFbW2NsdXN0ZXJzX2NvbG5hbWVdXSA8LQogICAgZmFjdG9yKHNvLmFzdHJvQG1ldGEuZGF0YVtbY2x1c3RlcnNfY29sbmFtZV1dLAogICAgICAgICAgIGxldmVscyA9IHJlb3JkZXJlZF9jbHVzdGVyc19sZXZlbHMpCiAgCiAgdFNORS5ieUNsdXN0ZXIucGxvdC5saXN0W1tjbHVzdGVyc19jb2xuYW1lXV0gPC0gRGltUGxvdCgKICAgIHNvLmFzdHJvLAogICAgcmVkdWN0aW9uID0gInRzbmUiLAogICAgZ3JvdXAuYnkgPSBjbHVzdGVyc19jb2xuYW1lLAogICAgc3BsaXQuYnkgPSAiZ3JvdXBfaWQiCiAgKSArIGxhYnModGl0bGUgPSBjbHVzdGVyc19jb2xuYW1lKQp9CnRTTkUuYnlDbHVzdGVyLnBsb3QubGlzdApgYGAKCmBgYHtyfQojIGNob3NlIGEgcmVzb2x1dGlvbgpJZGVudHMoc28uYXN0cm8pIDwtIHNvLmFzdHJvJGludGVncmF0ZWRfc25uX3Jlcy4wLjIKYGBgCgoKIyMjIEZpbmQgY2x1c3RlciBtYXJrZXJzIHVzaW5nIGBGaW5kQWxsTWFya2Vyc2AKCiMjIyMgQXQgcmVzID0gMC4yICgxMCBjbHVzdGVycykKCmBgYHtyfQphc3Ryby5tYXJrZXJzIDwtCiAgU2V1cmF0OjpGaW5kQWxsTWFya2VycygKICAgIHNvLmFzdHJvLAogICAgbG9nZmMudGhyZXNob2xkID0gbG9nKDAuMzUpLAogICAgbWluLnBjdCA9IDAuMjUsCiAgICBvbmx5LnBvcyA9IFRSVUUsCiAgICB2ZXJib3NlID0gRgogICkKYXN0cm8ubWFya2VycwpgYGAKCiMjIyBTdWJzZXQgb2YgZ2VuZXMgdXNlZCBmb3IgcGxvdHRpbmcKCmBgYHtyIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFfQphc3Ryby5tYXJrZXJzLnN1YnNldCA8LSBhc3Ryby5tYXJrZXJzICU+JSAKICBncm91cF9ieShjbHVzdGVyKSAlPiUKICBzbGljZV9tYXgobiA9IDEwLCBvcmRlcl9ieSA9IGF2Z19sb2dGQykKYXN0cm8ubWFya2Vycy5zdWJzZXQKYGBgCgpgYGB7cn0KIyBTYXZlIGdlbmVzZXRzIHBlciBjbHVzdGVyCnNhdmVSRFMoYXN0cm8ubWFya2VycywgZmlsZS5wYXRoKGRpci5vYmplY3RzLCAiYXN0cm8ubWFya2Vycy5yZHMiKSkKIyBTYXZlIG1ldGFkYXRhCnNhdmVSRFMoc2FtcGxlcy5kZiwgZmlsZS5wYXRoKGRpci5vYmplY3RzLCAibWV0YWRhdGEucmRzIikpCmBgYAoKIyMjIFNhdmUgU2V1cmF0T2JqZWN0IHRvIC5yZHMKCmBgYHtyfQpzYXZlUkRTKHNvLmFzdHJvLCBmaWxlLnBhdGgoZGlyLm9iamVjdHMsICJTT19hc3Ryb2N5dGVzX2NsdXN0ZXJlZC5yZHMiKSkKYGBgCgotLS1DaGVja3BvaW50LS0tCgojIFZpc2l1bSBkYXRhc2V0IGNvbm5lY3Rpb24KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3JpZGdlcykKYGBgCgojIyBMb2FkIGRhdGEKCmBgYHtyfQppbnB1dC5zcGF0aWFsIDwtIGZpbGUucGF0aCh3ZCwgInNwYWNlcmFuZ2VyL1NwYWNlUmFuZ2VyX291dHB1dHMiKQoKc3BhdGlhbC5zYW1wbGVzIDwtIGxpc3QuZmlsZXMoaW5wdXQuc3BhdGlhbCwgcGF0dGVybiA9ICJfU1swLTldXyIpICU+JSBzdHJfZXh0cmFjdCgiR1NNWzAtOV0rX1NbMC05XSsiKSAlPiUgdW5pcXVlKCkKCmxpc3QuZmlsZXMoaW5wdXQuc3BhdGlhbCwgcGF0dGVybiA9ICJfU1swLTldXyIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc28ubGlzdCA8LSBsaXN0KCkKCmZvciAoc3BhdGlhbC5zYW1wbGUgaW4gc3BhdGlhbC5zYW1wbGVzKSB7CiAgaDUuZmlsZS5uYW1lIDwtCiAgICBwYXN0ZTAoc3BhdGlhbC5zYW1wbGUsICJfZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXguaDUiKQogIGg1LmZpbGUucGF0aCA8LSBmaWxlLnBhdGgoaW5wdXQuc3BhdGlhbCwgaDUuZmlsZS5uYW1lKQogIAogIHNhbXBsZS5kZ0NNIDwtIFJlYWQxMFhfaDUoaDUuZmlsZS5wYXRoKQogIAogIHNvLmxpc3RbW3NwYXRpYWwuc2FtcGxlXV0gPC0KICAgIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBzYW1wbGUuZGdDTSwgcHJvamVjdCA9ICJTcGF0aWFsIikKICAKICBzby5saXN0W1tzcGF0aWFsLnNhbXBsZV1dIDwtCiAgICBTQ1RyYW5zZm9ybShvYmplY3QgPSBzby5saXN0W1tzcGF0aWFsLnNhbXBsZV1dLCByZXR1cm4ub25seS52YXIuZ2VuZXMgPSBGLCB2ZXJib3NlID0gRkFMU0UpCn0KYGBgCgpgYGB7cn0KYXN0cm8ubWFya2VycyA8LSByZWFkUkRTKGZpbGUucGF0aChkaXIub2JqZWN0cywgImFzdHJvLm1hcmtlcnMucmRzIikpCmFzdHJvLm1hcmtlcnMgJT4lIAogIGZpbHRlcihwX3ZhbF9hZGogPCAwLjAxKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYXZnX2xvZ0ZDLCB5ID0gY2x1c3RlciwgY29sb3IgPSBjbHVzdGVyLCBmaWxsID0gY2x1c3RlcikpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC4yLCBzY2FsZSA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMiIpCmBgYAoKYGBge3J9CmFzdHJvLm1hcmtlcnMubGlzdCA8LSBhc3Ryby5tYXJrZXJzICU+JSAKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wMSkgJT4lIAogIHNlbGVjdChnZW5lLCBjbHVzdGVyKSAlPiUgCiAgbXV0YXRlKGdlbmUgPSB3b3JkKGdlbmUsIDIsIHNlcCA9ICJcXC4iKSkKICAKYXN0cm8ubWFya2Vycy5saXN0IDwtIHNwbGl0KGFzdHJvLm1hcmtlcnMubGlzdCRnZW5lLCBhc3Ryby5tYXJrZXJzLmxpc3QkY2x1c3RlcikKYGBgCgpgYGB7cn0KZm9yKHNvLm5hbWUgaW4gbmFtZXMoc28ubGlzdCkpewogIHByaW50KHNvLm5hbWUpCiAgc28ubGlzdFtbc28ubmFtZV1dIDwtIEFkZE1vZHVsZVNjb3JlKHNvLmxpc3RbW3NvLm5hbWVdXSwgYXN0cm8ubWFya2Vycy5saXN0KQogIG1vZHVsZV9zY29yZXMgPC0gc28ubGlzdFtbc28ubmFtZV1dQG1ldGEuZGF0YVssIGdyZXAoIkNsdXN0ZXIiLCBjb2xuYW1lcyhzby5saXN0W1tzby5uYW1lXV1AbWV0YS5kYXRhKSldCiAgY3N2LmZpbGVuYW1lIDwtIHBhc3RlMChzby5uYW1lLCAiX21vZHVsZV9zY29yZXMuY3N2IikKICB3cml0ZS5jc3YobW9kdWxlX3Njb3JlcywgZmlsZSA9IGZpbGUucGF0aChpbnB1dC5zcGF0aWFsLCBjc3YuZmlsZW5hbWUpLCByb3cubmFtZXM9VFJVRSkKfQpgYGAKCgo=