Introduction
This document contains the analysis for the dissertation experiment.
The analysis is organized into four main sections:
- Data Wrangling: Importing, cleaning, and preparing
the data
- Analysis: Core analytical procedures
- Statistical Tests: Formal statistical testing
- Visualizations: Data visualization and
plotting
Data Wrangling
## Visual angle range for -200 to +200 pixels: 9.06 degrees
Data Summary
Overall Dataset Summary
|
Participants
|
Total Trials
|
Trials per Participant
|
PSE Min (deg)
|
PSE Max (deg)
|
PSE Mean (deg)
|
PSE SD (deg)
|
|
28
|
21060
|
752.1
|
-5.28
|
1.84
|
-0.98
|
1.17
|
Response Rate Analysis
Data Quality Check
Data Quality Summary
|
Metric
|
Value
|
|
PSE Mean
|
-0.98
|
|
PSE SD
|
1.17
|
|
3 SD Lower Bound
|
-4.50
|
|
3 SD Upper Bound
|
2.50
|
|
Extreme PSE Participants
|
1.00
|
|
Extreme Response Rate Participants
|
3.00
|
Participants with PSE Beyond 3 SD from Mean -4.5 to 2.5
|
participant
|
n_trials
|
mean_pse
|
LR%
|
|
LD_112822
|
765
|
-5.28
|
100
|
Participants with Extreme Response Rates
|
participant
|
n_trials
|
left_responses
|
LR%
|
mean_pse
|
|
LD_112822
|
765
|
765
|
100.00
|
-5.28
|
|
RA_040622
|
765
|
765
|
100.00
|
-0.11
|
|
VG_052722
|
765
|
738
|
96.47
|
-0.07
|
Final Data Filtering
Data Filtering Summary
|
Metric
|
Count
|
|
Original Participants
|
28
|
|
PSE Outliers Removed
|
1
|
|
Extreme Response Rates Removed
|
3
|
|
Final Participants
|
25
|
Descriptive Statistics
Overall Descriptive Statistics
|
Sample Size
|
Mean PSE (deg)
|
SD PSE (deg)
|
Mean LR%
|
SD LR%
|
|
25
|
-0.9
|
NA
|
67.14
|
12.67
|
## PSE Distribution by Participant

## Left Response Rate Distribution by Participant

Analysis
## Group-Level Left Response Rate by SOA

## Individual-Level Left Response Rate by SOA - Participant MT_042022

## Group-Level Left Response Rate by SOA - Detrended (0-300ms)

## Group-Level Left Response Rate by SOA - Butterworth Filtered (4-18 Hz, 0-300ms)

## 10 Hz Sinusoid Overlay and R^2 Fit (0-300ms)

## R^2 (10 Hz sinusoid fit): 0.027
## RFFT of Filtered Left Response Rate (0-300ms)

## Peak frequencies from group-level FFT:
## freq amp
## 1 6.451613 0.6143487
## 2 14.516129 0.2489839
## Top 2 peak frequencies: 6.5 Hz and 14.5 Hz
## Frequency analysis (0-300ms)
## Permutation test (0-300ms, n=1000): p = 0.6880
## Frequency analysis – 0-300ms permutation test

## Critical value (95th % of permuted R^2): 0.187
## Permutation tests for peak frequencies from group-level FFT (0-300ms)
##
## Peak frequency 6.5 Hz permutation test:
## Observed R^2 (6.5 Hz): 0.780
## Permutation test p-value: 0.0000
## Critical value (95th %): 0.178
## Significant: Yes
## Frequency analysis – 6.5 Hz permutation test

##
## Peak frequency 14.5 Hz permutation test:
## Observed R^2 (14.5 Hz): 0.129
## Permutation test p-value: 0.1460
## Critical value (95th %): 0.202
## Significant: No
## Frequency analysis – 14.5 Hz permutation test

Individual-Level Frequency Analysis
## Individual-Level 0-300ms RFFT (4–18 Hz filtered residuals)

## Distribution of Power Across 4-18 Hz Frequencies for All Participants (0-300ms)

## Summary of Power by Frequency:
## # A tibble: 9 × 4
## freq_rounded mean_amp sd_amp n_participants
## <dbl> <dbl> <dbl> <int>
## 1 4.8 0.165 0.0746 25
## 2 6.5 0.330 0.122 25
## 3 8.1 0.384 0.148 25
## 4 9.7 0.357 0.129 25
## 5 11.3 0.327 0.164 25
## 6 12.9 0.298 0.140 25
## 7 14.5 0.238 0.0985 25
## 8 16.1 0.219 0.122 25
## 9 17.7 0.220 0.120 25
## Bootstrap Analysis of Power Values Across All Frequencies (0-300ms)

## Bootstrap Summary Statistics (95% CI):
## # A tibble: 9 × 5
## frequency mean_bootstrap sd_bootstrap ci_lower ci_upper
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4.8 0.165 0.0148 0.136 0.195
## 2 6.5 0.330 0.0240 0.282 0.378
## 3 8.1 0.384 0.0290 0.327 0.440
## 4 9.7 0.356 0.0248 0.307 0.404
## 5 11.3 0.326 0.0319 0.262 0.386
## 6 12.9 0.298 0.0274 0.243 0.350
## 7 14.5 0.237 0.0192 0.199 0.274
## 8 16.1 0.219 0.0236 0.175 0.267
## 9 17.7 0.220 0.0234 0.177 0.268
LS0tCnRpdGxlOiAiRGlzc2VydGF0aW9uIEV4cGVyaW1lbnQgQW5hbHlzaXMiCmF1dGhvcjogIllvdXIgTmFtZSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICB0aGVtZTogY29zbW8KICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGRmX3ByaW50OiBwYWdlZAogICAgY3NzOiBudWxsCiAgICBrZWVwX21kOiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIG1lc3NhZ2UgPSBGQUxTRSwKICBmaWcud2lkdGggPSAxMCwKICBmaWcuaGVpZ2h0ID0gNiwKICBmaWcuYWxpZ24gPSAiY2VudGVyIiwKICBjYWNoZSA9IEZBTFNFCikKYGBgCgojIyBJbnRyb2R1Y3Rpb24KClRoaXMgZG9jdW1lbnQgY29udGFpbnMgdGhlIGFuYWx5c2lzIGZvciB0aGUgZGlzc2VydGF0aW9uIGV4cGVyaW1lbnQuIFRoZSBhbmFseXNpcyBpcyBvcmdhbml6ZWQgaW50byBmb3VyIG1haW4gc2VjdGlvbnM6CgoxLiAqKkRhdGEgV3JhbmdsaW5nKio6IEltcG9ydGluZywgY2xlYW5pbmcsIGFuZCBwcmVwYXJpbmcgdGhlIGRhdGEKMi4gKipBbmFseXNpcyoqOiBDb3JlIGFuYWx5dGljYWwgcHJvY2VkdXJlcwozLiAqKlN0YXRpc3RpY2FsIFRlc3RzKio6IEZvcm1hbCBzdGF0aXN0aWNhbCB0ZXN0aW5nCjQuICoqVmlzdWFsaXphdGlvbnMqKjogRGF0YSB2aXN1YWxpemF0aW9uIGFuZCBwbG90dGluZwoKIyMgRGF0YSBXcmFuZ2xpbmcKCmBgYHtyIGRhdGEtd3JhbmdsaW5nfQojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkocmlvKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShzaWduYWwpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHpvbykKbGlicmFyeShwdXJycikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBJbXBvcnQgYW5kIHByZXBhcmUgZGF0YQpkYXRhX2ZpbGUgPC0gImV4cDFfcmF3ZGF0YS54bHN4IgphbGxfZGF0YSA8LSByZWFkX2V4Y2VsKGRhdGFfZmlsZSwgc2hlZXQgPSAzKQoKIyBQU0UgY29udmVyc2lvbiBwYXJhbWV0ZXJzCnNjcmVlbl93aWR0aF9weCA8LSAxMDI0CnNjcmVlbl9oZWlnaHRfcHggPC0gNzY4CiMgU2NyZWVuIGlzIDExIGluY2hlcyB3aWRlCnNjcmVlbl93aWR0aF9jbSA8LSAxMSAqIDIuNTQgICMgQ29udmVydCBpbmNoZXMgdG8gY20Kc2NyZWVuX2hlaWdodF9jbSA8LSBzY3JlZW5fd2lkdGhfY20gKiAoNzY4LzEwMjQpICAjIENhbGN1bGF0ZSBoZWlnaHQgYmFzZWQgb24gYXNwZWN0IHJhdGlvCnZpZXdpbmdfZGlzdGFuY2VfY20gPC0gNjkKCiMgQ2FsY3VsYXRlIHZpc3VhbCBhbmdsZSBmb3IgMSBwaXhlbCAoaW4gcmFkaWFucykKcGl4ZWxzX3Blcl9jbSA8LSBzY3JlZW5fd2lkdGhfcHggLyBzY3JlZW5fd2lkdGhfY20KdmlzdWFsX2FuZ2xlXzFweF9yYWQgPC0gMiAqIGF0YW4oKDEgLyBwaXhlbHNfcGVyX2NtKSAvICgyICogdmlld2luZ19kaXN0YW5jZV9jbSkpCgojIENvbnZlcnQgdG8gZGVncmVlcwp2aXN1YWxfYW5nbGVfMXB4X2RlZyA8LSB2aXN1YWxfYW5nbGVfMXB4X3JhZCAqICgxODAvcGkpCgojIENhbGN1bGF0ZSB2aXN1YWwgYW5nbGUgcmFuZ2UgZm9yIC0yMDAgdG8gMjAwIHBpeGVscwpwaXhlbF9yYW5nZV9kZWcgPC0gNDAwICogdmlzdWFsX2FuZ2xlXzFweF9kZWcgICMgNDAwIHBpeGVscyB0b3RhbCByYW5nZSAoLTIwMCB0byArMjAwKQpjYXQoc3ByaW50ZigiVmlzdWFsIGFuZ2xlIHJhbmdlIGZvciAtMjAwIHRvICsyMDAgcGl4ZWxzOiAlLjJmIGRlZ3JlZXNcbiIsIHBpeGVsX3JhbmdlX2RlZykpCgojIFRyYW5zZm9ybSBhbmQgY2xlYW4gZGF0YQphbGxfZGF0YSA8LSBhbGxfZGF0YSAlPiUKICBtdXRhdGUoCiAgICBjb3JyZWN0ZWRfTFJkYXRhID0gaWZlbHNlKGNvcnJlY3RlZF9MUmRhdGEgPT0gMCwgLTEsIDEpLAogICAgbG9jb19yZXBvcnRfMi5rZXlzID0gY29ycmVjdGVkX0xSZGF0YSwKICAgIHRhcmdldFkgPSAwLAogICAgdGhpc04gPSB0cmlhbHMudGhpc1RyaWFsTiwKICAgIHRoaXNUcmlhbE4gPSB0cmlhbHMudGhpc1RyaWFsTiwKICAgIHRoaXNSZXBOID0gMSwKICAgICMgQ29udmVydCBQU0UgZnJvbSBwaXhlbHMgdG8gZGVncmVlcyBvZiB2aXN1YWwgYW5nbGUKICAgIFBTRV9kZWcgPSBQU0UgKiB2aXN1YWxfYW5nbGVfMXB4X2RlZywKICAgICMgQ29udmVydCBTT0EgZnJvbSBmcmFtZXMgdG8gbWlsbGlzZWNvbmRzICgxIGZyYW1lID0gMTBtcyBhdCAxMDBIeikKICAgIFNPQV9tcyA9IFNPQSAqIDEwCiAgKQoKIyBSZW1vdmUgY29udHJvbCB0cmlhbHMgKFNPQSA9IDEwIHdpdGggUFNFID0gwrEyMDApCmFsbF9kYXRhIDwtIGFsbF9kYXRhICU+JQogIGZpbHRlcighKFNPQSA9PSAxMCAmIChQU0UgPT0gLTIwMCB8IFBTRSA9PSAyMDApKSkKCiMgQ3JlYXRlIHBhcnRpY2lwYW50IHN1bW1hcnkKcGFydGljaXBhbnRfc3VtbWFyeSA8LSBhbGxfZGF0YSAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgbl90cmlhbHMgPSBuKCksCiAgICBtZWFuX3BzZSA9IG1lYW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKSwKICAgIG1pbl9wc2UgPSBtaW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKSwKICAgIG1heF9wc2UgPSBtYXgoUFNFX2RlZywgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgdW5ncm91cCgpCgojIE92ZXJhbGwgZGF0YXNldCBzdW1tYXJ5CmRhdGFzZXRfc3VtbWFyeSA8LSBhbGxfZGF0YSAlPiUKICBzdW1tYXJpc2UoCiAgICBuX3BhcnRpY2lwYW50cyA9IG5fZGlzdGluY3QocGFydGljaXBhbnQpLAogICAgbl90cmlhbHMgPSBuKCksCiAgICB0cmlhbHNfcGVyX3BhcnRpY2lwYW50ID0gcm91bmQobigpIC8gbl9kaXN0aW5jdChwYXJ0aWNpcGFudCksIDEpLAogICAgcHNlX3JhbmdlX21pbiA9IG1pbihQU0VfZGVnLCBuYS5ybSA9IFRSVUUpLAogICAgcHNlX3JhbmdlX21heCA9IG1heChQU0VfZGVnLCBuYS5ybSA9IFRSVUUpLAogICAgcHNlX21lYW4gPSBtZWFuKFBTRV9kZWcsIG5hLnJtID0gVFJVRSksCiAgICBwc2Vfc2QgPSBzZChQU0VfZGVnLCBuYS5ybSA9IFRSVUUpCiAgKQoKIyBJZGVudGlmeSBhbmQgZmlsdGVyIG91dCBvdXRsaWVycyBmb3Igc3Vic2VxdWVudCBhbmFseXNlcwpwc2Vfc3RhdHMgPC0gYWxsX2RhdGEgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbl9wc2UgPSBtZWFuKFBTRV9kZWcsIG5hLnJtID0gVFJVRSksCiAgICBzZF9wc2UgPSBzZChQU0VfZGVnLCBuYS5ybSA9IFRSVUUpCiAgKQoKb3V0bGllcl90aHJlc2hvbGRfbG93ZXIgPC0gcHNlX3N0YXRzJG1lYW5fcHNlIC0gKDMgKiBwc2Vfc3RhdHMkc2RfcHNlKQpvdXRsaWVyX3RocmVzaG9sZF91cHBlciA8LSBwc2Vfc3RhdHMkbWVhbl9wc2UgKyAoMyAqIHBzZV9zdGF0cyRzZF9wc2UpCgpvdXRsaWVyX3BhcnRpY2lwYW50cyA8LSBwYXJ0aWNpcGFudF9zdW1tYXJ5ICU+JQogIGZpbHRlcihtZWFuX3BzZSA8IG91dGxpZXJfdGhyZXNob2xkX2xvd2VyIHwgbWVhbl9wc2UgPiBvdXRsaWVyX3RocmVzaG9sZF91cHBlcikKCiMgQ3JlYXRlIGZpbHRlcmVkIGRhdGFzZXRzIGZvciBzdWJzZXF1ZW50IGFuYWx5c2VzCiMgTm90ZTogV2UnbGwgZmlsdGVyIG91dCBleHRyZW1lIHJlc3BvbnNlIHJhdGUgcGFydGljaXBhbnRzIGluIHRoZSBkYXRhIHF1YWxpdHkgY2hlY2sgc2VjdGlvbgpleGNsdWRlZF9wYXJ0aWNpcGFudHMgPC0gb3V0bGllcl9wYXJ0aWNpcGFudHMkcGFydGljaXBhbnQKZmlsdGVyZWRfZGF0YSA8LSBhbGxfZGF0YSAlPiUKICBmaWx0ZXIoIXBhcnRpY2lwYW50ICVpbiUgZXhjbHVkZWRfcGFydGljaXBhbnRzKQoKZmlsdGVyZWRfcGFydGljaXBhbnRfc3VtbWFyeSA8LSBmaWx0ZXJlZF9kYXRhICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50KSAlPiUKICBzdW1tYXJpc2UoCiAgICBuX3RyaWFscyA9IG4oKSwKICAgIG1lYW5fcHNlID0gbWVhbihQU0VfZGVnLCBuYS5ybSA9IFRSVUUpLAogICAgbWluX3BzZSA9IG1pbihQU0VfZGVnLCBuYS5ybSA9IFRSVUUpLAogICAgbWF4X3BzZSA9IG1heChQU0VfZGVnLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUKICB1bmdyb3VwKCkKYGBgCgojIyBEYXRhIFN1bW1hcnkKCmBgYHtyIGRhdGEtc3VtbWFyeX0KIyBEaXNwbGF5IG92ZXJhbGwgZGF0YXNldCBzdW1tYXJ5CmthYmxlKGRhdGFzZXRfc3VtbWFyeSwgCiAgICAgIGNhcHRpb24gPSAiT3ZlcmFsbCBEYXRhc2V0IFN1bW1hcnkiLAogICAgICBjb2wubmFtZXMgPSBjKCJQYXJ0aWNpcGFudHMiLCAiVG90YWwgVHJpYWxzIiwgIlRyaWFscyBwZXIgUGFydGljaXBhbnQiLCAKICAgICAgICAgICAgICAgICAgICJQU0UgTWluIChkZWcpIiwgIlBTRSBNYXggKGRlZykiLCAiUFNFIE1lYW4gKGRlZykiLCAiUFNFIFNEIChkZWcpIiksCiAgICAgIGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpCmBgYAoKIyMgUmVzcG9uc2UgUmF0ZSBBbmFseXNpcwoKYGBge3IgcmVzcG9uc2UtcmF0ZS1hbmFseXNpc30KIyBDYWxjdWxhdGUgbGVmdCByZXNwb25zZSByYXRlIGZvciBlYWNoIHBhcnRpY2lwYW50IChiZWZvcmUgZmlsdGVyaW5nKQpsZWZ0X3Jlc3BvbnNlX3N1bW1hcnlfZnVsbCA8LSBhbGxfZGF0YSAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgbl90cmlhbHMgPSBuKCksCiAgICBsZWZ0X3Jlc3BvbnNlcyA9IHN1bShjb3JyZWN0ZWRfTFJkYXRhID09IDEsIG5hLnJtID0gVFJVRSksCiAgICBsZWZ0X3Jlc3BvbnNlX3JhdGUgPSBtZWFuKGNvcnJlY3RlZF9MUmRhdGEgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgICBtZWFuX3BzZSA9IG1lYW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgdW5ncm91cCgpCmBgYAoKIyMgRGF0YSBRdWFsaXR5IENoZWNrCgpgYGB7ciBkYXRhLXF1YWxpdHl9CiMgSWRlbnRpZnkgcGFydGljaXBhbnRzIHdpdGggZXh0cmVtZSByZXNwb25zZSByYXRlcyAoMTAwJSBvciBjbG9zZSB0byAxMDAlKQpleHRyZW1lX3Jlc3BvbnNlX3BhcnRpY2lwYW50cyA8LSBsZWZ0X3Jlc3BvbnNlX3N1bW1hcnlfZnVsbCAlPiUKICBmaWx0ZXIobGVmdF9yZXNwb25zZV9yYXRlID49IDk1IHwgbGVmdF9yZXNwb25zZV9yYXRlIDw9IDUpICU+JQogIG11dGF0ZSgKICAgIHJlc3BvbnNlX2lzc3VlID0gY2FzZV93aGVuKAogICAgICBsZWZ0X3Jlc3BvbnNlX3JhdGUgPj0gOTUgfiAiTmVhciAxMDAlIExlZnQiLAogICAgICBsZWZ0X3Jlc3BvbnNlX3JhdGUgPD0gNSB+ICJOZWFyIDEwMCUgUmlnaHQiCiAgICApCiAgKQoKIyBDcmVhdGUgY29tcHJlaGVuc2l2ZSBkYXRhIHF1YWxpdHkgc3VtbWFyeSB0YWJsZQpkYXRhX3F1YWxpdHlfc3VtbWFyeSA8LSBkYXRhLmZyYW1lKAogIE1ldHJpYyA9IGMoIlBTRSBNZWFuIiwgIlBTRSBTRCIsICIzIFNEIExvd2VyIEJvdW5kIiwgIjMgU0QgVXBwZXIgQm91bmQiLCAKICAgICAgICAgICAgICJFeHRyZW1lIFBTRSBQYXJ0aWNpcGFudHMiLCAiRXh0cmVtZSBSZXNwb25zZSBSYXRlIFBhcnRpY2lwYW50cyIpLAogIFZhbHVlID0gYygKICAgIHJvdW5kKHBzZV9zdGF0cyRtZWFuX3BzZSwgMiksCiAgICByb3VuZChwc2Vfc3RhdHMkc2RfcHNlLCAyKSwKICAgIHJvdW5kKG91dGxpZXJfdGhyZXNob2xkX2xvd2VyLCAxKSwKICAgIHJvdW5kKG91dGxpZXJfdGhyZXNob2xkX3VwcGVyLCAxKSwKICAgIG5yb3cob3V0bGllcl9wYXJ0aWNpcGFudHMpLAogICAgbnJvdyhleHRyZW1lX3Jlc3BvbnNlX3BhcnRpY2lwYW50cykKICApCikKCiMgRGlzcGxheSBkYXRhIHF1YWxpdHkgc3VtbWFyeQprYWJsZShkYXRhX3F1YWxpdHlfc3VtbWFyeSwgCiAgICAgIGNhcHRpb24gPSAiRGF0YSBRdWFsaXR5IFN1bW1hcnkiLAogICAgICBjb2wubmFtZXMgPSBjKCJNZXRyaWMiLCAiVmFsdWUiKSwKICAgICAgZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgCiAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRkFMU0UpCgojIERpc3BsYXkgb3V0bGllciBwYXJ0aWNpcGFudHMgaWYgYW55IGV4aXN0CmlmKG5yb3cob3V0bGllcl9wYXJ0aWNpcGFudHMpID4gMCkgewogICMgR2V0IExSJSBmb3Igb3V0bGllciBwYXJ0aWNpcGFudHMKICBvdXRsaWVyX3dpdGhfbHIgPC0gb3V0bGllcl9wYXJ0aWNpcGFudHMgJT4lCiAgICBsZWZ0X2pvaW4obGVmdF9yZXNwb25zZV9zdW1tYXJ5X2Z1bGwgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KHBhcnRpY2lwYW50LCBsZWZ0X3Jlc3BvbnNlX3JhdGUpLCAKICAgICAgICAgICAgICBieSA9ICJwYXJ0aWNpcGFudCIpCiAgCiAga2FibGUob3V0bGllcl93aXRoX2xyICU+JSAKICAgICAgICAgIHNlbGVjdChwYXJ0aWNpcGFudCwgbl90cmlhbHMsIG1lYW5fcHNlLCBsZWZ0X3Jlc3BvbnNlX3JhdGUpICU+JQogICAgICAgICAgcmVuYW1lKCJMUiUiID0gbGVmdF9yZXNwb25zZV9yYXRlKSwgCiAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJ0aWNpcGFudHMgd2l0aCBQU0UgQmV5b25kIDMgU0QgZnJvbSBNZWFuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgcm91bmQob3V0bGllcl90aHJlc2hvbGRfbG93ZXIsIDEpLCAidG8iLCAKICAgICAgICAgICAgICAgICAgICAgICByb3VuZChvdXRsaWVyX3RocmVzaG9sZF91cHBlciwgMSkpLAogICAgICAgIGRpZ2l0cyA9IDIpICU+JQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgCiAgICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGQUxTRSkKfQoKIyBEaXNwbGF5IGV4dHJlbWUgcmVzcG9uc2UgcmF0ZSBwYXJ0aWNpcGFudHMgaWYgYW55IGV4aXN0CmlmKG5yb3coZXh0cmVtZV9yZXNwb25zZV9wYXJ0aWNpcGFudHMpID4gMCkgewogIGthYmxlKGV4dHJlbWVfcmVzcG9uc2VfcGFydGljaXBhbnRzICU+JQogICAgICAgICAgc2VsZWN0KC1yZXNwb25zZV9pc3N1ZSkgJT4lCiAgICAgICAgICByZW5hbWUoIkxSJSIgPSBsZWZ0X3Jlc3BvbnNlX3JhdGUpLAogICAgICAgIGNhcHRpb24gPSAiUGFydGljaXBhbnRzIHdpdGggRXh0cmVtZSBSZXNwb25zZSBSYXRlcyIsCiAgICAgICAgZGlnaXRzID0gMikgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLAogICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRkFMU0UpCn0KYGBgCgojIyBGaW5hbCBEYXRhIEZpbHRlcmluZwoKYGBge3IgZmluYWwtZmlsdGVyaW5nfQojIENvbWJpbmUgYWxsIHBhcnRpY2lwYW50cyB0byBleGNsdWRlIChQU0Ugb3V0bGllcnMgKyBleHRyZW1lIHJlc3BvbnNlIHJhdGVzKQphbGxfZXhjbHVkZWRfcGFydGljaXBhbnRzIDwtIGMoCiAgb3V0bGllcl9wYXJ0aWNpcGFudHMkcGFydGljaXBhbnQsCiAgZXh0cmVtZV9yZXNwb25zZV9wYXJ0aWNpcGFudHMkcGFydGljaXBhbnQKKSAlPiUgdW5pcXVlKCkKCiMgQ3JlYXRlIGZpbmFsIGZpbHRlcmVkIGRhdGFzZXQKZmluYWxfZmlsdGVyZWRfZGF0YSA8LSBhbGxfZGF0YSAlPiUKICBmaWx0ZXIoIXBhcnRpY2lwYW50ICVpbiUgYWxsX2V4Y2x1ZGVkX3BhcnRpY2lwYW50cykKCmZpbmFsX3BhcnRpY2lwYW50X3N1bW1hcnkgPC0gZmluYWxfZmlsdGVyZWRfZGF0YSAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgbl90cmlhbHMgPSBuKCksCiAgICBtZWFuX3BzZSA9IG1lYW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKSwKICAgIG1pbl9wc2UgPSBtaW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKSwKICAgIG1heF9wc2UgPSBtYXgoUFNFX2RlZywgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgdW5ncm91cCgpCgojIFN1bW1hcnkgb2YgZmlsdGVyaW5nCmZpbHRlcmluZ19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoCiAgTWV0cmljID0gYygiT3JpZ2luYWwgUGFydGljaXBhbnRzIiwgIlBTRSBPdXRsaWVycyBSZW1vdmVkIiwgIkV4dHJlbWUgUmVzcG9uc2UgUmF0ZXMgUmVtb3ZlZCIsICJGaW5hbCBQYXJ0aWNpcGFudHMiKSwKICBDb3VudCA9IGMoCiAgICBsZW5ndGgodW5pcXVlKGFsbF9kYXRhJHBhcnRpY2lwYW50KSksCiAgICBucm93KG91dGxpZXJfcGFydGljaXBhbnRzKSwKICAgIG5yb3coZXh0cmVtZV9yZXNwb25zZV9wYXJ0aWNpcGFudHMpLAogICAgbGVuZ3RoKHVuaXF1ZShmaW5hbF9maWx0ZXJlZF9kYXRhJHBhcnRpY2lwYW50KSkKICApCikKCmthYmxlKGZpbHRlcmluZ19zdW1tYXJ5LCAKICAgICAgY2FwdGlvbiA9ICJEYXRhIEZpbHRlcmluZyBTdW1tYXJ5IiwKICAgICAgY29sLm5hbWVzID0gYygiTWV0cmljIiwgIkNvdW50IiksCiAgICAgIGRpZ2l0cyA9IDApICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIAogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKCiMjIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCmBgYHtyIGRlc2NyaXB0aXZlc30KIyBDYWxjdWxhdGUgbGVmdCByZXNwb25zZSByYXRlIGZvciBlYWNoIHBhcnRpY2lwYW50ICh1c2luZyBmaW5hbCBmaWx0ZXJlZCBkYXRhKQpsZWZ0X3Jlc3BvbnNlX3N1bW1hcnkgPC0gZmluYWxfZmlsdGVyZWRfZGF0YSAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCkgJT4lCiAgc3VtbWFyaXNlKAogICAgbl90cmlhbHMgPSBuKCksCiAgICAjIENvbnZlcnQgYmFjayB0byAwLzEgZm9yIHJhdGUgY2FsY3VsYXRpb24gKDEgPSBsZWZ0LCAwID0gcmlnaHQpCiAgICBsZWZ0X3Jlc3BvbnNlcyA9IHN1bShjb3JyZWN0ZWRfTFJkYXRhID09IDEsIG5hLnJtID0gVFJVRSksCiAgICBsZWZ0X3Jlc3BvbnNlX3JhdGUgPSBtZWFuKGNvcnJlY3RlZF9MUmRhdGEgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwgICMgQ29udmVydCB0byBwZXJjZW50YWdlCiAgICBtZWFuX3BzZSA9IG1lYW4oUFNFX2RlZywgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgdW5ncm91cCgpCgojIE92ZXJhbGwgZGVzY3JpcHRpdmUgc3RhdGlzdGljcwpvdmVyYWxsX2Rlc2NyaXB0aXZlcyA8LSBsZWZ0X3Jlc3BvbnNlX3N1bW1hcnkgJT4lCiAgc3VtbWFyaXNlKAogICAgc2FtcGxlX3NpemUgPSBuKCksCiAgICBtZWFuX3BzZSA9IG1lYW4obWVhbl9wc2UsIG5hLnJtID0gVFJVRSksCiAgICBzZF9wc2UgPSBpZmVsc2UobigpID4gMSwgc2QobWVhbl9wc2UsIG5hLnJtID0gVFJVRSksIDApLCAgIyBTRCBhY3Jvc3MgcGFydGljaXBhbnRzJyBtZWFuIFBTRSB2YWx1ZXMKICAgIG1lYW5fbHJfcmF0ZSA9IG1lYW4obGVmdF9yZXNwb25zZV9yYXRlLCBuYS5ybSA9IFRSVUUpLAogICAgc2RfbHJfcmF0ZSA9IGlmZWxzZShuKCkgPiAxLCBzZChsZWZ0X3Jlc3BvbnNlX3JhdGUsIG5hLnJtID0gVFJVRSksIDApICAjIFNEIGFjcm9zcyBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlIHJhdGVzCiAgKQoKIyBEaXNwbGF5IG92ZXJhbGwgZGVzY3JpcHRpdmUgc3RhdGlzdGljcwprYWJsZShvdmVyYWxsX2Rlc2NyaXB0aXZlcywgCiAgICAgIGNhcHRpb24gPSAiT3ZlcmFsbCBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIiwKICAgICAgY29sLm5hbWVzID0gYygiU2FtcGxlIFNpemUiLCAiTWVhbiBQU0UgKGRlZykiLCAiU0QgUFNFIChkZWcpIiwgIk1lYW4gTFIlIiwgIlNEIExSJSIpLAogICAgICBkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQoKIyBQU0UgRGlzdHJpYnV0aW9uIGJ5IFBhcnRpY2lwYW50CmxpYnJhcnkoZ2dwbG90MikKCmNhdCgiUFNFIERpc3RyaWJ1dGlvbiBieSBQYXJ0aWNpcGFudFxuIikKCiMgVXNlIHRoZSB2aXN1YWwgYW5nbGUgcmFuZ2UgZm9yIC0yMDAgdG8gKzIwMCBwaXhlbHMgKGFscmVhZHkgY2FsY3VsYXRlZCBhYm92ZSkKaGlzdF9yYW5nZSA8LSBwaXhlbF9yYW5nZV9kZWcgLyAyICAjIEhhbGYgdGhlIHJhbmdlIGZvciAtMjAwIHRvICsyMDAKCnBzZV9oaXN0b2dyYW0gPC0gZ2dwbG90KGxlZnRfcmVzcG9uc2Vfc3VtbWFyeSwgYWVzKHggPSBtZWFuX3BzZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMiwgZmlsbCA9ICIjNEU3OUE3IiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnMoeCA9ICJQU0UgKGRlZ3JlZXMpIiwgeSA9ICJOdW1iZXIgb2YgUGFydGljaXBhbnRzIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC1oaXN0X3JhbmdlLCBoaXN0X3JhbmdlKSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgtNiwgNiwgYnkgPSAyKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KHBzZV9oaXN0b2dyYW0pCgojIFJlc3BvbnNlIFJhdGUgRGlzdHJpYnV0aW9uIGJ5IFBhcnRpY2lwYW50CmNhdCgiTGVmdCBSZXNwb25zZSBSYXRlIERpc3RyaWJ1dGlvbiBieSBQYXJ0aWNpcGFudFxuIikKCmxyX2hpc3RvZ3JhbSA8LSBnZ3Bsb3QobGVmdF9yZXNwb25zZV9zdW1tYXJ5LCBhZXMoeCA9IGxlZnRfcmVzcG9uc2VfcmF0ZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwLCBmaWxsID0gIiNGMjhFMkIiLCBhbHBoYSA9IDAuNywgY29sb3IgPSAiYmxhY2siKSArCiAgbGFicyh4ID0gIkxlZnQgUmVzcG9uc2UgUmF0ZSAoJSkiLCB5ID0gIk51bWJlciBvZiBQYXJ0aWNpcGFudHMiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KGxyX2hpc3RvZ3JhbSkKYGBgCgojIyBBbmFseXNpcwoKYGBge3IgYW5hbHlzaXN9CiMgR3JvdXAtbGV2ZWwgTFIlIGFjcm9zcyBTT0FzCmdyb3VwX2xyX2J5X3NvYSA8LSBmaW5hbF9maWx0ZXJlZF9kYXRhICU+JQogIGdyb3VwX2J5KFNPQV9tcykgJT4lCiAgc3VtbWFyaXNlKAogICAgbl90cmlhbHMgPSBuKCksCiAgICBsZWZ0X3Jlc3BvbnNlcyA9IHN1bShjb3JyZWN0ZWRfTFJkYXRhID09IDEsIG5hLnJtID0gVFJVRSksCiAgICBsZWZ0X3Jlc3BvbnNlX3JhdGUgPSBtZWFuKGNvcnJlY3RlZF9MUmRhdGEgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwKICAgIHNlX2xyID0gc2QoY29ycmVjdGVkX0xSZGF0YSA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gc3FydChuKCkpICogMTAwCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgQ2FsY3VsYXRlIHktYXhpcyBsaW1pdHMgZm9yIGdyb3VwLWxldmVsIFNPQSBwbG90IChwcm9wZXIgc2NhbGluZyBmb3IgcHJvcG9ydGlvbnMpCmdyb3VwX3JhbmdlIDwtIHJhbmdlKGdyb3VwX2xyX2J5X3NvYSRsZWZ0X3Jlc3BvbnNlX3JhdGUsIG5hLnJtID0gVFJVRSkKUiA8LSBncm91cF9yYW5nZVsyXSAtIGdyb3VwX3JhbmdlWzFdCmdyb3VwX3lfbWluIDwtIG1heCgwLCBncm91cF9yYW5nZVsxXSAtIDAuMDIgKiAxMDApICAjIEFsbG93IC0yJSBidWZmZXIgZm9yIHByb3BvcnRpb25zCmdyb3VwX3lfbWF4IDwtIG1pbigxMDAsIGdyb3VwX3JhbmdlWzJdICsgMC4wMiAqIDEwMCkgICMgQWxsb3cgKzIlIGJ1ZmZlciBmb3IgcHJvcG9ydGlvbnMKCiMgR3JvdXAtbGV2ZWwgTFIlIGFjcm9zcyBTT0FzIHZpc3VhbGl6YXRpb24KY2F0KCJHcm91cC1MZXZlbCBMZWZ0IFJlc3BvbnNlIFJhdGUgYnkgU09BXG4iKQoKbHJfYnlfc29hX3Bsb3QgPC0gZ2dwbG90KGdyb3VwX2xyX2J5X3NvYSwgYWVzKHggPSBTT0FfbXMsIHkgPSBsZWZ0X3Jlc3BvbnNlX3JhdGUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsZWZ0X3Jlc3BvbnNlX3JhdGUgLSBzZV9sciwgCiAgICAgICAgICAgICAgICAgIHltYXggPSBsZWZ0X3Jlc3BvbnNlX3JhdGUgKyBzZV9sciksIAogICAgICAgICAgICAgIGFscGhhID0gMC4zLCBmaWxsID0gIiM0RTc5QTciKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxLjIsIGNvbG9yID0gIiM0RTc5QTciKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgY29sb3IgPSAiIzRFNzlBNyIpICsKICBsYWJzKHggPSAiU09BIChtcykiLCB5ID0gIkxlZnQgUmVzcG9uc2UgUmF0ZSAoJSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoZ3JvdXBfeV9taW4sIGdyb3VwX3lfbWF4KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KGxyX2J5X3NvYV9wbG90KQoKIyBGaW5kIHBhcnRpY2lwYW50IGNsb3Nlc3QgdG8gZ3JvdXAgbWVhbiBhbmQgU0QKZ3JvdXBfbWVhbl9wc2UgPC0gbWVhbihsZWZ0X3Jlc3BvbnNlX3N1bW1hcnkkbWVhbl9wc2UsIG5hLnJtID0gVFJVRSkKZ3JvdXBfc2RfcHNlIDwtIHNkKGxlZnRfcmVzcG9uc2Vfc3VtbWFyeSRtZWFuX3BzZSwgbmEucm0gPSBUUlVFKQoKIyBDYWxjdWxhdGUgZGlzdGFuY2UgZnJvbSBncm91cCBtZWFuIGZvciBlYWNoIHBhcnRpY2lwYW50CnJlcHJlc2VudGF0aXZlX3BhcnRpY2lwYW50IDwtIGxlZnRfcmVzcG9uc2Vfc3VtbWFyeSAlPiUKICBtdXRhdGUoZGlzdGFuY2VfZnJvbV9tZWFuID0gYWJzKG1lYW5fcHNlIC0gZ3JvdXBfbWVhbl9wc2UpKSAlPiUKICBhcnJhbmdlKGRpc3RhbmNlX2Zyb21fbWVhbikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgcHVsbChwYXJ0aWNpcGFudCkKCiMgSW5kaXZpZHVhbC1sZXZlbCBMUiUgYWNyb3NzIFNPQXMgZm9yIHJlcHJlc2VudGF0aXZlIHBhcnRpY2lwYW50CmluZGl2aWR1YWxfbHJfYnlfc29hIDwtIGZpbmFsX2ZpbHRlcmVkX2RhdGEgJT4lCiAgZmlsdGVyKHBhcnRpY2lwYW50ID09IHJlcHJlc2VudGF0aXZlX3BhcnRpY2lwYW50KSAlPiUKICBncm91cF9ieShTT0FfbXMpICU+JQogIHN1bW1hcmlzZSgKICAgIG5fdHJpYWxzID0gbigpLAogICAgbGVmdF9yZXNwb25zZXMgPSBzdW0oY29ycmVjdGVkX0xSZGF0YSA9PSAxLCBuYS5ybSA9IFRSVUUpLAogICAgbGVmdF9yZXNwb25zZV9yYXRlID0gbWVhbihjb3JyZWN0ZWRfTFJkYXRhID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDAKICApICU+JQogIHVuZ3JvdXAoKQoKIyBDYWxjdWxhdGUgeS1heGlzIGxpbWl0cyBmb3IgaW5kaXZpZHVhbC1sZXZlbCBTT0EgcGxvdCAocHJvcGVyIHNjYWxpbmcgZm9yIHByb3BvcnRpb25zKQppbmRpdmlkdWFsX3JhbmdlIDwtIHJhbmdlKGluZGl2aWR1YWxfbHJfYnlfc29hJGxlZnRfcmVzcG9uc2VfcmF0ZSwgbmEucm0gPSBUUlVFKQppbmRpdmlkdWFsX3lfbWluIDwtIG1heCgwLCBpbmRpdmlkdWFsX3JhbmdlWzFdIC0gMC4wMiAqIDEwMCkgICMgQWxsb3cgLTIlIGJ1ZmZlciBmb3IgcHJvcG9ydGlvbnMKaW5kaXZpZHVhbF95X21heCA8LSBtaW4oMTAwLCBpbmRpdmlkdWFsX3JhbmdlWzJdICsgMC4wMiAqIDEwMCkgICMgQWxsb3cgKzIlIGJ1ZmZlciBmb3IgcHJvcG9ydGlvbnMKCiMgSW5kaXZpZHVhbC1sZXZlbCBMUiUgYWNyb3NzIFNPQXMgdmlzdWFsaXphdGlvbgpjYXQocGFzdGUoIkluZGl2aWR1YWwtTGV2ZWwgTGVmdCBSZXNwb25zZSBSYXRlIGJ5IFNPQSAtIFBhcnRpY2lwYW50IiwgcmVwcmVzZW50YXRpdmVfcGFydGljaXBhbnQsICJcbiIpKQoKaW5kaXZpZHVhbF9scl9wbG90IDwtIGdncGxvdChpbmRpdmlkdWFsX2xyX2J5X3NvYSwgYWVzKHggPSBTT0FfbXMsIHkgPSBsZWZ0X3Jlc3BvbnNlX3JhdGUpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxLjIsIGNvbG9yID0gIiNFMTU3NTkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgY29sb3IgPSAiI0UxNTc1OSIpICsKICBsYWJzKHggPSAiU09BIChtcykiLCB5ID0gIkxlZnQgUmVzcG9uc2UgUmF0ZSAoJSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoaW5kaXZpZHVhbF95X21pbiwgaW5kaXZpZHVhbF95X21heCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpCgpwcmludChpbmRpdmlkdWFsX2xyX3Bsb3QpCgojIERldHJlbmQgYW5kIGZpbHRlciB0aGUgZ3JvdXAtbGV2ZWwgdGltZSBzZXJpZXMgKDAtMzAwbXMpCmxpYnJhcnkoc2lnbmFsKQoKIyBDcmVhdGUgdGltZSBzZXJpZXMgZGF0YSBmb3IgZmlsdGVyaW5nIChTT0EgaW4gbXMgcmVwcmVzZW50cyB0aW1lKQpncm91cF90aW1lX3NlcmllcyA8LSBncm91cF9scl9ieV9zb2EgJT4lCiAgYXJyYW5nZShTT0FfbXMpICU+JQogIG11dGF0ZSgKICAgIHRpbWVfbXMgPSBTT0FfbXMsCiAgICBsZWZ0X3Jlc3BvbnNlX3JhdGVfcmF3ID0gbGVmdF9yZXNwb25zZV9yYXRlCiAgKQoKIyBGaWx0ZXIgdG8gMC0zMDBtcyB0aW1lIHdpbmRvdyBCRUZPUkUgZGV0cmVuZGluZwpncm91cF90aW1lX3Nlcmllc19lYXJseSA8LSBncm91cF90aW1lX3NlcmllcyAlPiUKICBkcGx5cjo6ZmlsdGVyKHRpbWVfbXMgPj0gMCwgdGltZV9tcyA8PSAzMDApICU+JQogIGRwbHlyOjphcnJhbmdlKHRpbWVfbXMpCgojIERldHJlbmQgdGhlIDAtMzAwbXMgZGF0YSB1c2luZyBzcGxpbmUgZGV0cmVuZGluZwpkZXRyZW5kZWRfZGF0YSA8LSBncm91cF90aW1lX3Nlcmllc19lYXJseSAlPiUKICBtdXRhdGUoCiAgICBsZWZ0X3Jlc3BvbnNlX3JhdGVfZGV0cmVuZGVkID0gcmVzaWR1YWxzKGxtKGxlZnRfcmVzcG9uc2VfcmF0ZV9yYXcgfiBzcGxpbmVzOjpucyh0aW1lX21zLCBkZiA9IDMpKSkKICApCgojIERlc2lnbiBCdXR0ZXJ3b3J0aCBmaWx0ZXIgKDQtMTggSHogYmFuZHBhc3MpCiMgQ29udmVydCBTT0EgdG8gdGltZSBzZXJpZXMgd2l0aCBhcHByb3ByaWF0ZSBzYW1wbGluZyByYXRlCiMgQXNzdW1pbmcgU09BIHJlcHJlc2VudHMgdGltZSBwb2ludHMsIHdlIG5lZWQgdG8gZXN0aW1hdGUgc2FtcGxpbmcgcmF0ZQp0aW1lX3JhbmdlX21zIDwtIG1heChncm91cF90aW1lX3Nlcmllc19lYXJseSR0aW1lX21zKSAtIG1pbihncm91cF90aW1lX3Nlcmllc19lYXJseSR0aW1lX21zKQpuX3BvaW50cyA8LSBucm93KGdyb3VwX3RpbWVfc2VyaWVzX2Vhcmx5KQplc3RpbWF0ZWRfc2FtcGxpbmdfcmF0ZSA8LSAobl9wb2ludHMgLSAxKSAvICh0aW1lX3JhbmdlX21zIC8gMTAwMCkgICMgSHoKCiMgVXNlIGEgcmVhc29uYWJsZSBzYW1wbGluZyByYXRlIGZvciB0aGUgdGltZSBzZXJpZXMKc2FtcGxpbmdfcmF0ZSA8LSAxMDAgICMgSHogKGFkanVzdCBpZiBuZWVkZWQpCm55cXVpc3RfZnJlcSA8LSBzYW1wbGluZ19yYXRlIC8gMgpsb3dfZnJlcSA8LSA0IC8gbnlxdWlzdF9mcmVxCmhpZ2hfZnJlcSA8LSAxOCAvIG55cXVpc3RfZnJlcQoKIyBDcmVhdGUgYmFuZHBhc3MgZmlsdGVyIChvcmRlciAyKQpidXR0ZXJfZmlsdGVyIDwtIGJ1dHRlcigyLCBjKGxvd19mcmVxLCBoaWdoX2ZyZXEpLCB0eXBlID0gInBhc3MiKQoKIyBBcHBseSBmaWx0ZXIgdG8gZGV0cmVuZGVkIGRhdGEKZ3JvdXBfdGltZV9zZXJpZXNfZmlsdGVyZWQgPC0gZGV0cmVuZGVkX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgbGVmdF9yZXNwb25zZV9yYXRlX2ZpbHRlcmVkID0gZmlsdGZpbHQoYnV0dGVyX2ZpbHRlciwgbGVmdF9yZXNwb25zZV9yYXRlX2RldHJlbmRlZCkKICApCgojIFVzZSB0aGUgZmlsdGVyZWQgdGltZSBzZXJpZXMgKGFscmVhZHkgMC0zMDBtcykgZm9yIGFsbCBhbmFseXNlcwpmdWxsX3RzIDwtIGdyb3VwX3RpbWVfc2VyaWVzX2ZpbHRlcmVkCgojIERldHJlbmRlZCBncm91cC1sZXZlbCBMUiUgYWNyb3NzIFNPQXMgKDAtMzAwbXMpCmNhdCgiR3JvdXAtTGV2ZWwgTGVmdCBSZXNwb25zZSBSYXRlIGJ5IFNPQSAtIERldHJlbmRlZCAoMC0zMDBtcylcbiIpCgojIENhbGN1bGF0ZSB5LWF4aXMgbGltaXRzIGZvciBkZXRyZW5kZWQgcGxvdCAoc3ltbWV0cmljIGFyb3VuZCAwIGZvciByZXNpZHVhbHMpCmRldHJlbmRlZF9yYW5nZSA8LSByYW5nZShncm91cF90aW1lX3Nlcmllc19maWx0ZXJlZCRsZWZ0X3Jlc3BvbnNlX3JhdGVfZGV0cmVuZGVkLCBuYS5ybSA9IFRSVUUpCmRldHJlbmRlZF95X2xpbWl0IDwtIG1heChhYnMoZGV0cmVuZGVkX3JhbmdlKSkgKiAxLjA1ICAjIMKxMS4wNcOXbWF4KHx5fCkgZm9yIHJlc2lkdWFscwoKZGV0cmVuZGVkX3Bsb3QgPC0gZ2dwbG90KGdyb3VwX3RpbWVfc2VyaWVzX2ZpbHRlcmVkLCBhZXMoeCA9IHRpbWVfbXMpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbGVmdF9yZXNwb25zZV9yYXRlX2RldHJlbmRlZCksIHNpemUgPSAxLjIsIGNvbG9yID0gIiM0RTc5QTciKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGxlZnRfcmVzcG9uc2VfcmF0ZV9kZXRyZW5kZWQpLCBzaXplID0gMywgY29sb3IgPSAiIzRFNzlBNyIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmF5NTAiKSArCiAgbGFicyh4ID0gIlNPQSAobXMpIiwgeSA9ICJMZWZ0IFJlc3BvbnNlIFJhdGUgUmVzaWR1YWxzICglKSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtZGV0cmVuZGVkX3lfbGltaXQsIGRldHJlbmRlZF95X2xpbWl0KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KGRldHJlbmRlZF9wbG90KQoKIyBDYWxjdWxhdGUgeS1heGlzIGxpbWl0cyBmb3IgZmlsdGVyZWQgcGxvdCAoc3ltbWV0cmljIGFyb3VuZCAwIGZvciByZXNpZHVhbHMpCmZpbHRlcmVkX3JhbmdlIDwtIHJhbmdlKGdyb3VwX3RpbWVfc2VyaWVzX2ZpbHRlcmVkJGxlZnRfcmVzcG9uc2VfcmF0ZV9maWx0ZXJlZCwgbmEucm0gPSBUUlVFKQpmaWx0ZXJlZF95X2xpbWl0IDwtIG1heChhYnMoZmlsdGVyZWRfcmFuZ2UpKSAqIDEuMDUgICMgwrExLjA1w5dtYXgofHl8KSBmb3IgcmVzaWR1YWxzCgojIEJ1dHRlcndvcnRoIGZpbHRlcmVkIGdyb3VwLWxldmVsIExSJSBhY3Jvc3MgU09BcyAoMC0zMDBtcykKY2F0KCJHcm91cC1MZXZlbCBMZWZ0IFJlc3BvbnNlIFJhdGUgYnkgU09BIC0gQnV0dGVyd29ydGggRmlsdGVyZWQgKDQtMTggSHosIDAtMzAwbXMpXG4iKQoKZmlsdGVyZWRfcGxvdCA8LSBnZ3Bsb3QoZ3JvdXBfdGltZV9zZXJpZXNfZmlsdGVyZWQsIGFlcyh4ID0gdGltZV9tcykpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBsZWZ0X3Jlc3BvbnNlX3JhdGVfZmlsdGVyZWQpLCBzaXplID0gMS4yLCBjb2xvciA9ICIjRTE1NzU5IikgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBsZWZ0X3Jlc3BvbnNlX3JhdGVfZmlsdGVyZWQpLCBzaXplID0gMywgY29sb3IgPSAiI0UxNTc1OSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmF5NTAiKSArCiAgbGFicyh4ID0gIlNPQSAobXMpIiwgeSA9ICJMZWZ0IFJlc3BvbnNlIFJhdGUgRmlsdGVyZWQgKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC1maWx0ZXJlZF95X2xpbWl0LCBmaWx0ZXJlZF95X2xpbWl0KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KGZpbHRlcmVkX3Bsb3QpCgojIE92ZXJsYXkgMTAgSHogc2ludXNvaWQgYW5kIGNvbXB1dGUgUl4yIGdvb2RuZXNzLW9mLWZpdCAoMC0zMDBtcykKY2F0KCIxMCBIeiBTaW51c29pZCBPdmVybGF5IGFuZCBSXjIgRml0ICgwLTMwMG1zKVxuIikKCiMgVGltZSB2ZWN0b3IgaW4gc2Vjb25kcwp0X3NlYyA8LSBncm91cF90aW1lX3Nlcmllc19maWx0ZXJlZCR0aW1lX21zIC8gMTAwMApmMCA8LSAxMCAgIyBIegoKIyBCdWlsZCByZWdyZXNzb3JzIGZvciBhIGZpeGVkLWZyZXF1ZW5jeSBzaW51c29pZDogeSB+IGEqc2luKDLPgGZ0KSArIGIqY29zKDLPgGZ0KQpzaW5fMTAgPC0gc2luKDIgKiBwaSAqIGYwICogdF9zZWMpCmNvc18xMCA8LSBjb3MoMiAqIHBpICogZjAgKiB0X3NlYykKCiMgUmVzcG9uc2UgaXMgdGhlIGZpbHRlcmVkIHJlc2lkdWFsIHNlcmllcyAoY2VudGVyZWQgYXJvdW5kIDApCnkgPC0gZ3JvdXBfdGltZV9zZXJpZXNfZmlsdGVyZWQkbGVmdF9yZXNwb25zZV9yYXRlX2ZpbHRlcmVkCgojIEZpdCBsaW5lYXIgbW9kZWwgdG8gb2J0YWluIGJlc3QtZml0dGluZyBhbXBsaXR1ZGUvcGhhc2UgYXQgMTAgSHoKc2ludXNvaWRfZml0IDwtIGxtKHkgfiBzaW5fMTAgKyBjb3NfMTApCnlfaGF0IDwtIGZpdHRlZChzaW51c29pZF9maXQpCgojIFJeMiBnb29kbmVzcyBvZiBmaXQKcnNzIDwtIHN1bSgoeSAtIHlfaGF0KV4yLCBuYS5ybSA9IFRSVUUpCnRzcyA8LSBzdW0oKHkgLSBtZWFuKHksIG5hLnJtID0gVFJVRSkpXjIsIG5hLnJtID0gVFJVRSkKcl9zcXVhcmVkXzEwaHogPC0gaWZlbHNlKHRzcyA+IDAsIDEgLSByc3MvdHNzLCBOQV9yZWFsXykKCiMgUGxvdCBvdmVybGF5Cm92ZXJsYXlfZGYgPC0gZGF0YS5mcmFtZSh0aW1lX21zID0gZ3JvdXBfdGltZV9zZXJpZXNfZmlsdGVyZWQkdGltZV9tcywKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkID0geSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdF8xMGh6ID0geV9oYXQpCgpvdmVybGF5X3Bsb3QgPC0gZ2dwbG90KG92ZXJsYXlfZGYsIGFlcyh4ID0gdGltZV9tcykpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBmaWx0ZXJlZCksIGNvbG9yID0gIiNFMTU3NTkiLCBsaW5ld2lkdGggPSAxLjEpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBmaXRfMTBoeiksIGNvbG9yID0gIiM1OUExNEYiLCBsaW5ld2lkdGggPSAxLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmF5NTAiKSArCiAgbGFicyh4ID0gIlNPQSAobXMpIiwgeSA9ICJMZWZ0IFJlc3BvbnNlIFJhdGUgRmlsdGVyZWQgKCUpIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKCnByaW50KG92ZXJsYXlfcGxvdCkKCiMgUHJpbnQgUl4yIHZhbHVlIGZvciByZWZlcmVuY2UKY2F0KHNwcmludGYoIlJeMiAoMTAgSHogc2ludXNvaWQgZml0KTogJS4zZlxuIiwgcl9zcXVhcmVkXzEwaHopKQoKIyBSRkZUIG9mIHRoZSBmaWx0ZXJlZCB0aW1lIHNlcmllcyAoMC0zMDBtcywgd2l0aCB6ZXJvIHBhZGRpbmcgZm9yIGJldHRlciByZXNvbHV0aW9uKQpjYXQoIlJGRlQgb2YgRmlsdGVyZWQgTGVmdCBSZXNwb25zZSBSYXRlICgwLTMwMG1zKVxuIikKCiMgUHJlcGFyZSBzaWduYWwgYW5kIGNvbXB1dGUgRkZUIChub3JtYWxpemUgdG8gdW5pdCB2YXJpYW5jZSkKc2lnbmFsX3RzIDwtIGdyb3VwX3RpbWVfc2VyaWVzX2ZpbHRlcmVkJGxlZnRfcmVzcG9uc2VfcmF0ZV9maWx0ZXJlZApzaWduYWxfdHMgPC0gYXMubnVtZXJpYyhzY2FsZShzaWduYWxfdHMsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkpCk4gPC0gbGVuZ3RoKHNpZ25hbF90cykKCiMgQXBwbHkgemVybyBwYWRkaW5nIChkb3VibGUgdGhlIGxlbmd0aCBmb3IgYmV0dGVyIGZyZXF1ZW5jeSByZXNvbHV0aW9uKQpOX3BhZGRlZCA8LSAyICogTgpzaWduYWxfcGFkZGVkIDwtIGMoc2lnbmFsX3RzLCByZXAoMCwgTikpCmZmdF92YWxzIDwtIGZmdChzaWduYWxfcGFkZGVkKSAgIyBjb21wbGV4IEZGVAoKIyBGcmVxdWVuY2llcyBjb3JyZXNwb25kaW5nIHRvIEZGVCBiaW5zCmZyZXFzIDwtICgwOihOX3BhZGRlZCAtIDEpKSAqIChzYW1wbGluZ19yYXRlIC8gTl9wYWRkZWQpCm55cSA8LSBzYW1wbGluZ19yYXRlIC8gMgoKIyBLZWVwIG5vbi1yZWR1bmRhbnQgcG9zaXRpdmUgZnJlcXVlbmNpZXMgKHJlYWwgRkZUIHBvcnRpb24pCmhhbGZfbiA8LSBmbG9vcihOX3BhZGRlZCAvIDIpICsgMQpmcmVxc19oYWxmIDwtIGZyZXFzWzE6aGFsZl9uXQpmZnRfaGFsZiA8LSBmZnRfdmFsc1sxOmhhbGZfbl0KCiMgQ29udmVydCB0byBzaW5nbGUtc2lkZWQgYW1wbGl0dWRlIHNwZWN0cnVtCmFtcGxpdHVkZSA8LSAoMiAvIE5fcGFkZGVkKSAqIE1vZChmZnRfaGFsZikKYW1wbGl0dWRlWzFdIDwtIGFtcGxpdHVkZVsxXSAvIDIgICMgREMgY29tcG9uZW50IHNob3VsZCBub3QgYmUgZG91YmxlZAoKIyBQbG90IGFtcGxpdHVkZSBzcGVjdHJ1bQpyZmZ0X3Bsb3QgPC0gZ2dwbG90KGRhdGEuZnJhbWUoZnJlcT1mcmVxc19oYWxmLCBhbXA9YW1wbGl0dWRlKSwgYWVzKHggPSBmcmVxLCB5ID0gYW1wKSkgKwogIGdlb21fbGluZShjb2xvciA9ICIjNEU3OUE3IiwgbGluZXdpZHRoID0gMS4xKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEU3OUE3Iiwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjcpICsKICBsYWJzKHggPSAiRnJlcXVlbmN5IChIeikiLCB5ID0gIkFtcGxpdHVkZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpCgpwcmludChyZmZ0X3Bsb3QpCgojIEZpbmQgcGVhayBmcmVxdWVuY2llcyBmcm9tIGdyb3VwLWxldmVsIEZGVApmZnRfZGF0YSA8LSBkYXRhLmZyYW1lKGZyZXEgPSBmcmVxc19oYWxmLCBhbXAgPSBhbXBsaXR1ZGUpCiMgRmlsdGVyIHRvIDQtMTggSHogcmFuZ2UgdG8gbWF0Y2ggb3VyIGFuYWx5c2lzCmZmdF9maWx0ZXJlZCA8LSBmZnRfZGF0YSAlPiUKICBmaWx0ZXIoZnJlcSA+PSA0LCBmcmVxIDw9IDE4KQoKIyBGaW5kIGxvY2FsIG1heGltYSAocGVha3MpCnBlYWtzIDwtIGZmdF9maWx0ZXJlZCAlPiUKICBtdXRhdGUoCiAgICBpc19wZWFrID0gYW1wID4gbGFnKGFtcCwgZGVmYXVsdCA9IDApICYgYW1wID4gbGVhZChhbXAsIGRlZmF1bHQgPSAwKQogICkgJT4lCiAgZmlsdGVyKGlzX3BlYWspICU+JQogIGFycmFuZ2UoZGVzYyhhbXApKSAlPiUKICBzbGljZV9oZWFkKG4gPSAzKSAgIyBHZXQgdG9wIDMgcGVha3MKCmNhdCgiUGVhayBmcmVxdWVuY2llcyBmcm9tIGdyb3VwLWxldmVsIEZGVDpcbiIpCnByaW50KHBlYWtzICU+JSBzZWxlY3QoZnJlcSwgYW1wKSkKCiMgR2V0IHRoZSB0d28gaGlnaGVzdCBwZWFrcwpwZWFrX2ZyZXFzIDwtIHBlYWtzJGZyZXFbMToyXQpjYXQoc3ByaW50ZigiVG9wIDIgcGVhayBmcmVxdWVuY2llczogJS4xZiBIeiBhbmQgJS4xZiBIelxuIiwgcGVha19mcmVxc1sxXSwgcGVha19mcmVxc1syXSkpCgojIEZyZXF1ZW5jeSBhbmFseXNpcyAoMC0zMDBtcykKY2F0KCJGcmVxdWVuY3kgYW5hbHlzaXMgKDAtMzAwbXMpXG4iKQoKIyBQZXJtdXRhdGlvbiB0ZXN0OiBzaHVmZmxlIHRpbWUgKHgpIDEwMDAgdGltZXMgYW5kIHJlY29tcHV0ZSBSXjIgYXQgMTAgSHogKDAtMzAwbXMgd2luZG93KQpzZXQuc2VlZCgxMjMpCm5fcGVybSA8LSAxMDAwCnIyX3Blcm0gPC0gcmVwbGljYXRlKG5fcGVybSwgewogIHRfcGVybSA8LSBzYW1wbGUodF9zZWMpCiAgc2lucCA8LSBzaW4oMiAqIHBpICogZjAgKiB0X3Blcm0pCiAgY29zcCA8LSBjb3MoMiAqIHBpICogZjAgKiB0X3Blcm0pCiAgZml0cCA8LSBsbSh5IH4gc2lucCArIGNvc3ApCiAgeWhhdHAgPC0gZml0dGVkKGZpdHApCiAgcnNzcCA8LSBzdW0oKHkgLSB5aGF0cCleMiwgbmEucm0gPSBUUlVFKQogIHRzc3AgPC0gc3VtKCh5IC0gbWVhbih5LCBuYS5ybSA9IFRSVUUpKV4yLCBuYS5ybSA9IFRSVUUpCiAgaWYgKHRzc3AgPiAwKSAxIC0gcnNzcC90c3NwIGVsc2UgTkFfcmVhbF8KfSkKCiMgRW1waXJpY2FsIHAtdmFsdWVzCnBfdmFsIDwtIG1lYW4ocjJfcGVybSA+PSByX3NxdWFyZWRfMTBoeiwgbmEucm0gPSBUUlVFKQpjYXQoc3ByaW50ZigiUGVybXV0YXRpb24gdGVzdCAoMC0zMDBtcywgbj0lZCk6IHAgPSAlLjRmXG4iLCBuX3Blcm0sIHBfdmFsKSkKCiMgUGVybXV0YXRpb24gaGlzdG9ncmFtIHdpdGggY3JpdGljYWwgdmFsdWUKY3JpdF92YWwgPC0gcXVhbnRpbGUocjJfcGVybSwgMC45NSwgbmEucm0gPSBUUlVFKQpjYXQoIkZyZXF1ZW5jeSBhbmFseXNpcyDigJMgMC0zMDBtcyBwZXJtdXRhdGlvbiB0ZXN0XG4iKQpwZXJtX2RmIDwtIGRhdGEuZnJhbWUocjIgPSByMl9wZXJtKQpwZXJtX2hpc3QgPC0gZ2dwbG90KHBlcm1fZGYsIGFlcyh4ID0gcjIpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQwLCBmaWxsID0gIiM0RTc5QTciLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC43KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcl9zcXVhcmVkXzEwaHosIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gIiNFMTU3NTkiLCBsaW5ld2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY3JpdF92YWwsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gIiM1OUExNEYiLCBsaW5ld2lkdGggPSAxKSArCiAgbGFicyh4ID0gIlJeMiAoMTAgSHogZml0LCBzaHVmZmxlZCB0aW1lcykiLCB5ID0gIkNvdW50IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKcHJpbnQocGVybV9oaXN0KQpjYXQoc3ByaW50ZigiQ3JpdGljYWwgdmFsdWUgKDk1dGggJSUgb2YgcGVybXV0ZWQgUl4yKTogJS4zZlxuIiwgY3JpdF92YWwpKQoKIyBQZXJtdXRhdGlvbiB0ZXN0cyBmb3IgcGVhayBmcmVxdWVuY2llcyBmcm9tIGdyb3VwLWxldmVsIEZGVCAoMC0zMDBtcykKY2F0KCJQZXJtdXRhdGlvbiB0ZXN0cyBmb3IgcGVhayBmcmVxdWVuY2llcyBmcm9tIGdyb3VwLWxldmVsIEZGVCAoMC0zMDBtcylcbiIpCgojIEZ1bmN0aW9uIHRvIGNvbXB1dGUgUl4yIGZvciBhIGdpdmVuIGZyZXF1ZW5jeQpjb21wdXRlX3IyIDwtIGZ1bmN0aW9uKGZyZXEsIHRfc2VjLCB5KSB7CiAgc2luX2ZyZXEgPC0gc2luKDIgKiBwaSAqIGZyZXEgKiB0X3NlYykKICBjb3NfZnJlcSA8LSBjb3MoMiAqIHBpICogZnJlcSAqIHRfc2VjKQogIGZpdCA8LSBsbSh5IH4gc2luX2ZyZXEgKyBjb3NfZnJlcSkKICB5X2hhdCA8LSBmaXR0ZWQoZml0KQogIHJzcyA8LSBzdW0oKHkgLSB5X2hhdCleMiwgbmEucm0gPSBUUlVFKQogIHRzcyA8LSBzdW0oKHkgLSBtZWFuKHksIG5hLnJtID0gVFJVRSkpXjIsIG5hLnJtID0gVFJVRSkKICBpZiAodHNzID4gMCkgMSAtIHJzcy90c3MgZWxzZSBOQV9yZWFsXwp9CgojIFJ1biBwZXJtdXRhdGlvbiB0ZXN0cyBmb3IgZWFjaCBwZWFrIGZyZXF1ZW5jeQpmb3IgKGkgaW4gMTpsZW5ndGgocGVha19mcmVxcykpIHsKICBjdXJyZW50X2ZyZXEgPC0gcGVha19mcmVxc1tpXQogIGNhdChzcHJpbnRmKCJcblBlYWsgZnJlcXVlbmN5ICUuMWYgSHogcGVybXV0YXRpb24gdGVzdDpcbiIsIGN1cnJlbnRfZnJlcSkpCiAgCiAgIyBDb21wdXRlIG9ic2VydmVkIFJeMgogIHIyX29ic2VydmVkIDwtIGNvbXB1dGVfcjIoY3VycmVudF9mcmVxLCB0X3NlYywgeSkKICBjYXQoc3ByaW50ZigiT2JzZXJ2ZWQgUl4yICglLjFmIEh6KTogJS4zZlxuIiwgY3VycmVudF9mcmVxLCByMl9vYnNlcnZlZCkpCiAgCiAgIyBQZXJtdXRhdGlvbiB0ZXN0CiAgc2V0LnNlZWQoMTIzICsgaSkgICMgRGlmZmVyZW50IHNlZWQgZm9yIGVhY2ggZnJlcXVlbmN5CiAgcjJfcGVybV9wZWFrIDwtIHJlcGxpY2F0ZShuX3Blcm0sIHsKICAgIHRfcGVybSA8LSBzYW1wbGUodF9zZWMpCiAgICBjb21wdXRlX3IyKGN1cnJlbnRfZnJlcSwgdF9wZXJtLCB5KQogIH0pCiAgCiAgIyBFbXBpcmljYWwgcC12YWx1ZQogIHBfdmFsX3BlYWsgPC0gbWVhbihyMl9wZXJtX3BlYWsgPj0gcjJfb2JzZXJ2ZWQsIG5hLnJtID0gVFJVRSkKICBjYXQoc3ByaW50ZigiUGVybXV0YXRpb24gdGVzdCBwLXZhbHVlOiAlLjRmXG4iLCBwX3ZhbF9wZWFrKSkKICAKICAjIENyaXRpY2FsIHZhbHVlCiAgY3JpdF92YWxfcGVhayA8LSBxdWFudGlsZShyMl9wZXJtX3BlYWssIDAuOTUsIG5hLnJtID0gVFJVRSkKICBjYXQoc3ByaW50ZigiQ3JpdGljYWwgdmFsdWUgKDk1dGggJSUpOiAlLjNmXG4iLCBjcml0X3ZhbF9wZWFrKSkKICAKICAjIFNpZ25pZmljYW5jZSBpbmRpY2F0b3IKICBzaWdfZmxhZyA8LSByMl9vYnNlcnZlZCA+IGNyaXRfdmFsX3BlYWsKICBjYXQoc3ByaW50ZigiU2lnbmlmaWNhbnQ6ICVzXG4iLCBpZmVsc2Uoc2lnX2ZsYWcsICJZZXMiLCAiTm8iKSkpCiAgCiAgIyBQbG90IHBlcm11dGF0aW9uIGhpc3RvZ3JhbSBmb3IgdGhpcyBwZWFrIGZyZXF1ZW5jeQogIHBlcm1fZGZfcGVhayA8LSBkYXRhLmZyYW1lKHIyID0gcjJfcGVybV9wZWFrKQogIHBlcm1faGlzdF9wZWFrIDwtIGdncGxvdChwZXJtX2RmX3BlYWssIGFlcyh4ID0gcjIpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gNDAsIGZpbGwgPSAiIzRFNzlBNyIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHIyX29ic2VydmVkLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICIjRTE1NzU5IiwgbGluZXdpZHRoID0gMSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY3JpdF92YWxfcGVhaywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiIzU5QTE0RiIsIGxpbmV3aWR0aCA9IDEpICsKICAgIGxhYnMoeCA9IHNwcmludGYoIlJeMiAoJS4xZiBIeiBmaXQsIHNodWZmbGVkIHRpbWVzKSIsIGN1cnJlbnRfZnJlcSksIHkgPSAiQ291bnQiKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkKICAKICBjYXQoc3ByaW50ZigiRnJlcXVlbmN5IGFuYWx5c2lzIOKAkyAlLjFmIEh6IHBlcm11dGF0aW9uIHRlc3RcbiIsIGN1cnJlbnRfZnJlcSkpCiAgcHJpbnQocGVybV9oaXN0X3BlYWspCn0KYGBgCgojIyBJbmRpdmlkdWFsLUxldmVsIEZyZXF1ZW5jeSBBbmFseXNpcwoKYGBge3IgaW5kaXZpZHVhbC1mcmVxdWVuY3l9CgojIFByZXBhcmUgaGVscGVyIHRvIGJ1aWxkIHBlci1wYXJ0aWNpcGFudCBmaWx0ZXJlZCByZXNpZHVhbCBzZXJpZXMKZnMgPC0gMTAwCm55cSA8LSBmcyAvIDIKbG93IDwtIDQgLyBueXEKaGlnaCA8LSAxOCAvIG55cQpidXR0ZXJfZmlsdGVyX2luZCA8LSBzaWduYWw6OmJ1dHRlcigyLCBjKGxvdywgaGlnaCksIHR5cGUgPSAicGFzcyIpCgpwYXJ0aWNpcGFudHMgPC0gc29ydCh1bmlxdWUoZmluYWxfZmlsdGVyZWRfZGF0YSRwYXJ0aWNpcGFudCkpCgppbmRfZmZ0X2RmIDwtIHB1cnJyOjptYXBfZGZyKHBhcnRpY2lwYW50cywgZnVuY3Rpb24ocGlkKSB7CiAgdHNfcCA8LSBmaW5hbF9maWx0ZXJlZF9kYXRhICU+JQogICAgZHBseXI6OmZpbHRlcihwYXJ0aWNpcGFudCA9PSBwaWQpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KFNPQV9tcykgJT4lCiAgICBkcGx5cjo6c3VtbWFyaXNlKGxlZnRfcmVzcG9uc2VfcmF0ZSA9IG1lYW4oY29ycmVjdGVkX0xSZGF0YSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIGRwbHlyOjphcnJhbmdlKFNPQV9tcykKCiAgaWYgKG5yb3codHNfcCkgPCAzKSByZXR1cm4oTlVMTCkKCiAgIyBGaWx0ZXIgdG8gMC0zMDBtcyB3aW5kb3cKICB0c19wX2Vhcmx5IDwtIHRzX3AgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFNPQV9tcyA+PSAwLCBTT0FfbXMgPD0gMzAwKQoKICBpZiAobnJvdyh0c19wX2Vhcmx5KSA8IDMpIHJldHVybihOVUxMKQoKICAjIERldHJlbmQgKHNwbGluZSkgYW5kIGZpbHRlcgogIG0gPC0gbG0obGVmdF9yZXNwb25zZV9yYXRlIH4gc3BsaW5lczo6bnMoU09BX21zLCBkZiA9IDMpLCBkYXRhID0gdHNfcF9lYXJseSkKICByZXNpZF9wIDwtIHJlc2lkdWFscyhtKQogIGZpbHRfcCA8LSBhcy5udW1lcmljKHNpZ25hbDo6ZmlsdGZpbHQoYnV0dGVyX2ZpbHRlcl9pbmQsIHJlc2lkX3ApKQoKICAjIFVzZSAwLTMwMG1zIGZpbHRlcmVkIHRpbWUgc2VyaWVzIHdpdGggemVybyBwYWRkaW5nCiAgeV9mdWxsIDwtIGZpbHRfcAogICMgbm9ybWFsaXplIHRvIHVuaXQgdmFyaWFuY2UgZm9yIGNvbXBhcmFibGUgRkZUIGFtcGxpdHVkZXMKICB5X2Z1bGwgPC0gYXMubnVtZXJpYyhzY2FsZSh5X2Z1bGwsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkpCgogICMgQXBwbHkgemVybyBwYWRkaW5nIChkb3VibGUgdGhlIGxlbmd0aCBmb3IgYmV0dGVyIGZyZXF1ZW5jeSByZXNvbHV0aW9uKQogIE4gPC0gbGVuZ3RoKHlfZnVsbCkKICBOX3BhZGRlZCA8LSAyICogTgogIHlfcGFkZGVkIDwtIGMoeV9mdWxsLCByZXAoMCwgTikpCiAgCiAgZnJlcXMgPC0gKDA6KE5fcGFkZGVkIC0gMSkpICogKGZzIC8gTl9wYWRkZWQpCiAgaGFsZiA8LSBmbG9vcihOX3BhZGRlZCAvIDIpICsgMQogIGZyZXFzX2ggPC0gZnJlcXNbMTpoYWxmXQogIGFtcCA8LSAoMiAvIE5fcGFkZGVkKSAqIE1vZChmZnQoeV9wYWRkZWQpKVsxOmhhbGZdCiAgYW1wWzFdIDwtIGFtcFsxXSAvIDIKCiAgdGliYmxlOjp0aWJibGUocGFydGljaXBhbnQgPSBwaWQsIGZyZXEgPSBmcmVxc19oLCBhbXAgPSBhbXApCn0pCgojIFBsb3QgaW5kaXZpZHVhbCBzcGVjdHJhIChvdmVybGF5LCBjb2xvci1jb2RlZCksIGxpbWl0ZWQgdG8gMOKAkzIwIEh6CmlmIChucm93KGluZF9mZnRfZGYpID4gMCkgewogIGluZF9mZnRfcGxvdCA8LSBnZ3Bsb3QoaW5kX2ZmdF9kZiwgYWVzKHggPSBmcmVxLCB5ID0gYW1wLCBncm91cCA9IHBhcnRpY2lwYW50LCBjb2xvciA9IHBhcnRpY2lwYW50KSkgKwogICAgZ2VvbV9saW5lKGFscGhhID0gMC44KSArCiAgICBsYWJzKHggPSAiRnJlcXVlbmN5IChIeikiLCB5ID0gIkFtcGxpdHVkZSIpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDIwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICBjYXQoIkluZGl2aWR1YWwtTGV2ZWwgMC0zMDBtcyBSRkZUICg04oCTMTggSHogZmlsdGVyZWQgcmVzaWR1YWxzKVxuIikKICBwcmludChpbmRfZmZ0X3Bsb3QpCgogICMgRGlzdHJpYnV0aW9uIG9mIHBvd2VyIGFjcm9zcyA0LTE4IEh6IGZyZXF1ZW5jaWVzIGZvciBhbGwgcGFydGljaXBhbnRzICgwLTMwMG1zKQogIGNhdCgiRGlzdHJpYnV0aW9uIG9mIFBvd2VyIEFjcm9zcyA0LTE4IEh6IEZyZXF1ZW5jaWVzIGZvciBBbGwgUGFydGljaXBhbnRzICgwLTMwMG1zKVxuIikKCiAgIyBDcmVhdGUgYSBjb21wcmVoZW5zaXZlIHBvd2VyIGRpc3RyaWJ1dGlvbiBwbG90CiAgaWYgKG5yb3coaW5kX2ZmdF9kZikgPiAwKSB7CiAgICAjIEZpbHRlciB0byA0LTE4IEh6IHJhbmdlIGFuZCByb3VuZCBmcmVxdWVuY2llcyB0byAxIGRlY2ltYWwgZm9yIGNsZWFuZXIgbGFiZWxzCiAgICBpbmRfZmZ0X2RmX3JvdW5kZWQgPC0gaW5kX2ZmdF9kZiAlPiUKICAgICAgZmlsdGVyKGZyZXEgPj0gNCwgZnJlcSA8PSAxOCkgJT4lCiAgICAgIG11dGF0ZShmcmVxX3JvdW5kZWQgPSByb3VuZChmcmVxLCAxKSkKICAgIAogICAgIyBDcmVhdGUgZmFjZXRlZCBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIHBsb3QgKHNpbWlsYXIgdG8gcGVybXV0YXRpb24gRkZUIGFuYWx5c2lzKQogICAgYWxsX2ZyZXFfcG93ZXJfcGxvdCA8LSBnZ3Bsb3QoaW5kX2ZmdF9kZl9yb3VuZGVkLCBhZXMoeCA9IGFtcCwgZmlsbCA9IGZhY3RvcihmcmVxX3JvdW5kZWQpKSkgKwogICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzAsIGFscGhhID0gMC43LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsKICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZ3JheTQwIiwgc2l6ZSA9IDEpICsKICAgICAgZmFjZXRfd3JhcCh+ZnJlcV9yb3VuZGVkLCBzY2FsZXMgPSAiZnJlZV94IiwgbmNvbCA9IDMpICsKICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzRFNzlBNyIsICIjRjI4RTJCIiwgIiNFMTU3NTkiLCAiIzU5QTE0RiIsICIjNzZCN0IyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0IwN0FBMSIsICIjRkY5REE3IiwgIiM5Qzc1NUYiLCAiI0JBQjBBQyIsICIjRkZDMENCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRERBMEREIiwgIiM5OEZCOTgiLCAiI0YwRTY4QyIsICIjRkZCNkMxIiwgIiM4N0NFRUIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNEMjY5MUUiLCAiI0RDMTQzQyIsICIjMzJDRDMyIiwgIiNGRkQ3MDAiLCAiIzkzNzBEQiIpKSArCiAgICAgIGxhYnMoeCA9ICJBbXBsaXR1ZGUiLCB5ID0gIkNvdW50IikgKwogICAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJsaWdodGdyYXkiKSwKICAgICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkKICAgIAogICAgcHJpbnQoYWxsX2ZyZXFfcG93ZXJfcGxvdCkKICAgIAogICAgIyBBbHNvIGNyZWF0ZSBhIHN1bW1hcnkgdGFibGUgb2YgbWVhbiBwb3dlciBieSBmcmVxdWVuY3kKICAgIGZyZXFfc3VtbWFyeSA8LSBpbmRfZmZ0X2RmX3JvdW5kZWQgJT4lCiAgICAgIGdyb3VwX2J5KGZyZXFfcm91bmRlZCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX2FtcCA9IG1lYW4oYW1wLCBuYS5ybSA9IFRSVUUpLAogICAgICAgIHNkX2FtcCA9IHNkKGFtcCwgbmEucm0gPSBUUlVFKSwKICAgICAgICBuX3BhcnRpY2lwYW50cyA9IG4oKSwKICAgICAgICAuZ3JvdXBzID0gImRyb3AiCiAgICAgICkgJT4lCiAgICAgIGFycmFuZ2UoZnJlcV9yb3VuZGVkKQogICAgCiAgICBjYXQoIlN1bW1hcnkgb2YgUG93ZXIgYnkgRnJlcXVlbmN5OlxuIikKICAgIHByaW50KGZyZXFfc3VtbWFyeSkKICAgIAogICAgIyBCb290c3RyYXAgYW5hbHlzaXMgZm9yIGFsbCBmcmVxdWVuY2llcyAoNTAwMCBpdGVyYXRpb25zLCAwLTMwMG1zKQogICAgY2F0KCJCb290c3RyYXAgQW5hbHlzaXMgb2YgUG93ZXIgVmFsdWVzIEFjcm9zcyBBbGwgRnJlcXVlbmNpZXMgKDAtMzAwbXMpXG4iKQogICAgCiAgICAjIEdldCB1bmlxdWUgZnJlcXVlbmNpZXMgLSB1c2UgdGhlIGFjdHVhbCBmcmVxdWVuY2llcywgbm90IHJvdW5kZWQgb25lcwogICAgdW5pcXVlX2ZyZXFzIDwtIHVuaXF1ZShpbmRfZmZ0X2RmJGZyZXEpCiAgICAjIEZpbHRlciB0byA0LTE4IEh6IHJhbmdlCiAgICB1bmlxdWVfZnJlcXMgPC0gdW5pcXVlX2ZyZXFzW3VuaXF1ZV9mcmVxcyA+PSA0ICYgdW5pcXVlX2ZyZXFzIDw9IDE4XQogICAgbl9wYXJ0aWNpcGFudHMgPC0gbGVuZ3RoKHVuaXF1ZShpbmRfZmZ0X2RmJHBhcnRpY2lwYW50KSkKICAgIAogICAgIyBJbml0aWFsaXplIHJlc3VsdHMgc3RvcmFnZQogICAgYm9vdHN0cmFwX3Jlc3VsdHMgPC0gZGF0YS5mcmFtZSgpCiAgICAKICAgICMgUGVyZm9ybSBib290c3RyYXAgZm9yIGVhY2ggZnJlcXVlbmN5CiAgICBmb3IgKGN1cnJlbnRfZnJlcSBpbiB1bmlxdWVfZnJlcXMpIHsKICAgICAgIyBHZXQgYW1wbGl0dWRlIHZhbHVlcyBmb3IgdGhpcyBmcmVxdWVuY3kgLSB1c2UgYWN0dWFsIGZyZXF1ZW5jaWVzCiAgICAgIGZyZXFfZGF0YSA8LSBpbmRfZmZ0X2RmICU+JQogICAgICAgIGZpbHRlcihhYnMoZnJlcSAtIGN1cnJlbnRfZnJlcSkgPCAwLjAxKSAlPiUgICMgVXNlIHNtYWxsIHRvbGVyYW5jZSBmb3IgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbgogICAgICAgIHB1bGwoYW1wKQogICAgICAKICAgICAgIyBDaGVjayBpZiB3ZSBoYXZlIHZhbGlkIGRhdGEgZm9yIHRoaXMgZnJlcXVlbmN5CiAgICAgIGlmIChsZW5ndGgoZnJlcV9kYXRhKSA+IDAgJiYgIWFsbChpcy5uYShmcmVxX2RhdGEpKSkgewogICAgICAgICMgVXNlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBmb3IgdGhpcyBmcmVxdWVuY3kKICAgICAgICBzYW1wbGVfc2l6ZSA8LSBsZW5ndGgoZnJlcV9kYXRhKQogICAgICAgIAogICAgICAgICMgQm9vdHN0cmFwIHdpdGggNTAwMCBpdGVyYXRpb25zLCB1c2luZyBhdmFpbGFibGUgc2FtcGxlIHNpemUKICAgICAgICBzZXQuc2VlZCgxMjMpICAjIEZvciByZXByb2R1Y2liaWxpdHkKICAgICAgICBib290c3RyYXBfbWVhbnMgPC0gcmVwbGljYXRlKDUwMDAsIHsKICAgICAgICAgIHNhbXBsZShmcmVxX2RhdGEsIHNpemUgPSBzYW1wbGVfc2l6ZSwgcmVwbGFjZSA9IFRSVUUpICU+JSBtZWFuKG5hLnJtID0gVFJVRSkKICAgICAgICB9KQogICAgICAgIAogICAgICAgICMgU3RvcmUgcmVzdWx0cyB3aXRoIHJvdW5kZWQgZnJlcXVlbmN5CiAgICAgICAgZnJlcV9yZXN1bHRzIDwtIGRhdGEuZnJhbWUoCiAgICAgICAgICBmcmVxdWVuY3kgPSByb3VuZChjdXJyZW50X2ZyZXEsIDEpLAogICAgICAgICAgYm9vdHN0cmFwcGVkX21lYW4gPSBib290c3RyYXBfbWVhbnMKICAgICAgICApCiAgICAgICAgCiAgICAgICAgYm9vdHN0cmFwX3Jlc3VsdHMgPC0gcmJpbmQoYm9vdHN0cmFwX3Jlc3VsdHMsIGZyZXFfcmVzdWx0cykKICAgICAgfQogICAgfQogICAgCiAgICAjIENoZWNrIGlmIHdlIGhhdmUgdmFsaWQgYm9vdHN0cmFwIHJlc3VsdHMgYmVmb3JlIHBsb3R0aW5nCiAgICBpZiAobnJvdyhib290c3RyYXBfcmVzdWx0cykgPiAwKSB7CiAgICAgICMgQ3JlYXRlIG92ZXJsYWlkIGRlbnNpdHkgcGxvdCAobW91bnRhaW4gcGxvdCkgb2YgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbnMKICAgICAgYm9vdHN0cmFwX3Bsb3QgPC0gZ2dwbG90KGJvb3RzdHJhcF9yZXN1bHRzLCBhZXMoeCA9IGJvb3RzdHJhcHBlZF9tZWFuLCBmaWxsID0gZmFjdG9yKGZyZXF1ZW5jeSksIGNvbG9yID0gZmFjdG9yKGZyZXF1ZW5jeSkpKSArCiAgICAgICAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC40LCBsaW5ld2lkdGggPSAwLjgpICsKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJncmF5NDAiLCBzaXplID0gMC41KSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFmNzdiNCIsICIjZmY3ZjBlIiwgIiMyY2EwMmMiLCAiI2Q2MjcyOCIsICIjOTQ2N2JkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM4YzU2NGIiLCAiI2UzNzdjMiIsICIjN2Y3ZjdmIiwgIiNiY2JkMjIiLCAiIzE3YmVjZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjYWVjN2U4IiwgIiNmZmJiNzgiLCAiIzk4ZGY4YSIsICIjZmY5ODk2IiwgIiNjNWIwZDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2M0OWM5NCIsICIjZjdiNmQyIiwgIiNjN2M3YzciLCAiI2RiZGI4ZCIsICIjOWVkYWU1IikpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFmNzdiNCIsICIjZmY3ZjBlIiwgIiMyY2EwMmMiLCAiI2Q2MjcyOCIsICIjOTQ2N2JkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjOGM1NjRiIiwgIiNlMzc3YzIiLCAiIzdmN2Y3ZiIsICIjYmNiZDIyIiwgIiMxN2JlY2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNhZWM3ZTgiLCAiI2ZmYmI3OCIsICIjOThkZjhhIiwgIiNmZjk4OTYiLCAiI2M1YjBkNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI2M0OWM5NCIsICIjZjdiNmQyIiwgIiNjN2M3YzciLCAiI2RiZGI4ZCIsICIjOWVkYWU1IikpICsKICAgICAgICBsYWJzKHggPSAiQm9vdHN0cmFwcGVkIE1lYW4gQW1wbGl0dWRlIiwgeSA9ICJEZW5zaXR5IiwgZmlsbCA9ICJGcmVxdWVuY3kgKEh6KSIsIGNvbG9yID0gIkZyZXF1ZW5jeSAoSHopIikgKwogICAgICAgIHRoZW1lX21pbmltYWwoKSArCiAgICAgICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwKICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpCiAgICAgIAogICAgICBwcmludChib290c3RyYXBfcGxvdCkKICAgIH0gZWxzZSB7CiAgICAgIGNhdCgiTm8gdmFsaWQgYm9vdHN0cmFwIHJlc3VsdHMgdG8gcGxvdC5cbiIpCiAgICB9CiAgICAKICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSBib290c3RyYXAgcmVzdWx0cyBhbmQgY3JlYXRlIHN1bW1hcnkKICAgIGlmIChucm93KGJvb3RzdHJhcF9yZXN1bHRzKSA+IDApIHsKICAgICAgIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGJvb3RzdHJhcCByZXN1bHRzCiAgICAgIGJvb3RzdHJhcF9zdW1tYXJ5IDwtIGJvb3RzdHJhcF9yZXN1bHRzICU+JQogICAgICAgIGdyb3VwX2J5KGZyZXF1ZW5jeSkgJT4lCiAgICAgICAgc3VtbWFyaXNlKAogICAgICAgICAgbWVhbl9ib290c3RyYXAgPSBtZWFuKGJvb3RzdHJhcHBlZF9tZWFuLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgc2RfYm9vdHN0cmFwID0gc2QoYm9vdHN0cmFwcGVkX21lYW4sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICBjaV9sb3dlciA9IHF1YW50aWxlKGJvb3RzdHJhcHBlZF9tZWFuLCAwLjAyNSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgIGNpX3VwcGVyID0gcXVhbnRpbGUoYm9vdHN0cmFwcGVkX21lYW4sIDAuOTc1LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIgogICAgICAgICkgJT4lCiAgICAgICAgYXJyYW5nZShmcmVxdWVuY3kpCiAgICAgIAogICAgICBjYXQoIkJvb3RzdHJhcCBTdW1tYXJ5IFN0YXRpc3RpY3MgKDk1JSBDSSk6XG4iKQogICAgICBwcmludChib290c3RyYXBfc3VtbWFyeSkKICAgIH0gZWxzZSB7CiAgICAgIGNhdCgiTm8gYm9vdHN0cmFwIHJlc3VsdHMgYXZhaWxhYmxlIGZvciBzdW1tYXJ5IHN0YXRpc3RpY3MuXG4iKQogICAgfQogIH0KfSBlbHNlIHsKICBjYXQoIk5vIHBhcnRpY2lwYW50cyB3aXRoIHN1ZmZpY2llbnQgc2FtcGxlcyBpbiAwLTMwMG1zIHRpbWUgc2VyaWVzLlxuIikKfQpgYGAK