install.packages(“rciplot”) # 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_Master_Wide.” The long dataset format dataset is called “Purrble_Long_Master.” The wide dataset has all of the pre and posttest variables calculated, while the long does not. Otherwise, they do not differ.

This dataset includes the N=153 participants who were included in the randomized control trial examining Purrble with a population of university students. All participants were members of the LGTBQ+ community.

These analyses were conducted in October by Aubrey Rhodes. We use the “final” datasets in which we removed participant C72, who had no information on gender identity.

These analyses remove all of the variables except for emotion regulation, PHQ, and Anxiety as outcomes.

2.1. Participants

2.1.1 Participant Disposition

Corresponding Text: “resulting in a final sample size of 153 participants: Purrble condition (n=76), and the waitlist control condition (n=77).”

“Gender identity was evenly distributed across conditions, with 76 participants (49.7%) identifying as cisgender and 77 identifying as transgender, gender non-conforming, or questioning and or gender diverse (TGD; (50.3%).”

“Within conditions, the Purrble group consisted of 39 cisgender participants and 37 TGD participants, while the waitlist control group consisted of 37 cisgender participants and 40 TGD participants.”

Table 1: Number of Participants by Condition
condition Count
Purrble Treatment 76
Waitlist Control 77
Total 153
Table 2: Number of Participants by Gender Identity
identity_group Count
Cisgender 76
Transgender 77
Total 153
Table 3: Cross-tabulation of Condition by Gender Identity
condition Cisgender Transgender
Purrble Treatment 39 37
Waitlist Control 37 40

2.1.2 Participant Characteristics

Participants characteristics including sexual orientation, race/ethnicity, and age are shown reported by condition in Table 1.

Age: Descriptives

Summarizes age (Mean, SD, Min, Max) by condition.

Table: Descriptive Statistics for Age by Condition (APA Format)

condition

Mean

SD

Min

Max

Purrble Treatment

20.42

2.29

16.00

25.00

Waitlist Control

20.09

2.46

16.00

25.00

Sexual Orientation- Simplified

Table: Sexual Orientation (so_simplified) by Condition (Counts and Percentages)
so_simplified Purrble Treatment Waitlist Control Total
asexual 13 (17.1%) 9 (11.7%) 22 (14.4%)
bisexual 28 (36.8%) 25 (32.5%) 53 (34.6%)
demisexual 2 (2.6%) 1 (1.3%) 3 (2%)
gay/lesbian 11 (14.5%) 18 (23.4%) 29 (19%)
heterosexual 1 (1.3%) 0 (0%) 1 (0.7%)
pansexual 8 (10.5%) 9 (11.7%) 17 (11.1%)
queer 13 (17.1%) 15 (19.5%) 28 (18.3%)

Race

Table: Race Counts and Percentages by Condition
Race
Purrble Treatment
Waitlist Control
Total
Race count_Purrble Treatment percentage_Purrble Treatment count_Waitlist Control percentage_Waitlist Control total_count total_percentage
Race_Arabic 0 0.0 1 1.3 1 0.7
Race_Asian 10 13.2 17 22.1 27 17.6
Race_Black 1 1.3 3 3.9 4 2.6
Race_Hispanic 2 2.6 0 0.0 2 1.3
Race_White 60 78.9 55 71.4 115 75.2
Race_unknown 9 11.8 5 6.5 14 9.2
5 people in the Purrble Treatment condition reported multiple racial identities.
4 people in the Waitlist Control condition reported multiple racial identities.

2.1.3 Engagement and Retention

Number of questionnaires

Results Text: Participants completed an average of 12.4 questionnaires in the Purrble and 12.9 questionnaires in the control condition out of a possible 14 (Baseline [“Week 0”] through Follow-Up [“Week 13”]).

Table 3: Total Sessions Attended by Condition
condition mean_sessions sd_sessions n
Purrble Treatment 12.35526 2.237284 76
Waitlist Control 12.85714 2.056532 77

Attrition:

Results Text Attrition rates were low overall and did not differ significantly by condition, χ²(1, N = 153) = 0.11, p = .75, with 9.2% attrition in the Purrble condition (7 of 76 participants) and 6.5% attrition in the waitlist control condition (5 of 77 participants).

Table 7: Attrition Rate by Condition (with Completed and Not Completed counts)
condition n Completed Not_Completed attrition_rate attrition_percent
Waitlist 77 72 5 0.0649351 6.5
Purrble 76 69 7 0.0921053 9.2

Results Text: “Across the full sample, regression analyses indicated a significant decline in participation over time, with the average number of weekly respondents decreasing by approximately 2.14 per week (SE = 0.29, t = –7.36, p < .001). When examined by condition, participation declined at a rate of –1.46 participants per week in the Purrble group (SE = 0.23, t = –6.22, p < .001) and –0.69 participants per week in the waitlist control (SE = 0.12, t = –5.82, p < .001). A time × condition interaction (β = 0.77, SE = 0.26, p = .007) suggested a steeper linear decline in the Purrble group, though the absolute difference was small.”

Across the full sample, participation declined by -2.16 per week (SE = 0.29, t = -7.39, p = 0.000).
Slope difference (Week × Condition) estimate = 0.76, SE = 0.26, t = 2.86, p = 0.009; 95% CI [0.21, 1.30]
Waitlist decline = -1.46 /week
Purrble decline  = -0.70 /week

Participation by Group Over Time

Reviewer’s Comment: “Report the response rate to weekly surveys over time. Declining engagement is common in mental health populations and raises risk of selective reporting.”

Response “We agree that reporting response rates over time is important to assess potential engagement decline and selective response bias. We have now included a table summarizing weekly participation rates by condition across the study period.”

Added Text, Results “Weekly response rates are summarized by condition in Table X and Figure X.”

Table: Weekly Participation Rates (% of Total Randomized) by Condition
Week Purrble Treatment Waitlist Control
1 97.4 94.8
2 97.4 96.1
3 98.7 96.1
4 94.7 90.9
5 89.5 92.2
6 88.2 92.2
7 89.5 93.5
8 90.8 94.8
9 80.3 87.0
10 82.9 85.7
11 81.6 85.7
12 65.8 87.0
13 81.6 88.3

Across the full sample, regression analyses indicated a significant decline in participation over time, with the average number of weekly respondents decreasing by approximately 2.14 per week (SE = 0.29, t = –7.36, p < .001). When examined by condition, participation declined at a rate of –1.46 participants per week in the Purrble group (SE = 0.23, t = –6.22, p < .001) and –0.70 participants per week in the waitlist control (SE = 0.12, t = –5.82, p < .001). A time × condition interaction (β = 0.77, SE = 0.26, p = .007) suggested a slightly steeper linear decline in the Purrble group, though the absolute difference was small (approximately 0.2–0.3 participants per week).

2.2. Preliminary Analyses

2.2.1 Descriptive Statistics

Reviewer Comment: “Please provide absolute group means and SDs at baseline and follow-up for all outcomes in the main text, not only adjusted differences.”

Response: “Thank you for pointing out this omission. We agree that presenting absolute group means and standard deviations provides important context for interpreting adjusted effects. We have now added a table summarizing pre- and post-test descriptive statistics (means and standard deviations) for all outcomes by condition.”

Added Text: Table X presents pre- and post-test descriptive statistics (means and standard deviations) for all primary and secondary outcomes by condition.

Means and standard deviations for each outcome by condition and time point
Waitlist
Purrble
Outcome Pre Post Pre Post
Emotion Regulation 28.38 (4.32) 28.61 (6.52) 27.92 (5.10) 25.26 (7.80)
Anxiety 13.65 (3.74) 13.20 (4.46) 13.78 (4.25) 12.00 (5.47)
Depression 14.70 (4.24) 15.15 (5.93) 15.39 (4.90) 13.44 (6.66)
Means and standard deviations (M ± SD) for each outcome by condition, time point, and gender identity
Outcome Identity Group Condition Pre Post
Anxiety Cisgender Purrble 13.13 (4.11) 10.50 (5.37)
Anxiety Cisgender Waitlist 13.41 (3.45) 13.55 (4.57)
Anxiety TGD Purrble 14.46 (4.34) 13.46 (5.22)
Anxiety TGD Waitlist 13.88 (4.02) 12.85 (4.37)
Depression Cisgender Purrble 14.18 (4.67) 11.65 (6.84)
Depression Cisgender Waitlist 14.38 (4.32) 15.71 (6.54)
Depression TGD Purrble 16.66 (4.87) 15.18 (6.07)
Depression TGD Waitlist 15.00 (4.20) 14.59 (5.27)
Emotion Regulation Cisgender Purrble 27.31 (5.21) 23.03 (8.18)
Emotion Regulation Cisgender Waitlist 28.38 (4.13) 28.84 (6.97)
Emotion Regulation TGD Purrble 28.56 (4.97) 27.42 (6.85)
Emotion Regulation TGD Waitlist 28.38 (4.55) 28.38 (6.13)

2.2.2 Baseline Equivalence

Results Text: Baseline measures of outcome variables and participant age did not differ significantly between conditions.

### Table. Baseline Equivalence Across Conditions (Independent-Samples t-tests)

Variable

Dependent Variable

t

df

p

d

95% CI

Age

age

0.86

150.51

.392

0.14

[-0.18, 0.46]

Emotion Regulation (DERS-8)

Pre_DERS8_Sum

-0.60

146.06

.551

-0.10

[-0.41, 0.22]

Anxiety (GAD-7)

Pre_GAD7_Sum

0.20

147.61

.840

0.03

[-0.29, 0.35]

Depression (PHQ-9)

Pre_PHQ9_Sum

0.93

147.00

.353

0.15

[-0.17, 0.47]

##2.2.3 Outliers

Methods Text: Second, we performed multivariate outlier analyses to identify influential data points (63).

Results Text: We examined potential multivariate outliers among baseline variables (Pre-DERS8, Pre-GAD7, Pre-PHQ9) using Mahalanobis distance. Distances were compared to the χ² distribution with 3 degrees of freedom at p < .99 (critical value = 11.34). One participant exceeded this threshold (D² = 14.57), indicating a somewhat atypical combination of baseline emotion-regulation, anxiety, and depression scores. To evaluate influence on model results, we reran all primary analyses (ANCOVA and linear mixed-effects models) with and without this participant. The pattern, magnitude, and significance of results were unchanged. Accordingly, all analyses were reported using the full sample.


FALSE  TRUE 
  151     1 

Outlier participant(s) based on Mahalanobis distance (p < .99):

##2.2.4 Attrition Analysis. Methods Text: Third, we conducted attrition analyses (64), with attrition operationalised as participants failing to fill in any follow-up questionnaires (Weeks 11–13). A binary indicator was created to represent follow-up completion (1 = filled in at least one follow-up questionnaire; 0 = filled in none). Attrition rates were calculated overall, by condition, and by gender identity, using chi-square tests to determine whether attrition differed by condition or gender identity.

Results Text: Chi-square tests indicated that attrition rates did not differ significantly by condition, χ²(1) = 0.11, p = .75, or by gender identity, χ²(1) <0.01, p = 1. While and there were no main or interactive effects of attrition on outcomes.



### Chi-square test for attrition by Condition :

    Pearson's Chi-squared test with Yates' continuity correction

data:  ct
X-squared = 0.10517, df = 1, p-value = 0.7457
Table: Attrition Rate by Condition (with Completed and Not Completed counts)
condition n Completed Not_Completed attrition_rate attrition_percent
Purrble Treatment 76 69 7 0.0921053 9.2
Waitlist Control 77 72 5 0.0649351 6.5
NULL


### Chi-square test for attrition by Gender Identity :

    Pearson's Chi-squared test with Yates' continuity correction

data:  ct
X-squared = 1.4323e-30, df = 1, p-value = 1
Table: Attrition Rate by Gender Identity (with Completed and Not Completed counts)
identity_group n Completed Not_Completed attrition_rate attrition_percent
0 76 70 6 0.0789474 7.9
1 77 71 6 0.0779221 7.8
NULL

Methods Text: Then, to assess potential attrition bias, we conducted two-way ANOVAs testing for Condition × Attrition Status effects on each baseline outcome variable.

Results Text: No main or interactive effects of attrition status were observed on any baseline variable, indicating no evidence of differential attrition

Table: Two-way ANOVAs for Baseline Outcomes by Condition and Attrition Status
Variable Effect df F p
Emotion Regulation (DERS-8) Condition 1 0.356 0.552
Emotion Regulation (DERS-8) Attrition Status 1 1.356 0.246
Emotion Regulation (DERS-8) Condition × Attrition 1 0.114 0.736
Anxiety (GAD-7) Condition 1 0.041 0.841
Anxiety (GAD-7) Attrition Status 1 0.073 0.787
Anxiety (GAD-7) Condition × Attrition 1 0.000 0.994
Depression (PHQ-9) Condition 1 0.859 0.356
Depression (PHQ-9) Attrition Status 1 0.132 0.717
Depression (PHQ-9) Condition × Attrition 1 0.198 0.657

#2.3 Program Effects

2.3.1 # Main Effects Analyses

These are the main results for the paper here.

condition_num levels:
[1] 0 1

identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -0.959 -11.072 9.155 5.114 -0.188 0.852 NA NA NA
condition_num -3.039 -4.916 -1.162 0.949 -3.202 0.002 0.090 0.027 1
Pre_DERS8_Sum 0.921 0.723 1.119 0.100 9.214 0.000 0.395 0.293 1
identity_group 1.693 -0.258 3.643 0.986 1.716 0.088 0.019 0.000 1
age 0.127 -0.291 0.544 0.211 0.600 0.549 0.003 0.000 1
Parameter Estimates for Post_GAD7_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -2.720 -9.151 3.711 3.252 -0.837 0.404 NA NA NA
condition_num -1.350 -2.660 -0.040 0.663 -2.037 0.044 0.024 0.000 1
Pre_GAD7_Sum 0.739 0.576 0.902 0.082 8.979 0.000 0.388 0.285 1
identity_group 0.750 -0.621 2.121 0.693 1.082 0.281 0.003 0.000 1
age 0.271 -0.020 0.562 0.147 1.839 0.068 0.024 0.000 1
Parameter Estimates for Post_PHQ9_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -5.618 -12.580 1.343 3.520 -1.596 0.113 NA NA NA
condition_num -2.604 -4.018 -1.191 0.715 -3.644 0.000 0.043 0.005 1
Pre_PHQ9_Sum 1.002 0.849 1.155 0.077 12.961 0.000 0.559 0.471 1
identity_group 0.254 -1.222 1.731 0.746 0.341 0.734 0.000 0.000 1
age 0.295 -0.018 0.607 0.158 1.864 0.064 0.025 0.000 1

Outlier Check: Re-run without T42

Results Text: The pattern, magnitude, and significance of results were unchanged. Accordingly, all analyses were reported using the full sample.

Main effects with adjusted means put into one neat table

Additionally, runs results with outlier removed (psid-T42)

condition_num levels:
[1] 0 1

identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -1.019 -11.160 9.121 5.127 -0.199 0.843 NA NA NA
condition_num -2.995 -4.882 -1.107 0.954 -3.138 0.002 0.084 0.024 1
Pre_DERS8_Sum 0.916 0.717 1.115 0.101 9.106 0.000 0.391 0.289 1
identity_group 1.657 -0.302 3.616 0.990 1.673 0.097 0.018 0.000 1
age 0.135 -0.284 0.554 0.212 0.639 0.524 0.003 0.000 1
Parameter Estimates for Post_GAD7_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -2.657 -9.160 3.845 3.288 -0.808 0.420 NA NA NA
condition_num -1.359 -2.678 -0.039 0.667 -2.036 0.044 0.028 0.000 1
Pre_GAD7_Sum 0.736 0.570 0.903 0.084 8.753 0.000 0.378 0.275 1
identity_group 0.760 -0.622 2.143 0.699 1.088 0.279 0.003 0.000 1
age 0.270 -0.023 0.562 0.148 1.822 0.071 0.024 0.000 1
Parameter Estimates for Post_PHQ9_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -5.441 -12.481 1.598 3.559 -1.529 0.129 NA NA NA
condition_num -2.624 -4.045 -1.202 0.719 -3.651 0.000 0.051 0.008 1
Pre_PHQ9_Sum 0.996 0.840 1.153 0.079 12.605 0.000 0.548 0.458 1
identity_group 0.282 -1.205 1.770 0.752 0.375 0.708 0.000 0.000 1
age 0.291 -0.023 0.605 0.159 1.830 0.069 0.024 0.000 1
Error in select(mutate(broom::tidy(model, conf.int = TRUE), across(where(is.numeric),  : 
  unused arguments (term, estimate, conf.low, conf.high, std.error, statistic, p.value)

Reviewer’s Comment: Report effect sizes with 95% CIs for adjusted mean differences, standardized mean differences

My Response to Comment:
We thank the reviewer for this helpful suggestion. We have now added both unstandardized and standardized effect sizes, each reported with their 95% confidence intervals. Specifically, we:

Computed adjusted mean differences (β) between the Purrble and waitlist control conditions using estimated marginal means from the ANCOVA models, along with their 95% CIs.

Calculated standardized mean differences (Cohen’s d) and corresponding 95% CIs using the emmeans::eff_size() function, based on the model residual variance.

Added these results in a new summary table following each ANCOVA table (see Table X).

This table now reports, for each outcome, the adjusted group means, adjusted mean difference with 95% CI, and standardized mean difference (Cohen’s d) with 95% CI, as requested.

Error in contrast.emmGrid(object, method, adjust = "none", ...) : 
  Contrast function 'cohen.emmc' not found
Error in select(effectsize::eta_squared(model, partial = TRUE), Parameter,  : 
  unused arguments (Parameter, Eta2_partial)

Robustness Check using the Benjamini–Hochberg (BH) False Discovery Rate (FDR) procedure.

This robustness check accounts for multiple statistical tests across the three primary outcomes by applying the Benjamini–Hochberg procedure, which controls the false discovery rate (FDR). This method is less conservative than Bonferroni and is appropriate when outcomes are conceptually related but not fully independent. All primary outcome effects remain statistically significant after correction (FDR q < .05), supporting the robustness of the main findings.

[1] 0.003 0.044 0.000

Reliable Change Indices

DERS-8
GAD-7
PHQ-9
How many showed reliable change on all 3 measures?

2.3.1 Moderation Analyses

condition_num levels:
[1] 0 1

identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) 0.316 -9.746 10.378 5.087 0.062 0.951 NA NA NA
condition_num -5.006 -7.629 -2.382 1.326 -3.774 0.000 0.092 0.029 1
Pre_DERS8_Sum 0.913 0.717 1.108 0.099 9.238 0.000 0.403 0.301 1
identity_group -0.242 -2.897 2.412 1.342 -0.181 0.857 0.020 0.000 1
age 0.122 -0.290 0.534 0.208 0.587 0.558 0.003 0.000 1
condition_num:identity_group 3.924 0.220 7.628 1.873 2.095 0.038 0.032 0.001 1
Parameter Estimates for Post_GAD7_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -1.819 -8.214 4.577 3.234 -0.562 0.575 NA NA NA
condition_num -2.777 -4.606 -0.948 0.925 -3.004 0.003 0.025 0.000 1
Pre_GAD7_Sum 0.728 0.567 0.889 0.081 8.946 0.000 0.396 0.294 1
identity_group -0.651 -2.506 1.205 0.938 -0.694 0.489 0.003 0.000 1
age 0.268 -0.019 0.555 0.145 1.845 0.067 0.025 0.000 1
condition_num:identity_group 2.857 0.267 5.446 1.309 2.182 0.031 0.034 0.002 1
Parameter Estimates for Post_PHQ9_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -4.721 -11.697 2.255 3.527 -1.338 0.183 NA NA NA
condition_num -3.864 -5.840 -1.888 0.999 -3.868 0.000 0.044 0.005 1
Pre_PHQ9_Sum 0.987 0.835 1.140 0.077 12.792 0.000 0.565 0.478 1
identity_group -0.983 -2.987 1.021 1.013 -0.970 0.334 0.000 0.000 1
age 0.291 -0.019 0.601 0.157 1.858 0.065 0.026 0.000 1
condition_num:identity_group 2.543 -0.267 5.353 1.421 1.790 0.076 0.023 0.000 1
condition_num levels:
[1] 0 1

identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) 0.316 -9.746 10.378 5.087 0.062 0.951 NA NA NA
condition_num -5.006 -7.629 -2.382 1.326 -3.774 0.000 0.092 0.029 1
Pre_DERS8_Sum 0.913 0.717 1.108 0.099 9.238 0.000 0.403 0.301 1
identity_group -0.242 -2.897 2.412 1.342 -0.181 0.857 0.020 0.000 1
age 0.122 -0.290 0.534 0.208 0.587 0.558 0.003 0.000 1
condition_num:identity_group 3.924 0.220 7.628 1.873 2.095 0.038 0.032 0.001 1
Parameter Estimates for Post_GAD7_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -1.819 -8.214 4.577 3.234 -0.562 0.575 NA NA NA
condition_num -2.777 -4.606 -0.948 0.925 -3.004 0.003 0.025 0.000 1
Pre_GAD7_Sum 0.728 0.567 0.889 0.081 8.946 0.000 0.396 0.294 1
identity_group -0.651 -2.506 1.205 0.938 -0.694 0.489 0.003 0.000 1
age 0.268 -0.019 0.555 0.145 1.845 0.067 0.025 0.000 1
condition_num:identity_group 2.857 0.267 5.446 1.309 2.182 0.031 0.034 0.002 1
Parameter Estimates for Post_PHQ9_Sum
Predictor β 95% CI (Low) 95% CI (High) SE t p Partial η² η² 95% CI (Low) η² 95% CI (High)
(Intercept) -4.721 -11.697 2.255 3.527 -1.338 0.183 NA NA NA
condition_num -3.864 -5.840 -1.888 0.999 -3.868 0.000 0.044 0.005 1
Pre_PHQ9_Sum 0.987 0.835 1.140 0.077 12.792 0.000 0.565 0.478 1
identity_group -0.983 -2.987 1.021 1.013 -0.970 0.334 0.000 0.000 1
age 0.291 -0.019 0.601 0.157 1.858 0.065 0.026 0.000 1
condition_num:identity_group 2.543 -0.267 5.353 1.421 1.790 0.076 0.023 0.000 1

Simple Slopes for DERS

JOHNSON-NEYMAN INTERVAL

When identity_group is OUTSIDE the interval [0.75, 14.45], the slope of condition_num is p < .05.

Note: The range of observed values of identity_group is [0.00, 1.00]

SIMPLE SLOPES ANALYSIS

Slope of condition_num when identity_group = 0.00 (0): 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -5.01   1.33    -3.77   0.00

Slope of condition_num when identity_group = 1.00 (1): 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -1.08   1.32    -0.82   0.42

 condition_num identity_group emmean    SE  df lower.CL upper.CL
             0              0   28.6 0.930 134     26.8     30.5
             1              0   23.6 0.963 134     21.7     25.5
             0              1   28.4 0.949 134     26.5     30.3
             1              1   27.3 0.942 134     25.4     29.2

Confidence level used: 0.95 

Simple Slopes for GAD

JOHNSON-NEYMAN INTERVAL

When identity_group is OUTSIDE the interval [0.52, 5.77], the slope of condition_num is p < .05.

Note: The range of observed values of identity_group is [0.00, 1.00]

SIMPLE SLOPES ANALYSIS

Slope of condition_num when identity_group = 0.00 (0): 

   Est.   S.E.   t val.      p
------- ------ -------- ------
  -2.78   0.92    -3.00   0.00

Slope of condition_num when identity_group = 1.00 (1): 

  Est.   S.E.   t val.      p
------ ------ -------- ------
  0.08   0.93     0.09   0.93

 condition_num identity_group emmean    SE  df lower.CL upper.CL
             0              0   13.6 0.650 134    12.31     14.9
             1              0   10.8 0.673 134     9.49     12.2
             0              1   12.9 0.662 134    11.64     14.3
             1              1   13.0 0.661 134    11.72     14.3

Confidence level used: 0.95 
Moderation analysis: Condition × Gender Identity (identity_group_num) interaction effects
Outcome F df p Beta_Int 95% CI (β) η²ₚ 95% CI (η²ₚ)
Post_DERS8_Sum 4.39 1, 134 0.038 3.92 [0.22, 7.63] 0.032 [0.001, 1.000]
Post_GAD7_Sum 4.76 1, 134 0.031 2.86 [0.27, 5.45] 0.034 [0.002, 1.000]
Post_PHQ9_Sum 3.20 1, 134 0.076 2.54 [-0.27, 5.35] 0.023 [0.000, 1.000]

MAIN EFFECTS REVIEWER COMMENTS AND FOLLOW UP OUTLIER

“Provide sensitivity analyses to address possible bias from faster engagement decline in the intervention arm.”

[1] 0.057 0.057 0.076
Anova Table (Type III tests)

Response: Post_DERS8_Sum
                             Sum Sq Df F value   Pr(>F)   
condition_num:total_sessions 231.33  1  7.8344 0.005889 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Anova Table (Type III tests)

Response: Post_DERS8_Sum
                             Sum Sq Df F value   Pr(>F)   
condition_num:total_sessions 231.33  1  7.8344 0.005889 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 condition_num total_sessions.trend    SE  df lower.CL upper.CL
             0                0.877 0.590 133   -0.289    2.043
             1               -1.077 0.374 133   -1.816   -0.338

Results are averaged over the levels of: identity_group_num 
Confidence level used: 0.95 
[1] "--- GAD-7 Interaction F-Test ---"
Anova Table (Type III tests)

Response: Post_GAD7_Sum
                             Sum Sq Df F value Pr(>F)
condition_num:total_sessions 7.9472  1  0.5176 0.4731
[1] "--- GAD-7 Simple Slopes ---"
 condition_num total_sessions.trend    SE  df lower.CL upper.CL
             0              -0.0155 0.425 133   -0.857    0.826
             1              -0.3825 0.277 133   -0.930    0.165

Results are averaged over the levels of: identity_group_num 
Confidence level used: 0.95 
[1] "--- PHQ-9 Interaction F-Test ---"
Anova Table (Type III tests)

Response: Post_PHQ9_Sum
                             Sum Sq Df F value Pr(>F)
condition_num:total_sessions 34.323  1  1.9442 0.1655
[1] "--- PHQ-9 Simple Slopes ---"
 condition_num total_sessions.trend    SE  df lower.CL upper.CL
             0                0.336 0.455 133   -0.565    1.237
             1               -0.424 0.297 133   -1.012    0.165

Results are averaged over the levels of: identity_group_num 
Confidence level used: 0.95 

Linear Mixed Effects Models

### Outcome: DERS8_Sum 
Mixed-Effects Model for DERS8_Sum controlling for identity_group and age
effect group term estimate std.error statistic df p.value
fixed NA (Intercept) 22.585 3.556 6.352 148.090 0.000
fixed NA Week -0.123 0.045 -2.729 148.679 0.007
fixed NA condition1 0.051 0.414 0.122 148.816 0.903
fixed NA identity_group1 -0.465 0.412 -1.128 148.226 0.261
fixed NA age 0.277 0.174 1.586 147.702 0.115
fixed NA Week:condition1 -0.142 0.045 -3.137 148.680 0.002
ran_pars psid sd__(Intercept) 4.592 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.102 NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA
ran_pars Residual sd__Observation 3.609 NA NA NA NA


### Outcome: GAD7_Sum 
Mixed-Effects Model for GAD7_Sum controlling for identity_group and age
effect group term estimate std.error statistic df p.value
fixed NA (Intercept) 11.475 2.753 4.168 148.984 0.000
fixed NA Week -0.106 0.032 -3.324 149.152 0.001
fixed NA condition1 0.028 0.340 0.081 149.340 0.936
fixed NA identity_group1 -0.625 0.319 -1.961 148.747 0.052
fixed NA age 0.111 0.135 0.820 148.215 0.414
fixed NA Week:condition1 -0.050 0.032 -1.568 149.150 0.119
ran_pars psid sd__(Intercept) 3.695 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.234 NA NA NA NA
ran_pars psid sd__Week 0.292 NA NA NA NA
ran_pars Residual sd__Observation 3.220 NA NA NA NA


### Outcome: PHQ9_Sum 
Mixed-Effects Model for PHQ9_Sum controlling for identity_group and age
effect group term estimate std.error statistic df p.value
fixed NA (Intercept) 14.374 3.298 4.358 148.057 0.000
fixed NA Week -0.067 0.033 -2.020 148.491 0.045
fixed NA condition1 0.604 0.377 1.603 148.673 0.111
fixed NA identity_group1 -0.816 0.382 -2.135 148.272 0.034
fixed NA age 0.037 0.162 0.227 147.820 0.821
fixed NA Week:condition1 -0.110 0.033 -3.287 148.491 0.001
ran_pars psid sd__(Intercept) 4.186 NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.058 NA NA NA NA
ran_pars psid sd__Week 0.312 NA NA NA NA
ran_pars Residual sd__Observation 3.262 NA NA NA NA
NA

###Reviewer Comment: Sensitivity Analysis

Reviewer Comment: “Provide sensitivity analyses to address possible bias from faster engagement decline in the intervention arm.”

My Response to Comment: Because engagement analyses demonstrated a faster rate of decline in the Purrble arm compared to the waitlist control, we conducted sensitivity analyses to examine whether the total number of sessions completed by each participant was associated with intervention outcomes. The number of sessions participated was added as a covariate in all ANCOVA models. Across outcomes, inclusion of this covariate did not alter the pattern, magnitude, or significance of results, and number of sessions was not a significant predictor in any model. These findings indicate that differences in the rate of survey responsiveness did not bias the primary results.

Reviewer Comment: “Include sensitivity analyses addressing differential engagement between arms.”

My Response to Comment: To further examine potential differences in engagement between study arms, we compared the total number of sessions completed across conditions and included this variable as a covariate in all outcome models. Although participants in the Purrble arm completed slightly fewer sessions on average than those in the waitlist condition, this difference did not affect any outcome. Results remained consistent with primary analyses, suggesting that differential engagement between arms did not account for the observed intervention effects.

Results Text: Because engagement analyses indicated a faster rate of decline in the Purrble arm compared to the waitlist control, we conducted sensitivity analyses to examine whether the total number of sessions completed by each participant was associated with intervention outcomes. The number of sessions participated was added as a covariate in all models. Across outcomes, inclusion of this covariate did not alter the pattern, magnitude, or significance of results, and number of sessions was not a significant predictor in any model.



### Sensitivity ANCOVA (including total_sessions) for Post_DERS8_Sum 
ANCOVA (Type III) results including all covariates for Post_DERS8_Sum
Source df F p η²ₚ 95% CI (η²ₚ)
(Intercept) 1 0.12 0.730 NA NA
condition 1 12.00 0.001 0.091 [0.028, 1.000]
Pre_DERS8_Sum 1 83.59 0.000 0.400 [0.298, 1.000]
identity_group_num 1 3.58 0.061 0.019 [0.000, 1.000]
age 1 0.44 0.507 0.003 [0.000, 1.000]
total_sessions 1 2.55 0.112 0.019 [0.000, 1.000]
Residuals 134 NA NA NA NA


**Adjusted Means (Condition Only)**
Outcome AdjMean_WL AdjMean_PB
Post_DERS8_Sum 28.65 25.32


### Sensitivity ANCOVA (including total_sessions) for Post_GAD7_Sum 
ANCOVA (Type III) results including all covariates for Post_GAD7_Sum
Source df F p η²ₚ 95% CI (η²ₚ)
(Intercept) 1 0.02 0.885 NA NA
condition 1 4.95 0.028 0.025 [0.000, 1.000]
Pre_GAD7_Sum 1 74.54 0.000 0.390 [0.288, 1.000]
identity_group_num 1 1.51 0.222 0.003 [0.000, 1.000]
age 1 3.58 0.060 0.025 [0.000, 1.000]
total_sessions 1 1.40 0.239 0.010 [0.000, 1.000]
Residuals 134 NA NA NA NA


**Adjusted Means (Condition Only)**
Outcome AdjMean_WL AdjMean_PB
Post_GAD7_Sum 13.36 11.86


### Sensitivity ANCOVA (including total_sessions) for Post_PHQ9_Sum 
ANCOVA (Type III) results including all covariates for Post_PHQ9_Sum
Source df F p η²ₚ 95% CI (η²ₚ)
(Intercept) 1 0.86 0.356 NA NA
condition 1 13.84 0.000 0.044 [0.005, 1.000]
Pre_PHQ9_Sum 1 156.31 0.000 0.561 [0.472, 1.000]
identity_group_num 1 0.20 0.658 0.000 [0.000, 1.000]
age 1 3.57 0.061 0.025 [0.000, 1.000]
total_sessions 1 0.62 0.433 0.005 [0.000, 1.000]
Residuals 134 NA NA NA NA


**Adjusted Means (Condition Only)**
Outcome AdjMean_WL AdjMean_PB
Post_PHQ9_Sum 15.67 12.96
Anova Table (Type III tests)

Response: Post_DERS8_Sum
                             Sum Sq Df F value   Pr(>F)   
condition_num:total_sessions 231.33  1  7.8344 0.005889 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Anova Table (Type III tests)

Response: Post_DERS8_Sum
                             Sum Sq Df F value   Pr(>F)   
condition_num:total_sessions 231.33  1  7.8344 0.005889 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 condition_num total_sessions.trend    SE  df lower.CL upper.CL
             0                0.877 0.590 133   -0.289    2.043
             1               -1.077 0.374 133   -1.816   -0.338

Results are averaged over the levels of: identity_group_num 
Confidence level used: 0.95 

Self-Harm Analyses

Frequencies by Condition and Response over Time

Below, we display a table and graph of the frequency of responses for all self-harm questions, the frequency of flagged responses to each self-harm question over time, and the frequency of flagged responses to each self-harm question over time, separated by condition.

Number of Responses for Self-Harm Questions Over Time
Week N_SHQ1 N_SHQ2 N_SHQ3
1 146 146 146
2 148 148 148
3 149 149 149
4 141 141 141
5 139 139 139
6 138 138 138
7 140 140 140
8 141 141 141
9 127 127 127
10 128 128 128
11 128 128 128
12 117 117 117
13 130 130 130

library(dplyr) library(tidyr) library(ggplot2) library(gt)

Reshape into long format

shq_long <- NoDup_PurrbleAnon %>% select(Week, SHQ1, SHQ2, SHQ3) %>% pivot_longer(cols = starts_with(“SHQ”), names_to = “SHQ_Var”, values_to = “Response”) %>% filter(!is.na(Week) & Week != 0) %>% filter(!is.na(Response)) %>% mutate(Response = factor(Response, levels = c(1, 0), labels = c(“1”, “0”)))

Count how many selected each category (0 or 1) per SHQ variable per week

shq_counts <- shq_long %>% group_by(Week, SHQ_Var, Response) %>% summarise(n = n(), .groups = “drop”)

#———————————————————- # Plot: Line Graph of 1 (flagged) response over time #———————————————————- ggplot( shq_counts %>% filter(Response == “1”), aes(x = Week, y = n, color = SHQ_Var) ) + geom_line(size = 1) + labs( title = “Number of Flagged SHQ Responses Over Time (Response = 1)”, x = “Week”, y = “Count of Response = 1”, color = “SHQ Variable” ) + theme_minimal() + scale_x_continuous(breaks = unique(shq_counts$Week))

#———————————————————- # Table: Count of 0 and 1 Responses per Week per SHQ #———————————————————- shq_counts %>% pivot_wider(names_from = Response, values_from = n, values_fill = 0) %>% rename(Response = 1 = 1, Response = 0 = 0) %>% gt() %>% tab_header(title = “Counts of SHQ Responses (0 vs. 1) by Week and Variable”)

Reshape into long format and include condition

shq_long_grouped <- NoDup_PurrbleAnon %>% select(psid, Week, condition, SHQ1, SHQ2, SHQ3) %>% pivot_longer(cols = starts_with(“SHQ”), names_to = “SHQ_Var”, values_to = “Response”) %>% filter(!is.na(Week) & Week != 0) %>% filter(!is.na(Response)) %>% mutate(Response = factor(Response, levels = c(1, 0), labels = c(“1”, “0”)), condition = as.factor(condition))

Count how many selected each category (0 or 1) per SHQ variable, per week, per group

shq_counts_grouped <- shq_long_grouped %>% group_by(Week, condition, SHQ_Var, Response) %>% summarise(n = n(), .groups = “drop”)

#———————————————————- # Plot: Line Graph of 1 (flagged) response over time by group #———————————————————- ggplot( shq_counts_grouped %>% filter(Response == “1”), aes(x = Week, y = n, color = SHQ_Var) ) + geom_line(size = 1) + facet_wrap(~ condition) + labs( title = “Number of Flagged SHQ Responses Over Time (Response = 1)”, subtitle = “Faceted by Condition”, x = “Week”, y = “Count of Response = 1”, color = “SHQ Variable” ) + theme_minimal() + scale_x_continuous(breaks = unique(shq_counts_grouped$Week))

#———————————————————- # Table: Count of 0 and 1 Responses per Week per SHQ, by Group #———————————————————- shq_counts_grouped %>% pivot_wider(names_from = Response, values_from = n, values_fill = 0) %>% rename(Response = 1 = 1, Response = 0 = 0) %>% arrange(condition, SHQ_Var, Week) %>% gt() %>% tab_header(title = “Counts of SHQ Responses (0 vs. 1) by Week, Variable, and Group”)

Self-Harm Logistic Regression

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
OR1,2 SE2 OR1,2 SE2 OR1,2 SE2 OR1,2 SE2
condition







    Purrble Treatment 1.07 0.226 0.99 0.206 0.93 0.273 1.05 0.217
    Waitlist Control
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
1 *p<0.05; **p<0.01; ***p<0.001
2 OR = Odds Ratio, SE = Standard Error

Self-Harm Proportional Odds Regression

Frequencies Tables



**Frequencies for shqscreener1_w1 **
Response Count Percent
1 27 18.5
2 47 32.2
3 56 38.4
4 16 11.0


**Frequencies for shqscreener1_w12 **
Response Count Percent
1 47 40.2
2 29 24.8
3 34 29.1
4 7 6.0


**Frequencies for shqscreener2_w1 **
Response Count Percent
1 78 53.4
2 37 25.3
3 27 18.5
4 4 2.7


**Frequencies for shqscreener2_w12 **
Response Count Percent
1 70 59.8
2 27 23.1
3 15 12.8
4 5 4.3


**Frequencies for shqscreener3_w1 **
Response Count Percent
1 118 80.8
2 18 12.3
3 10 6.8


**Frequencies for shqscreener3_w12 **
Response Count Percent
1 100 85.5
2 12 10.3
3 5 4.3

Proportional Odds Models: Brant Tests

All six Brant tests (one for each screener at Week 1 and Week 12) produced non‐significant p‐values, indicating that the proportional‐odds (parallel regression) assumption holds in every case.

-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.8 2   0.41
condition1  1.8 2   0.41
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 1:"
                X2 df probability
Omnibus    1.80303  2   0.4059541
condition1 1.80303  2   0.4059541
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.03    2   0.6
condition1  1.03    2   0.6
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 12:"
                 X2 df probability
Omnibus    1.031749  2   0.5969783
condition1 1.031749  2   0.5969783
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.3 2   0.52
condition1  1.3 2   0.52
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 1:"
                 X2 df probability
Omnibus    1.303816  2   0.5210507
condition1 1.303816  2   0.5210507
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     2.49    2   0.29
condition1  2.49    2   0.29
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 12:"
                 X2 df probability
Omnibus    2.493925  2   0.2873763
condition1 2.493925  2   0.2873763
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.42    1   0.23
condition1  1.42    1   0.23
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 1:"
                 X2 df probability
Omnibus    1.417486  1   0.2338176
condition1 1.417486  1   0.2338176
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.01    1   0.32
condition1  1.01    1   0.32
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 12:"
                 X2 df probability
Omnibus    1.005784  1    0.315915
condition1 1.005784  1    0.315915

No significant results of Purrble on self-harm using proprtional odds (ordinal data that maintains frequency)

Proportional Odds Regression Results Controlling for Age and Baseline Response (Week 1)
Model term estimate std.error odds_ratio statistic p.value
Screener 1 condition1 0.045 0.182 1.046 0.248 0.804
Screener 1 age 0.045 0.083 1.046 0.540 0.589
Screener 1 identity_group_num 0.595 0.375 1.813 1.587 0.113
Screener 1 shqscreener1_w1.L 1.856 0.486 6.400 3.822 0.000
Screener 1 shqscreener1_w1.Q -0.115 0.404 0.891 -0.284 0.776
Screener 1 shqscreener1_w1.C 0.194 0.324 1.214 0.600 0.549
Screener 1 1|2 1.367 1.918 3.922 0.713 0.476
Screener 1 2|3 2.455 1.930 11.647 1.272 0.203
Screener 1 3|4 4.890 1.980 132.932 2.469 0.014
Screener 2 condition1 0.150 0.214 1.162 0.703 0.482
Screener 2 age 0.122 0.094 1.129 1.298 0.194
Screener 2 identity_group_num 1.406 0.448 4.082 3.138 0.002
Screener 2 shqscreener2_w1.L 3.213 0.750 24.860 4.285 0.000
Screener 2 shqscreener2_w1.Q 0.593 0.599 1.809 0.989 0.323
Screener 2 shqscreener2_w1.C 0.623 0.473 1.864 1.316 0.188
Screener 2 1|2 3.849 2.227 46.955 1.728 0.084
Screener 2 2|3 5.360 2.263 212.790 2.369 0.018
Screener 2 3|4 7.300 2.324 1479.978 3.141 0.002
Screener 3 condition1 0.049 0.275 1.050 0.178 0.859
Screener 3 age 0.001 0.125 1.001 0.011 0.991
Screener 3 identity_group_num -0.140 0.566 0.869 -0.248 0.804
Screener 3 shqscreener3_w1.L 0.234 0.814 1.263 0.287 0.774
Screener 3 shqscreener3_w1.Q -0.712 0.667 0.491 -1.067 0.286
Screener 3 1|2 1.357 2.828 3.886 0.480 0.631
Screener 3 2|3 2.649 2.850 14.133 0.929 0.353

Supplementary Materials: Mixed Effects Models

To evaluate how outcomes changed over time and whether these changes differed by condition, we fit mixed-effects models for each of our primary outcome variables. These models account for both within-person change and between-person differences.

For each outcomem we ran a linear mixed-effects model using the lmer() function.

The models tested: Main effects of Week (time), condition, and their interaction Covariates: identity group and age A random intercept and slope for each participant ((Week & psid)), allowing each person to have their own baseline and rate of change over time

Emotion Reg was significant Depression significant Anxiety not significant (close to marginal p=.11- more evidence of unstable effect)

Mixed-Effects Model for DERS8_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 22.585 3.556 6.352 148.090 0.000 15.616 29.555
fixed NA Week -0.123 0.045 -2.729 148.679 0.007 -0.212 -0.035
fixed NA condition1 0.051 0.414 0.122 148.816 0.903 -0.761 0.862
fixed NA identity_group1 -0.465 0.412 -1.128 148.226 0.261 -1.272 0.343
fixed NA age 0.277 0.174 1.586 147.702 0.115 -0.065 0.618
fixed NA Week:condition1 -0.142 0.045 -3.137 148.680 0.002 -0.230 -0.053
ran_pars psid sd__(Intercept) 4.592 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.102 NA NA NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.609 NA NA NA NA NA NA
NULL

# R2 for Mixed Models

  Conditional R2: 0.717
     Marginal R2: 0.037
Mixed-Effects Model for DERS8_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 22.585 3.556 6.352 148.090 0.000 15.616 29.555
fixed NA Week -0.123 0.045 -2.729 148.679 0.007 -0.212 -0.035
fixed NA condition1 0.051 0.414 0.122 148.816 0.903 -0.761 0.862
fixed NA identity_group1 -0.465 0.412 -1.128 148.226 0.261 -1.272 0.343
fixed NA age 0.277 0.174 1.586 147.702 0.115 -0.065 0.618
fixed NA Week:condition1 -0.142 0.045 -3.137 148.680 0.002 -0.230 -0.053
ran_pars psid sd__(Intercept) 4.592 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.102 NA NA NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.609 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.717
     Marginal R2: 0.037
Mixed-Effects Model for GAD7_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 11.475 2.753 4.168 148.984 0.000 6.079 16.871
fixed NA Week -0.106 0.032 -3.324 149.152 0.001 -0.169 -0.044
fixed NA condition1 0.028 0.340 0.081 149.340 0.936 -0.639 0.694
fixed NA identity_group1 -0.625 0.319 -1.961 148.747 0.052 -1.249 0.000
fixed NA age 0.111 0.135 0.820 148.215 0.414 -0.154 0.375
fixed NA Week:condition1 -0.050 0.032 -1.568 149.150 0.119 -0.113 0.013
ran_pars psid sd__(Intercept) 3.695 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.234 NA NA NA NA NA NA
ran_pars psid sd__Week 0.292 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.220 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.606
     Marginal R2: 0.024
Mixed-Effects Model for PHQ9_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 14.374 3.298 4.358 148.057 0.000 7.909 20.839
fixed NA Week -0.067 0.033 -2.020 148.491 0.045 -0.133 -0.002
fixed NA condition1 0.604 0.377 1.603 148.673 0.111 -0.135 1.342
fixed NA identity_group1 -0.816 0.382 -2.135 148.272 0.034 -1.564 -0.067
fixed NA age 0.037 0.162 0.227 147.820 0.821 -0.280 0.354
fixed NA Week:condition1 -0.110 0.033 -3.287 148.491 0.001 -0.175 -0.044
ran_pars psid sd__(Intercept) 4.186 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.058 NA NA NA NA NA NA
ran_pars psid sd__Week 0.312 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.262 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.703
     Marginal R2: 0.024

New Analyses: Engagement

TWEETS

Methods Text: Perceived engagement with the intervention was assessed weekly using an averaged composite measure (Tweets_Avg) that reflected how well participants felt the intervention fit their needs and goals. To examine changes in engagement quality over time, we fit a linear mixed-effects model using restricted maximum likelihood (REML). Week was included as a fixed effect to model linear change, and participant ID (psid) was included as a random intercept to account for individual differences in baseline engagement perceptions. This model structure allowed us to estimate overall trajectories of perceived engagement while accommodating repeated measures within participants. Analyses were conducted in R using the lme4 and lmerTest packages, with degrees of freedom estimated using Satterthwaite’s method.

Results Text: The linear mixed-effects model revealed a significant decline in perceived engagement across the intervention period (b = −0.04, SE = 0.006, t(531) = −6.61, p < .001).

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Tweets_Avg ~ Week + (1 | psid)
   Data: .

REML criterion at convergence: 924.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.3610 -0.4855  0.0114  0.5652  3.1417 

Random effects:
 Groups   Name        Variance Std.Dev.
 psid     (Intercept) 0.5854   0.7651  
 Residual             0.1732   0.4162  
Number of obs: 609, groups:  psid, 80

Fixed effects:
              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)   2.946915   0.101432 131.706233  29.053  < 2e-16 ***
Week         -0.039363   0.005956 531.473885  -6.609 9.44e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
     (Intr)
Week -0.499

Moderation of Gender Identity with TWEETS

Results Text: To explore whether perceived engagement trajectories differed by gender identity, we extended the linear mixed-effects model to include gender identity (TGD vs. cisgender) and its interaction with Week. This allowed us to test both baseline differences in perceived fit and differences in the rate of change over time. There were no significant differences in initial perceptions of intervention fit by gender identity (b = −0.06, SE = 0.10, t(130) = −0.62, p = .54). However, a significant Week × Gender Identity interaction emerged (b = 0.017, SE = 0.006, t(531) = 2.93, p = .0035). Simple slopes indicated that both groups experienced a decline in engagement over time, but the decline was steeper among TGD participants (b = −0.056, 95% CI [−0.073, −0.040]) than among cisgender participants (b = −0.022, 95% CI [−0.038, −0.005]).

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Tweets_Avg ~ Week * identity_group + (1 | psid)
   Data: tweets_pb

REML criterion at convergence: 926.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.3002 -0.5019  0.0319  0.5610  3.0953 

Random effects:
 Groups   Name        Variance Std.Dev.
 psid     (Intercept) 0.5768   0.7595  
 Residual             0.1712   0.4137  
Number of obs: 609, groups:  psid, 80

Fixed effects:
                       Estimate Std. Error         df t value
(Intercept)            2.950072   0.100764 130.455090  29.277
Week                  -0.038963   0.005922 530.719720  -6.579
identity_group1       -0.062469   0.100764 130.455090  -0.620
Week:identity_group1   0.017363   0.005922 530.719720   2.932
                     Pr(>|t|)    
(Intercept)           < 2e-16 ***
Week                 1.14e-10 ***
identity_group1       0.53637    
Week:identity_group1  0.00352 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Week   idnt_1
Week        -0.499              
idntty_grp1  0.024  0.001       
Wk:dntty_g1  0.001  0.019 -0.499

$emtrends
 identity_group Week.trend      SE  df lower.CL upper.CL
 C                 -0.0216 0.00846 532  -0.0382 -0.00499
 TGD               -0.0563 0.00830 534  -0.0726 -0.04003

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast estimate     SE  df t.ratio p.value
 C - TGD    0.0347 0.0118 533   2.931  0.0035

Degrees-of-freedom method: kenward-roger 

LS0tCnRpdGxlOiAiUHVycmJsZSBSQ1QgQW5hbHlzZXM6IFJldmlzZSBhbmQgUmVzdWJtaXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmluc3RhbGwucGFja2FnZXMoInJjaXBsb3QiKQojIFJlY29yZGluZyBLZWVwaW5nOiAKClRoZXJlIGFyZSB0d28gbWFzdGVyIGZpbGVzIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBhbmFseXNlcy4gVGhleSBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgZmlsZSwgdGhvdWdoIG9uZSBpcyBpbiB3aWRlIGZvcm1hdCBhbmQgdGhlIG90aGVyIGlzIGluIGxvbmcgZm9ybWF0LgoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTWFzdGVyX1dpZGUu4oCdIFRoZSBsb25nIGRhdGFzZXQgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTG9uZ19NYXN0ZXIu4oCdIFRoZSB3aWRlIGRhdGFzZXQgaGFzIGFsbCBvZiB0aGUgcHJlIGFuZCBwb3N0dGVzdCB2YXJpYWJsZXMgY2FsY3VsYXRlZCwgd2hpbGUgdGhlIGxvbmcgZG9lcyBub3QuIE90aGVyd2lzZSwgdGhleSBkbyBub3QgZGlmZmVyLiAKClRoaXMgZGF0YXNldCBpbmNsdWRlcyB0aGUgTj0xNTMgcGFydGljaXBhbnRzIHdobyB3ZXJlIGluY2x1ZGVkIGluIHRoZSByYW5kb21pemVkIGNvbnRyb2wgdHJpYWwgZXhhbWluaW5nIFB1cnJibGUgd2l0aCBhIHBvcHVsYXRpb24gb2YgdW5pdmVyc2l0eSBzdHVkZW50cy4gQWxsIHBhcnRpY2lwYW50cyB3ZXJlIG1lbWJlcnMgb2YgdGhlIExHVEJRKyBjb21tdW5pdHkuCgpUaGVzZSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCBpbiBPY3RvYmVyIGJ5IEF1YnJleSBSaG9kZXMuIFdlIHVzZSB0aGUgImZpbmFsIiBkYXRhc2V0cyBpbiB3aGljaCB3ZSByZW1vdmVkIHBhcnRpY2lwYW50IEM3Miwgd2hvIGhhZCBubyBpbmZvcm1hdGlvbiBvbiBnZW5kZXIgaWRlbnRpdHkuCgpUaGVzZSBhbmFseXNlcyByZW1vdmUgYWxsIG9mIHRoZSB2YXJpYWJsZXMgZXhjZXB0IGZvciBlbW90aW9uIHJlZ3VsYXRpb24sIFBIUSwgYW5kIEFueGlldHkgYXMgb3V0Y29tZXMuCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUUsICB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpICAgICMgSW5jbHVkZXMgZHBseXIsIHRpZHlyLCBnZ3Bsb3QyLCBwdXJyciwgcmVhZHIsIHRpYmJsZSwgc3RyaW5nciwgZm9yY2F0cwpsaWJyYXJ5KGJyb29tKSAgICAgICAgIyBGb3IgdGlkeWluZyBtb2RlbCBvdXRwdXRzCmxpYnJhcnkoZW1tZWFucykgICAgICAjIEZvciBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMKbGlicmFyeShrYWJsZUV4dHJhKSAgICMgRm9yIG5pY2UgQVBBIHRhYmxlcwpsaWJyYXJ5KGVmZmVjdHNpemUpICAgIyBGb3IgQ29oZW4ncyBkLCDOt8KyLCBldGMuCmxpYnJhcnkoc3RhcmdhemVyKSAgICAjIEZvciByZWdyZXNzaW9uIHRhYmxlcyAob3B0aW9uYWwpCmxpYnJhcnkoYXBhVGFibGVzKSAgICAjIEZvciBBUEEtZm9ybWF0IHRhYmxlcyAob3B0aW9uYWwpCmxpYnJhcnkoanRvb2xzKSAgICAgICAjIEZvciBpbnRlcmFjdGlvbiBwbG90cyBhbmQgZWZmZWN0IHN1bW1hcmllcwpsaWJyYXJ5KHJlbXBzeWMpCgoKCgojbGlicmFyeShhcGFUYWJsZXMpCiNsaWJyYXJ5KGJyb29tKQojbGlicmFyeShicm9vbS5taXhlZCkKI2xpYnJhcnkoY2xpcHIpCiNsaWJyYXJ5KGNvd3Bsb3QpCiNsaWJyYXJ5KGRwbHlyKQojbGlicmFyeShlZmZlY3RzaXplKQojbGlicmFyeShlbW1lYW5zKQojbGlicmFyeShnZ3Bsb3QyKQojbGlicmFyeShnZ3B1YnIpCiNsaWJyYXJ5KGdyaWRFeHRyYSkKI2xpYnJhcnkoZ3QpCiNsaWJyYXJ5KGludGVyYWN0aW9ucykKI2xpYnJhcnkoanRvb2xzKQojbGlicmFyeShrYWJsZUV4dHJhKQojbGlicmFyeShrbml0cikKI2xpYnJhcnkobG1lNCkKI2xpYnJhcnkobWFya2Rvd24pCiNsaWJyYXJ5KE1PVEUpCiNsaWJyYXJ5KG11bHRpbGV2ZWxtb2QpCiNsaWJyYXJ5KHBhdGNod29yaykKI2xpYnJhcnkocHN5Y2gpCiNsaWJyYXJ5KHB1cnJyKQojbGlicmFyeShyY2lwbG90KQojbGlicmFyeShyZWFkcikKI2xpYnJhcnkocmVhZHhsKQojCiNsaWJyYXJ5KHJzdGF0aXgpCiNsaWJyYXJ5KHNjYWxlcykKI2xpYnJhcnkoc3RhcmdhemVyKQojbGlicmFyeSh0aWJibGUpCiNsaWJyYXJ5KHRpZHltb2RlbHMpCiNsaWJyYXJ5KHRpZHlyKQojbGlicmFyeSh0aWR5dmVyc2UpCgpsaWJyYXJ5KHJlYWRyKQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIHJlYWRfY3N2KCJQdXJyYmxlX01hc3Rlcl9XaWRlLmNzdiIpClZpZXcoUHVycmJsZV9NYXN0ZXJfV2lkZSkKClB1cnJibGVfTG9uZ19NYXN0ZXIgPC0gcmVhZF9jc3YoIlB1cnJibGVfTG9uZ19NYXN0ZXIuY3N2IikKVmlldyhQdXJyYmxlX0xvbmdfTWFzdGVyKQoKYGBgCgojIDIuMS4gUGFydGljaXBhbnRzCgojIyAyLjEuMSBQYXJ0aWNpcGFudCBEaXNwb3NpdGlvbgoKQ29ycmVzcG9uZGluZyBUZXh0OiAKInJlc3VsdGluZyBpbiBhIGZpbmFsIHNhbXBsZSBzaXplIG9mIDE1MyBwYXJ0aWNpcGFudHM6IFB1cnJibGUgY29uZGl0aW9uIChuPTc2KSwgYW5kIHRoZSB3YWl0bGlzdCBjb250cm9sIGNvbmRpdGlvbiAobj03NykuIgoKIkdlbmRlciBpZGVudGl0eSB3YXMgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyBjb25kaXRpb25zLCB3aXRoIDc2IHBhcnRpY2lwYW50cyAoNDkuNyUpIGlkZW50aWZ5aW5nIGFzIGNpc2dlbmRlciBhbmQgNzcgaWRlbnRpZnlpbmcgYXMgdHJhbnNnZW5kZXIsIGdlbmRlciBub24tY29uZm9ybWluZywgb3IgcXVlc3Rpb25pbmcgYW5kIG9yIGdlbmRlciBkaXZlcnNlIChUR0Q7ICAoNTAuMyUpLiAiCgoiV2l0aGluIGNvbmRpdGlvbnMsIHRoZSBQdXJyYmxlIGdyb3VwIGNvbnNpc3RlZCBvZiAzOSBjaXNnZW5kZXIgcGFydGljaXBhbnRzIGFuZCAzNyBUR0QgcGFydGljaXBhbnRzLCB3aGlsZSB0aGUgd2FpdGxpc3QgY29udHJvbCBncm91cCBjb25zaXN0ZWQgb2YgMzcgY2lzZ2VuZGVyIHBhcnRpY2lwYW50cyBhbmQgNDAgVEdEIHBhcnRpY2lwYW50cy4iCgpgYGB7ciBzYW1wbGVfY2hhcmFjdGVyaXN0aWNzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbgpjb25kaXRpb25fY291bnRzIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiQ291bnQiKSAlPiUKICBhcnJhbmdlKGNvbmRpdGlvbikgJT4lCiAgYWRkX3Jvdyhjb25kaXRpb24gPSAiVG90YWwiLCBDb3VudCA9IHN1bSguJENvdW50KSkKCiMgVGFibGUgMjogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBHZW5kZXIgSWRlbnRpdHkKaWRlbnRpdHlfY291bnRzIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgaWRlbnRpdHlfZ3JvdXApICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cCA9IGRwbHlyOjpyZWNvZGUoaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIgPSAiQ2lzZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUR0QiID0gIlRyYW5zZ2VuZGVyIikpICU+JQogIGNvdW50KGlkZW50aXR5X2dyb3VwLCBuYW1lID0gIkNvdW50IikgJT4lCiAgYXJyYW5nZShpZGVudGl0eV9ncm91cCkgJT4lCiAgYWRkX3JvdyhpZGVudGl0eV9ncm91cCA9ICJUb3RhbCIsIENvdW50ID0gc3VtKC4kQ291bnQpKQoKIyBUYWJsZSAzOiBDcm9zcy10YWJ1bGF0aW9uIG9mIENvbmRpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkKY3Jvc3NfdGFiIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uLCBpZGVudGl0eV9ncm91cCkgJT4lCiAgbXV0YXRlKGlkZW50aXR5X2dyb3VwID0gZHBseXI6OnJlY29kZShpZGVudGl0eV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDIiA9ICJDaXNnZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRHRCIgPSAiVHJhbnNnZW5kZXIiKSkgJT4lCiAgY291bnQoY29uZGl0aW9uLCBpZGVudGl0eV9ncm91cCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGlkZW50aXR5X2dyb3VwLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gbiwKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQoKIyBEaXNwbGF5IHRoZSB0YWJsZXMKa2FibGUoY29uZGl0aW9uX2NvdW50cywKICAgICAgY2FwdGlvbiA9ICJUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbiIsCiAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCgprYWJsZShpZGVudGl0eV9jb3VudHMsCiAgICAgIGNhcHRpb24gPSAiVGFibGUgMjogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBHZW5kZXIgSWRlbnRpdHkiLAogICAgICBmb3JtYXQgPSAibWFya2Rvd24iKQoKa2FibGUoY3Jvc3NfdGFiLAogICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IENyb3NzLXRhYnVsYXRpb24gb2YgQ29uZGl0aW9uIGJ5IEdlbmRlciBJZGVudGl0eSIsCiAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKCiMjIDIuMS4yIFBhcnRpY2lwYW50IENoYXJhY3RlcmlzdGljcwoKUGFydGljaXBhbnRzIGNoYXJhY3RlcmlzdGljcyBpbmNsdWRpbmcgc2V4dWFsIG9yaWVudGF0aW9uLCByYWNlL2V0aG5pY2l0eSwgYW5kIGFnZSBhcmUgc2hvd24gcmVwb3J0ZWQgYnkgY29uZGl0aW9uIGluIFRhYmxlIDEuIAoKIyMjIEFnZTogRGVzY3JpcHRpdmVzIAoKU3VtbWFyaXplcyBhZ2UgKE1lYW4sIFNELCBNaW4sIE1heCkgYnkgY29uZGl0aW9uLgpgYGB7cn0KZGVzY3JpcHRpdmVfc3RhdHMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIFNEICAgPSBzZChhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBNaW4gID0gbWluKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIE1heCAgPSBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCmNhdCgiVGFibGU6IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIEFnZSBieSBDb25kaXRpb24gKEFQQSBGb3JtYXQpXG5cbiIpCgojIEFQQS1zdHlsZSB0YWJsZSAocmVxdWlyZXMgcmVtcHN5YykKbmljZV90YWJsZShkZXNjcmlwdGl2ZV9zdGF0cykKCmBgYAoKIyMjIFNleHVhbCBPcmllbnRhdGlvbi0gU2ltcGxpZmllZAoKCmBgYHtyfQoKc29fdGFibGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoc29fc2ltcGxpZmllZCA9IHRvbG93ZXIoc29fc2ltcGxpZmllZCkpICU+JSAgICAgICAgICAgICAgICAjIHN0YW5kYXJkaXplIHRleHQKICBncm91cF9ieShjb25kaXRpb24sIHNvX3NpbXBsaWZpZWQpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvdW50IGJ5IGNvbmRpdGlvbgogIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBwaXZvdF93aWRlcigKICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sCiAgICB2YWx1ZXNfZnJvbSA9IG4sCiAgICB2YWx1ZXNfZmlsbCA9IDAKICApICU+JQogIG11dGF0ZSgKICAgIFRvdGFsID0gcm93U3VtcyhhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpKSAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0b3RhbCBjb3VudHMKICApCgojIENvbXB1dGUgZGVub21pbmF0b3JzIChwYXJ0aWNpcGFudHMgcGVyIGNvbmRpdGlvbikKZGVub20gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAidG90YWwiKQoKb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIEFkZCBwZXJjZW50YWdlcyB0byBlYWNoIGNvdW50CnNvX3RhYmxlIDwtIHNvX3RhYmxlICU+JQogIG11dGF0ZSgKICAgIGFjcm9zcygKICAgICAgLWMoc29fc2ltcGxpZmllZCwgVG90YWwpLAogICAgICB+IHBhc3RlMCgueCwgIiAoIiwgcm91bmQoLnggLyBkZW5vbSR0b3RhbFtkZW5vbSRjb25kaXRpb24gPT0gY3VyX2NvbHVtbigpXSAqIDEwMCwgMSksICIlKSIpLAogICAgICAubmFtZXMgPSAiey5jb2x9IgogICAgKSwKICAgIFRvdGFsID0gcGFzdGUwKFRvdGFsLCAiICgiLCByb3VuZChUb3RhbCAvIG92ZXJhbGxfZGVub20gKiAxMDAsIDEpLCAiJSkiKQogICkKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmthYmxlKHNvX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlOiBTZXh1YWwgT3JpZW50YXRpb24gKHNvX3NpbXBsaWZpZWQpIGJ5IENvbmRpdGlvbiAoQ291bnRzIGFuZCBQZXJjZW50YWdlcykiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKIyMjIFJhY2UKYGBge3J9CmxpYnJhcnkoZHBseXIpCiMgRGVmaW5lIHJhY2UgdmFyaWFibGVzCnJhY2VfdmFycyA8LSBjKCJSYWNlX0FzaWFuIiwgIlJhY2VfQXJhYmljIiwgIlJhY2VfQmxhY2siLCAiUmFjZV9IaXNwYW5pYyIsIAogICAgICAgICAgICAgICAiUmFjZV9QYWNpZmljIiwgIlJhY2VfV2hpdGUiLCAiUmFjZV91bmtub3duIikKCiMgU3RlcCAxOiBDcmVhdGUgcGFydGljaXBhbnQtbGV2ZWwgcmFjZSBkYXRhCnJhY2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRwbHlyOjpzZWxlY3QocHNpZCwgY29uZGl0aW9uLCBhbGxfb2YocmFjZV92YXJzKSkgJT4lCiAgZGlzdGluY3QoKQoKIyBTdGVwIDI6IFBpdm90IHRvIGxvbmcgZm9ybWF0IHNvIHRoYXQgZWFjaCByb3cgaXMgb25lIHJhY2Ugb3B0aW9uIHBlciBwYXJ0aWNpcGFudCwgdGhlbiBmaWx0ZXIgZm9yIGluZGljYXRvciA9PSAxCnJhY2VfbG9uZyA8LSByYWNlX2RhdGEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YocmFjZV92YXJzKSwgbmFtZXNfdG8gPSAiUmFjZSIsIHZhbHVlc190byA9ICJpbmRpY2F0b3IiKSAlPiUKICBmaWx0ZXIoaW5kaWNhdG9yID09IDEpCgojIFN0ZXAgMzogQ29tcHV0ZSBjb3VudHMgYnkgY29uZGl0aW9uIGZvciBlYWNoIFJhY2Ugb3B0aW9uCnJhY2VfY291bnRzIDwtIHJhY2VfbG9uZyAlPiUKICBncm91cF9ieShSYWNlLCBjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMgU3RlcCA0OiBDb21wdXRlIGRlbm9taW5hdG9ycyAodG90YWwgcGFydGljaXBhbnRzKSBwZXIgY29uZGl0aW9uCmRlbm9tIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiZGVub20iKQoKIyBTdGVwIDU6IEpvaW4gZGVub21pbmF0b3JzIGFuZCBjb21wdXRlIHBlcmNlbnRhZ2VzIGZvciBlYWNoIFJhY2Ugb3B0aW9uIHBlciBjb25kaXRpb24KcmFjZV9jb3VudHMgPC0gcmFjZV9jb3VudHMgJT4lCiAgbGVmdF9qb2luKGRlbm9tLCBieSA9ICJjb25kaXRpb24iKSAlPiUKICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGNvdW50IC8gZGVub20gKiAxMDAsIDEpKQoKIyBTdGVwIDY6IFBpdm90IHdpZGVyIHNvIHRoYXQgZWFjaCByYWNlIG9wdGlvbiBpcyBvbmUgcm93LgpyYWNlX3dpZGUgPC0gcmFjZV9jb3VudHMgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IFJhY2UsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyhjb3VudCwgcGVyY2VudGFnZSksCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSBsaXN0KGNvdW50ID0gMCwgcGVyY2VudGFnZSA9IDApLAogICAgICAgICAgICAgIHZhbHVlc19mbiA9IGxpc3QoY291bnQgPSBzdW0sIHBlcmNlbnRhZ2UgPSBzdW0pKQoKIyBTdGVwIDc6IENvbXB1dGUgb3ZlcmFsbCB0b3RhbHMgZm9yIGVhY2ggUmFjZSBvcHRpb24Kb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQpvdmVyYWxsX2NvdW50cyA8LSByYWNlX2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmFjZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2NvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUodG90YWxfcGVyY2VudGFnZSA9IHJvdW5kKHRvdGFsX2NvdW50IC8gb3ZlcmFsbF9kZW5vbSAqIDEwMCwgMSkpCgojIFN0ZXAgODogTWVyZ2Ugb3ZlcmFsbCB0b3RhbHMgd2l0aCB0aGUgd2lkZSB0YWJsZQpyYWNlX3RhYmxlIDwtIHJhY2Vfd2lkZSAlPiUKICBsZWZ0X2pvaW4ob3ZlcmFsbF9jb3VudHMsIGJ5ID0gIlJhY2UiKQoKIyBTdGVwIDk6IFJlb3JkZXIgY29sdW1ucyBzbyB0aGF0IGZvciBlYWNoIGNvbmRpdGlvbiB0aGUgY291bnQgYW5kIHBlcmNlbnRhZ2UgY29sdW1ucyBhcHBlYXIgc2lkZS1ieS1zaWRlLAojIGFuZCB0aGVuIGFkZCBvdmVyYWxsIChUb3RhbCkgY29sdW1ucy4KY29uZGl0aW9ucyA8LSBzb3J0KHVuaXF1ZShQdXJyYmxlX0xvbmdfTWFzdGVyJGNvbmRpdGlvbikpCm9yZGVyZWRfY29scyA8LSBjKCJSYWNlIikKZm9yIChjb25kIGluIGNvbmRpdGlvbnMpIHsKICBvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsIHBhc3RlMCgiY291bnRfIiwgY29uZCksIHBhc3RlMCgicGVyY2VudGFnZV8iLCBjb25kKSkKfQpvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsICJ0b3RhbF9jb3VudCIsICJ0b3RhbF9wZXJjZW50YWdlIikKcmFjZV90YWJsZSA8LSByYWNlX3RhYmxlICU+JSBkcGx5cjo6c2VsZWN0KGFsbF9vZihvcmRlcmVkX2NvbHMpKQoKIyBTdGVwIDEwOiBDcmVhdGUgYSBzcGFubmluZyBoZWFkZXI6CiMgRmlyc3QgY29sdW1uOiAiUmFjZSIsIHRoZW4gZWFjaCBjb25kaXRpb24gc3BhbnMgMiBjb2x1bW5zIChDb3VudCBhbmQgUGVyY2VudCksIHRoZW4gIlRvdGFsIiBzcGFucyAyIGNvbHVtbnMuCmhlYWRlcl92ZWMgPC0gYygiUmFjZSIgPSAxKQpmb3IgKGNvbmQgaW4gY29uZGl0aW9ucykgewogIGhlYWRlcl92ZWMgPC0gYyhoZWFkZXJfdmVjLCBzZXROYW1lcygyLCBjb25kKSkKfQpoZWFkZXJfdmVjIDwtIGMoaGVhZGVyX3ZlYywgIlRvdGFsIiA9IDIpCgojIERpc3BsYXkgdGhlIGZpbmFsIHJhY2UgdGFibGUgd2l0aCB0aGUgc3Bhbm5pbmcgaGVhZGVyLgprYWJsZShyYWNlX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlOiBSYWNlIENvdW50cyBhbmQgUGVyY2VudGFnZXMgYnkgQ29uZGl0aW9uIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlYykKCgojIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aXRoIG11bHRpcGxlIHJhY2lhbCBpZGVudGl0aWVzIHBlciBjb25kaXRpb24KbXVsdGlwbGVfcmFjZV9jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkcGx5cjo6c2VsZWN0KHBzaWQsIGNvbmRpdGlvbiwgYWxsX29mKHJhY2VfdmFycykpICU+JSAgIyBlbnN1cmUgZHBseXI6OnNlbGVjdCB0byBhdm9pZCBtYXNraW5nCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoCiAgICBtdWx0aXBsZSA9IHJvd1N1bXMoYWNyb3NzKGFsbF9vZihyYWNlX3ZhcnMpKSwgbmEucm0gPSBUUlVFKSA+IDEKICApICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKG11bHRpcGxlX2NvdW50ID0gc3VtKG11bHRpcGxlKSwgLmdyb3VwcyA9ICJkcm9wIikKICAKIyBQcmludCBvdXRwdXQgbWVzc2FnZXMgZm9yIGVhY2ggY29uZGl0aW9uCm11bHRpcGxlX3JhY2VfY291bnRzICU+JQogIG11dGF0ZShtZXNzYWdlID0gcGFzdGUwKAogICAgbXVsdGlwbGVfY291bnQsICIgcGVvcGxlIGluIHRoZSAiLCBjb25kaXRpb24sCiAgICAiIGNvbmRpdGlvbiByZXBvcnRlZCBtdWx0aXBsZSByYWNpYWwgaWRlbnRpdGllcy4iCiAgKSkgJT4lCiAgcHVsbChtZXNzYWdlKSAlPiUKICBjYXQoc2VwID0gIlxuIikKYGBgCgoKCgoKIyMgMi4xLjMgRW5nYWdlbWVudCBhbmQgUmV0ZW50aW9uCgojIyMgTnVtYmVyIG9mIHF1ZXN0aW9ubmFpcmVzCgoqKlJlc3VsdHMgVGV4dDoqKiBQYXJ0aWNpcGFudHMgY29tcGxldGVkIGFuIGF2ZXJhZ2Ugb2YgMTIuNCBxdWVzdGlvbm5haXJlcyBpbiB0aGUgUHVycmJsZSBhbmQgMTIuOSBxdWVzdGlvbm5haXJlcyBpbiB0aGUgY29udHJvbCBjb25kaXRpb24gb3V0IG9mIGEgcG9zc2libGUgMTQgKEJhc2VsaW5lIFvigJxXZWVrIDDigJ1dIHRocm91Z2ggRm9sbG93LVVwIFvigJxXZWVrIDEz4oCdXSkuIAoKYGBge3J9CgojIElkZW50aWZ5IGF0dGVuZGFuY2UgY29sdW1ucyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAiV2Vla18iKQphdHRlbmRhbmNlX2NvbHMgPC0gZ3JlcCgiXldlZWtfIiwgbmFtZXMoUHVycmJsZV9NYXN0ZXJfV2lkZSksIHZhbHVlID0gVFJVRSkKCiMgQ2FsY3VsYXRlIHRvdGFsIHNlc3Npb25zIGF0dGVuZGVkIHBlciBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHRvdGFsX3Nlc3Npb25zID0gcm93U3VtcyhhY3Jvc3MoYWxsX29mKGF0dGVuZGFuY2VfY29scykpKSkKCiMgQVBBLWZvcm1hdHRlZCB0YWJsZQpzZXNzaW9uc19ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG1lYW5fc2Vzc2lvbnMgPSBtZWFuKHRvdGFsX3Nlc3Npb25zLCBuYS5ybSA9IFRSVUUpLAogICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgIG4gPSBuKCksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKc2Vzc2lvbnNfYnlfY29uZGl0aW9uICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgMzogVG90YWwgU2Vzc2lvbnMgQXR0ZW5kZWQgYnkgQ29uZGl0aW9uIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKCiMjIyBBdHRyaXRpb246CgoqKlJlc3VsdHMgVGV4dCoqIEF0dHJpdGlvbiByYXRlcyB3ZXJlIGxvdyBvdmVyYWxsIGFuZCBkaWQgbm90IGRpZmZlciBzaWduaWZpY2FudGx5IGJ5IGNvbmRpdGlvbiwgz4fCsigxLCBOID0gMTUzKSA9IDAuMTEsIHAgPSAuNzUsIHdpdGggOS4yJSBhdHRyaXRpb24gaW4gdGhlIFB1cnJibGUgY29uZGl0aW9uICg3IG9mIDc2IHBhcnRpY2lwYW50cykgYW5kIDYuNSUgYXR0cml0aW9uIGluIHRoZSB3YWl0bGlzdCBjb250cm9sIGNvbmRpdGlvbiAoNSBvZiA3NyBwYXJ0aWNpcGFudHMpLiAKCmBgYHtyfQojIERlZmluZSBwb3N0LXRlc3QgYXR0ZW5kYW5jZSBjb2x1bW5zIChXZWVrcyAxMSwgMTIsIDEzKQpwb3N0X3Rlc3RfY29scyA8LSBjKCJXZWVrXzExIiwgIldlZWtfMTIiLCAiV2Vla18xMyIpCgojIENyZWF0ZSBhdHRyaXRpb24gaW5kaWNhdG9yOiBwb3N0X3Rlc3RfY29tcGxldGUgPSAxIGlmIGFueSBwb3N0LXRlc3Qgc2Vzc2lvbiBhdHRlbmRlZCwgMCBvdGhlcndpc2UKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShwb3N0X3Rlc3RfY29tcGxldGUgPSBpZl9lbHNlKHJvd1N1bXMoYWNyb3NzKGFsbF9vZihwb3N0X3Rlc3RfY29scykpKSA+IDAsIDEsIDApKQoKIyBEaXNwbGF5IHRoZSBBUEEtZm9ybWF0dGVkIHRhYmxlcwphdHRyaXRpb25fYnlfY29uZGl0aW9uICU+JQogIG11dGF0ZSgKICAgIGNvbmRpdGlvbiA9IGRwbHlyOjpyZWNvZGUoYXMuY2hhcmFjdGVyKGNvbmRpdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJXYWl0bGlzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJQdXJyYmxlIikKICApICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgNzogQXR0cml0aW9uIFJhdGUgYnkgQ29uZGl0aW9uIAogICAgICAgICh3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBjb3VudHMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKCioqUmVzdWx0cyBUZXh0OioqICJBY3Jvc3MgdGhlIGZ1bGwgc2FtcGxlLCByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCBhIHNpZ25pZmljYW50IGRlY2xpbmUgaW4gcGFydGljaXBhdGlvbiBvdmVyIHRpbWUsIHdpdGggdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHdlZWtseSByZXNwb25kZW50cyBkZWNyZWFzaW5nIGJ5IGFwcHJveGltYXRlbHkgMi4xNCBwZXIgd2VlayAoU0UgPSAwLjI5LCB0ID0g4oCTNy4zNiwgcCA8IC4wMDEpLiBXaGVuIGV4YW1pbmVkIGJ5IGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbiBkZWNsaW5lZCBhdCBhIHJhdGUgb2Yg4oCTMS40NiBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIFB1cnJibGUgZ3JvdXAgKFNFID0gMC4yMywgdCA9IOKAkzYuMjIsIHAgPCAuMDAxKSBhbmQg4oCTMC42OSBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIHdhaXRsaXN0IGNvbnRyb2wgKFNFID0gMC4xMiwgdCA9IOKAkzUuODIsIHAgPCAuMDAxKS4gQSB0aW1lIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiAozrIgPSAwLjc3LCBTRSA9IDAuMjYsIHAgPSAuMDA3KSBzdWdnZXN0ZWQgYSBzdGVlcGVyIGxpbmVhciBkZWNsaW5lIGluIHRoZSBQdXJyYmxlIGdyb3VwLCB0aG91Z2ggdGhlIGFic29sdXRlIGRpZmZlcmVuY2Ugd2FzIHNtYWxsLiIKCgpgYGB7cn0KCiMgMCkgQnVpbGQgcGVyLWNvbmRpdGlvbiB3ZWVrbHkgY291bnRzIChpbmNsdWRlcyBXZWVrIDApCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUoCiAgICBXZWVrID0gYXMubnVtZXJpYyhXZWVrKQogICAgIyBObyBuZWVkIHRvIHJlZmFjdG9yICdjb25kaXRpb24nIGlmIGl0J3MgYWxyZWFkeSBhIHJlYWRhYmxlIHN0cmluZwogICkKCiMgMSkgRlVMTC1TQU1QTEUgZGVjbGluZTogY29sbGFwc2UgYWNyb3NzIGNvbmRpdGlvbiwgdGhlbiByZWdyZXNzCndlZWtseV90b3RhbCA8LSBwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpemUobl90b3RhbCA9IHN1bShuX3BhcnRpY2lwYW50cyksIC5ncm91cHMgPSAiZHJvcCIpCgptX292ZXJhbGwgPC0gbG0obl90b3RhbCB+IFdlZWssIGRhdGEgPSB3ZWVrbHlfdG90YWwpCm92ZXJhbGxfdGlkeSA8LSB0aWR5KG1fb3ZlcmFsbCwgY29uZi5pbnQgPSBUUlVFKQpvdmVyYWxsX3JvdyA8LSBvdmVyYWxsX3RpZHkgJT4lIGZpbHRlcih0ZXJtID09ICJXZWVrIikKY2F0KHNwcmludGYoCiAgIkFjcm9zcyB0aGUgZnVsbCBzYW1wbGUsIHBhcnRpY2lwYXRpb24gZGVjbGluZWQgYnkgJS4yZiBwZXIgd2VlayAoU0UgPSAlLjJmLCB0ID0gJS4yZiwgcCA9ICUuM2YpLlxuIiwKICBvdmVyYWxsX3JvdyRlc3RpbWF0ZSwgb3ZlcmFsbF9yb3ckc3RkLmVycm9yLCBvdmVyYWxsX3JvdyRzdGF0aXN0aWMsIG92ZXJhbGxfcm93JHAudmFsdWUKKSkKCiMgMikgV0lUSElOLUdST1VQIGRlY2xpbmVzOiBzZXBhcmF0ZSBtb2RlbHMgcGVyIGNvbmRpdGlvbgpieV9jb25kaXRpb25fc2xvcGVzIDwtIHBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgZ3JvdXBfbW9kaWZ5KH4gdGlkeShsbShuX3BhcnRpY2lwYW50cyB+IFdlZWssIGRhdGEgPSAueCksIGNvbmYuaW50ID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIodGVybSA9PSAiV2VlayIpICU+JQogIGRwbHlyOjpzZWxlY3QoY29uZGl0aW9uLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUsIGNvbmYubG93LCBjb25mLmhpZ2gpCgpwcmludChieV9jb25kaXRpb25fc2xvcGVzKQoKIyAzKSBESUZGRVJFTkNFIElOIFNMT1BFUyAoaW50ZXJhY3Rpb24gbW9kZWwpCiMgQ29udmVydCBjb25kaXRpb24gdG8gZmFjdG9yICpvbmx5IHRlbXBvcmFyaWx5KiBmb3IgcmVncmVzc2lvbiwgbm90IG92ZXJ3cml0aW5nIGl0Cm1faW50IDwtIGxtKG5fcGFydGljaXBhbnRzIH4gV2VlayAqIGZhY3Rvcihjb25kaXRpb24pLCBkYXRhID0gcGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24pCmludF90aWR5IDwtIHRpZHkobV9pbnQsIGNvbmYuaW50ID0gVFJVRSkKCiMgUmVmZXJlbmNlLWdyb3VwIChXYWl0bGlzdCkgc2xvcGUgaXMgdGhlICdXZWVrJyBjb2VmZmljaWVudDoKd2FpdGxpc3Rfcm93IDwtIGludF90aWR5ICU+JSBmaWx0ZXIodGVybSA9PSAiV2VlayIpCgojIFNsb3BlIGRpZmZlcmVuY2UgKFB1cnJibGUg4oCTIFdhaXRsaXN0KSBpcyB0aGUgaW50ZXJhY3Rpb24gdGVybToKZGlmZl9yb3cgPC0gaW50X3RpZHkgJT4lIGZpbHRlcihncmVwbCgiXldlZWs6ZmFjdG9yXFwoY29uZGl0aW9uXFwpIiwgdGVybSkpCgojIFB1cnJibGUgc2xvcGUgPSBXYWl0bGlzdCBzbG9wZSArIGludGVyYWN0aW9uCnB1cnJibGVfc2xvcGUgPC0gd2FpdGxpc3Rfcm93JGVzdGltYXRlICsgZGlmZl9yb3ckZXN0aW1hdGUKCmNhdChzcHJpbnRmKAogICJTbG9wZSBkaWZmZXJlbmNlIChXZWVrIMOXIENvbmRpdGlvbikgZXN0aW1hdGUgPSAlLjJmLCBTRSA9ICUuMmYsIHQgPSAlLjJmLCBwID0gJS4zZjsgOTUlJSBDSSBbJS4yZiwgJS4yZl1cbiIsCiAgZGlmZl9yb3ckZXN0aW1hdGUsIGRpZmZfcm93JHN0ZC5lcnJvciwgZGlmZl9yb3ckc3RhdGlzdGljLCBkaWZmX3JvdyRwLnZhbHVlLCBkaWZmX3JvdyRjb25mLmxvdywgZGlmZl9yb3ckY29uZi5oaWdoCikpCmNhdChzcHJpbnRmKCJXYWl0bGlzdCBkZWNsaW5lID0gJS4yZiAvd2Vla1xuIiwgd2FpdGxpc3Rfcm93JGVzdGltYXRlKSkKY2F0KHNwcmludGYoIlB1cnJibGUgZGVjbGluZSAgPSAlLjJmIC93ZWVrXG4iLCBwdXJyYmxlX3Nsb3BlKSkKYGBgCgoKIyMjIFBhcnRpY2lwYXRpb24gYnkgR3JvdXAgT3ZlciBUaW1lCgoqKlJldmlld2VyJ3MgQ29tbWVudDoqKiAiUmVwb3J0IHRoZSByZXNwb25zZSByYXRlIHRvIHdlZWtseSBzdXJ2ZXlzIG92ZXIgdGltZS4gRGVjbGluaW5nIGVuZ2FnZW1lbnQgaXMgY29tbW9uIGluIG1lbnRhbCBoZWFsdGggcG9wdWxhdGlvbnMgYW5kIHJhaXNlcyByaXNrIG9mIHNlbGVjdGl2ZSByZXBvcnRpbmcuICIKCioqUmVzcG9uc2UqKiAiV2UgYWdyZWUgdGhhdCByZXBvcnRpbmcgcmVzcG9uc2UgcmF0ZXMgb3ZlciB0aW1lIGlzIGltcG9ydGFudCB0byBhc3Nlc3MgcG90ZW50aWFsIGVuZ2FnZW1lbnQgZGVjbGluZSBhbmQgc2VsZWN0aXZlIHJlc3BvbnNlIGJpYXMuIFdlIGhhdmUgbm93IGluY2x1ZGVkIGEgdGFibGUgc3VtbWFyaXppbmcgd2Vla2x5IHBhcnRpY2lwYXRpb24gcmF0ZXMgYnkgY29uZGl0aW9uIGFjcm9zcyB0aGUgc3R1ZHkgcGVyaW9kLiIKCioqQWRkZWQgVGV4dCwgUmVzdWx0cyoqICJXZWVrbHkgcmVzcG9uc2UgcmF0ZXMgYXJlIHN1bW1hcml6ZWQgYnkgY29uZGl0aW9uIGluIFRhYmxlIFggYW5kIEZpZ3VyZSBYLiIKCmBgYHtyfQojIyBQYXJ0aWNpcGF0aW9uIFJhdGUgKFdlZWtzIDHigJMxMykKCiMgU3RlcCAxOiBDYWxjdWxhdGUgcGFydGljaXBhdGlvbiBjb3VudCBwZXIgd2VlayBwZXIgY29uZGl0aW9uCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBmaWx0ZXIoV2VlayA+PSAxICYgV2VlayA8PSAxMykgICMgRXhjbHVkZSBXZWVrIDAKCiMgU3RlcCAyOiBBZGQgZGVub21pbmF0b3JzIGZvciBlYWNoIGNvbmRpdGlvbgpwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiA8LSBwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiAlPiUKICBtdXRhdGUoZGVub21pbmF0b3IgPSBjYXNlX3doZW4oCiAgICBjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IiB+IDc2LAogICAgY29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIiB+IDc3CiAgKSwKICBwYXJ0aWNpcGF0aW9uX3JhdGUgPSAobl9wYXJ0aWNpcGFudHMgLyBkZW5vbWluYXRvcikgKiAxMDApICAjIENvbnZlcnQgdG8gcGVyY2VudGFnZQoKIyBTdGVwIDM6IFBpdm90IGZvciBhIFdlZWsgw5cgQ29uZGl0aW9uIHRhYmxlCnBhcnRpY2lwYXRpb25fdGFibGUgPC0gcGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24gJT4lCiAgc2VsZWN0KFdlZWssIGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbl9yYXRlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IHBhcnRpY2lwYXRpb25fcmF0ZSwgdmFsdWVzX2ZpbGwgPSBsaXN0KHBhcnRpY2lwYXRpb25fcmF0ZSA9IDApKSAlPiUKICBhcnJhbmdlKFdlZWspCgojIFN0ZXAgNDogRGlzcGxheSBBUEEtZm9ybWF0dGVkIHRhYmxlCnBhcnRpY2lwYXRpb25fdGFibGUgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZTogV2Vla2x5IFBhcnRpY2lwYXRpb24gUmF0ZXMgKCUgb2YgVG90YWwgUmFuZG9taXplZCkgYnkgQ29uZGl0aW9uIiwgZm9ybWF0ID0gIm1hcmtkb3duIiwgZGlnaXRzID0gMSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCgojIFN0ZXAgNTogUGxvdCBwYXJ0aWNpcGF0aW9uIHJhdGVzIG92ZXIgdGltZQpnZ3Bsb3QocGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24sIGFlcyh4ID0gV2VlaywgeSA9IHBhcnRpY2lwYXRpb25fcmF0ZSwgY29sb3IgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGxhYnModGl0bGUgPSAiV2Vla2x5IFBhcnRpY2lwYXRpb24gUmF0ZSAoV2Vla3MgMeKAkzEzKSBieSBDb25kaXRpb24iLAogICAgICAgeCA9ICJXZWVrIiwKICAgICAgIHkgPSAiUGFydGljaXBhdGlvbiBSYXRlICglKSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArCiAgeWxpbSgwLCAxMDApCmBgYAoKCgpBY3Jvc3MgdGhlIGZ1bGwgc2FtcGxlLCByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCBhIHNpZ25pZmljYW50IGRlY2xpbmUgaW4gcGFydGljaXBhdGlvbiBvdmVyIHRpbWUsIHdpdGggdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHdlZWtseSByZXNwb25kZW50cyBkZWNyZWFzaW5nIGJ5IGFwcHJveGltYXRlbHkgMi4xNCBwZXIgd2VlayAoU0UgPSAwLjI5LCB0ID0g4oCTNy4zNiwgcCA8IC4wMDEpLiBXaGVuIGV4YW1pbmVkIGJ5IGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbiBkZWNsaW5lZCBhdCBhIHJhdGUgb2Yg4oCTMS40NiBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIFB1cnJibGUgZ3JvdXAgKFNFID0gMC4yMywgdCA9IOKAkzYuMjIsIHAgPCAuMDAxKSBhbmQg4oCTMC43MCBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIHdhaXRsaXN0IGNvbnRyb2wgKFNFID0gMC4xMiwgdCA9IOKAkzUuODIsIHAgPCAuMDAxKS4gQSB0aW1lIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiAozrIgPSAwLjc3LCBTRSA9IDAuMjYsIHAgPSAuMDA3KSBzdWdnZXN0ZWQgYSBzbGlnaHRseSBzdGVlcGVyIGxpbmVhciBkZWNsaW5lIGluIHRoZSBQdXJyYmxlIGdyb3VwLCB0aG91Z2ggdGhlIGFic29sdXRlIGRpZmZlcmVuY2Ugd2FzIHNtYWxsIChhcHByb3hpbWF0ZWx5IDAuMuKAkzAuMyBwYXJ0aWNpcGFudHMgcGVyIHdlZWspLiAgIAoKCgoKCgoKCgoKCiMgMi4yLiBQcmVsaW1pbmFyeSBBbmFseXNlcyAKCiMjIDIuMi4xIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCioqUmV2aWV3ZXIgQ29tbWVudDoqKiAiUGxlYXNlIHByb3ZpZGUgYWJzb2x1dGUgZ3JvdXAgbWVhbnMgYW5kIFNEcyBhdCBiYXNlbGluZSBhbmQgZm9sbG93LXVwIGZvciBhbGwgb3V0Y29tZXMgaW4gdGhlIG1haW4gdGV4dCwgbm90IG9ubHkgYWRqdXN0ZWQgZGlmZmVyZW5jZXMuIgoKKipSZXNwb25zZToqKiAiVGhhbmsgeW91IGZvciBwb2ludGluZyBvdXQgdGhpcyBvbWlzc2lvbi4gV2UgYWdyZWUgdGhhdCBwcmVzZW50aW5nIGFic29sdXRlIGdyb3VwIG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIHByb3ZpZGVzIGltcG9ydGFudCBjb250ZXh0IGZvciBpbnRlcnByZXRpbmcgYWRqdXN0ZWQgZWZmZWN0cy4gV2UgaGF2ZSBub3cgYWRkZWQgYSB0YWJsZSBzdW1tYXJpemluZyBwcmUtIGFuZCBwb3N0LXRlc3QgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAobWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMpIGZvciBhbGwgb3V0Y29tZXMgYnkgY29uZGl0aW9uLiIKCioqQWRkZWQgVGV4dDoqKiBUYWJsZSBYIHByZXNlbnRzIHByZS0gYW5kIHBvc3QtdGVzdCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIChtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucykgZm9yIGFsbCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgb3V0Y29tZXMgYnkgY29uZGl0aW9uLgoKYGBge3J9CmRlc2NfdGJsIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgc3VtbWFyaXNlKAogICAgYWNyb3NzKAogICAgICAuY29scyA9IGMoUHJlX0RFUlM4X1N1bSwgUG9zdF9ERVJTOF9TdW0sCiAgICAgICAgICAgICAgICBQcmVfR0FEN19TdW0sICBQb3N0X0dBRDdfU3VtLAogICAgICAgICAgICAgICAgUHJlX1BIUTlfU3VtLCAgUG9zdF9QSFE5X1N1bSksCiAgICAgIC5mbnMgID0gbGlzdChtZWFuID0gfm1lYW4oLngsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICBzZCAgID0gfnNkKC54LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgLm5hbWVzID0gInsuY29sfV97LmZufSIKICAgICksCiAgICAuYnkgPSBjb25kaXRpb25fbnVtCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICAtY29uZGl0aW9uX251bSwKICAgIG5hbWVzX3RvID0gYygiVGltZSIsICJNZWFzdXJlIiwgIi52YWx1ZSIpLAogICAgbmFtZXNfcGF0dGVybiA9ICIoUHJlfFBvc3QpXyhcXHcrKV9TdW1fKG1lYW58c2QpIgogICkgJT4lCiAgbXV0YXRlKAogICAgT3V0Y29tZSA9IGNhc2Vfd2hlbigKICAgICAgTWVhc3VyZSA9PSAiREVSUzgiIH4gIkVtb3Rpb24gUmVndWxhdGlvbiIsCiAgICAgIE1lYXN1cmUgPT0gIkdBRDciICB+ICJBbnhpZXR5IiwKICAgICAgTWVhc3VyZSA9PSAiUEhROSIgIH4gIkRlcHJlc3Npb24iCiAgICApLAogICAgTV9TRCA9IHNwcmludGYoIiUuMmYgKCUuMmYpIiwgbWVhbiwgc2QpCiAgKSAlPiUKICBzZWxlY3QoT3V0Y29tZSwgVGltZSwgY29uZGl0aW9uX251bSwgTV9TRCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGMoY29uZGl0aW9uX251bSwgVGltZSksIHZhbHVlc19mcm9tID0gTV9TRCkgJT4lCiAgcmVuYW1lKAogICAgIldhaXRsaXN0X1ByZSIgID0gYDBfUHJlYCwKICAgICJXYWl0bGlzdF9Qb3N0IiA9IGAwX1Bvc3RgLAogICAgIlB1cnJibGVfUHJlIiAgID0gYDFfUHJlYCwKICAgICJQdXJyYmxlX1Bvc3QiICA9IGAxX1Bvc3RgCiAgKSAlPiUKICBzZWxlY3QoT3V0Y29tZSwgV2FpdGxpc3RfUHJlLCBXYWl0bGlzdF9Qb3N0LCBQdXJyYmxlX1ByZSwgUHVycmJsZV9Qb3N0KQoKIyBQcmludCBpbiBBUEEtc3R5bGUgd2l0aCBQcmUvUG9zdCBhcyBzdWJjb2x1bW5zCmthYmxlKAogIGRlc2NfdGJsLAogIGNhcHRpb24gPSAiTWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIGVhY2ggb3V0Y29tZSBieSBjb25kaXRpb24gYW5kIHRpbWUgcG9pbnQiLAogIGNvbC5uYW1lcyA9IGMoIk91dGNvbWUiLCAiUHJlIiwgIlBvc3QiLCAiUHJlIiwgIlBvc3QiKSwKICBhbGlnbiA9IGMoImwiLCAiYyIsICJjIiwgImMiLCAiYyIpCikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJXYWl0bGlzdCIgPSAyLCAiUHVycmJsZSIgPSAyKSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQpgYGAKCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCmRlc2NfdGJsIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uX251bSwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcmlzZSgKICAgIGFjcm9zcygKICAgICAgYyhQcmVfREVSUzhfU3VtLCBQb3N0X0RFUlM4X1N1bSwKICAgICAgICBQcmVfR0FEN19TdW0sICBQb3N0X0dBRDdfU3VtLAogICAgICAgIFByZV9QSFE5X1N1bSwgIFBvc3RfUEhROV9TdW0pLAogICAgICBsaXN0KG1lYW4gPSB+bWVhbigueCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBzZCAgID0gfnNkKC54LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgLm5hbWVzID0gInsuY29sfV97LmZufSIKICAgICksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gLWMoY29uZGl0aW9uX251bSwgaWRlbnRpdHlfZ3JvdXApLAogICAgbmFtZXNfdG8gPSBjKCJUaW1lIiwgIk1lYXN1cmUiLCAiLnZhbHVlIiksCiAgICBuYW1lc19wYXR0ZXJuID0gIihQcmV8UG9zdClfKFxcdyspX1N1bV8obWVhbnxzZCkiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBDb25kaXRpb24gPSBpZmVsc2UoY29uZGl0aW9uX251bSA9PSAwLCAiV2FpdGxpc3QiLCAiUHVycmJsZSIpLAogICAgSWRlbnRpdHkgID0gaWZlbHNlKGlkZW50aXR5X2dyb3VwID09IDAsICJDaXNnZW5kZXIiLCAiVEdEIiksCiAgICBPdXRjb21lID0gcmVjb2RlKE1lYXN1cmUsCiAgICAgICAgICAgICAgICAgICAgICJERVJTOCIgPSAiRW1vdGlvbiBSZWd1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgIkdBRDciICA9ICJBbnhpZXR5IiwKICAgICAgICAgICAgICAgICAgICAgIlBIUTkiICA9ICJEZXByZXNzaW9uIiksCiAgICBNX1NEID0gc3ByaW50ZigiJS4yZiAoJS4yZikiLCBtZWFuLCBzZCkKICApICU+JQogIHNlbGVjdChPdXRjb21lLCBJZGVudGl0eSwgQ29uZGl0aW9uLCBUaW1lLCBNX1NEKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gVGltZSwgdmFsdWVzX2Zyb20gPSBNX1NEKSAlPiUKICBhcnJhbmdlKE91dGNvbWUsIElkZW50aXR5LCBDb25kaXRpb24pCgojIC0tLSBBUEEtc3R5bGUgdGFibGUgLS0tCmthYmxlKAogIGRlc2NfdGJsLAogIGNhcHRpb24gPSAiTWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgKE0gwrEgU0QpIGZvciBlYWNoIG91dGNvbWUgYnkgY29uZGl0aW9uLCB0aW1lIHBvaW50LCBhbmQgZ2VuZGVyIGlkZW50aXR5IiwKICBjb2wubmFtZXMgPSBjKCJPdXRjb21lIiwgIklkZW50aXR5IEdyb3VwIiwgIkNvbmRpdGlvbiIsICJQcmUiLCAiUG9zdCIpLAogIGFsaWduID0gYygibCIsICJsIiwgImwiLCAiYyIsICJjIikKKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKCmBgYAoKCiMjIDIuMi4yIEJhc2VsaW5lIEVxdWl2YWxlbmNlIAoKKlJlc3VsdHMgVGV4dDoqIEJhc2VsaW5lIG1lYXN1cmVzIG9mIG91dGNvbWUgdmFyaWFibGVzIGFuZCBwYXJ0aWNpcGFudCBhZ2UgZGlkIG5vdCBkaWZmZXIgc2lnbmlmaWNhbnRseSBiZXR3ZWVuIGNvbmRpdGlvbnMuCgpgYGB7ciBiYXNlbGluZV9lcXVpdmFsZW5jZX0KdmFycyA8LSBjKCJhZ2UiLCAiUHJlX0RFUlM4X1N1bSIsICJQcmVfR0FEN19TdW0iLCAiUHJlX1BIUTlfU3VtIikKbGFiZWxzIDwtIGMoIkFnZSIsICJFbW90aW9uIFJlZ3VsYXRpb24gKERFUlMtOCkiLCAiQW54aWV0eSAoR0FELTcpIiwgIkRlcHJlc3Npb24gKFBIUS05KSIpCgojIFQtdGVzdHMKdHRlc3RzX2FsbCA8LSBsYXBwbHkodmFycywgZnVuY3Rpb24odikgewogIG5pY2VfdF90ZXN0KAogICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgICByZXNwb25zZSA9IHYsCiAgICBncm91cCA9ICJjb25kaXRpb24iLAogICAgd2FybmluZyA9IEZBTFNFCiAgKQp9KQoKIyBDb21iaW5lIGludG8gZGF0YWZyYW1lCnR0ZXN0c19jb21iaW5lZCA8LSBiaW5kX3Jvd3ModHRlc3RzX2FsbCwgLmlkID0gIlZhcmlhYmxlIikKdHRlc3RzX2NvbWJpbmVkJFZhcmlhYmxlIDwtIGxhYmVscwoKIyBQcmludCBvbmUgYmVhdXRpZnVsIHRhYmxlIHdvbyEKY2F0KCIjIyMgVGFibGUuIEJhc2VsaW5lIEVxdWl2YWxlbmNlIEFjcm9zcyBDb25kaXRpb25zIChJbmRlcGVuZGVudC1TYW1wbGVzIHQtdGVzdHMpXG4iKQpwcmludChuaWNlX3RhYmxlKHR0ZXN0c19jb21iaW5lZCkpCmBgYAoKCiMjMi4yLjMgT3V0bGllcnMKCipNZXRob2RzIFRleHQ6KiBTZWNvbmQsIHdlIHBlcmZvcm1lZCBtdWx0aXZhcmlhdGUgb3V0bGllciBhbmFseXNlcyB0byBpZGVudGlmeSBpbmZsdWVudGlhbCBkYXRhIHBvaW50cyAoNjMpLgoKKlJlc3VsdHMgVGV4dDoqIFdlIGV4YW1pbmVkIHBvdGVudGlhbCBtdWx0aXZhcmlhdGUgb3V0bGllcnMgYW1vbmcgYmFzZWxpbmUgdmFyaWFibGVzIChQcmUtREVSUzgsIFByZS1HQUQ3LCBQcmUtUEhROSkgdXNpbmcgTWFoYWxhbm9iaXMgZGlzdGFuY2UuIERpc3RhbmNlcyB3ZXJlIGNvbXBhcmVkIHRvIHRoZSDPh8KyIGRpc3RyaWJ1dGlvbiB3aXRoIDMgZGVncmVlcyBvZiBmcmVlZG9tIGF0IHAgPCAuOTkgKGNyaXRpY2FsIHZhbHVlID0gMTEuMzQpLiBPbmUgcGFydGljaXBhbnQgIGV4Y2VlZGVkIHRoaXMgdGhyZXNob2xkIChEwrIgPSAxNC41NyksIGluZGljYXRpbmcgYSBzb21ld2hhdCBhdHlwaWNhbCBjb21iaW5hdGlvbiBvZiBiYXNlbGluZSBlbW90aW9uLXJlZ3VsYXRpb24sIGFueGlldHksIGFuZCBkZXByZXNzaW9uIHNjb3Jlcy4gVG8gZXZhbHVhdGUgaW5mbHVlbmNlIG9uIG1vZGVsIHJlc3VsdHMsIHdlIHJlcmFuIGFsbCBwcmltYXJ5IGFuYWx5c2VzIChBTkNPVkEgYW5kIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVscykgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHBhcnRpY2lwYW50LiBUaGUgcGF0dGVybiwgbWFnbml0dWRlLCBhbmQgc2lnbmlmaWNhbmNlIG9mIHJlc3VsdHMgd2VyZSB1bmNoYW5nZWQuIEFjY29yZGluZ2x5LCBhbGwgYW5hbHlzZXMgd2VyZSByZXBvcnRlZCB1c2luZyB0aGUgZnVsbCBzYW1wbGUuIAoKYGBge3J9CnByZV92YXJzIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIpCgojIFNlbGVjdCBjb21wbGV0ZSBjYXNlcyBvbiBhbGwgcHJlLXRlc3RzCnByZV9kYXRhIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgc2VsZWN0KHBzaWQsIGFsbF9vZihwcmVfdmFycykpICU+JQogIGRyb3BfbmEoKQoKIyBDb21wdXRlIE1haGFsYW5vYmlzIGRpc3RhbmNlCm1haGFsIDwtIG1haGFsYW5vYmlzKAogIHggPSBwcmVfZGF0YVsgLCBwcmVfdmFyc10sCiAgY2VudGVyID0gY29sTWVhbnMocHJlX2RhdGFbICwgcHJlX3ZhcnNdKSwKICBjb3YgPSBjb3YocHJlX2RhdGFbICwgcHJlX3ZhcnNdKQopCgojIENyaXRpY2FsIGN1dG9mZiBmb3Igz4fCsiB3aXRoIGRmID0gbnVtYmVyIG9mIHZhcmlhYmxlcwpjdXRvZmYgPC0gcWNoaXNxKDAuOTksIGRmID0gbGVuZ3RoKHByZV92YXJzKSkKCiMgSWRlbnRpZnkgbXVsdGl2YXJpYXRlIG91dGxpZXJzCnByZV9kYXRhIDwtIHByZV9kYXRhICU+JQogIG11dGF0ZShtYWhhbCA9IG1haGFsLAogICAgICAgICBpc19vdXRsaWVyID0gbWFoYWwgPiBjdXRvZmYpCgojIFN1bW1hcnkKdGFibGUocHJlX2RhdGEkaXNfb3V0bGllcikKCmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChwcmVfZGF0YSwgYWVzKHggPSByZW9yZGVyKHBzaWQsIG1haGFsKSwgeSA9IG1haGFsKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY3V0b2ZmLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIk1haGFsYW5vYmlzIERpc3RhbmNlIGZvciBQcmUtdGVzdCBWYXJpYWJsZXMiLAogICAgeCA9ICJQYXJ0aWNpcGFudCAob3JkZXJlZCBieSBNYWhhbGFub2JpcyBkaXN0YW5jZSkiLAogICAgeSA9ICJNYWhhbGFub2JpcyBEaXN0YW5jZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZsaXAoKQoKIyBHZXQgcGFydGljaXBhbnRzIElEIApvdXRsaWVyX3BzaWQgPC0gcHJlX2RhdGEgJT4lCiAgZmlsdGVyKGlzX291dGxpZXIpICU+JQogIHNlbGVjdChwc2lkLCBtYWhhbCkKCmNhdCgiT3V0bGllciBwYXJ0aWNpcGFudChzKSBiYXNlZCBvbiBNYWhhbGFub2JpcyBkaXN0YW5jZSAocCA8IC45OSk6XG4iKQpwcmludChvdXRsaWVyX3BzaWQpCmBgYAoKCiMjMi4yLjQgQXR0cml0aW9uIEFuYWx5c2lzLiAKKk1ldGhvZHMgVGV4dDoqIFRoaXJkLCB3ZSBjb25kdWN0ZWQgYXR0cml0aW9uIGFuYWx5c2VzICg2NCksIHdpdGggYXR0cml0aW9uIG9wZXJhdGlvbmFsaXNlZCBhcyBwYXJ0aWNpcGFudHMgZmFpbGluZyB0byBmaWxsIGluIGFueSBmb2xsb3ctdXAgcXVlc3Rpb25uYWlyZXMgKFdlZWtzIDEx4oCTMTMpLiBBIGJpbmFyeSBpbmRpY2F0b3Igd2FzIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGZvbGxvdy11cCBjb21wbGV0aW9uICgxID0gZmlsbGVkIGluIGF0IGxlYXN0IG9uZSBmb2xsb3ctdXAgcXVlc3Rpb25uYWlyZTsgMCA9IGZpbGxlZCBpbiBub25lKS4gQXR0cml0aW9uIHJhdGVzIHdlcmUgY2FsY3VsYXRlZCBvdmVyYWxsLCBieSBjb25kaXRpb24sIGFuZCBieSBnZW5kZXIgaWRlbnRpdHksIHVzaW5nIGNoaS1zcXVhcmUgdGVzdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYXR0cml0aW9uIGRpZmZlcmVkIGJ5IGNvbmRpdGlvbiBvciBnZW5kZXIgaWRlbnRpdHkuCgoqUmVzdWx0cyBUZXh0OiogQ2hpLXNxdWFyZSB0ZXN0cyBpbmRpY2F0ZWQgdGhhdCBhdHRyaXRpb24gcmF0ZXMgZGlkIG5vdCBkaWZmZXIgc2lnbmlmaWNhbnRseSBieSBjb25kaXRpb24sIM+HwrIoMSkgPSAwLjExLCBwID0gLjc1LCBvciBieSBnZW5kZXIgaWRlbnRpdHksIM+HwrIoMSkgPDAuMDEsIHAgPSAxLiBXaGlsZSBhbmQgdGhlcmUgd2VyZSBubyBtYWluIG9yIGludGVyYWN0aXZlIGVmZmVjdHMgb2YgYXR0cml0aW9uIG9uIG91dGNvbWVzLiAKCmBgYHtyIGF0dHJpdGlvbl9hbmFseXNpc19maW5hbCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBEZWZpbmUgcG9zdC10ZXN0IGF0dGVuZGFuY2UgY29sdW1ucwpwb3N0X3Rlc3RfY29scyA8LSBjKCJXZWVrXzExIiwgIldlZWtfMTIiLCAiV2Vla18xMyIpCgojIENyZWF0ZSBhdHRyaXRpb24gaW5kaWNhdG9yOiAxID0gY29tcGxldGVkIGFueSBwb3N0LXRlc3Q7IDAgPSBkaWQgbm90IGNvbXBsZXRlIChhdHRyaXRlcikKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShwb3N0X3Rlc3RfY29tcGxldGUgPSBhcy5pbnRlZ2VyKHJvd1N1bXMoYWNyb3NzKGFsbF9vZihwb3N0X3Rlc3RfY29scykpLCBuYS5ybSA9IFRSVUUpID4gMCkpCgojIEhlbHBlciBmdW5jdGlvbiBmb3Igc3VtbWFyaWVzCnN1bW1hcml6ZV9hdHRyaXRpb24gPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXBfdmFyKSB7CiAgZGF0YSAlPiUKICAgIGdyb3VwX2J5KHt7IGdyb3VwX3ZhciB9fSkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIG4gPSBuKCksCiAgICAgIENvbXBsZXRlZCA9IHN1bShwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICAgIE5vdF9Db21wbGV0ZWQgPSBuIC0gQ29tcGxldGVkLAogICAgICBhdHRyaXRpb25fcmF0ZSA9IDEgLSBtZWFuKHBvc3RfdGVzdF9jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgYXR0cml0aW9uX3BlcmNlbnQgPSByb3VuZChhdHRyaXRpb25fcmF0ZSAqIDEwMCwgMSksCiAgICAgIC5ncm91cHMgPSAiZHJvcCIKICAgICkKfQoKIyBIZWxwZXIgZnVuY3Rpb24KcnVuX2F0dHJpdGlvbl9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhLCBncm91cF92YXIsIGdyb3VwX25hbWUpIHsKICAjIENoaS1zcXVhcmUKICBjdCA8LSB0YWJsZShwdWxsKGRhdGEsIHt7IGdyb3VwX3ZhciB9fSksIGRhdGEkcG9zdF90ZXN0X2NvbXBsZXRlKQogIGNoaSA8LSBzdXBwcmVzc1dhcm5pbmdzKGNoaXNxLnRlc3QoY3QpKQogIAogIGNhdCgiXG5cbiMjIyBDaGktc3F1YXJlIHRlc3QgZm9yIGF0dHJpdGlvbiBieSIsIGdyb3VwX25hbWUsICI6XG4iKQogIHByaW50KGNoaSkKICAKIyBTdW1tYXJ5IHRhYmxlCiAgdGJsIDwtIHN1bW1hcml6ZV9hdHRyaXRpb24oZGF0YSwge3sgZ3JvdXBfdmFyIH19KQogIGthYmxlKHRibCwKICAgICAgICBjYXB0aW9uID0gcGFzdGUwKCJUYWJsZTogQXR0cml0aW9uIFJhdGUgYnkgIiwgZ3JvdXBfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIgKHdpdGggQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cykiKSwKICAgICAgICBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUKICAgIHByaW50KCkKfQoKIyBSdW4gYm90aCBjaGlzcXVhcmUKcnVuX2F0dHJpdGlvbl9hbmFseXNpcyhQdXJyYmxlX01hc3Rlcl9XaWRlLCBjb25kaXRpb24sICJDb25kaXRpb24iKQpydW5fYXR0cml0aW9uX2FuYWx5c2lzKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwLCAiR2VuZGVyIElkZW50aXR5IikKCmBgYAoKCipNZXRob2RzIFRleHQ6KiBUaGVuLCB0byBhc3Nlc3MgcG90ZW50aWFsIGF0dHJpdGlvbiBiaWFzLCB3ZSBjb25kdWN0ZWQgdHdvLXdheSBBTk9WQXMgdGVzdGluZyBmb3IgQ29uZGl0aW9uIMOXIEF0dHJpdGlvbiBTdGF0dXMgZWZmZWN0cyBvbiBlYWNoIGJhc2VsaW5lIG91dGNvbWUgdmFyaWFibGUuCgoqUmVzdWx0cyBUZXh0OiogTm8gbWFpbiBvciBpbnRlcmFjdGl2ZSBlZmZlY3RzIG9mIGF0dHJpdGlvbiBzdGF0dXMgd2VyZSBvYnNlcnZlZCBvbiBhbnkgYmFzZWxpbmUgdmFyaWFibGUsIGluZGljYXRpbmcgbm8gZXZpZGVuY2Ugb2YgZGlmZmVyZW50aWFsIGF0dHJpdGlvbgoKYGBge3IgYmFzZWxpbmVfYXR0cml0aW9uX2Fub3ZhX2NvbWJpbmVkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIERlZmluZSB5b3VyIHRocmVlIHByZS10ZXN0IHZhcmlhYmxlcwpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iKQoKIyBDb3JyZXNwb25kaW5nIGRlc2NyaXB0aXZlIGxhYmVscyAKbGFiZWxzIDwtIGMoIkVtb3Rpb24gUmVndWxhdGlvbiAoREVSUy04KSIsCiAgICAgICAgICAgICJBbnhpZXR5IChHQUQtNykiLAogICAgICAgICAgICAiRGVwcmVzc2lvbiAoUEhRLTkpIikKCiMgUnVuIHR3by13YXkgQU5PVkFzCmFub3ZhX3Jlc3VsdHMgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICBtb2RlbCA8LSBhb3YoYXMuZm9ybXVsYShwYXN0ZSh2YXIsICJ+IGNvbmRpdGlvbiAqIGF0dHJpdGlvbl9zdGF0dXMiKSksIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQogIHRpZHkobW9kZWwpICU+JQogICAgbXV0YXRlKFZhcmlhYmxlID0gdmFyKQp9KSAlPiUKICBiaW5kX3Jvd3MoKSAlPiUKICBmaWx0ZXIodGVybSAlaW4lIGMoImNvbmRpdGlvbiIsICJhdHRyaXRpb25fc3RhdHVzIiwgImNvbmRpdGlvbjphdHRyaXRpb25fc3RhdHVzIikpICU+JQogIG11dGF0ZSgKICAgIHRlcm0gPSBkcGx5cjo6cmVjb2RlKHRlcm0sCiAgICAgICJjb25kaXRpb24iID0gIkNvbmRpdGlvbiIsCiAgICAgICJhdHRyaXRpb25fc3RhdHVzIiA9ICJBdHRyaXRpb24gU3RhdHVzIiwKICAgICAgImNvbmRpdGlvbjphdHRyaXRpb25fc3RhdHVzIiA9ICJDb25kaXRpb24gw5cgQXR0cml0aW9uIgogICAgKSwKICAgICMgQWRkIGEgbGFiZWwgY29sdW1uIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSBuYW1lCiAgICBMYWJlbCA9IGNhc2Vfd2hlbigKICAgICAgVmFyaWFibGUgPT0gIlByZV9ERVJTOF9TdW0iIH4gIkVtb3Rpb24gUmVndWxhdGlvbiAoREVSUy04KSIsCiAgICAgIFZhcmlhYmxlID09ICJQcmVfR0FEN19TdW0iICB+ICJBbnhpZXR5IChHQUQtNykiLAogICAgICBWYXJpYWJsZSA9PSAiUHJlX1BIUTlfU3VtIiAgfiAiRGVwcmVzc2lvbiAoUEhRLTkpIiwKICAgICAgVFJVRSB+IFZhcmlhYmxlCiAgICApCiAgKSAlPiUKICBzZWxlY3QoTGFiZWwsIHRlcm0sIGRmLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByZXR0eSB0YWJsZQprYWJsZShhbm92YV9yZXN1bHRzLAogICAgICBjYXB0aW9uID0gIlRhYmxlOiBUd28td2F5IEFOT1ZBcyBmb3IgQmFzZWxpbmUgT3V0Y29tZXMgYnkgQ29uZGl0aW9uIGFuZCBBdHRyaXRpb24gU3RhdHVzIiwKICAgICAgY29sLm5hbWVzID0gYygiVmFyaWFibGUiLCAiRWZmZWN0IiwgImRmIiwgIkYiLCAicCIpLAogICAgICBkaWdpdHMgPSAzLAogICAgICBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKIzIuMyBQcm9ncmFtIEVmZmVjdHMgCgoKCiMjIDIuMy4xICMgTWFpbiBFZmZlY3RzIEFuYWx5c2VzCgpUaGVzZSBhcmUgdGhlIG1haW4gcmVzdWx0cyBmb3IgdGhlIHBhcGVyIGhlcmUuIAoKYGBge3J9CmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShlZmZlY3RzaXplKQoKY2F0KCJjb25kaXRpb25fbnVtIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGNvbmRpdGlvbl9udW0pKQoKY2F0KCJcbmlkZW50aXR5X2dyb3VwIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGlkZW50aXR5X2dyb3VwKSkKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iKQoKZm9yIChkdiBpbiBwb3N0X3ZhcnMpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBkdikKCiAgIyAtLS0gRml0IEFOQ09WQSBtb2RlbCB1c2luZyBudW1lcmljIGNvbmRpdGlvbl9udW0gKDA9V2FpdGxpc3QsIDE9UHVycmJsZSkgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uX251bSIsIHByZV92YXIsICJpZGVudGl0eV9ncm91cCIsICJhZ2UiKSwgZHYpLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KHRlcm0sIGVzdGltYXRlLCBjb25mLmxvdywgY29uZi5oaWdoLCBzdGQuZXJyb3IsIHN0YXRpc3RpYywgcC52YWx1ZSkKCiAgIyAtLS0gQ29tcHV0ZSBwYXJ0aWFsIM63wrIgd2l0aCA5NSUgQ0kgLS0tCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFBhcmFtZXRlciwgRXRhMl9wYXJ0aWFsLCBDSV9sb3csIENJX2hpZ2gpICU+JQogICAgZHBseXI6Om11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpCgogICMgLS0tIE1lcmdlIM63wrIgcmVzdWx0cyBpbnRvIGNvZWZmaWNpZW50IHRhYmxlIC0tLQogIGJldGFfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYmV0YV90YmwsIGV0YV90YmwsIGJ5ID0gYygidGVybSIgPSAiUGFyYW1ldGVyIikpCgogICMgLS0tIFJlbmFtZSBjb2x1bW5zIGZvciByZWFkYWJpbGl0eSAtLS0KICBjb2xuYW1lcyhiZXRhX3RibCkgPC0gYygKICAgICJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgIlNFIiwgInQiLCAicCIsICJQYXJ0aWFsIM63wrIiLCAizrfCsiA5NSUgQ0kgKExvdykiLCAizrfCsiA5NSUgQ0kgKEhpZ2gpIgogICkKCiAgIyAtLS0gUHJpbnQgZm9ybWF0dGVkIEFQQS1zdHlsZSB0YWJsZSAtLS0KICBwcmludCgKICAgIGtuaXRyOjprYWJsZSgKICAgICAgYmV0YV90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IiLCBkdiksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDkpKQogICAgKSAlPiUKICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgpgYGAKCgoKIyMjIE91dGxpZXIgQ2hlY2s6IFJlLXJ1biB3aXRob3V0IFQ0MgoqKlJlc3VsdHMgVGV4dDoqKiBUaGUgcGF0dGVybiwgbWFnbml0dWRlLCBhbmQgc2lnbmlmaWNhbmNlIG9mIHJlc3VsdHMgd2VyZSB1bmNoYW5nZWQuIEFjY29yZGluZ2x5LCBhbGwgYW5hbHlzZXMgd2VyZSByZXBvcnRlZCB1c2luZyB0aGUgZnVsbCBzYW1wbGUuCgpNYWluIGVmZmVjdHMgd2l0aCBhZGp1c3RlZCBtZWFucyBwdXQgaW50byBvbmUgbmVhdCB0YWJsZSAKCkFkZGl0aW9uYWxseSwgcnVucyByZXN1bHRzIHdpdGggb3V0bGllciByZW1vdmVkIChwc2lkLVQ0MikKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKClB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBzaWQgIT0gIlQ0MiIpCgpjYXQoImNvbmRpdGlvbl9udW0gbGV2ZWxzOlxuIikKcHJpbnQodW5pcXVlKFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIkY29uZGl0aW9uX251bSkpCgpjYXQoIlxuaWRlbnRpdHlfZ3JvdXAgbGV2ZWxzOlxuIikKcHJpbnQodW5pcXVlKFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIkaWRlbnRpdHlfZ3JvdXApKQoKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfR0FEN19TdW0iLCAiUG9zdF9QSFE5X1N1bSIpCgpmb3IgKGR2IGluIHBvc3RfdmFycykgewogIHByZV92YXIgPC0gc3ViKCJeUG9zdF8iLCAiUHJlXyIsIGR2KQoKICAjIC0tLSBGaXQgQU5DT1ZBIG1vZGVsIHVzaW5nIG51bWVyaWMgY29uZGl0aW9uX251bSAoMD1XYWl0bGlzdCwgMT1QdXJyYmxlKSAtLS0KICBtb2RlbCA8LSBsbShyZWZvcm11bGF0ZShjKCJjb25kaXRpb25fbnVtIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIpLCBkdiksCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIpCgogICMgLS0tIEV4dHJhY3QgcGFyYW1ldGVyIGVzdGltYXRlcyAtLS0KICBiZXRhX3RibCA8LSBicm9vbTo6dGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+cm91bmQoLiwgMykpKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QodGVybSwgZXN0aW1hdGUsIGNvbmYubG93LCBjb25mLmhpZ2gsIHN0ZC5lcnJvciwgc3RhdGlzdGljLCBwLnZhbHVlKQoKICAjIC0tLSBDb21wdXRlIHBhcnRpYWwgzrfCsiB3aXRoIDk1JSBDSSAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZGVsLCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoUGFyYW1ldGVyLCBFdGEyX3BhcnRpYWwsIENJX2xvdywgQ0lfaGlnaCkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkKCiAgIyAtLS0gTWVyZ2UgzrfCsiByZXN1bHRzIGludG8gY29lZmZpY2llbnQgdGFibGUgLS0tCiAgYmV0YV90YmwgPC0gZHBseXI6OmxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIHJlYWRhYmlsaXR5IC0tLQogIGNvbG5hbWVzKGJldGFfdGJsKSA8LSBjKAogICAgIlByZWRpY3RvciIsICLOsiIsICI5NSUgQ0kgKExvdykiLCAiOTUlIENJIChIaWdoKSIsCiAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICLOt8KyIDk1JSBDSSAoTG93KSIsICLOt8KyIDk1JSBDSSAoSGlnaCkiCiAgKQoKICAjIC0tLSBQcmludCBmb3JtYXR0ZWQgQVBBLXN0eWxlIHRhYmxlIC0tLQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBiZXRhX3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgOSkpCiAgICApICU+JQogICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKICApCn0KCmBgYAoKCgoKCgoKCgpgYGB7cn0KbGlicmFyeShicm9vbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGVmZmVjdHNpemUpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgKG5vIGludGVyYWN0aW9uIHRlcm0pIC0tLQogbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uOmlkZW50aXR5X2dyb3VwIiksIGR2KSwKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiAgIyAtLS0gRXh0cmFjdCBwYXJhbWV0ZXIgZXN0aW1hdGVzICjOsiwgU0UsIHQsIHAsIENJKSAtLS0KICBiZXRhX3RibCA8LSBicm9vbTo6dGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSB8PgogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgfD4KICAgIHNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgY29uZi5sb3csIGNvbmYuaGlnaCwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUpCgogICMgLS0tIENvbXB1dGUgcGFydGlhbCDOt8KyIGZvciBlYWNoIHByZWRpY3RvciAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZGVsLCBwYXJ0aWFsID0gVFJVRSkgfD4KICAgIHNlbGVjdChQYXJhbWV0ZXIsIEV0YTJfcGFydGlhbCkgfD4KICAgIG11dGF0ZShFdGEyX3BhcnRpYWwgPSByb3VuZChFdGEyX3BhcnRpYWwsIDMpKQoKICAjIC0tLSBNZXJnZSBwYXJ0aWFsIM63wrIgaW50byB0aGUgcGFyYW1ldGVyIHRhYmxlIC0tLQogIGV0YV90YmwgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kZWwsIHBhcnRpYWwgPSBUUlVFKSB8PgogIG11dGF0ZShQYXJhbWV0ZXIgPSBkcGx5cjo6cmVjb2RlKFBhcmFtZXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uIiA9ICJjb25kaXRpb24xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uMSIgPSAiY29uZGl0aW9uMSIpKQogIAogIGJldGFfdGJsIDwtIGxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIGNsYXJpdHkgLS0tCm5hbWVzKGJldGFfdGJsKSA8LSBjKCJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgICAgICAgICAgICAgICAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICJDSSB1c2VkIiwgIs63wrIgOTUlIENJIChMb3cpIiwgIs63wrIgOTUlIENJIChIaWdoKSIpCgogICMgLS0tIFByaW50IGZvcm1hdHRlZCB0YWJsZSAtLS0KICBwcmludCgKICAgIGthYmxlKGJldGFfdGJsLAogICAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDcpKSkgfD4KICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CmBgYAoKCgoKCgoqKlJldmlld2VyJ3MgQ29tbWVudDoqKiBSZXBvcnQgZWZmZWN0IHNpemVzIHdpdGggOTUlIENJcyBmb3IgYWRqdXN0ZWQgbWVhbiBkaWZmZXJlbmNlcywgc3RhbmRhcmRpemVkIG1lYW4gZGlmZmVyZW5jZXMKCioqTXkgUmVzcG9uc2UgdG8gQ29tbWVudDoqKiAgCldlIHRoYW5rIHRoZSByZXZpZXdlciBmb3IgdGhpcyBoZWxwZnVsIHN1Z2dlc3Rpb24uIFdlIGhhdmUgbm93IGFkZGVkIGJvdGggdW5zdGFuZGFyZGl6ZWQgYW5kIHN0YW5kYXJkaXplZCBlZmZlY3Qgc2l6ZXMsIGVhY2ggcmVwb3J0ZWQgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFNwZWNpZmljYWxseSwgd2U6CgpDb21wdXRlZCBhZGp1c3RlZCBtZWFuIGRpZmZlcmVuY2VzICjOsikgYmV0d2VlbiB0aGUgUHVycmJsZSBhbmQgd2FpdGxpc3QgY29udHJvbCBjb25kaXRpb25zIHVzaW5nIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucyBmcm9tIHRoZSBBTkNPVkEgbW9kZWxzLCBhbG9uZyB3aXRoIHRoZWlyIDk1JSBDSXMuCgpDYWxjdWxhdGVkIHN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2VzIChDb2hlbuKAmXMgZCkgYW5kIGNvcnJlc3BvbmRpbmcgOTUlIENJcyB1c2luZyB0aGUgZW1tZWFuczo6ZWZmX3NpemUoKSBmdW5jdGlvbiwgYmFzZWQgb24gdGhlIG1vZGVsIHJlc2lkdWFsIHZhcmlhbmNlLgoKQWRkZWQgdGhlc2UgcmVzdWx0cyBpbiBhIG5ldyBzdW1tYXJ5IHRhYmxlIGZvbGxvd2luZyBlYWNoIEFOQ09WQSB0YWJsZSAoc2VlIFRhYmxlIFgpLgoKVGhpcyB0YWJsZSBub3cgcmVwb3J0cywgZm9yIGVhY2ggb3V0Y29tZSwgdGhlIGFkanVzdGVkIGdyb3VwIG1lYW5zLCBhZGp1c3RlZCBtZWFuIGRpZmZlcmVuY2Ugd2l0aCA5NSUgQ0ksIGFuZCBzdGFuZGFyZGl6ZWQgbWVhbiBkaWZmZXJlbmNlIChDb2hlbuKAmXMgZCkgd2l0aCA5NSUgQ0ksIGFzIHJlcXVlc3RlZC4KCmBgYHtyfQojIC0tLSBMb2FkIGxpYnJhcmllcyBzYWZlbHkgLS0tCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShlZmZlY3RzaXplKQoKIyAtLS0gRml0IHlvdXIgQU5DT1ZBIG1vZGVsIC0tLQptb2RlbCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBjb25kaXRpb25fbnVtICsgaWRlbnRpdHlfZ3JvdXAgKyBhZ2UsCiAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKIyAtLS0gR2V0IGFkanVzdGVkIG1lYW5zIGZvciBlYWNoIGNvbmRpdGlvbiAtLS0KZW1tIDwtIGVtbWVhbnMobW9kZWwsIH4gY29uZGl0aW9uX251bSkKCiMgLS0tIENvbXB1dGUgdGhlIGFkanVzdGVkIG1lYW4gZGlmZmVyZW5jZSAoUHVycmJsZSDigJMgV2FpdGxpc3QpIC0tLQpjb250cmFzdF9vYmogPC0gY29udHJhc3QoZW1tLCBtZXRob2QgPSAicmV2cGFpcndpc2UiKQoKIyAtLS0gQ2FsY3VsYXRlIENvaGVu4oCZcyBkIGZvciB0aGF0IGRpZmZlcmVuY2Ugd2l0aCA5NSUgQ0kgLS0tCmRfcmVzdWx0IDwtIGVmZl9zaXplKAogIGNvbnRyYXN0X29iaiwKICBzaWdtYSA9IHNpZ21hKG1vZGVsKSwKICBlZGYgICA9IGRmLnJlc2lkdWFsKG1vZGVsKSwKICBtZXRob2QgPSAiY29oZW4iCikKCmRfcmVzdWx0CgpgYGAKCgpgYGB7cn0KCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iKQoKbWFrZV9hbmNvdmFfdGFibGUgPC0gZnVuY3Rpb24ob3V0Y29tZSwgZGF0YSkgewogIHByZV92YXIgPC0gc3ViKCJeUG9zdF8iLCAiUHJlXyIsIG91dGNvbWUpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIpLCBvdXRjb21lKSwKICAgICAgICAgICAgICBkYXRhID0gZGF0YSkKCiAgIyAtLS0gVHlwZSBJSUkgQU5PVkEgLS0tCiAgYW92X3RibCA8LSBjYXI6OkFub3ZhKG1vZGVsLCB0eXBlID0gMykgfD4gYXMuZGF0YS5mcmFtZSgpCiAgYW92X3RibCRTb3VyY2UgPC0gcm93bmFtZXMoYW92X3RibCkKCiAgYW92X3RibCA8LSBhb3ZfdGJsIHw+CiAgICBtdXRhdGUoYE1lYW4gU3FgID0gYFN1bSBTcWAgLyBEZikgfD4KICAgIHJlbmFtZShgVHlwZSBJSUkgU3VtIG9mIFNxdWFyZXNgID0gYFN1bSBTcWAsCiAgICAgICAgICAgZGYgPSBEZiwKICAgICAgICAgICBGID0gYEYgdmFsdWVgLAogICAgICAgICAgIFNpZy4gPSBgUHIoPkYpYCkKCiAgIyBQYXJ0aWFsIGV0YSBzcXVhcmVkCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUpIHw+CiAgICBzZWxlY3QoUGFyYW1ldGVyLCBFdGEyX3BhcnRpYWwpCgogIGFvdl90YmwgPC0gbGVmdF9qb2luKGFvdl90YmwsIGV0YV90YmwsIGJ5ID0gYygiU291cmNlIiA9ICJQYXJhbWV0ZXIiKSkgfD4KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpIHw+CiAgICByZW5hbWUoYFBhcnRpYWwgRXRhIFNxdWFyZWRgID0gRXRhMl9wYXJ0aWFsKSB8PgogICAgc2VsZWN0KFNvdXJjZSwgYFR5cGUgSUlJIFN1bSBvZiBTcXVhcmVzYCwgZGYsIGBNZWFuIFNxYCwgRiwgU2lnLiwgYFBhcnRpYWwgRXRhIFNxdWFyZWRgKQoKICAjIC0tLSBBZGp1c3RlZCBtZWFucyAtLS0KICBlbW0gPC0gZW1tZWFuczo6ZW1tZWFucyhtb2RlbCwgfiBjb25kaXRpb24pCiAgYWRqX21lYW5zIDwtIGFzLmRhdGEuZnJhbWUoZW1tKQogIGFkal9XTCA8LSByb3VuZChhZGpfbWVhbnMkZW1tZWFuW2Fkal9tZWFucyRjb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiXSwgMikKICBhZGpfUEIgPC0gcm91bmQoYWRqX21lYW5zJGVtbWVhblthZGpfbWVhbnMkY29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCJdLCAyKQoKICAjIC0tLSBQYWlyd2lzZSBjb21wYXJpc29uIChQdXJyYmxlIC0gV2FpdGxpc3QpIC0tLQogIGNvbnRyYXN0X29iaiA8LSBjb250cmFzdChlbW0sIG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpCiAgZGlmZl9lbW0gPC0gc3VtbWFyeShjb25maW50KGNvbnRyYXN0X29iaikpIHw+IGFzLmRhdGEuZnJhbWUoKQogIGJldGEgPC0gcm91bmQoZGlmZl9lbW0kZXN0aW1hdGUsIDIpCiAgY2lfbG93IDwtIHJvdW5kKGRpZmZfZW1tJGxvd2VyLkNMLCAyKQogIGNpX2hpZ2ggPC0gcm91bmQoZGlmZl9lbW0kdXBwZXIuQ0wsIDIpCgogICMgLS0tIENvaGVuJ3MgZCB3aXRoIDk1JSBDSSB2aWEgZW1tZWFuczo6ZWZmX3NpemUgLS0tCiAgZF90YmwgPC0gZWZmX3NpemUoZW1tLCBzaWdtYSA9IHNpZ21hKG1vZGVsKSwgZWRmID0gZGYucmVzaWR1YWwobW9kZWwpKSB8PiBhcy5kYXRhLmZyYW1lKCkKICBkX3ZhbCA8LSByb3VuZChkX3RibCRlZmZlY3Quc2l6ZVsxXSwgMikKICBkX2xvdyA8LSByb3VuZChkX3RibCRsb3dlci5DTFsxXSwgMikKICBkX2hpZ2ggPC0gcm91bmQoZF90YmwkdXBwZXIuQ0xbMV0sIDIpCgogICMgLS0tIFN1bW1hcnkgdGFibGUgLS0tCiAgc3VtbWFyeV90YmwgPC0gdGliYmxlKAogICAgT3V0Y29tZSA9IG91dGNvbWUsCiAgICBBZGpNZWFuX1dMID0gYWRqX1dMLAogICAgQWRqTWVhbl9QQiA9IGFkal9QQiwKICAgIGBBZGouIE1lYW4gRGlmZiAozrIpYCA9IGJldGEsCiAgICBgOTUlIENJICjOsilgID0gcGFzdGUwKCJbIiwgY2lfbG93LCAiLCAiLCBjaV9oaWdoLCAiXSIpLAogICAgYENvaGVuJ3MgZGAgPSBkX3ZhbCwKICAgIGA5NSUgQ0kgKGQpYCA9IHBhc3RlMCgiWyIsIGRfbG93LCAiLCAiLCBkX2hpZ2gsICJdIikKICApCgogICMgLS0tIE91dHB1dCAtLS0KICBjYXQoIlxuXG4jIyMgVGVzdHMgb2YgQmV0d2Vlbi1TdWJqZWN0cyBFZmZlY3RzIGZvciIsIG91dGNvbWUsICJcbiIpCiAgcHJpbnQoCiAgICBrYWJsZSgKICAgICAgYW92X3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJBTkNPVkEgdGFibGUgZm9yIiwgb3V0Y29tZSksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIG5jb2woYW92X3RibCkgLSAxKSksCiAgICAgIGRpZ2l0cyA9IDMKICAgICkgfD4ga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQoKICBjYXQoIlxuXG4qKkFkanVzdGVkIE1lYW5zIGFuZCBFZmZlY3QgU2l6ZSBTdW1tYXJ5IGZvciIsIG91dGNvbWUsICIqKlxuIikKICBwcmludCgKICAgIGthYmxlKAogICAgICBzdW1tYXJ5X3RibCwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgbmNvbChzdW1tYXJ5X3RibCkgLSAxKSksCiAgICAgIGRpZ2l0cyA9IDIKICAgICkgfD4ga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgojIC0tLSBSdW4gYWNyb3NzIGFsbCBvdXRjb21lcyAtLS0KZm9yIChkdiBpbiBwb3N0X3ZhcnMpIHsKICBtYWtlX2FuY292YV90YWJsZShkdiwgUHVycmJsZV9NYXN0ZXJfV2lkZSkKfQoKYGBgCgoKIyMjIFJvYnVzdG5lc3MgQ2hlY2sgdXNpbmcgdGhlIEJlbmphbWluaeKAk0hvY2hiZXJnIChCSCkgRmFsc2UgRGlzY292ZXJ5IFJhdGUgKEZEUikgcHJvY2VkdXJlLgoKVGhpcyByb2J1c3RuZXNzIGNoZWNrIGFjY291bnRzIGZvciBtdWx0aXBsZSBzdGF0aXN0aWNhbCB0ZXN0cyBhY3Jvc3MgdGhlIHRocmVlIHByaW1hcnkgb3V0Y29tZXMgYnkgYXBwbHlpbmcgdGhlIEJlbmphbWluaeKAk0hvY2hiZXJnIHByb2NlZHVyZSwgd2hpY2ggY29udHJvbHMgdGhlIGZhbHNlIGRpc2NvdmVyeSByYXRlIChGRFIpLiBUaGlzIG1ldGhvZCBpcyBsZXNzIGNvbnNlcnZhdGl2ZSB0aGFuIEJvbmZlcnJvbmkgYW5kIGlzIGFwcHJvcHJpYXRlIHdoZW4gb3V0Y29tZXMgYXJlIGNvbmNlcHR1YWxseSByZWxhdGVkIGJ1dCBub3QgZnVsbHkgaW5kZXBlbmRlbnQuIEFsbCBwcmltYXJ5IG91dGNvbWUgZWZmZWN0cyByZW1haW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhZnRlciBjb3JyZWN0aW9uIChGRFIgcSA8IC4wNSksIHN1cHBvcnRpbmcgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIG1haW4gZmluZGluZ3MuCgpgYGB7cn0KcF9tYWluIDwtIGMoMC4wMDIsIDAuMDQ0LCAwLjAwMCkKcC5hZGp1c3QocF9tYWluLCBtZXRob2QgPSAiQkgiKQpgYGAKCgojIyMjIFJlbGlhYmxlIENoYW5nZSBJbmRpY2VzCgojIyMjIyBERVJTLTggCgpgYGB7cn0KCgojIHNwZWNpZnkgcmVsaWFiaWxpdHkKcmVsX0RFUlM4IDwtIDAuODcKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9ERVJTOF9TdW0sIG5hLnJtID0gVFJVRSkKU0VfZGlmZiA8LSBzZF9wcmUgKiBzcXJ0KDIgKiAoMSAtIHJlbF9ERVJTOCkpCgojIGNvbXB1dGUgUkNJIGZvciBlYWNoIHBhcnRpY2lwYW50ClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoCiAgICBSQ0lfREVSUzggPSAoUHJlX0RFUlM4X1N1bSAtIFBvc3RfREVSUzhfU3VtKSAvIFNFX2RpZmYsICAjIG5lZ2F0aXZlIGNoYW5nZSA9IGltcHJvdmVtZW50CiAgICBSQ0lfREVSUzhfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9ERVJTOCA+IDEuOTYgIH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0RFUlM4IDwgLTEuOTYgfiAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsCiAgICAgIFRSVUUgICAgICAgICAgICAgIH4gIk5vIHJlbGlhYmxlIGNoYW5nZSIKICAgICkKICApCgojIHN1bW1hcml6ZSBieSBjb25kaXRpb24KUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBuKCksCiAgICBpbXByb3ZlZCA9IHN1bShSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2ltcHJvdmVkID0gbWVhbihSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSAqIDEwMAogICkKYGBgCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeSh0aWJibGUpOyBsaWJyYXJ5KGZvcmNhdHMpOyBsaWJyYXJ5KFByb3BDSXMpCgojIC0tLSBoZWxwZXJzIC0tLQpyZF9uZXdjb21iZSA8LSBmdW5jdGlvbih4MSwgbjEsIHgyLCBuMikgewogIG91dCA8LSBQcm9wQ0lzOjpkaWZmc2NvcmVjaSh4MSwgbjEsIHgyLCBuMiwgY29uZi5sZXZlbCA9IDAuOTUpICMgTmV3Y29tYmUgc2NvcmUgQ0kKICBjKHJkID0gKHgxL24xIC0geDIvbjIpLCBsbyA9IG91dCRjb25mLmludFsxXSwgaGkgPSBvdXQkY29uZi5pbnRbMl0pCn0Kb3Jfd2FsZCA8LSBmdW5jdGlvbihhLCBiLCBjLCBkKSB7CiAgb3IgPC0gKGEqZCkvKGIqYykKICBzZSA8LSBzcXJ0KDEvYSArIDEvYiArIDEvYyArIDEvZCkKICB6ICA8LSBsb2cob3IpL3NlCiAgcCAgPC0gMipwbm9ybSgtYWJzKHopKQogIGxvIDwtIGV4cChsb2cob3IpIC0gMS45NipzZSk7IGhpIDwtIGV4cChsb2cob3IpICsgMS45NipzZSkKICBjKG9yID0gb3IsIGxvID0gbG8sIGhpID0gaGksIHAgPSBwKQp9Cm5udF9mcm9tX3JkIDwtIGZ1bmN0aW9uKHJkKSBpZmVsc2UocmQgPT0gMCwgTkEsIDEvYWJzKHJkKSkKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgREVSUy04IC0tLQpyZWxfREVSUzggPC0gMC44NwpzZF9wcmUgPC0gc2QoUHVycmJsZV9NYXN0ZXJfV2lkZSRQcmVfREVSUzhfU3VtLCBuYS5ybSA9IFRSVUUpClNFX2RpZmYgPC0gc2RfcHJlICogc3FydCgyICogKDEgLSByZWxfREVSUzgpKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgICMgcG9zaXRpdmUgeiA9IGltcHJvdmVtZW50IChQcmUgPiBQb3N0KQogICAgUkNJX0RFUlM4X3ogPSAoUHJlX0RFUlM4X1N1bSAtIFBvc3RfREVSUzhfU3VtKSAvIFNFX2RpZmYsCiAgICBSQ0lfREVSUzhfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9ERVJTOF96ID49ICAxLjk2IH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0RFUlM4X3ogPD0gLTEuOTYgfiAiUmVsaWFibGUgZGVjbGluZSIsCiAgICAgIFRSVUUgICAgICAgICAgICAgICAgIH4gIk5vIHJlbGlhYmxlIGNoYW5nZSIKICAgICksCiAgICAjIG1hcCBjb25kaXRpb24gZmFjdG9yIHRvIGxhYmVscyB3aXRob3V0IGNoYW5naW5nIGl0cyB1bmRlcmx5aW5nIGNvZGluZyBlbHNld2hlcmUKICAgIGNvbmRpdGlvbl9sYmwgPSBmY3RfcmVjb2RlKGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRsaXN0IENvbnRyb2wiID0gIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1cnJibGUgVHJlYXRtZW50IiAgICAgICAgICA9ICIxIikKICApCgojIC0tLSAyKSBQZXItY29uZGl0aW9uIGNvdW50cyB0YWJsZSAobWF0Y2hlcyB5b3VyIG1hbnVzY3JpcHQgdGFibGUpIC0tLQpkZXJzX2NvdW50cyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGNvdW50KE91dGNvbWUgPSAiRW1vdGlvbiBSZWd1bGF0aW9uIiwgQ29uZGl0aW9uID0gY29uZGl0aW9uX2xibCwgUkNJX0RFUlM4X2NsYXNzKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFJDSV9ERVJTOF9jbGFzcywgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJvd3dpc2UoKSAlPiUgbXV0YXRlKE4gPSBzdW0oY19hY3Jvc3MoYyhgUmVsaWFibGUgaW1wcm92ZW1lbnRgLGBSZWxpYWJsZSBkZWNsaW5lYCxgTm8gcmVsaWFibGUgY2hhbmdlYCkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSgKICAgIHJpX3BjdCA9IHNjYWxlczo6cGVyY2VudChgUmVsaWFibGUgaW1wcm92ZW1lbnRgL04sIGFjY3VyYWN5ID0gMC4xKSwKICAgIHJkX3BjdCA9IHNjYWxlczo6cGVyY2VudChgUmVsaWFibGUgZGVjbGluZWAvTiwgICAgIGFjY3VyYWN5ID0gMC4xKQogICkgJT4lCiAgZHBseXI6OnRyYW5zbXV0ZSgKICAgIE91dGNvbWUsIENvbmRpdGlvbiwgTiwKICAgIGBSZWxpYWJsZSBpbXByb3ZlbWVudGAgPSBgUmVsaWFibGUgaW1wcm92ZW1lbnRgLAogICAgYFJlbGlhYmxlIGRlY2xpbmVgICAgICA9IGBSZWxpYWJsZSBkZWNsaW5lYCwKICAgIGBSZWxpYWJsZSBpbXByb3ZlbWVudCAoJSlgID0gcmlfcGN0LAogICAgYFJlbGlhYmxlIGRlY2xpbmUgKCUpYCAgICAgPSByZF9wY3QKICApCgojIC0tLSAzKSAyw5cyIGNvbnRyYXN0czogzpRwcCwgT1IsIDk1JSBDSSwgcCwgTk5UIChpbXByb3ZlbWVudCArIGRlY2xpbmUpIC0tLQojIFB1bGwgY2VsbHMKaW1wX3BiIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCmltcF93bCA8LSBkZXJzX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCm5fcGIgICA8LSBkZXJzX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiUHVycmJsZSBUcmVhdG1lbnQiKSAlPiUgcHVsbChOKQpuX3dsICAgPC0gZGVyc19jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAlPiUgcHVsbChOKQoKZGVjX3BiIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKGBSZWxpYWJsZSBkZWNsaW5lYCkKZGVjX3dsIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgICA8LSByZF9uZXdjb21iZShpbXBfcGIsIG5fcGIsIGltcF93bCwgbl93bCkKb3JfaW1wICAgPC0gb3Jfd2FsZChpbXBfcGIsIG5fcGIgLSBpbXBfcGIsIGltcF93bCwgbl93bCAtIGltcF93bCkKbm50X2ltcCAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgojIE5lYXQgc3VtbWFyeSB0aWJibGUgZm9yIHlvdXIgcmVzdWx0cyBzZWN0aW9uCmRlcnNfY3JjX3N1bW1hcnkgPC0gdGliYmxlOjp0aWJibGUoCiAgT3V0Y29tZSA9ICJFbW90aW9uIHJlZ3VsYXRpb24gKERFUlMtOCkiLAogIENvbnRyYXN0ID0gYygiUmVsaWFibGUgaW1wcm92ZW1lbnQiLCAiUmVsaWFibGUgZGVjbGluZSIpLAogIGDOlCAocHApYCA9IGMoMTAwKnJkX2ltcFsicmQiXSwgMTAwKnJkX2RlY1sicmQiXSksCiAgYDk1JSBDSSAozpQpYCA9IGMocGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2ltcFsibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2ltcFsiaGkiXSwxKSwgIl0iKSwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiWyIsIHJvdW5kKDEwMCpyZF9kZWNbImxvIl0sMSksICIsICIsIHJvdW5kKDEwMCpyZF9kZWNbImhpIl0sMSksICJdIikpLAogIGBPUiAoOTUlIENJKWAgPSBjKAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9pbXBbIm9yIl0sIG9yX2ltcFsibG8iXSwgb3JfaW1wWyJoaSJdKSwKICAgIHNwcmludGYoIiUuMmYgWyUuMmYsICUuMmZdIiwgb3JfZGVjWyJvciJdLCBvcl9kZWNbImxvIl0sIG9yX2RlY1siaGkiXSkKICApLAogIGBwYCA9IGMob3JfaW1wWyJwIl0sIG9yX2RlY1sicCJdKSwKICBgTk5UIChpZiBpbXByb3ZlbWVudClgID0gYyhpZmVsc2UoaXMuZmluaXRlKG5udF9pbXApLCByb3VuZChubnRfaW1wKSwgTkEpLCBOQSkKKQpkZXJzX2NyY19zdW1tYXJ5CgpkZXJzX2NvdW50cyAlPiUgZHBseXI6OmRpc3RpbmN0KENvbmRpdGlvbikKZGVyc19jb3VudHMKYGBgCgoKIyMjIyMgR0FELTcgCgpgYGB7cn0KIyBzcGVjaWZ5IHJlbGlhYmlsaXR5CnJlbF9HQUQ3IDwtIDAuODcKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9HQUQ3X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX0dBRDcpKQoKIyBjb21wdXRlIFJDSSBmb3IgZWFjaCBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX0dBRDcgPSAoUHJlX0dBRDdfU3VtIC0gUG9zdF9HQUQ3X1N1bSkgLyBTRV9kaWZmLCAgIyBuZWdhdGl2ZSBjaGFuZ2UgPSBpbXByb3ZlbWVudAogICAgUkNJX0dBRDdfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9HQUQ3ID4gMS45NiAgfiAiUmVsaWFibGUgaW1wcm92ZW1lbnQiLAogICAgICBSQ0lfR0FENyA8IC0xLjk2IH4gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLAogICAgICBUUlVFICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApCiAgKQoKIyBzdW1tYXJpemUgYnkgY29uZGl0aW9uClB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgaW1wcm92ZWQgPSBzdW0oUkNJX0dBRDdfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfR0FEN19jbGFzcyA9PSAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsIG5hLnJtID0gVFJVRSksCiAgICBwY3RfaW1wcm92ZWQgPSBtZWFuKFJDSV9HQUQ3X2NsYXNzID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIG5hLnJtID0gVFJVRSkgKiAxMDAKICApCmBgYAoKYGBge3J9CmxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZm9yY2F0cyk7IGxpYnJhcnkoUHJvcENJcyk7IGxpYnJhcnkodGlkeXIpCgojIC0tLSBoZWxwZXJzIChzYW1lIGFzIGJlZm9yZSkgLS0tCnJkX25ld2NvbWJlIDwtIGZ1bmN0aW9uKHgxLCBuMSwgeDIsIG4yKXsKICBvdXQgPC0gUHJvcENJczo6ZGlmZnNjb3JlY2koeDEsIG4xLCB4MiwgbjIsIGNvbmYubGV2ZWwgPSAwLjk1KQogIGMocmQgPSAoeDEvbjEgLSB4Mi9uMiksIGxvID0gb3V0JGNvbmYuaW50WzFdLCBoaSA9IG91dCRjb25mLmludFsyXSkKfQpvcl93YWxkIDwtIGZ1bmN0aW9uKGEsIGIsIGMsIGQpewogIG9yIDwtIChhKmQpLyhiKmMpOyBzZSA8LSBzcXJ0KDEvYSArIDEvYiArIDEvYyArIDEvZCkKICB6IDwtIGxvZyhvcikvc2U7IHAgPC0gMipwbm9ybSgtYWJzKHopKQogIGxvIDwtIGV4cChsb2cob3IpIC0gMS45NipzZSk7IGhpIDwtIGV4cChsb2cob3IpICsgMS45NipzZSkKICBjKG9yID0gb3IsIGxvID0gbG8sIGhpID0gaGksIHAgPSBwKQp9Cm5udF9mcm9tX3JkIDwtIGZ1bmN0aW9uKHJkKSBpZmVsc2UocmQgPT0gMCwgTkEsIDEvYWJzKHJkKSkKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgR0FELTcgLS0tCnJlbF9HQUQ3IDwtIDAuOTAgICAjIDwtLSBzZXQgdG8geW91ciBjaG9zZW4gcmVsaWFiaWxpdHkgKGUuZy4sIC44OeKAky45MikKc2RfcHJlIDwtIHNkKFB1cnJibGVfTWFzdGVyX1dpZGUkUHJlX0dBRDdfU3VtLCBuYS5ybSA9IFRSVUUpClNFX2RpZmYgPC0gc2RfcHJlICogc3FydCgyICogKDEgLSByZWxfR0FENykpCgpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX0dBRDdfeiA9IChQcmVfR0FEN19TdW0gLSBQb3N0X0dBRDdfU3VtKSAvIFNFX2RpZmYsICAjIHBvc2l0aXZlID0gaW1wcm92ZW1lbnQKICAgIFJDSV9HQUQ3X2NsYXNzID0gY2FzZV93aGVuKAogICAgICBSQ0lfR0FEN196ID49ICAxLjk2IH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0dBRDdfeiA8PSAtMS45NiB+ICJSZWxpYWJsZSBkZWNsaW5lIiwKICAgICAgVFJVRSAgICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApLAogICAgIyBrZWVwIHlvdXIgbWFudXNjcmlwdCBsYWJlbHMKICAgIGNvbmRpdGlvbl9sYmwgPSBmY3RfcmVjb2RlKGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRsaXN0IENvbnRyb2wiICAgPSAiMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHVycmJsZSBUcmVhdG1lbnQiICA9ICIxIikKICApCgojIC0tLSAyKSBQZXItY29uZGl0aW9uIGNvdW50cyB0YWJsZSAtLS0KZ2FkX2NvdW50cyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGNvdW50KE91dGNvbWUgPSAiQW54aWV0eSIsIENvbmRpdGlvbiA9IGNvbmRpdGlvbl9sYmwsIFJDSV9HQUQ3X2NsYXNzKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFJDSV9HQUQ3X2NsYXNzLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShOID0gc3VtKGNfYWNyb3NzKGMoYFJlbGlhYmxlIGltcHJvdmVtZW50YCxgUmVsaWFibGUgZGVjbGluZWAsYE5vIHJlbGlhYmxlIGNoYW5nZWApKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoCiAgICByaV9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGltcHJvdmVtZW50YC9OLCBhY2N1cmFjeSA9IDAuMSksCiAgICByZF9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGRlY2xpbmVgL04sICAgICBhY2N1cmFjeSA9IDAuMSkKICApICU+JQogIGRwbHlyOjp0cmFuc211dGUoCiAgICBPdXRjb21lLCBDb25kaXRpb24sIE4sCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnRgID0gYFJlbGlhYmxlIGltcHJvdmVtZW50YCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lYCAgICAgPSBgUmVsaWFibGUgZGVjbGluZWAsCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnQgKCUpYCA9IHJpX3BjdCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lICglKWAgICAgID0gcmRfcGN0CiAgKQoKIyAtLS0gMykgMsOXMiBjb250cmFzdHM6IM6UcHAsIE9SLCA5NSUgQ0ksIHAsIE5OVCAoaW1wcm92ZW1lbnQgKyBkZWNsaW5lKSAtLS0KaW1wX3BiIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIHB1bGwoYFJlbGlhYmxlIGltcHJvdmVtZW50YCkKaW1wX3dsIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAgICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCm5fcGIgICA8LSBnYWRfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKE4pCm5fd2wgICA8LSBnYWRfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgICAlPiUgcHVsbChOKQoKZGVjX3BiIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQpkZWNfd2wgPC0gZ2FkX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICAgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgIDwtIHJkX25ld2NvbWJlKGltcF9wYiwgbl9wYiwgaW1wX3dsLCBuX3dsKQpvcl9pbXAgIDwtIG9yX3dhbGQoaW1wX3BiLCBuX3BiIC0gaW1wX3BiLCBpbXBfd2wsIG5fd2wgLSBpbXBfd2wpCm5udF9pbXAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgpnYWRfY3JjX3N1bW1hcnkgPC0gdGliYmxlKAogIE91dGNvbWUgID0gIkFueGlldHkgKEdBRC03KSIsCiAgQ29udHJhc3QgPSBjKCJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIlJlbGlhYmxlIGRlY2xpbmUiKSwKICBgzpQgKHBwKWAgPSByb3VuZCgxMDAqYyhyZF9pbXBbInJkIl0sIHJkX2RlY1sicmQiXSksIDEpLAogIGA5NSUgQ0kgKM6UKWAgPSBjKAogICAgcGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2ltcFsibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2ltcFsiaGkiXSwxKSwgIl0iKSwKICAgIHBhc3RlMCgiWyIsIHJvdW5kKDEwMCpyZF9kZWNbImxvIl0sMSksICIsICIsIHJvdW5kKDEwMCpyZF9kZWNbImhpIl0sMSksICJdIikKICApLAogIGBPUiAoOTUlIENJKWAgPSBjKAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9pbXBbIm9yIl0sIG9yX2ltcFsibG8iXSwgb3JfaW1wWyJoaSJdKSwKICAgIHNwcmludGYoIiUuMmYgWyUuMmYsICUuMmZdIiwgb3JfZGVjWyJvciJdLCBvcl9kZWNbImxvIl0sIG9yX2RlY1siaGkiXSkKICApLAogIHAgICA9IGMob3JfaW1wWyJwIl0sIG9yX2RlY1sicCJdKSwKICBOTlQgPSBjKGlmZWxzZShpcy5maW5pdGUobm50X2ltcCksIHJvdW5kKG5udF9pbXApLCBOQSksIE5BKQopCgojIGluc3BlY3QKZ2FkX2NvdW50cyAlPiUgZHBseXI6OmRpc3RpbmN0KENvbmRpdGlvbikKZ2FkX2NvdW50cwpnYWRfY3JjX3N1bW1hcnkKCmBgYAojIyMjIyBQSFEtOQpgYGB7cn0KIyBzcGVjaWZ5IHJlbGlhYmlsaXR5CnJlbF9QSFE5IDwtIDAuODYKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9QSFE5X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX1BIUTkpKQoKIyBjb21wdXRlIFJDSSBmb3IgZWFjaCBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX1BIUTkgPSAoUHJlX1BIUTlfU3VtIC0gUG9zdF9QSFE5X1N1bSkgLyBTRV9kaWZmLCAgIyBuZWdhdGl2ZSBjaGFuZ2UgPSBpbXByb3ZlbWVudAogICAgUkNJX1BIUTlfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9QSFE5ID4gMS45NiAgfiAiUmVsaWFibGUgaW1wcm92ZW1lbnQiLAogICAgICBSQ0lfUEhROSA8IC0xLjk2IH4gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLAogICAgICBUUlVFICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApCiAgKQoKIyBzdW1tYXJpemUgYnkgY29uZGl0aW9uClB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgaW1wcm92ZWQgPSBzdW0oUkNJX1BIUTlfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfUEhROV9jbGFzcyA9PSAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsIG5hLnJtID0gVFJVRSksCiAgICBwY3RfaW1wcm92ZWQgPSBtZWFuKFJDSV9QSFE5X2NsYXNzID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIG5hLnJtID0gVFJVRSkgKiAxMDAKICApCgpgYGAKCmBgYHtyfQojIGFzc3VtZXMgbGlicmFyaWVzICsgaGVscGVycyAocmRfbmV3Y29tYmUsIG9yX3dhbGQsIG5udF9mcm9tX3JkKSBhcmUgYWxyZWFkeSBsb2FkZWQKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgUEhRLTkgLS0tCnJlbF9QSFE5IDwtIDAuODkgICMgc2V0IHRvIHlvdXIgY2hvc2VuIHJlbGlhYmlsaXR5CnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9QSFE5X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX1BIUTkpKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgIFJDSV9QSFE5X3ogPSAoUHJlX1BIUTlfU3VtIC0gUG9zdF9QSFE5X1N1bSkgLyBTRV9kaWZmLCAgIyBwb3NpdGl2ZSA9IGltcHJvdmVtZW50CiAgICBSQ0lfUEhROV9jbGFzcyA9IGNhc2Vfd2hlbigKICAgICAgUkNJX1BIUTlfeiA+PSAgMS45NiB+ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsCiAgICAgIFJDSV9QSFE5X3ogPD0gLTEuOTYgfiAiUmVsaWFibGUgZGVjbGluZSIsCiAgICAgIFRSVUUgICAgICAgICAgICAgICAgfiAiTm8gcmVsaWFibGUgY2hhbmdlIgogICAgKSwKICAgICMga2VlcCBtYW51c2NyaXB0IGxhYmVscyBjb25zaXN0ZW50CiAgICBjb25kaXRpb25fbGJsID0gZm9yY2F0czo6ZmN0X3JlY29kZShhcy5mYWN0b3IoY29uZGl0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYWl0bGlzdCBDb250cm9sIiAgID0gIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1cnJibGUgVHJlYXRtZW50IiAgPSAiMSIpCiAgKQoKIyAtLS0gMikgUGVyLWNvbmRpdGlvbiBjb3VudHMgdGFibGUgLS0tCnBocV9jb3VudHMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBkcGx5cjo6Y291bnQoT3V0Y29tZSA9ICJEZXByZXNzaW9uIiwgQ29uZGl0aW9uID0gY29uZGl0aW9uX2xibCwgUkNJX1BIUTlfY2xhc3MpICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gUkNJX1BIUTlfY2xhc3MsIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICBkcGx5cjo6cm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoTiA9IHN1bShjX2Fjcm9zcyhjKGBSZWxpYWJsZSBpbXByb3ZlbWVudGAsYFJlbGlhYmxlIGRlY2xpbmVgLGBObyByZWxpYWJsZSBjaGFuZ2VgKSkpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICByaV9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGltcHJvdmVtZW50YC9OLCBhY2N1cmFjeSA9IDAuMSksCiAgICByZF9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGRlY2xpbmVgL04sICAgICBhY2N1cmFjeSA9IDAuMSkKICApICU+JQogIGRwbHlyOjp0cmFuc211dGUoCiAgICBPdXRjb21lLCBDb25kaXRpb24sIE4sCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnRgID0gYFJlbGlhYmxlIGltcHJvdmVtZW50YCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lYCAgICAgPSBgUmVsaWFibGUgZGVjbGluZWAsCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnQgKCUpYCA9IHJpX3BjdCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lICglKWAgICAgID0gcmRfcGN0CiAgKQoKIyAtLS0gMykgMsOXMiBjb250cmFzdHM6IM6UcHAsIE9SLCA5NSUgQ0ksIHAsIE5OVCAoaW1wcm92ZW1lbnQgKyBkZWNsaW5lKSAtLS0KaW1wX3BiIDwtIHBocV9jb3VudHMgJT4lIGRwbHlyOjpmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBkcGx5cjo6cHVsbChgUmVsaWFibGUgaW1wcm92ZW1lbnRgKQppbXBfd2wgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAgICU+JSBkcGx5cjo6cHVsbChgUmVsaWFibGUgaW1wcm92ZW1lbnRgKQpuX3BiICAgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIGRwbHlyOjpwdWxsKE4pCm5fd2wgICA8LSBwaHFfY291bnRzICU+JSBkcGx5cjo6ZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICAgJT4lIGRwbHlyOjpwdWxsKE4pCgpkZWNfcGIgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIGRwbHlyOjpwdWxsKGBSZWxpYWJsZSBkZWNsaW5lYCkKZGVjX3dsIDwtIHBocV9jb3VudHMgJT4lIGRwbHlyOjpmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgICAlPiUgZHBseXI6OnB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgIDwtIHJkX25ld2NvbWJlKGltcF9wYiwgbl9wYiwgaW1wX3dsLCBuX3dsKQpvcl9pbXAgIDwtIG9yX3dhbGQoaW1wX3BiLCBuX3BiIC0gaW1wX3BiLCBpbXBfd2wsIG5fd2wgLSBpbXBfd2wpCm5udF9pbXAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgpwaHFfY3JjX3N1bW1hcnkgPC0gdGliYmxlOjp0aWJibGUoCiAgT3V0Y29tZSAgPSAiRGVwcmVzc2lvbiAoUEhRLTkpIiwKICBDb250cmFzdCA9IGMoIlJlbGlhYmxlIGltcHJvdmVtZW50IiwiUmVsaWFibGUgZGVjbGluZSIpLAogIGDOlCAocHApYCA9IHJvdW5kKDEwMCpjKHJkX2ltcFsicmQiXSwgcmRfZGVjWyJyZCJdKSwgMSksCiAgYDk1JSBDSSAozpQpYCA9IGMoCiAgICBwYXN0ZTAoIlsiLCByb3VuZCgxMDAqcmRfaW1wWyJsbyJdLDEpLCAiLCAiLCByb3VuZCgxMDAqcmRfaW1wWyJoaSJdLDEpLCAiXSIpLAogICAgcGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2RlY1sibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2RlY1siaGkiXSwxKSwgIl0iKQogICksCiAgYE9SICg5NSUgQ0kpYCA9IGMoCiAgICBzcHJpbnRmKCIlLjJmIFslLjJmLCAlLjJmXSIsIG9yX2ltcFsib3IiXSwgb3JfaW1wWyJsbyJdLCBvcl9pbXBbImhpIl0pLAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9kZWNbIm9yIl0sIG9yX2RlY1sibG8iXSwgb3JfZGVjWyJoaSJdKQogICksCiAgcCAgID0gYyhvcl9pbXBbInAiXSwgb3JfZGVjWyJwIl0pLAogIE5OVCA9IGMoaWZlbHNlKGlzLmZpbml0ZShubnRfaW1wKSwgcm91bmQobm50X2ltcCksIE5BKSwgTkEpCikKCiMgaW5zcGVjdApwaHFfY291bnRzICU+JSBkcGx5cjo6ZGlzdGluY3QoQ29uZGl0aW9uKQpwaHFfY291bnRzCnBocV9jcmNfc3VtbWFyeQoKYGBgCgojIyMjIyBIb3cgbWFueSBzaG93ZWQgcmVsaWFibGUgY2hhbmdlIG9uIGFsbCAzIG1lYXN1cmVzPyAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBuKCksCiAgICBpbXByb3ZlZF9hbGwzID0gc3VtKAogICAgICBSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiAmCiAgICAgIFJDSV9HQUQ3X2NsYXNzICA9PSAiUmVsaWFibGUgaW1wcm92ZW1lbnQiICYKICAgICAgUkNJX1BIUTlfY2xhc3MgID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsCiAgICAgIG5hLnJtID0gVFJVRQogICAgKSwKICAgIHBjdF9pbXByb3ZlZF9hbGwzID0gaW1wcm92ZWRfYWxsMyAvIG4gKiAxMDAKICApCmBgYAoKCgoKCgoKCiMjIDIuMy4xIE1vZGVyYXRpb24gQW5hbHlzZXMKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKCiMgLS0tIFF1aWNrIGNoZWNrIG9mIGNvZGluZyAtLS0KY2F0KCJjb25kaXRpb25fbnVtIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGNvbmRpdGlvbl9udW0pKQoKY2F0KCJcbmlkZW50aXR5X2dyb3VwIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGlkZW50aXR5X2dyb3VwKSkKCiMgLS0tIE91dGNvbWVzIC0tLQpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiAoMCA9IFdhaXRsaXN0LCAxID0gUHVycmJsZSkgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoCiAgICBjKCJjb25kaXRpb25fbnVtIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIsICJjb25kaXRpb25fbnVtOmlkZW50aXR5X2dyb3VwIiksCiAgICBkdgogICksIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiByb3VuZCguLCAzKSkpICU+JQogICAgZHBseXI6OnNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgY29uZi5sb3csIGNvbmYuaGlnaCwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUpCgogICMgLS0tIENvbXB1dGUgcGFydGlhbCDOt8KyIHdpdGggOTUlIENJIC0tLQogIGV0YV90YmwgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kZWwsIHBhcnRpYWwgPSBUUlVFLCBjaSA9IDAuOTUpICU+JQogICAgZHBseXI6OnNlbGVjdChQYXJhbWV0ZXIsIEV0YTJfcGFydGlhbCwgQ0lfbG93LCBDSV9oaWdoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHJvdW5kKC4sIDMpKSkKCiAgIyAtLS0gTWVyZ2UgzrfCsiByZXN1bHRzIGludG8gY29lZmZpY2llbnQgdGFibGUgLS0tCiAgYmV0YV90YmwgPC0gZHBseXI6OmxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIHJlYWRhYmlsaXR5IC0tLQogIGNvbG5hbWVzKGJldGFfdGJsKSA8LSBjKAogICAgIlByZWRpY3RvciIsICLOsiIsICI5NSUgQ0kgKExvdykiLCAiOTUlIENJIChIaWdoKSIsCiAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICLOt8KyIDk1JSBDSSAoTG93KSIsICLOt8KyIDk1JSBDSSAoSGlnaCkiCiAgKQoKICAjIC0tLSBQcmludCBmb3JtYXR0ZWQgQVBBLXN0eWxlIHRhYmxlIC0tLQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBiZXRhX3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgOSkpCiAgICApICU+JQogICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKICApCn0KCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKCmNhdCgiY29uZGl0aW9uX251bSBsZXZlbHM6XG4iKQpwcmludCh1bmlxdWUoUHVycmJsZV9NYXN0ZXJfV2lkZSRjb25kaXRpb25fbnVtKSkKCmNhdCgiXG5pZGVudGl0eV9ncm91cCBsZXZlbHM6XG4iKQpwcmludCh1bmlxdWUoUHVycmJsZV9NYXN0ZXJfV2lkZSRpZGVudGl0eV9ncm91cCkpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgdXNpbmcgbnVtZXJpYyBjb25kaXRpb25fbnVtICgwPVdhaXRsaXN0LCAxPVB1cnJibGUpIC0tLQogIG1vZGVsIDwtIGxtKHJlZm9ybXVsYXRlKGMoImNvbmRpdGlvbl9udW0iLCBwcmVfdmFyLCAiaWRlbnRpdHlfZ3JvdXAiLCAiYWdlIiwgImNvbmRpdGlvbl9udW06aWRlbnRpdHlfZ3JvdXAiKSwgZHYpLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KHRlcm0sIGVzdGltYXRlLCBjb25mLmxvdywgY29uZi5oaWdoLCBzdGQuZXJyb3IsIHN0YXRpc3RpYywgcC52YWx1ZSkKCiAgIyAtLS0gQ29tcHV0ZSBwYXJ0aWFsIM63wrIgd2l0aCA5NSUgQ0kgLS0tCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFBhcmFtZXRlciwgRXRhMl9wYXJ0aWFsLCBDSV9sb3csIENJX2hpZ2gpICU+JQogICAgZHBseXI6Om11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpCgogICMgLS0tIE1lcmdlIM63wrIgcmVzdWx0cyBpbnRvIGNvZWZmaWNpZW50IHRhYmxlIC0tLQogIGJldGFfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYmV0YV90YmwsIGV0YV90YmwsIGJ5ID0gYygidGVybSIgPSAiUGFyYW1ldGVyIikpCgogICMgLS0tIFJlbmFtZSBjb2x1bW5zIGZvciByZWFkYWJpbGl0eSAtLS0KICBjb2xuYW1lcyhiZXRhX3RibCkgPC0gYygKICAgICJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgIlNFIiwgInQiLCAicCIsICJQYXJ0aWFsIM63wrIiLCAizrfCsiA5NSUgQ0kgKExvdykiLCAizrfCsiA5NSUgQ0kgKEhpZ2gpIgogICkKCiAgIyAtLS0gUHJpbnQgZm9ybWF0dGVkIEFQQS1zdHlsZSB0YWJsZSAtLS0KICBwcmludCgKICAgIGtuaXRyOjprYWJsZSgKICAgICAgYmV0YV90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IiLCBkdiksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDkpKQogICAgKSAlPiUKICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgpgYGAKCgoKCgoKIyMjIyBTaW1wbGUgU2xvcGVzIGZvciBERVJTCgpgYGB7cn0KbGlicmFyeShpbnRlcmFjdGlvbnMpCgptb2RfZGVycyA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBhZ2UgKyBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKc2ltX3Nsb3Blcyhtb2RfZGVycywgcHJlZCA9IGNvbmRpdGlvbl9udW0sIG1vZHggPSBpZGVudGl0eV9ncm91cCkKCmludGVyYWN0X3Bsb3QobW9kX2RlcnMsCiAgICAgICAgICAgICAgcHJlZCA9IGNvbmRpdGlvbl9udW0sCiAgICAgICAgICAgICAgbW9keCA9IGlkZW50aXR5X2dyb3VwLAogICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVFJVRSwKICAgICAgICAgICAgICBpbnRlcnZhbCA9IFRSVUUsCiAgICAgICAgICAgICAgbW9keC5sYWJlbHMgPSBjKCJDaXNnZW5kZXIiLCAiVHJhbnNnZW5kZXIgYW5kIEdlbmRlciBEaXZlcnNlIiksCiAgICAgICAgICAgICAgcHJlZC5sYWJlbHMgPSBjKCJXYWl0bGlzdCIsICJQdXJyYmxlIiksCiAgICAgICAgICAgICAgeC5sYWJlbCA9ICJDb25kaXRpb24iLAogICAgICAgICAgICAgIHkubGFiZWwgPSAiUG9zdCBERVJTLTggKEFkai4gZm9yIFByZSBhbmQgQWdlKSIsCiAgICAgICAgICAgICAgbWFpbi50aXRsZSA9ICJDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5IEludGVyYWN0aW9uIChERVJTLTgpIiwKICAgICAgICAgICAgICBjb2xvcnMgPSAiUXVhbDIiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkKCmVtbWVhbnMobW9kX2RlcnMsIH4gY29uZGl0aW9uX251bSAqIGlkZW50aXR5X2dyb3VwLCBjb3YucmVkdWNlID0gbWVhbikKYGBgCgoKCiMjIyMgU2ltcGxlIFNsb3BlcyBmb3IgR0FECgpgYGB7cn0KbGlicmFyeShpbnRlcmFjdGlvbnMpCgptb2RfZ2FkIDwtIGxtKFBvc3RfR0FEN19TdW0gfiBQcmVfR0FEN19TdW0gKyBhZ2UgKyBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIEdBRCBtb2RlcmF0aW9uCnNpbV9zbG9wZXMobW9kX2dhZCwgcHJlZCA9IGNvbmRpdGlvbl9udW0sIG1vZHggPSBpZGVudGl0eV9ncm91cCkKCmludGVyYWN0X3Bsb3QobW9kX2dhZCwKICAgICAgICAgICAgICBwcmVkID0gY29uZGl0aW9uX251bSwKICAgICAgICAgICAgICBtb2R4ID0gaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBUUlVFLAogICAgICAgICAgICAgIGludGVydmFsID0gVFJVRSwKICAgICAgICAgICAgICBtb2R4LmxhYmVscyA9IGMoIkNpc2dlbmRlciIsICJUcmFuc2dlbmRlciBhbmQgR2VuZGVyIERpdmVyc2UiKSwKICAgICAgICAgICAgICBwcmVkLmxhYmVscyA9IGMoIldhaXRsaXN0IiwgIlB1cnJibGUiKSwKICAgICAgICAgICAgICB4LmxhYmVsID0gIkNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgeS5sYWJlbCA9ICJQb3N0IEdBRC03IChBZGouIGZvciBQcmUgYW5kIEFnZSkiLAogICAgICAgICAgICAgIG1haW4udGl0bGUgPSAiQ29uZGl0aW9uIMOXIEdlbmRlciBJZGVudGl0eSBJbnRlcmFjdGlvbiAoR0FELTcpIiwKICAgICAgICAgICAgICBjb2xvcnMgPSAiUXVhbDIiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkKCmVtbWVhbnMobW9kX2dhZCwgfiBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsIGNvdi5yZWR1Y2UgPSBtZWFuKQoKYGBgCgoKCgoKCmBgYHtyfQoKb3B0aW9ucyhjb250cmFzdHMgPSBjKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKIyBGaXQgbW9kZXJhdGlvbiBtb2RlbCBmb3IgREVSUy04Cm1vZF9ERVJTOCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IGNvbmRpdGlvbl9udW0gKiBpZGVudGl0eV9ncm91cF9udW0gKyBQcmVfREVSUzhfU3VtLAogICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIC0tLSBFeHRyYWN0IHJlc3VsdHMgLS0tCgojIDEuIENvZWZmaWNpZW50cyAozrIgYW5kIDk1JSBDSSkKdGlkeV9tb2QgPC0gYnJvb206OnRpZHkobW9kX0RFUlM4LCBjb25mLmludCA9IFRSVUUpCgojIDIuIFR5cGUgSUlJIEFOT1ZBIGZvciBGIC8gcAphb3ZfdGFiIDwtIGNhcjo6QW5vdmEobW9kX0RFUlM4LCB0eXBlID0gMykKCiMgMy4gUGFydGlhbCDOt8KyIHdpdGggOTUlIENJCmV0YV90YWIgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kX0RFUlM4LCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KQoKIyAtLS0gQnVpbGQgdGlkeSBzdW1tYXJ5IHRhYmxlIGZvciBDb25kaXRpb24gYW5kIEludGVyYWN0aW9uIC0tLQoKcHVsbF9lZmZlY3QgPC0gZnVuY3Rpb24odGVybV9sYWJlbCwgcHJldHR5X25hbWUpIHsKICBiZXRhX3JvdyA8LSB0aWR5X21vZCAlPiUgZHBseXI6OmZpbHRlcih0ZXJtID09IHRlcm1fbGFiZWwpCiAgYW92X3JvdyAgPC0gYW92X3RhYlt0ZXJtX2xhYmVsLCBdCiAgZXRhX3JvdyAgPC0gZXRhX3RhYiAlPiUgZHBseXI6OmZpbHRlcihQYXJhbWV0ZXIgPT0gdGVybV9sYWJlbCkKICAKICB0aWJibGU6OnRpYmJsZSgKICAgIEVmZmVjdCAgPSBwcmV0dHlfbmFtZSwKICAgIEJldGEgICAgPSByb3VuZChiZXRhX3JvdyRlc3RpbWF0ZSwgMiksCiAgICBgOTUlIENJICjOsilgID0gc3ByaW50ZigiWyUuMmYsICUuMmZdIiwgYmV0YV9yb3ckY29uZi5sb3csIGJldGFfcm93JGNvbmYuaGlnaCksCiAgICBGICAgICAgID0gcm91bmQoYXMubnVtZXJpYyhhb3Zfcm93W1siRiB2YWx1ZSJdXSksIDIpLAogICAgZGYgICAgICA9IHBhc3RlMChhb3Zfcm93W1siRGYiXV0sICIsICIsIGRmLnJlc2lkdWFsKG1vZF9ERVJTOCkpLAogICAgcCAgICAgICA9IGZvcm1hdEMoYXMubnVtZXJpYyhhb3Zfcm93W1siUHIoPkYpIl1dKSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAzKSwKICAgIGDOt8Ky4oKaYCAgID0gcm91bmQoZXRhX3JvdyRFdGEyX3BhcnRpYWwsIDMpLAogICAgYDk1JSBDSSAozrfCsuKCmilgID0gc3ByaW50ZigiWyUuM2YsICUuM2ZdIiwgZXRhX3JvdyRDSV9sb3csIGV0YV9yb3ckQ0lfaGlnaCkKICApCn0KCnJlc3VsdHNfREVSUzggPC0gZHBseXI6OmJpbmRfcm93cygKICBwdWxsX2VmZmVjdCgiY29uZGl0aW9uX251bSIsICJDb25kaXRpb24gKG1haW4pIiksCiAgcHVsbF9lZmZlY3QoImNvbmRpdGlvbl9udW06aWRlbnRpdHlfZ3JvdXBfbnVtIiwgIkNvbmRpdGlvbiDDlyBHZW5kZXIiKQopCgojIC0tLSBQcmludCBBUEEtc3R5bGUgdGFibGUgLS0tCmthYmxlKAogIHJlc3VsdHNfREVSUzgsCiAgY2FwdGlvbiA9ICJNb2RlcmF0aW9uIEFOQ09WQSBmb3IgREVSUy04IChDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5LCBjb250cm9sbGluZyBmb3IgUHJlLURFUlMtOCkiCikgfD4KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKCgoKCgpgYGB7cn0KIyBNb2RlcmF0aW9uIEFuYWx5c2VzOiBDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5IChpZGVudGl0eV9ncm91cF9udW0pCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCmZpdF9tb2RlcmF0aW9uIDwtIGZ1bmN0aW9uKG91dGNvbWUsIGRhdGEpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBvdXRjb21lKQogIAogIG1vZCA8LSBsbShyZWZvcm11bGF0ZSgKICAgIGMoImNvbmRpdGlvbl9udW0iLCAiaWRlbnRpdHlfZ3JvdXBfbnVtIiwgCiAgICAgICJjb25kaXRpb25fbnVtOmlkZW50aXR5X2dyb3VwX251bSIsIHByZV92YXIsICJhZ2UiKSwgCiAgICBvdXRjb21lKSwKICAgIGRhdGEgPSBkYXRhCiAgKQogIAogICMgQWRqdXN0ZWQgbWVhbnMgZm9yIGVhY2ggY29uZGl0aW9uIMOXIGdlbmRlciBjb21iaW5hdGlvbgogIGVtbSA8LSBlbW1lYW5zKG1vZCwgfiBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXBfbnVtKSB8PiBhcy5kYXRhLmZyYW1lKCkKICAKICAjIEV4dHJhY3QgaW50ZXJhY3Rpb24gZWZmZWN0IChDb25kaXRpb24gw5cgR2VuZGVyKQogIGludGVyX3JvdyA8LSBicm9vbTo6dGlkeShtb2QsIGNvbmYuaW50ID0gVFJVRSkgfD4gCiAgICBmaWx0ZXIodGVybSA9PSAiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iKQogIAogIGJldGFfaW50IDwtIGludGVyX3JvdyRlc3RpbWF0ZQogIGNpX2ludCAgIDwtIHNwcmludGYoIlslLjJmLCAlLjJmXSIsIGludGVyX3JvdyRjb25mLmxvdywgaW50ZXJfcm93JGNvbmYuaGlnaCkKICBwX2ludCAgICA8LSBpbnRlcl9yb3ckcC52YWx1ZQogIAogICMgRi10ZXN0IGZvciBpbnRlcmFjdGlvbgogIGFvdl9yb3cgPC0gY2FyOjpBbm92YShtb2QsIHR5cGUgPSAzKVsiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iLCBdCiAgRl92YWwgICA8LSBhcy5udW1lcmljKGFvdl9yb3ckYEYgdmFsdWVgKQogIHBfdmFsICAgPC0gYXMubnVtZXJpYyhhb3Zfcm93JGBQcig+RilgKQogIAogICMgUGFydGlhbCDOt8KyIGZvciBpbnRlcmFjdGlvbgogIGV0YV9yb3cgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kLCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KSB8PgogICAgZmlsdGVyKFBhcmFtZXRlciA9PSAiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iKQogIGV0YV9wICA8LSBldGFfcm93JEV0YTJfcGFydGlhbAogIGNpX2V0YSA8LSBzcHJpbnRmKCJbJS4zZiwgJS4zZl0iLCBldGFfcm93JENJX2xvdywgZXRhX3JvdyRDSV9oaWdoKQogIAogIHRpYmJsZSgKICAgIE91dGNvbWUgID0gb3V0Y29tZSwKICAgIEYgICAgICAgID0gcm91bmQoRl92YWwsIDIpLAogICAgZGYgICAgICAgPSBwYXN0ZTAoIjEsICIsIGRmLnJlc2lkdWFsKG1vZCkpLAogICAgcCAgICAgICAgPSBmb3JtYXRDKHBfdmFsLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDMpLAogICAgQmV0YV9JbnQgPSByb3VuZChiZXRhX2ludCwgMiksCiAgICBgOTUlIENJICjOsilgID0gY2lfaW50LAogICAgYM63wrLigppgID0gcm91bmQoZXRhX3AsIDMpLAogICAgYDk1JSBDSSAozrfCsuKCmilgID0gY2lfZXRhCiAgKQp9CgojIFJ1biBmb3IgYWxsIHBvc3Qgb3V0Y29tZXMKcmVzdWx0c19tb2RlcmF0aW9uIDwtIG1hcF9kZnIocG9zdF92YXJzLCBmaXRfbW9kZXJhdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIERpc3BsYXkgdGFibGUKa2FibGUoCiAgcmVzdWx0c19tb2RlcmF0aW9uLAogIGFsaWduID0gYygibCIsInIiLCJjIiwiciIsInIiLCJyIiwiciIsImMiKSwKICBjYXB0aW9uID0gIk1vZGVyYXRpb24gYW5hbHlzaXM6IENvbmRpdGlvbiDDlyBHZW5kZXIgSWRlbnRpdHkgKGlkZW50aXR5X2dyb3VwX251bSkgaW50ZXJhY3Rpb24gZWZmZWN0cyIKKSB8PiAKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKCgoKCgoKCgoKCk1BSU4gRUZGRUNUUyBSRVZJRVdFUiBDT01NRU5UUyBBTkQgRk9MTE9XIFVQCk9VVExJRVIKCiJQcm92aWRlIHNlbnNpdGl2aXR5IGFuYWx5c2VzIHRvIGFkZHJlc3MgcG9zc2libGUgYmlhcyBmcm9tIGZhc3RlciBlbmdhZ2VtZW50IGRlY2xpbmUgaW4gdGhlIGludGVydmVudGlvbiBhcm0uICIKCgoKYGBge3J9CnBfbW9kIDwtIGMoMC4wMzgsIDAuMDMxLCAwLjA3NikKcC5hZGp1c3QocF9tb2QsIG1ldGhvZCA9ICJCSCIpCmBgYAoKCgoKYGBge3J9Cm1vZF9pbnQgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBQcmVfREVSUzhfU3VtICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsKICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKY2FyOjpBbm92YShtb2RfaW50LCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCgptb2RfaW50IDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gUHJlX0RFUlM4X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICBjb25kaXRpb25fbnVtICogdG90YWxfc2Vzc2lvbnMsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCmNhcjo6QW5vdmEobW9kX2ludCwgdHlwZSA9IDMpWyJjb25kaXRpb25fbnVtOnRvdGFsX3Nlc3Npb25zIiwgXQoKIyBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGxpYnJhcnkgbG9hZGVkCmxpYnJhcnkoZW1tZWFucykKCiMgWW91ciBpbnRlcmFjdGlvbiBtb2RlbCAod2hpY2ggeW91J3ZlIGFscmVhZHkgcnVuKQptb2RfaW50IDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gUHJlX0RFUlM4X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICBjb25kaXRpb25fbnVtICogdG90YWxfc2Vzc2lvbnMsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIFRoaXMgaXMgdGhlIHByb2JlIQojIEl0IGFza3M6ICJXaGF0IGlzIHRoZSB0cmVuZC9zbG9wZSBvZiB0b3RhbF9zZXNzaW9ucyBmb3IgZWFjaCBjb25kaXRpb25fbnVtPyIKc2ltcGxlX3Nsb3BlcyA8LSBlbXRyZW5kcyhtb2RfaW50LCB+IGNvbmRpdGlvbl9udW0sIHZhciA9ICJ0b3RhbF9zZXNzaW9ucyIpCgojIFByaW50IHRoZSByZXN1bHRzCnByaW50KHNpbXBsZV9zbG9wZXMpCmBgYApgYGB7cn0KIyBNYWtlIHN1cmUgbGlicmFyaWVzIGFyZSBsb2FkZWQKbGlicmFyeShjYXIpCmxpYnJhcnkoZW1tZWFucykKCiMgLS0tIEFuYWx5c2lzIGZvciBHQUQtNyAtLS0KCiMgMS4gRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbCBmb3IgR0FELTcKbW9kX2ludF9nYWQgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IFByZV9HQUQ3X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX251bSAqIHRvdGFsX3Nlc3Npb25zLAogICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgMi4gR2V0IHRoZSBGLXRlc3QgZm9yIHRoZSBHQUQtNyBpbnRlcmFjdGlvbgojICAgIFRoaXMgaXMgeW91ciBGSVJTVCBrZXkgZmluZGluZyAocC12YWx1ZSBmb3IgdGhlIGludGVyYWN0aW9uKQpwcmludCgiLS0tIEdBRC03IEludGVyYWN0aW9uIEYtVGVzdCAtLS0iKQpnYWRfaW50ZXJhY3Rpb25fdGVzdCA8LSBjYXI6OkFub3ZhKG1vZF9pbnRfZ2FkLCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCnByaW50KGdhZF9pbnRlcmFjdGlvbl90ZXN0KQoKCiMgMy4gUHJvYmUgdGhlIEdBRC03IGludGVyYWN0aW9uCiMgICAgVGhpcyBpcyB5b3VyIFNFQ09ORCBrZXkgZmluZGluZyAodGhlIHNpbXBsZSBzbG9wZXMpCnByaW50KCItLS0gR0FELTcgU2ltcGxlIFNsb3BlcyAtLS0iKQpzaW1wbGVfc2xvcGVzX2dhZCA8LSBlbXRyZW5kcyhtb2RfaW50X2dhZCwgfiBjb25kaXRpb25fbnVtLCB2YXIgPSAidG90YWxfc2Vzc2lvbnMiKQpwcmludChzaW1wbGVfc2xvcGVzX2dhZCkKCgojIC0tLSBBbmFseXNpcyBmb3IgUEhRLTkgLS0tCgojIDEuIEZpdCB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgZm9yIFBIUS05Cm1vZF9pbnRfcGhxIDwtIGxtKFBvc3RfUEhROV9TdW0gfiBQcmVfUEhROV9TdW0gKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIDIuIEdldCB0aGUgRi10ZXN0IGZvciB0aGUgUEhRLTkgaW50ZXJhY3Rpb24KIyAgICBUaGlzIGlzIHlvdXIgRklSU1Qga2V5IGZpbmRpbmcgKHAtdmFsdWUgZm9yIHRoZSBpbnRlcmFjdGlvbikKcHJpbnQoIi0tLSBQSFEtOSBJbnRlcmFjdGlvbiBGLVRlc3QgLS0tIikKcGhxX2ludGVyYWN0aW9uX3Rlc3QgPC0gY2FyOjpBbm92YShtb2RfaW50X3BocSwgdHlwZSA9IDMpWyJjb25kaXRpb25fbnVtOnRvdGFsX3Nlc3Npb25zIiwgXQpwcmludChwaHFfaW50ZXJhY3Rpb25fdGVzdCkKCiMgMy4gUHJvYmUgdGhlIFBIUS05IGludGVyYWN0aW9uCiMgICAgVGhpcyBpcyB5b3VyIFNFQ09ORCBrZXkgZmluZGluZyAodGhlIHNpbXBsZSBzbG9wZXMpCnByaW50KCItLS0gUEhRLTkgU2ltcGxlIFNsb3BlcyAtLS0iKQpzaW1wbGVfc2xvcGVzX3BocSA8LSBlbXRyZW5kcyhtb2RfaW50X3BocSwgfiBjb25kaXRpb25fbnVtLCB2YXIgPSAidG90YWxfc2Vzc2lvbnMiKQpwcmludChzaW1wbGVfc2xvcGVzX3BocSkKYGBgCgoKCgoKCgoKCgoKCgoKCiMjIExpbmVhciBNaXhlZCBFZmZlY3RzIE1vZGVscyAKCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICAiR0FEN19TdW0iLCAiUEhROV9TdW0iKQoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgbW9kZWwgc3VtbWFyaWVzCnJlc3VsdHNfbGlzdCA8LSBsaXN0KCkKCiMgTG9vcCBvdmVyIGVhY2ggb3V0Y29tZSBhbmQgZml0IHRoZSBtaXhlZC1lZmZlY3RzIG1vZGVsIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBtb2RlbCA8LSBsbWVyKGFzLmZvcm11bGEocGFzdGUob3V0Y29tZSwgIn4gV2VlayAqIGNvbmRpdGlvbiArIGlkZW50aXR5X2dyb3VwICsgYWdlICsgKFdlZWsgfCBwc2lkKSIpKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX0xvbmdfTWFzdGVyKQogICMgVGlkeSB0aGUgbW9kZWwgb3V0cHV0IGFuZCBzdG9yZSBpdCBpbiB0aGUgbGlzdAogIHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dIDwtIHRpZHkobW9kZWwpCn0KCiMgTG9vcCB0byBwcmludCBlYWNoIG1vZGVsIHN1bW1hcnkgaW4gQVBBLXN0eWxlIHRhYmxlcwpmb3IgKG91dGNvbWUgaW4gbmFtZXMocmVzdWx0c19saXN0KSkgewogIGNhdCgiIyMjIE91dGNvbWU6Iiwgb3V0Y29tZSwgIlxuXG4iKQogIGthYmxlKHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dLCAKICAgICAgICBjYXB0aW9uID0gcGFzdGUoIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIiwgb3V0Y29tZSwgImNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cCBhbmQgYWdlIiksIAogICAgICAgIGRpZ2l0cyA9IDMpICU+JQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpICU+JQogICAgcHJpbnQoKQogIGNhdCgiXG5cbiIpCn0KCmBgYAoKCgoKIyMjUmV2aWV3ZXIgQ29tbWVudDogU2Vuc2l0aXZpdHkgQW5hbHlzaXMKClJldmlld2VyIENvbW1lbnQ6CiJQcm92aWRlIHNlbnNpdGl2aXR5IGFuYWx5c2VzIHRvIGFkZHJlc3MgcG9zc2libGUgYmlhcyBmcm9tIGZhc3RlciBlbmdhZ2VtZW50IGRlY2xpbmUgaW4gdGhlIGludGVydmVudGlvbiBhcm0uIgoKTXkgUmVzcG9uc2UgdG8gQ29tbWVudDoKQmVjYXVzZSBlbmdhZ2VtZW50IGFuYWx5c2VzIGRlbW9uc3RyYXRlZCBhIGZhc3RlciByYXRlIG9mIGRlY2xpbmUgaW4gdGhlIFB1cnJibGUgYXJtIGNvbXBhcmVkIHRvIHRoZSB3YWl0bGlzdCBjb250cm9sLCB3ZSBjb25kdWN0ZWQgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY29tcGxldGVkIGJ5IGVhY2ggcGFydGljaXBhbnQgd2FzIGFzc29jaWF0ZWQgd2l0aCBpbnRlcnZlbnRpb24gb3V0Y29tZXMuIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgcGFydGljaXBhdGVkIHdhcyBhZGRlZCBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgQU5DT1ZBIG1vZGVscy4gQWNyb3NzIG91dGNvbWVzLCBpbmNsdXNpb24gb2YgdGhpcyBjb3ZhcmlhdGUgZGlkIG5vdCBhbHRlciB0aGUgcGF0dGVybiwgbWFnbml0dWRlLCBvciBzaWduaWZpY2FuY2Ugb2YgcmVzdWx0cywgYW5kIG51bWJlciBvZiBzZXNzaW9ucyB3YXMgbm90IGEgc2lnbmlmaWNhbnQgcHJlZGljdG9yIGluIGFueSBtb2RlbC4gVGhlc2UgZmluZGluZ3MgaW5kaWNhdGUgdGhhdCBkaWZmZXJlbmNlcyBpbiB0aGUgcmF0ZSBvZiBzdXJ2ZXkgcmVzcG9uc2l2ZW5lc3MgZGlkIG5vdCBiaWFzIHRoZSBwcmltYXJ5IHJlc3VsdHMuCgpSZXZpZXdlciBDb21tZW50OgoiSW5jbHVkZSBzZW5zaXRpdml0eSBhbmFseXNlcyBhZGRyZXNzaW5nIGRpZmZlcmVudGlhbCBlbmdhZ2VtZW50IGJldHdlZW4gYXJtcy4iCgpNeSBSZXNwb25zZSB0byBDb21tZW50OgpUbyBmdXJ0aGVyIGV4YW1pbmUgcG90ZW50aWFsIGRpZmZlcmVuY2VzIGluIGVuZ2FnZW1lbnQgYmV0d2VlbiBzdHVkeSBhcm1zLCB3ZSBjb21wYXJlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNvbXBsZXRlZCBhY3Jvc3MgY29uZGl0aW9ucyBhbmQgaW5jbHVkZWQgdGhpcyB2YXJpYWJsZSBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgb3V0Y29tZSBtb2RlbHMuIEFsdGhvdWdoIHBhcnRpY2lwYW50cyBpbiB0aGUgUHVycmJsZSBhcm0gY29tcGxldGVkIHNsaWdodGx5IGZld2VyIHNlc3Npb25zIG9uIGF2ZXJhZ2UgdGhhbiB0aG9zZSBpbiB0aGUgd2FpdGxpc3QgY29uZGl0aW9uLCB0aGlzIGRpZmZlcmVuY2UgZGlkIG5vdCBhZmZlY3QgYW55IG91dGNvbWUuIFJlc3VsdHMgcmVtYWluZWQgY29uc2lzdGVudCB3aXRoIHByaW1hcnkgYW5hbHlzZXMsIHN1Z2dlc3RpbmcgdGhhdCBkaWZmZXJlbnRpYWwgZW5nYWdlbWVudCBiZXR3ZWVuIGFybXMgZGlkIG5vdCBhY2NvdW50IGZvciB0aGUgb2JzZXJ2ZWQgaW50ZXJ2ZW50aW9uIGVmZmVjdHMuCgoKKipSZXN1bHRzIFRleHQ6KiogQmVjYXVzZSBlbmdhZ2VtZW50IGFuYWx5c2VzIGluZGljYXRlZCBhIGZhc3RlciByYXRlIG9mIGRlY2xpbmUgaW4gdGhlIFB1cnJibGUgYXJtIGNvbXBhcmVkIHRvIHRoZSB3YWl0bGlzdCBjb250cm9sLCB3ZSBjb25kdWN0ZWQgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY29tcGxldGVkIGJ5IGVhY2ggcGFydGljaXBhbnQgd2FzIGFzc29jaWF0ZWQgd2l0aCBpbnRlcnZlbnRpb24gb3V0Y29tZXMuIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgcGFydGljaXBhdGVkIHdhcyBhZGRlZCBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgbW9kZWxzLiBBY3Jvc3Mgb3V0Y29tZXMsIGluY2x1c2lvbiBvZiB0aGlzIGNvdmFyaWF0ZSBkaWQgbm90IGFsdGVyIHRoZSBwYXR0ZXJuLCBtYWduaXR1ZGUsIG9yIHNpZ25pZmljYW5jZSBvZiByZXN1bHRzLCBhbmQgbnVtYmVyIG9mIHNlc3Npb25zIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3IgaW4gYW55IG1vZGVsLgoKYGBge3J9CmZpdF9vbmVfc2Vuc19mdWxsIDwtIGZ1bmN0aW9uKG91dGNvbWUsIGRhdGEpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBvdXRjb21lKQogIAogICMgLS0tIEZpdCBtb2RlbCBpbmNsdWRpbmcgdG90YWxfc2Vzc2lvbnMgLS0tCiAgbW9kIDwtIGxtKHJlZm9ybXVsYXRlKAogICAgYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiLCAidG90YWxfc2Vzc2lvbnMiKSwKICAgIG91dGNvbWUpLAogICAgZGF0YSA9IGRhdGEKICApCiAgCiAgIyAtLS0gVHlwZSBJSUkgQU5PVkEgKGFsbCBwcmVkaWN0b3JzKSAtLS0KICBhb3ZfdGJsIDwtIGNhcjo6QW5vdmEobW9kLCB0eXBlID0gMykgfD4gYXMuZGF0YS5mcmFtZSgpCiAgYW92X3RibCRTb3VyY2UgPC0gcm93bmFtZXMoYW92X3RibCkKICAKICAjIC0tLSBQYXJ0aWFsIM63wrIgKyA5NSUgQ0kgZm9yIGFsbCB0ZXJtcyAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkKICBhb3ZfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYW92X3RibCwgZXRhX3RibCwgYnkgPSBjKCJTb3VyY2UiID0gIlBhcmFtZXRlciIpKQogIAogICMgLS0tIFJvdW5kIGFuZCB0aWR5IC0tLQogIGFvdl90YmwgPC0gYW92X3RibCB8PgogICAgZHBseXI6Om11dGF0ZSgKICAgICAgRiA9IHJvdW5kKGBGIHZhbHVlYCwgMiksCiAgICAgIHAgPSBmb3JtYXRDKGBQcig+RilgLCBkaWdpdHMgPSAzLCBmb3JtYXQgPSAiZiIpLAogICAgICBgzrfCsuKCmmAgPSByb3VuZChFdGEyX3BhcnRpYWwsIDMpLAogICAgICBgOTUlIENJICjOt8Ky4oKaKWAgPSBpZmVsc2UoCiAgICAgICAgIWlzLm5hKENJX2xvdyksCiAgICAgICAgc3ByaW50ZigiWyUuM2YsICUuM2ZdIiwgQ0lfbG93LCBDSV9oaWdoKSwKICAgICAgICBOQQogICAgICApCiAgICApIHw+CiAgICBkcGx5cjo6c2VsZWN0KFNvdXJjZSwgRGYsIEYsIHAsIGDOt8Ky4oKaYCwgYDk1JSBDSSAozrfCsuKCmilgKSB8PgogICAgZHBseXI6OnJlbmFtZShkZiA9IERmKQogIAogICMgLS0tIEFkanVzdGVkIG1lYW5zIGZvciBjb25kaXRpb24gKGZhY3RvcikgLS0tCiAgZW1tIDwtIGVtbWVhbnM6OmVtbWVhbnMobW9kLCB+IGNvbmRpdGlvbikKICBhZGpfbWVhbnMgPC0gYXMuZGF0YS5mcmFtZShlbW0pCiAgYWRqX1dMIDwtIHJvdW5kKGFkal9tZWFucyRlbW1lYW5bYWRqX21lYW5zJGNvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCJdLCAyKQogIGFkal9QQiA8LSByb3VuZChhZGpfbWVhbnMkZW1tZWFuW2Fkal9tZWFucyRjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50Il0sIDIpCiAgCiAgIyAtLS0gQ29tYmluZSBhZGp1c3RlZCBtZWFucyArIHN1bW1hcnkgLS0tCiAgc3VtbWFyeV90YmwgPC0gdGliYmxlOjp0aWJibGUoCiAgICBPdXRjb21lID0gb3V0Y29tZSwKICAgIEFkak1lYW5fV0wgPSBhZGpfV0wsCiAgICBBZGpNZWFuX1BCID0gYWRqX1BCCiAgKQogIAogICMgLS0tIFByaW50IHRhYmxlcyAtLS0KICBjYXQoIlxuXG4jIyMgU2Vuc2l0aXZpdHkgQU5DT1ZBIChpbmNsdWRpbmcgdG90YWxfc2Vzc2lvbnMpIGZvciIsIG91dGNvbWUsICJcbiIpCiAgCiAgcHJpbnQoCiAgICBrbml0cjo6a2FibGUoCiAgICAgIGFvdl90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiQU5DT1ZBIChUeXBlIElJSSkgcmVzdWx0cyBpbmNsdWRpbmcgYWxsIGNvdmFyaWF0ZXMgZm9yIiwgb3V0Y29tZSksCiAgICAgIGFsaWduID0gImxycnJyciIsCiAgICAgIGRpZ2l0cyA9IDMKICAgICkgfD4ga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQogIAogIGNhdCgiXG5cbioqQWRqdXN0ZWQgTWVhbnMgKENvbmRpdGlvbiBPbmx5KSoqXG4iKQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBzdW1tYXJ5X3RibCwKICAgICAgYWxpZ24gPSBjKCJsIiwgInIiLCAiciIpLAogICAgICBkaWdpdHMgPSAyCiAgICApIHw+IGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQogICkKICAKICByZXR1cm4oYW92X3RibCkKfQoKIyAtLS0gUnVuIGFjcm9zcyBhbGwgb3V0Y29tZXMgLS0tCnJlc3VsdHNfc2Vuc2l0aXZpdHlfYWxsIDwtIGxhcHBseShwb3N0X3ZhcnMsIGZpdF9vbmVfc2Vuc19mdWxsLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCmBgYAoKCgpgYGB7cn0KbW9kX2ludCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKwogICAgICAgICAgICAgICAgY29uZGl0aW9uX251bSAqIHRvdGFsX3Nlc3Npb25zLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQpjYXI6OkFub3ZhKG1vZF9pbnQsIHR5cGUgPSAzKVsiY29uZGl0aW9uX251bTp0b3RhbF9zZXNzaW9ucyIsIF0KCm1vZF9pbnQgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBQcmVfREVSUzhfU3VtICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsKICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKY2FyOjpBbm92YShtb2RfaW50LCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCmBgYAoKCgoKYGBge3J9CmxpYnJhcnkoZW1tZWFucykKCmVtdHJlbmRzKG1vZF9pbnQsIH4gY29uZGl0aW9uX251bSwgdmFyID0gInRvdGFsX3Nlc3Npb25zIikKCmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChQdXJyYmxlX01hc3Rlcl9XaWRlLCBhZXMoeCA9IHRvdGFsX3Nlc3Npb25zLCB5ID0gUG9zdF9ERVJTOF9TdW0sIGNvbG9yID0gYXMuZmFjdG9yKGNvbmRpdGlvbl9udW0pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicyhjb2xvciA9ICJDb25kaXRpb24iLCB4ID0gIlRvdGFsIFNlc3Npb25zIENvbXBsZXRlZCIsIHkgPSAiUG9zdCBERVJTLTgiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgojIFNlbGYtSGFybSBBbmFseXNlcwoKIyMgRnJlcXVlbmNpZXMgYnkgQ29uZGl0aW9uIGFuZCBSZXNwb25zZSBvdmVyIFRpbWUKQmVsb3csIHdlIGRpc3BsYXkgYSB0YWJsZSBhbmQgZ3JhcGggb2YgdGhlIGZyZXF1ZW5jeSBvZiByZXNwb25zZXMgZm9yIGFsbCBzZWxmLWhhcm0gcXVlc3Rpb25zLCB0aGUgZnJlcXVlbmN5IG9mIGZsYWdnZWQgcmVzcG9uc2VzIHRvIGVhY2ggc2VsZi1oYXJtIHF1ZXN0aW9uIG92ZXIgdGltZSwgYW5kIHRoZSBmcmVxdWVuY3kgb2YgZmxhZ2dlZCByZXNwb25zZXMgdG8gZWFjaCBzZWxmLWhhcm0gcXVlc3Rpb24gb3ZlciB0aW1lLCBzZXBhcmF0ZWQgYnkgY29uZGl0aW9uLgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0KQoKc2hxX3N1bW1hcnkgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgZ3JvdXBfYnkoV2VlaykgJT4lCiAgc3VtbWFyaXNlKAogICAgTl9TSFExID0gc3VtKCFpcy5uYShTSFExKSksCiAgICBOX1NIUTIgPSBzdW0oIWlzLm5hKFNIUTIpKSwKICAgIE5fU0hRMyA9IHN1bSghaXMubmEoU0hRMykpCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgUmVtb3ZlIHdlZWsgMCBhbmQgTkEgdmFsdWVzCnNocV9zdW1tYXJ5X2NsZWFuIDwtIHNocV9zdW1tYXJ5ICU+JQogIGZpbHRlcighaXMubmEoV2VlaykgJiBXZWVrICE9IDApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggZm9yIFJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdChzaHFfc3VtbWFyeV9jbGVhbiwgYWVzKHggPSBXZWVrKSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMSwgY29sb3IgPSAiU0hRMSIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMiwgY29sb3IgPSAiU0hRMiIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMywgY29sb3IgPSAiU0hRMyIpLCBzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNwb25zZSBSYXRlIE92ZXIgVGltZSBmb3IgU0hRIFZhcmlhYmxlcyIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJOdW1iZXIgb2YgTm9uLU1pc3NpbmcgUmVzcG9uc2VzIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX3N1bW1hcnlfY2xlYW4kV2VlaykpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU0hRMSIgPSAiYmx1ZSIsICJTSFEyIiA9ICJyZWQiLCAiU0hRMyIgPSAiZ3JlZW4iKSkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGlzcGxheSBUYWJsZTogUmVzcG9uc2UgQ291bnRzIE92ZXIgVGltZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfc3VtbWFyeV9jbGVhbiAlPiUKICBndCgpICU+JQogIGd0Ojp0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIFJlc3BvbnNlcyBmb3IgU2VsZi1IYXJtIFF1ZXN0aW9ucyBPdmVyIFRpbWUiCiAgKQpgYGAKCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgojIFJlc2hhcGUgaW50byBsb25nIGZvcm1hdApzaHFfbG9uZyA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBzZWxlY3QoV2VlaywgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSkpCgojIENvdW50IGhvdyBtYW55IHNlbGVjdGVkIGVhY2ggY2F0ZWdvcnkgKDAgb3IgMSkgcGVyIFNIUSB2YXJpYWJsZSBwZXIgd2VlawpzaHFfY291bnRzIDwtIHNocV9sb25nICU+JQogIGdyb3VwX2J5KFdlZWssIFNIUV9WYXIsIFJlc3BvbnNlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBvZiAxIChmbGFnZ2VkKSByZXNwb25zZSBvdmVyIHRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KAogIHNocV9jb3VudHMgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgRmxhZ2dlZCBTSFEgUmVzcG9uc2VzIE92ZXIgVGltZSAoUmVzcG9uc2UgPSAxKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJDb3VudCBvZiBSZXNwb25zZSA9IDEiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfY291bnRzJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfY291bnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJDb3VudHMgb2YgU0hRIFJlc3BvbnNlcyAoMCB2cy4gMSkgYnkgV2VlayBhbmQgVmFyaWFibGUiKQoKIyBSZXNoYXBlIGludG8gbG9uZyBmb3JtYXQgYW5kIGluY2x1ZGUgY29uZGl0aW9uCnNocV9sb25nX2dyb3VwZWQgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgc2VsZWN0KHBzaWQsIFdlZWssIGNvbmRpdGlvbiwgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pKQoKIyBDb3VudCBob3cgbWFueSBzZWxlY3RlZCBlYWNoIGNhdGVnb3J5ICgwIG9yIDEpIHBlciBTSFEgdmFyaWFibGUsIHBlciB3ZWVrLCBwZXIgZ3JvdXAKc2hxX2NvdW50c19ncm91cGVkIDwtIHNocV9sb25nX2dyb3VwZWQgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uLCBTSFFfVmFyLCBSZXNwb25zZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggb2YgMSAoZmxhZ2dlZCkgcmVzcG9uc2Ugb3ZlciB0aW1lIGJ5IGdyb3VwCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdCgKICBzaHFfY291bnRzX2dyb3VwZWQgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGZhY2V0X3dyYXAofiBjb25kaXRpb24pICsKICBsYWJzKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIEZsYWdnZWQgU0hRIFJlc3BvbnNlcyBPdmVyIFRpbWUgKFJlc3BvbnNlID0gMSkiLAogICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBDb25kaXRpb24iLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiQ291bnQgb2YgUmVzcG9uc2UgPSAxIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX2NvdW50c19ncm91cGVkJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUSwgYnkgR3JvdXAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2hxX2NvdW50c19ncm91cGVkICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBTSFFfVmFyLCBXZWVrKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiQ291bnRzIG9mIFNIUSBSZXNwb25zZXMgKDAgdnMuIDEpIGJ5IFdlZWssIFZhcmlhYmxlLCBhbmQgR3JvdXAiKQoKCgojIyBTZWxmLUhhcm0gTG9naXN0aWMgUmVncmVzc2lvbgpQb3N0LXRlc3QgTG9naXN0aWMgUmVncmVzc2lvbiB0byBJbnZlc3RpZ2F0ZSBJbnRlcnZlbnRpb24gRWZmZWN0cyBvbiBTZWxmLUhhcm0gT3V0Y29tZXMKKlJlc3VsdDoqIENvbmRpdGlvbiB3YXMgbm90IGEgc2lnbmlmaWNhbnQgcHJlZGljdG9yIG9mIGFueSBzZWxmLWhhcm0gb3V0Y29tZSAoY29kZWQgYmluYXJ5KS4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KSAgIApsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGd0c3VtbWFyeSkKCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIGZpbHRlcihwc2lkICE9ICJDNzIiKSAlPiUKICBtdXRhdGUoCiAgICAjIElmIG1pc3NpbmcsIHRoZW4gTkEuIElmIDw9IDEgdGhlbiAwLCBlbHNlIDEKICAgIFNIUTEgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIxKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjEgPD0gMSwgMCwgMSkpLAogICAgU0hRMiA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjIpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMiA8PSAxLCAwLCAxKSksCiAgICBTSFEzID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMyksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIzIDw9IDEsIDAsIDEpKQogICkgJT4lCiAgbXV0YXRlKAogICAgIyBJZiBhbnkgb2YgU0hRMSwgU0hRMiwgb3IgU0hRMyBpcyBtaXNzaW5nLCBTSFFfQW55IGlzIG1pc3NpbmcuCiAgICAjIElmIGFsbCB0aHJlZSBhcmUgMCwgU0hRX0FueSBpcyAwLCBlbHNlIDEuCiAgICBTSFFfQW55ID0gY2FzZV93aGVuKAogICAgICBpcy5uYShTSFExKSB8IGlzLm5hKFNIUTIpIHwgaXMubmEoU0hRMykgfiBOQV9yZWFsXywKICAgICAgU0hRMSA9PSAwICYgU0hRMiA9PSAwICYgU0hRMyA9PSAwIH4gMCwKICAgICAgVFJVRSB+IDEKICAgICkKICApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDEpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTEgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMSBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTEgPC0gZ2xtKAogIFNIUTFfMTIgfiBjb25kaXRpb24gKyBTSFExXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMikgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMiBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEyIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMiA8LSBnbG0oCiAgU0hRMl8xMiB+IGNvbmRpdGlvbiArIFNIUTJfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAzKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFEzIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTMgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHEzIDwtIGdsbSgKICBTSFEzXzEyIH4gY29uZGl0aW9uICsgU0hRM18yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDQpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUV9BbnkgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRX0FueSBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocUFueSA8LSBnbG0oCiAgU0hRX0FueV8xMiB+IGNvbmRpdGlvbiArIFNIUV9BbnlfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIyBDcmVhdGUgZ3RzdW1tYXJ5IHRhYmxlcyBmb3IgZWFjaCBtb2RlbCwgZXhwb25lbnRpYXRpbmcgZm9yIE9SCnRibF9zaHExICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHEyICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMiwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHEzICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMywgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHFBbnkgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxQW55LCBleHBvbmVudGlhdGUgPSBUUlVFKSAlPiUKICBib2xkX2xhYmVscygpICU+JQogIGFkZF9zaWduaWZpY2FuY2Vfc3RhcnMoKQoKbWVyZ2VkX3RibCA8LSB0YmxfbWVyZ2UoCiAgIHRibHMgPSBsaXN0KHRibF9zaHExLCB0Ymxfc2hxMiwgdGJsX3NocTMsIHRibF9zaHFBbnkpLAogICB0YWJfc3Bhbm5lciA9IGMoIlNIUTEgTW9kZWwiLCAiU0hRMiBNb2RlbCIsICJTSFEzIE1vZGVsIiwgIlNIUV9BbnkgTW9kZWwiKQogKQogbWVyZ2VkX3RibApgYGAKCiMjIFNlbGYtSGFybSBQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uCkZyZXF1ZW5jaWVzIFRhYmxlcwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgRGVmaW5lIHRoZSBzaXggb3JkZXJlZOKAkGZhY3RvciB2YXJpYWJsZXMgKHdlZWtzIDEgYW5kIDEyIGZvciBzY3JlZW5lcnMgMeKAkzMpCnNjcmVlbmVyX3ZhcnMgPC0gYygKICAic2hxc2NyZWVuZXIxX3cxIiwgICJzaHFzY3JlZW5lcjFfdzEyIiwKICAic2hxc2NyZWVuZXIyX3cxIiwgICJzaHFzY3JlZW5lcjJfdzEyIiwKICAic2hxc2NyZWVuZXIzX3cxIiwgICJzaHFzY3JlZW5lcjNfdzEyIgopCgojIExvb3Agb3ZlciBlYWNoIHZhcmlhYmxlIGFuZCBwcmludCBhIGZyZXF1ZW5jeSB0YWJsZSAoY291bnQgKyBwZXJjZW50KQpmb3IgKHZhciBpbiBzY3JlZW5lcl92YXJzKSB7CiAgZnJlcV90YmwgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICAgIGZpbHRlcighaXMubmEoLmRhdGFbW3Zhcl1dKSkgJT4lIAogICAgY291bnQocmVzcG9uc2UgPSAuZGF0YVtbdmFyXV0pICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCAxKSkKICAKICBjYXQoIlxuXG4qKkZyZXF1ZW5jaWVzIGZvciIsIHZhciwgIioqXG4iKQogIHByaW50KGthYmxlKGZyZXFfdGJsLCBjb2wubmFtZXMgPSBjKCJSZXNwb25zZSIsICJDb3VudCIsICJQZXJjZW50IiksIGRpZ2l0cyA9IDEpKQp9CmBgYAoKCiMjIyBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHM6IEJyYW50IFRlc3RzCkFsbCBzaXggQnJhbnQgdGVzdHMgKG9uZSBmb3IgZWFjaCBzY3JlZW5lciBhdCBXZWVrIDEgYW5kIFdlZWsgMTIpIHByb2R1Y2VkIG5vbuKAkHNpZ25pZmljYW50IHDigJB2YWx1ZXMsIGluZGljYXRpbmcgdGhhdCB0aGUgcHJvcG9ydGlvbmFs4oCQb2RkcyAocGFyYWxsZWwgcmVncmVzc2lvbikgYXNzdW1wdGlvbiBob2xkcyBpbiBldmVyeSBjYXNlLgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShrbml0cikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KGJyYW50KQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHMgJiBCcmFudCBUZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBTY3JlZW5lciAxOiBXZWVrIDEKbW9kZWxfczFfdzEgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczFfdzEgPC0gYnJhbnQobW9kZWxfczFfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAxIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zMV93MSkKCiMgU2NyZWVuZXIgMTogV2VlayAxMgptb2RlbF9zMV93MTIgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MxX3cxMiA8LSBicmFudChtb2RlbF9zMV93MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAxIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczFfdzEyKQoKIyBTY3JlZW5lciAyOiBXZWVrIDEKbW9kZWxfczJfdzEgPC0gcG9scihzaHFzY3JlZW5lcjJfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczJfdzEgPC0gYnJhbnQobW9kZWxfczJfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAyIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zMl93MSkKCiMgU2NyZWVuZXIgMjogV2VlayAxMgptb2RlbF9zMl93MTIgPC0gcG9scihzaHFzY3JlZW5lcjJfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MyX3cxMiA8LSBicmFudChtb2RlbF9zMl93MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAyIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczJfdzEyKQoKIyBTY3JlZW5lciAzOiBXZWVrIDEKbW9kZWxfczNfdzEgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczNfdzEgPC0gYnJhbnQobW9kZWxfczNfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAzIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zM193MSkKCiMgU2NyZWVuZXIgMzogV2VlayAxMgptb2RlbF9zM193MTIgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MzX3cxMiA8LSBicmFudChtb2RlbF9zM193MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAzIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczNfdzEyKQpgYGAKCgpObyBzaWduaWZpY2FudCByZXN1bHRzIG9mIFB1cnJibGUgb24gc2VsZi1oYXJtIHVzaW5nIHByb3BydGlvbmFsIG9kZHMgKG9yZGluYWwgZGF0YSB0aGF0IG1haW50YWlucyBmcmVxdWVuY3kpCmBgYHtyfQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCgojIENvbnZlcnQgb3V0Y29tZXMgdG8gb3JkZXJlZCBmYWN0b3JzIChhZGp1c3QgdGhlIGxldmVscyBpZiBuZWVkZWQpClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoCiAgICBzaHFzY3JlZW5lcjFfdzEgID0gZmFjdG9yKHNocXNjcmVlbmVyMV93MSwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIyX3cxICA9IGZhY3RvcihzaHFzY3JlZW5lcjJfdzEsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyM193MSAgPSBmYWN0b3Ioc2hxc2NyZWVuZXIzX3cxLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjFfdzEyID0gZmFjdG9yKHNocXNjcmVlbmVyMV93MTIsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyMl93MTIgPSBmYWN0b3Ioc2hxc2NyZWVuZXIyX3cxMiwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIzX3cxMiA9IGZhY3RvcihzaHFzY3JlZW5lcjNfdzEyLCBvcmRlcmVkID0gVFJVRSkKICApCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEZpdCBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHMgZm9yIFdlZWsgMTIgb3V0Y29tZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBmb3IgU2NyZWVuZXIgMSBjb250cm9sbGluZyBmb3IgY29uZGl0aW9uLCBhZ2UsIGFuZCBiYXNlbGluZSAodzEpCm1vZGVsX3MxIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArIHNocXNjcmVlbmVyMV93MSwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyBNb2RlbCBmb3IgU2NyZWVuZXIgMgptb2RlbF9zMiA8LSBwb2xyKHNocXNjcmVlbmVyMl93MTIgfiBjb25kaXRpb24gKyBhZ2UgKyBpZGVudGl0eV9ncm91cF9udW0gKyAgc2hxc2NyZWVuZXIyX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIE1vZGVsIGZvciBTY3JlZW5lciAzCm1vZGVsX3MzIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArIHNocXNjcmVlbmVyM193MSwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDcmVhdGUgYSBDb21iaW5lZCBUYWJsZSBvZiBSZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRpZHlfczEgPC0gdGlkeShtb2RlbF9zMSkgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAxIikKdGlkeV9zMiA8LSB0aWR5KG1vZGVsX3MyKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDIiKQp0aWR5X3MzIDwtIHRpZHkobW9kZWxfczMpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMyIpCgojIENvbWJpbmUgdGhlIHJlc3VsdHMKcmVzdWx0cyA8LSBiaW5kX3Jvd3ModGlkeV9zMSwgdGlkeV9zMiwgdGlkeV9zMykKCmxpYnJhcnkoZHBseXIpCnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUKICBtdXRhdGUoCiAgICBvZGRzX3JhdGlvID0gZXhwKGVzdGltYXRlKSwKICAgIHAudmFsdWUgPSAyICogcG5vcm0oLWFicyhzdGF0aXN0aWMpKQogICkgJT4lCiAgZHBseXI6OnNlbGVjdChNb2RlbCwgdGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvciwgb2Rkc19yYXRpbywgc3RhdGlzdGljLCBwLnZhbHVlKQoKIyBQcmludCB0aGUgdGFibGUKa2FibGUocmVzdWx0cywgZGlnaXRzID0gMywgY2FwdGlvbiA9ICJQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uIFJlc3VsdHMgQ29udHJvbGxpbmcgZm9yIEFnZSBhbmQgQmFzZWxpbmUgUmVzcG9uc2UgKFdlZWsgMSkiKQoKYGBgCgoKIyBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsczogTWl4ZWQgRWZmZWN0cyBNb2RlbHMKVG8gZXZhbHVhdGUgaG93IG91dGNvbWVzIGNoYW5nZWQgb3ZlciB0aW1lIGFuZCB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgZGlmZmVyZWQgYnkgY29uZGl0aW9uLCB3ZSBmaXQgbWl4ZWQtZWZmZWN0cyBtb2RlbHMgZm9yIGVhY2ggb2Ygb3VyIHByaW1hcnkgb3V0Y29tZSB2YXJpYWJsZXMuIFRoZXNlIG1vZGVscyBhY2NvdW50IGZvciBib3RoIHdpdGhpbi1wZXJzb24gY2hhbmdlIGFuZCBiZXR3ZWVuLXBlcnNvbiBkaWZmZXJlbmNlcy4KCkZvciBlYWNoIG91dGNvbWVtIHdlIHJhbiBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIHVzaW5nIHRoZSBsbWVyKCkgZnVuY3Rpb24uCgpUaGUgbW9kZWxzIHRlc3RlZDoKICBNYWluIGVmZmVjdHMgb2YgV2VlayAodGltZSksIGNvbmRpdGlvbiwgYW5kIHRoZWlyIGludGVyYWN0aW9uCiAgQ292YXJpYXRlczogaWRlbnRpdHkgZ3JvdXAgYW5kIGFnZQogIEEgcmFuZG9tIGludGVyY2VwdCBhbmQgc2xvcGUgZm9yIGVhY2ggcGFydGljaXBhbnQgKChXZWVrICYgcHNpZCkpLCBhbGxvd2luZyBlYWNoIHBlcnNvbiB0byBoYXZlIHRoZWlyIG93biBiYXNlbGluZSBhbmQgcmF0ZSBvZiBjaGFuZ2Ugb3ZlciB0aW1lCiAgCiAgRW1vdGlvbiBSZWcgd2FzIHNpZ25pZmljYW50CiAgRGVwcmVzc2lvbiBzaWduaWZpY2FudAogIEFueGlldHkgbm90IHNpZ25pZmljYW50IChjbG9zZSB0byBtYXJnaW5hbCBwPS4xMS0gbW9yZSBldmlkZW5jZSBvZiB1bnN0YWJsZSBlZmZlY3QpCiAgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShwZXJmb3JtYW5jZSkgICMgRm9yIHIyKCkKCiMgRGVmaW5lIHRoZSB2ZWN0b3Igb2Ygb3V0Y29tZXMgKGFzIHRoZXkgYXBwZWFyIGluIHRoZSBsb25nIGRhdGFzZXQpCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJHQUQ3X1N1bSIsICJQSFE5X1N1bSIpCgojIEluaXRpYWxpemUgYSBsaXN0IHRvIHN0b3JlIG1vZGVsIHN1bW1hcmllcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFuZCBlZmZlY3Qgc2l6ZXMKcmVzdWx0c19saXN0IDwtIGxpc3QoKQoKIyBMb29wIG92ZXIgZWFjaCBvdXRjb21lIGFuZCBmaXQgdGhlIG1peGVkLWVmZmVjdHMgbW9kZWwgY29udHJvbGxpbmcgZm9yIGlkZW50aXR5X2dyb3VwX251bSBhbmQgYWdlCmZvciAob3V0Y29tZSBpbiBvdXRjb21lcykgewogIG1vZGVsIDwtIGxtZXIoYXMuZm9ybXVsYShwYXN0ZShvdXRjb21lLCAifiBXZWVrICogY29uZGl0aW9uICsgaWRlbnRpdHlfZ3JvdXAgKyBhZ2UgKyAoV2VlayB8IHBzaWQpIikpLAogICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTG9uZ19NYXN0ZXIpCiAgCiAgIyBUaWR5IHRoZSBmaXhlZCBlZmZlY3RzIGVzdGltYXRlcwogIHRpZHlfbW9kZWwgPC0gdGlkeShtb2RlbCkKICAKICAjIE9idGFpbiA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGZpeGVkIGVmZmVjdHMgdXNpbmcgdGhlIFdhbGQgbWV0aG9kCiAgY2lfbW9kZWwgPC0gY29uZmludChtb2RlbCwgbWV0aG9kID0gIldhbGQiLCBsZXZlbCA9IDAuOTUpCiAgY2lfZGYgPC0gYXMuZGF0YS5mcmFtZShjaV9tb2RlbCkKICBjaV9kZiR0ZXJtIDwtIHJvd25hbWVzKGNpX2RmKQogIAogICMgTWVyZ2UgdGhlIHRpZHkgb3V0cHV0IHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMKICB0aWR5X21vZGVsIDwtIGxlZnRfam9pbih0aWR5X21vZGVsLCBjaV9kZiwgYnkgPSAidGVybSIpCiAgCiAgIyBDYWxjdWxhdGUgbWFyZ2luYWwgYW5kIGNvbmRpdGlvbmFsIFLCsiBhcyBlZmZlY3Qgc2l6ZXMKICByMl92YWxzIDwtIHIyKG1vZGVsKQogIAogICMgU3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGxpc3QKICByZXN1bHRzX2xpc3RbW291dGNvbWVdXSA8LSBsaXN0KAogICAgbW9kZWxfc3VtbWFyeSA9IHRpZHlfbW9kZWwsCiAgICByMiA9IHIyX3ZhbHMKICApCn0KCiMgTm93LCBmb3IgZGVtb25zdHJhdGlvbiwgbGV0J3MgcHJpbnQgdGhlIHN1bW1hcnkgZm9yIG9uZSBvdXRjb21lIChlLmcuLCBERVJTOF9TdW0pCnByaW50KGthYmxlKHJlc3VsdHNfbGlzdFtbIkRFUlM4X1N1bSJdXVtbIm1vZGVsX3N1bW1hcnkiXV0sIAogICAgICAgICAgICBjYXB0aW9uID0gIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIERFUlM4X1N1bSB3aXRoIDk1JSBDSSIsIAogICAgICAgICAgICBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQpjYXQoIlxuIikKcHJpbnQocmVzdWx0c19saXN0W1siREVSUzhfU3VtIl1dW1sicjIiXV0pCgpmb3IgKG91dGNvbWUgaW4gbmFtZXMocmVzdWx0c19saXN0KSkgewogICMgQ3JlYXRlIGEgY2FwdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBvdXRjb21lIG5hbWUKICBjYXB0aW9uX3RleHQgPC0gcGFzdGUoIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIiwgb3V0Y29tZSwgIndpdGggOTUlIENJIikKICAKICAjIFByaW50IHRoZSBtb2RlbCBzdW1tYXJ5IHdpdGggYSBjYXB0aW9uIGFuZCBmb3JtYXR0ZWQgdGFibGUKICBwcmludChrYWJsZShyZXN1bHRzX2xpc3RbW291dGNvbWVdXVtbIm1vZGVsX3N1bW1hcnkiXV0sIAogICAgICAgICAgICAgIGNhcHRpb24gPSBjYXB0aW9uX3RleHQsIAogICAgICAgICAgICAgIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkpCiAgY2F0KCJcbiIpCiAgCiAgIyBQcmludCB0aGUgY29ycmVzcG9uZGluZyBSwrIgdmFsdWUocykKICBwcmludChyZXN1bHRzX2xpc3RbW291dGNvbWVdXVtbInIyIl1dKQogIGNhdCgiXG5cbiIpICAjIGV4dHJhIHNwYWNpbmcgYmV0d2VlbiBvdXRjb21lcwp9CgpgYGAKIyMjIE5ldyBBbmFseXNlczogRW5nYWdlbWVudAoKVFdFRVRTCgoqKk1ldGhvZHMgVGV4dDoqKiBQZXJjZWl2ZWQgZW5nYWdlbWVudCB3aXRoIHRoZSBpbnRlcnZlbnRpb24gd2FzIGFzc2Vzc2VkIHdlZWtseSB1c2luZyBhbiBhdmVyYWdlZCBjb21wb3NpdGUgbWVhc3VyZSAoVHdlZXRzX0F2ZykgdGhhdCByZWZsZWN0ZWQgaG93IHdlbGwgcGFydGljaXBhbnRzIGZlbHQgdGhlIGludGVydmVudGlvbiBmaXQgdGhlaXIgbmVlZHMgYW5kIGdvYWxzLiBUbyBleGFtaW5lIGNoYW5nZXMgaW4gZW5nYWdlbWVudCBxdWFsaXR5IG92ZXIgdGltZSwgd2UgZml0IGEgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdXNpbmcgcmVzdHJpY3RlZCBtYXhpbXVtIGxpa2VsaWhvb2QgKFJFTUwpLiBXZWVrIHdhcyBpbmNsdWRlZCBhcyBhIGZpeGVkIGVmZmVjdCB0byBtb2RlbCBsaW5lYXIgY2hhbmdlLCBhbmQgcGFydGljaXBhbnQgSUQgKHBzaWQpIHdhcyBpbmNsdWRlZCBhcyBhIHJhbmRvbSBpbnRlcmNlcHQgdG8gYWNjb3VudCBmb3IgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbiBiYXNlbGluZSBlbmdhZ2VtZW50IHBlcmNlcHRpb25zLiBUaGlzIG1vZGVsIHN0cnVjdHVyZSBhbGxvd2VkIHVzIHRvIGVzdGltYXRlIG92ZXJhbGwgdHJhamVjdG9yaWVzIG9mIHBlcmNlaXZlZCBlbmdhZ2VtZW50IHdoaWxlIGFjY29tbW9kYXRpbmcgcmVwZWF0ZWQgbWVhc3VyZXMgd2l0aGluIHBhcnRpY2lwYW50cy4gQW5hbHlzZXMgd2VyZSBjb25kdWN0ZWQgaW4gUiB1c2luZyB0aGUgbG1lNCBhbmQgbG1lclRlc3QgcGFja2FnZXMsIHdpdGggZGVncmVlcyBvZiBmcmVlZG9tIGVzdGltYXRlZCB1c2luZyBTYXR0ZXJ0aHdhaXRl4oCZcyBtZXRob2QuCgoqKlJlc3VsdHMgVGV4dDoqKiBUaGUgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgcmV2ZWFsZWQgYSBzaWduaWZpY2FudCBkZWNsaW5lIGluIHBlcmNlaXZlZCBlbmdhZ2VtZW50IGFjcm9zcyB0aGUgaW50ZXJ2ZW50aW9uIHBlcmlvZCAoYiA9IOKIkjAuMDQsIFNFID0gMC4wMDYsIHQoNTMxKSA9IOKIkjYuNjEsIHAgPCAuMDAxKS4gCgpgYGB7cn0KCnR3ZWV0c19kZXNjX2xvbmcgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBmaWx0ZXIoV2VlayA+PSA0KSAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gc3VtKCFpcy5uYShUd2VldHNfQXZnKSksCiAgICBtZWFuID0gbWVhbihUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgPSBzZChUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpLAogICAgc2UgPSBzZCAvIHNxcnQobiksCiAgICBtaW4gPSBtaW4oVHdlZXRzX0F2ZywgbmEucm0gPSBUUlVFKSwKICAgIG1heCA9IG1heChUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUKICBhcnJhbmdlKFdlZWspCgp0d2VldHNfZGVzY19sb25nCgpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobG1lclRlc3QpCgp0d2VldHNfbW9kZWwgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBmaWx0ZXIoV2VlayA+PSA0LCAhaXMubmEoVHdlZXRzX0F2ZykpICU+JQogIGxtZXIoVHdlZXRzX0F2ZyB+IFdlZWsgKyAoMSB8IHBzaWQpLCBkYXRhID0gLikKCnN1bW1hcnkodHdlZXRzX21vZGVsKQoKZ2dwbG90KHR3ZWV0c19kZXNjLCBhZXMoeCA9IFdlZWssIHkgPSBtZWFuKSkgKwogIGdlb21fbGluZShzaXplID0gMSwgY29sb3IgPSAiIzMzNjY5OSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICIjMzM2Njk5IikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuIC0gc2UsIHltYXggPSBtZWFuICsgc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIGNvbG9yID0gIiMzMzY2OTkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKyAgIyA8LS0gc2V0cyB5LWF4aXMgMOKAkzQKICBsYWJzKAogICAgdGl0bGUgPSAiQXZlcmFnZSBFbmdhZ2VtZW50IChUV0VFVFMpIE92ZXIgVGltZSAoV2Vla3MgNOKAkzEzKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJNZWFuIFRXRUVUUyBTY29yZSAoMOKAkzQpIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpCgoKYGBgCiMjIyMgTW9kZXJhdGlvbiBvZiBHZW5kZXIgSWRlbnRpdHkgd2l0aCBUV0VFVFMKCioqUmVzdWx0cyBUZXh0OioqIFRvIGV4cGxvcmUgd2hldGhlciBwZXJjZWl2ZWQgZW5nYWdlbWVudCB0cmFqZWN0b3JpZXMgZGlmZmVyZWQgYnkgZ2VuZGVyIGlkZW50aXR5LCB3ZSBleHRlbmRlZCB0aGUgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdG8gaW5jbHVkZSBnZW5kZXIgaWRlbnRpdHkgKFRHRCB2cy4gY2lzZ2VuZGVyKSBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggV2Vlay4gVGhpcyBhbGxvd2VkIHVzIHRvIHRlc3QgYm90aCBiYXNlbGluZSBkaWZmZXJlbmNlcyBpbiBwZXJjZWl2ZWQgZml0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgcmF0ZSBvZiBjaGFuZ2Ugb3ZlciB0aW1lLgpUaGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGluaXRpYWwgcGVyY2VwdGlvbnMgb2YgaW50ZXJ2ZW50aW9uIGZpdCBieSBnZW5kZXIgaWRlbnRpdHkgKGIgPSDiiJIwLjA2LCBTRSA9IDAuMTAsIHQoMTMwKSA9IOKIkjAuNjIsIHAgPSAuNTQpLiBIb3dldmVyLCBhIHNpZ25pZmljYW50IFdlZWsgw5cgR2VuZGVyIElkZW50aXR5IGludGVyYWN0aW9uIGVtZXJnZWQgKGIgPSAwLjAxNywgU0UgPSAwLjAwNiwgdCg1MzEpID0gMi45MywgcCA9IC4wMDM1KS4KU2ltcGxlIHNsb3BlcyBpbmRpY2F0ZWQgdGhhdCBib3RoIGdyb3VwcyBleHBlcmllbmNlZCBhIGRlY2xpbmUgaW4gZW5nYWdlbWVudCBvdmVyIHRpbWUsIGJ1dCB0aGUgZGVjbGluZSB3YXMgc3RlZXBlciBhbW9uZyBUR0QgcGFydGljaXBhbnRzIChiID0g4oiSMC4wNTYsIDk1JSBDSSBb4oiSMC4wNzMsIOKIkjAuMDQwXSkgdGhhbiBhbW9uZyBjaXNnZW5kZXIgcGFydGljaXBhbnRzIChiID0g4oiSMC4wMjIsIDk1JSBDSSBb4oiSMC4wMzgsIOKIkjAuMDA1XSkuCgoKYGBge3J9CnR3ZWV0c19wYiA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGZpbHRlcihXZWVrID49IDQsICFpcy5uYShUd2VldHNfQXZnKSwgIWlzLm5hKGlkZW50aXR5X2dyb3VwKSkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCnR3ZWV0c19tb2RlbF9pZCA8LSBsbWVyKAogIFR3ZWV0c19BdmcgfiBXZWVrICogaWRlbnRpdHlfZ3JvdXAgKyAoMSB8IHBzaWQpLAogIGRhdGEgPSB0d2VldHNfcGIKKQoKc3VtbWFyeSh0d2VldHNfbW9kZWxfaWQpCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZW1tZWFucykKCiMgQ29tcHV0ZSBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMgb3ZlciBXZWVrIGJ5IGlkZW50aXR5IGdyb3VwCmVtbV90d2VldHMgPC0gZW1tZWFucyh0d2VldHNfbW9kZWxfaWQsIH4gV2VlayAqIGlkZW50aXR5X2dyb3VwKQoKIyBQbG90IHByZWRpY3RlZCBsaW5lcyBmb3IgZWFjaCBncm91cAplbW1pcCh0d2VldHNfbW9kZWxfaWQsIGlkZW50aXR5X2dyb3VwIH4gV2VlaywKICAgICAgQ0lzID0gVFJVRSwKICAgICAgY292LnJlZHVjZSA9IHJhbmdlKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFbmdhZ2VtZW50IChUV0VFVFMpIE92ZXIgVGltZSBieSBHZW5kZXIgSWRlbnRpdHkiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiUHJlZGljdGVkIFRXRUVUUyBTY29yZSAoMOKAkzQpIiwKICAgIGNvbG9yID0gIkdlbmRlciBJZGVudGl0eSIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KQoKIyBTaW1wbGUgc2xvcGVzIGZvciBXZWVrIGF0IGVhY2ggaWRlbnRpdHkgZ3JvdXAKZW10cmVuZHModHdlZXRzX21vZGVsX2lkLCBwYWlyd2lzZSB+IGlkZW50aXR5X2dyb3VwLCB2YXIgPSAiV2VlayIpCgpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ2dwbG90MikKCiMgTWFrZSBzdXJlIFdlZWsgaXMgbnVtZXJpYyBpbiB0aGUgbW9kZWwgZGF0YQp0d2VldHNfcGIkV2VlayA8LSBhcy5udW1lcmljKHR3ZWV0c19wYiRXZWVrKQoKIyBHZXQgZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zIGFjcm9zcyB0aGUgb2JzZXJ2ZWQgd2VlayByYW5nZQplbW1fdHdlZXRzIDwtIGVtbWVhbnMoCiAgdHdlZXRzX21vZGVsX2lkLAogIH4gV2VlayAqIGlkZW50aXR5X2dyb3VwLAogIGF0ID0gbGlzdChXZWVrID0gc2VxKDQsIDEzLCAxKSkgICMgZXhwbGljaXRseSBzZXQgd2VlayBwb2ludHMgNOKAkzEzCikKCmVtbV9kZiA8LSBhcy5kYXRhLmZyYW1lKGVtbV90d2VldHMpCgojIE5vdyBwbG90CmdncGxvdChlbW1fZGYsIGFlcyh4ID0gV2VlaywgeSA9IGVtbWVhbiwgY29sb3IgPSBpZGVudGl0eV9ncm91cCwgZmlsbCA9IGlkZW50aXR5X2dyb3VwKSkgKwogIGdlb21fbGluZShzaXplID0gMS4zKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwgYWxwaGEgPSAwLjE1LCBjb2xvciA9IE5BKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSA0OjEzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMzMzY2OTkiLCAiI0NDMzM2NiIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzMzNjY5OSIsICIjQ0MzMzY2IikpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRW5nYWdlbWVudCAoVFdFRVRTKSBPdmVyIFRpbWUgYnkgR2VuZGVyIElkZW50aXR5IiwKICAgIHN1YnRpdGxlID0gIlByZWRpY3RlZCBNYXJnaW5hbCBNZWFucyB3aXRoIDk1JSBDb25maWRlbmNlIEludGVydmFscyAoV2Vla3MgNOKAkzEzKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJQcmVkaWN0ZWQgVFdFRVRTIFNjb3JlICgw4oCTNCkiLAogICAgY29sb3IgPSAiR2VuZGVyIElkZW50aXR5IiwKICAgIGZpbGwgPSAiR2VuZGVyIElkZW50aXR5IgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQogICkKYGBgCg==