Recording Keeping: There are two master files that we are
using for analyses. They are essentially the same file, though one is in
wide format and the other is in long format.
The wide format dataset is called “Purrble_Wide_Final.” The long
dataset format dataset is called “NoDup_PurrbleAnon.”
This dataset includes the N=154 participants who were included in the
randomized control trial examining Purrble with a population of
university students, with an emphasis on the LGTBQ+ community.
Participation in Each Week over Time Note: Weeks 1-3
were considered “pre-test.” Purrble was given (or not) after week 3.
Weeks 11-13 are considered “Post-test”.
### **Number of Participants in Each Condition**
Participant Counts by Condition
| Purrble |
76 |
| Waitlist Control |
78 |
### **Completion Counts Over Time**
Number of Participants Completing Each Week
| 1 |
147 |
| 2 |
149 |
| 3 |
150 |
| 4 |
141 |
| 5 |
139 |
| 6 |
139 |
| 7 |
139 |
| 8 |
142 |
| 9 |
127 |
| 10 |
128 |
| 11 |
128 |
| 12 |
118 |
| 13 |
131 |

Attrition Analysis by Condition Attrition is defined
as dropping out of study prior to Week 11. We checked to examine whether
there were differences in drop out for the Waitlist and Treatment
groups. Result: No difference in attrition by group
### **Attrition Analysis by Condition (Prior to Week 11)**
Descriptive Statistics for Attrition by Condition
| Purrble Treatment |
76 |
0.0921053 |
0.2910959 |
| Waitlist Control |
78 |
0.0641026 |
0.2465209 |
### **T-Test Results**
T-Test Comparing Attrition by Condition
| 0.0921053 |
0.0641026 |
0.6434268 |
0.5209519 |
-0.0580069 |
0.1140123 |
Demographics Descriptive Statistics by Condition
Gender and Sexual Identities by
Condition
Frequency Table of Gender Identity by Condition
| Cisgender |
39 |
37 |
| Transgender/genderdiverse |
37 |
40 |
| NA |
0 |
1 |
Frequency Table of Sexual Orientation by Condition
| Asexual |
13 |
9 |
| Bisexual |
28 |
25 |
| Demisexual |
2 |
1 |
| Gay/lesbian |
11 |
18 |
| Heterosexual |
1 |
0 |
| Pansexual |
8 |
10 |
| Queer |
13 |
15 |
Race and Nationality by Condition*
Frequency Table of Race Variables by Condition
| Race_Asian |
10 |
17 |
| Race_Arabic |
0 |
1 |
| Race_Black |
1 |
3 |
| Race_Hispanic |
2 |
0 |
| Race_Pacific |
0 |
0 |
| Race_White |
59 |
55 |
| Race_unknown |
9 |
6 |
4 people in the Purrble condition reported multiple racial/ethnic identities
4 people in the Waitlist Control condition reported multiple racial/ethnic identities
Frequency Table of Nationality by Condition
| British |
35 |
36 |
| British-Carribean |
1 |
1 |
| British-Indian |
1 |
0 |
| Chinese |
1 |
5 |
| Filipino |
1 |
0 |
| Indian |
3 |
5 |
| Irish |
1 |
1 |
| Irish-American |
1 |
0 |
| Mexican |
1 |
0 |
| NR |
28 |
21 |
| Pakistani |
1 |
0 |
| Polish |
2 |
2 |
| Bangladeshi |
0 |
1 |
| British-Japanese |
0 |
1 |
| British-Pakistani |
0 |
1 |
| Indonesian |
0 |
1 |
| Iranian |
0 |
1 |
| Irish-Carribean |
0 |
1 |
| Malaysian Chinese |
0 |
1 |
Age by Condition The table below presents age
descriptives by condition. A t-test was conducted to determine whether
there were baseline differences in age. There were no significant
differences between the two conditions.
### **Age by Condition (Baseline)**
Descriptive Statistics for Age by Condition
| X11 |
Purrble |
76 |
20.40789 |
2.281389 |
16 |
25 |
| X12 |
Waitlist Control |
78 |
20.06410 |
2.456583 |
16 |
25 |
### **T-test for Age by Condition**
T-test Results for Age by Condition
| 20.40789 |
20.0641 |
0.9001998 |
0.3694412 |
-0.410752 |
1.098336 |
### **Cohen's d for Age by Condition**
Effect Size (Cohen’s d) for Age by Condition
| 0.1449526 |
-0.1716078 |
0.4610376 |
Preliminary Analyses First, we want to check to
see if there are any differences in the outcome(s) of interest at
baseline, by chance Result:* No difference in baseline pre-test
measures- woo!
Baseline differences in study outcomes by condition
### **Pre-Test Descriptive Statistics**
Descriptive Statistics for Pre-Test Data
| Pre_DERS8_Sum |
153 |
28.136 |
4.705 |
14.333 |
38.333 |
-0.413 |
-0.122 |
| Pre_GAD7_Sum |
153 |
13.715 |
3.976 |
3.000 |
22.000 |
-0.167 |
-0.441 |
| Pre_PHQ9_Sum |
153 |
15.031 |
4.569 |
3.000 |
26.667 |
-0.011 |
-0.086 |
| Pre_SHS_Pathways |
149 |
13.292 |
4.284 |
3.000 |
24.000 |
-0.136 |
-0.403 |
| Pre_SHS_Agency |
149 |
10.708 |
4.929 |
3.000 |
24.000 |
0.339 |
-0.645 |
| Pre_SHS_TotalHope |
149 |
24.000 |
8.325 |
8.000 |
46.000 |
0.282 |
-0.289 |
| Pre_ucla_Sum |
148 |
7.095 |
1.618 |
3.000 |
9.000 |
-0.506 |
-0.662 |
| Pre_pmerq_Focus_Avg |
149 |
2.737 |
1.059 |
1.000 |
6.000 |
0.421 |
-0.076 |
| Pre_pmerq_Distract_Avg |
149 |
4.222 |
1.127 |
1.000 |
6.000 |
-0.833 |
0.616 |
| Pre_pmerq_AD_Avg |
149 |
3.480 |
0.923 |
1.000 |
6.000 |
-0.320 |
0.504 |
### **Post-Test Descriptive Statistics**
Descriptive Statistics for Post-Test Data
| Post_DERS8_Sum |
142 |
26.965 |
7.318 |
8 |
40 |
-0.264 |
-0.821 |
| Post_GAD7_Sum |
142 |
12.630 |
4.980 |
1 |
22 |
-0.080 |
-0.761 |
| Post_PHQ9_Sum |
142 |
14.326 |
6.310 |
0 |
27 |
-0.009 |
-0.682 |
| Post_SHS_Pathways |
131 |
14.664 |
4.309 |
3 |
24 |
-0.248 |
-0.455 |
| Post_SHS_Agency |
131 |
12.626 |
5.213 |
3 |
24 |
-0.004 |
-0.846 |
| Post_SHS_TotalHope |
131 |
27.290 |
8.796 |
6 |
47 |
-0.043 |
-0.488 |
| Post_ucla_Sum |
131 |
6.802 |
1.703 |
3 |
9 |
-0.415 |
-0.682 |
| Post_pmerq_Focus_Avg |
130 |
2.992 |
1.193 |
1 |
6 |
0.282 |
-0.322 |
| Post_pmerq_Distract_Avg |
130 |
4.337 |
1.054 |
1 |
6 |
-1.133 |
1.673 |
| Post_pmerq_AD_Avg |
130 |
3.665 |
0.951 |
1 |
6 |
-0.316 |
0.917 |
### **ANCOVA Results by Outcome**
Analysis of Covariance (ANCOVA) Results by Outcome
| Post_DERS8_Sum |
Pre_DERS8_Sum |
25.261 |
28.575 |
7.799 |
6.481 |
13.075 |
0.000 |
| Post_GAD7_Sum |
Pre_GAD7_Sum |
12.002 |
13.224 |
5.465 |
4.431 |
3.498 |
0.064 |
| Post_PHQ9_Sum |
Pre_PHQ9_Sum |
13.442 |
15.162 |
6.658 |
5.886 |
6.195 |
0.014 |
| Post_SHS_Pathways |
Pre_SHS_Pathways |
14.468 |
14.841 |
4.456 |
4.196 |
0.642 |
0.424 |
| Post_SHS_Agency |
Pre_SHS_Agency |
12.516 |
12.725 |
5.416 |
5.061 |
0.172 |
0.679 |
| Post_SHS_TotalHope |
Pre_SHS_TotalHope |
26.984 |
27.565 |
9.035 |
8.632 |
0.421 |
0.518 |
| Post_ucla_Sum |
Pre_ucla_Sum |
6.677 |
6.913 |
1.845 |
1.569 |
1.092 |
0.298 |
| Post_pmerq_Focus_Avg |
Pre_pmerq_Focus_Avg |
3.105 |
2.890 |
1.206 |
1.181 |
1.128 |
0.290 |
| Post_pmerq_Distract_Avg |
Pre_pmerq_Distract_Avg |
4.419 |
4.262 |
1.062 |
1.049 |
0.770 |
0.382 |
| Post_pmerq_AD_Avg |
Pre_pmerq_AD_Avg |
3.762 |
3.576 |
0.932 |
0.967 |
1.492 |
0.224 |
Follow-up: Effect Sizes for Significant/Marginal
Variables (I’m sorry I don’t know how to make this look pretty!
If anyone knows please help!) Cohen’s F For Each Significant/Marginal
Outcome: Anxiety: . 0.16 Depression: 0.21 DERS: 0.31
---------------------------------------
ANCOVA for: Post_DERS8_Sum controlling for Pre_DERS8_Sum
---------------------------------------
Df Sum Sq Mean Sq F value Pr(>F)
condition 1 410 410.4 13.07 0.000419 ***
Pre_DERS8_Sum 1 2779 2778.5 88.53 < 2e-16 ***
Residuals 138 4331 31.4
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness
Partial Eta Squared:
# Effect Size for ANOVA (Type I)
Parameter | Eta2 (partial) | 95% CI
---------------------------------------------
condition | 0.09 | [0.03, 1.00]
Pre_DERS8_Sum | 0.39 | [0.29, 1.00]
- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)
Parameter | Cohen's f (partial) | 95% CI
-------------------------------------------------
condition | 0.31 | [0.16, Inf]
Pre_DERS8_Sum | 0.80 | [0.64, Inf]
- One-sided CIs: upper bound fixed at [Inf].
---------------------------------------
ANCOVA for: Post_GAD7_Sum controlling for Pre_GAD7_Sum
---------------------------------------
Df Sum Sq Mean Sq F value Pr(>F)
condition 1 54 54.0 3.498 0.0636 .
Pre_GAD7_Sum 1 1311 1311.2 84.884 4.68e-16 ***
Residuals 138 2132 15.4
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness
Partial Eta Squared:
# Effect Size for ANOVA (Type I)
Parameter | Eta2 (partial) | 95% CI
--------------------------------------------
condition | 0.02 | [0.00, 1.00]
Pre_GAD7_Sum | 0.38 | [0.28, 1.00]
- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)
Parameter | Cohen's f (partial) | 95% CI
------------------------------------------------
condition | 0.16 | [0.00, Inf]
Pre_GAD7_Sum | 0.78 | [0.62, Inf]
- One-sided CIs: upper bound fixed at [Inf].
---------------------------------------
ANCOVA for: Post_PHQ9_Sum controlling for Pre_PHQ9_Sum
---------------------------------------
Df Sum Sq Mean Sq F value Pr(>F)
condition 1 110.5 110.5 6.195 0.014 *
Pre_PHQ9_Sum 1 3034.1 3034.1 170.110 <2e-16 ***
Residuals 138 2461.4 17.8
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness
Partial Eta Squared:
# Effect Size for ANOVA (Type I)
Parameter | Eta2 (partial) | 95% CI
--------------------------------------------
condition | 0.04 | [0.00, 1.00]
Pre_PHQ9_Sum | 0.55 | [0.46, 1.00]
- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)
Parameter | Cohen's f (partial) | 95% CI
------------------------------------------------
condition | 0.21 | [0.07, Inf]
Pre_PHQ9_Sum | 1.11 | [0.93, Inf]
- One-sided CIs: upper bound fixed at [Inf].
Self-harm Questions
Post-test Logistic Regression to Investigate Intervention Effects on
Self-Harm Outcomes Result: Condition was not a significant
predictor of any self-harm outcome (coded binary).
| Characteristic |
SHQ1 Model
|
SHQ2 Model
|
SHQ3 Model
|
SHQ_Any Model
|
| OR |
SE |
OR |
SE |
OR |
SE |
OR |
SE |
| condition |
|
|
|
|
|
|
|
|
| Purrble Treatment |
— |
— |
— |
— |
— |
— |
— |
— |
| Waitlist Control |
0.87 |
0.452 |
1.02 |
0.412 |
1.15 |
0.546 |
0.91 |
0.434 |
| SHQ1_2 |
11.6*** |
0.484 |
|
|
|
|
|
|
| SHQ2_2 |
|
|
4.36*** |
0.408 |
|
|
|
|
| SHQ3_2 |
|
|
|
|
3.14* |
0.559 |
|
|
| SHQ_Any_2 |
|
|
|
|
|
|
5.83*** |
0.486 |
Below, we display a table and graph of the frequency of responses for
all self-harm questions. Please note- they are all equal (which is why
the lines all overlap and there appears to only be one!)

