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 on February 18-19 by Aubrey Rhodes. We use the “final” datasets in which we removed participant C72, who had no information on gender identity.

Descriptive Analyses

Sample Characteristics

These tables report the count of participants by condition, identity group, and by condition x identity group.

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 TGD
Purrble Treatment 39 37
Waitlist Control 37 40

Age: Descriptives and Check for Baseline differences

Summarizes age (Mean, SD, Min, Max) by condition and runs a t-test comparing age by condition.

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

condition

Mean

SD

Min

Max

Purrble Treatment

20.44

2.29

16.00

25.00

Waitlist Control

20.09

2.46

16.00

25.00

Dependent Variable

t

df

p

d

95% CI

age

0.92

151.17

.361

0.15

[-0.17, 0.46]

Race, Nationality, and Sexual Orientation

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%)

Sexual Orientation- Not simplified

Table: Sexual Orientation by Condition (Counts and Percentages)
so Purrble Treatment Waitlist Control Total
aroace 1 (1.3%) 0 (0%) 1 (0.7%)
aromatic & asexual (aroace) 0 (0%) 1 (1.3%) 1 (0.7%)
asexual 9 (11.8%) 6 (7.8%) 15 (9.8%)
asexual aromantic 1 (1.3%) 0 (0%) 1 (0.7%)
asexual panromantic 0 (0%) 1 (1.3%) 1 (0.7%)
asexual, bisexual 1 (1.3%) 0 (0%) 1 (0.7%)
bi-demisexual 1 (1.3%) 0 (0%) 1 (0.7%)
bi/pansexual 1 (1.3%) 0 (0%) 1 (0.7%)
biromantic demisexual 1 (1.3%) 0 (0%) 1 (0.7%)
biromantic, asexual spectrum. 1 (1.3%) 0 (0%) 1 (0.7%)
bisexual 26 (34.2%) 25 (32.5%) 51 (33.3%)
bisexuality 1 (1.3%) 0 (0%) 1 (0.7%)
demisexual biromantic 0 (0%) 1 (1.3%) 1 (0.7%)
gay 1 (1.3%) 1 (1.3%) 2 (1.3%)
heterosexual 1 (1.3%) 0 (0%) 1 (0.7%)
homosexual 4 (5.3%) 0 (0%) 4 (2.6%)
homosexual, demiromantic, asexual 1 (1.3%) 0 (0%) 1 (0.7%)
homosexual, demisexual 0 (0%) 1 (1.3%) 1 (0.7%)
homosexual/gay 0 (0%) 1 (1.3%) 1 (0.7%)
lesbian 5 (6.6%) 13 (16.9%) 18 (11.8%)
lesbian demisexual 0 (0%) 1 (1.3%) 1 (0.7%)
pan/demisexual/asexual 1 (1.3%) 0 (0%) 1 (0.7%)
panromanric asexual 0 (0%) 1 (1.3%) 1 (0.7%)
pansexual 5 (6.6%) 8 (10.4%) 13 (8.5%)
pansexual/queer 1 (1.3%) 0 (0%) 1 (0.7%)
queer 13 (17.1%) 15 (19.5%) 28 (18.3%)
queer or bisexual 1 (1.3%) 0 (0%) 1 (0.7%)
queer/ pansexual 0 (0%) 1 (1.3%) 1 (0.7%)
queer/lesbian/gay 0 (0%) 1 (1.3%) 1 (0.7%)

Nationality

Table: Nationality by Condition (Counts and Percentages)
Nationality Waitlist Control Purrble Treatment Total
bangladeshi 1 (1.3%) 0 (0%) 1 (0.7%)
british 36 (46.8%) 34 (44.7%) 70 (45.8%)
british-carribean 1 (1.3%) 1 (1.3%) 2 (1.3%)
british-indian 0 (0%) 1 (1.3%) 1 (0.7%)
british-japanese 1 (1.3%) 0 (0%) 1 (0.7%)
british-pakistani 1 (1.3%) 0 (0%) 1 (0.7%)
chinese 5 (6.5%) 1 (1.3%) 6 (3.9%)
filipino 0 (0%) 1 (1.3%) 1 (0.7%)
indian 5 (6.5%) 3 (3.9%) 8 (5.2%)
indonesian 1 (1.3%) 0 (0%) 1 (0.7%)
iranian 1 (1.3%) 0 (0%) 1 (0.7%)
irish 1 (1.3%) 1 (1.3%) 2 (1.3%)
irish-american 0 (0%) 1 (1.3%) 1 (0.7%)
irish-carribean 1 (1.3%) 0 (0%) 1 (0.7%)
malaysian chinese 1 (1.3%) 0 (0%) 1 (0.7%)
mexican 0 (0%) 1 (1.3%) 1 (0.7%)
nr 20 (26%) 29 (38.2%) 49 (32%)
pakistani 0 (0%) 1 (1.3%) 1 (0.7%)
polish 2 (2.6%) 2 (2.6%) 4 (2.6%)

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.

Participation Over Time and Attrition

Count of Participation by Group Over Time

Participation in Each Week over Time Note: Week 0 was “intake.” Weeks 1-3 were considered “pre-test.” Purrble was given (or not) after week 3. Weeks 11-13 are considered “Post-test”. For each week (0–13), we count the number of unique participants overall, and then break down participation by condition. These summaries help us understand attendance trends during intake, pre-test, intervention, and post-test phases.

Table 1: Count of Total Participation by Week
Week n_participants
0 151
1 147
2 148
3 149
4 142
5 139
6 138
7 140
8 142
9 128
10 130
11 128
12 117
13 130

Table: Count of Participation by Week and Condition
Week Purrble Treatment Waitlist Control
0 74 77
1 74 73
2 74 74
3 75 74
4 72 70
5 68 71
6 67 71
7 68 72
8 69 73
9 61 67
10 63 67
11 62 66
12 50 67
13 62 68

Number of Sessions Attended

Table 2: Overall Total Sessions Attended
mean_sessions sd_sessions
12.60784 2.155883
Table 3: Total Sessions Attended by Condition
condition mean_sessions sd_sessions n
0 12.85714 2.056532 77
1 12.35526 2.237284 76
Table 4: Total Sessions Attended by Gender Identity
identity_group mean_sessions sd_sessions n
0 12.53947 2.193571 76
1 12.67532 2.130243 77
Table 5: Total Sessions Attended by Condition and Gender Identity
condition identity_group mean_sessions sd_sessions n
0 0 13.13514 1.417395 37
0 1 12.60000 2.499231 40
1 0 11.97436 2.630661 39
1 1 12.75676 1.673410 37

Attrition Analysis

Attrition is defined here as not having attended any post-test session (i.e., no attendance during Weeks 11–13). We create a binary indicator for post-test completion (1 = attended at least one post-test session, 0 = none) and calculate attrition rates overall, by condition and by gender identity. We used a chi-square test to determine if attrition differed by condition; it did not.

Attrition by Condition

Results for Manuscript:

The conditions did not significantly differ on any of the baseline measures of outcomes or by age. Attrition rates were low across both conditions, with 9.2% of participants in the Purrble condition and 6.5% in the Waitlist Control condition not completing the study. Attrition did not differ by condition, χ²(1) = 0.11, p = .75, or by gender identity, χ²(1) < 0.01, p = 1.

Chi-square test for differences in attrition by condition:

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

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

Attrition by baseline Outcomes

Two-way ANOVA results for Pre_DERS8_Sum :
Two-way ANOVA for Pre_DERS8_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 7.983 7.983 0.356 0.552
attrition_status 1 30.432 30.432 1.356 0.246
condition:attrition_status 1 2.561 2.561 0.114 0.736
Residuals 148 3320.444 22.435 NA NA


Two-way ANOVA results for Pre_GAD7_Sum :
Two-way ANOVA for Pre_GAD7_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 0.658 0.658 0.041 0.841
attrition_status 1 1.190 1.190 0.073 0.787
condition:attrition_status 1 0.001 0.001 0.000 0.994
Residuals 148 2401.630 16.227 NA NA


Two-way ANOVA results for Pre_PHQ9_Sum :
Two-way ANOVA for Pre_PHQ9_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 18.249 18.249 0.859 0.356
attrition_status 1 2.796 2.796 0.132 0.717
condition:attrition_status 1 4.207 4.207 0.198 0.657
Residuals 148 3144.123 21.244 NA NA


Two-way ANOVA results for Pre_SHS_Pathways :
Two-way ANOVA for Pre_SHS_Pathways by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 35.106 35.106 1.907 0.169
attrition_status 1 3.918 3.918 0.213 0.645
condition:attrition_status 1 25.587 25.587 1.390 0.240
Residuals 144 2651.435 18.413 NA NA


Two-way ANOVA results for Pre_SHS_Agency :
Two-way ANOVA for Pre_SHS_Agency by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 34.935 34.935 1.450 0.231
attrition_status 1 8.541 8.541 0.354 0.553
condition:attrition_status 1 79.905 79.905 3.315 0.071
Residuals 144 3470.489 24.101 NA NA


Two-way ANOVA results for Pre_SHS_TotalHope :
Two-way ANOVA for Pre_SHS_TotalHope by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 140.081 140.081 2.039 0.155
attrition_status 1 24.029 24.029 0.350 0.555
condition:attrition_status 1 195.924 195.924 2.852 0.093
Residuals 144 9893.938 68.708 NA NA


Two-way ANOVA results for Pre_ucla_Sum :
Two-way ANOVA for Pre_ucla_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 3.945 3.945 1.556 0.214
attrition_status 1 1.318 1.318 0.520 0.472
condition:attrition_status 1 13.182 13.182 5.199 0.024
Residuals 143 362.575 2.535 NA NA


Two-way ANOVA results for Pre_pmerq_Focus_Avg :
Two-way ANOVA for Pre_pmerq_Focus_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.392 1.392 1.243 0.267
attrition_status 1 2.233 2.233 1.995 0.160
condition:attrition_status 1 1.281 1.281 1.144 0.287
Residuals 144 161.212 1.120 NA NA


Two-way ANOVA results for Pre_pmerq_Distract_Avg :
Two-way ANOVA for Pre_pmerq_Distract_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.554 1.554 1.247 0.266
attrition_status 1 4.213 4.213 3.380 0.068
condition:attrition_status 1 0.038 0.038 0.031 0.861
Residuals 144 179.482 1.246 NA NA


Two-way ANOVA results for Pre_pmerq_AD_Avg :
Two-way ANOVA for Pre_pmerq_AD_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.472 1.472 1.762 0.186
attrition_status 1 3.145 3.145 3.766 0.054
condition:attrition_status 1 0.440 0.440 0.527 0.469
Residuals 144 120.256 0.835 NA NA
NA

Attrition by baseline Outcomes follow-up/exploraiton

Descriptive Statistics for Pre_ucla_Sum by Condition and Attrition Status

condition

attrition_status

N

Mean

SD

0

Attriter

5

8.25

0.96

0

Completer

72

7.19

1.35

1

Attriter

7

5.67

1.51

1

Completer

69

7.03

1.83

Note. Means and standard deviations for Pre_ucla_Sum across four groups defined by condition (Purrble, Waitlist Control) and attrition status (Completer, Attriter).

Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Purrble Condition

Dependent Variable

t

df

p

d

95% CI

Pre_ucla_Sum

-2.09

6.38

.079

-0.75

[-1.60, 0.09]


Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Waitlist Control Condition

Dependent Variable

t

df

p

d

95% CI

Pre_ucla_Sum

2.10

3.73

.109

0.79

[-0.23, 1.81]

Attrition by Gender Identity

Chi-square test for differences in attrition by gender identity:

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

data:  attrition_ct
X-squared = 1.4323e-30, df = 1, p-value = 1
Table 8: 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

Preliminary Analysis

Baseline Differences in Outcomes by Condition

Outlier Detection and Visualization :

We first convert each pre‑test variable to z‑scores and flag any observations with an absolute z‑score greater than 3 as potential outliers. A summary table is created that lists the number of outliers for each variable. We then specifically inspect the outliers for the Pre_pmerq_Focus_Avg variable, which appears to have two cases exceeding our threshold. To better understand the distribution of Pre_pmerq_Focus_Avg, we generate a boxplot (with jittered data points) that visually highlights the extreme values.

Summary of Potential Outliers (|z| > 3) for Pre-Test Variables:
Summary of Outliers for Pre-Test Variables (|z| > 3)
Variable Outlier_Count
Pre_DERS8_Sum 0
Pre_GAD7_Sum 0
Pre_PHQ9_Sum 0
Pre_SHS_Pathways 0
Pre_SHS_Agency 0
Pre_SHS_TotalHope 0
Pre_ucla_Sum 0
Pre_pmerq_Focus_Avg 2
Pre_pmerq_Distract_Avg 0
Pre_pmerq_AD_Avg 0

Outliers for Pre_pmerq_Focus_Avg (|z| > 3):
Outliers for Pre_pmerq_Focus_Avg
psid Pre_pmerq_Focus_Avg z
C57 6 3.069197
C79 6 3.069197

Descriptive Statistics of Baseline Outcomes:

We compute descriptive statistics (mean, standard deviation, minimum, maximum, skewness, and kurtosis) for all pre‑test variables using the psych package. The resulting summary is then formatted into an APA‑style table using the nice_table function from the rempsyc package.

Variable

Mean

SD

Min

Max

Skew

Kurtosis

Pre_DERS8_Sum

28.15

4.72

14.33

38.33

-0.42

-0.13

Pre_GAD7_Sum

13.71

3.99

3.00

22.00

-0.17

-0.46

Pre_PHQ9_Sum

15.04

4.58

3.00

26.67

-0.02

-0.10

Pre_SHS_Pathways

13.29

4.30

3.00

24.00

-0.13

-0.42

Pre_SHS_Agency

10.70

4.94

3.00

24.00

0.34

-0.66

Pre_SHS_TotalHope

23.99

8.35

8.00

46.00

0.29

-0.30

Pre_ucla_Sum

7.08

1.62

3.00

9.00

-0.50

-0.66

Pre_pmerq_Focus_Avg

2.74

1.06

1.00

6.00

0.42

-0.10

Pre_pmerq_Distract_Avg

4.23

1.12

1.00

6.00

-0.86

0.70

Pre_pmerq_AD_Avg

3.49

0.92

1.00

6.00

-0.33

0.52

Baseline Equivalence of Baseline Outcomes (t‑Tests):

Finally, we run independent samples t‑tests comparing the two experimental conditions on each pre‑test variable using nice_t_test from rempsyc. This provides t‑statistics, degrees of freedom, p‑values, effect sizes (Cohen’s d), and confidence intervals, all formatted into an APA‑style table.

Result: No differences by chance.

Dependent Variable

t

df

p

d

95% CI

Pre_DERS8_Sum

0.60

146.06

.551

0.10

[-0.22, 0.41]

Pre_GAD7_Sum

-0.20

147.61

.840

-0.03

[-0.35, 0.29]

Pre_PHQ9_Sum

-0.93

147.00

.353

-0.15

[-0.47, 0.17]

Pre_SHS_Pathways

1.38

144.81

.168

0.23

[-0.10, 0.55]

Pre_SHS_Agency

1.20

144.38

.234

0.20

[-0.13, 0.52]

Pre_SHS_TotalHope

1.42

145.96

.157

0.23

[-0.09, 0.56]

Pre_ucla_Sum

1.23

134.26

.219

0.20

[-0.12, 0.53]

Pre_pmerq_Focus_Avg

1.11

145.19

.269

0.18

[-0.14, 0.51]

Pre_pmerq_Distract_Avg

1.11

145.84

.268

0.18

[-0.14, 0.51]

Pre_pmerq_AD_Avg

1.32

143.85

.190

0.22

[-0.11, 0.54]

Main Effects Analyses

Dependent Variable

Predictor

df

b

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

135

-3.04

-3.20

.002**

.04

[0.00, 0.09]

Pre_DERS8_Sum

135

0.92

9.21

< .001***

.35

[0.23, 0.48]

identity_group_num

135

1.69

1.72

.088

.01

[0.00, 0.04]

age

135

0.13

0.60

.549

.00

[0.00, 0.01]

Post_pmerq_Focus_Avg

condition_num

121

0.31

1.96

.052

.02

[0.00, 0.05]

Pre_pmerq_Focus_Avg

121

0.73

9.40

< .001***

.39

[0.26, 0.52]

identity_group_num

121

-0.27

-1.61

.110

.01

[0.00, 0.04]

age

121

0.02

0.45

.654

.00

[0.00, 0.01]

Post_pmerq_Distract_Avg

condition_num

121

0.25

1.49

.138

.01

[0.00, 0.05]

Pre_pmerq_Distract_Avg

121

0.48

6.48

< .001***

.25

[0.12, 0.38]

identity_group_num

121

0.20

1.19

.238

.01

[0.00, 0.04]

age

121

0.02

0.64

.526

.00

[0.00, 0.02]

Post_pmerq_AD_Avg

condition_num

121

0.30

2.28

.024*

.02

[0.00, 0.06]

Pre_pmerq_AD_Avg

121

0.70

9.54

< .001***

.42

[0.29, 0.55]

identity_group_num

121

-0.04

-0.32

.747

.00

[0.00, 0.01]

age

121

0.03

1.06

.290

.01

[0.00, 0.02]

Post_GAD7_Sum

condition_num

135

-1.35

-2.04

.044*

.02

[0.00, 0.05]

Pre_GAD7_Sum

135

0.74

8.98

< .001***

.35

[0.23, 0.48]

identity_group_num

135

0.75

1.08

.281

.01

[0.00, 0.02]

age

135

0.27

1.84

.068

.01

[0.00, 0.05]

Post_PHQ9_Sum

condition_num

135

-2.60

-3.64

< .001***

.04

[0.00, 0.09]

Pre_PHQ9_Sum

135

1.00

12.96

< .001***

.53

[0.42, 0.65]

identity_group_num

135

0.25

0.34

.734

.00

[0.00, 0.00]

age

135

0.29

1.86

.064

.01

[0.00, 0.03]

Post_SHS_Pathways

condition_num

122

0.09

0.14

.889

.00

[0.00, 0.00]

Pre_SHS_Pathways

122

0.46

6.04

< .001***

.21

[0.09, 0.34]

identity_group_num

122

-0.84

-1.19

.237

.01

[0.00, 0.04]

age

122

-0.28

-1.86

.065

.02

[0.00, 0.06]

Post_SHS_Agency

condition_num

122

0.44

0.53

.595

.00

[0.00, 0.01]

Pre_SHS_Agency

122

0.53

6.57

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-0.47

-0.55

.582

.00

[0.00, 0.01]

age

122

-0.17

-0.96

.337

.01

[0.00, 0.03]

Post_SHS_TotalHope

condition_num

122

0.62

0.46

.648

.00

[0.00, 0.01]

Pre_SHS_TotalHope

122

0.53

6.71

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-1.16

-0.82

.414

.00

[0.00, 0.02]

age

122

-0.43

-1.45

.151

.01

[0.00, 0.04]

Post_ucla_Sum

condition_num

121

-0.09

-0.40

.688

.00

[0.00, 0.01]

Pre_ucla_Sum

121

0.70

10.02

< .001***

.43

[0.30, 0.56]

identity_group_num

121

0.52

2.20

.030*

.02

[0.00, 0.06]

age

121

0.11

2.12

.036*

.02

[0.00, 0.05]

Emotion Regulation Outcomes: Moderation Models

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

134

-0.21

-3.17

.002**

.04

[0.00, 0.09]

Pre_DERS8_Sum

134

0.60

9.18

< .001***

.35

[0.23, 0.48]

identity_group_num

134

0.12

1.71

.089

.01

[0.00, 0.04]

age

134

0.04

0.53

.595

.00

[0.00, 0.01]

condition_num × Pre_DERS8_Sum

134

-0.04

-0.65

.517

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Focus_Avg

condition_num

120

0.13

1.93

.056

.02

[0.00, 0.05]

Pre_pmerq_Focus_Avg

120

0.65

9.35

< .001***

.39

[0.26, 0.52]

identity_group_num

120

-0.13

-1.74

.085

.01

[0.00, 0.04]

age

120

0.03

0.49

.625

.00

[0.00, 0.01]

condition_num × Pre_pmerq_Focus_Avg

120

-0.07

-1.02

.309

.00

[0.00, 0.02]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Distract_Avg

condition_num

120

0.11

1.45

.150

.01

[0.00, 0.05]

Pre_pmerq_Distract_Avg

120

0.52

6.50

< .001***

.25

[0.12, 0.38]

identity_group_num

120

0.10

1.18

.241

.01

[0.00, 0.04]

age

120

0.06

0.66

.510

.00

[0.00, 0.02]

condition_num × Pre_pmerq_Distract_Avg

120

-0.05

-0.67

.505

.00

[0.00, 0.02]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_AD_Avg

condition_num

120

0.15

2.24

.027*

.02

[0.00, 0.06]

Pre_pmerq_AD_Avg

120

0.67

9.45

< .001***

.42

[0.29, 0.55]

identity_group_num

120

-0.03

-0.36

.722

.00

[0.00, 0.01]

age

120

0.08

1.07

.288

.01

[0.00, 0.02]

condition_num × Pre_pmerq_AD_Avg

120

-0.03

-0.38

.704

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

134

-0.21

-3.23

.002**

.04

[0.00, 0.09]

identity_group_num

134

0.12

1.75

.082

.01

[0.00, 0.04]

Pre_DERS8_Sum

134

0.59

9.24

< .001***

.35

[0.23, 0.47]

age

134

0.04

0.59

.558

.00

[0.00, 0.01]

condition_num × identity_group_num

134

0.13

2.10

.038*

.02

[0.00, 0.05]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Focus_Avg

condition_num

120

0.13

2.01

.046*

.02

[0.00, 0.05]

identity_group_num

120

-0.11

-1.55

.124

.01

[0.00, 0.04]

Pre_pmerq_Focus_Avg

120

0.68

9.65

< .001***

.41

[0.28, 0.54]

age

120

0.03

0.48

.630

.00

[0.00, 0.01]

condition_num × identity_group_num

120

0.12

1.79

.076

.01

[0.00, 0.04]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Distract_Avg

condition_num

120

0.12

1.49

.139

.01

[0.00, 0.05]

identity_group_num

120

0.10

1.19

.238

.01

[0.00, 0.04]

Pre_pmerq_Distract_Avg

120

0.51

6.46

< .001***

.25

[0.12, 0.38]

age

120

0.05

0.63

.528

.00

[0.00, 0.02]

condition_num × identity_group_num

120

0.03

0.37

.708

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_AD_Avg

condition_num

120

0.16

2.31

.023*

.02

[0.00, 0.06]

identity_group_num

120

-0.02

-0.30

.766

.00

[0.00, 0.01]

Pre_pmerq_AD_Avg

120

0.68

9.65

< .001***

.43

[0.30, 0.56]

age

120

0.08

1.09

.279

.01

[0.00, 0.02]

condition_num × identity_group_num

120

0.09

1.30

.197

.01

[0.00, 0.03]

Follow up: DERS 8

Since the interaction of condition by identity group was signifiacnt, I have to probe it using simple slopes.

Result:

For cisgender participants, controlling for pre‑test emotion regulation, condition significantly predicted post‑test scores, with the intervention yielding lower (i.e., better) scores (b = –4.90, SE = 1.41, t(67) = –3.47, p = .001, adjusted R² = .47). In contrast, for transgender/gender diverse participants, condition was not a significant predictor of post‑test emotion regulation (b = –1.07, SE = 1.23, t(67) = –0.87, p = .39, adjusted R² = .37). sad.


Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum, 
    data = filter(Purrble_Master_Wide, identity_group == "0"))

Residuals:
    Min      1Q  Median      3Q     Max 
-15.085  -3.353   1.433   3.929  14.517 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     4.8137     4.9268   0.977  0.33206    
condition_num  -4.9030     1.4137  -3.468  0.00092 ***
Pre_DERS8_Sum   1.0170     0.1502   6.771 3.89e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.885 on 67 degrees of freedom
  (6 observations deleted due to missingness)
Multiple R-squared:  0.484, Adjusted R-squared:  0.4686 
F-statistic: 31.43 on 2 and 67 DF,  p-value: 2.361e-10


Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum, 
    data = filter(Purrble_Master_Wide, identity_group == "1"))

Residuals:
     Min       1Q   Median       3Q      Max 
-12.1803  -2.3719   0.0348   3.7168  10.4756 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     6.1183     4.1405   1.478    0.144    
condition_num  -1.0671     1.2265  -0.870    0.387    
Pre_DERS8_Sum   0.8226     0.1274   6.456 1.41e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.13 on 67 degrees of freedom
  (7 observations deleted due to missingness)
Multiple R-squared:  0.3885,    Adjusted R-squared:  0.3703 
F-statistic: 21.29 on 2 and 67 DF,  p-value: 6.971e-08

Dependent Variable

Predictor

df

b

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

135

-3.04

-3.20

.002**

.04

[0.00, 0.09]

Pre_DERS8_Sum

135

0.92

9.21

< .001***

.35

[0.23, 0.48]

identity_group_num

135

1.69

1.72

.088

.01

[0.00, 0.04]

age

135

0.13

0.60

.549

.00

[0.00, 0.01]

Post_pmerq_Focus_Avg

condition_num

121

0.31

1.96

.052

.02

[0.00, 0.05]

Pre_pmerq_Focus_Avg

121

0.73

9.40

< .001***

.39

[0.26, 0.52]

identity_group_num

121

-0.27

-1.61

.110

.01

[0.00, 0.04]

age

121

0.02

0.45

.654

.00

[0.00, 0.01]

Post_pmerq_Distract_Avg

condition_num

121

0.25

1.49

.138

.01

[0.00, 0.05]

Pre_pmerq_Distract_Avg

121

0.48

6.48

< .001***

.25

[0.12, 0.38]

identity_group_num

121

0.20

1.19

.238

.01

[0.00, 0.04]

age

121

0.02

0.64

.526

.00

[0.00, 0.02]

Post_pmerq_AD_Avg

condition_num

121

0.30

2.28

.024*

.02

[0.00, 0.06]

Pre_pmerq_AD_Avg

121

0.70

9.54

< .001***

.42

[0.29, 0.55]

identity_group_num

121

-0.04

-0.32

.747

.00

[0.00, 0.01]

age

121

0.03

1.06

.290

.01

[0.00, 0.02]

Post_GAD7_Sum

condition_num

135

-1.35

-2.04

.044*

.02

[0.00, 0.05]

Pre_GAD7_Sum

135

0.74

8.98

< .001***

.35

[0.23, 0.48]

identity_group_num

135

0.75

1.08

.281

.01

[0.00, 0.02]

age

135

0.27

1.84

.068

.01

[0.00, 0.05]

Post_PHQ9_Sum

condition_num

135

-2.60

-3.64

< .001***

.04

[0.00, 0.09]

Pre_PHQ9_Sum

135

1.00

12.96

< .001***

.53

[0.42, 0.65]

identity_group_num

135

0.25

0.34

.734

.00

[0.00, 0.00]

age

135

0.29

1.86

.064

.01

[0.00, 0.03]

Post_SHS_Pathways

condition_num

122

0.09

0.14

.889

.00

[0.00, 0.00]

Pre_SHS_Pathways

122

0.46

6.04

< .001***

.21

[0.09, 0.34]

identity_group_num

122

-0.84

-1.19

.237

.01

[0.00, 0.04]

age

122

-0.28

-1.86

.065

.02

[0.00, 0.06]

Post_SHS_Agency

condition_num

122

0.44

0.53

.595

.00

[0.00, 0.01]

Pre_SHS_Agency

122

0.53

6.57

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-0.47

-0.55

.582

.00

[0.00, 0.01]

age

122

-0.17

-0.96

.337

.01

[0.00, 0.03]

Post_SHS_TotalHope

condition_num

122

0.62

0.46

.648

.00

[0.00, 0.01]

Pre_SHS_TotalHope

122

0.53

6.71

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-1.16

-0.82

.414

.00

[0.00, 0.02]

age

122

-0.43

-1.45

.151

.01

[0.00, 0.04]

Post_ucla_Sum

condition_num

121

-0.09

-0.40

.688

.00

[0.00, 0.01]

Pre_ucla_Sum

121

0.70

10.02

< .001***

.43

[0.30, 0.56]

identity_group_num

121

0.52

2.20

.030*

.02

[0.00, 0.06]

age

121

0.11

2.12

.036*

.02

[0.00, 0.05]

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
fixed NA (Intercept) 22.165 3.733 5.937
fixed NA Week -0.265 0.064 -4.120
fixed NA conditionWaitlist Control -0.105 0.828 -0.127
fixed NA identity_groupTGD 0.930 0.824 1.129
fixed NA age 0.277 0.174 1.588
fixed NA Week:conditionWaitlist Control 0.284 0.090 3.152
ran_pars psid sd__(Intercept) 4.594 NA NA
ran_pars psid cor__(Intercept).Week -0.103 NA NA
ran_pars psid sd__Week 0.468 NA NA
ran_pars Residual sd__Observation 3.608 NA NA


### Outcome: pmerq_Focus_Avg 
Mixed-Effects Model for pmerq_Focus_Avg controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 3.943 0.738 5.345
fixed NA Week 0.048 0.012 4.139
fixed NA conditionWaitlist Control 0.258 0.188 1.372
fixed NA identity_groupTGD -0.476 0.163 -2.927
fixed NA age -0.059 0.034 -1.705
fixed NA Week:conditionWaitlist Control -0.035 0.016 -2.192
ran_pars psid sd__(Intercept) 0.799 NA NA
ran_pars psid cor__(Intercept).Week 0.454 NA NA
ran_pars psid sd__Week 0.021 NA NA
ran_pars Residual sd__Observation 0.640 NA NA


### Outcome: pmerq_Distract_Avg 
Mixed-Effects Model for pmerq_Distract_Avg controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 5.349 0.709 7.543
fixed NA Week 0.031 0.013 2.307
fixed NA conditionWaitlist Control 0.265 0.202 1.310
fixed NA identity_groupTGD 0.086 0.156 0.552
fixed NA age -0.066 0.033 -2.006
fixed NA Week:conditionWaitlist Control -0.035 0.019 -1.849
ran_pars psid sd__(Intercept) 0.906 NA NA
ran_pars psid cor__(Intercept).Week -0.412 NA NA
ran_pars psid sd__Week 0.057 NA NA
ran_pars Residual sd__Observation 0.648 NA NA


### Outcome: pmerq_AD_Avg 
Mixed-Effects Model for pmerq_AD_Avg controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 4.685 0.625 7.501
fixed NA Week 0.040 0.010 4.079
fixed NA conditionWaitlist Control 0.261 0.161 1.622
fixed NA identity_groupTGD -0.202 0.138 -1.465
fixed NA age -0.064 0.029 -2.205
fixed NA Week:conditionWaitlist Control -0.035 0.014 -2.568
ran_pars psid sd__(Intercept) 0.674 NA NA
ran_pars psid cor__(Intercept).Week 0.999 NA NA
ran_pars psid sd__Week 0.009 NA NA
ran_pars Residual sd__Observation 0.552 NA NA


### Outcome: GAD7_Sum 
Mixed-Effects Model for GAD7_Sum controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 10.890 2.892 3.766
fixed NA Week -0.156 0.046 -3.411
fixed NA conditionWaitlist Control -0.065 0.681 -0.095
fixed NA identity_groupTGD 1.253 0.637 1.967
fixed NA age 0.110 0.135 0.815
fixed NA Week:conditionWaitlist Control 0.103 0.064 1.608
ran_pars psid sd__(Intercept) 3.702 NA NA
ran_pars psid cor__(Intercept).Week -0.240 NA NA
ran_pars psid sd__Week 0.293 NA NA
ran_pars Residual sd__Observation 3.220 NA NA


### Outcome: PHQ9_Sum 
Mixed-Effects Model for PHQ9_Sum controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 14.141 3.462 4.085
fixed NA Week -0.177 0.048 -3.705
fixed NA conditionWaitlist Control -1.216 0.753 -1.614
fixed NA identity_groupTGD 1.630 0.764 2.133
fixed NA age 0.038 0.162 0.234
fixed NA Week:conditionWaitlist Control 0.222 0.067 3.320
ran_pars psid sd__(Intercept) 4.187 NA NA
ran_pars psid cor__(Intercept).Week 0.056 NA NA
ran_pars psid sd__Week 0.313 NA NA
ran_pars Residual sd__Observation 3.262 NA NA


### Outcome: SHS_Pathways 
Mixed-Effects Model for SHS_Pathways controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 18.228 2.760 6.604
fixed NA Week 0.180 0.053 3.423
fixed NA conditionWaitlist Control 0.879 0.807 1.088
fixed NA identity_groupTGD -1.888 0.605 -3.122
fixed NA age -0.246 0.128 -1.924
fixed NA Week:conditionWaitlist Control -0.058 0.074 -0.783
ran_pars psid sd__(Intercept) 3.517 NA NA
ran_pars psid cor__(Intercept).Week -0.431 NA NA
ran_pars psid sd__Week 0.201 NA NA
ran_pars Residual sd__Observation 2.669 NA NA


### Outcome: SHS_Agency 
Mixed-Effects Model for SHS_Agency controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 11.036 3.221 3.426
fixed NA Week 0.239 0.063 3.810
fixed NA conditionWaitlist Control 0.986 0.897 1.099
fixed NA identity_groupTGD -1.511 0.707 -2.136
fixed NA age -0.045 0.150 -0.300
fixed NA Week:conditionWaitlist Control -0.069 0.088 -0.782
ran_pars psid sd__(Intercept) 3.946 NA NA
ran_pars psid cor__(Intercept).Week -0.349 NA NA
ran_pars psid sd__Week 0.294 NA NA
ran_pars Residual sd__Observation 2.928 NA NA


### Outcome: SHS_TotalHope 
Mixed-Effects Model for SHS_TotalHope controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 29.159 5.488 5.313
fixed NA Week 0.419 0.103 4.076
fixed NA conditionWaitlist Control 1.843 1.525 1.209
fixed NA identity_groupTGD -3.422 1.205 -2.840
fixed NA age -0.285 0.255 -1.118
fixed NA Week:conditionWaitlist Control -0.125 0.144 -0.869
ran_pars psid sd__(Intercept) 7.134 NA NA
ran_pars psid cor__(Intercept).Week -0.419 NA NA
ran_pars psid sd__Week 0.522 NA NA
ran_pars Residual sd__Observation 4.604 NA NA


### Outcome: ucla_Sum 
Mixed-Effects Model for ucla_Sum controlling for identity_group and age
effect group term estimate std.error statistic
fixed NA (Intercept) 6.511 1.162 5.602
fixed NA Week -0.028 0.017 -1.668
fixed NA conditionWaitlist Control 0.301 0.295 1.019
fixed NA identity_groupTGD 0.498 0.256 1.948
fixed NA age 0.013 0.054 0.240
fixed NA Week:conditionWaitlist Control -0.008 0.023 -0.366
ran_pars psid sd__(Intercept) 1.389 NA NA
ran_pars psid cor__(Intercept).Week -0.052 NA NA
ran_pars psid sd__Week 0.045 NA NA
ran_pars Residual sd__Observation 0.888 NA NA
NA
Mixed-Effects Model for DERS8_Sum with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 22.165 3.733 5.937 14.848 29.481
fixed NA Week -0.265 0.064 -4.120 -0.391 -0.139
fixed NA conditionWaitlist Control -0.105 0.828 -0.127 -1.729 1.518
fixed NA identity_groupTGD 0.930 0.824 1.129 -0.685 2.545
fixed NA age 0.277 0.174 1.588 -0.065 0.619
fixed NA Week:conditionWaitlist Control 0.284 0.090 3.152 0.108 0.461
ran_pars psid sd__(Intercept) 4.594 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.103 NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA
ran_pars Residual sd__Observation 3.608 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 2.5 % 97.5 %
fixed NA (Intercept) 22.165 3.733 5.937 14.848 29.481
fixed NA Week -0.265 0.064 -4.120 -0.391 -0.139
fixed NA conditionWaitlist Control -0.105 0.828 -0.127 -1.729 1.518
fixed NA identity_groupTGD 0.930 0.824 1.129 -0.685 2.545
fixed NA age 0.277 0.174 1.588 -0.065 0.619
fixed NA Week:conditionWaitlist Control 0.284 0.090 3.152 0.108 0.461
ran_pars psid sd__(Intercept) 4.594 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.103 NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA
ran_pars Residual sd__Observation 3.608 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.717
     Marginal R2: 0.037
Mixed-Effects Model for pmerq_Focus_Avg with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 3.943 0.738 5.345 2.497 5.389
fixed NA Week 0.048 0.012 4.139 0.025 0.070
fixed NA conditionWaitlist Control 0.258 0.188 1.372 -0.111 0.628
fixed NA identity_groupTGD -0.476 0.163 -2.927 -0.794 -0.157
fixed NA age -0.059 0.034 -1.705 -0.126 0.009
fixed NA Week:conditionWaitlist Control -0.035 0.016 -2.192 -0.067 -0.004
ran_pars psid sd__(Intercept) 0.799 NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.454 NA NA NA NA
ran_pars psid sd__Week 0.021 NA NA NA NA
ran_pars Residual sd__Observation 0.640 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.680
     Marginal R2: 0.060
Mixed-Effects Model for pmerq_Distract_Avg with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 5.349 0.709 7.543 3.959 6.739
fixed NA Week 0.031 0.013 2.307 0.005 0.057
fixed NA conditionWaitlist Control 0.265 0.202 1.310 -0.132 0.662
fixed NA identity_groupTGD 0.086 0.156 0.552 -0.219 0.391
fixed NA age -0.066 0.033 -2.006 -0.131 -0.002
fixed NA Week:conditionWaitlist Control -0.035 0.019 -1.849 -0.071 0.002
ran_pars psid sd__(Intercept) 0.906 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.412 NA NA NA NA
ran_pars psid sd__Week 0.057 NA NA NA NA
ran_pars Residual sd__Observation 0.648 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.650
     Marginal R2: 0.031
Mixed-Effects Model for pmerq_AD_Avg with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 4.685 0.625 7.501 3.461 5.909
fixed NA Week 0.040 0.010 4.079 0.021 0.059
fixed NA conditionWaitlist Control 0.261 0.161 1.622 -0.054 0.576
fixed NA identity_groupTGD -0.202 0.138 -1.465 -0.471 0.068
fixed NA age -0.064 0.029 -2.205 -0.121 -0.007
fixed NA Week:conditionWaitlist Control -0.035 0.014 -2.568 -0.062 -0.008
ran_pars psid sd__(Intercept) 0.674 NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.999 NA NA NA NA
ran_pars psid sd__Week 0.009 NA NA NA NA
ran_pars Residual sd__Observation 0.552 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.661
     Marginal R2: 0.042
Mixed-Effects Model for GAD7_Sum with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 10.890 2.892 3.766 5.222 16.558
fixed NA Week -0.156 0.046 -3.411 -0.246 -0.066
fixed NA conditionWaitlist Control -0.065 0.681 -0.095 -1.400 1.270
fixed NA identity_groupTGD 1.253 0.637 1.967 0.004 2.502
fixed NA age 0.110 0.135 0.815 -0.154 0.374
fixed NA Week:conditionWaitlist Control 0.103 0.064 1.608 -0.023 0.228
ran_pars psid sd__(Intercept) 3.702 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.240 NA NA NA NA
ran_pars psid sd__Week 0.293 NA NA NA NA
ran_pars Residual sd__Observation 3.220 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 2.5 % 97.5 %
fixed NA (Intercept) 14.141 3.462 4.085 7.356 20.926
fixed NA Week -0.177 0.048 -3.705 -0.271 -0.083
fixed NA conditionWaitlist Control -1.216 0.753 -1.614 -2.692 0.261
fixed NA identity_groupTGD 1.630 0.764 2.133 0.132 3.127
fixed NA age 0.038 0.162 0.234 -0.279 0.355
fixed NA Week:conditionWaitlist Control 0.222 0.067 3.320 0.091 0.353
ran_pars psid sd__(Intercept) 4.187 NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.056 NA NA NA NA
ran_pars psid sd__Week 0.313 NA NA NA NA
ran_pars Residual sd__Observation 3.262 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.703
     Marginal R2: 0.024
Mixed-Effects Model for SHS_Pathways with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 18.228 2.760 6.604 12.818 23.638
fixed NA Week 0.180 0.053 3.423 0.077 0.283
fixed NA conditionWaitlist Control 0.879 0.807 1.088 -0.704 2.461
fixed NA identity_groupTGD -1.888 0.605 -3.122 -3.074 -0.703
fixed NA age -0.246 0.128 -1.924 -0.497 0.005
fixed NA Week:conditionWaitlist Control -0.058 0.074 -0.783 -0.202 0.087
ran_pars psid sd__(Intercept) 3.517 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.431 NA NA NA NA
ran_pars psid sd__Week 0.201 NA NA NA NA
ran_pars Residual sd__Observation 2.669 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.630
     Marginal R2: 0.072
Mixed-Effects Model for SHS_Agency with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 11.036 3.221 3.426 4.723 17.350
fixed NA Week 0.239 0.063 3.810 0.116 0.361
fixed NA conditionWaitlist Control 0.986 0.897 1.099 -0.773 2.745
fixed NA identity_groupTGD -1.511 0.707 -2.136 -2.897 -0.124
fixed NA age -0.045 0.150 -0.300 -0.338 0.249
fixed NA Week:conditionWaitlist Control -0.069 0.088 -0.782 -0.240 0.103
ran_pars psid sd__(Intercept) 3.946 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.349 NA NA NA NA
ran_pars psid sd__Week 0.294 NA NA NA NA
ran_pars Residual sd__Observation 2.928 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.669
     Marginal R2: 0.051
Mixed-Effects Model for SHS_TotalHope with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 29.159 5.488 5.313 18.402 39.915
fixed NA Week 0.419 0.103 4.076 0.217 0.620
fixed NA conditionWaitlist Control 1.843 1.525 1.209 -1.146 4.831
fixed NA identity_groupTGD -3.422 1.205 -2.840 -5.784 -1.060
fixed NA age -0.285 0.255 -1.118 -0.785 0.215
fixed NA Week:conditionWaitlist Control -0.125 0.144 -0.869 -0.406 0.157
ran_pars psid sd__(Intercept) 7.134 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.419 NA NA NA NA
ran_pars psid sd__Week 0.522 NA NA NA NA
ran_pars Residual sd__Observation 4.604 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.714
     Marginal R2: 0.070
Mixed-Effects Model for ucla_Sum with 95% CI
effect group term estimate std.error statistic 2.5 % 97.5 %
fixed NA (Intercept) 6.511 1.162 5.602 4.232 8.789
fixed NA Week -0.028 0.017 -1.668 -0.060 0.005
fixed NA conditionWaitlist Control 0.301 0.295 1.019 -0.278 0.880
fixed NA identity_groupTGD 0.498 0.256 1.948 -0.003 1.000
fixed NA age 0.013 0.054 0.240 -0.093 0.119
fixed NA Week:conditionWaitlist Control -0.008 0.023 -0.366 -0.054 0.037
ran_pars psid sd__(Intercept) 1.389 NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.052 NA NA NA NA
ran_pars psid sd__Week 0.045 NA NA NA NA
ran_pars Residual sd__Observation 0.888 NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.729
     Marginal R2: 0.030
LS0tCnRpdGxlOiAiUHVycmJsZSBSQ1QgQW5hbHlzZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgojIFJlY29yZGluZyBLZWVwaW5nOiAKClRoZXJlIGFyZSB0d28gbWFzdGVyIGZpbGVzIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBhbmFseXNlcy4gVGhleSBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgZmlsZSwgdGhvdWdoIG9uZSBpcyBpbiB3aWRlIGZvcm1hdCBhbmQgdGhlIG90aGVyIGlzIGluIGxvbmcgZm9ybWF0LgoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTWFzdGVyX1dpZGUu4oCdIFRoZSBsb25nIGRhdGFzZXQgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTG9uZ19NYXN0ZXIu4oCdIFRoZSB3aWRlIGRhdGFzZXQgaGFzIGFsbCBvZiB0aGUgcHJlIGFuZCBwb3N0dGVzdCB2YXJpYWJsZXMgY2FsY3VsYXRlZCwgd2hpbGUgdGhlIGxvbmcgZG9lcyBub3QuIE90aGVyd2lzZSwgdGhleSBkbyBub3QgZGlmZmVyLiAKClRoaXMgZGF0YXNldCBpbmNsdWRlcyB0aGUgTj0xNTMgcGFydGljaXBhbnRzIHdobyB3ZXJlIGluY2x1ZGVkIGluIHRoZSByYW5kb21pemVkIGNvbnRyb2wgdHJpYWwgZXhhbWluaW5nIFB1cnJibGUgd2l0aCBhIHBvcHVsYXRpb24gb2YgdW5pdmVyc2l0eSBzdHVkZW50cy4gQWxsIHBhcnRpY2lwYW50cyB3ZXJlIG1lbWJlcnMgb2YgdGhlIExHVEJRKyBjb21tdW5pdHkuCgpUaGVzZSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCBvbiBGZWJydWFyeSAxOC0xOSBieSBBdWJyZXkgUmhvZGVzLiBXZSB1c2UgdGhlICJmaW5hbCIgZGF0YXNldHMgaW4gd2hpY2ggd2UgcmVtb3ZlZCBwYXJ0aWNpcGFudCBDNzIsIHdobyBoYWQgbm8gaW5mb3JtYXRpb24gb24gZ2VuZGVyIGlkZW50aXR5LgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFLCAgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShncmlkRXh0cmEpIApsaWJyYXJ5KHBhdGNod29yaykgICAgICAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobG1lNCkKbGlicmFyeShtYXJrZG93bikKbGlicmFyeShzdGFyZ2F6ZXIpCmxpYnJhcnkoTU9URSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShicm9vbSkKbGlicmFyeShicm9vbS5taXhlZCkgCmxpYnJhcnkodGlkeW1vZGVscykgCmxpYnJhcnkobXVsdGlsZXZlbG1vZCkgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKbGlicmFyeShndCkKbGlicmFyeShyZW1wc3ljKSAKCgojI1JlYWQgaW4gdGhlIGRhdGFzZXRzCmBgYAoKCiMgRGVzY3JpcHRpdmUgQW5hbHlzZXMgCgojIyBTYW1wbGUgQ2hhcmFjdGVyaXN0aWNzCgpUaGVzZSB0YWJsZXMgcmVwb3J0IHRoZSBjb3VudCBvZiBwYXJ0aWNpcGFudHMgYnkgY29uZGl0aW9uLCBpZGVudGl0eSBncm91cCwgYW5kIGJ5IGNvbmRpdGlvbiB4IGlkZW50aXR5IGdyb3VwLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgVGFibGUgMTogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBDb25kaXRpb24KY29uZGl0aW9uX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gIkNvdW50IikgJT4lCiAgYXJyYW5nZShjb25kaXRpb24pICU+JQogIGFkZF9yb3coY29uZGl0aW9uID0gIlRvdGFsIiwgQ291bnQgPSBzdW0oLiRDb3VudCkpCgojIFRhYmxlIDI6IE51bWJlciBvZiBQYXJ0aWNpcGFudHMgYnkgR2VuZGVyIElkZW50aXR5CmlkZW50aXR5X2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGlkZW50aXR5X2dyb3VwKSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSByZWNvZGUoaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDIiA9ICJDaXNnZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEdEIiA9ICJUcmFuc2dlbmRlciIpKSAlPiUKICBjb3VudChpZGVudGl0eV9ncm91cCwgbmFtZSA9ICJDb3VudCIpICU+JQogIGFycmFuZ2UoaWRlbnRpdHlfZ3JvdXApICU+JQogIGFkZF9yb3coaWRlbnRpdHlfZ3JvdXAgPSAiVG90YWwiLCBDb3VudCA9IHN1bSguJENvdW50KSkKCiMgVGFibGUgMzogQ3Jvc3MtdGFidWxhdGlvbiBvZiBDb25kaXRpb24gYnkgR2VuZGVyIElkZW50aXR5CmNyb3NzX3RhYiA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cCA9IHJlY29kZShpZGVudGl0eV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiID0gIkNpc2dlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUR0IiID0gIlRyYW5zZ2VuZGVyIikpICU+JQogIGNvdW50KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpZGVudGl0eV9ncm91cCwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQoKIyBEaXNwbGF5IHRoZSB0YWJsZXMgdXNpbmcga2FibGUKa2FibGUoY29uZGl0aW9uX2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbiIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGlkZW50aXR5X2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAyOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IEdlbmRlciBJZGVudGl0eSIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGNyb3NzX3RhYiwgY2FwdGlvbiA9ICJUYWJsZSAzOiBDcm9zcy10YWJ1bGF0aW9uIG9mIENvbmRpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkiLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCgojIyBBZ2U6IERlc2NyaXB0aXZlcyBhbmQgQ2hlY2sgZm9yIEJhc2VsaW5lIGRpZmZlcmVuY2VzIAoKU3VtbWFyaXplcyBhZ2UgKE1lYW4sIFNELCBNaW4sIE1heCkgYnkgY29uZGl0aW9uIGFuZCBydW5zIGEgdC10ZXN0IGNvbXBhcmluZyBhZ2UgYnkgY29uZGl0aW9uLgoKYGBge3J9CiMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHJlbXBzeWMpIAojIGlmIG5vdCBpbnN0YWxsZWQsIHJ1bjogaW5zdGFsbC5wYWNrYWdlcygicmVtcHN5YyIpCgojIFByZXBhcmUgZGF0YTogZW5zdXJlIG9uZSBvYnNlcnZhdGlvbiBwZXIgcGFydGljaXBhbnQKYWdlX2RhdGEgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUgCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uLCBhZ2UpCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAoTWVhbiwgU0QsIE1pbiwgTWF4KSBieSBjb25kaXRpb24KZGVzY3JpcHRpdmVfc3RhdHMgPC0gYWdlX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBNZWFuID0gbWVhbihhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBTRCAgID0gc2QoYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgTWluICA9IG1pbihhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBNYXggID0gbWF4KGFnZSwgbmEucm0gPSBUUlVFKQogICkgJT4lIAogIHVuZ3JvdXAoKQoKY2F0KCJUYWJsZTogRGVzY3JpcHRpdmUgU3RhdGlzdGljcyBmb3IgQWdlIGJ5IENvbmRpdGlvbiAoQVBBIEZvcm1hdClcblxuIikKIyBEaXNwbGF5IHRoZSBBUEEtZm9ybWF0dGVkIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgdGFibGUKbmljZV90YWJsZShkZXNjcmlwdGl2ZV9zdGF0cykKCiMgRW5zdXJlIG9uZSBvYnNlcnZhdGlvbiBwZXIgcGFydGljaXBhbnQgZm9yIGFnZQphZ2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JSAKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIGFnZSkKCiMgUnVuIHRoZSB0LXRlc3QgdXNpbmcgcmVtcHN5YydzIG5pY2VfdF90ZXN0KCkgZnVuY3Rpb24KYWdlX3R0ZXN0X3Jlc3VsdHMgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IGFnZV9kYXRhLAogIHJlc3BvbnNlID0gImFnZSIsCiAgZ3JvdXAgPSAiY29uZGl0aW9uIiwKICB3YXJuaW5nID0gRkFMU0UKKQoKIyBEaXNwbGF5IGEgcHVibGljYXRpb24tcmVhZHkgdC10ZXN0IHRhYmxlCm5pY2VfdGFibGUoYWdlX3R0ZXN0X3Jlc3VsdHMpCmBgYAoKCgojIyBSYWNlLCBOYXRpb25hbGl0eSwgYW5kIFNleHVhbCBPcmllbnRhdGlvbgoKIyMjIFNleHVhbCBPcmllbnRhdGlvbi0gU2ltcGxpZmllZApgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyMjIFNleHVhbCBPcmllbnRhdGlvbiAoc29fc2ltcGxpZmllZCkgYnkgQ29uZGl0aW9uCgojIDEuIENyZWF0ZSBhIGNvdW50cyB0YWJsZTogb25lIHJvdyBwZXIgdW5pcXVlIHNvX3NpbXBsaWZpZWQgcmVzcG9uc2UsIHdpdGggc2VwYXJhdGUgY29sdW1ucyBmb3IgZWFjaCBjb25kaXRpb24uCnNvX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgc29fc2ltcGxpZmllZCkgJT4lICAgICAgICAjIG9uZSByZWNvcmQgcGVyIHBhcnRpY2lwYW50CiAgbXV0YXRlKHNvX3NpbXBsaWZpZWQgPSB0b2xvd2VyKHNvX3NpbXBsaWZpZWQpKSAlPiUgICAjIGNvbnZlcnQgdG8gbG93ZXJjYXNlCiAgY291bnQoc29fc2ltcGxpZmllZCwgY29uZGl0aW9uKSAlPiUgICAgICAgICAgICAgICAgICMgY291bnQgcGVyIHNvX3NpbXBsaWZpZWQgeCBjb25kaXRpb24KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IG4sIAogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gbGlzdChuID0gMCkpICU+JQogIGFycmFuZ2Uoc29fc2ltcGxpZmllZCkKCiMgMi4gQWRkIGEgVG90YWwgY29sdW1uIChzdW1taW5nIGFjcm9zcyBjb25kaXRpb25zIGZvciBlYWNoIHNvX3NpbXBsaWZpZWQgcmVzcG9uc2UpCnNvX2NvdW50cyA8LSBzb19jb3VudHMgJT4lCiAgbXV0YXRlKFRvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgLXNvX3NpbXBsaWZpZWQpKSkKCiMgMy4gQ29tcHV0ZSBkZW5vbWluYXRvcnMgKGkuZS4sIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgcGVyIGNvbmRpdGlvbikgZm9yIHBlcmNlbnRhZ2VzCmRlbm9tX3NvIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAidG90YWwiKQoKb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQoKIyA0LiBDb252ZXJ0IGNvdW50cyB0byBhIGNvbWJpbmVkIHN0cmluZyAiY291bnQgKHBlcmNlbnRhZ2UlKSIgZm9yIGVhY2ggY29uZGl0aW9uIGNvbHVtbiBhbmQgZm9yIFRvdGFsLgpzb190YWJsZV9maW5hbCA8LSBzb19jb3VudHMKZm9yKGNvbCBpbiBzZXRkaWZmKG5hbWVzKHNvX2NvdW50cyksICJzb19zaW1wbGlmaWVkIikpewogIGlmKGNvbCAhPSAiVG90YWwiKXsKICAgICMgTG9vayB1cCBkZW5vbWluYXRvciBmb3IgdGhlIGNvbmRpdGlvbiBjb2x1bW4KICAgIGRlbm9tX3ZhbCA8LSBkZW5vbV9zbyR0b3RhbFtkZW5vbV9zbyRjb25kaXRpb24gPT0gY29sXQogICAgc29fdGFibGVfZmluYWxbW2NvbF1dIDwtIHBhc3RlMChzb19jb3VudHNbW2NvbF1dLCAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoc29fY291bnRzW1tjb2xdXSAvIGRlbm9tX3ZhbCAqIDEwMCwgMSksICIlKSIpCiAgfSBlbHNlIHsKICAgIHNvX3RhYmxlX2ZpbmFsW1tjb2xdXSA8LSBwYXN0ZTAoc29fY291bnRzW1tjb2xdXSwgIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFzLm51bWVyaWMoc29fY291bnRzW1tjb2xdXSkgLyBvdmVyYWxsX2Rlbm9tICogMTAwLCAxKSwgIiUpIikKICB9Cn0KCnByaW50KGthYmxlKHNvX3RhYmxlX2ZpbmFsLCBjYXB0aW9uID0gIlRhYmxlOiBTZXh1YWwgT3JpZW50YXRpb24gKHNvX3NpbXBsaWZpZWQpIGJ5IENvbmRpdGlvbiAoQ291bnRzIGFuZCBQZXJjZW50YWdlcykiLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKCmBgYAoKIyMjIFNleHVhbCBPcmllbnRhdGlvbi0gTm90IHNpbXBsaWZpZWQKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMjIyBTZXh1YWwgT3JpZW50YXRpb24gKHNvKSBieSBDb25kaXRpb24tIENvbXBsZXgKCiMgMS4gQ3JlYXRlIGEgY291bnRzIHRhYmxlOiBvbmUgcm93IHBlciB1bmlxdWUgc28gcmVzcG9uc2UsIHdpdGggc2VwYXJhdGUgY29sdW1ucyBmb3IgZWFjaCBjb25kaXRpb24uCnNvX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgc28pICU+JSAgICAgICAgIyBvbmUgcmVjb3JkIHBlciBwYXJ0aWNpcGFudAogIG11dGF0ZShzbyA9IHRvbG93ZXIoc28pKSAlPiUgICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGxvd2VyY2FzZQogIGNvdW50KHNvLCBjb25kaXRpb24pICU+JSAgICAgICAgICAgICAgICAgIyBjb3VudCBwZXIgc28geCBjb25kaXRpb24KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IG4sIAogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gbGlzdChuID0gMCkpICU+JQogIGFycmFuZ2Uoc28pCgojIDIuIEFkZCBhIFRvdGFsIGNvbHVtbiAoc3VtbWluZyBhY3Jvc3MgY29uZGl0aW9ucyBmb3IgZWFjaCBzbyByZXNwb25zZSkKc29fY291bnRzIDwtIHNvX2NvdW50cyAlPiUKICBtdXRhdGUoVG90YWwgPSByb3dTdW1zKHNlbGVjdCguLCAtc28pKSkKCiMgMy4gQ29tcHV0ZSBkZW5vbWluYXRvcnMgKGkuZS4sIHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgcGVyIGNvbmRpdGlvbikgZm9yIHBlcmNlbnRhZ2VzCmRlbm9tX3NvIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAidG90YWwiKQoKb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQoKIyA0LiBDb252ZXJ0IGNvdW50cyB0byBhIGNvbWJpbmVkIHN0cmluZyAiY291bnQgKHBlcmNlbnRhZ2UlKSIgZm9yIGVhY2ggY29uZGl0aW9uIGNvbHVtbiBhbmQgZm9yIFRvdGFsLgpzb190YWJsZV9maW5hbCA8LSBzb19jb3VudHMKZm9yKGNvbCBpbiBzZXRkaWZmKG5hbWVzKHNvX2NvdW50cyksICJzbyIpKXsKICBpZihjb2wgIT0gIlRvdGFsIil7CiAgICAjIExvb2sgdXAgZGVub21pbmF0b3IgZm9yIHRoZSBjb25kaXRpb24gY29sdW1uCiAgICBkZW5vbV92YWwgPC0gZGVub21fc28kdG90YWxbZGVub21fc28kY29uZGl0aW9uID09IGNvbF0KICAgIHNvX3RhYmxlX2ZpbmFsW1tjb2xdXSA8LSBwYXN0ZTAoc29fY291bnRzW1tjb2xdXSwgIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKHNvX2NvdW50c1tbY29sXV0gLyBkZW5vbV92YWwgKiAxMDAsIDEpLCAiJSkiKQogIH0gZWxzZSB7CiAgICBzb190YWJsZV9maW5hbFtbY29sXV0gPC0gcGFzdGUwKHNvX2NvdW50c1tbY29sXV0sICIgKCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChhcy5udW1lcmljKHNvX2NvdW50c1tbY29sXV0pIC8gb3ZlcmFsbF9kZW5vbSAqIDEwMCwgMSksICIlKSIpCiAgfQp9CgpwcmludChrYWJsZShzb190YWJsZV9maW5hbCwgY2FwdGlvbiA9ICJUYWJsZTogU2V4dWFsIE9yaWVudGF0aW9uIGJ5IENvbmRpdGlvbiAoQ291bnRzIGFuZCBQZXJjZW50YWdlcykiLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKYGBgCiMjIyBOYXRpb25hbGl0eQpgYGB7cn0KIyMjIE5hdGlvbmFsaXR5IGJ5IENvbmRpdGlvbgoKIyAxLiBDcmVhdGUgYSBjb3VudHMgdGFibGU6IG9uZSByb3cgcGVyIHVuaXF1ZSBOYXRpb25hbGl0eSwgd2l0aCBjb2x1bW5zIGZvciBlYWNoIGNvbmRpdGlvbi4KbmF0aW9uYWxpdHlfY291bnRzIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uLCBOYXRpb25hbGl0eSkgJT4lICAjIG9uZSByZWNvcmQgcGVyIHBhcnRpY2lwYW50CiAgbXV0YXRlKE5hdGlvbmFsaXR5ID0gdG9sb3dlcihOYXRpb25hbGl0eSkpICU+JSAgIyBjb252ZXJ0IHRvIGxvd2VyY2FzZQogIGNvdW50KE5hdGlvbmFsaXR5LCBjb25kaXRpb24pICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gbiwgCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgYXJyYW5nZShOYXRpb25hbGl0eSkKCiMgMi4gQWRkIGEgVG90YWwgY29sdW1uLgpuYXRpb25hbGl0eV9jb3VudHMgPC0gbmF0aW9uYWxpdHlfY291bnRzICU+JQogIG11dGF0ZShUb3RhbCA9IHJvd1N1bXMoc2VsZWN0KC4sIC1OYXRpb25hbGl0eSkpKQoKIyAzLiBHZXQgZGVub21pbmF0b3JzIChzYW1lIGFzIGZvciBzbykKZGVub21fbmF0IDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAidG90YWwiKQpvdmVyYWxsX2Rlbm9tX25hdCA8LSBvdmVyYWxsX2Rlbm9tICAjIHNhbWUgb3ZlcmFsbCBkZW5vbWluYXRvcgoKIyA0LiBDb252ZXJ0IGNvdW50cyB0byAiY291bnQgKHBlcmNlbnRhZ2UlKSIgZm9ybWF0LgpuYXRpb25hbGl0eV90YWJsZV9maW5hbCA8LSBuYXRpb25hbGl0eV9jb3VudHMKZm9yKGNvbCBpbiBzZXRkaWZmKG5hbWVzKG5hdGlvbmFsaXR5X2NvdW50cyksICJOYXRpb25hbGl0eSIpKXsKICBpZihjb2wgIT0gIlRvdGFsIil7CiAgICBkZW5vbV92YWwgPC0gZGVub21fbmF0JHRvdGFsW2Rlbm9tX25hdCRjb25kaXRpb24gPT0gY29sXQogICAgbmF0aW9uYWxpdHlfdGFibGVfZmluYWxbW2NvbF1dIDwtIHBhc3RlMChuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dLCAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobmF0aW9uYWxpdHlfY291bnRzW1tjb2xdXSAvIGRlbm9tX3ZhbCAqIDEwMCwgMSksICIlKSIpCiAgfSBlbHNlIHsKICAgIG5hdGlvbmFsaXR5X3RhYmxlX2ZpbmFsW1tjb2xdXSA8LSBwYXN0ZTAobmF0aW9uYWxpdHlfY291bnRzW1tjb2xdXSwgIiAoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFzLm51bWVyaWMobmF0aW9uYWxpdHlfY291bnRzW1tjb2xdXSkgLyBvdmVyYWxsX2Rlbm9tX25hdCAqIDEwMCwgMSksICIlKSIpCiAgfQp9CgpwcmludChrYWJsZShuYXRpb25hbGl0eV90YWJsZV9maW5hbCwgY2FwdGlvbiA9ICJUYWJsZTogTmF0aW9uYWxpdHkgYnkgQ29uZGl0aW9uIChDb3VudHMgYW5kIFBlcmNlbnRhZ2VzKSIsIGZvcm1hdCA9ICJtYXJrZG93biIpKQoKYGBgCiMjIyBSYWNlCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIERlZmluZSByYWNlIHZhcmlhYmxlcwpyYWNlX3ZhcnMgPC0gYygiUmFjZV9Bc2lhbiIsICJSYWNlX0FyYWJpYyIsICJSYWNlX0JsYWNrIiwgIlJhY2VfSGlzcGFuaWMiLCAKICAgICAgICAgICAgICAgIlJhY2VfUGFjaWZpYyIsICJSYWNlX1doaXRlIiwgIlJhY2VfdW5rbm93biIpCgojIFN0ZXAgMTogQ3JlYXRlIHBhcnRpY2lwYW50LWxldmVsIHJhY2UgZGF0YQpyYWNlX2RhdGEgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBzZWxlY3QocHNpZCwgY29uZGl0aW9uLCBhbGxfb2YocmFjZV92YXJzKSkgJT4lICAjIHNlbGVjdCBuZWVkZWQgY29sdW1ucyBmaXJzdAogIGRpc3RpbmN0KCkKCiMgU3RlcCAyOiBQaXZvdCB0byBsb25nIGZvcm1hdCBzbyB0aGF0IGVhY2ggcm93IGlzIG9uZSByYWNlIG9wdGlvbiBwZXIgcGFydGljaXBhbnQsIHRoZW4gZmlsdGVyIGZvciBpbmRpY2F0b3IgPT0gMQpyYWNlX2xvbmcgPC0gcmFjZV9kYXRhICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYWxsX29mKHJhY2VfdmFycyksIG5hbWVzX3RvID0gIlJhY2UiLCB2YWx1ZXNfdG8gPSAiaW5kaWNhdG9yIikgJT4lCiAgZmlsdGVyKGluZGljYXRvciA9PSAxKQoKIyBTdGVwIDM6IENvbXB1dGUgY291bnRzIGJ5IGNvbmRpdGlvbiBmb3IgZWFjaCBSYWNlIG9wdGlvbgpyYWNlX2NvdW50cyA8LSByYWNlX2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmFjZSwgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpCgojIFN0ZXAgNDogQ29tcHV0ZSBkZW5vbWluYXRvcnMgKHRvdGFsIHBhcnRpY2lwYW50cykgcGVyIGNvbmRpdGlvbgpkZW5vbSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gImRlbm9tIikKCiMgU3RlcCA1OiBKb2luIGRlbm9taW5hdG9ycyBhbmQgY29tcHV0ZSBwZXJjZW50YWdlcyBmb3IgZWFjaCBSYWNlIG9wdGlvbiBwZXIgY29uZGl0aW9uCnJhY2VfY291bnRzIDwtIHJhY2VfY291bnRzICU+JQogIGxlZnRfam9pbihkZW5vbSwgYnkgPSAiY29uZGl0aW9uIikgJT4lCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSByb3VuZChjb3VudCAvIGRlbm9tICogMTAwLCAxKSkKCiMgU3RlcCA2OiBQaXZvdCB3aWRlciBzbyB0aGF0IGVhY2ggcmFjZSBvcHRpb24gaXMgb25lIHJvdy4KcmFjZV93aWRlIDwtIHJhY2VfY291bnRzICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBSYWNlLCAKICAgICAgICAgICAgICBuYW1lc19mcm9tID0gY29uZGl0aW9uLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoY291bnQsIHBlcmNlbnRhZ2UpLAogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gbGlzdChjb3VudCA9IDAsIHBlcmNlbnRhZ2UgPSAwKSwKICAgICAgICAgICAgICB2YWx1ZXNfZm4gPSBsaXN0KGNvdW50ID0gc3VtLCBwZXJjZW50YWdlID0gc3VtKSkKCiMgU3RlcCA3OiBDb21wdXRlIG92ZXJhbGwgdG90YWxzIGZvciBlYWNoIFJhY2Ugb3B0aW9uCm92ZXJhbGxfZGVub20gPC0gbnJvdyhQdXJyYmxlX0xvbmdfTWFzdGVyICU+JSBkaXN0aW5jdChwc2lkKSkKb3ZlcmFsbF9jb3VudHMgPC0gcmFjZV9sb25nICU+JQogIGdyb3VwX2J5KFJhY2UpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9jb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKHRvdGFsX3BlcmNlbnRhZ2UgPSByb3VuZCh0b3RhbF9jb3VudCAvIG92ZXJhbGxfZGVub20gKiAxMDAsIDEpKQoKIyBTdGVwIDg6IE1lcmdlIG92ZXJhbGwgdG90YWxzIHdpdGggdGhlIHdpZGUgdGFibGUKcmFjZV90YWJsZSA8LSByYWNlX3dpZGUgJT4lCiAgbGVmdF9qb2luKG92ZXJhbGxfY291bnRzLCBieSA9ICJSYWNlIikKCiMgU3RlcCA5OiBSZW9yZGVyIGNvbHVtbnMgc28gdGhhdCBmb3IgZWFjaCBjb25kaXRpb24gdGhlIGNvdW50IGFuZCBwZXJjZW50YWdlIGNvbHVtbnMgYXBwZWFyIHNpZGUtYnktc2lkZSwKIyBhbmQgdGhlbiBhZGQgb3ZlcmFsbCAoVG90YWwpIGNvbHVtbnMuCmNvbmRpdGlvbnMgPC0gc29ydCh1bmlxdWUoUHVycmJsZV9Mb25nX01hc3RlciRjb25kaXRpb24pKQpvcmRlcmVkX2NvbHMgPC0gYygiUmFjZSIpCmZvciAoY29uZCBpbiBjb25kaXRpb25zKSB7CiAgb3JkZXJlZF9jb2xzIDwtIGMob3JkZXJlZF9jb2xzLCBwYXN0ZTAoImNvdW50XyIsIGNvbmQpLCBwYXN0ZTAoInBlcmNlbnRhZ2VfIiwgY29uZCkpCn0Kb3JkZXJlZF9jb2xzIDwtIGMob3JkZXJlZF9jb2xzLCAidG90YWxfY291bnQiLCAidG90YWxfcGVyY2VudGFnZSIpCnJhY2VfdGFibGUgPC0gcmFjZV90YWJsZSAlPiUgc2VsZWN0KGFsbF9vZihvcmRlcmVkX2NvbHMpKQoKIyBTdGVwIDEwOiBDcmVhdGUgYSBzcGFubmluZyBoZWFkZXI6CiMgRmlyc3QgY29sdW1uOiAiUmFjZSIsIHRoZW4gZWFjaCBjb25kaXRpb24gc3BhbnMgMiBjb2x1bW5zIChDb3VudCBhbmQgUGVyY2VudCksIHRoZW4gIlRvdGFsIiBzcGFucyAyIGNvbHVtbnMuCmhlYWRlcl92ZWMgPC0gYygiUmFjZSIgPSAxKQpmb3IgKGNvbmQgaW4gY29uZGl0aW9ucykgewogIGhlYWRlcl92ZWMgPC0gYyhoZWFkZXJfdmVjLCBzZXROYW1lcygyLCBjb25kKSkKfQpoZWFkZXJfdmVjIDwtIGMoaGVhZGVyX3ZlYywgIlRvdGFsIiA9IDIpCgojIERpc3BsYXkgdGhlIGZpbmFsIHJhY2UgdGFibGUgd2l0aCB0aGUgc3Bhbm5pbmcgaGVhZGVyLgprYWJsZShyYWNlX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlOiBSYWNlIENvdW50cyBhbmQgUGVyY2VudGFnZXMgYnkgQ29uZGl0aW9uIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlYykKCgojIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aXRoIG11bHRpcGxlIHJhY2lhbCBpZGVudGl0aWVzIHBlciBjb25kaXRpb24KbXVsdGlwbGVfcmFjZV9jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBzZWxlY3QocHNpZCwgY29uZGl0aW9uLCBvbmVfb2YocmFjZV92YXJzKSkgJT4lICAjIHNlbGVjdCBuZWNlc3NhcnkgY29sdW1ucyBmaXJzdAogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKG11bHRpcGxlID0gcm93U3VtcyhhY3Jvc3Mob25lX29mKHJhY2VfdmFycykpLCBuYS5ybSA9IFRSVUUpID4gMSkgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobXVsdGlwbGVfY291bnQgPSBzdW0obXVsdGlwbGUpLCAuZ3JvdXBzID0gImRyb3AiKQoKIyBQcmludCBvdXRwdXQgbWVzc2FnZXMgZm9yIGVhY2ggY29uZGl0aW9uCm11bHRpcGxlX3JhY2VfY291bnRzICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUobWVzc2FnZSA9IHBhc3RlMChtdWx0aXBsZV9jb3VudCwgIiBwZW9wbGUgaW4gdGhlICIsIGNvbmRpdGlvbiwgIiBjb25kaXRpb24gcmVwb3J0ZWQgbXVsdGlwbGUgcmFjaWFsIGlkZW50aXRpZXMuIikpICU+JQogIHB1bGwobWVzc2FnZSkgJT4lCiAgcGFzdGUoY29sbGFwc2UgPSAiXG4iKSAlPiUKICBjYXQoKQoKYGBgCgojIFBhcnRpY2lwYXRpb24gT3ZlciBUaW1lIGFuZCBBdHRyaXRpb24KCiMjIENvdW50IG9mIFBhcnRpY2lwYXRpb24gYnkgR3JvdXAgT3ZlciBUaW1lClBhcnRpY2lwYXRpb24gaW4gRWFjaCBXZWVrIG92ZXIgVGltZSBOb3RlOiBXZWVrIDAgd2FzICJpbnRha2UuIiBXZWVrcyAxLTMgd2VyZSBjb25zaWRlcmVkIOKAnHByZS10ZXN0LuKAnSBQdXJyYmxlIHdhcyBnaXZlbiAob3Igbm90KSBhZnRlciB3ZWVrIDMuIFdlZWtzIDExLTEzIGFyZSBjb25zaWRlcmVkIOKAnFBvc3QtdGVzdOKAnS4KRm9yIGVhY2ggd2VlayAoMOKAkzEzKSwgd2UgY291bnQgdGhlIG51bWJlciBvZiB1bmlxdWUgcGFydGljaXBhbnRzIG92ZXJhbGwsIGFuZCB0aGVuIGJyZWFrIGRvd24gcGFydGljaXBhdGlvbiBieSBjb25kaXRpb24uIFRoZXNlIHN1bW1hcmllcyBoZWxwIHVzIHVuZGVyc3RhbmQgYXR0ZW5kYW5jZSB0cmVuZHMgZHVyaW5nIGludGFrZSwgcHJlLXRlc3QsIGludGVydmVudGlvbiwgYW5kIHBvc3QtdGVzdCBwaGFzZXMuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBPdmVyYWxsIFBhcnRpY2lwYXRpb24gYnkgV2VlawpvdmVyYWxsX3BhcnRpY2lwYXRpb24gPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpKSAlPiUKICB1bmdyb3VwKCkKCiMjIFBhcnRpY2lwYXRpb24gYnkgQ29uZGl0aW9uCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpKSAlPiUKICB1bmdyb3VwKCkKCiMjIFBhcnRpY2lwYXRpb24gYnkgR2VuZGVyIElkZW50aXR5CnBhcnRpY2lwYXRpb25fYnlfaWRlbnRpdHkgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBncm91cF9ieShXZWVrLCBpZGVudGl0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXplKG5fcGFydGljaXBhbnRzID0gbl9kaXN0aW5jdChwc2lkKSkgJT4lCiAgdW5ncm91cCgpCgojIyBQYXJ0aWNpcGF0aW9uIGJ5IENvbmRpdGlvbiBhbmQgR2VuZGVyIElkZW50aXR5CnBhcnRpY2lwYXRpb25fYnlfYm90aCA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGdyb3VwX2J5KFdlZWssIGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShuX3BhcnRpY2lwYW50cyA9IG5fZGlzdGluY3QocHNpZCkpICU+JQogIHVuZ3JvdXAoKQoKIyBBUEEtZm9ybWF0dGVkIHRhYmxlIGZvciBvdmVyYWxsIHBhcnRpY2lwYXRpb24Kb3ZlcmFsbF9wYXJ0aWNpcGF0aW9uICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgMTogQ291bnQgb2YgVG90YWwgUGFydGljaXBhdGlvbiBieSBXZWVrIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCgojIFBsb3Qgb3ZlcmFsbCBwYXJ0aWNpcGF0aW9uIG92ZXIgdGltZQpnZ3Bsb3Qob3ZlcmFsbF9wYXJ0aWNpcGF0aW9uLCBhZXMoeCA9IFdlZWssIHkgPSBuX3BhcnRpY2lwYW50cykpICsKICBnZW9tX2xpbmUoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICJDb3VudCBvZiBUb3RhbCBQYXJ0aWNpcGF0aW9uIG92ZXIgVGltZSIsCiAgICAgICB4ID0gIldlZWsiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgUGFydGljaXBhbnRzIikgKwogIHRoZW1lX21pbmltYWwoKQoKIyMjIFBhcnRpY2lwYXRpb24gYnkgQ29uZGl0aW9uIEJyZWFrZG93bgoKIyBDYWxjdWxhdGUgcGFydGljaXBhdGlvbiBjb3VudHMgYnkgV2VlayBhbmQgQ29uZGl0aW9uCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpLCAuZ3JvdXBzID0gImRyb3AiKQoKIyBQaXZvdCB0aGUgdGFibGUgc28gZWFjaCB3ZWVrIGlzIGEgcm93IGFuZCBlYWNoIGNvbmRpdGlvbiBpcyBhIGNvbHVtbgpwYXJ0aWNpcGF0aW9uX3RhYmxlIDwtIHBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIHZhbHVlc19mcm9tID0gbl9wYXJ0aWNpcGFudHMsIHZhbHVlc19maWxsID0gbGlzdChuX3BhcnRpY2lwYW50cyA9IDApKSAlPiUKICBhcnJhbmdlKFdlZWspCgojIERpc3BsYXkgdGhlIEFQQS1mb3JtYXR0ZWQgdGFibGUKcGFydGljaXBhdGlvbl90YWJsZSAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlOiBDb3VudCBvZiBQYXJ0aWNpcGF0aW9uIGJ5IFdlZWsgYW5kIENvbmRpdGlvbiIsIGZvcm1hdCA9ICJtYXJrZG93biIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKIyBQbG90IHBhcnRpY2lwYXRpb24gY291bnRzIG92ZXIgdGltZSB3aXRoIGRpZmZlcmVudCBjb2xvcmVkIGxpbmVzIGJ5IGNvbmRpdGlvbgpnZ3Bsb3QocGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24sIGFlcyh4ID0gV2VlaywgeSA9IG5fcGFydGljaXBhbnRzLCBjb2xvciA9IGNvbmRpdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICJDb3VudCBvZiBUb3RhbCBQYXJ0aWNpcGF0aW9uIG92ZXIgVGltZSBieSBDb25kaXRpb24iLAogICAgICAgeCA9ICJXZWVrIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQpgYGAKCiMjIE51bWJlciBvZiBTZXNzaW9ucyBBdHRlbmRlZAoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgSWRlbnRpZnkgYXR0ZW5kYW5jZSBjb2x1bW5zICh0aG9zZSBzdGFydGluZyB3aXRoICJXZWVrXyIpCmF0dGVuZGFuY2VfY29scyA8LSBncmVwKCJeV2Vla18iLCBuYW1lcyhQdXJyYmxlX01hc3Rlcl9XaWRlKSwgdmFsdWUgPSBUUlVFKQoKIyBDYWxjdWxhdGUgdG90YWwgc2Vzc2lvbnMgYXR0ZW5kZWQgcGVyIHBhcnRpY2lwYW50ClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUodG90YWxfc2Vzc2lvbnMgPSByb3dTdW1zKGFjcm9zcyhhbGxfb2YoYXR0ZW5kYW5jZV9jb2xzKSkpKQoKIyBPdmVyYWxsIHNlc3Npb25zIGF0dGVuZGVkCm92ZXJhbGxfc2Vzc2lvbnMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBzdW1tYXJpemUobWVhbl9zZXNzaW9ucyA9IG1lYW4odG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX3Nlc3Npb25zID0gc2QodG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSkpCgojIFNlc3Npb25zIGF0dGVuZGVkIGJ5IENvbmRpdGlvbgpzZXNzaW9uc19ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgR2VuZGVyIElkZW50aXR5CnNlc3Npb25zX2J5X2lkZW50aXR5IDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgQ29uZGl0aW9uIGFuZCBHZW5kZXIgSWRlbnRpdHkKc2Vzc2lvbnNfYnlfYm90aCA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgQVBBLWZvcm1hdHRlZCB0YWJsZXMKb3ZlcmFsbF9zZXNzaW9ucyAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDI6IE92ZXJhbGwgVG90YWwgU2Vzc2lvbnMgQXR0ZW5kZWQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2NvbmRpdGlvbiAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDM6IFRvdGFsIFNlc3Npb25zIEF0dGVuZGVkIGJ5IENvbmRpdGlvbiIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKc2Vzc2lvbnNfYnlfaWRlbnRpdHkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA0OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBHZW5kZXIgSWRlbnRpdHkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2JvdGggJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA1OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBDb25kaXRpb24gYW5kIEdlbmRlciBJZGVudGl0eSIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKYGBgCgoKCgoKIyMgQXR0cml0aW9uIEFuYWx5c2lzCkF0dHJpdGlvbiBpcyBkZWZpbmVkIGhlcmUgYXMgbm90IGhhdmluZyBhdHRlbmRlZCBhbnkgcG9zdC10ZXN0IHNlc3Npb24gKGkuZS4sIG5vIGF0dGVuZGFuY2UgZHVyaW5nIFdlZWtzIDEx4oCTMTMpLiBXZSBjcmVhdGUgYSBiaW5hcnkgaW5kaWNhdG9yIGZvciBwb3N0LXRlc3QgY29tcGxldGlvbiAoMSA9IGF0dGVuZGVkIGF0IGxlYXN0IG9uZSBwb3N0LXRlc3Qgc2Vzc2lvbiwgMCA9IG5vbmUpIGFuZCBjYWxjdWxhdGUgYXR0cml0aW9uIHJhdGVzIG92ZXJhbGwsIGJ5IGNvbmRpdGlvbiBhbmQgYnkgZ2VuZGVyIGlkZW50aXR5LiBXZSB1c2VkIGEgY2hpLXNxdWFyZSB0ZXN0IHRvIGRldGVybWluZSBpZiBhdHRyaXRpb24gZGlmZmVyZWQgYnkgY29uZGl0aW9uOyBpdCBkaWQgbm90LiAKCgojIyMgQXR0cml0aW9uIGJ5IENvbmRpdGlvbgoKIyMjIyBSZXN1bHRzIGZvciBNYW51c2NyaXB0OgpUaGUgY29uZGl0aW9ucyBkaWQgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyIG9uIGFueSBvZiB0aGUgYmFzZWxpbmUgbWVhc3VyZXMgb2Ygb3V0Y29tZXMgb3IgYnkgYWdlLiBBdHRyaXRpb24gcmF0ZXMgd2VyZSBsb3cgYWNyb3NzIGJvdGggY29uZGl0aW9ucywgd2l0aCA5LjIlIG9mIHBhcnRpY2lwYW50cyBpbiB0aGUgUHVycmJsZSBjb25kaXRpb24gYW5kIDYuNSUgaW4gdGhlIFdhaXRsaXN0IENvbnRyb2wgY29uZGl0aW9uIG5vdCBjb21wbGV0aW5nIHRoZSBzdHVkeS4gIEF0dHJpdGlvbiBkaWQgbm90IGRpZmZlciBieSBjb25kaXRpb24sIM+HwrIoMSkgPSAwLjExLCBwID0gLjc1LCBvciBieSBnZW5kZXIgaWRlbnRpdHksIM+HwrIoMSkgPCAwLjAxLCBwID0gMS4KCmBgYHtyfQojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMjIFJldmlzZWQgQXR0cml0aW9uIEFuYWx5c2lzIHdpdGggQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIENvdW50cwoKIyBEZWZpbmUgcG9zdC10ZXN0IGF0dGVuZGFuY2UgY29sdW1ucyAoV2Vla3MgMTEsIDEyLCAxMykKcG9zdF90ZXN0X2NvbHMgPC0gYygiV2Vla18xMSIsICJXZWVrXzEyIiwgIldlZWtfMTMiKQoKIyBDcmVhdGUgYXR0cml0aW9uIGluZGljYXRvcjogcG9zdF90ZXN0X2NvbXBsZXRlID0gMSBpZiBhbnkgcG9zdC10ZXN0IHNlc3Npb24gYXR0ZW5kZWQsIDAgb3RoZXJ3aXNlClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUocG9zdF90ZXN0X2NvbXBsZXRlID0gaWZfZWxzZShyb3dTdW1zKGFjcm9zcyhhbGxfb2YocG9zdF90ZXN0X2NvbHMpKSkgPiAwLCAxLCAwKSkKCiMgLS0tIFN0YXRpc3RpY2FsIFRlc3RzIGZvciBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIC0tLQoKIyBDcmVhdGUgYSBjb250aW5nZW5jeSB0YWJsZSBmb3IgY29uZGl0aW9uIGJ5IHBvc3QtdGVzdCBjb21wbGV0aW9uIHN0YXR1cwphdHRyaXRpb25fY3QgPC0gdGFibGUoUHVycmJsZV9NYXN0ZXJfV2lkZSRjb25kaXRpb24sIFB1cnJibGVfTWFzdGVyX1dpZGUkcG9zdF90ZXN0X2NvbXBsZXRlKQoKIyBDaGktc3F1YXJlIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIGF0dHJpdGlvbiBieSBjb25kaXRpb24KY2hpX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGF0dHJpdGlvbl9jdCkKY2F0KCJDaGktc3F1YXJlIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIGF0dHJpdGlvbiBieSBjb25kaXRpb246XG4iKQpwcmludChjaGlfcmVzdWx0KQoKIyBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIHdpdGggYWRkaXRpb25hbCBjb2x1bW5zIGZvciBDb21wbGV0ZWQgYW5kIE5vdCBDb21wbGV0ZWQgY291bnRzCmF0dHJpdGlvbl9ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZSgKICAgIG4gPSBuKCksCiAgICBDb21wbGV0ZWQgPSBzdW0ocG9zdF90ZXN0X2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgTm90X0NvbXBsZXRlZCA9IG4gLSBDb21wbGV0ZWQsCiAgICBhdHRyaXRpb25fcmF0ZSA9IDEgLSBtZWFuKHBvc3RfdGVzdF9jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIGF0dHJpdGlvbl9wZXJjZW50ID0gcm91bmQoYXR0cml0aW9uX3JhdGUgKiAxMDAsIDEpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCgojIERpc3BsYXkgdGhlIEFQQS1mb3JtYXR0ZWQgdGFibGVzIGZvciB0aGUgcmV2aXNlZCBhdHRyaXRpb24gYW5hbHlzZXMKYXR0cml0aW9uX2J5X2NvbmRpdGlvbiAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDc6IEF0dHJpdGlvbiBSYXRlIGJ5IENvbmRpdGlvbiAod2l0aCBDb21wbGV0ZWQgYW5kIE5vdCBDb21wbGV0ZWQgY291bnRzKSIsIGZvcm1hdCA9ICJtYXJrZG93biIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKCiMjIyBBdHRyaXRpb24gYnkgYmFzZWxpbmUgT3V0Y29tZXMKYGBge3J9CiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeShkcGx5cikKbGlicmFyeShicm9vbSkKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBFbnN1cmUgdGhhdCB0aGUgYXR0cml0aW9uIGluZGljYXRvciBpcyBhbHJlYWR5IGluIHRoZSBkYXRhc2V0OgojIChwb3N0X3Rlc3RfY29tcGxldGUgPSAxIGlmIGF0dGVuZGVkIGFueSBwb3N0LXRlc3Qgc2Vzc2lvbiwgMCBvdGhlcndpc2UpCiMgQ3JlYXRlIGFuIGF0dHJpdGlvbl9zdGF0dXMgdmFyaWFibGU6ICJDb21wbGV0ZXIiIGlmIHBvc3RfdGVzdF9jb21wbGV0ZSBpcyAxLCBlbHNlICJBdHRyaXRlciIKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShhdHRyaXRpb25fc3RhdHVzID0gaWZfZWxzZShwb3N0X3Rlc3RfY29tcGxldGUgPT0gMSwgIkNvbXBsZXRlciIsICJBdHRyaXRlciIpKQoKIyBDb252ZXJ0ICdjb25kaXRpb24nIGFuZCAnYXR0cml0aW9uX3N0YXR1cycgdG8gZmFjdG9ycwpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICBhdHRyaXRpb25fc3RhdHVzID0gYXMuZmFjdG9yKGF0dHJpdGlvbl9zdGF0dXMpKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcwpwcmVfdmFycyAgPC0gYygiUHJlX0RFUlM4X1N1bSIsICJQcmVfR0FEN19TdW0iLCAiUHJlX1BIUTlfU3VtIiwKICAgICAgICAgICAgICAgIlByZV9TSFNfUGF0aHdheXMiLCAiUHJlX1NIU19BZ2VuY3kiLCAiUHJlX1NIU19Ub3RhbEhvcGUiLAogICAgICAgICAgICAgICAiUHJlX3VjbGFfU3VtIiwgIlByZV9wbWVycV9Gb2N1c19BdmciLCAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsICJQcmVfcG1lcnFfQURfQXZnIikKCiMgUnVuIHR3by13YXkgQU5PVkFzIGZvciBlYWNoIHByZS10ZXN0IHZhcmlhYmxlIHVzaW5nIGNvbmRpdGlvbiBhbmQgYXR0cml0aW9uX3N0YXR1cyBhcyBmYWN0b3JzLAojIHRoZW4gdGlkeSBhbmQgZGlzcGxheSB0aGUgcmVzdWx0cy4KYW5vdmFfdGFibGVfbGlzdCA8LSBsYXBwbHkocHJlX3ZhcnMsIGZ1bmN0aW9uKHZhcikgewogICMgQ3JlYXRlIHRoZSBmb3JtdWxhOiBlLmcuLCBQcmVfUEhROV9TdW0gfiBjb25kaXRpb24gKiBhdHRyaXRpb25fc3RhdHVzCiAgbW9kZWwgPC0gYW92KGFzLmZvcm11bGEocGFzdGUodmFyLCAifiBjb25kaXRpb24gKiBhdHRyaXRpb25fc3RhdHVzIikpLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKICB0aWR5KG1vZGVsKQp9KQpuYW1lcyhhbm92YV90YWJsZV9saXN0KSA8LSBwcmVfdmFycwoKIyBQcmludCBhIHNlcGFyYXRlIEFQQS1zdHlsZWQgdGFibGUgZm9yIGVhY2ggcHJlLXRlc3QgdmFyaWFibGUncyBBTk9WQSByZXN1bHRzCmZvciAodmFyIGluIHByZV92YXJzKSB7CiAgY2F0KCJUd28td2F5IEFOT1ZBIHJlc3VsdHMgZm9yIiwgdmFyLCAiOlxuIikKICBwcmludChrYWJsZShhbm92YV90YWJsZV9saXN0W1t2YXJdXSwgZGlnaXRzID0gMywKICAgICAgICAgICAgICBjYXB0aW9uID0gcGFzdGUoIlR3by13YXkgQU5PVkEgZm9yIiwgdmFyLCAiYnkgQ29uZGl0aW9uIGFuZCBBdHRyaXRpb24gU3RhdHVzIiksCiAgICAgICAgICAgICAgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAgICAgICAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkpCiAgY2F0KCJcblxuIikKfQoKYGBgCgoKCgojIyMjIEF0dHJpdGlvbiBieSBiYXNlbGluZSBPdXRjb21lcyBmb2xsb3ctdXAvZXhwbG9yYWl0b24KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIEVuc3VyZSB0aGF0IGNvbmRpdGlvbiBhbmQgYXR0cml0aW9uX3N0YXR1cyBhcmUgZmFjdG9ycwpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICBhdHRyaXRpb25fc3RhdHVzID0gYXMuZmFjdG9yKGF0dHJpdGlvbl9zdGF0dXMpKQoKIyBDb21wdXRlIGRlc2NyaXB0aXZlcyBmb3IgUHJlX3VjbGFfU3VtIGJ5IGNvbmRpdGlvbiBhbmQgYXR0cml0aW9uX3N0YXR1cwpncm91cF9kZXNjIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBhdHRyaXRpb25fc3RhdHVzKSAlPiUKICBzdW1tYXJpc2UoCiAgICBOID0gbigpLAogICAgTWVhbiA9IHJvdW5kKG1lYW4oUHJlX3VjbGFfU3VtLCBuYS5ybSA9IFRSVUUpLCAyKSwKICAgIFNEID0gcm91bmQoc2QoUHJlX3VjbGFfU3VtLCBuYS5ybSA9IFRSVUUpLCAyKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgojIERpc3BsYXkgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgdGFibGUgdXNpbmcgcmVtcHN5YydzIG5pY2VfdGFibGUKbmljZV90YWJsZShncm91cF9kZXNjLCAKICAgICAgICAgICB0aXRsZSA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBQcmVfdWNsYV9TdW0gYnkgQ29uZGl0aW9uIGFuZCBBdHRyaXRpb24gU3RhdHVzIiwgCiAgICAgICAgICAgbm90ZSA9ICJNZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgUHJlX3VjbGFfU3VtIGFjcm9zcyBmb3VyIGdyb3VwcyBkZWZpbmVkIGJ5IGNvbmRpdGlvbiAoUHVycmJsZSwgV2FpdGxpc3QgQ29udHJvbCkgYW5kIGF0dHJpdGlvbiBzdGF0dXMgKENvbXBsZXRlciwgQXR0cml0ZXIpLiIpCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV90X3Rlc3QgYW5kIG5pY2VfdGFibGUKCiMgRW5zdXJlIHRoYXQgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzIGFyZSBmYWN0b3JzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksCiAgICAgICAgIGF0dHJpdGlvbl9zdGF0dXMgPSBhcy5mYWN0b3IoYXR0cml0aW9uX3N0YXR1cykpCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFB1cnJibGUgY29uZGl0aW9uCnB1cnJibGVfdHRlc3QgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lIGZpbHRlcihjb25kaXRpb24gPT0gIjEiKSwKICByZXNwb25zZSA9ICJQcmVfdWNsYV9TdW0iLAogIGdyb3VwID0gImF0dHJpdGlvbl9zdGF0dXMiLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFdhaXRsaXN0IENvbnRyb2wgY29uZGl0aW9uCndhaXRsaXN0X3R0ZXN0IDwtIG5pY2VfdF90ZXN0KAogIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JSBmaWx0ZXIoY29uZGl0aW9uID09ICIwIiksCiAgcmVzcG9uc2UgPSAiUHJlX3VjbGFfU3VtIiwKICBncm91cCA9ICJhdHRyaXRpb25fc3RhdHVzIiwKICB3YXJuaW5nID0gRkFMU0UKKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRzIHVzaW5nIHJlbXBzeWMncyBuaWNlX3RhYmxlCmNhdCgiU2ltcGxlIEVmZmVjdHMgQW5hbHlzaXM6IFByZV91Y2xhX1N1bSBieSBBdHRyaXRpb24gU3RhdHVzIHdpdGhpbiB0aGUgUHVycmJsZSBDb25kaXRpb25cbiIpCm5pY2VfdGFibGUocHVycmJsZV90dGVzdCkKCmNhdCgiXG5TaW1wbGUgRWZmZWN0cyBBbmFseXNpczogUHJlX3VjbGFfU3VtIGJ5IEF0dHJpdGlvbiBTdGF0dXMgd2l0aGluIHRoZSBXYWl0bGlzdCBDb250cm9sIENvbmRpdGlvblxuIikKbmljZV90YWJsZSh3YWl0bGlzdF90dGVzdCkKCmBgYAoKCiMjIyBBdHRyaXRpb24gYnkgR2VuZGVyIElkZW50aXR5CgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBSZXZpc2VkIEF0dHJpdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBDb3VudHMKCiMgRGVmaW5lIHBvc3QtdGVzdCBhdHRlbmRhbmNlIGNvbHVtbnMgKFdlZWtzIDExLCAxMiwgMTMpCnBvc3RfdGVzdF9jb2xzIDwtIGMoIldlZWtfMTEiLCAiV2Vla18xMiIsICJXZWVrXzEzIikKCiMgQ3JlYXRlIGF0dHJpdGlvbiBpbmRpY2F0b3I6IHBvc3RfdGVzdF9jb21wbGV0ZSA9IDEgaWYgYW55IHBvc3QtdGVzdCBzZXNzaW9uIGF0dGVuZGVkLCAwIG90aGVyd2lzZQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHBvc3RfdGVzdF9jb21wbGV0ZSA9IGlmX2Vsc2Uocm93U3VtcyhhY3Jvc3MoYWxsX29mKHBvc3RfdGVzdF9jb2xzKSkpID4gMCwgMSwgMCkpCgojIC0tLSBTdGF0aXN0aWNhbCBUZXN0cyBmb3IgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiAtLS0KCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIGNvbmRpdGlvbiBieSBwb3N0LXRlc3QgY29tcGxldGlvbiBzdGF0dXMKYXR0cml0aW9uX2N0IDwtIHRhYmxlKFB1cnJibGVfTWFzdGVyX1dpZGUkaWRlbnRpdHlfZ3JvdXAsIFB1cnJibGVfTWFzdGVyX1dpZGUkcG9zdF90ZXN0X2NvbXBsZXRlKQoKIyBDaGktc3F1YXJlIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIGF0dHJpdGlvbiBieSBkbwpjaGlfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYXR0cml0aW9uX2N0KQpjYXQoIkNoaS1zcXVhcmUgdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gYXR0cml0aW9uIGJ5IGdlbmRlciBpZGVudGl0eTpcbiIpCnByaW50KGNoaV9yZXN1bHQpCgojIEF0dHJpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkgd2l0aCBhZGRpdGlvbmFsIGNvdW50cwphdHRyaXRpb25fYnlfaWRlbnRpdHkgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShpZGVudGl0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXplKAogICAgbiA9IG4oKSwKICAgIENvbXBsZXRlZCA9IHN1bShwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICBOb3RfQ29tcGxldGVkID0gbiAtIENvbXBsZXRlZCwKICAgIGF0dHJpdGlvbl9yYXRlID0gMSAtIG1lYW4ocG9zdF90ZXN0X2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgYXR0cml0aW9uX3BlcmNlbnQgPSByb3VuZChhdHRyaXRpb25fcmF0ZSAqIDEwMCwgMSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKYXR0cml0aW9uX2J5X2lkZW50aXR5ICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgODogQXR0cml0aW9uIFJhdGUgYnkgR2VuZGVyIElkZW50aXR5ICh3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBjb3VudHMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKIyBQcmVsaW1pbmFyeSBBbmFseXNpcyAKCgoKCiMjIEJhc2VsaW5lIERpZmZlcmVuY2VzIGluIE91dGNvbWVzIGJ5IENvbmRpdGlvbgoKIyMjIE91dGxpZXIgRGV0ZWN0aW9uIGFuZCBWaXN1YWxpemF0aW9uIDoKV2UgZmlyc3QgY29udmVydCBlYWNoIHByZeKAkXRlc3QgdmFyaWFibGUgdG8geuKAkXNjb3JlcyBhbmQgZmxhZyBhbnkgb2JzZXJ2YXRpb25zIHdpdGggYW4gYWJzb2x1dGUgeuKAkXNjb3JlIGdyZWF0ZXIgdGhhbiAzIGFzIHBvdGVudGlhbCBvdXRsaWVycy4gQSBzdW1tYXJ5IHRhYmxlIGlzIGNyZWF0ZWQgdGhhdCBsaXN0cyB0aGUgbnVtYmVyIG9mIG91dGxpZXJzIGZvciBlYWNoIHZhcmlhYmxlLiBXZSB0aGVuIHNwZWNpZmljYWxseSBpbnNwZWN0IHRoZSBvdXRsaWVycyBmb3IgdGhlIFByZV9wbWVycV9Gb2N1c19BdmcgdmFyaWFibGUsIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZSB0d28gY2FzZXMgZXhjZWVkaW5nIG91ciB0aHJlc2hvbGQuClRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBkaXN0cmlidXRpb24gb2YgUHJlX3BtZXJxX0ZvY3VzX0F2Zywgd2UgZ2VuZXJhdGUgYSBib3hwbG90ICh3aXRoIGppdHRlcmVkIGRhdGEgcG9pbnRzKSB0aGF0IHZpc3VhbGx5IGhpZ2hsaWdodHMgdGhlIGV4dHJlbWUgdmFsdWVzLgoKYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcyAKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIFNldCB0aHJlc2hvbGQgZm9yIG91dGxpZXJzIChjb21tb25seSB8enwgPiAzKQp0aHJlc2hvbGQgPC0gMwoKIyBDb21wdXRlIHotc2NvcmVzIGFuZCBpZGVudGlmeSBvdXRsaWVycyBmb3IgZWFjaCBwcmUtdGVzdCB2YXJpYWJsZQpvdXRsaWVyX2xpc3QgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogICAgc2VsZWN0KHBzaWQsIGFsbF9vZih2YXIpKSAlPiUKICAgIG11dGF0ZSh6ID0gYXMubnVtZXJpYyhzY2FsZShnZXQodmFyKSkpKSAlPiUKICAgIGZpbHRlcihhYnMoeikgPiB0aHJlc2hvbGQpCn0pCm5hbWVzKG91dGxpZXJfbGlzdCkgPC0gcHJlX3ZhcnMKCiMgQ3JlYXRlIGEgc3VtbWFyeSB0YWJsZSBvZiB0aGUgbnVtYmVyIG9mIG91dGxpZXJzIHBlciB2YXJpYWJsZQpvdXRsaWVyX3N1bW1hcnkgPC0gc2FwcGx5KG91dGxpZXJfbGlzdCwgbnJvdykKb3V0bGllcl9zdW1tYXJ5X2RmIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSBuYW1lcyhvdXRsaWVyX3N1bW1hcnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0bGllcl9Db3VudCA9IGFzLnZlY3RvcihvdXRsaWVyX3N1bW1hcnkpKQoKY2F0KCJTdW1tYXJ5IG9mIFBvdGVudGlhbCBPdXRsaWVycyAofHp8ID4gMykgZm9yIFByZS1UZXN0IFZhcmlhYmxlczpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfc3VtbWFyeV9kZiwgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIE91dGxpZXJzIGZvciBQcmUtVGVzdCBWYXJpYWJsZXMgKHx6fCA+IDMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikpCgoKY2F0KCJcbk91dGxpZXJzIGZvciBQcmVfcG1lcnFfRm9jdXNfQXZnICh8enwgPiAzKTpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfbGlzdFtbIlByZV9wbWVycV9Gb2N1c19BdmciXV0sIGNhcHRpb24gPSAiT3V0bGllcnMgZm9yIFByZV9wbWVycV9Gb2N1c19BdmciLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKCmxpYnJhcnkoZ2dwbG90MikKCiMgQm94cGxvdCBmb3IgUHJlX3BtZXJxX0ZvY3VzX0F2ZwpnZ3Bsb3QoUHVycmJsZV9NYXN0ZXJfV2lkZSwgYWVzKHggPSAiIiwgeSA9IFByZV9wbWVycV9Gb2N1c19BdmcpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gInJlZCIsIG91dGxpZXIuc2hhcGUgPSAxNiwgb3V0bGllci5zaXplID0gMykgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIlByZV9wbWVycV9Gb2N1c19BdmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCiMjIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIG9mIEJhc2VsaW5lIE91dGNvbWVzOgpXZSBjb21wdXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgbWluaW11bSwgbWF4aW11bSwgc2tld25lc3MsIGFuZCBrdXJ0b3NpcykgZm9yIGFsbCBwcmXigJF0ZXN0IHZhcmlhYmxlcyB1c2luZyB0aGUgcHN5Y2ggcGFja2FnZS4gVGhlIHJlc3VsdGluZyBzdW1tYXJ5IGlzIHRoZW4gZm9ybWF0dGVkIGludG8gYW4gQVBB4oCRc3R5bGUgdGFibGUgdXNpbmcgdGhlIG5pY2VfdGFibGUgZnVuY3Rpb24gZnJvbSB0aGUgcmVtcHN5YyBwYWNrYWdlLgoKYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcyAKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB1c2luZyBwc3ljaDo6ZGVzY3JpYmUgZm9yIHRoZSBwcmUtdGVzdCB2YXJpYWJsZXMKZGVzY19wcmUgPC0gZGVzY3JpYmUoUHVycmJsZV9NYXN0ZXJfV2lkZVssIHByZV92YXJzXSkKCiMgQ29udmVydCB0aGUgb3V0cHV0IHRvIGEgbmVhdCBkYXRhIGZyYW1lIHdpdGggZGVzaXJlZCBjb2x1bW5zLgojICdkZXNjcmliZScgcmV0dXJucyByb3duYW1lcyBhcyB2YXJpYWJsZSBuYW1lcy4KZGVzY190YWJsZSA8LSBkYXRhLmZyYW1lKAogIFZhcmlhYmxlID0gcm93bmFtZXMoZGVzY19wcmUpLAogIE1lYW4gPSByb3VuZChkZXNjX3ByZSRtZWFuLCAyKSwKICBTRCA9IHJvdW5kKGRlc2NfcHJlJHNkLCAyKSwKICBNaW4gPSBkZXNjX3ByZSRtaW4sCiAgTWF4ID0gZGVzY19wcmUkbWF4LAogIFNrZXcgPSByb3VuZChkZXNjX3ByZSRza2V3LCAyKSwKICBLdXJ0b3NpcyA9IHJvdW5kKGRlc2NfcHJlJGt1cnRvc2lzLCAyKQopCgojIERpc3BsYXkgdGhlIHRhYmxlIGluIEFQQSBzdHlsZSB1c2luZyByZW1wc3ljJ3MgbmljZV90YWJsZQpuaWNlX3RhYmxlKGRlc2NfdGFibGUpCgpgYGAKCiMjIyBCYXNlbGluZSBFcXVpdmFsZW5jZSBvZiBCYXNlbGluZSBPdXRjb21lcyAodOKAkVRlc3RzKToKRmluYWxseSwgd2UgcnVuIGluZGVwZW5kZW50IHNhbXBsZXMgdOKAkXRlc3RzIGNvbXBhcmluZyB0aGUgdHdvIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIG9uIGVhY2ggcHJl4oCRdGVzdCB2YXJpYWJsZSB1c2luZyBuaWNlX3RfdGVzdCBmcm9tIHJlbXBzeWMuIFRoaXMgcHJvdmlkZXMgdOKAkXN0YXRpc3RpY3MsIGRlZ3JlZXMgb2YgZnJlZWRvbSwgcOKAkXZhbHVlcywgZWZmZWN0IHNpemVzIChDb2hlbidzIGQpLCBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFsbCBmb3JtYXR0ZWQgaW50byBhbiBBUEHigJFzdHlsZSB0YWJsZS4KCiMjIyMjIFJlc3VsdDogTm8gZGlmZmVyZW5jZXMgYnkgY2hhbmNlLgoKYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcyAKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgoKIyBSdW4gdC10ZXN0cyBmb3IgYWxsIHByZeKAkXRlc3Qgb3V0Y29tZXMgYnkgY29uZGl0aW9uCnN0YXRzLnRhYmxlLnByZSA8LSBuaWNlX3RfdGVzdCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9IHByZV92YXJzLAogIGdyb3VwID0gImNvbmRpdGlvbiIsCiAgd2FybmluZyA9IEZBTFNFCikKCiMgRGlzcGxheSB0aGUgcHJl4oCRdGVzdCB0LXRlc3QgdGFibGUgaW4gQVBBIHN0eWxlCm5pY2VfdGFibGUoc3RhdHMudGFibGUucHJlKQpgYGAKCiMgTWFpbiBFZmZlY3RzIEFuYWx5c2VzCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShyZW1wc3ljKSAgICMgZm9yIG5pY2VfbG0gYW5kIG5pY2VfdGFibGUKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcG9zdOKAkXRlc3Qgb3V0Y29tZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJl4oCRdGVzdCBjb3ZhcmlhdGVzCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsIAogICAgICAgICAgICAgICAiUG9zdF9wbWVycV9BRF9BdmciLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIiwgCiAgICAgICAgICAgICAgICJQb3N0X1NIU19QYXRod2F5cyIsICJQb3N0X1NIU19BZ2VuY3kiLCAiUG9zdF9TSFNfVG90YWxIb3BlIiwgIlBvc3RfdWNsYV9TdW0iKQpwcmVfdmFycyAgPC0gc3ViKCJeUG9zdF8iLCAiUHJlXyIsIHBvc3RfdmFycykKCiMgQ3JlYXRlIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgcmVncmVzc2lvbiBtb2RlbHMKbW9kZWxfbGlzdCA8LSBsaXN0KCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggb3V0Y29tZSBwYWlyCmZvciAoaSBpbiBzZXFfYWxvbmcocG9zdF92YXJzKSkgewogIG91dGNvbWUgPC0gcG9zdF92YXJzW2ldCiAgcHJlX3ZhciA8LSBwcmVfdmFyc1tpXQogIAogICMgRml0IHRoZSByZWdyZXNzaW9uIG1vZGVsOgogICMgT3V0Y29tZSB+IGNvbmRpdGlvbl9udW0gKyBjb3JyZXNwb25kaW5nIHByZS10ZXN0IG91dGNvbWUgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UKICBmb3JtdWxhX3N0ciA8LSBwYXN0ZShvdXRjb21lLCAifiBjb25kaXRpb25fbnVtICsiLCBwcmVfdmFyLCAiKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UiKQogIG1vZGVsX2xpc3RbW291dGNvbWVdXSA8LSBsbShhcy5mb3JtdWxhKGZvcm11bGFfc3RyKSwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCn0KCiMgRm9ybWF0IHRoZSBsaXN0IG9mIG1vZGVscyB1c2luZyByZW1wc3ljJ3MgbmljZV9sbSgpIGZ1bmN0aW9uCiMgVGhpcyB3aWxsIHByb2R1Y2UgYSBjb21iaW5lZCB0YWJsZSBmb3IgYWxsIG1vZGVscywgaGlnaGxpZ2h0aW5nIHRoZSBlZmZlY3Qgb2YgY29uZGl0aW9uX251bS4KcmVzdWx0c190YWJsZSA8LSBuaWNlX2xtKG1vZGVsX2xpc3QpCgojIERpc3BsYXkgdGhlIHRhYmxlIGluIEFQQSBmb3JtYXQgdXNpbmcgbmljZV90YWJsZQpuaWNlX3RhYmxlKHJlc3VsdHNfdGFibGUsIGhpZ2hsaWdodCA9IFRSVUUpCgpgYGAKCgojIyBFbW90aW9uIFJlZ3VsYXRpb24gT3V0Y29tZXM6IE1vZGVyYXRpb24gTW9kZWxzCgpgYGB7cn0KbGlicmFyeShyZW1wc3ljKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCgojIENvbnZlcnQgaWRlbnRpdHlfZ3JvdXAgZmFjdG9yIHRvIG51bWVyaWMgY29kZXMKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cF9udW0gPSBhcy5udW1lcmljKGlkZW50aXR5X2dyb3VwKSkKCiMgTW9kZWwgMTogTW9kZXJhdGlvbiBieSBCYXNlbGluZSBjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXAKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9ERVJTOF9TdW0iLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX0RFUlM4X1N1bSIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9Gb2N1c19BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9EaXN0cmFjdF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9BRF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0FEX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKCgojIE1vZGVsIDI6IE1vZGVyYXRpb24gYnkgR2VuZGVyIElkZW50aXR5IGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X0RFUlM4X1N1bSIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfREVSUzhfU3VtIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0FEX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfQURfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCmBgYAojIyMgRm9sbG93IHVwOiBERVJTIDggClNpbmNlIHRoZSBpbnRlcmFjdGlvbiBvZiBjb25kaXRpb24gYnkgaWRlbnRpdHkgZ3JvdXAgd2FzIHNpZ25pZmlhY250LCBJIGhhdmUgdG8gcHJvYmUgaXQgdXNpbmcgc2ltcGxlIHNsb3Blcy4gCgojIyMjIFJlc3VsdDogCgpGb3IgY2lzZ2VuZGVyIHBhcnRpY2lwYW50cywgY29udHJvbGxpbmcgZm9yIHByZeKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uLCBjb25kaXRpb24gc2lnbmlmaWNhbnRseSBwcmVkaWN0ZWQgcG9zdOKAkXRlc3Qgc2NvcmVzLCB3aXRoIHRoZSBpbnRlcnZlbnRpb24geWllbGRpbmcgbG93ZXIgKGkuZS4sIGJldHRlcikgc2NvcmVzIChiID0g4oCTNC45MCwgU0UgPSAxLjQxLCB0KDY3KSA9IOKAkzMuNDcsIHAgPSAuMDAxLCBhZGp1c3RlZCBSwrIgPSAuNDcpLiBJbiBjb250cmFzdCwgZm9yIHRyYW5zZ2VuZGVyL2dlbmRlciBkaXZlcnNlIHBhcnRpY2lwYW50cywgY29uZGl0aW9uIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcG9zdOKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uIChiID0g4oCTMS4wNywgU0UgPSAxLjIzLCB0KDY3KSA9IOKAkzAuODcsIHAgPSAuMzksIGFkanVzdGVkIFLCsiA9IC4zNykuCnNhZC4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCgojIEVuc3VyZSB0aGF0IGlkZW50aXR5X2dyb3VwIGlzIGEgZmFjdG9yICh3aXRoIGxldmVscyAiMCIgZm9yIENpc2dlbmRlciBhbmQgIjEiIGZvciBUR0QpClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSBhcy5mYWN0b3IoaWRlbnRpdHlfZ3JvdXApKQoKIyBSdW4gc2VwYXJhdGUgcmVncmVzc2lvbnMgZm9yIGVhY2ggbGV2ZWwgb2YgaWRlbnRpdHlfZ3JvdXA6CiMgTW9kZWw6IFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0KCiMgRm9yIENpc2dlbmRlciAoaWRlbnRpdHlfZ3JvdXAgPT0gMCkKbW9kZWxfY2lzIDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIwIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgQ2lzZ2VuZGVyIG1vZGVsCnN1bW1hcnkobW9kZWxfY2lzKQoKIyBGb3IgVEdEIChpZGVudGl0eV9ncm91cCA9PSAxKQptb2RlbF90Z2QgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBjb25kaXRpb25fbnVtICsgUHJlX0RFUlM4X1N1bSwKICAgICAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXIoUHVycmJsZV9NYXN0ZXJfV2lkZSwgaWRlbnRpdHlfZ3JvdXAgPT0gIjEiKSkKIyBQcmludCBzdW1tYXJ5IGZvciBUR0QgbW9kZWwKc3VtbWFyeShtb2RlbF90Z2QpCgpgYGAKCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShpbnRlcmFjdGlvbnMpCmxpYnJhcnkoZ2dwbG90MikKCiMgRml0IHRoZSBtb2RlbCB1c2luZyB0aGUgZmFjdG9yIHZhcmlhYmxlcwptb2RlbF9pZGVudGl0eSA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IGNvbmRpdGlvbl9mYWN0b3IgKiBpZGVudGl0eV9ncm91cF9mYWN0b3IgKyBQcmVfREVSUzhfU3VtLCAKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIENyZWF0ZSB0aGUgaW50ZXJhY3Rpb24gcGxvdCB1c2luZyB0aGUgbmV3IGZhY3RvciB2YXJpYWJsZXMKaW50ZXJhY3RfcGxvdChtb2RlbF9pZGVudGl0eSwgCiAgICAgICAgICAgICAgcHJlZCA9IGNvbmRpdGlvbl9mYWN0b3IsIAogICAgICAgICAgICAgIG1vZHggPSBpZGVudGl0eV9ncm91cF9mYWN0b3IsIAogICAgICAgICAgICAgIGludGVydmFsID0gVFJVRSwgCiAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBUUlVFKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV9sbSBhbmQgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIERlZmluZSB0aGUgcG9zdC10ZXN0IG91dGNvbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHByZS10ZXN0IGNvdmFyaWF0ZXMKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfcG1lcnFfRm9jdXNfQXZnIiwgIlBvc3RfcG1lcnFfRGlzdHJhY3RfQXZnIiwgCiAgICAgICAgICAgICAgICJQb3N0X3BtZXJxX0FEX0F2ZyIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iLCAKICAgICAgICAgICAgICAgIlBvc3RfU0hTX1BhdGh3YXlzIiwgIlBvc3RfU0hTX0FnZW5jeSIsICJQb3N0X1NIU19Ub3RhbEhvcGUiLCAiUG9zdF91Y2xhX1N1bSIpCnByZV92YXJzICA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgcG9zdF92YXJzKQoKIyBDcmVhdGUgYW4gZW1wdHkgbGlzdCB0byBzdG9yZSByZWdyZXNzaW9uIG1vZGVscwptb2RlbF9saXN0IDwtIGxpc3QoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBvdXRjb21lIHBhaXIgYW5kIGZpdCBhIHN0YW5kYXJkIGxpbmVhciBtb2RlbApmb3IgKGkgaW4gc2VxX2Fsb25nKHBvc3RfdmFycykpIHsKICBvdXRjb21lIDwtIHBvc3RfdmFyc1tpXQogIHByZV92YXIgPC0gcHJlX3ZhcnNbaV0KICAKICAjIEZpdCB0aGUgcmVncmVzc2lvbiBtb2RlbDoKICAjIE91dGNvbWUgfiBjb25kaXRpb25fbnVtICsgY29ycmVzcG9uZGluZyBwcmUtdGVzdCBvdXRjb21lICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlCiAgZm9ybXVsYV9zdHIgPC0gcGFzdGUob3V0Y29tZSwgIn4gY29uZGl0aW9uX251bSArIiwgcHJlX3ZhciwgIisgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlIikKICBtb2RlbF9saXN0W1tvdXRjb21lXV0gPC0gbG0oYXMuZm9ybXVsYShmb3JtdWxhX3N0ciksIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQp9CgojIEZvcm1hdCB0aGUgbGlzdCBvZiBtb2RlbHMgdXNpbmcgcmVtcHN5YydzIG5pY2VfbG0oKSBmdW5jdGlvbgpyZXN1bHRzX3RhYmxlIDwtIG5pY2VfbG0obW9kZWxfbGlzdCkKCiMgRGlzcGxheSB0aGUgY29tYmluZWQgdGFibGUgaW4gQVBBIGZvcm1hdCB1c2luZyBuaWNlX3RhYmxlCm5pY2VfdGFibGUocmVzdWx0c190YWJsZSwgaGlnaGxpZ2h0ID0gVFJVRSkKYGBgCiMjIExpbmVhciBNaXhlZCBFZmZlY3RzIE1vZGVscyAKCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHRoZSB2ZWN0b3Igb2Ygb3V0Y29tZXMgKGFzIHRoZXkgYXBwZWFyIGluIHRoZSBsb25nIGRhdGFzZXQpCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJwbWVycV9Gb2N1c19BdmciLCAicG1lcnFfRGlzdHJhY3RfQXZnIiwgInBtZXJxX0FEX0F2ZyIsIAogICAgICAgICAgICAgICJHQUQ3X1N1bSIsICJQSFE5X1N1bSIsICJTSFNfUGF0aHdheXMiLCAiU0hTX0FnZW5jeSIsICJTSFNfVG90YWxIb3BlIiwgInVjbGFfU3VtIikKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIG1vZGVsIHN1bW1hcmllcwpyZXN1bHRzX2xpc3QgPC0gbGlzdCgpCgojIExvb3Agb3ZlciBlYWNoIG91dGNvbWUgYW5kIGZpdCB0aGUgbWl4ZWQtZWZmZWN0cyBtb2RlbCBjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXBfbnVtIGFuZCBhZ2UKZm9yIChvdXRjb21lIGluIG91dGNvbWVzKSB7CiAgbW9kZWwgPC0gbG1lcihhcy5mb3JtdWxhKHBhc3RlKG91dGNvbWUsICJ+IFdlZWsgKiBjb25kaXRpb24gKyBpZGVudGl0eV9ncm91cCArIGFnZSArIChXZWVrIHwgcHNpZCkiKSksCiAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9Mb25nX01hc3RlcikKICAjIFRpZHkgdGhlIG1vZGVsIG91dHB1dCBhbmQgc3RvcmUgaXQgaW4gdGhlIGxpc3QKICByZXN1bHRzX2xpc3RbW291dGNvbWVdXSA8LSB0aWR5KG1vZGVsKQp9CgojIExvb3AgdG8gcHJpbnQgZWFjaCBtb2RlbCBzdW1tYXJ5IGluIEFQQS1zdHlsZSB0YWJsZXMKZm9yIChvdXRjb21lIGluIG5hbWVzKHJlc3VsdHNfbGlzdCkpIHsKICBjYXQoIiMjIyBPdXRjb21lOiIsIG91dGNvbWUsICJcblxuIikKICBrYWJsZShyZXN1bHRzX2xpc3RbW291dGNvbWVdXSwgCiAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJNaXhlZC1FZmZlY3RzIE1vZGVsIGZvciIsIG91dGNvbWUsICJjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXAgYW5kIGFnZSIpLCAKICAgICAgICBkaWdpdHMgPSAzKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUKICAgIHByaW50KCkKICBjYXQoIlxuXG4iKQp9CgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShwZXJmb3JtYW5jZSkgICMgRm9yIHIyKCkKCiMgRGVmaW5lIHRoZSB2ZWN0b3Igb2Ygb3V0Y29tZXMgKGFzIHRoZXkgYXBwZWFyIGluIHRoZSBsb25nIGRhdGFzZXQpCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJwbWVycV9Gb2N1c19BdmciLCAicG1lcnFfRGlzdHJhY3RfQXZnIiwgInBtZXJxX0FEX0F2ZyIsIAogICAgICAgICAgICAgICJHQUQ3X1N1bSIsICJQSFE5X1N1bSIsICJTSFNfUGF0aHdheXMiLCAiU0hTX0FnZW5jeSIsICJTSFNfVG90YWxIb3BlIiwgInVjbGFfU3VtIikKCiMgSW5pdGlhbGl6ZSBhIGxpc3QgdG8gc3RvcmUgbW9kZWwgc3VtbWFyaWVzIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIGVmZmVjdCBzaXplcwpyZXN1bHRzX2xpc3QgPC0gbGlzdCgpCgojIExvb3Agb3ZlciBlYWNoIG91dGNvbWUgYW5kIGZpdCB0aGUgbWl4ZWQtZWZmZWN0cyBtb2RlbCBjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXBfbnVtIGFuZCBhZ2UKZm9yIChvdXRjb21lIGluIG91dGNvbWVzKSB7CiAgbW9kZWwgPC0gbG1lcihhcy5mb3JtdWxhKHBhc3RlKG91dGNvbWUsICJ+IFdlZWsgKiBjb25kaXRpb24gKyBpZGVudGl0eV9ncm91cCArIGFnZSArIChXZWVrIHwgcHNpZCkiKSksCiAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9Mb25nX01hc3RlcikKICAKICAjIFRpZHkgdGhlIGZpeGVkIGVmZmVjdHMgZXN0aW1hdGVzCiAgdGlkeV9tb2RlbCA8LSB0aWR5KG1vZGVsKQogIAogICMgT2J0YWluIDk1JSBjb25maWRlbmNlIGludGVydmFscyBmb3IgZml4ZWQgZWZmZWN0cyB1c2luZyB0aGUgV2FsZCBtZXRob2QKICBjaV9tb2RlbCA8LSBjb25maW50KG1vZGVsLCBtZXRob2QgPSAiV2FsZCIsIGxldmVsID0gMC45NSkKICBjaV9kZiA8LSBhcy5kYXRhLmZyYW1lKGNpX21vZGVsKQogIGNpX2RmJHRlcm0gPC0gcm93bmFtZXMoY2lfZGYpCiAgCiAgIyBNZXJnZSB0aGUgdGlkeSBvdXRwdXQgd2l0aCBjb25maWRlbmNlIGludGVydmFscwogIHRpZHlfbW9kZWwgPC0gbGVmdF9qb2luKHRpZHlfbW9kZWwsIGNpX2RmLCBieSA9ICJ0ZXJtIikKICAKICAjIENhbGN1bGF0ZSBtYXJnaW5hbCBhbmQgY29uZGl0aW9uYWwgUsKyIGFzIGVmZmVjdCBzaXplcwogIHIyX3ZhbHMgPC0gcjIobW9kZWwpCiAgCiAgIyBTdG9yZSB0aGUgcmVzdWx0cyBpbiB0aGUgbGlzdAogIHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dIDwtIGxpc3QoCiAgICBtb2RlbF9zdW1tYXJ5ID0gdGlkeV9tb2RlbCwKICAgIHIyID0gcjJfdmFscwogICkKfQoKIyBOb3csIGZvciBkZW1vbnN0cmF0aW9uLCBsZXQncyBwcmludCB0aGUgc3VtbWFyeSBmb3Igb25lIG91dGNvbWUgKGUuZy4sIERFUlM4X1N1bSkKcHJpbnQoa2FibGUocmVzdWx0c19saXN0W1siREVSUzhfU3VtIl1dW1sibW9kZWxfc3VtbWFyeSJdXSwgCiAgICAgICAgICAgIGNhcHRpb24gPSAiTWl4ZWQtRWZmZWN0cyBNb2RlbCBmb3IgREVSUzhfU3VtIHdpdGggOTUlIENJIiwgCiAgICAgICAgICAgIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkpCmNhdCgiXG4iKQpwcmludChyZXN1bHRzX2xpc3RbWyJERVJTOF9TdW0iXV1bWyJyMiJdXSkKCmZvciAob3V0Y29tZSBpbiBuYW1lcyhyZXN1bHRzX2xpc3QpKSB7CiAgIyBDcmVhdGUgYSBjYXB0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIG91dGNvbWUgbmFtZQogIGNhcHRpb25fdGV4dCA8LSBwYXN0ZSgiTWl4ZWQtRWZmZWN0cyBNb2RlbCBmb3IiLCBvdXRjb21lLCAid2l0aCA5NSUgQ0kiKQogIAogICMgUHJpbnQgdGhlIG1vZGVsIHN1bW1hcnkgd2l0aCBhIGNhcHRpb24gYW5kIGZvcm1hdHRlZCB0YWJsZQogIHByaW50KGthYmxlKHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dW1sibW9kZWxfc3VtbWFyeSJdXSwgCiAgICAgICAgICAgICAgY2FwdGlvbiA9IGNhcHRpb25fdGV4dCwgCiAgICAgICAgICAgICAgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSkKICBjYXQoIlxuIikKICAKICAjIFByaW50IHRoZSBjb3JyZXNwb25kaW5nIFLCsiB2YWx1ZShzKQogIHByaW50KHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dW1sicjIiXV0pCiAgY2F0KCJcblxuIikgICMgZXh0cmEgc3BhY2luZyBiZXR3ZWVuIG91dGNvbWVzCn0KCmBgYAoKCg==