| Number of Responses for Self-Harm Questions Over Time |
| Week |
N_SHQ1 |
N_SHQ2 |
N_SHQ3 |
| 1 |
147 |
147 |
147 |
| 2 |
149 |
149 |
149 |
| 3 |
150 |
150 |
150 |
| 4 |
141 |
141 |
141 |
| 5 |
140 |
140 |
140 |
| 6 |
139 |
139 |
139 |
| 7 |
141 |
141 |
141 |
| 8 |
142 |
142 |
142 |
| 9 |
128 |
128 |
128 |
| 10 |
128 |
128 |
128 |
| 11 |
129 |
129 |
129 |
| 12 |
118 |
118 |
118 |
| 13 |
131 |
131 |
131 |
Linear Mixed Effects Models Results
interpretation:
Overall Summary of Significant Results
- Purrble showed greater improvement compared to the Waitlist
group for:
- Emotional Dysregulation (DERS8)
- Anxiety (GAD7)
- Depression (PHQ9)
- Positive Emotion Regulation - Focus
(pmerq_Focus_Avg)
- Positive Emotion Regulation - Attentional Deployment
(pmerq_AD_Avg)
Fixed Effects Results
1. Emotional Dysregulation (DERS8_Sum)
- Interaction Effect: The Waitlist group showed a
significantly less steep decline than Purrble (p <
0.001).
- Interpretation: Emotional dysregulation improved
more in the Purrble group compared to
Waitlist.
2. Anxiety Symptoms (GAD7_Sum)
- Interaction Effect: The Waitlist group experienced
a significantly smaller improvement than Purrble (p =
0.016).
- Interpretation: Anxiety symptoms decreased more in
the Purrble group than in
Waitlist.
3. Depression Symptoms (PHQ9_Sum)
- Interaction Effect: The Waitlist group showed
significantly smaller improvement than Purrble (p <
0.001).
- Interpretation: The Purrble group
experienced a greater reduction in depressive
symptoms.
4. Positive Emotion Regulation - Focus
(pmerq_Focus_Avg)
- Interaction Effect: The Purrble group showed a
slightly greater improvement than the Waitlist group (p =
0.018).
- Interpretation: The Purrble group
had enhanced emotion regulation strategies focused on
positive emotions.
5. Positive Emotion Regulation - Attentional Deployment
(pmerq_AD_Avg)
- Interaction Effect: The Purrble group showed
significantly greater improvement compared to the Waitlist group
(p = 0.010).
- Interpretation: The Purrble group
improved more in acceptance and dampening
strategies.
Non-Significant Interaction Effects
For the following variables, there was no significant difference
between groups over time: - Hope Pathways
(SHS_Pathways) - Hope Agency (SHS_Agency) -
Total Hope (SHS_TotalHope) - Loneliness
(UCLA_Sum) - Positive Emotion Regulation - Distraction
(pmerq_Distract_Avg) (marginal trend, p = 0.063)
-------------------------------------------------
Fixed Effects for Outcome: DERS8_Sum
-------------------------------------------------
| 28.383 |
0.674 |
203.773 |
42.116 |
0.000 |
(Intercept) |
| -0.283 |
0.038 |
1631.002 |
-7.502 |
0.000 |
Week |
| -0.332 |
0.947 |
203.540 |
-0.351 |
0.726 |
conditionWaitlist Control |
| 0.296 |
0.052 |
1630.582 |
5.669 |
0.000 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: GAD7_Sum
-------------------------------------------------
| 13.779 |
0.497 |
225.662 |
27.749 |
0.000 |
(Intercept) |
| -0.161 |
0.032 |
1633.666 |
-5.044 |
0.000 |
Week |
| -0.139 |
0.697 |
225.254 |
-0.199 |
0.842 |
conditionWaitlist Control |
| 0.107 |
0.044 |
1632.714 |
2.411 |
0.016 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: PHQ9_Sum
-------------------------------------------------
| 15.778 |
0.606 |
198.061 |
26.027 |
0.000 |
(Intercept) |
| -0.190 |
0.033 |
1629.309 |
-5.835 |
0.000 |
Week |
| -1.288 |
0.852 |
197.807 |
-1.512 |
0.132 |
conditionWaitlist Control |
| 0.233 |
0.045 |
1628.800 |
5.182 |
0.000 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: SHS_Pathways
-------------------------------------------------
| 12.271 |
0.566 |
351.869 |
21.692 |
0.000 |
(Intercept) |
| 0.178 |
0.050 |
274.989 |
3.587 |
0.000 |
Week |
| 0.972 |
0.799 |
354.277 |
1.217 |
0.224 |
conditionWaitlist Control |
| -0.066 |
0.070 |
273.258 |
-0.946 |
0.345 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: SHS_Agency
-------------------------------------------------
| 9.352 |
0.651 |
349.587 |
14.375 |
0.000 |
(Intercept) |
| 0.241 |
0.057 |
275.121 |
4.234 |
0.000 |
Week |
| 1.060 |
0.918 |
352.019 |
1.154 |
0.249 |
conditionWaitlist Control |
| -0.079 |
0.080 |
273.408 |
-0.999 |
0.319 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: SHS_TotalHope
-------------------------------------------------
| 21.619 |
1.090 |
334.610 |
19.833 |
0.000 |
(Intercept) |
| 0.422 |
0.092 |
273.920 |
4.570 |
0.000 |
Week |
| 2.025 |
1.538 |
337.177 |
1.316 |
0.189 |
conditionWaitlist Control |
| -0.147 |
0.129 |
272.298 |
-1.139 |
0.256 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: ucla_Sum
-------------------------------------------------
| 7.024 |
0.214 |
285.701 |
32.818 |
0.000 |
(Intercept) |
| -0.028 |
0.016 |
269.257 |
-1.728 |
0.085 |
Week |
| 0.322 |
0.301 |
287.117 |
1.069 |
0.286 |
conditionWaitlist Control |
| -0.007 |
0.022 |
267.706 |
-0.333 |
0.740 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: pmerq_Focus_Avg
-------------------------------------------------
| 2.512 |
0.143 |
306.792 |
17.566 |
0.000 |
(Intercept) |
| 0.047 |
0.011 |
270.346 |
4.159 |
0.000 |
Week |
| 0.276 |
0.202 |
309.628 |
1.370 |
0.172 |
conditionWaitlist Control |
| -0.038 |
0.016 |
269.074 |
-2.378 |
0.018 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: pmerq_Distract_Avg
-------------------------------------------------
| 4.044 |
0.142 |
345.894 |
28.434 |
0.000 |
(Intercept) |
| 0.031 |
0.012 |
273.095 |
2.521 |
0.012 |
Week |
| 0.251 |
0.201 |
348.557 |
1.249 |
0.212 |
conditionWaitlist Control |
| -0.032 |
0.017 |
271.632 |
-1.864 |
0.063 |
Week:conditionWaitlist Control |
-------------------------------------------------
Fixed Effects for Outcome: pmerq_AD_Avg
-------------------------------------------------
| 3.278 |
0.120 |
311.891 |
27.366 |
0.00 |
(Intercept) |
| 0.039 |
0.010 |
271.195 |
4.094 |
0.00 |
Week |
| 0.264 |
0.169 |
314.726 |
1.559 |
0.12 |
conditionWaitlist Control |
| -0.035 |
0.013 |
269.901 |
-2.603 |
0.01 |
Week:conditionWaitlist Control |
LS0tCnRpdGxlOiAnUHVycmJsZSBSQ1QgRnVsbCBBbmFseXNlczogRGVzY3JpcHRpdmVzIGFuZCBQcmVsaW1pbmFyeSBSZXN1bHRzJwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpSZWNvcmRpbmcgS2VlcGluZzogClRoZXJlIGFyZSAqdHdvKiBtYXN0ZXIgZmlsZXMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIGFuYWx5c2VzLiBUaGV5IGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBmaWxlLCB0aG91Z2ggb25lIGlzIGluIHdpZGUgZm9ybWF0IGFuZCB0aGUgb3RoZXIgaXMgaW4gbG9uZyBmb3JtYXQuIAoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkICJQdXJyYmxlX1dpZGVfRmluYWwuIgpUaGUgbG9uZyBkYXRhc2V0IGZvcm1hdCBkYXRhc2V0IGlzIGNhbGxlZCAiTm9EdXBfUHVycmJsZUFub24uIiAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSwgIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ3JpZEV4dHJhKSAKbGlicmFyeShwYXRjaHdvcmspICAgICAgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobWFya2Rvd24pCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KE1PVEUpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShrbml0cikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoYnJvb20ubWl4ZWQpIApsaWJyYXJ5KHRpZHltb2RlbHMpIApsaWJyYXJ5KG11bHRpbGV2ZWxtb2QpIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwc3ljaCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkcikKbGlicmFyeShrbml0cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGVmZmVjdHNpemUpCmxpYnJhcnkoZ3QpCgojI1JlYWQgaW4gdGhlIGRhdGFzZXRzCmxpYnJhcnkocmVhZHIpCnB1cnJibGVfd2lkZV9maW5hbCA8LSByZWFkX2NzdigicHVycmJsZV93aWRlX2ZpbmFsLmNzdiIpCgoKcHVycmJsZV93aWRlX2ZpbmFsIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gY2FzZV93aGVuKAogICAgY29uZGl0aW9uX251bSA9PSAwIH4gIldhaXRsaXN0IENvbnRyb2wiLAogICAgY29uZGl0aW9uX251bSA9PSAxIH4gIlB1cnJibGUiLAogICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8KICApKQoKcHVycmJsZV93aWRlX2ZpbmFsIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJERVJTOF9TdW1fIiksIAogICAgICAgICAgICAgICAgfiBpZmVsc2UoIWlzLm5hKC4pICYgLiA+PSAxLCAxLCAwKSwgCiAgICAgICAgICAgICAgICAubmFtZXMgPSAiQ29tcGxldGVfey5jb2x9IikpICU+JQogIHJlbmFtZV93aXRoKH4gZ3N1YigiQ29tcGxldGVfREVSUzhfU3VtXyIsICJDb21wbGV0ZV8iLCAuKSwgc3RhcnRzX3dpdGgoIkNvbXBsZXRlX0RFUlM4X1N1bV8iKSkKCgojIERlZmluZSB0aGUgdmVjdG9yIG9mIG91dGNvbWVzIGZvciB3aGljaCB3ZSBuZWVkIHByZS9wb3N0IGxpc3RzCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJHQUQ3X1N1bSIsIAogICAgICAgICAgICAgICJQSFE5X1N1bSIsICJTSFNfUGF0aHdheXMiLCAiU0hTX0FnZW5jeSIsICJTSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAidWNsYV9TdW0iLCAicG1lcnFfRm9jdXNfQXZnIiwgInBtZXJxX0Rpc3RyYWN0X0F2ZyIsICJwbWVycV9BRF9BdmciKQoKIyBDcmVhdGUgdGhlIHByZXRlc3QgbGlzdCAod2Vla3MgMS0zIGZvciBlYWNoIG91dGNvbWUpCnByZXRlc3RfbGlzdCA8LSB1bmxpc3QobGFwcGx5KG91dGNvbWVzLCBmdW5jdGlvbih4KSBwYXN0ZTAoeCwgIl8iLCAxOjMpKSkKCiMgQ3JlYXRlIHRoZSBwb3N0dGVzdCBsaXN0ICh3ZWVrcyAxMS0xMyBmb3IgZWFjaCBvdXRjb21lKQpwb3N0dGVzdF9saXN0IDwtIHVubGlzdChsYXBwbHkob3V0Y29tZXMsIGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCAiXyIsIDExOjEzKSkpCgpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICAjIElkZW50aWZ5IHRoZSBwcmUtdGVzdCBjb2x1bW5zIGZvciB0aGlzIG91dGNvbWUKICBwcmVfY29scyA8LSBwcmV0ZXN0X2xpc3RbZ3JlcGwocGFzdGUwKCJeIiwgb3V0Y29tZSwgIl8iKSwgcHJldGVzdF9saXN0KV0KICAKICAjIElkZW50aWZ5IHRoZSBwb3N0LXRlc3QgY29sdW1ucyBmb3IgdGhpcyBvdXRjb21lCiAgcG9zdF9jb2xzIDwtIHBvc3R0ZXN0X2xpc3RbZ3JlcGwocGFzdGUwKCJeIiwgb3V0Y29tZSwgIl8iKSwgcG9zdHRlc3RfbGlzdCldCiAgCiAgIyBDcmVhdGUgdGhlIG5hbWVzIGZvciB0aGUgbmV3IFByZV8gYW5kIFBvc3RfIGNvbHVtbnMKICBwcmVfY29sbmFtZSA8LSBwYXN0ZTAoIlByZV8iLCBvdXRjb21lKQogIHBvc3RfY29sbmFtZSA8LSBwYXN0ZTAoIlBvc3RfIiwgb3V0Y29tZSkKICAKICAjIENhbGN1bGF0ZSByb3cgbWVhbnMgZm9yIHByZS10ZXN0IGNvbHVtbnMgKHdlZWtzIDEtMykKICBwdXJyYmxlX3dpZGVfZmluYWxbW3ByZV9jb2xuYW1lXV0gPC0gcm93TWVhbnMocHVycmJsZV93aWRlX2ZpbmFsWywgcHJlX2NvbHMsIGRyb3AgPSBGQUxTRV0sIG5hLnJtID0gVFJVRSkKICAKICAjIENhbGN1bGF0ZSByb3cgbWVhbnMgZm9yIHBvc3QtdGVzdCBjb2x1bW5zICh3ZWVrcyAxMS0xMykKICBwdXJyYmxlX3dpZGVfZmluYWxbW3Bvc3RfY29sbmFtZV1dIDwtIHJvd01lYW5zKHB1cnJibGVfd2lkZV9maW5hbFssIHBvc3RfY29scywgZHJvcCA9IEZBTFNFXSwgbmEucm0gPSBUUlVFKQp9CgpWaWV3KHB1cnJibGVfd2lkZV9maW5hbCkKY29sbmFtZXMocHVycmJsZV93aWRlX2ZpbmFsKQoKbGlicmFyeShyZWFkcikKTm9EdXBfUHVycmJsZUFub24gPC0gcmVhZF9jc3YoIn4vTm9EdXBfUHVycmJsZUFub24uY3N2IikKVmlldyhOb0R1cF9QdXJyYmxlQW5vbikKCgpgYGAKCgpUaGlzIGRhdGFzZXQgaW5jbHVkZXMgdGhlIE49MTU0IHBhcnRpY2lwYW50cyB3aG8gd2VyZSBpbmNsdWRlZCBpbiB0aGUgcmFuZG9taXplZCBjb250cm9sIHRyaWFsIGV4YW1pbmluZyBQdXJyYmxlIHdpdGggYSBwb3B1bGF0aW9uIG9mIHVuaXZlcnNpdHkgc3R1ZGVudHMsIHdpdGggYW4gZW1waGFzaXMgb24gdGhlIExHVEJRKyBjb21tdW5pdHkuIAoKKipQYXJ0aWNpcGF0aW9uIGluIEVhY2ggV2VlayBvdmVyIFRpbWUqKiAKTm90ZTogV2Vla3MgMS0zIHdlcmUgY29uc2lkZXJlZCAicHJlLXRlc3QuIiBQdXJyYmxlIHdhcyBnaXZlbiAob3Igbm90KSBhZnRlciB3ZWVrIDMuIFdlZWtzIDExLTEzIGFyZSBjb25zaWRlcmVkICJQb3N0LXRlc3QiLgpgYGB7cn0KY29uZGl0aW9uX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uKSAlPiUKICByZW5hbWUoQ29uZGl0aW9uID0gY29uZGl0aW9uLCBOID0gbikKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmNhdCgiIyMjICoqTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBpbiBFYWNoIENvbmRpdGlvbioqXG4iKQprYWJsZShjb25kaXRpb25fY291bnRzLCBjYXB0aW9uID0gIlBhcnRpY2lwYW50IENvdW50cyBieSBDb25kaXRpb24iKQoKIyBTZWxlY3QgQ29tcGxldGVfWCB2YXJpYWJsZXMKY29tcGxldGVfdmFycyA8LSBwYXN0ZTAoIkNvbXBsZXRlXyIsIDE6MTMpCgojIFN1bW1hcml6ZSBob3cgbWFueSBwZW9wbGUgaGF2ZSBhIDEgZm9yIGVhY2ggQ29tcGxldGVfWCB2YXJpYWJsZQpjb21wbGV0ZV90YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YoY29tcGxldGVfdmFycyksIHN1bSwgbmEucm0gPSBUUlVFKSkKCiMgUmVzaGFwZSBpbnRvIGxvbmcgZm9ybWF0IGZvciBjbGVhbmVyIGRpc3BsYXkKY29tcGxldGVfdGFibGVfbG9uZyA8LSBjb21wbGV0ZV90YWJsZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiV2VlayIsIHZhbHVlc190byA9ICJDb3VudCIpICU+JQogIG11dGF0ZShXZWVrID0gYXMubnVtZXJpYyhnc3ViKCJDb21wbGV0ZV8iLCAiIiwgV2VlaykpKSAlPiUKICBhcnJhbmdlKFdlZWspICMgRW5zdXJlIHByb3BlciBvcmRlcgoKIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgdGFibGUKY2F0KCJcbiMjIyAqKkNvbXBsZXRpb24gQ291bnRzIE92ZXIgVGltZSoqXG4iKQprYWJsZShjb21wbGV0ZV90YWJsZV9sb25nLCBjYXB0aW9uID0gIk51bWJlciBvZiBQYXJ0aWNpcGFudHMgQ29tcGxldGluZyBFYWNoIFdlZWsiKQoKIyBMaW5lIGdyYXBoIHNob3dpbmcgdHJlbmQgb2YgY29tcGxldGlvbiBvdmVyIHRpbWUKIyBDcmVhdGUgdGhlIGxpbmUgZ3JhcGgKZ2dwbG90KGNvbXBsZXRlX3RhYmxlX2xvbmcsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50KSkgKwogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgbGluZXdpZHRoID0gMSkgKyAgIyBMaW5lIGNvbG9yIGFuZCB0aGlja25lc3MKICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKyAgIyBSZWQgcG9pbnRzIGZvciBlbXBoYXNpcwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDE1NSksIGJyZWFrcyA9IHNlcSgwLCAxNTUsIGJ5ID0gMjUpKSArICAjIFktYXhpcyBsaW1pdHMgYW5kIGludGVydmFscwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEzKSArICAjIEVuc3VyZSBhbGwgd2Vla3MgKDEgdG8gMTMpIGFwcGVhciBvbiBYLWF4aXMKICBsYWJzKAogICAgdGl0bGUgPSAiQ29tcGxldGlvbiBSYXRlcyBPdmVyIFRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIE1ha2UgWC1heGlzIGxhYmVscyByZWFkYWJsZQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICAjIE1ha2UgWS1heGlzIGxhYmVscyByZWFkYWJsZQpgYGAKCioqQXR0cml0aW9uIEFuYWx5c2lzIGJ5IENvbmRpdGlvbioqCkF0dHJpdGlvbiBpcyBkZWZpbmVkIGFzIGRyb3BwaW5nIG91dCBvZiBzdHVkeSBwcmlvciB0byBXZWVrIDExLiAKV2UgY2hlY2tlZCB0byBleGFtaW5lIHdoZXRoZXIgdGhlcmUgd2VyZSBkaWZmZXJlbmNlcyBpbiBkcm9wIG91dCBmb3IgdGhlIFdhaXRsaXN0IGFuZCBUcmVhdG1lbnQgZ3JvdXBzLiAKKlJlc3VsdDoqIE5vIGRpZmZlcmVuY2UgaW4gYXR0cml0aW9uIGJ5IGdyb3VwCgpgYGB7cn0KbGlicmFyeShyZWFkcikKcHVycmJsZV93aWRlIDwtIHJlYWRfY3N2KCJwdXJyYmxlX3dpZGUuY3N2IikKVmlldyhwdXJyYmxlX3dpZGUpCgojIENyZWF0ZSBhIHZlY3RvciBvZiB3ZWVrcwp3ZWVrcyA8LSAxOjEzCgojIEZvciBlYWNoIHdlZWssIGNoZWNrIGlmIGFueSBvZiB0aGF0IHdlZWsncyBjb2x1bW5zIGFyZSBub24tTkEuCiMgV2UgdXNlIGByb3dTdW1zKCFpcy5uYShhY3Jvc3MoLi4uKSkpID4gMGAgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbnkgZGF0YS4KZm9yICh3IGluIHdlZWtzKSB7CiAgcHVycmJsZV93aWRlIDwtIHB1cnJibGVfd2lkZSAlPiUKICAgIG11dGF0ZSghIXBhc3RlMCgiQVRUIiwgdykgOj0gaWZfZWxzZSgKICAgICAgcm93U3VtcyghaXMubmEoYWNyb3NzKGVuZHNfd2l0aChwYXN0ZTAoIl8iLCB3KSkpKSkgPiAwLAogICAgICAxLAogICAgICAwCiAgICApKQp9CgpwdXJyYmxlX3dpZGUgPC0gcHVycmJsZV93aWRlICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoTGFzdF9TZXNzaW9uID0gewogICAgIyBFeHRyYWN0IHRoZSBhdHRlbmRhbmNlIHZhbHVlcyBmb3IgYWxsIHdlZWtzCiAgICBhdHRfdmFsdWVzIDwtIGNfYWNyb3NzKHN0YXJ0c193aXRoKCJBVFQiKSkKICAgIAogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYXR0ZW5kYW5jZQogICAgaWYgKGFsbChhdHRfdmFsdWVzID09IDAgfCBpcy5uYShhdHRfdmFsdWVzKSkpIHsKICAgICAgIyBJZiBubyBhdHRlbmRhbmNlLCBzZXQgTGFzdF9TZXNzaW9uIHRvIE5BCiAgICAgIE5BX2ludGVnZXJfCiAgICB9IGVsc2UgewogICAgICAjIElmIHRoZXJlIGlzIGF0dGVuZGFuY2UsIGZpbmQgdGhlIGxhc3QgKG1heCkgd2VlayBhdHRlbmRlZAogICAgICBtYXgod2hpY2goYXR0X3ZhbHVlcyA9PSAxKSkKICAgIH0KICB9KSAlPiUKICB1bmdyb3VwKCkKCiMgQ3JlYXRlIGFuIGF0dHJpdGlvbiB2YXJpYWJsZTogMSBpZiBsYXN0IHNlc3Npb24gPD0gMTAsIGVsc2UgMApwdXJyYmxlX3dpZGUgPC0gcHVycmJsZV93aWRlICU+JQogIG11dGF0ZShhdHRyaXRpb24gPSBpZmVsc2UoTGFzdF9TZXNzaW9uIDw9IDEwLCAxLCAwKSkKCiMgSWRlbnRpZnkgY29uZGl0aW9uIGxldmVscwpjb25kX2xldmVscyA8LSB1bmlxdWUocHVycmJsZV93aWRlJGNvbmRpdGlvbikKY29uZF9sZXZlbHMgPC0gY29uZF9sZXZlbHNbIWlzLm5hKGNvbmRfbGV2ZWxzKV0KaWYgKGxlbmd0aChjb25kX2xldmVscykgIT0gMikgewogIHN0b3AoIlRoaXMgY29kZSBleHBlY3RzIGV4YWN0bHkgdHdvIGNvbmRpdGlvbnMgZm9yIHRoZSBjb21wYXJpc29uLiIpCn0KCiMgQ2FsY3VsYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYnkgY29uZGl0aW9uCmF0dHJpdGlvbl9zdW1tYXJ5IDwtIHB1cnJibGVfd2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE4gPSBuKCksCiAgICBNZWFuID0gbWVhbihhdHRyaXRpb24sIG5hLnJtID0gVFJVRSksCiAgICBTRCA9IHNkKGF0dHJpdGlvbiwgbmEucm0gPSBUUlVFKQogICkKCiMgVC10ZXN0IGNvbXBhcmluZyBhdHRyaXRpb24gYnkgY29uZGl0aW9uCnR0IDwtIHQudGVzdChhdHRyaXRpb24gfiBjb25kaXRpb24sIGRhdGEgPSBwdXJyYmxlX3dpZGUpCnRfdGVzdF9yZXN1bHRzIDwtIHRpZHkodHQpICU+JQogIHNlbGVjdChlc3RpbWF0ZTEsIGVzdGltYXRlMiwgc3RhdGlzdGljLCBwLnZhbHVlLCBjb25mLmxvdywgY29uZi5oaWdoKSAlPiUKICByZW5hbWUoCiAgICBgTWVhbiAoQ29uZGl0aW9uIDEpYCA9IGVzdGltYXRlMSwKICAgIGBNZWFuIChDb25kaXRpb24gMilgID0gZXN0aW1hdGUyLAogICAgYHQtdmFsdWVgID0gc3RhdGlzdGljLAogICAgYHAtdmFsdWVgID0gcC52YWx1ZSwKICAgIGBMb3dlciBDSWAgPSBjb25mLmxvdywKICAgIGBVcHBlciBDSWAgPSBjb25mLmhpZ2gKICApCgojIERpc3BsYXkgQXR0cml0aW9uIFN1bW1hcnkgVGFibGUKY2F0KCIjIyMgKipBdHRyaXRpb24gQW5hbHlzaXMgYnkgQ29uZGl0aW9uIChQcmlvciB0byBXZWVrIDExKSoqXG4iKQprYWJsZShhdHRyaXRpb25fc3VtbWFyeSwgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIikKCiMgRGlzcGxheSBULVRlc3QgUmVzdWx0cyBUYWJsZQpjYXQoIlxuIyMjICoqVC1UZXN0IFJlc3VsdHMqKlxuIikKa2FibGUodF90ZXN0X3Jlc3VsdHMsIGNhcHRpb24gPSAiVC1UZXN0IENvbXBhcmluZyBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIikKCmBgYAoKCioqRGVtb2dyYXBoaWNzIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgYnkgQ29uZGl0aW9uKioKCioqKkdlbmRlciBhbmQgU2V4dWFsIElkZW50aXRpZXMgYnkgQ29uZGl0aW9uKioqCmBgYHtyfQojIGdpX3NpbXBsaWZpZWQgYnkgY29uZGl0aW9uCmdpX3RhYmxlIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBjb3VudChjb25kaXRpb24sIGdpX3NpbXBsaWZpZWQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKQoKIyBzb19zaW1wbGlmaWVkIGJ5IGNvbmRpdGlvbgpzb190YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uLCBzb19zaW1wbGlmaWVkKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkKCiMgRGlzcGxheSB0aGUgdGFibGVzIGluIGEgbmljZWx5IGZvcm1hdHRlZCB3YXkKa2FibGUoZ2lfdGFibGUsIGNhcHRpb24gPSAiRnJlcXVlbmN5IFRhYmxlIG9mIEdlbmRlciBJZGVudGl0eSBieSBDb25kaXRpb24iKQprYWJsZShzb190YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgU2V4dWFsIE9yaWVudGF0aW9uIGJ5IENvbmRpdGlvbiIpCmBgYAoqKlJhY2UgYW5kIE5hdGlvbmFsaXR5IGJ5IENvbmRpdGlvbioqKgoKYGBge3J9CiMgTGlzdCBvZiByYWNlIHZhcmlhYmxlcwpyYWNlX3ZhcnMgPC0gYygiUmFjZV9Bc2lhbiIsICJSYWNlX0FyYWJpYyIsICJSYWNlX0JsYWNrIiwgIlJhY2VfSGlzcGFuaWMiLCAKICAgICAgICAgICAgICAgIlJhY2VfUGFjaWZpYyIsICJSYWNlX1doaXRlIiwgIlJhY2VfdW5rbm93biIpCgojIENyZWF0ZSBmcmVxdWVuY3kgdGFibGU6IENvdW50IG9mIDFzIGZvciBlYWNoIHJhY2UgdmFyaWFibGUgYnkgY29uZGl0aW9uCnJhY2VfdGFibGUgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YocmFjZV92YXJzKSwgc3VtLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb25kaXRpb24sIG5hbWVzX3RvID0gIlJhY2VfVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IENvdW50LCB2YWx1ZXNfZmlsbCA9IDApCgojIERpc3BsYXkgcmFjZSBmcmVxdWVuY3kgdGFibGUKa2FibGUocmFjZV90YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgUmFjZSBWYXJpYWJsZXMgYnkgQ29uZGl0aW9uIikKCiMjIyBDb3VudCBvZiBQYXJ0aWNpcGFudHMgd2l0aCBNdWx0aXBsZSBSYWNpYWwgSWRlbnRpdGllcyBieSBDb25kaXRpb24KCiMgQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIHJhY2UgdmFyaWFibGVzIGZvciBlYWNoIHBhcnRpY2lwYW50CnB1cnJibGVfd2lkZV9maW5hbCA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgbXV0YXRlKFJhY2VfU3VtID0gcm93U3VtcyhzZWxlY3QoLiwgYWxsX29mKHJhY2VfdmFycykpLCBuYS5ybSA9IFRSVUUpKQoKIyBDb3VudCBwYXJ0aWNpcGFudHMgd2l0aCBtb3JlIHRoYW4gb25lIHJhY2lhbCBpZGVudGl0eSBpbiBlYWNoIGNvbmRpdGlvbgptdWx0aV9yYWNlX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoTXVsdGlwbGVfSWRlbnRpdGllcyA9IHN1bShSYWNlX1N1bSA+IDEsIG5hLnJtID0gVFJVRSkpCgojIERpc3BsYXkgcmVzdWx0cyB3aXRoIGRlc2NyaXB0aXZlIHRleHQKbXVsdGlfcmFjZV9jb3VudHMgJT4lCiAgbXV0YXRlKERlc2NyaXB0aW9uID0gcGFzdGUoTXVsdGlwbGVfSWRlbnRpdGllcywgInBlb3BsZSBpbiB0aGUiLCBjb25kaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24gcmVwb3J0ZWQgbXVsdGlwbGUgcmFjaWFsL2V0aG5pYyBpZGVudGl0aWVzIikpICU+JQogIHB1bGwoRGVzY3JpcHRpb24pICU+JQogIGNhdChzZXAgPSAiXG4iKQoKCiMgZ2lfc2ltcGxpZmllZCBieSBjb25kaXRpb24KbmF0X3RhYmxlIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBjb3VudChjb25kaXRpb24sIE5hdGlvbmFsaXR5KSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkKCgojIERpc3BsYXkgdGhlIHRhYmxlcyBpbiBhIG5pY2VseSBmb3JtYXR0ZWQgd2F5CmthYmxlKG5hdF90YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgTmF0aW9uYWxpdHkgYnkgQ29uZGl0aW9uIikKYGBgCgoKKipBZ2UgYnkgQ29uZGl0aW9uKioKVGhlIHRhYmxlIGJlbG93IHByZXNlbnRzIGFnZSBkZXNjcmlwdGl2ZXMgYnkgY29uZGl0aW9uLiAKQSB0LXRlc3Qgd2FzIGNvbmR1Y3RlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSB3ZXJlIGJhc2VsaW5lIGRpZmZlcmVuY2VzIGluIGFnZS4gVGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gY29uZGl0aW9ucy4gCgpgYGB7cn0KIyAxLiBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBZ2UgYnkgQ29uZGl0aW9uCmFnZV9kZXNjIDwtIGRlc2NyaWJlQnkocHVycmJsZV93aWRlX2ZpbmFsJGFnZSwgcHVycmJsZV93aWRlX2ZpbmFsJGNvbmRpdGlvbiwgbWF0ID0gVFJVRSkKYWdlX2Rlc2MgPC0gYWdlX2Rlc2MgJT4lCiAgc2VsZWN0KGdyb3VwMSwgbiwgbWVhbiwgc2QsIG1pbiwgbWF4KSAlPiUKICByZW5hbWUoCiAgICBDb25kaXRpb24gPSBncm91cDEsCiAgICBOID0gbiwKICAgIE1lYW4gPSBtZWFuLAogICAgU0QgPSBzZCwKICAgIE1pbiA9IG1pbiwKICAgIE1heCA9IG1heAogICkKCmNhdCgiIyMjICoqQWdlIGJ5IENvbmRpdGlvbiAoQmFzZWxpbmUpKipcbiIpCmthYmxlKGFnZV9kZXNjLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIEFnZSBieSBDb25kaXRpb24iKQoKIyAyLiBULXRlc3QgZm9yIEFnZSBieSBDb25kaXRpb24KdF9yZXN1bHQgPC0gdC50ZXN0KGFnZSB+IGNvbmRpdGlvbiwgZGF0YSA9IHB1cnJibGVfd2lkZV9maW5hbCkKCiMgQ29udmVydCB0LXRlc3QgcmVzdWx0cyBpbnRvIGEgdGlkeSBkYXRhIGZyYW1lCnRfcmVzdWx0X2RmIDwtIHRpZHkodF9yZXN1bHQpICU+JQogIHNlbGVjdChlc3RpbWF0ZTEsIGVzdGltYXRlMiwgc3RhdGlzdGljLCBwLnZhbHVlLCBjb25mLmxvdywgY29uZi5oaWdoKSAlPiUKICByZW5hbWUoCiAgICBgTWVhbiAoV2FpdGxpc3QgQ29udHJvbClgID0gZXN0aW1hdGUxLAogICAgYE1lYW4gKFB1cnJibGUpYCA9IGVzdGltYXRlMiwKICAgIGB0LXZhbHVlYCA9IHN0YXRpc3RpYywKICAgIGBwLXZhbHVlYCA9IHAudmFsdWUsCiAgICBgTG93ZXIgQ0lgID0gY29uZi5sb3csCiAgICBgVXBwZXIgQ0lgID0gY29uZi5oaWdoCiAgKQoKY2F0KCJcbiMjIyAqKlQtdGVzdCBmb3IgQWdlIGJ5IENvbmRpdGlvbioqXG4iKQprYWJsZSh0X3Jlc3VsdF9kZiwgY2FwdGlvbiA9ICJULXRlc3QgUmVzdWx0cyBmb3IgQWdlIGJ5IENvbmRpdGlvbiIpCgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCiMgMy4gRWZmZWN0IFNpemUgKENvaGVuJ3MgZCkKY29oZW4gPC0gY29oZW5zX2QoYWdlIH4gY29uZGl0aW9uLCBkYXRhID0gcHVycmJsZV93aWRlX2ZpbmFsKQoKIyBDb252ZXJ0IENvaGVuJ3MgZCByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKY29oZW5fZGYgPC0gdGliYmxlKAogIGBDb2hlbidzIGRgID0gY29oZW4kQ29oZW5zX2QsCiAgYDk1JSBDSSBMb3dlcmAgPSBjb2hlbiRDSV9sb3csCiAgYDk1JSBDSSBVcHBlcmAgPSBjb2hlbiRDSV9oaWdoCikKCiMgRGlzcGxheSByZXN1bHRzIGluIGEgY2xlYW4gdGFibGUKY2F0KCJcbiMjIyAqKkNvaGVuJ3MgZCBmb3IgQWdlIGJ5IENvbmRpdGlvbioqXG4iKQprYWJsZShjb2hlbl9kZiwgY2FwdGlvbiA9ICJFZmZlY3QgU2l6ZSAoQ29oZW4ncyBkKSBmb3IgQWdlIGJ5IENvbmRpdGlvbiIpCmBgYAoqKipQcmVsaW1pbmFyeSBBbmFseXNlcyoqCkZpcnN0LCB3ZSB3YW50IHRvIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGRpZmZlcmVuY2VzIGluIHRoZSBvdXRjb21lKHMpIG9mIGludGVyZXN0IGF0IGJhc2VsaW5lLCBieSBjaGFuY2UKKlJlc3VsdDoqIE5vIGRpZmZlcmVuY2UgaW4gYmFzZWxpbmUgcHJlLXRlc3QgbWVhc3VyZXMtIHdvbyEgCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocHN5Y2gpCgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCgojIENyZWF0ZSB2ZWN0b3JzIG9mIHByZS0gYW5kIHBvc3QtdGVzdCB2YXJpYWJsZXMKcHJlX3ZhcnMgPC0gYygiUHJlX0RFUlM4X1N1bSIsICJQcmVfR0FEN19TdW0iLCAiUHJlX1BIUTlfU3VtIiwKICAgICAgICAgICAgICAiUHJlX1NIU19QYXRod2F5cyIsICJQcmVfU0hTX0FnZW5jeSIsICJQcmVfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIiwKICAgICAgICAgICAgICAgIlBvc3RfU0hTX1BhdGh3YXlzIiwgIlBvc3RfU0hTX0FnZW5jeSIsICJQb3N0X1NIU19Ub3RhbEhvcGUiLAogICAgICAgICAgICAgICAiUG9zdF91Y2xhX1N1bSIsICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsICJQb3N0X3BtZXJxX0FEX0F2ZyIpCgojIElkZW50aWZ5IGNvbmRpdGlvbiBsZXZlbHMgKGFzc3VtaW5nIGV4YWN0bHkgdHdvIGNvbmRpdGlvbnMpCmNvbmRfbGV2ZWxzIDwtIHVuaXF1ZShwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uKQpjb25kX2xldmVscyA8LSBjb25kX2xldmVsc1shaXMubmEoY29uZF9sZXZlbHMpXQppZiAobGVuZ3RoKGNvbmRfbGV2ZWxzKSAhPSAyKSB7CiAgc3RvcCgiVGhpcyBjb2RlIGV4cGVjdHMgZXhhY3RseSB0d28gY29uZGl0aW9ucyBmb3IgdGhlIHQtdGVzdHMuIikKfQoKIyBTcGxpdCBkYXRhIGJ5IGNvbmRpdGlvbgpkYXRhX2NvbmQxIDwtIHB1cnJibGVfd2lkZV9maW5hbFtwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uID09IGNvbmRfbGV2ZWxzWzFdLCBdCmRhdGFfY29uZDIgPC0gcHVycmJsZV93aWRlX2ZpbmFsW3B1cnJibGVfd2lkZV9maW5hbCRjb25kaXRpb24gPT0gY29uZF9sZXZlbHNbMl0sIF0KCiMgSW5pdGlhbGl6ZSBhIHJlc3VsdHMgZGF0YSBmcmFtZQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoCiAgT3V0Y29tZSA9IGNoYXJhY3RlcigpLAogIENvbmRpdGlvbjEgPSBjaGFyYWN0ZXIoKSwKICBDb25kaXRpb24xX04gPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMV9NZWFuID0gbnVtZXJpYygpLAogIENvbmRpdGlvbjFfU0QgPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMiA9IGNoYXJhY3RlcigpLAogIENvbmRpdGlvbjJfTiA9IG51bWVyaWMoKSwKICBDb25kaXRpb24yX01lYW4gPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMl9TRCA9IG51bWVyaWMoKSwKICBkZiA9IG51bWVyaWMoKSwKICB0ID0gbnVtZXJpYygpLAogIHAgPSBudW1lcmljKCksCiAgQ0lfTG93ZXIgPSBudW1lcmljKCksCiAgQ0lfVXBwZXIgPSBudW1lcmljKCksCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKCiMgTG9vcCB0aHJvdWdoIGVhY2ggcHJlLXRlc3QgdmFyaWFibGUgYW5kIHJ1biBkZXNjcmlwdGl2ZXMgYW5kIHQtdGVzdApmb3IgKHZhciBpbiBwcmVfdmFycykgewogIAogICMgRGVzY3JpYmUgYnkgY29uZGl0aW9uCiAgZGVzYzEgPC0gZGVzY3JpYmUoZGF0YV9jb25kMVtbdmFyXV0pCiAgZGVzYzIgPC0gZGVzY3JpYmUoZGF0YV9jb25kMltbdmFyXV0pCiAgCiAgIyBDaGVjayBpZiB3ZSBoYXZlIHZhbGlkIGRhdGEgZm9yIGJvdGggY29uZGl0aW9ucwogIGlmIChkZXNjMSRuID4gMCAmIGRlc2MyJG4gPiAwKSB7CiAgICAjIHQtdGVzdAogICAgdHQgPC0gdC50ZXN0KHB1cnJibGVfd2lkZV9maW5hbFtbdmFyXV0gfiBwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uKQogICAgCiAgICAjIEV4dHJhY3QgaW5mbwogICAgbjEgPC0gZGVzYzEkbgogICAgbWVhbjEgPC0gZGVzYzEkbWVhbgogICAgc2QxIDwtIGRlc2MxJHNkCiAgICAKICAgIG4yIDwtIGRlc2MyJG4KICAgIG1lYW4yIDwtIGRlc2MyJG1lYW4KICAgIHNkMiA8LSBkZXNjMiRzZAogICAgCiAgICBkZl92YWwgPC0gdHQkcGFyYW1ldGVyCiAgICB0X3ZhbCA8LSB0dCRzdGF0aXN0aWMKICAgIHBfdmFsIDwtIHR0JHAudmFsdWUKICAgIGNpX2xvd2VyIDwtIHR0JGNvbmYuaW50WzFdCiAgICBjaV91cHBlciA8LSB0dCRjb25mLmludFsyXQogICAgCiAgICAjIEFkZCByb3cgdG8gcmVzdWx0cwogICAgcmVzdWx0cyA8LSByYmluZChyZXN1bHRzLCBkYXRhLmZyYW1lKAogICAgICBPdXRjb21lID0gdmFyLAogICAgICBDb25kaXRpb24xID0gY29uZF9sZXZlbHNbMV0sCiAgICAgIENvbmRpdGlvbjFfTiA9IG4xLAogICAgICBDb25kaXRpb24xX01lYW4gPSBtZWFuMSwKICAgICAgQ29uZGl0aW9uMV9TRCA9IHNkMSwKICAgICAgQ29uZGl0aW9uMiA9IGNvbmRfbGV2ZWxzWzJdLAogICAgICBDb25kaXRpb24yX04gPSBuMiwKICAgICAgQ29uZGl0aW9uMl9NZWFuID0gbWVhbjIsCiAgICAgIENvbmRpdGlvbjJfU0QgPSBzZDIsCiAgICAgIGRmID0gZGZfdmFsLAogICAgICB0ID0gdF92YWwsCiAgICAgIHAgPSBwX3ZhbCwKICAgICAgQ0lfTG93ZXIgPSBjaV9sb3dlciwKICAgICAgQ0lfVXBwZXIgPSBjaV91cHBlciwKICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCiAgICApKQogIH0KfQoKY2F0KCJCYXNlbGluZSBkaWZmZXJlbmNlcyBpbiBzdHVkeSBvdXRjb21lcyBieSBjb25kaXRpb25cblxuIikKcHJpbnQocmVzdWx0cykKCmBgYApgYGB7cn0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShicm9vbSkKCiMgRGVmaW5lIHByZS10ZXN0IGFuZCBwb3N0LXRlc3QgdmFyaWFibGVzCnByZV92YXJzIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgIlByZV9TSFNfUGF0aHdheXMiLCAiUHJlX1NIU19BZ2VuY3kiLCAiUHJlX1NIU19Ub3RhbEhvcGUiLAogICAgICAgICAgICAgICJQcmVfdWNsYV9TdW0iLCAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsICJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlByZV9wbWVycV9BRF9BdmciKQoKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfR0FEN19TdW0iLCAiUG9zdF9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQb3N0X1NIU19QYXRod2F5cyIsICJQb3N0X1NIU19BZ2VuY3kiLCAiUG9zdF9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlBvc3RfdWNsYV9TdW0iLCAiUG9zdF9wbWVycV9Gb2N1c19BdmciLCAiUG9zdF9wbWVycV9EaXN0cmFjdF9BdmciLCAiUG9zdF9wbWVycV9BRF9BdmciKQoKCiMgQ29tcHV0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBQcmUtVGVzdCBEYXRhCnByZV9kZXNjcmlwdGl2ZXMgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIHNlbGVjdChhbGxfb2YocHJlX3ZhcnMpKSAlPiUKICBwc3ljaDo6ZGVzY3JpYmUoKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KG4sIG1lYW4sIHNkLCBtaW4sIG1heCwgc2tldywga3VydG9zaXMpICU+JQogIHJlbmFtZShOID0gbiwgTWVhbiA9IG1lYW4sIFNEID0gc2QsIE1pbiA9IG1pbiwgTWF4ID0gbWF4LCBTa2V3bmVzcyA9IHNrZXcsIEt1cnRvc2lzID0ga3VydG9zaXMpCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgUG9zdC1UZXN0IERhdGEKcG9zdF9kZXNjcmlwdGl2ZXMgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIHNlbGVjdChhbGxfb2YocG9zdF92YXJzKSkgJT4lCiAgcHN5Y2g6OmRlc2NyaWJlKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdChuLCBtZWFuLCBzZCwgbWluLCBtYXgsIHNrZXcsIGt1cnRvc2lzKSAlPiUKICByZW5hbWUoTiA9IG4sIE1lYW4gPSBtZWFuLCBTRCA9IHNkLCBNaW4gPSBtaW4sIE1heCA9IG1heCwgU2tld25lc3MgPSBza2V3LCBLdXJ0b3NpcyA9IGt1cnRvc2lzKQoKIyBEaXNwbGF5IERlc2NyaXB0aXZlIFRhYmxlcwpjYXQoIlxuIyMjICoqUHJlLVRlc3QgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqXG4iKQprYWJsZShwcmVfZGVzY3JpcHRpdmVzLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFByZS1UZXN0IERhdGEiLCBkaWdpdHMgPSAzKQoKY2F0KCJcbiMjIyAqKlBvc3QtVGVzdCBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzKipcbiIpCmthYmxlKHBvc3RfZGVzY3JpcHRpdmVzLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFBvc3QtVGVzdCBEYXRhIiwgZGlnaXRzID0gMykKCiMgQ3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gc3RvcmUgQU5DT1ZBIHJlc3VsdHMKYW5jb3ZhX3Jlc3VsdHMgPC0gdGliYmxlKCkKCiMgUnVuIEFOQ09WQXMgZm9yIGVhY2ggcG9zdC10ZXN0IHZhcmlhYmxlIGNvbnRyb2xsaW5nIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcmUtdGVzdCB2YXJpYWJsZQpmb3IgKHBvc3RfdmFyIGluIHBvc3RfdmFycykgewogICMgSWRlbnRpZnkgdGhlIGNvcnJlc3BvbmRpbmcgcHJlIHZhcmlhYmxlCiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgcG9zdF92YXIpCgogICMgRW5zdXJlIHRoYXQgYm90aCB2YXJpYWJsZXMgZXhpc3QgaW4gdGhlIGRhdGFzZXQKICBpZiAoIShwcmVfdmFyICVpbiUgbmFtZXMocHVycmJsZV93aWRlX2ZpbmFsKSkpIHsKICAgIG5leHQgICMgU2tpcCBpZiBwcmUtdGVzdCB2YXJpYWJsZSBpcyBtaXNzaW5nCiAgfQoKICAjIEZpdCB0aGUgQU5DT1ZBIG1vZGVsCiAgZm9ybXVsYV9zdHIgPC0gcGFzdGUocG9zdF92YXIsICJ+IGNvbmRpdGlvbiArIiwgcHJlX3ZhcikKICBtb2RlbCA8LSBhb3YoYXMuZm9ybXVsYShmb3JtdWxhX3N0ciksIGRhdGEgPSBwdXJyYmxlX3dpZGVfZmluYWwpCgogICMgRXh0cmFjdCBtb2RlbCBzdW1tYXJ5IHN0YXRpc3RpY3MKICBhbmNvdmFfc3VtbWFyeSA8LSB0aWR5KG1vZGVsKSAlPiUKICAgIGZpbHRlcih0ZXJtID09ICJjb25kaXRpb24iKSAlPiUKICAgIHNlbGVjdChzdGF0aXN0aWMsIHAudmFsdWUpICU+JQogICAgcmVuYW1lKGBGLVZhbHVlYCA9IHN0YXRpc3RpYywgYHAtVmFsdWVgID0gcC52YWx1ZSkKCiAgIyBDYWxjdWxhdGUgTWVhbnMgYW5kIFNEcyBieSBjb25kaXRpb24gZm9yIHRoZSBwb3N0LXRlc3QgdmFyaWFibGUKICBjb25kX3N1bW1hcnkgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogICAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgTWVhbiA9IG1lYW4oLmRhdGFbW3Bvc3RfdmFyXV0sIG5hLnJtID0gVFJVRSksCiAgICAgIFNEID0gc2QoLmRhdGFbW3Bvc3RfdmFyXV0sIG5hLnJtID0gVFJVRSkKICAgICkgJT4lCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IGMoTWVhbiwgU0QpKQoKICAjIENvbWJpbmUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIHJvdwogIGFuY292YV9yZXN1bHRzIDwtIGJpbmRfcm93cyhhbmNvdmFfcmVzdWx0cywKICAgIHRpYmJsZSgKICAgICAgT3V0Y29tZSA9IHBvc3RfdmFyLAogICAgICBgUHJlLVRlc3QgQ292YXJpYXRlYCA9IHByZV92YXIKICAgICkgJT4lCiAgICAgIGJpbmRfY29scyhjb25kX3N1bW1hcnksIGFuY292YV9zdW1tYXJ5KSAKICApCn0KCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlZCBBTkNPVkEgcmVzdWx0cyB0YWJsZQpjYXQoIlxuIyMjICoqQU5DT1ZBIFJlc3VsdHMgYnkgT3V0Y29tZSoqXG4iKQprYWJsZShhbmNvdmFfcmVzdWx0cywgY2FwdGlvbiA9ICJBbmFseXNpcyBvZiBDb3ZhcmlhbmNlIChBTkNPVkEpIFJlc3VsdHMgYnkgT3V0Y29tZSIsIGRpZ2l0cyA9IDMpCgpgYGAKKipGb2xsb3ctdXA6IEVmZmVjdCBTaXplcyBmb3IgU2lnbmlmaWNhbnQvTWFyZ2luYWwgVmFyaWFibGVzKioKKEknbSBzb3JyeSBJIGRvbid0IGtub3cgaG93IHRvIG1ha2UgdGhpcyBsb29rIHByZXR0eSEgSWYgYW55b25lIGtub3dzIHBsZWFzZSBoZWxwISkKQ29oZW4ncyBGIEZvciBFYWNoIFNpZ25pZmljYW50L01hcmdpbmFsIE91dGNvbWU6IApBbnhpZXR5OiAuIDAuMTYKRGVwcmVzc2lvbjogMC4yMQpERVJTOiAwLjMxCgpgYGB7cn0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShlZmZlY3RzaXplKQoKIyBEZWZpbmUgdGhlIHBvc3QtdGVzdCB2YXJpYWJsZXMgdG8gYW5hbHl6ZQpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCgpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iKQoKIyBSdW4gQU5DT1ZBcyBmb3IgZWFjaCBwb3N0LXRlc3QgdmFyaWFibGUgY29udHJvbGxpbmcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByZS10ZXN0IHZhcmlhYmxlCmZvciAocG9zdF92YXIgaW4gcG9zdF92YXJzKSB7CiAgIyBJZGVudGlmeSB0aGUgY29ycmVzcG9uZGluZyBwcmUgdmFyaWFibGUKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBwb3N0X3ZhcikKCiAgIyBFbnN1cmUgdGhhdCBib3RoIHZhcmlhYmxlcyBleGlzdCBpbiB0aGUgZGF0YXNldAogIGlmICghKHByZV92YXIgJWluJSBuYW1lcyhwdXJyYmxlX3dpZGVfZmluYWwpKSkgewogICAgY2F0KCJObyBjb3JyZXNwb25kaW5nIHByZS10ZXN0IHZhcmlhYmxlIGZvdW5kIGZvcjoiLCBwb3N0X3ZhciwgIlxuIikKICAgIG5leHQKICB9CgogICMgRml0IHRoZSBBTkNPVkEgbW9kZWwKICBmb3JtdWxhX3N0ciA8LSBwYXN0ZShwb3N0X3ZhciwgIn4gY29uZGl0aW9uICsiLCBwcmVfdmFyKQogIG1vZGVsIDwtIGFvdihhcy5mb3JtdWxhKGZvcm11bGFfc3RyKSwgZGF0YSA9IHB1cnJibGVfd2lkZV9maW5hbCkKCiAgIyBQcmludCBhIGhlYWRlciBhbmQgdGhlIG1vZGVsIHN1bW1hcnkKICBjYXQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQogIGNhdCgiQU5DT1ZBIGZvcjoiLCBwb3N0X3ZhciwgImNvbnRyb2xsaW5nIGZvciIsIHByZV92YXIsICJcbiIpCiAgY2F0KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCiAgcHJpbnQoc3VtbWFyeShtb2RlbCkpCiAgCiAgIyBDb21wdXRlIHBhcnRpYWwgZXRhIHNxdWFyZWQKICBldGFfc3FfcmVzdWx0cyA8LSBldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUpCiAgCiAgIyBDb21wdXRlIENvaGVuJ3MgZiAocGFydGlhbCkKICBmX3Jlc3VsdHMgPC0gY29oZW5zX2YobW9kZWwsIHBhcnRpYWwgPSBUUlVFKQogIAogIGNhdCgiXG5QYXJ0aWFsIEV0YSBTcXVhcmVkOlxuIikKICBwcmludChldGFfc3FfcmVzdWx0cykKICAKICBjYXQoIlxuQ29oZW4ncyBmIChQYXJ0aWFsKTpcbiIpCiAgcHJpbnQoZl9yZXN1bHRzKQp9CgoKYGBgCgoqKlNlbGYtaGFybSBRdWVzdGlvbnMqKgoKUG9zdC10ZXN0IExvZ2lzdGljIFJlZ3Jlc3Npb24gdG8gSW52ZXN0aWdhdGUgSW50ZXJ2ZW50aW9uIEVmZmVjdHMgb24gU2VsZi1IYXJtIE91dGNvbWVzCipSZXN1bHQ6KiAKQ29uZGl0aW9uIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgYW55IHNlbGYtaGFybSBvdXRjb21lIChjb2RlZCBiaW5hcnkpLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KSAgIApsaWJyYXJ5KGJyb29tKSAKCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIG11dGF0ZSgKICAgICMgSWYgbWlzc2luZywgdGhlbiBOQS4gSWYgPD0gMSB0aGVuIDAsIGVsc2UgMQogICAgU0hRMSA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjEpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMSA8PSAxLCAwLCAxKSksCiAgICBTSFEyID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMiksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIyIDw9IDEsIDAsIDEpKSwKICAgIFNIUTMgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIzKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjMgPD0gMSwgMCwgMSkpCiAgKSAlPiUKICBtdXRhdGUoCiAgICAjIElmIGFueSBvZiBTSFExLCBTSFEyLCBvciBTSFEzIGlzIG1pc3NpbmcsIFNIUV9BbnkgaXMgbWlzc2luZy4KICAgICMgSWYgYWxsIHRocmVlIGFyZSAwLCBTSFFfQW55IGlzIDAsIGVsc2UgMS4KICAgIFNIUV9BbnkgPSBjYXNlX3doZW4oCiAgICAgIGlzLm5hKFNIUTEpIHwgaXMubmEoU0hRMikgfCBpcy5uYShTSFEzKSB+IE5BX3JlYWxfLAogICAgICBTSFExID09IDAgJiBTSFEyID09IDAgJiBTSFEzID09IDAgfiAwLAogICAgICBUUlVFIH4gMQogICAgKQogICkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFExIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTEgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHExIDwtIGdsbSgKICBTSFExXzEyIH4gY29uZGl0aW9uICsgU0hRMV8yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTIgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMiBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTIgPC0gZ2xtKAogIFNIUTJfMTIgfiBjb25kaXRpb24gKyBTSFEyXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMyBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEzIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMyA8LSBnbG0oCiAgU0hRM18xMiB+IGNvbmRpdGlvbiArIFNIUTNfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0KSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFFfQW55IGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUV9BbnkgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHFBbnkgPC0gZ2xtKAogIFNIUV9BbnlfMTIgfiBjb25kaXRpb24gKyBTSFFfQW55XzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMgQ3JlYXRlIGd0c3VtbWFyeSB0YWJsZXMgZm9yIGVhY2ggbW9kZWwsIGV4cG9uZW50aWF0aW5nIGZvciBPUgp0Ymxfc2hxMSAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTEsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMiAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTIsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMyAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTMsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxQW55IDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocUFueSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCm1lcmdlZF90YmwgPC0gdGJsX21lcmdlKAogICB0YmxzID0gbGlzdCh0Ymxfc2hxMSwgdGJsX3NocTIsIHRibF9zaHEzLCB0Ymxfc2hxQW55KSwKICAgdGFiX3NwYW5uZXIgPSBjKCJTSFExIE1vZGVsIiwgIlNIUTIgTW9kZWwiLCAiU0hRMyBNb2RlbCIsICJTSFFfQW55IE1vZGVsIikKICkKIG1lcmdlZF90YmwKCmBgYAoKCkJlbG93LCB3ZSBkaXNwbGF5IGEgdGFibGUgYW5kIGdyYXBoIG9mIHRoZSBmcmVxdWVuY3kgb2YgcmVzcG9uc2VzIGZvciBhbGwgc2VsZi1oYXJtIHF1ZXN0aW9ucy4gClBsZWFzZSBub3RlLSB0aGV5IGFyZSBhbGwgZXF1YWwgKHdoaWNoIGlzIHdoeSB0aGUgbGluZXMgYWxsIG92ZXJsYXAgYW5kIHRoZXJlIGFwcGVhcnMgdG8gb25seSBiZSBvbmUhKQpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0KQoKc2hxX3N1bW1hcnkgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgZ3JvdXBfYnkoV2VlaykgJT4lCiAgc3VtbWFyaXNlKAogICAgTl9TSFExID0gc3VtKCFpcy5uYShTSFExKSksCiAgICBOX1NIUTIgPSBzdW0oIWlzLm5hKFNIUTIpKSwKICAgIE5fU0hRMyA9IHN1bSghaXMubmEoU0hRMykpCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgUmVtb3ZlIHdlZWsgMCBhbmQgTkEgdmFsdWVzCnNocV9zdW1tYXJ5X2NsZWFuIDwtIHNocV9zdW1tYXJ5ICU+JQogIGZpbHRlcighaXMubmEoV2VlaykgJiBXZWVrICE9IDApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggZm9yIFJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdChzaHFfc3VtbWFyeV9jbGVhbiwgYWVzKHggPSBXZWVrKSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMSwgY29sb3IgPSAiU0hRMSIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMiwgY29sb3IgPSAiU0hRMiIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMywgY29sb3IgPSAiU0hRMyIpLCBzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNwb25zZSBSYXRlIE92ZXIgVGltZSBmb3IgU0hRIFZhcmlhYmxlcyIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJOdW1iZXIgb2YgTm9uLU1pc3NpbmcgUmVzcG9uc2VzIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX3N1bW1hcnlfY2xlYW4kV2VlaykpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU0hRMSIgPSAiYmx1ZSIsICJTSFEyIiA9ICJyZWQiLCAiU0hRMyIgPSAiZ3JlZW4iKSkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGlzcGxheSBUYWJsZTogUmVzcG9uc2UgQ291bnRzIE92ZXIgVGltZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfc3VtbWFyeV9jbGVhbiAlPiUKICBndCgpICU+JQogIGd0Ojp0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIFJlc3BvbnNlcyBmb3IgU2VsZi1IYXJtIFF1ZXN0aW9ucyBPdmVyIFRpbWUiCiAgKQpgYGAKCgoqKkxpbmVhciBNaXhlZCBFZmZlY3RzIE1vZGVscyoqClJlc3VsdHMgaW50ZXJwcmV0YXRpb246CgoKIyMgKipPdmVyYWxsIFN1bW1hcnkgb2YgU2lnbmlmaWNhbnQgUmVzdWx0cyoqCi0gKipQdXJyYmxlIHNob3dlZCBncmVhdGVyIGltcHJvdmVtZW50IGNvbXBhcmVkIHRvIHRoZSBXYWl0bGlzdCBncm91cCBmb3I6KioKICAtICoqRW1vdGlvbmFsIER5c3JlZ3VsYXRpb24gKERFUlM4KSoqCiAgLSAqKkFueGlldHkgKEdBRDcpKioKICAtICoqRGVwcmVzc2lvbiAoUEhROSkqKgogIC0gKipQb3NpdGl2ZSBFbW90aW9uIFJlZ3VsYXRpb24gLSBGb2N1cyAocG1lcnFfRm9jdXNfQXZnKSoqCiAgLSAqKlBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEF0dGVudGlvbmFsIERlcGxveW1lbnQgKHBtZXJxX0FEX0F2ZykqKgoKLS0tCgojIyAqKkZpeGVkIEVmZmVjdHMgUmVzdWx0cyoqCgojIyMgKioxLiBFbW90aW9uYWwgRHlzcmVndWxhdGlvbiAoREVSUzhfU3VtKSoqCiAgLSAqKkludGVyYWN0aW9uIEVmZmVjdDoqKiBUaGUgV2FpdGxpc3QgZ3JvdXAgc2hvd2VkIGEgc2lnbmlmaWNhbnRseSBsZXNzIHN0ZWVwIGRlY2xpbmUgdGhhbiBQdXJyYmxlICgqcCogPCAwLjAwMSkuCiAgLSAqKkludGVycHJldGF0aW9uOioqIEVtb3Rpb25hbCBkeXNyZWd1bGF0aW9uIGltcHJvdmVkIG1vcmUgaW4gdGhlICoqUHVycmJsZSoqIGdyb3VwIGNvbXBhcmVkIHRvICoqV2FpdGxpc3QqKi4KCiMjIyAqKjIuIEFueGlldHkgU3ltcHRvbXMgKEdBRDdfU3VtKSoqCiAgLSAqKkludGVyYWN0aW9uIEVmZmVjdDoqKiBUaGUgV2FpdGxpc3QgZ3JvdXAgZXhwZXJpZW5jZWQgYSBzaWduaWZpY2FudGx5IHNtYWxsZXIgaW1wcm92ZW1lbnQgdGhhbiBQdXJyYmxlICgqcCogPSAwLjAxNikuCiAgLSAqKkludGVycHJldGF0aW9uOioqIEFueGlldHkgc3ltcHRvbXMgZGVjcmVhc2VkIG1vcmUgaW4gdGhlICoqUHVycmJsZSoqIGdyb3VwIHRoYW4gaW4gKipXYWl0bGlzdCoqLgoKIyMjICoqMy4gRGVwcmVzc2lvbiBTeW1wdG9tcyAoUEhROV9TdW0pKioKICAtICoqSW50ZXJhY3Rpb24gRWZmZWN0OioqIFRoZSBXYWl0bGlzdCBncm91cCBzaG93ZWQgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGltcHJvdmVtZW50IHRoYW4gUHVycmJsZSAoKnAqIDwgMC4wMDEpLgogIC0gKipJbnRlcnByZXRhdGlvbjoqKiBUaGUgKipQdXJyYmxlKiogZ3JvdXAgZXhwZXJpZW5jZWQgYSBncmVhdGVyIHJlZHVjdGlvbiBpbiAqKmRlcHJlc3NpdmUgc3ltcHRvbXMqKi4KCiMjIyAqKjQuIFBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEZvY3VzIChwbWVycV9Gb2N1c19BdmcpKioKICAtICoqSW50ZXJhY3Rpb24gRWZmZWN0OioqIFRoZSBQdXJyYmxlIGdyb3VwIHNob3dlZCBhIHNsaWdodGx5IGdyZWF0ZXIgaW1wcm92ZW1lbnQgdGhhbiB0aGUgV2FpdGxpc3QgZ3JvdXAgKCpwKiA9IDAuMDE4KS4KICAtICoqSW50ZXJwcmV0YXRpb246KiogVGhlICoqUHVycmJsZSoqIGdyb3VwIGhhZCAqKmVuaGFuY2VkIGVtb3Rpb24gcmVndWxhdGlvbiBzdHJhdGVnaWVzKiogZm9jdXNlZCBvbiBwb3NpdGl2ZSBlbW90aW9ucy4KCiMjIyAqKjUuIFBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEF0dGVudGlvbmFsIERlcGxveW1lbnQgKHBtZXJxX0FEX0F2ZykqKgogIC0gKipJbnRlcmFjdGlvbiBFZmZlY3Q6KiogVGhlIFB1cnJibGUgZ3JvdXAgc2hvd2VkIHNpZ25pZmljYW50bHkgZ3JlYXRlciBpbXByb3ZlbWVudCBjb21wYXJlZCB0byB0aGUgV2FpdGxpc3QgZ3JvdXAgKCpwKiA9IDAuMDEwKS4KICAtICoqSW50ZXJwcmV0YXRpb246KiogVGhlICoqUHVycmJsZSoqIGdyb3VwIGltcHJvdmVkIG1vcmUgaW4gKiphY2NlcHRhbmNlIGFuZCBkYW1wZW5pbmcgc3RyYXRlZ2llcyoqLgoKLS0tCgojIyAqKk5vbi1TaWduaWZpY2FudCBJbnRlcmFjdGlvbiBFZmZlY3RzKioKRm9yIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLCB0aGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyb3VwcyBvdmVyIHRpbWU6Ci0gKipIb3BlIFBhdGh3YXlzIChTSFNfUGF0aHdheXMpKioKLSAqKkhvcGUgQWdlbmN5IChTSFNfQWdlbmN5KSoqCi0gKipUb3RhbCBIb3BlIChTSFNfVG90YWxIb3BlKSoqCi0gKipMb25lbGluZXNzIChVQ0xBX1N1bSkqKgotICoqUG9zaXRpdmUgRW1vdGlvbiBSZWd1bGF0aW9uIC0gRGlzdHJhY3Rpb24gKHBtZXJxX0Rpc3RyYWN0X0F2ZykqKiAobWFyZ2luYWwgdHJlbmQsICpwKiA9IDAuMDYzKQoKCmBgYHtyfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQoKIyBEZWZpbmUgb3V0Y29tZSB2YXJpYWJsZXMKb3V0Y29tZXMgPC0gYygKICAiREVSUzhfU3VtIiwgIkdBRDdfU3VtIiwgIlBIUTlfU3VtIiwgIlNIU19QYXRod2F5cyIsICJTSFNfQWdlbmN5IiwgCiAgIlNIU19Ub3RhbEhvcGUiLCAidWNsYV9TdW0iLCAicG1lcnFfRm9jdXNfQXZnIiwgInBtZXJxX0Rpc3RyYWN0X0F2ZyIsICJwbWVycV9BRF9BdmciCikKCiMgRW5zdXJlICdjb25kaXRpb24nIGlzIGEgZmFjdG9yCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIG1vZGVscwptb2RlbHNfbGlzdCA8LSBsaXN0KCkKCiMgRml0IGxpbmVhciBtaXhlZCBtb2RlbHMgYW5kIGV4dHJhY3QgcmVzdWx0cwpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBmb3JtdWxhX3N0ciA8LSBwYXN0ZTAob3V0Y29tZSwgIiB+IFdlZWsgKiBjb25kaXRpb24gKyAoMSB8IHBzaWQpIikKICBmaXQgPC0gbG1lcihhcy5mb3JtdWxhKGZvcm11bGFfc3RyKSwgZGF0YSA9IE5vRHVwX1B1cnJibGVBbm9uLCBSRU1MID0gVFJVRSkKICBtb2RlbHNfbGlzdFtbb3V0Y29tZV1dIDwtIGZpdAp9CgojIFByaW50IGVhY2ggbW9kZWwncyBmaXhlZCBlZmZlY3QgZXN0aW1hdGVzIGluIGEgcmVhZGFibGUgZm9ybWF0CmZvciAob3V0Y29tZSBpbiBuYW1lcyhtb2RlbHNfbGlzdCkpIHsKICBjYXQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKICBjYXQoIkZpeGVkIEVmZmVjdHMgZm9yIE91dGNvbWU6Iiwgb3V0Y29tZSwgIlxuIikKICBjYXQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCiAgCiAgIyBFeHRyYWN0IGZpeGVkIGVmZmVjdHMKICBjb2VmX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2RlbHNfbGlzdFtbb3V0Y29tZV1dKSRjb2VmZmljaWVudHMpCiAgY29lZl90YWJsZSRWYXJpYWJsZSA8LSByb3duYW1lcyhjb2VmX3RhYmxlKQogIHJvd25hbWVzKGNvZWZfdGFibGUpIDwtIE5VTEwgICMgUmVtb3ZlIHJvdyBuYW1lcwoKICAjIERpc3BsYXkgYXMgYSBmb3JtYXR0ZWQgdGFibGUKICBwcmludChrYWJsZShjb2VmX3RhYmxlLCBkaWdpdHMgPSAzLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKfQpgYGAKCgoKCg==