Gut parasite infection and pesticide exposure affect bumble bee health and pollination behavior. These stressors are common in commercial tomato greenhouses, where growers deploy bumble bees for pollination. To investigate the effects of these stressors on bumble bee pollination in greenhouses, we sampled commercial bumble bee colonies for the presence of three common gut-parasites (Crithidia, Apicystis, Nosema) within three commercial tomato greenhouses that were sampled during 12-week periods of two growing seasons. We then sampled the nest material of these same colonies to detect and quantify compounds that are active ingredients in pesticides. Using grower-collected data, we monitored tomato anther bruising as a proxy for bee pollination activity, and recorded pesticide applications within the greenhouses. We found that parasite infection prevalence was correlated with total pesticide application and bumble bee colony density, but these relationships were parasite-specific. Crithidia prevalence increased with total pesticide use and decreased with bumble bee colony density. Crithidia infection was also negatively associated correlated with decreased pollination activity. In contrast, Apicystis infection decreased with total pesticide use, but increased with colony density, and was positively associated with pollination activity. We never detected Nosema in any colony. Pollination activity was not directly predicted by pesticide quantity. Nest-compound exposure revealed frequent detection of multiple pesticide compounds. We further found compound-specific associations with pathogen infection probability. Our results highlight that gut parasites, as mediated through pesticide exposure, have important effects on bumble bee pollination, but these effects are pathogen- and pesticide-specific.

Statistical Analyses

Bivariate analyses of pathogen prevelence and anther bruise score in each of the 6 greenhouses over the two sampling seasons

Input data

Crithidia

##                    Predictor Coefficient       SE Odds_Ratio  GLM_P_Value
## 4 total_pesticide_applied_ml    0.000009 0.000001   1.000009 2.666429e-19
## 3            total_fungicide    0.000026 0.000003   1.000026 2.694016e-14
## 2          total_insecticide    0.000005 0.000001   1.000005 2.187339e-09
## 1         avg_hives_in_phase   -0.008975 0.001797   0.991066 5.896558e-07
##   Anova_P_Value Anova_Chi_sqare Pseudo_R2    AIC    BIC
## 4  1.063726e-20           87.04    0.3590 189.28 188.86
## 3  3.652528e-17           70.96    0.2927 205.36 204.95
## 2  1.462365e-09           36.58    0.1509 239.74 239.32
## 1  4.482898e-07           25.47    0.1051 250.85 250.43
## --- BIVARIATE GLM RESULTS ---
##                    Predictor Coefficient       SE Odds_Ratio  GLM_P_Value
## 4 total_pesticide_applied_ml    0.000009 0.000001   1.000009 2.666429e-19
## 3            total_fungicide    0.000026 0.000003   1.000026 2.694016e-14
## 2          total_insecticide    0.000005 0.000001   1.000005 2.187339e-09
## 1         avg_hives_in_phase   -0.008975 0.001797   0.991066 5.896558e-07
##   Anova_P_Value Anova_Chi_sqare Pseudo_R2    AIC    BIC
## 4  1.063726e-20           87.04    0.3590 189.28 188.86
## 3  3.652528e-17           70.96    0.2927 205.36 204.95
## 2  1.462365e-09           36.58    0.1509 239.74 239.32
## 1  4.482898e-07           25.47    0.1051 250.85 250.43

Apicystis

##                    Predictor Coefficient       SE Odds_Ratio  GLM_P_Value
## 1         avg_hives_in_phase    0.026718 0.002609   1.027078 1.285414e-24
## 4 total_pesticide_applied_ml   -0.000005 0.000001   0.999995 1.862461e-05
## 2          total_insecticide   -0.000004 0.000001   0.999996 2.009297e-04
## 3            total_fungicide   -0.000003 0.000004   0.999997 4.041424e-01
##   Anova_P_Value Anova_Chi_sqare Pseudo_R2    AIC    BIC
## 1  1.687339e-27          118.05    0.5522 118.11 117.69
## 4  2.269643e-05           17.95    0.0840 218.22 217.80
## 2  2.036524e-04           13.80    0.0645 222.37 221.95
## 3  3.980740e-01            0.71    0.0033 235.45 235.03
## --- BIVARIATE GLM RESULTS ---
##                    Predictor Coefficient       SE Odds_Ratio  GLM_P_Value
## 1         avg_hives_in_phase    0.026718 0.002609   1.027078 1.285414e-24
## 4 total_pesticide_applied_ml   -0.000005 0.000001   0.999995 1.862461e-05
## 2          total_insecticide   -0.000004 0.000001   0.999996 2.009297e-04
## 3            total_fungicide   -0.000003 0.000004   0.999997 4.041424e-01
##   Anova_P_Value Anova_Chi_sqare Pseudo_R2    AIC    BIC
## 1  1.687339e-27          118.05    0.5522 118.11 117.69
## 4  2.269643e-05           17.95    0.0840 218.22 217.80
## 2  2.036524e-04           13.80    0.0645 222.37 221.95
## 3  3.980740e-01            0.71    0.0033 235.45 235.03

Anther bruise score

## --- BIVARIATE GLM & CAR::ANOVA RESULTS ---
##                    Predictor Coefficient       SE GLM_P_Value Anova_P_Value
## 6                   api_prop    0.772536 0.206787      0.0202        0.0002
## 5                 crith_prop   -0.391316 0.152361      0.0621        0.0102
## 4 total_pesticide_applied_ml   -0.000001 0.000001      0.1754        0.1000
## 1         avg_hives_in_phase    0.002197 0.001494      0.2153        0.1413
## 2          total_insecticide   -0.000001 0.000001      0.3345        0.2729
## 3            total_fungicide   -0.000001 0.000002      0.5132        0.4735
##   Anova_Chi_sqare R_Squared    AIC    BIC
## 6           13.96    0.7772 -10.95 -11.58
## 5            6.60    0.6225  -7.79  -8.41
## 4            2.71    0.4034  -5.04  -5.67
## 1            2.16    0.3510  -4.54  -5.16
## 2            1.20    0.2311  -3.52  -4.14
## 3            0.51    0.1138  -2.67  -3.29
##                    Predictor Coefficient       SE GLM_P_Value Anova_P_Value
## 6                   api_prop    0.772536 0.206787      0.0202        0.0002
## 5                 crith_prop   -0.391316 0.152361      0.0621        0.0102
## 4 total_pesticide_applied_ml   -0.000001 0.000001      0.1754        0.1000
## 1         avg_hives_in_phase    0.002197 0.001494      0.2153        0.1413
## 2          total_insecticide   -0.000001 0.000001      0.3345        0.2729
## 3            total_fungicide   -0.000001 0.000002      0.5132        0.4735
##   Anova_Chi_sqare R_Squared    AIC    BIC
## 6           13.96    0.7772 -10.95 -11.58
## 5            6.60    0.6225  -7.79  -8.41
## 4            2.71    0.4034  -5.04  -5.67
## 1            2.16    0.3510  -4.54  -5.16
## 2            1.20    0.2311  -3.52  -4.14
## 3            0.51    0.1138  -2.67  -3.29

Figure 2

Figure 3

Pesticide residue analysis

Fisher’s Exact Test and ChiSquare Analysis

## 
##  Fisher's Exact Test for Count Data with simulated p-value (based on
##  1e+05 replicates)
## 
## data:  contingency_table
## p-value = 0.5132
## alternative hypothesis: two.sided
## 
##  Chi-squared test for given probabilities with simulated p-value (based
##  on 1e+05 replicates)
## 
## data:  applied_only$Detected
## X-squared = 7.086, df = NA, p-value = 0.4101
##               Chemical Detected Expected
## 1         Azoxystrobin        2     1.55
## 4  Chlorantraniliprole        6     7.75
## 5         Chlorfenapyr        4     4.65
## 7       Difenoconazole        4     1.55
## 10          Flonicamid        1     1.55
## 11           Fluopyram        5     3.10
## 15         Propamocarb        5     7.75
## 17        Pyrimethanil        4     3.10

Wax chemical analyses

###(1)does exposure to a particular chemical correlate with parasite infection?

## 
## Approx TRUE prevalence for *.Exposed (ignoring NA):
## A.Exposed B.Exposed C.Exposed D.Exposed E.Exposed F.Exposed G.Exposed H.Exposed 
##     1.000     0.667     0.667     1.000     0.833     0.333     0.833     1.000 
## I.Exposed J.Exposed K.Exposed L.Exposed M.Exposed N.Exposed O.Exposed P.Exposed 
##     0.667     1.000     0.667     0.333     0.500     0.167     0.500     0.333 
## Q.Exposed R.Exposed S.Exposed T.Exposed U.Exposed V.Exposed W.Exposed 
##     0.500     0.167     0.333     0.167     0.167     0.167     0.167
## 
## ----
## Fitting for chemical B
## Formula: cbind(crith_pos_b, crith_neg_b) ~ B.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical C
## Formula: cbind(crith_pos_b, crith_neg_b) ~ C.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical E
## Formula: cbind(crith_pos_b, crith_neg_b) ~ E.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical F
## Formula: cbind(crith_pos_b, crith_neg_b) ~ F.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical G
## Formula: cbind(crith_pos_b, crith_neg_b) ~ G.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical I
## Formula: cbind(crith_pos_b, crith_neg_b) ~ I.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical K
## Formula: cbind(crith_pos_b, crith_neg_b) ~ K.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical L
## Formula: cbind(crith_pos_b, crith_neg_b) ~ L.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical M
## Formula: cbind(crith_pos_b, crith_neg_b) ~ M.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical N
## Formula: cbind(crith_pos_b, crith_neg_b) ~ N.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical O
## Formula: cbind(crith_pos_b, crith_neg_b) ~ O.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical P
## Formula: cbind(crith_pos_b, crith_neg_b) ~ P.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical Q
## Formula: cbind(crith_pos_b, crith_neg_b) ~ Q.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical R
## Formula: cbind(crith_pos_b, crith_neg_b) ~ R.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical S
## Formula: cbind(crith_pos_b, crith_neg_b) ~ S.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical T
## Formula: cbind(crith_pos_b, crith_neg_b) ~ T.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical U
## Formula: cbind(crith_pos_b, crith_neg_b) ~ U.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical V
## Formula: cbind(crith_pos_b, crith_neg_b) ~ V.Exposed + (1 | greenhouse)
## 
## ----
## Fitting for chemical W
## Formula: cbind(crith_pos_b, crith_neg_b) ~ W.Exposed + (1 | greenhouse)
## 
## ================ PRIMARY EFFECTS (X.Exposed TRUE vs FALSE) ================
##           term estimate       OR      LCL      UCL     SE chemical
##  N.ExposedTRUE   -3.057  0.04702 0.008834   0.2503 0.8531        N
##  C.ExposedTRUE    2.050  7.76914 1.550368  38.9324 0.8223        C
##  E.ExposedTRUE   -2.515  0.08088 0.009134   0.7162 1.1128        E
##  F.ExposedTRUE   -2.050  0.12871 0.025685   0.6450 0.8223        F
##  G.ExposedTRUE   -2.515  0.08088 0.009134   0.7162 1.1128        G
##  R.ExposedTRUE    2.515 12.36387 1.396264 109.4816 1.1128        R
##  T.ExposedTRUE    2.515 12.36387 1.396264 109.4816 1.1128        T
##  U.ExposedTRUE    2.515 12.36387 1.396264 109.4816 1.1128        U
##  V.ExposedTRUE    2.515 12.36387 1.396264 109.4816 1.1128        V
##  W.ExposedTRUE    2.515 12.36387 1.396264 109.4816 1.1128        W
##  I.ExposedTRUE    1.824  6.19896 1.032816  37.2061 0.9143        I
##  B.ExposedTRUE   -1.575  0.20703 0.029684   1.4438 0.9910        B
##  K.ExposedTRUE   -1.575  0.20703 0.029684   1.4438 0.9910        K
##  P.ExposedTRUE    1.575  4.83033 0.692589  33.6882 0.9910        P
##  M.ExposedTRUE   -1.385  0.25021 0.038317   1.6339 0.9574        M
##  O.ExposedTRUE   -1.385  0.25021 0.038317   1.6339 0.9574        O
##  Q.ExposedTRUE    1.385  3.99661 0.612040  26.0977 0.9574        Q
##  S.ExposedTRUE    1.522  4.58347 0.639354  32.8585 1.0050        S
##  L.ExposedTRUE   -1.371  0.25391 0.032853   1.9625 1.0434        L
##                                                         formula converged
##  cbind(crith_pos_b, crith_neg_b) ~ N.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ C.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ E.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ F.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ G.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ R.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ T.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ U.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ V.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ W.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ I.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ B.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ K.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ P.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ M.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ O.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ Q.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ S.Exposed + (1 | greenhouse)      TRUE
##  cbind(crith_pos_b, crith_neg_b) ~ L.Exposed + (1 | greenhouse)      TRUE
##       z   p_value p_FDR_BH
##  -3.584 0.0003388 0.006437
##   2.493 0.0126591 0.045268
##  -2.260 0.0238242 0.045268
##  -2.493 0.0126593 0.045268
##  -2.260 0.0238242 0.045268
##   2.260 0.0238251 0.045268
##   2.260 0.0238251 0.045268
##   2.260 0.0238251 0.045268
##   2.260 0.0238251 0.045268
##   2.260 0.0238251 0.045268
##   1.995 0.0460126 0.079476
##  -1.589 0.1119932 0.151992
##  -1.589 0.1119932 0.151992
##   1.589 0.1119943 0.151992
##  -1.447 0.1478607 0.156075
##  -1.447 0.1478607 0.156075
##   1.447 0.1478570 0.156075
##   1.515 0.1298004 0.156075
##  -1.314 0.1889202 0.188920

###(2) does the amount of a particular chemical correlate with parasite infection

results table for wax resdiue analysis

##          term      estimate           SE           OR        LCL        UCL
## 1      A.Bin2   0.768486730    0.6140065 2.156500e+00 0.64730096  7.1844387
## 2  A.Bin3plus  -0.862659339    0.3030477 4.220382e-01 0.23302210  0.7643751
## 3  B.Bin3plus  -0.080406966    0.3578340 9.227407e-01 0.45760509  1.8606666
## 4      C.Bin2  -0.437641666    0.4728288 6.455571e-01 0.25554186  1.6308245
## 5  C.Bin3plus  -0.066547642    0.4623342 9.356183e-01 0.37805865  2.3154653
## 6      D.Bin2   0.004969945    0.3403944 1.004982e+00 0.51572021  1.9584058
## 7  D.Bin3plus  -0.618066887    0.5008634 5.389854e-01 0.20194881  1.4385091
## 8  E.Bin3plus  -0.654744442    0.3538430 5.195748e-01 0.25969070  1.0395366
## 9      F.Bin2 -16.035091063 2728.0220779 1.086547e-07 0.00000000        Inf
## 10 F.Bin3plus   1.565496290    0.5614872 4.785049e+00 1.59201673 14.3821950
## 11     G.Bin2  -0.864985110    0.3186166 4.210578e-01 0.22549388  0.7862284
## 12 G.Bin3plus  -0.917229547    0.4815075 3.996247e-01 0.15552219  1.0268622
## 13     H.Bin2  -0.205507406    0.2753976 8.142341e-01 0.47460296  1.3969089
## 14 H.Bin3plus  -0.050599015    0.4804603 9.506598e-01 0.37072900  2.4377754
## 15 I.Bin3plus   0.163489131    0.4110619 1.177613e+00 0.52614552  2.6357182
## 16     J.Bin2  -0.526628039    0.3154905 5.905931e-01 0.31823093  1.0960600
## 17 J.Bin3plus  -0.428832678    0.4414473 6.512689e-01 0.27415724  1.5471091
## 18     K.Bin2  -1.101065323    0.3770600 3.325167e-01 0.15880325  0.6962535
## 19 L.Bin3plus  -0.809241100    0.7137388 4.451958e-01 0.10990451  1.8033772
## 20 M.Bin3plus  -0.760255741    0.5118124 4.675468e-01 0.17146269  1.2749132
## 21     O.Bin2  -0.697040334    0.3781065 4.980572e-01 0.23737467  1.0450187
## 22 O.Bin3plus -19.748164865  512.0000022 2.651435e-09 0.00000000        Inf
## 23     P.Bin2  -0.951467396    0.4530515 3.861739e-01 0.15890765  0.9384715
## 24 P.Bin3plus  18.838708412 4591.4806745 1.518963e+08 0.00000000        Inf
## 25 Q.Bin3plus   0.655996556    0.4168751 1.927062e+00 0.85123784  4.3625503
## 26     S.Bin2  -0.562480028    0.4889873 5.697942e-01 0.21852006  1.4857466
## 27 S.Bin3plus  -1.363875312    0.5812479 2.556681e-01 0.08183091  0.7987954
##    chemical                               stage
## 1         A Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 2         A Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 3         B Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 4         C Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 5         C Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 6         D Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 7         D Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 8         E   Stage2_crith_Bin_0_1_2_3plus_vs_2
## 9         F Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 10        F Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 11        G Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 12        G Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 13        H Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 14        H Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 15        I Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 16        J Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 17        J Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 18        K Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 19        L Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 20        M   Stage2_crith_Bin_0_1_2_3plus_vs_2
## 21        O Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 22        O Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 23        P Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 24        P Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 25        Q Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 26        S Stage2_crith_Bin_0_1_2_3plus_vs_0-1
## 27        S Stage2_crith_Bin_0_1_2_3plus_vs_0-1
##                                                              formula reference
## 1  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 2  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 3  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 4  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 5  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 6  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 7  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 8  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)         2
## 9  cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 10 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 11 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 12 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 13 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 14 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 15 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 16 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 17 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 18 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 19 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 20 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)         2
## 21 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 22 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 23 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 24 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 25 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 26 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
## 27 cbind(crith_pos_b, crith_neg_b) ~ BinCollapsed + (1 | greenhouse)       0-1
##               z     p_value converged   p_FDR_BH
## 1   1.251593762 0.210717929      TRUE 0.41888915
## 2  -2.846612115 0.004418717      TRUE 0.04476119
## 3  -0.224704658 0.822209041      TRUE 0.99672631
## 4  -0.925581715 0.354663399      TRUE 0.53199510
## 5  -0.143938407 0.885549107      TRUE 0.99672631
## 6   0.014600547 0.988350863      TRUE 0.99672631
## 7  -1.234003011 0.217201782      TRUE 0.41888915
## 8  -1.850381280 0.064258615      TRUE 0.19576701
## 9  -0.005877918 0.995310127     FALSE 0.99672631
## 10  2.788124619 0.005301415     FALSE 0.04476119
## 11 -2.714814662 0.006631287      TRUE 0.04476119
## 12 -1.904912438 0.056791454      TRUE 0.19576701
## 13 -0.746220883 0.455533995      TRUE 0.64733778
## 14 -0.105313617 0.916126959      TRUE 0.99672631
## 15  0.397723843 0.690833760      TRUE 0.93262558
## 16 -1.669236025 0.095070613      TRUE 0.25669066
## 17 -0.971424421 0.331336972      TRUE 0.52624107
## 18 -2.920133302 0.003498817      TRUE 0.04476119
## 19 -1.133805748 0.256876039      TRUE 0.43347832
## 20 -1.485418816 0.137432914      TRUE 0.30922406
## 21 -1.843502559 0.065255668     FALSE 0.19576701
## 22 -0.038570634 0.969232715     FALSE 0.99672631
## 23 -2.100130716 0.035717344     FALSE 0.16072805
## 24  0.004102970 0.996726313     FALSE 0.99672631
## 25  1.573604396 0.115578936      TRUE 0.28369375
## 26 -1.150295852 0.250022039      TRUE 0.43347832
## 27 -2.346460662 0.018952667      TRUE 0.10234440

Key to letters desingated to each chemical compound

Pesticide names and corresponding letters used in analyses
Compound Letter
Chlorantraniliprole A
chlorfenapyr B
difenoconazole C
fluopyram D
hexythiazox E
myclobutanil F
Propamocarb G
Pyraclostrobin H
Pyrimethanil I
Pyriproxyfen J
Spirotetramat K
azoxystrobin L
bifenazate M
diphenylamine N
Fenpyroximate O
boscalid P
chlozolinate Q
flonicamid R
Picoxystrobin S
spinetoram T
Spinosyn A U
Spinosyn D V
trifloxystrobin W
##  BinCollapsed  prob    SE  df asymp.LCL asymp.UCL
##  0-1          0.456 0.149 Inf    0.2050     0.732
##  2            0.218 0.118 Inf    0.0674     0.519
## 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale
##  contrast  odds.ratio   SE  df null z.ratio p.value
##  (0-1) / 2       3.01 1.13 Inf    1   2.920  0.0035
## 
## Tests are performed on the log odds ratio scale
##  BinCollapsed  prob    SE  df asymp.LCL asymp.UCL .group
##  2            0.218 0.118 Inf    0.0674     0.519  a    
##  0-1          0.456 0.149 Inf    0.2050     0.732   b   
## 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale 
## Tests are performed on the log odds ratio scale 
## significance level used: alpha = 0.05 
## NOTE: If two or more means share the same grouping symbol,
##       then we cannot show them to be different.
##       But we also did not show them to be the same.

code format for figure 4

LS0tDQp0aXRsZTogIkd1dCBwYXRob2dlbiBpbmZlY3Rpb25zIGluZGljYXRlIHNwZWNpZXMtc3BlY2lmaWMgZWZmZWN0cyBvbiBidW1ibGUgYmVlcyBleHBvc2VkDQogIHRvIHBlc3RpY2lkZXMgaW5zaWRlIGEgdG9tYXRvIGdyZWVuaG91c2UiDQphdXRob3I6ICJFbWlseSBSdW5uaW9uIGFuZCBGcmFuY2VzIFNpdmFrb2ZmIg0KZGF0ZTogJzIwMjYnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGZpZ19jcm9wOiBmYWxzZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRQ0KKQ0KYGBgDQoNCg0KYGBge3IgbG9hZCBsaWJyYXJpZXMsIGluY2x1ZGU9RkFMU0V9DQoNCiMgSW5wdXQgbGlicmFyaWVzDQoNCmxpYnJhcnkoZWZmZWN0cykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoREhBUk1hKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KG11bHRjb21wKQ0KbGlicmFyeShtdWx0Y29tcFZpZXcpDQpsaWJyYXJ5KGVtbWVhbnMpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpgYGANCg0KDQpHdXQgcGFyYXNpdGUgaW5mZWN0aW9uIGFuZCBwZXN0aWNpZGUgZXhwb3N1cmUgYWZmZWN0IGJ1bWJsZSBiZWUgaGVhbHRoIGFuZCBwb2xsaW5hdGlvbiBiZWhhdmlvci4gVGhlc2Ugc3RyZXNzb3JzIGFyZSBjb21tb24gaW4gY29tbWVyY2lhbCB0b21hdG8gZ3JlZW5ob3VzZXMsIHdoZXJlIGdyb3dlcnMgZGVwbG95IGJ1bWJsZSBiZWVzIGZvciBwb2xsaW5hdGlvbi4gVG8gaW52ZXN0aWdhdGUgdGhlIGVmZmVjdHMgb2YgdGhlc2Ugc3RyZXNzb3JzIG9uIGJ1bWJsZSBiZWUgcG9sbGluYXRpb24gaW4gZ3JlZW5ob3VzZXMsIHdlIHNhbXBsZWQgY29tbWVyY2lhbCBidW1ibGUgYmVlIGNvbG9uaWVzIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhyZWUgY29tbW9uIGd1dC1wYXJhc2l0ZXMgKENyaXRoaWRpYSwgQXBpY3lzdGlzLCBOb3NlbWEpIHdpdGhpbiB0aHJlZSBjb21tZXJjaWFsIHRvbWF0byBncmVlbmhvdXNlcyB0aGF0IHdlcmUgc2FtcGxlZCBkdXJpbmcgMTItd2VlayBwZXJpb2RzIG9mIHR3byBncm93aW5nIHNlYXNvbnMuIFdlIHRoZW4gc2FtcGxlZCB0aGUgbmVzdCBtYXRlcmlhbCBvZiB0aGVzZSBzYW1lIGNvbG9uaWVzIHRvIGRldGVjdCBhbmQgcXVhbnRpZnkgY29tcG91bmRzIHRoYXQgYXJlIGFjdGl2ZSBpbmdyZWRpZW50cyBpbiBwZXN0aWNpZGVzLiBVc2luZyBncm93ZXItY29sbGVjdGVkIGRhdGEsIHdlIG1vbml0b3JlZCB0b21hdG8gYW50aGVyIGJydWlzaW5nIGFzIGEgcHJveHkgZm9yIGJlZSBwb2xsaW5hdGlvbiBhY3Rpdml0eSwgYW5kIHJlY29yZGVkIHBlc3RpY2lkZSBhcHBsaWNhdGlvbnMgd2l0aGluIHRoZSBncmVlbmhvdXNlcy4gV2UgZm91bmQgdGhhdCBwYXJhc2l0ZSBpbmZlY3Rpb24gcHJldmFsZW5jZSB3YXMgY29ycmVsYXRlZCB3aXRoIHRvdGFsIHBlc3RpY2lkZSBhcHBsaWNhdGlvbiBhbmQgYnVtYmxlIGJlZSBjb2xvbnkgZGVuc2l0eSwgYnV0IHRoZXNlIHJlbGF0aW9uc2hpcHMgd2VyZSBwYXJhc2l0ZS1zcGVjaWZpYy4gQ3JpdGhpZGlhIHByZXZhbGVuY2UgaW5jcmVhc2VkIHdpdGggdG90YWwgcGVzdGljaWRlIHVzZSBhbmQgZGVjcmVhc2VkIHdpdGggYnVtYmxlIGJlZSBjb2xvbnkgZGVuc2l0eS4gQ3JpdGhpZGlhIGluZmVjdGlvbiB3YXMgYWxzbyBuZWdhdGl2ZWx5IGFzc29jaWF0ZWQgY29ycmVsYXRlZCB3aXRoIGRlY3JlYXNlZCBwb2xsaW5hdGlvbiBhY3Rpdml0eS4gSW4gY29udHJhc3QsIEFwaWN5c3RpcyBpbmZlY3Rpb24gZGVjcmVhc2VkIHdpdGggdG90YWwgcGVzdGljaWRlIHVzZSwgYnV0IGluY3JlYXNlZCB3aXRoIGNvbG9ueSBkZW5zaXR5LCBhbmQgd2FzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHBvbGxpbmF0aW9uIGFjdGl2aXR5LiBXZSBuZXZlciBkZXRlY3RlZCBOb3NlbWEgaW4gYW55IGNvbG9ueS4gUG9sbGluYXRpb24gYWN0aXZpdHkgd2FzIG5vdCBkaXJlY3RseSBwcmVkaWN0ZWQgYnkgcGVzdGljaWRlIHF1YW50aXR5LiBOZXN0LWNvbXBvdW5kIGV4cG9zdXJlIHJldmVhbGVkIGZyZXF1ZW50IGRldGVjdGlvbiBvZiBtdWx0aXBsZSBwZXN0aWNpZGUgY29tcG91bmRzLiBXZSBmdXJ0aGVyIGZvdW5kIGNvbXBvdW5kLXNwZWNpZmljIGFzc29jaWF0aW9ucyB3aXRoIHBhdGhvZ2VuIGluZmVjdGlvbiBwcm9iYWJpbGl0eS4gT3VyIHJlc3VsdHMgaGlnaGxpZ2h0IHRoYXQgZ3V0IHBhcmFzaXRlcywgYXMgbWVkaWF0ZWQgdGhyb3VnaCBwZXN0aWNpZGUgZXhwb3N1cmUsIGhhdmUgaW1wb3J0YW50IGVmZmVjdHMgb24gYnVtYmxlIGJlZSBwb2xsaW5hdGlvbiwgYnV0IHRoZXNlIGVmZmVjdHMgYXJlIHBhdGhvZ2VuLSBhbmQgcGVzdGljaWRlLXNwZWNpZmljLg0KDQoNCg0KIyBTdGF0aXN0aWNhbCBBbmFseXNlcw0KDQoNCiMjIEJpdmFyaWF0ZSBhbmFseXNlcyBvZiBwYXRob2dlbiBwcmV2ZWxlbmNlIGFuZCBhbnRoZXIgYnJ1aXNlIHNjb3JlIGluIGVhY2ggb2YgdGhlIDYgZ3JlZW5ob3VzZXMgb3ZlciB0aGUgdHdvIHNhbXBsaW5nIHNlYXNvbnMgDQoNCiMjIyBJbnB1dCBkYXRhIA0KDQpgYGB7cn0NCg0KZ2g2IDwtIHJlYWRfY3N2KCJnaDYuMS5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKGdoID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMjAyMiIsICIyMDI0IikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMjAyMl8xIiwgICIyMDIyXzIiLCAiMjAyMl8zIiwgIjIwMjRfNCIsICIyMDI0XzUiLCAiMjAyNF82IikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiS29wcGVydCIsIkJpb2Jlc3QiKSkpKQ0KDQpgYGANCg0KIyMjIyBDcml0aGlkaWENCg0KYGBge3J9DQojIFIgU2NyaXB0OiBTaW1wbGlmaWVkIEJpdmFyaWF0ZSBBbmFseXNpcyAoTiA9IDYpIGZvciBjcml0aGlkaWEjIyMjDQojIDEuIERlZmluZSBhIGxpc3Qgb2YgeW91ciBpbmRpdmlkdWFsIHByZWRpY3RvcnMNCiNwcmVkaWN0b3JzIDwtIGMoImF2Z19oaXZlc19pbl9waGFzZSIsICJ0b3RhbF9pbnNlY3RpY2lkZSIsICJ0b3RhbF9mdW5naWNpZGUiLCAieWVhciIsICJ0b3RhbF9zeW50aGV0aWMiLCAidG90YWxfYmlvbG9naWNhbCIsICJ0b3RhbF9wZXN0aWNpZGVfYXBwbGllZF9tbCIpDQpwcmVkaWN0b3JzIDwtIGMoImF2Z19oaXZlc19pbl9waGFzZSIsICJ0b3RhbF9pbnNlY3RpY2lkZSIsICJ0b3RhbF9mdW5naWNpZGUiLCAidG90YWxfcGVzdGljaWRlX2FwcGxpZWRfbWwiKQ0KDQojU2ltcGxpZmllZCBCaXZhcmlhdGUgQW5hbHlzaXMgKE4gPSA2KSBmb3IgQ3JpdGhpZGlhIw0KDQojIDIuIENyZWF0ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSByZXN1bHRzIGZvciBjb21wYXJpc29uDQpiaXZhcmlhdGVfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBQcmVkaWN0b3IgPSBjaGFyYWN0ZXIoKSwNCiAgQ29lZmZpY2llbnQgPSBudW1lcmljKCksDQogIFNFID0gbnVtZXJpYygpLA0KICBPZGRzX1JhdGlvID0gbnVtZXJpYygpLCAgICMgQWRkZWQgY29sdW1uIGZvciBPZGRzIFJhdGlvDQogIEdMTV9QX1ZhbHVlID0gbnVtZXJpYygpLCAgIyBDb2VmZmljaWVudC1sZXZlbCBwLXZhbHVlIGZyb20gc3VtbWFyeSgpDQogIEFub3ZhX1BfVmFsdWUgPSBudW1lcmljKCksIyBWYXJpYWJsZS1sZXZlbCBwLXZhbHVlIGZyb20gY2FyOjpBbm92YSgpDQogIEFub3ZhX0NoaV9zcWFyZSA9IG51bWVyaWMoKSwgIyBWYXJpYWJsZS1sZXZlbCBDaGkgc3F1YXJlIGZyb20gY2FyOjpBbm92YSgpDQogIFBzZXVkb19SMiA9IG51bWVyaWMoKSwNCiAgQUlDID0gbnVtZXJpYygpLCAgICAgICAgICAgIyBBZGRlZCBjb2x1bW4gZm9yIEFJQw0KICBCSUMgPSBudW1lcmljKCksICAgICAgICAgICAjIEFkZGVkIGNvbHVtbiBmb3IgQklDDQogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQ0KKQ0KDQoNCiMgMy4gTG9vcCB0aHJvdWdoIGVhY2ggcHJlZGljdG9yIGFuZCBydW4gYSBzaW1wbGUgdW5pdmFyaWF0ZSBHTE0NCmZvciAocHJlZCBpbiBwcmVkaWN0b3JzKSB7DQogIA0KICAjIENvbnN0cnVjdCBiaW5vbWlhbCByZXNwb25zZSB1c2luZyBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY291bnRzDQogIGZvcm0gPC0gYXMuZm9ybXVsYShwYXN0ZSgiY2JpbmQoY3JpdGhfcG9zLCBjcml0aF9uZWcpIH4iLCBwcmVkKSkNCiAgDQogICMgUnVuIHRoZSBzaW1wbGUgbW9kZWwNCiAgc2ltcGxlX21vZGVsIDwtIGdsbSgNCiAgICBmb3JtLA0KICAgIGRhdGEgPSBnaDYsDQogICAgZmFtaWx5ID0gYmlub21pYWwoImxvZ2l0IikNCiAgKQ0KICANCiAgIyBFeHRyYWN0IHN1bW1hcnkNCiAgc3VtX21vZGVsIDwtIHN1bW1hcnkoc2ltcGxlX21vZGVsKQ0KICANCiAgIyBHZXQgcHJlZGljdG9yIGNvZWZmaWNpZW50DQogIHByZWRfcm93IDwtIHdoaWNoKHJvd25hbWVzKHN1bV9tb2RlbCRjb2VmZmljaWVudHMpICE9ICIoSW50ZXJjZXB0KSIpWzFdDQogIA0KICBjb2VmX3ZhbCA8LSBzdW1fbW9kZWwkY29lZmZpY2llbnRzW3ByZWRfcm93LCAiRXN0aW1hdGUiXQ0KICBzZV92YWwgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1twcmVkX3JvdywgIlN0ZC4gRXJyb3IiXQ0KICBnbG1fcF92YWwgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1twcmVkX3JvdywgIlByKD58enwpIl0NCiAgDQogICMgT2RkcyByYXRpbw0KICBvZGRzX3JhdGlvIDwtIGV4cChjb2VmX3ZhbCkNCiAgDQogICMgVHlwZSBJSSBBTk9WQQ0KICBhbm92YV9yZXMgPC0gY2FyOjpBbm92YShzaW1wbGVfbW9kZWwsIHR5cGUgPSAiSUkiKQ0KICANCiAgYW5vdmFfcF92YWwgPC0gYW5vdmFfcmVzW3ByZWQsICJQcig+Q2hpc3EpIl0NCiAgYW5vdmFfY2hpX3NxIDwtIGFub3ZhX3Jlc1twcmVkLCAiTFIgQ2hpc3EiXQ0KICANCiAgIyBNY0ZhZGRlbiBwc2V1ZG8tUjINCiAgcHNldWRvX3IyIDwtIDEgLSAoc2ltcGxlX21vZGVsJGRldmlhbmNlIC8gc2ltcGxlX21vZGVsJG51bGwuZGV2aWFuY2UpDQogIA0KICAjIEFJQyBhbmQgQklDDQogIG1vZGVsX2FpYyA8LSBBSUMoc2ltcGxlX21vZGVsKQ0KICBtb2RlbF9iaWMgPC0gQklDKHNpbXBsZV9tb2RlbCkNCiAgDQogICMgU3RvcmUgcmVzdWx0cw0KICBiaXZhcmlhdGVfcmVzdWx0cyA8LSByYmluZCgNCiAgICBiaXZhcmlhdGVfcmVzdWx0cywNCiAgICBkYXRhLmZyYW1lKA0KICAgICAgUHJlZGljdG9yID0gcHJlZCwNCiAgICAgIENvZWZmaWNpZW50ID0gcm91bmQoY29lZl92YWwsIDYpLA0KICAgICAgU0UgPSByb3VuZChzZV92YWwsIDYpLA0KICAgICAgT2Rkc19SYXRpbyA9IHJvdW5kKG9kZHNfcmF0aW8sIDYpLA0KICAgICAgR0xNX1BfVmFsdWUgPSBnbG1fcF92YWwsDQogICAgICBBbm92YV9QX1ZhbHVlID0gYW5vdmFfcF92YWwsDQogICAgICBBbm92YV9DaGlfc3FhcmUgPSByb3VuZChhbm92YV9jaGlfc3EsIDIpLA0KICAgICAgUHNldWRvX1IyID0gcm91bmQocHNldWRvX3IyLCA0KSwNCiAgICAgIEFJQyA9IHJvdW5kKG1vZGVsX2FpYywgMiksDQogICAgICBCSUMgPSByb3VuZChtb2RlbF9iaWMsIDIpDQogICAgKQ0KICApDQp9DQoNCiMgU29ydCB0aGUgcmVzdWx0cyB0YWJsZSBzbyB0aGUgQkVTVCBmaXR0aW5nIG1vZGVsIGlzIGF0IHRoZSB0b3ANCmJpdmFyaWF0ZV9yZXN1bHRzIDwtIGJpdmFyaWF0ZV9yZXN1bHRzW29yZGVyKGJpdmFyaWF0ZV9yZXN1bHRzJEFJQyksIF0NCmNyaXRoX3Jlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShiaXZhcmlhdGVfcmVzdWx0cykNCmNyaXRoX3Jlc3VsdHMNCiMgNC4gUHJpbnQgdGhlIGZpbmFsIGNvbXBhcmlzb24gdGFibGUNCmNhdCgiLS0tIEJJVkFSSUFURSBHTE0gUkVTVUxUUyAtLS1cbiIpDQpwcmludChiaXZhcmlhdGVfcmVzdWx0cykNCg0Kd3JpdGUudGFibGUoYml2YXJpYXRlX3Jlc3VsdHMsDQogICAgICAgICAgICAiY2xpcGJvYXJkIiwNCiAgICAgICAgICAgIHNlcCA9ICJcdCIsDQogICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSkNCg0KIyAxLiBDYWxjdWxhdGUgdGhlIGVtcGlyaWNhbCBzdWNjZXNzIHJhdGlvIGFuZCByb3cgSURzIGZvciB0cmFja2luZw0KZ2g2JHN1Y2Nlc3NfcmF0aW8gPC0gZ2g2JGNyaXRoX3BvcyAvIChnaDYkY3JpdGhfcG9zICsgZ2g2JGNyaXRoX25lZykNCmdoNiRyb3dfaWQgICAgICAgIDwtIGMoIjIwMjIsIEdIIDEiLCAiMjAyMiwgR0ggMiIsICIyMDIyLCBHSCAzIiwiMjAyNCwgR0ggMSIsICIyMDI0LCBHSCAyIiwgIjIwMjQsIEdIIDMiKQ0KZ2g2JHllYXIgICAgICAgICAgPC0gYXMuZmFjdG9yKGdoNiR5ZWFyKSAjIEVuc3VyZSB5ZWFyIGlzIHRyZWF0ZWQgYXMgYSBmYWN0b3INCmBgYA0KDQoNCiMjIyMgQXBpY3lzdGlzIA0KDQpgYGB7cn0NCiMgUiBTY3JpcHQ6IFNpbXBsaWZpZWQgQml2YXJpYXRlIEFuYWx5c2lzIChOID0gNikgZm9yIGFwaWN5c3RpcyMjIyMNCg0KIyAxLiBEZWZpbmUgYSBsaXN0IG9mIHlvdXIgaW5kaXZpZHVhbCBwcmVkaWN0b3JzDQojcHJlZGljdG9ycyA8LSBjKCJhdmdfaGl2ZXNfaW5fcGhhc2UiLCAidG90YWxfaW5zZWN0aWNpZGUiLCAidG90YWxfZnVuZ2ljaWRlIiwgInllYXIiLCAidG90YWxfc3ludGhldGljIiwgInRvdGFsX2Jpb2xvZ2ljYWwiLCAidG90YWxfcGVzdGljaWRlX2FwcGxpZWRfbWwiKQ0KcHJlZGljdG9ycyA8LSBjKCJhdmdfaGl2ZXNfaW5fcGhhc2UiLCAidG90YWxfaW5zZWN0aWNpZGUiLCAidG90YWxfZnVuZ2ljaWRlIiwgInRvdGFsX3Blc3RpY2lkZV9hcHBsaWVkX21sIikNCg0KIyAyLiBDcmVhdGUgYW4gZW1wdHkgZGF0YSBmcmFtZSB0byBzdG9yZSB0aGUgcmVzdWx0cyBmb3IgY29tcGFyaXNvbg0KYml2YXJpYXRlX3Jlc3VsdHMgPC0gZGF0YS5mcmFtZSgNCiAgUHJlZGljdG9yID0gY2hhcmFjdGVyKCksDQogIENvZWZmaWNpZW50ID0gbnVtZXJpYygpLA0KICBTRSA9IG51bWVyaWMoKSwNCiAgT2Rkc19SYXRpbyA9IG51bWVyaWMoKSwgICAjIEFkZGVkIGNvbHVtbiBmb3IgT2RkcyBSYXRpbw0KICBHTE1fUF9WYWx1ZSA9IG51bWVyaWMoKSwgICMgQ29lZmZpY2llbnQtbGV2ZWwgcC12YWx1ZSBmcm9tIHN1bW1hcnkoKQ0KICBBbm92YV9QX1ZhbHVlID0gbnVtZXJpYygpLCMgVmFyaWFibGUtbGV2ZWwgcC12YWx1ZSBmcm9tIGNhcjo6QW5vdmEoKQ0KICBBbm92YV9DaGlfc3FhcmUgPSBudW1lcmljKCksICMgVmFyaWFibGUtbGV2ZWwgQ2hpIHNxdWFyZSBmcm9tIGNhcjo6QW5vdmEoKQ0KICBQc2V1ZG9fUjIgPSBudW1lcmljKCksDQogIEFJQyA9IG51bWVyaWMoKSwgICAgICAgICAgICMgQWRkZWQgY29sdW1uIGZvciBBSUMNCiAgQklDID0gbnVtZXJpYygpLCAgICAgICAgICAgIyBBZGRlZCBjb2x1bW4gZm9yIEJJQw0KICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCikNCg0KDQojIDMuIExvb3AgdGhyb3VnaCBlYWNoIHByZWRpY3RvciBhbmQgcnVuIGEgc2ltcGxlIHVuaXZhcmlhdGUgR0xNDQpmb3IgKHByZWQgaW4gcHJlZGljdG9ycykgew0KICANCiAgIyBDb25zdHJ1Y3QgYmlub21pYWwgcmVzcG9uc2UgdXNpbmcgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGNvdW50cw0KICBmb3JtIDwtIGFzLmZvcm11bGEocGFzdGUoImNiaW5kKGFwaV9wb3MsIGFwaV9uZWcpIH4iLCBwcmVkKSkNCiAgDQogICMgUnVuIHRoZSBzaW1wbGUgbW9kZWwNCiAgc2ltcGxlX21vZGVsIDwtIGdsbSgNCiAgICBmb3JtLA0KICAgIGRhdGEgPSBnaDYsDQogICAgZmFtaWx5ID0gYmlub21pYWwoImxvZ2l0IikNCiAgKQ0KICANCiAgIyBFeHRyYWN0IHN1bW1hcnkNCiAgc3VtX21vZGVsIDwtIHN1bW1hcnkoc2ltcGxlX21vZGVsKQ0KICANCiAgIyBHZXQgcHJlZGljdG9yIGNvZWZmaWNpZW50DQogIHByZWRfcm93IDwtIHdoaWNoKHJvd25hbWVzKHN1bV9tb2RlbCRjb2VmZmljaWVudHMpICE9ICIoSW50ZXJjZXB0KSIpWzFdDQogIA0KICBjb2VmX3ZhbCA8LSBzdW1fbW9kZWwkY29lZmZpY2llbnRzW3ByZWRfcm93LCAiRXN0aW1hdGUiXQ0KICBzZV92YWwgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1twcmVkX3JvdywgIlN0ZC4gRXJyb3IiXQ0KICBnbG1fcF92YWwgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1twcmVkX3JvdywgIlByKD58enwpIl0NCiAgDQogICMgT2RkcyByYXRpbw0KICBvZGRzX3JhdGlvIDwtIGV4cChjb2VmX3ZhbCkNCiAgDQogICMgVHlwZSBJSSBBTk9WQQ0KICBhbm92YV9yZXMgPC0gY2FyOjpBbm92YShzaW1wbGVfbW9kZWwsIHR5cGUgPSAiSUkiKQ0KICANCiAgYW5vdmFfcF92YWwgPC0gYW5vdmFfcmVzW3ByZWQsICJQcig+Q2hpc3EpIl0NCiAgYW5vdmFfY2hpX3NxIDwtIGFub3ZhX3Jlc1twcmVkLCAiTFIgQ2hpc3EiXQ0KICANCiAgIyBNY0ZhZGRlbiBwc2V1ZG8tUjINCiAgcHNldWRvX3IyIDwtIDEgLSAoc2ltcGxlX21vZGVsJGRldmlhbmNlIC8gc2ltcGxlX21vZGVsJG51bGwuZGV2aWFuY2UpDQogIA0KICAjIEFJQyBhbmQgQklDDQogIG1vZGVsX2FpYyA8LSBBSUMoc2ltcGxlX21vZGVsKQ0KICBtb2RlbF9iaWMgPC0gQklDKHNpbXBsZV9tb2RlbCkNCiAgDQogICMgU3RvcmUgcmVzdWx0cw0KICBiaXZhcmlhdGVfcmVzdWx0cyA8LSByYmluZCgNCiAgICBiaXZhcmlhdGVfcmVzdWx0cywNCiAgICBkYXRhLmZyYW1lKA0KICAgICAgUHJlZGljdG9yID0gcHJlZCwNCiAgICAgIENvZWZmaWNpZW50ID0gcm91bmQoY29lZl92YWwsIDYpLA0KICAgICAgU0UgPSByb3VuZChzZV92YWwsIDYpLA0KICAgICAgT2Rkc19SYXRpbyA9IHJvdW5kKG9kZHNfcmF0aW8sIDYpLA0KICAgICAgR0xNX1BfVmFsdWUgPSBnbG1fcF92YWwsDQogICAgICBBbm92YV9QX1ZhbHVlID0gYW5vdmFfcF92YWwsDQogICAgICBBbm92YV9DaGlfc3FhcmUgPSByb3VuZChhbm92YV9jaGlfc3EsIDIpLA0KICAgICAgUHNldWRvX1IyID0gcm91bmQocHNldWRvX3IyLCA0KSwNCiAgICAgIEFJQyA9IHJvdW5kKG1vZGVsX2FpYywgMiksDQogICAgICBCSUMgPSByb3VuZChtb2RlbF9iaWMsIDIpDQogICAgKQ0KICApDQp9DQoNCiMgU29ydCB0aGUgcmVzdWx0cyB0YWJsZSBzbyB0aGUgQkVTVCBmaXR0aW5nIG1vZGVsIGlzIGF0IHRoZSB0b3ANCmJpdmFyaWF0ZV9yZXN1bHRzIDwtIGJpdmFyaWF0ZV9yZXN1bHRzW29yZGVyKGJpdmFyaWF0ZV9yZXN1bHRzJEFJQyksIF0NCmFwaV9yZXN1bHRzIDwtIGFzLmRhdGEuZnJhbWUoYml2YXJpYXRlX3Jlc3VsdHMpDQphcGlfcmVzdWx0cw0KIyA0LiBQcmludCB0aGUgZmluYWwgY29tcGFyaXNvbiB0YWJsZQ0KY2F0KCItLS0gQklWQVJJQVRFIEdMTSBSRVNVTFRTIC0tLVxuIikNCnByaW50KGJpdmFyaWF0ZV9yZXN1bHRzKQ0KDQp3cml0ZS50YWJsZShiaXZhcmlhdGVfcmVzdWx0cywNCiAgICAgICAgICAgICJjbGlwYm9hcmQiLA0KICAgICAgICAgICAgc2VwID0gIlx0IiwNCiAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KDQojIyMjIEFudGhlciBicnVpc2Ugc2NvcmUgDQoNCmBgYHtyfQ0KIyBSIFNjcmlwdDogU2ltcGxpZmllZCBCaXZhcmlhdGUgQW5hbHlzaXMgKE4gPSA2KSBmb3IgYW50aGVyIGJydWlzZSBzY29yZSMjIyMNCiMgMS4gRGVmaW5lIGEgbGlzdCBvZiB5b3VyIGluZGl2aWR1YWwgcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJhdmdfaGl2ZXNfaW5fcGhhc2UiLCAidG90YWxfaW5zZWN0aWNpZGUiLCAidG90YWxfZnVuZ2ljaWRlIiwgInRvdGFsX3Blc3RpY2lkZV9hcHBsaWVkX21sIiwgImNyaXRoX3Byb3AiLCAiYXBpX3Byb3AiKQ0KDQojIDIuIENyZWF0ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIHRvIHN0b3JlIHRoZSByZXN1bHRzIGZvciBjb21wYXJpc29uDQpiaXZhcmlhdGVfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBQcmVkaWN0b3IgPSBjaGFyYWN0ZXIoKSwNCiAgQ29lZmZpY2llbnQgPSBudW1lcmljKCksDQogIFNFID0gbnVtZXJpYygpLA0KICBHTE1fUF9WYWx1ZSA9IG51bWVyaWMoKSwgICMgQ29lZmZpY2llbnQtbGV2ZWwgcC12YWx1ZSBmcm9tIHN1bW1hcnkoKQ0KICBBbm92YV9QX1ZhbHVlID0gbnVtZXJpYygpLCMgVmFyaWFibGUtbGV2ZWwgcC12YWx1ZSBmcm9tIGNhcjo6QW5vdmEoKQ0KICBBbm92YV9DaGlfc3FhcmUgPSBudW1lcmljKCksICMgVmFyaWFibGUtbGV2ZWwgQ2hpIHNxdWFyZSBmcm9tIGNhcjo6QW5vdmEoKQ0KICBSX1NxdWFyZWQgPSBudW1lcmljKCksICAgICAjIFRydWUgUi1zcXVhcmVkIGZvciBjb250aW51b3VzIG91dGNvbWVzDQogIEFJQyA9IG51bWVyaWMoKSwgICAgICAgICAgICMgTW9kZWwgZml0IG1ldHJpYyAobG93ZXIgaXMgYmV0dGVyKQ0KICBCSUMgPSBudW1lcmljKCksICAgICAgICAgICAjIE1vZGVsIGZpdCBtZXRyaWMgKGxvd2VyIGlzIGJldHRlcikNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFDQopDQoNCiMgMy4gTG9vcCB0aHJvdWdoIGVhY2ggcHJlZGljdG9yIGFuZCBydW4gYSBzaW1wbGUgdW5pdmFyaWF0ZSBHTE0NCmZvciAocHJlZCBpbiBwcmVkaWN0b3JzKSB7DQogIA0KICAjIER5bmFtaWNhbGx5IGNvbnN0cnVjdCB0aGUgZm9ybXVsYQ0KICBmb3JtIDwtIGFzLmZvcm11bGEocGFzdGUoImF2ZXJhZ2VfYnJ1aXNlIH4iLCBwcmVkKSkNCiAgDQogICMgUnVuIHRoZSBHYXVzc2lhbiBHTE0NCiAgc2ltcGxlX21vZGVsIDwtIGdsbShmb3JtLCBkYXRhID0gZ2g2LCBmYW1pbHkgPSBnYXVzc2lhbihsaW5rID0gImlkZW50aXR5IikpDQogIA0KICAjIEV4dHJhY3QgdGhlIHN1bW1hcnkgdGFibGUgZm9yIHRoZSBzcGVjaWZpYyBjb2VmZmljaWVudA0KICBzdW1fbW9kZWwgPC0gc3VtbWFyeShzaW1wbGVfbW9kZWwpDQogIHByZWRfcm93IDwtIHdoaWNoKHJvd25hbWVzKHN1bV9tb2RlbCRjb2VmZmljaWVudHMpICE9ICIoSW50ZXJjZXB0KSIpWzFdDQogIA0KICBjb2VmX3ZhbCAgPC0gc3VtX21vZGVsJGNvZWZmaWNpZW50c1twcmVkX3JvdywgIkVzdGltYXRlIl0NCiAgc2VfdmFsIDwtIHN1bV9tb2RlbCRjb2VmZmljaWVudHNbcHJlZF9yb3csICJTdGQuIEVycm9yIl0NCiAgZ2xtX3BfdmFsIDwtIHN1bV9tb2RlbCRjb2VmZmljaWVudHNbcHJlZF9yb3csICJQcig+fHR8KSJdDQogIA0KICAjIFJ1biBUeXBlIElJIEFub3ZhIHVzaW5nIHRoZSBjYXIgcGFja2FnZQ0KICAjIHR5cGUgPSAiSUkiIGlzIHN0YW5kYXJkIGZvciBtYWluIGVmZmVjdHMgd2l0aG91dCBpbnRlcmFjdGlvbnMNCiAgYW5vdmFfcmVzIDwtIGNhcjo6QW5vdmEoc2ltcGxlX21vZGVsLCB0eXBlID0gIklJIikNCiAgDQogICMgRXh0cmFjdCB0aGUgQU5PVkEgcC12YWx1ZSBmb3IgdGhlIHByZWRpY3RvciByb3cNCiAgYW5vdmFfcF92YWwgPC0gYW5vdmFfcmVzW3ByZWQsICJQcig+Q2hpc3EpIl0NCiAgYW5vdmFfY2hpX3NxIDwtIGFub3ZhX3Jlc1twcmVkLCAiTFIgQ2hpc3EiXQ0KICANCiAgIyBDYWxjdWxhdGUgc3RhbmRhcmQgUi1TcXVhcmVkOiAxIC0gKFJlc2lkdWFsIFN1bSBvZiBTcXVhcmVzIC8gVG90YWwgU3VtIG9mIFNxdWFyZXMpDQogICMgRm9yIGdhdXNzaWFuIEdMTSwgZGV2aWFuY2UgaXMgUlNTLCBhbmQgbnVsbC5kZXZpYW5jZSBpcyBUU1MNCiAgcl9zcXVhcmVkIDwtIDEgLSAoc2ltcGxlX21vZGVsJGRldmlhbmNlIC8gc2ltcGxlX21vZGVsJG51bGwuZGV2aWFuY2UpDQogIA0KICAjIEV4dHJhY3QgQUlDIGFuZCBCSUMNCiAgbW9kZWxfYWljIDwtIEFJQyhzaW1wbGVfbW9kZWwpDQogIG1vZGVsX2JpYyA8LSBCSUMoc2ltcGxlX21vZGVsKQ0KICANCiAgIyBTdG9yZSB0aGUgcmVzdWx0cw0KICBiaXZhcmlhdGVfcmVzdWx0cyA8LSByYmluZChiaXZhcmlhdGVfcmVzdWx0cywgZGF0YS5mcmFtZSgNCiAgICBQcmVkaWN0b3IgPSBwcmVkLA0KICAgIENvZWZmaWNpZW50ID0gcm91bmQoY29lZl92YWwsIDYpLA0KICAgIFNFID0gcm91bmQoc2VfdmFsLCA2KSwNCiAgICBHTE1fUF9WYWx1ZSA9IHJvdW5kKGdsbV9wX3ZhbCwgNCksDQogICAgQW5vdmFfUF9WYWx1ZSA9IHJvdW5kKGFub3ZhX3BfdmFsLCA0KSwNCiAgICBBbm92YV9DaGlfc3FhcmUgPSByb3VuZChhbm92YV9jaGlfc3EsIDIpLA0KICAgIFJfU3F1YXJlZCA9IHJvdW5kKHJfc3F1YXJlZCwgNCksDQogICAgQUlDID0gcm91bmQobW9kZWxfYWljLCAyKSwNCiAgICBCSUMgPSByb3VuZChtb2RlbF9iaWMsIDIpDQogICkpDQp9DQojIFNvcnQgdGhlIHJlc3VsdHMgdGFibGUgc28gdGhlIEJFU1QgZml0dGluZyBtb2RlbCAobG93ZXN0IEFJQykgaXMgYXQgdGhlIHRvcA0KYml2YXJpYXRlX3Jlc3VsdHMgPC0gYml2YXJpYXRlX3Jlc3VsdHNbb3JkZXIoYml2YXJpYXRlX3Jlc3VsdHMkQUlDKSwgXQ0KYnJ1aXNpbmdfcmVzdWx0cyA8LSBhcy5kYXRhLmZyYW1lKGJpdmFyaWF0ZV9yZXN1bHRzKQ0KDQoNCiMgNC4gUHJpbnQgdGhlIGZpbmFsIGNvbXBhcmlzb24gdGFibGUNCmNhdCgiLS0tIEJJVkFSSUFURSBHTE0gJiBDQVI6OkFOT1ZBIFJFU1VMVFMgLS0tXG4iKQ0KcHJpbnQoYml2YXJpYXRlX3Jlc3VsdHMpDQoNCndyaXRlLnRhYmxlKGJpdmFyaWF0ZV9yZXN1bHRzLA0KICAgICAgICAgICAgImNsaXBib2FyZCIsDQogICAgICAgICAgICBzZXAgPSAiXHQiLA0KICAgICAgICAgICAgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmJpdmFyaWF0ZV9yZXN1bHRzDQoNCmdoNiRyb3dfaWQgICAgICAgIDwtIGMoIjIwMjIsIEdIIDEiLCAiMjAyMiwgR0ggMiIsICIyMDIyLCBHSCAzIiwiMjAyNCwgR0ggMSIsICIyMDI0LCBHSCAyIiwgIjIwMjQsIEdIIDMiKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDINCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmEgPC0gZ2dwbG90KGdoNiwgYWVzKHggPSB0b3RhbF9wZXN0aWNpZGVfYXBwbGllZF9tbCwgeSA9IGNyaXRoX3Byb3ApKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIHN0cm9rZSA9IDAuOCwgYWxwaGEgPSAwLjgsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCANCiAgICAgICAgICAgICAgZnVsbHJhbmdlID0gVFJVRSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0ID0gYygxNjg5MC41MiwgMjEyMDkwLjQ0KSkgKw0KICBsYWJzKA0KICAgIHggPSAiQXZlcmFnZSB0b3RhbCBwZXN0aWNpZGVzIGFwcGxpZWQgKG1sKSIsDQogICAgeSA9ICIqQ3JpdGhpZGlhKiBQcmV2YWxlbmNlIg0KICApICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgMjAsIDIwLCAyMCkNCiAgKSArIA0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsDQogICAgeCA9IDE4ODkwLjUyLA0KICAgIHkgPSAxLjIsDQogICAgcGFyc2UgPSBUUlVFLA0KICAgIGxhYmVsID0gIml0YWxpYyhSKV4yID09IDAuMzYiLA0KICAgIGhqdXN0ID0gMCwNCiAgICBzaXplID0gMTANCiAgKSArIA0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSA0MDAwMC41MiwNCiAgICB5ID0gMS4xLA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMDEiLA0KICAgIHNpemUgPSAxMA0KICApICsNCiAgYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMjEyMDkwLjQ0LA0KICAgIHkgPSAxLjIsDQogICAgbGFiZWwgPSAiQSIsDQogICAgc2l6ZSA9IDE0DQogICkNCg0KDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmIgPC0gZ2dwbG90KGdoNiwgYWVzKHggPSB0b3RhbF9mdW5naWNpZGUsIHkgPSBjcml0aF9wcm9wKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSA1LCBzdHJva2UgPSAwLjgsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsNCiBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCANCiAgICAgICAgICAgICAgZnVsbHJhbmdlID0gVFJVRSwgIyA8LS0gVGhpcyBzdHJldGNoZXMgdGhlIGxpbmUgJiBDSSB0byB0aGUgZWRnZXMNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0ID0gYygxMDUyMi45NiwgOTU2MjcuOTcpKSArDQogIGxhYnMoDQogIHggPSAiQXZlcmFnZSB0b3RhbCBmdW5naWNpZGVzIGFwcGxpZWQgKG1sKSIsDQogIHkgPSAiKkNyaXRoaWRpYSogUHJldmFsZW5jZSINCikgKw0KIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGl0bGUueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bihzaXplID0gMjYpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMjAsIDIwLCAyMCwgMjApDQogICkgKyANCiAgYW5ub3RhdGUoZ2VvbSA9ICd0ZXh0JywNCiAgICAgICAgICAgeCA9IDEwNTIyLjk2LA0KICAgICAgICAgICB5ID0gMS42LA0KICAgICAgICAgICBsYWJlbCA9ICJpdGFsaWMoUileMiA9PSAwLjI5IiwNCiAgICAgICAgICAgcGFyc2UgPSBUUlVFLA0KICAgICAgICAgICBoanVzdCA9IDAsDQogICAgICAgICAgIHNpemUgPSAxMCkgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAxOTAwMCwNCiAgICB5ID0gMS41LA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMDEiLA0KICAgIHNpemUgPSAxMA0KICApICsNCiAgICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSA5NTYyNy45NywNCiAgICB5ID0gMS42LA0KICAgIGxhYmVsID0gIkIiLA0KICAgIHNpemUgPSAxNA0KICApDQoNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIGRwaT02MDB9DQoNCmYyYyA8LSBnZ3Bsb3QoZ2g2LCBhZXMoeCA9IHRvdGFsX2luc2VjdGljaWRlLCB5ID0gY3JpdGhfcHJvcCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNSwgc3Ryb2tlID0gMC44LCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBUUlVFLCBsZXZlbCA9IDAuOTUsIA0KICAgICAgICAgICAgICBmdWxscmFuZ2UgPSBUUlVFLCAjIDwtLSBUaGlzIHN0cmV0Y2hlcyB0aGUgbGluZSAmIENJIHRvIHRoZSBlZGdlcw0KICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gInNvbGlkIiwgZmlsbCA9ICJncmV5ODAiLCBhbHBoYSA9IDAuNSkgKw0KICB0aGVtZV9jb3dwbG90KCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXQgPSBjKDMzNjMuNzc2LCAxOTM3NTUpKSArDQogIGxhYnMoDQogIHggPSAiQXZlcmFnZSB0b3RhbCBpbnNlY3RpY2lkZXMgYXBwbGllZCAobWwpIiwNCiAgeSA9ICIqQ3JpdGhpZGlhKiBQcmV2YWxlbmNlIg0KKSArDQogdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgNDAsIDIwLCAyMCkNCiAgKSArIA0KICBhbm5vdGF0ZShnZW9tID0gJ3RleHQnLA0KICAgICAgICAgICB4ID0gMzM2My43NzYsDQogICAgICAgICAgIHkgPSAxLjI1LA0KICAgIGxhYmVsID0gIml0YWxpYyhSKV4yID09IDAuMTUiLA0KICAgICAgICAgICBwYXJzZSA9IFRSVUUsDQogICAgICAgICAgIGhqdXN0ID0gMCwNCiAgICAgICAgICAgc2l6ZSA9IDEwKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDE5MDAwLA0KICAgIHkgPSAxLjE1LA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMDEiLA0KICAgIHNpemUgPSAxMA0KICApICsNCiAgICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAxOTM3NTMuNzgwLA0KICAgIHkgPSAxLjI1LA0KICAgIGxhYmVsID0gIkMiLA0KICAgIHNpemUgPSAxNA0KICApDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmQgPC0gZ2dwbG90KGdoNiwgYWVzKHggPSBhdmdfaGl2ZXNfaW5fcGhhc2UsIHkgPSBjcml0aF9wcm9wKSkgKw0KZ2VvbV9wb2ludChzaXplID0gNSwgc3Ryb2tlID0gMC44LCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiYmxhY2siKSArDQpnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCANCiAgICAgICAgICAgICAgZnVsbHJhbmdlID0gVFJVRSwgIyA8LS0gVGhpcyBzdHJldGNoZXMgdGhlIGxpbmUgJiBDSSB0byB0aGUgZWRnZXMNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxMjUsMjM2KSkgKw0KICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBtYXgoZ2g2JGNyaXRoX3Byb3ApICogMS41KSkgKw0KICBsYWJzKA0KICAgIHggPSAiQXZlcmFnZSB0b3RhbCBidW1ibGUgYmVlIGNvbG9uaWVzIHBlciBncmVlbmhvdXNlIiwNCiAgICB5ID0gIipDcml0aGlkaWEqIFByZXZhbGVuY2UiDQogICkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRpdGxlLnkgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyMCwgNDAsIDIwLCAyMCkNCiAgKSArIA0KICBhbm5vdGF0ZShnZW9tID0gJ3RleHQnLA0KICAgICAgICAgICB4ID0gMTI2LjMzMzMsDQogICAgICAgICAgIHkgPSAxLjQsDQogICAgICAgICAgIGxhYmVsID0gIml0YWxpYyhSKV4yID09IDAuMTEiLA0KICAgICAgICAgICBwYXJzZSA9IFRSVUUsDQogICAgICAgICAgIGhqdXN0ID0gMCwNCiAgICAgICAgICAgc2l6ZSA9IDEwKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDEzOCwNCiAgICB5ID0gMS4zLA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMDEiLA0KICAgIHNpemUgPSAxMA0KICApICsNCiAgICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAyMzUuNDY2NywNCiAgICB5ID0gMS40LA0KICAgIGxhYmVsID0gIkQiLA0KICAgIHNpemUgPSAxNA0KICApDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmUgPC0gDQogIGdncGxvdChnaDYsIGFlcyh4ID0gdG90YWxfcGVzdGljaWRlX2FwcGxpZWRfbWwsIHkgPSBhcGlfcHJvcCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNSwgc3Ryb2tlID0gMC44LCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBUUlVFLCBsZXZlbCA9IDAuOTUsIA0KICAgICAgICAgICAgICBmdWxscmFuZ2UgPSBUUlVFLCAjIDwtLSBUaGlzIHN0cmV0Y2hlcyB0aGUgbGluZSAmIENJIHRvIHRoZSBlZGdlcw0KICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gInNvbGlkIiwgZmlsbCA9ICJncmV5ODAiLCBhbHBoYSA9IDAuNSkgKw0KICB0aGVtZV9jb3dwbG90KCkgKw0KICAgICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgbWF4KGdoNiRhcGlfcHJvcCkgKiAxLjUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdCA9IGMoMTY4OTAuNTIsIDIxMjA5MC40NCkpICsNCiAgbGFicygNCiAgeCA9ICJBdmVyYWdlIHRvdGFsIHBlc3RpY2lkZXMgYXBwbGllZCAobWwpIiwNCiAgeSA9ICIqQXBpY3lzdGlzKiBQcmV2YWxlbmNlIg0KKSArDQogdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMjAsIDQwLCAyMCwgMjApDQogICkgKyANCiAgYW5ub3RhdGUoDQogICJ0ZXh0IiwNCiAgeCA9IDE5ODkwLjUyLA0KICB5ID0gMC42LA0KICBsYWJlbCA9ICJpdGFsaWMoUileMiA9PSAwLjA4IiwNCiAgcGFyc2UgPSBUUlVFLA0KICBoanVzdCA9IDAsDQogIHNpemUgPSAxMA0KKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDQwMDAwLjUyLA0KICAgIHkgPSAwLjU0LA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMDEiLA0KICAgIHNpemUgPSAxMA0KICApICsNCiAgICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAyMTIwOTAuNDQsDQogICAgeSA9IDAuNiwNCiAgICBsYWJlbCA9ICJFIiwNCiAgICBzaXplID0gMTQNCiAgKQ0KDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmYgPC0gDQogIGdncGxvdChnaDYsIGFlcyh4ID0gdG90YWxfZnVuZ2ljaWRlLCB5ID0gYXBpX3Byb3ApKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIHN0cm9rZSA9IDAuOCwgYWxwaGEgPSAwLjgsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCANCiAgICAgICAgICAgICAgZnVsbHJhbmdlID0gVFJVRSwgIyA8LS0gVGhpcyBzdHJldGNoZXMgdGhlIGxpbmUgJiBDSSB0byB0aGUgZWRnZXMNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIG1heChnaDYkYXBpX3Byb3ApICogMS41KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXQgPSBjKDEwNTIyLjk2LCA5NTYyNy45NykpICsNCiAgbGFicygNCiAgeCA9ICJBdmVyYWdlIHRvdGFsIGZ1bmdpY2lkZXMgYXBwbGllZCAobWwpIiwNCiAgeSA9ICIqQXBpY3lzdGlzKiBQcmV2YWxlbmNlIg0KKSArDQogdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMjAsIDQwLCAyMCwgMjApDQogICkgKyANCiAgYW5ub3RhdGUoDQogICJ0ZXh0IiwNCiAgeCA9IDEyNTIyLjk2LA0KICB5ID0gMC42LA0KICBsYWJlbCA9ICJpdGFsaWMoUileMiA9PSAwLjAwMyIsDQogIHBhcnNlID0gVFJVRSwNCiAgaGp1c3QgPSAwLA0KICBzaXplID0gMTANCikgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSAxOTAwMC45NiwNCiAgICB5ID0gMC41NCwNCiAgICBsYWJlbCA9ICJQID0gMC40MCIsDQogICAgc2l6ZSA9IDEwDQogICkgKw0KICAgIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDk1NjI3Ljk3LA0KICAgIHkgPSAwLjYsDQogICAgbGFiZWwgPSAiRiIsDQogICAgc2l6ZSA9IDE0DQogICkNCg0KYGBgDQoNCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCBkcGk9NjAwfQ0KDQpmMmcgPC0gDQogIGdncGxvdChnaDYsIGFlcyh4ID0gdG90YWxfaW5zZWN0aWNpZGUsIHkgPSBhcGlfcHJvcCkpICsNCiAgZ2VvbV9qaXR0ZXIoDQogIHdpZHRoID0gMzAwMCwNCiAgaGVpZ2h0ID0gMC4wMSwNCiAgc2l6ZSA9IDUsDQogIHN0cm9rZSA9IDEsDQogIGFscGhhID0gMC44LA0KICBjb2xvciA9ICJibGFjayINCikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgbGV2ZWwgPSAwLjk1LCANCiAgICAgICAgICAgICAgZnVsbHJhbmdlID0gVFJVRSwgIyA8LS0gVGhpcyBzdHJldGNoZXMgdGhlIGxpbmUgJiBDSSB0byB0aGUgZWRnZXMNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGZpbGwgPSAiZ3JleTgwIiwgYWxwaGEgPSAwLjUpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBtYXgoZ2g2JGFwaV9wcm9wKSAqIDEuMykpICsNCiAjIHNjYWxlX3hfY29udGludW91cyhsaW1pdCA9IGMoMzM2My43NzYsIDE5Mzc1My43ODApKSArDQogIGxhYnMoDQogIHggPSAiQXZlcmFnZSB0b3RhbCBpbnNlY3RpY2lkZXMgYXBwbGllZCAobWwpIiwNCiAgeSA9ICIqQXBpY3lzdGlzKiBQcmV2YWxlbmNlIg0KKSArDQogdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50aXRsZS55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMjAsIDQwLCAyMCwgMjApDQogICkgKyANCiAgYW5ub3RhdGUoDQogICJ0ZXh0IiwNCiAgeCA9IDI1MDAsDQogIHkgPSAwLjUzLA0KICBsYWJlbCA9ICJpdGFsaWMoUileMiA9PSAwLjA2IiwNCiAgcGFyc2UgPSBUUlVFLA0KICBoanVzdCA9IDAsDQogIHNpemUgPSAxMA0KKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDE5MDAwLA0KICAgIHkgPSAwLjQ5LA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMSIsDQogICAgc2l6ZSA9IDEwDQogICkgKw0KICAgIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDE5Mzc1My43ODAsDQogICAgeSA9IDAuNDksDQogICAgbGFiZWwgPSAiRyIsDQogICAgc2l6ZSA9IDE0DQogICkNCg0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9OCwgZHBpPTYwMH0NCg0KZjJoIDwtIA0KICBnZ3Bsb3QoZ2g2LCBhZXMoeCA9IGF2Z19oaXZlc19pbl9waGFzZSwgeSA9IGFwaV9wcm9wKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSA1LCBzdHJva2UgPSAwLjgsIGFscGhhID0gMC44LCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IFRSVUUsIGxldmVsID0gMC45NSwgDQogICAgICAgICAgICAgIGZ1bGxyYW5nZSA9IFRSVUUsICMgPC0tIFRoaXMgc3RyZXRjaGVzIHRoZSBsaW5lICYgQ0kgdG8gdGhlIGVkZ2VzDQogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAic29saWQiLCBmaWxsID0gImdyZXk4MCIsIGFscGhhID0gMC41KSArDQogIHRoZW1lX2Nvd3Bsb3QoKSArDQogICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCBtYXgoZ2g2JGFwaV9wcm9wKSAqIDEuNyksIHhsaW0gPSBjKDEyNSwgMjM2KSkgKw0KICBsYWJzKA0KICB4ID0gIkF2ZXJhZ2UgdG90YWwgYnVtYmxlIGJlZSBjb2xvbmllcyBwZXIgZ3JlZW5ob3VzZSIsDQogIHkgPSAiKkFwaWN5c3RpcyogUHJldmFsZW5jZSINCikgKw0KIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYpLA0KICAgIGF4aXMudGl0bGUueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bihzaXplID0gMjYpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiksDQogICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDIwLCA0MCwgMjAsIDIwKQ0KICApICsgDQogIGFubm90YXRlKA0KICAidGV4dCIsDQogIHggPSAxMjYuMzMzMywNCiAgeSA9IDAuNjcsDQogIGxhYmVsID0gIml0YWxpYyhSKV4yID09IDAuNTUiLA0KICBwYXJzZSA9IFRSVUUsDQogIGhqdXN0ID0gMCwNCiAgc2l6ZSA9IDEwDQopICsNCiAgYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMTM2LA0KICAgIHkgPSAwLjYyLA0KICAgIGxhYmVsID0gIlAgPCAwLjAwMSIsDQogICAgc2l6ZSA9IDEwDQogICkgKw0KICAgIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDIzNSwNCiAgICB5ID0gMC42OSwNCiAgICBsYWJlbCA9ICJIIiwNCiAgICBzaXplID0gMTQNCiAgKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9MTgsIGZpZy53aWR0aD00OH0NCnBsb3RfZ3JpZCgNCiAgcGxvdF9ncmlkKGYyYSwgZjJiLCBmMmMsIGYyZCwgZjJlLCBmMmYsIGYyZywgZjJoLCBuY29sID0gNCkpDQpgYGANCg0KIyMjIyBGaWd1cmUgMw0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIGRwaT02MDB9DQpBQ1AgPC0gZ2dwbG90KGdoNiwgYWVzKHggPSBjcml0aF9wcm9wLCB5ID0gYXZlcmFnZV9icnVpc2UpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUsIHN0cm9rZSA9IDAuOCwgYWxwaGEgPSAwLjgsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3Ntb290aCgNCiAgICBtZXRob2QgPSAibG0iLA0KICAgIHNlID0gVFJVRSwNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgc2l6ZSA9IDEuMg0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4wODkxLCAxKSkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMS44LCAyLjcpKSArDQogIGxhYnMoDQogICAgeCA9ICIqQ3JpdGhpZGlhKiBQcmV2YWxlbmNlIiwNCiAgICB5ID0gIkF2ZXJhZ2UgYW50aGVyIGJydWlzaW5nIHNjb3JlIg0KICApICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSkgKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSArIA0KICBhbm5vdGF0ZShnZW9tID0gJ3RleHQnLA0KICAgICAgICAgICB4ID0gMC4xMDQsDQogICAgeSA9IDIuNywNCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgiUl4yIiwNCiAgICAgICAgICAgICAiPT0iLA0KICAgICAgICAgICAgIDAuNjIpLCANCiAgICAgICAgICAgcGFyc2UgPSBUUlVFLA0KICAgICAgICAgICBoanVzdCA9IDAsDQogICAgc2l6ZSA9IDEwKSArDQogICAgYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMC4xNSwNCiAgICB5ID0gMi42NSwNCiAgICBsYWJlbCA9ICJQID0gMC4wMSIsDQogICAgc2l6ZSA9IDEwDQogICkgKw0KICAgIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDEsDQogICAgeSA9IDIuNywNCiAgICBsYWJlbCA9ICJBIiwNCiAgICBzaXplID0gMTQNCiAgKQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OCwgZHBpPTYwMH0NCg0KQUFQIDwtIGdncGxvdChnaDYsIGFlcyh4ID0gYXBpX3Byb3AsIHkgPSBhdmVyYWdlX2JydWlzZSkpICsNCmdlb21fcG9pbnQoc2l6ZSA9IDUsIHN0cm9rZSA9IDAuOCwgYWxwaGEgPSAwLjgsIGNvbG9yID0gImJsYWNrIikgKw0KZ2VvbV9zbW9vdGgoDQogICAgbWV0aG9kID0gImxtIiwNCiAgICBzZSA9IFRSVUUsDQogICAgY29sb3IgPSAiYmxhY2siLA0KICAgIHNpemUgPSAxLjINCiAgKSArDQogIHRoZW1lX2Nvd3Bsb3QoKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwuNDEpKSArDQogIGxhYnMoDQogICAgeCA9ICIqQXBpY3lzdGlzKiBQcmV2YWxlbmNlIiwNCiAgICB5ID0gIkF2ZXJhZ2UgYW50aGVyIGJydWlzaW5nIHNjb3JlIg0KICApICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI2KSkgKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSArIA0KICBhbm5vdGF0ZShnZW9tID0gJ3RleHQnLA0KICAgICAgICAgICB4ID0gMC4wMTEsDQogICAgeSA9IDIuNjUsDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIlJeMiIsDQogICAgICAgICAgICAgIj09IiwNCiAgICAgICAgICAgICAwLjc3KSwgDQogICAgICAgICAgIHBhcnNlID0gVFJVRSwNCiAgICAgICAgICAgaGp1c3QgPSAwLA0KICAgIHNpemUgPSAxMCkgKw0KICAgIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDAuMDQsDQogICAgeSA9IDIuNiwNCiAgICBsYWJlbCA9ICJQID0gMC4wMDAyIiwNCiAgICBzaXplID0gMTANCiAgKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDAuNCwNCiAgICB5ID0gMi43LA0KICAgIGxhYmVsID0gIkIiLA0KICAgIHNpemUgPSAxNA0KICApDQoNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEyLCBkcGk9NjAwfQ0KcGxvdF9ncmlkKA0KICBwbG90X2dyaWQoQUNQLCBBQVAsIG5jb2wgPSAyKSwNCiAgZ2dkcmF3KCksDQogIG5jb2wgPSAxLA0KICByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkNCikNCmBgYA0KDQoNCiMjIFBlc3RpY2lkZSByZXNpZHVlIGFuYWx5c2lzIA0KDQojIyMgRmlzaGVyJ3MgRXhhY3QgVGVzdCBhbmQgQ2hpU3F1YXJlIEFuYWx5c2lzIA0KDQpgYGB7cn0NCiMgRmlzaGVycyBleGFjdCB0ZXN0IGFuZCBDaGkgc3F1YXJlZCBnb29kbmVzcyBvZiBmaXQgdGVzdCBvbiBhcHBsaWVkIHZzIGRldGVjdGVkIGNoZW1pY2Fscw0KI0Zpc2hlcnMgZXhhY3QgdGVzdCBmb3IgQ291bnQgRGF0YSB3aXRoIHNpbXVsYXRlZCBwLXZhbHVlIChiYXNlZCBvbiAxZSswNSByZXBsaWNhdGVzKSMjIyMNCiMxLiBJbnB1dCBkYXRhDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIENoZW1pY2FsID0gYygNCiAgICAiQXpveHlzdHJvYmluIiwgIkJpZmVuYXphdGUiLCAiQm9zY2FsaWQiLCAiQ2hsb3JhbnRyYW5pbGlwcm9sZSIsIA0KICAgICJDaGxvcmZlbmFweXIiLCAiQ2hsb3pvbGluYXRlIiwgIkRpZmVub2NvbmF6b2xlIiwgIkRpcGhlbnlsYW1pbmUiLCANCiAgICAiRmVucHlyb3hpbWF0ZSIsICJGbG9uaWNhbWlkIiwgIkZsdW9weXJhbSIsICJIZXh5dGhpYXpveCIsIA0KICAgICJNeWNsb2J1dGFuaWwiLCAiUGljb3h5c3Ryb2JpbiIsICJQcm9wYW1vY2FyYiIsICJQeXJhY2xvc3Ryb2JpbiIsIA0KICAgICJQeXJpbWV0aGFuaWwiLCAiUHlyaXByb3h5ZmVuIiwgIlNwaW5vc3luIEEiLCAiU3Bpbm9zeW4gRCIsIA0KICAgICJTcGlyb3RldHJhbWF0IiwgIlRyaWZsb3h5c3Ryb2JpbiINCiAgKSwNCiAgRGV0ZWN0ZWQgPSBjKDIsIDMsIDIsIDYsIDQsIDMsIDQsIDEsIDMsIDEsIDUsIDUsIDIsIDIsIDUsIDUsIDQsIDYsIDEsIDEsIDMsIDEpLA0KICBBcHBsaWVkID0gYygxLCAwLCAwLCA1LCAzLCAwLCAxLCAwLCAwLCAxLCAyLCAwLCAwLCAwLCA1LCAwLCAyLCAwLCAwLCAwLCAwLCAwKQ0KKQ0KDQojIDIuIENvbnZlcnQgdGhlIGNvbHVtbnMgaW50byBhIDIgeCAyMiBjb250aW5nZW5jeSB0YWJsZSBtYXRyaXgNCmNvbnRpbmdlbmN5X3RhYmxlIDwtIGFzLm1hdHJpeChyYmluZChkYXRhJERldGVjdGVkLCBkYXRhJEFwcGxpZWQpKQ0Kcm93bmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGMoIkRldGVjdGVkIiwgIkFwcGxpZWQiKQ0KY29sbmFtZXMoY29udGluZ2VuY3lfdGFibGUpIDwtIGRhdGEkQ2hlbWljYWwNCg0KIyAzLiBSdW4gRmlzaGVyJ3MgRXhhY3QgVGVzdCB3aXRoIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gKEIgPSAxMDAsMDAwIHJlcGxpY2F0ZXMpDQpzZXQuc2VlZCg0MikgIyBGb3IgY29uc2lzdGVudCByZXN1bHRzDQpmaXNoZXJfcmVzdWx0IDwtIGZpc2hlci50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSwgQiA9IDEwMDAwMCkNCg0KIyBQcmludCB0aGUgdGVzdCByZXN1bHRzDQpwcmludChmaXNoZXJfcmVzdWx0KQ0KDQojQ2hpIHNxdWFyZWQgZ29vZG5lc3Mgb2YgZml0DQoNCiMgMi4gU3Vic2V0IHRvIGFjdGl2ZSBpbmdyZWRpZW50cyB3aXRoID4gMCBhcHBsaWNhdGlvbnMNCmFwcGxpZWRfb25seSA8LSBzdWJzZXQoZGF0YSwgQXBwbGllZCA+IDApDQoNCiMgMy4gQ2FsY3VsYXRlIGV4cGVjdGVkIHByb2JhYmlsaXRpZXMNCnByb2JzIDwtIGFwcGxpZWRfb25seSRBcHBsaWVkIC8gc3VtKGFwcGxpZWRfb25seSRBcHBsaWVkKQ0KDQojIDQuIFBlcmZvcm0gQ2hpLXNxdWFyZSBHb29kbmVzcy1vZi1GaXQgd2l0aCBNb250ZSBDYXJsbyBTaW11bGF0aW9uIChCID0gMTAwLDAwMCByZXBsaWNhdGVzKQ0Kc2V0LnNlZWQoNDIpICMgRm9yIHJlcHJvZHVjaWJpbGl0eQ0Kc2ltX3Rlc3QgPC0gY2hpc3EudGVzdCgNCiAgeCA9IGFwcGxpZWRfb25seSREZXRlY3RlZCwgDQogIHAgPSBwcm9icywgDQogIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFLCANCiAgQiA9IDEwMDAwMA0KKQ0KDQojIFByaW50IHJlc3VsdHMNCnByaW50KHNpbV90ZXN0KQ0KDQojIENhbGN1bGF0ZSBhbmQgcHJpbnQgb2JzZXJ2ZWQgdnMgZXhwZWN0ZWQgY291bnRzDQphcHBsaWVkX29ubHkkRXhwZWN0ZWQgPC0gc3VtKGFwcGxpZWRfb25seSREZXRlY3RlZCkgKiBwcm9icw0KcHJpbnQoYXBwbGllZF9vbmx5WywgYygiQ2hlbWljYWwiLCAiRGV0ZWN0ZWQiLCAiRXhwZWN0ZWQiKV0pDQoNCmBgYA0KDQojIyBXYXggY2hlbWljYWwgYW5hbHlzZXMgDQoNCiMjIygxKWRvZXMgZXhwb3N1cmUgdG8gYSBwYXJ0aWN1bGFyIGNoZW1pY2FsIGNvcnJlbGF0ZSB3aXRoIHBhcmFzaXRlIGluZmVjdGlvbj8NCg0KYGBge3J9DQojI0dMTU0gdG8gYmluIGNoZW1pY2FsIGNvbmMuIGRhdGENCiMjIFVzZXIgY2hvb3NlcyBBUEkgdnMgQ1JJVEggcmVzcG9uc2UgdmFyaWFibGVzDQojIyBCaW5uaW5nOiAwLTEgLT4gIjAtMSI7IDIgLT4gIjIiOyAoMyspIC0+ICIzcGx1cyINCg0KaW5fcGF0aCAgICAgICAgIDwtICJiaW5fYW5kX2V4cG9zdXJlXzMuY3N2Ig0Kb3V0X3ByaW1hcnlfY3N2IDwtIE5VTEwgICAjIGUuZy4sICJzdGFnZTNfcHJpbWFyeV9PUnMuY3N2IiB0byBzYXZlOyBOVUxMID0gZG9uJ3Qgd3JpdGUNCmFscGhhICAgICAgICAgICA8LSAwLjA1ICAgIyBDSSBsZXZlbCA5NSUNCnZlcmJvc2UgICAgICAgICA8LSBUUlVFDQoNCmRmIDwtIHJlYWRfY3N2KGluX3BhdGgsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCiMgQ2hvb3NlIG91dGNvbWU6ICJhcGkiIG9yICJjcml0aCINCnVzZV9vdXRjb21lICAgICA8LSAiY3JpdGgiICAjIGNoYW5nZSB0byAiY3JpdGgiIHRvIG1vZGVsIENyaXRoaWRpYQ0KDQojIGdyZWVuaG91c2UgYXMgcmFuZG9tLWVmZmVjdCBncm91cGluZyBmYWN0b3INCmlmICghImdyZWVuaG91c2UiICVpbiUgbmFtZXMoZGYpKSB7DQogIHN0b3AoIkNvbHVtbiAnZ3JlZW5ob3VzZScgbm90IGZvdW5kLiBQbGVhc2UgZW5zdXJlIGl0IGV4aXN0cy4iKQ0KfQ0KZGYkZ3JlZW5ob3VzZSA8LSBmYWN0b3IoZGYkZ3JlZW5ob3VzZSkNCg0KIyBJZGVudGlmeSAqLkV4cG9zZWQgY29sdW1ucyAoYmluYXJ5IFRSVUUvRkFMU0UgYXMgc3RyaW5ncykNCmV4cF92YXJzIDwtIGdyZXAoIlxcLkV4cG9zZWQkIiwgbmFtZXMoZGYpLCB2YWx1ZSA9IFRSVUUpDQppZiAobGVuZ3RoKGV4cF92YXJzKSA9PSAwTCkgc3RvcCgiTm8gJyouRXhwb3NlZCcgY29sdW1ucyBmb3VuZC4iKQ0KDQojIEVuc3VyZSAqLkV4cG9zZWQgYXJlIGZhY3RvcnMgd2l0aCAiRkFMU0UiIGFzIHJlZmVyZW5jZQ0KZm9yICh2IGluIGV4cF92YXJzKSB7DQogICMgQ29lcmNlIHRvIGNoYXJhY3RlciBmaXJzdCB0byBhdm9pZCBsb2dpY2FsIHZzIGNoYXJhY3RlciBjb25mdXNpb24NCiAgeCA8LSBhcy5jaGFyYWN0ZXIoZGZbW3ZdXSkNCiAgIyBUcmVhdCAiIiBhcyBOQTsgZG8gbm90IGZvcmNlIE5BIHRvIEZBTFNFIGJlY2F1c2UgTkEgbWVhbnMgdW5rbm93bg0KICB4W3ggPT0gIiJdIDwtIE5BDQogIGRmW1t2XV0gPC0gZmFjdG9yKHgpDQogICMgSWYgRkFMU0UgcHJlc2VudCwgc2V0IGl0IGFzIHJlZmVyZW5jZQ0KICBpZiAoIkZBTFNFIiAlaW4lIGxldmVscyhkZltbdl1dKSkgZGZbW3ZdXSA8LSBzdGF0czo6cmVsZXZlbChkZltbdl1dLCByZWYgPSAiRkFMU0UiKQ0KfQ0KDQojIE91dGNvbWUgY29sdW1ucyBjaGVjaw0KaWYgKHVzZV9vdXRjb21lID09ICJhcGkiKSB7DQogIHJlcXVpcmVkIDwtIGMoImFwaV9wb3NfYiIsICJhcGlfbmVnX2IiKQ0KfSBlbHNlIGlmICh1c2Vfb3V0Y29tZSA9PSAiY3JpdGgiKSB7DQogIHJlcXVpcmVkIDwtIGMoImNyaXRoX3Bvc19iIiwgImNyaXRoX25lZ19iIikNCn0gZWxzZSB7DQogIHN0b3AoInVzZV9vdXRjb21lIG11c3QgYmUgJ2FwaScgb3IgJ2NyaXRoJy4iKQ0KfQ0KbWlzc2luZ19vdXQgPC0gc2V0ZGlmZihyZXF1aXJlZCwgbmFtZXMoZGYpKQ0KaWYgKGxlbmd0aChtaXNzaW5nX291dCkgPiAwKSB7DQogIHN0b3AoIk1pc3Npbmcgb3V0Y29tZSBjb2x1bW5zOiAiLCBwYXN0ZShtaXNzaW5nX291dCwgY29sbGFwc2UgPSAiLCAiKSkNCn0NCg0KIyBRdWljayBwcmV2YWxlbmNlIGNoZWNrIChoZWxwcyB3aXRoIGRpYWdub3N0aWNzKQ0KaWYgKHZlcmJvc2UpIHsNCiAgcHJldiA8LSBzYXBwbHkoZXhwX3ZhcnMsIGZ1bmN0aW9uKHYpIG1lYW4oZGZbW3ZdXSA9PSAiVFJVRSIsIG5hLnJtID0gVFJVRSkpDQogIGNhdCgiXG5BcHByb3ggVFJVRSBwcmV2YWxlbmNlIGZvciAqLkV4cG9zZWQgKGlnbm9yaW5nIE5BKTpcbiIpDQogIHByaW50KHJvdW5kKHByZXYsIDMpKQ0KfQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIyBIZWxwZXIgZnVuY3Rpb25zDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIFNhZmVyIGdsbWVyIHdpdGggYSBiZXR0ZXIgb3B0aW1pemVyIGFuZCBtb3JlIGl0ZXJhdGlvbnMNCnNhZmVfZ2xtZXIgPC0gZnVuY3Rpb24oZm9ybXVsYSwgZGF0YSkgew0KICBjdHJsIDwtIGdsbWVyQ29udHJvbCgNCiAgICBvcHRpbWl6ZXIgPSAiYm9ieXFhIiwNCiAgICBvcHRDdHJsICAgPSBsaXN0KG1heGZ1biA9IDIwMDAwMCkNCiAgKQ0KICBmaXQgPC0gdHJ5KGdsbWVyKGZvcm11bGEsIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpLCBkYXRhID0gZGF0YSwgY29udHJvbCA9IGN0cmwpLCBzaWxlbnQgPSBUUlVFKQ0KICBpZiAoaW5oZXJpdHMoZml0LCAidHJ5LWVycm9yIikpIHsNCiAgICBtZXNzYWdlKCJSZXRyeWluZyB3aXRoICdOZWxkZXJfTWVhZCcgb3B0aW1pemVyLi4uIikNCiAgICBjdHJsMiA8LSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gIk5lbGRlcl9NZWFkIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMjAwMDAwKSkNCiAgICBmaXQgICA8LSB0cnkoZ2xtZXIoZm9ybXVsYSwgZmFtaWx5ID0gYmlub21pYWwoImxvZ2l0IiksIGRhdGEgPSBkYXRhLCBjb250cm9sID0gY3RybDIpLCBzaWxlbnQgPSBUUlVFKQ0KICB9DQogIGZpdA0KfQ0KDQojIEV4dHJhY3QgT2RkcyBSYXRpb3MgYW5kIFdhbGQgOTUlIENJIGZyb20gZml4ZWQgZWZmZWN0cw0Kb3JfY2kgPC0gZnVuY3Rpb24oZml0LCBhbHBoYSA9IDAuMDUpIHsNCiAgaWYgKGlzLm51bGwoZml0KSB8fCBpbmhlcml0cyhmaXQsICJ0cnktZXJyb3IiKSkgcmV0dXJuKE5VTEwpDQogIGNvIDwtIGxtZTQ6OmZpeGVmKGZpdCkNCiAgdmMgPC0gbG1lNDo6dmNvdi5tZXJNb2QoZml0KQ0KICBzZSA8LSBzcXJ0KGRpYWcodmMpKQ0KICB6ICA8LSBxbm9ybSgxIC0gYWxwaGEvMikNCiAgZGF0YS5mcmFtZSgNCiAgICB0ZXJtICAgICA9IG5hbWVzKGNvKSwNCiAgICBlc3RpbWF0ZSA9IHVubmFtZShjbyksDQogICAgT1IgICAgICAgPSBleHAodW5uYW1lKGNvKSksDQogICAgTENMICAgICAgPSBleHAodW5uYW1lKGNvKSAtIHoqc2UpLA0KICAgIFVDTCAgICAgID0gZXhwKHVubmFtZShjbykgKyB6KnNlKSwNCiAgICBTRSAgICAgICA9IHNlLA0KICAgIHJvdy5uYW1lcyAgICA9IE5VTEwsDQogICAgY2hlY2submFtZXMgID0gRkFMU0UNCiAgKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQojIEJ1aWxkIGFuZCBmaXQgbW9kZWwgZm9yIGEgdGFyZ2V0IGNoZW1pY2FsJ3MgRXhwb3NlZCAoRk9DQUwgT05MWTsgbm8gYWRqdXN0ZXJzKQ0KZml0X3RhcmdldF9leHBvc2VkIDwtIGZ1bmN0aW9uKGxldHRlciwgZGF0YSwgZXhwX3ZhcnMsIHVzZV9vdXRjb21lID0gYygiYXBpIiwiY3JpdGgiKSwgdmVyYm9zZSA9IFRSVUUpIHsNCiAgdXNlX291dGNvbWUgPC0gbWF0Y2guYXJnKHVzZV9vdXRjb21lKQ0KICB0YXJnZXQgPC0gcGFzdGUwKGxldHRlciwgIi5FeHBvc2VkIikNCiAgaWYgKCF0YXJnZXQgJWluJSBleHBfdmFycykgcmV0dXJuKE5VTEwpDQogIA0KICAjIFRhcmdldCBtdXN0IHZhcnkgKGJvdGggVFJVRSBhbmQgRkFMU0UgcHJlc2VudCkNCiAgaWYgKGxlbmd0aChuYS5vbWl0KHVuaXF1ZShkYXRhW1t0YXJnZXRdXSkpKSA8IDIpIHsNCiAgICBpZiAodmVyYm9zZSkgbWVzc2FnZSgiU2tpcHBpbmcgIiwgbGV0dGVyLCAiOiAiLCB0YXJnZXQsICIgZG9lcyBub3QgdmFyeS4iKQ0KICAgIHJldHVybihOVUxMKQ0KICB9DQogIA0KICAjIEJ1aWxkIGZvcm11bGE6IGNiaW5kKHBvcyxuZWcpIH4gdGFyZ2V0ICsgKDEgfCBncmVlbmhvdXNlKQ0KICBpZiAodXNlX291dGNvbWUgPT0gImFwaSIpIHsNCiAgICBmX3N0ciA8LSBwYXN0ZSgiY2JpbmQoYXBpX3Bvc19iLCBhcGlfbmVnX2IpIH4iLCB0YXJnZXQsICIrICgxIHwgZ3JlZW5ob3VzZSkiKQ0KICB9IGVsc2Ugew0KICAgIGZfc3RyIDwtIHBhc3RlKCJjYmluZChjcml0aF9wb3NfYiwgY3JpdGhfbmVnX2IpIH4iLCB0YXJnZXQsICIrICgxIHwgZ3JlZW5ob3VzZSkiKQ0KICB9DQogIGZtbGEgPC0gYXMuZm9ybXVsYShmX3N0cikNCiAgDQogIGlmICh2ZXJib3NlKSB7DQogICAgY2F0KCJcbi0tLS1cbkZpdHRpbmcgZm9yIGNoZW1pY2FsICIsIGxldHRlciwgIlxuRm9ybXVsYTogIiwgZl9zdHIsICJcbiIsIHNlcCA9ICIiKQ0KICB9DQogIA0KICAjIEZpdCBtb2RlbCAoZ2xtZXIgZHJvcHMgcm93cyB3aXRoIE5BIGluIGFueSB2YXJpYWJsZSB1c2VkKQ0KICBmaXQgPC0gc2FmZV9nbG1lcihmbWxhLCBkYXRhID0gZGF0YSkNCiAgDQogIGlmIChpbmhlcml0cyhmaXQsICJ0cnktZXJyb3IiKSkgew0KICAgIHdhcm5pbmcoIk1vZGVsIGZhaWxlZCBmb3IgIiwgbGV0dGVyKQ0KICAgIHJldHVybihOVUxMKQ0KICB9DQogIA0KICAjIENvbGxlY3QgT1IgdGFibGUgYW5kIGFkZCBtZXRhZGF0YQ0KICB0YWIgPC0gb3JfY2koZml0LCBhbHBoYSA9IGFscGhhKQ0KICB0YWIkY2hlbWljYWwgPC0gbGV0dGVyDQogIHRhYiRmb3JtdWxhICA8LSBmX3N0cg0KICANCiAgIyBJbmNsdWRlIGNvbnZlcmdlbmNlIHN0YXR1cw0KICBjb252IDwtIHRyeUNhdGNoKGlzLm51bGwoZml0QG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2VzKSwgZXJyb3IgPSBmdW5jdGlvbihlKSBOQSkNCiAgdGFiJGNvbnZlcmdlZCA8LSBjb252DQogIA0KICBsaXN0KGZpdCA9IGZpdCwgb3IgPSB0YWIpDQp9DQpgYGANCg0KDQpgYGB7cn0NCg0KIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMjIFJ1biBtb2RlbHMgcGVyIGNoZW1pY2FsDQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBMZXR0ZXJzIGF2YWlsYWJsZSAoQS4uWikgaW5mZXJyZWQgZnJvbSBjb2x1bW5zIGxpa2UgIkEuRXhwb3NlZCINCmxldHRlcnNfcHJlc2VudCA8LSB1bmlxdWUoc3ViKCJcXC5FeHBvc2VkJCIsICIiLCBleHBfdmFycykpDQpsZXR0ZXJzX3ByZXNlbnQgPC0gbGV0dGVyc19wcmVzZW50W2xldHRlcnNfcHJlc2VudCAlaW4lIExFVFRFUlNdICAjIGtlZXAgdXBwZXJjYXNlIEEuLloNCg0KcmVzdWx0cyA8LSB2ZWN0b3IoImxpc3QiLCBsZW5ndGgobGV0dGVyc19wcmVzZW50KSkNCm5hbWVzKHJlc3VsdHMpIDwtIGxldHRlcnNfcHJlc2VudA0KDQpmb3IgKEwgaW4gbGV0dGVyc19wcmVzZW50KSB7DQogIHJlc3VsdHNbW0xdXSA8LSBmaXRfdGFyZ2V0X2V4cG9zZWQoDQogICAgTCwNCiAgICBkYXRhICAgICAgID0gZGYsDQogICAgZXhwX3ZhcnMgICA9IGV4cF92YXJzLA0KICAgIHVzZV9vdXRjb21lPSB1c2Vfb3V0Y29tZSwNCiAgICB2ZXJib3NlICAgID0gdmVyYm9zZQ0KICApDQp9DQpgYGANCg0KYGBge3J9DQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyMgNSkgQ29tYmluZSBhbmQgcmVwb3J0DQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBCaW5kIE9SIHRhYmxlcw0Kb3JfbGlzdCA8LSBsYXBwbHkocmVzdWx0cywgZnVuY3Rpb24oeCkgaWYgKGlzLm51bGwoeCkpIE5VTEwgZWxzZSB4JG9yKQ0Kb3JfdGJsICA8LSBiaW5kX3Jvd3Mob3JfbGlzdCkNCg0KIyBLZWVwIG9ubHkgZm9jYWwgdGVybXMgb2YgdGhlIGZvcm0gIjxMZXR0ZXI+LkV4cG9zZWRUUlVFIg0KcHJpbWFyeV90YmwgPC0gTlVMTA0KaWYgKCFpcy5udWxsKG9yX3RibCkgJiYgbnJvdyhvcl90YmwpID4gMCkgew0KICBrZWVwIDwtIGdyZXBsKCJeW0EtWl1cXC5FeHBvc2VkVFJVRSQiLCBhcy5jaGFyYWN0ZXIob3JfdGJsJHRlcm0pKQ0KICBwcmltYXJ5X3RibCA8LSBvcl90Ymxba2VlcCwgLCBkcm9wID0gRkFMU0VdDQp9IGVsc2Ugew0KICBwcmltYXJ5X3RibCA8LSBvcl90YmwgICMgc3RheXMgTlVMTCBvciBlbXB0eSBhcy1pcw0KfQ0KDQojIE9wdGlvbmFsOiBwLXZhbHVlcyBhbmQgRkRSIGFjcm9zcyBmb2NhbCB0ZXJtcyAoV2FsZCB6KQ0KaWYgKCFpcy5udWxsKHByaW1hcnlfdGJsKSAmJiBucm93KHByaW1hcnlfdGJsKSA+IDApIHsNCiAgel92YWxzIDwtIHByaW1hcnlfdGJsJGVzdGltYXRlIC8gcHJpbWFyeV90YmwkU0UNCiAgcF92YWxzIDwtIDIgKiBwbm9ybShhYnMoel92YWxzKSwgbG93ZXIudGFpbCA9IEZBTFNFKQ0KICBwcmltYXJ5X3RibCA8LSBwcmltYXJ5X3RibCAlPiUNCiAgICBtdXRhdGUoDQogICAgICB6ICAgICAgICA9IHpfdmFscywNCiAgICAgIHBfdmFsdWUgID0gcF92YWxzLA0KICAgICAgcF9GRFJfQkggPSBwLmFkanVzdChwX3ZhbHMsIG1ldGhvZCA9ICJCSCIpDQogICAgKSAlPiUNCiAgICBhcnJhbmdlKHBfRkRSX0JILCBjaGVtaWNhbCkNCn0NCg0KIyBQcmludCBzdW1tYXJ5DQpjYXQoIlxuPT09PT09PT09PT09PT09PSBQUklNQVJZIEVGRkVDVFMgKFguRXhwb3NlZCBUUlVFIHZzIEZBTFNFKSA9PT09PT09PT09PT09PT09XG4iKQ0KaWYgKGlzLm51bGwocHJpbWFyeV90YmwpIHx8IG5yb3cocHJpbWFyeV90YmwpID09IDApIHsNCiAgY2F0KCJObyBtb2RlbHMgcHJvZHVjZWQgZm9jYWwgdGVybXMuIENoZWNrIGRhdGEuXG4iKQ0KfSBlbHNlIHsNCiAgcHJpbnQocHJpbWFyeV90YmwgLCBkaWdpdHMgPSA0LCByb3cubmFtZXMgPSBGQUxTRSkNCn0NCg0KYGBgDQoNCg0KDQojIyMoMikgZG9lcyB0aGUgYW1vdW50IG9mIGEgcGFydGljdWxhciBjaGVtaWNhbCBjb3JyZWxhdGUgd2l0aCBwYXJhc2l0ZSBpbmZlY3Rpb24NCg0KDQpgYGB7cn0NCiMjIyA+Pj4+Pj4+Pj4+Pj4+Pj4+PiBVU0VSIE9QVElPTiA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwNCiMjIENob29zZSAiYXBpIiBvciAiY3JpdGgiDQpyZXNwb25zZV9jaG9pY2UgPC0gImNyaXRoIg0KI2JlIHN1cmUgdG8gc2V0IHBhcnRpY3VsYXIgY2hlbWljYWwgbGV0dGVyIGNvZGUgdGhhdCB5b3Ugd2FudCBwb3N0IGhvYyBmb3IoU3RhZ2UtMiBwZXIgY2hlbWljYWwsIGxpbmUgMzYwKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBSZXNwb25zZSB2YXJpYWJsZSBtYXBwaW5nDQpyZXNwb25zZV9tYXAgPC0gbGlzdCgNCiAgYXBpICAgPSBjKHBvcyA9ICJhcGlfcG9zX2IiLCAgIG5lZyA9ICJhcGlfbmVnX2IiKSwNCiAgY3JpdGggPSBjKHBvcyA9ICJjcml0aF9wb3NfYiIsIG5lZyA9ICJjcml0aF9uZWdfYiIpDQopDQoNCnJlc3AgPC0gcmVzcG9uc2VfbWFwW1tyZXNwb25zZV9jaG9pY2VdXQ0KDQpzdG9waWZub3QoYWxsKGMocmVzcFsicG9zIl0sIHJlc3BbIm5lZyJdLCAiZ3JlZW5ob3VzZSIpICVpbiUgbmFtZXMoZGYpKSkNCg0KZGYkZ3JlZW5ob3VzZSA8LSBmYWN0b3IoZGYkZ3JlZW5ob3VzZSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBJZGVudGlmeSBFeHBvc2VkIC8gQmluIGNvbHVtbnMNCmV4cF92YXJzIDwtIGdyZXAoIlxcLkV4cG9zZWQkIiwgbmFtZXMoZGYpLCB2YWx1ZSA9IFRSVUUpDQpiaW5fdmFycyA8LSBncmVwKCJcXC5CaW4kIiwgICAgIG5hbWVzKGRmKSwgdmFsdWUgPSBUUlVFKQ0KaWYgKGxlbmd0aChleHBfdmFycykgPT0gMEwpIHN0b3AoIk5vICouRXhwb3NlZCBjb2x1bW5zIGZvdW5kLiIpDQppZiAobGVuZ3RoKGJpbl92YXJzKSA9PSAwTCkgc3RvcCgiTm8gKi5CaW4gY29sdW1ucyBmb3VuZC4iKQ0KDQojIENvbnZlcnQgZXhwb3N1cmUgdmFyaWFibGVzDQpmb3IgKHYgaW4gZXhwX3ZhcnMpIHsNCiAgeCA8LSBhcy5jaGFyYWN0ZXIoZGZbW3ZdXSk7IHhbeCA9PSAiIl0gPC0gTkENCiAgZGZbW3ZdXSA8LSBmYWN0b3IoeCkNCiAgaWYgKCJGQUxTRSIgJWluJSBsZXZlbHMoZGZbW3ZdXSkpIGRmW1t2XV0gPC0gc3RhdHM6OnJlbGV2ZWwoZGZbW3ZdXSwgcmVmID0gIkZBTFNFIikNCn0NCg0KIyBLZWVwIGJpbiBhcyBjaGFyYWN0ZXIgZm9yIGNvbGxhcHNpbmcNCmZvciAodiBpbiBiaW5fdmFycykgew0KICB4IDwtIGFzLmNoYXJhY3RlcihkZltbdl1dKTsgeFt4ID09ICIiXSA8LSBOQQ0KICBkZltbdl1dIDwtIHgNCn0NCg0KIyBMZXR0ZXJzIHRvIHByb2Nlc3MNCmxldHRlcnNfcHJlc2VudCA8LSBpbnRlcnNlY3Qoc3ViKCJcXC5CaW4kIiwgIiIsIGJpbl92YXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJcXC5FeHBvc2VkJCIsICIiLCBleHBfdmFycykpDQpsZXR0ZXJzX3ByZXNlbnQgPC0gbGV0dGVyc19wcmVzZW50W2xldHRlcnNfcHJlc2VudCAlaW4lIExFVFRFUlNdDQppZiAoIWxlbmd0aChsZXR0ZXJzX3ByZXNlbnQpKSBzdG9wKCJObyBjaGVtaWNhbCBsZXR0ZXJzIEEuLlogZm91bmQuIikNCmBgYA0KDQoNCmBgYHtyfQ0KDQojIC0tLS0tLS0tLS0gSGVscGVycyAtLS0tLS0tLS0tDQpzYWZlX2dsbWVyIDwtIGZ1bmN0aW9uKGZvcm11bGEsIGRhdGEpIHsNCiAgY3RybDEgPC0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyMDAwMDApKQ0KICBmaXQgPC0gdHJ5KGdsbWVyKGZvcm11bGEsIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpLCBkYXRhID0gZGF0YSwgY29udHJvbCA9IGN0cmwxKSwgc2lsZW50ID0gVFJVRSkNCiAgaWYgKGluaGVyaXRzKGZpdCwgInRyeS1lcnJvciIpKSB7DQogICAgbWVzc2FnZSgiUmV0cnlpbmcgd2l0aCAnTmVsZGVyX01lYWQnIG9wdGltaXplci4uLiIpDQogICAgY3RybDIgPC0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJOZWxkZXJfTWVhZCIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDIwMDAwMCkpDQogICAgZml0IDwtIHRyeShnbG1lcihmb3JtdWxhLCBmYW1pbHkgPSBiaW5vbWlhbCgibG9naXQiKSwgZGF0YSA9IGRhdGEsIGNvbnRyb2wgPSBjdHJsMiksIHNpbGVudCA9IFRSVUUpDQogIH0NCiAgZml0DQp9DQoNCm9yX2NpIDwtIGZ1bmN0aW9uKGZpdCwgYWxwaGEgPSAwLjA1KSB7DQogIGNvIDwtIGxtZTQ6OmZpeGVmKGZpdCkNCiAgdmMgPC0gbG1lNDo6dmNvdi5tZXJNb2QoZml0KQ0KICBzZSA8LSBzcXJ0KGRpYWcodmMpKQ0KICB6ICA8LSBxbm9ybSgxIC0gYWxwaGEvMikNCiAgZGF0YS5mcmFtZSgNCiAgICB0ZXJtID0gbmFtZXMoY28pLA0KICAgIGVzdGltYXRlID0gdW5uYW1lKGNvKSwNCiAgICBTRSA9IHVubmFtZShzZSksDQogICAgT1IgPSBleHAoY28pLA0KICAgIExDTCA9IGV4cChjbyAtIHogKiBzZSksDQogICAgVUNMID0gZXhwKGNvICsgeiAqIHNlKSwNCiAgICByb3cubmFtZXMgPSBOVUxMDQogICkNCn0NCg0KY2hvb3NlX3NtYWxsZXN0X3JlZiA8LSBmdW5jdGlvbihsZXZlbHNfcHJlc2VudCkgew0KICBmb3IgKGNhbmQgaW4gYygiMC0xIiwiMiIsIjNwbHVzIikpIGlmIChjYW5kICVpbiUgbGV2ZWxzX3ByZXNlbnQpIHJldHVybihjYW5kKQ0KICByZXR1cm4obGV2ZWxzX3ByZXNlbnRbMV0pDQp9DQoNCg0KYGBgDQoNCg0KYGBge3J9DQojIC0tLS0tLS0tLS0gU3RhZ2UtMiBwZXIgY2hlbWljYWwgLS0tLS0tLS0tLQ0Kcm93cyA8LSBsaXN0KCkNCg0KZm9yIChsZXR0ZXIgaW4gbGV0dGVyc19wcmVzZW50KSB7DQogIGV4cF92YXIgPC0gcGFzdGUwKGxldHRlciwgIi5FeHBvc2VkIikNCiAgYmluX3ZhciA8LSBwYXN0ZTAobGV0dGVyLCAiLkJpbiIpDQogIGlmICghYWxsKGMoZXhwX3ZhciwgYmluX3ZhcikgJWluJSBuYW1lcyhkZikpKSBuZXh0DQogIA0KICBkYXQyIDwtIGRmICU+JSBmaWx0ZXIoLmRhdGFbW2V4cF92YXJdXSA9PSAiVFJVRSIpDQogIGlmIChucm93KGRhdDIpID09IDBMKSBuZXh0DQogIA0KICAjIFVwZGF0ZWQgYmlubmluZw0KICBkYXQyIDwtIGRhdDIgJT4lDQogICAgbXV0YXRlKA0KICAgICAgQmluQ29sbGFwc2VkID0gY2FzZV93aGVuKA0KICAgICAgICAuZGF0YVtbYmluX3Zhcl1dICVpbiUgYygiMCIsIjEiKSB+ICIwLTEiLA0KICAgICAgICAuZGF0YVtbYmluX3Zhcl1dID09ICIyIiAgICAgICAgIH4gIjIiLA0KICAgICAgICAuZGF0YVtbYmluX3Zhcl1dICVpbiUgYygiMyIsIjQiLCI1IiwiNiIpIH4gIjNwbHVzIiwNCiAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICAgICkNCiAgICApDQogIA0KICB0YWJfbGV2ZWxzIDwtIG5hbWVzKHRhYmxlKGRhdDIkQmluQ29sbGFwc2VkLCB1c2VOQSA9ICJubyIpKQ0KICBpZiAobGVuZ3RoKHRhYl9sZXZlbHMpIDwgMikgbmV4dA0KICANCiAgcmVmX2xldmVsIDwtIGNob29zZV9zbWFsbGVzdF9yZWYodGFiX2xldmVscykNCiAgbHZsX29yZGVyIDwtIGMoIjAtMSIsICIyIiwgIjNwbHVzIikNCiAgDQogIGRhdDIkQmluQ29sbGFwc2VkIDwtIGZhY3RvcihkYXQyJEJpbkNvbGxhcHNlZCwgbGV2ZWxzID0gbHZsX29yZGVyKQ0KICBkYXQyJEJpbkNvbGxhcHNlZCA8LSBzdGF0czo6cmVsZXZlbChkYXQyJEJpbkNvbGxhcHNlZCwgcmVmX2xldmVsKQ0KICANCiAgIyBGaXQgR0xNTSB1c2luZyBjaG9zZW4gcmVzcG9uc2UgdmFyaWFibGUNCiAgZm9ybSA8LSBhcy5mb3JtdWxhKA0KICAgIHBhc3RlMCgiY2JpbmQoIiwgcmVzcFsicG9zIl0sICIsICIsIHJlc3BbIm5lZyJdLCAiKSB+IEJpbkNvbGxhcHNlZCArICgxIHwgZ3JlZW5ob3VzZSkiKQ0KICApDQogIA0KICBmaXQgPC0gc2FmZV9nbG1lcihmb3JtLCBkYXQyKQ0KICBpZiAoaW5oZXJpdHMoZml0LCAidHJ5LWVycm9yIikpIG5leHQNCiAgDQogIHRhYiA8LSBvcl9jaShmaXQsIGFscGhhKQ0KICB0YWIgPC0gc3Vic2V0KHRhYiwgdGVybSAhPSAiKEludGVyY2VwdCkiKQ0KICANCiAgIyByZW5hbWUgdGVybXMNCiAgdGFiJHRlcm0gPC0gc3ViKCJeQmluQ29sbGFwc2VkIiwgcGFzdGUwKGxldHRlciwgIi5CaW4iKSwgdGFiJHRlcm0pDQogIA0KICAjIG1ldGFkYXRhDQogIHRhYiRjaGVtaWNhbCAgPC0gbGV0dGVyDQogIHRhYiRzdGFnZSAgICAgPC0gcGFzdGUwKCJTdGFnZTJfIiwgcmVzcG9uc2VfY2hvaWNlLCAiX0Jpbl8wXzFfMl8zcGx1c192c18iLCByZWZfbGV2ZWwpDQogIHRhYiRmb3JtdWxhICAgPC0gZGVwYXJzZShmb3JtKQ0KICB0YWIkcmVmZXJlbmNlIDwtIHJlZl9sZXZlbA0KICB0YWIkeiAgICAgICAgIDwtIHdpdGgodGFiLCBlc3RpbWF0ZSAvIFNFKQ0KICB0YWIkcF92YWx1ZSAgIDwtIHdpdGgodGFiLCAyICogcG5vcm0oYWJzKHopLCBsb3dlci50YWlsID0gRkFMU0UpKQ0KICB0YWIkY29udmVyZ2VkIDwtIGlzLm51bGwoZml0QG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2VzKQ0KICANCiAgcm93c1tbbGV0dGVyXV0gPC0gdGFiDQp9DQoNCm91dCA8LSBiaW5kX3Jvd3Mocm93cykNCg0KaWYgKG5yb3cob3V0KSkgew0KICBvdXQgPC0gb3V0ICU+JSBtdXRhdGUocF9GRFJfQkggPSBwLmFkanVzdChwX3ZhbHVlLCBtZXRob2QgPSAiQkgiKSkgJT4lDQogICAgYXJyYW5nZShjaGVtaWNhbCwgdGVybSkNCn0NCiAgDQogIA0KYGBgDQoNCiMjIyMgcmVzdWx0cyB0YWJsZSBmb3Igd2F4IHJlc2RpdWUgYW5hbHlzaXMgDQoNCmBgYHtyfQ0KDQojVGFibGUgb2YgcmVzdWx0cw0Kb3V0DQoNCmBgYA0KDQoNCiMjIyMgS2V5IHRvIGxldHRlcnMgZGVzaW5nYXRlZCB0byBlYWNoIGNoZW1pY2FsIGNvbXBvdW5kIA0KDQpgYGB7cn0NCmNvbXBvdW5kX2xldHRlcnMgPC0gZGF0YS5mcmFtZSgNCiAgQ29tcG91bmQgPSBjKA0KICAgICJDaGxvcmFudHJhbmlsaXByb2xlIiwNCiAgICAiY2hsb3JmZW5hcHlyIiwNCiAgICAiZGlmZW5vY29uYXpvbGUiLA0KICAgICJmbHVvcHlyYW0iLA0KICAgICJoZXh5dGhpYXpveCIsDQogICAgIm15Y2xvYnV0YW5pbCIsDQogICAgIlByb3BhbW9jYXJiIiwNCiAgICAiUHlyYWNsb3N0cm9iaW4iLA0KICAgICJQeXJpbWV0aGFuaWwiLA0KICAgICJQeXJpcHJveHlmZW4iLA0KICAgICJTcGlyb3RldHJhbWF0IiwNCiAgICAiYXpveHlzdHJvYmluIiwNCiAgICAiYmlmZW5hemF0ZSIsDQogICAgImRpcGhlbnlsYW1pbmUiLA0KICAgICJGZW5weXJveGltYXRlIiwNCiAgICAiYm9zY2FsaWQiLA0KICAgICJjaGxvem9saW5hdGUiLA0KICAgICJmbG9uaWNhbWlkIiwNCiAgICAiUGljb3h5c3Ryb2JpbiIsDQogICAgInNwaW5ldG9yYW0iLA0KICAgICJTcGlub3N5biBBIiwNCiAgICAiU3Bpbm9zeW4gRCIsDQogICAgInRyaWZsb3h5c3Ryb2JpbiINCiAgKSwNCiAgTGV0dGVyID0gTEVUVEVSU1sxOjIzXQ0KKQ0KDQpjb21wb3VuZF9sZXR0ZXJzICU+JQ0KICBrYWJsZSgNCiAgICBmb3JtYXQgPSAiaHRtbCIsDQogICAgY2FwdGlvbiA9ICJQZXN0aWNpZGUgbmFtZXMgYW5kIGNvcnJlc3BvbmRpbmcgbGV0dGVycyB1c2VkIGluIGFuYWx5c2VzIiwNCiAgICBhbGlnbiA9IGMoImwiLCAiYyIpDQogICkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCiNmb3IgZmlndXJlL3Bvc3QgaG9jIGFuYWx5c2lzIyMjIw0KIyMjID4+Pj4+Pj4+Pj4+Pj4+Pj4+IFVTRVIgT1BUSU9OIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PA0KI3VzZXI6IHNldCBmb2NhbCBjaGVtaWNhbA0KRk9DQUxfQ0hFTSA8LSAiSyINCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZm9yIChsZXR0ZXIgaW4gRk9DQUxfQ0hFTSkgew0KICBleHBfdmFyIDwtIHBhc3RlMChsZXR0ZXIsICIuRXhwb3NlZCIpDQogIGJpbl92YXIgPC0gcGFzdGUwKGxldHRlciwgIi5CaW4iKQ0KICBpZiAoIWFsbChjKGV4cF92YXIsIGJpbl92YXIpICVpbiUgbmFtZXMoZGYpKSkgbmV4dA0KICANCiAgZGF0MiA8LSBkZiAlPiUgZmlsdGVyKC5kYXRhW1tleHBfdmFyXV0gPT0gIlRSVUUiKQ0KICBpZiAobnJvdyhkYXQyKSA9PSAwTCkgbmV4dA0KICANCiAgIyBVcGRhdGVkIGJpbm5pbmcNCiAgZGF0MiA8LSBkYXQyICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIEJpbkNvbGxhcHNlZCA9IGNhc2Vfd2hlbigNCiAgICAgICAgLmRhdGFbW2Jpbl92YXJdXSAlaW4lIGMoIjAiLCIxIikgfiAiMC0xIiwNCiAgICAgICAgLmRhdGFbW2Jpbl92YXJdXSA9PSAiMiIgICAgICAgICB+ICIyIiwNCiAgICAgICAgLmRhdGFbW2Jpbl92YXJdXSAlaW4lIGMoIjMiLCI0IiwiNSIsIjYiKSB+ICIzcGx1cyIsDQogICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICAgICApDQogICAgKQ0KICANCiAgdGFiX2xldmVscyA8LSBuYW1lcyh0YWJsZShkYXQyJEJpbkNvbGxhcHNlZCwgdXNlTkEgPSAibm8iKSkNCiAgaWYgKGxlbmd0aCh0YWJfbGV2ZWxzKSA8IDIpIG5leHQNCiAgDQogIHJlZl9sZXZlbCA8LSBjaG9vc2Vfc21hbGxlc3RfcmVmKHRhYl9sZXZlbHMpDQogIGx2bF9vcmRlciA8LSBjKCIwLTEiLCAiMiIsICIzcGx1cyIpDQogIA0KICBkYXQyJEJpbkNvbGxhcHNlZCA8LSBmYWN0b3IoZGF0MiRCaW5Db2xsYXBzZWQsIGxldmVscyA9IGx2bF9vcmRlcikNCiAgZGF0MiRCaW5Db2xsYXBzZWQgPC0gc3RhdHM6OnJlbGV2ZWwoZGF0MiRCaW5Db2xsYXBzZWQsIHJlZl9sZXZlbCkNCiAgDQogICMgRml0IEdMTU0gdXNpbmcgY2hvc2VuIHJlc3BvbnNlIHZhcmlhYmxlDQogIGZvcm0gPC0gYXMuZm9ybXVsYSgNCiAgICBwYXN0ZTAoImNiaW5kKCIsIHJlc3BbInBvcyJdLCAiLCAiLCByZXNwWyJuZWciXSwgIikgfiBCaW5Db2xsYXBzZWQgKyAoMSB8IGdyZWVuaG91c2UpIikNCiAgKQ0KICANCiAgZml0IDwtIHNhZmVfZ2xtZXIoZm9ybSwgZGF0MikNCiAgaWYgKGluaGVyaXRzKGZpdCwgInRyeS1lcnJvciIpKSBuZXh0DQogIA0KICB0YWIgPC0gb3JfY2koZml0LCBhbHBoYSkNCiAgdGFiIDwtIHN1YnNldCh0YWIsIHRlcm0gIT0gIihJbnRlcmNlcHQpIikNCiAgDQogICMgcmVuYW1lIHRlcm1zDQogIHRhYiR0ZXJtIDwtIHN1YigiXkJpbkNvbGxhcHNlZCIsIHBhc3RlMChsZXR0ZXIsICIuQmluIiksIHRhYiR0ZXJtKQ0KICANCiAgIyBtZXRhZGF0YQ0KICB0YWIkY2hlbWljYWwgIDwtIGxldHRlcg0KICB0YWIkc3RhZ2UgICAgIDwtIHBhc3RlMCgiU3RhZ2UyXyIsIHJlc3BvbnNlX2Nob2ljZSwgIl9CaW5fMF8xXzJfM3BsdXNfdnNfIiwgcmVmX2xldmVsKQ0KICB0YWIkZm9ybXVsYSAgIDwtIGRlcGFyc2UoZm9ybSkNCiAgdGFiJHJlZmVyZW5jZSA8LSByZWZfbGV2ZWwNCiAgdGFiJHogICAgICAgICA8LSB3aXRoKHRhYiwgZXN0aW1hdGUgLyBTRSkNCiAgdGFiJHBfdmFsdWUgICA8LSB3aXRoKHRhYiwgMiAqIHBub3JtKGFicyh6KSwgbG93ZXIudGFpbCA9IEZBTFNFKSkNCiAgdGFiJGNvbnZlcmdlZCA8LSBpcy5udWxsKGZpdEBvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlcykNCiAgDQogIHJvd3NbW2xldHRlcl1dIDwtIHRhYg0KfQ0KYGBgDQoNCg0KYGBge3J9DQpvdXQgPC0gYmluZF9yb3dzKHJvd3MpDQoNCmlmIChucm93KG91dCkpIHsNCiAgb3V0IDwtIG91dCAlPiUgbXV0YXRlKHBfRkRSX0JIID0gcC5hZGp1c3QocF92YWx1ZSwgbWV0aG9kID0gIkJIIikpICU+JQ0KICAgIGFycmFuZ2UoY2hlbWljYWwsIHRlcm0pDQp9DQoNCmVtX3Jlc3VsdHMgPC0gZW1tZWFucyhmaXQsICJCaW5Db2xsYXBzZWQiLCB0eXBlPSJyZXNwb25zZSIpDQplbV9yZXN1bHRzDQpwYWlycyhlbV9yZXN1bHRzLCBhZGp1c3Q9InR1a2V5IikNCg0KY2xkKGVtX3Jlc3VsdHMsIExldHRlcnMgPSBsZXR0ZXJzKQ0KDQpkZl9wbG90IDwtIGFzLmRhdGEuZnJhbWUoZW1fcmVzdWx0cykNCg0KYGBgDQoNCmBgYHtyfQ0KIyAxLiBDbGVhbiB0aGUgZGF0YSBiZWZvcmUgcGxvdHRpbmcNCmRmX3Bsb3QgPC0gZGZfcGxvdCAlPiUNCiAgbXV0YXRlKA0KICAgICMgUmVuYW1lIHRoZSBiaW5zDQogICAgQmluQ29sbGFwc2VkID0gY2FzZV93aGVuKA0KICAgICAgQmluQ29sbGFwc2VkID09ICIwLTEiICAgfiAiMSIsDQogICAgICBCaW5Db2xsYXBzZWQgPT0gIjNwbHVzIiB+ICIzIiwNCiAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgIH4gYXMuY2hhcmFjdGVyKEJpbkNvbGxhcHNlZCkgIyBLZWVwcyAiMiIgaWYgaXQgZXhpc3RzDQogICAgKSwNCiAgICAjIEZvcmNlIFIgdG8gcmVjb2duaXplIGFsbCB0aHJlZSBsZXZlbHMsIGV2ZW4gaWYgb25lIGhhcyBubyBkYXRhDQogICAgQmluQ29sbGFwc2VkID0gZmFjdG9yKEJpbkNvbGxhcHNlZCwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiKSkNCiAgKQ0KDQojc2F2ZSB0aGUgZGF0YSBmcmFtZSBmb3IgbGF0ZXINCiNmaWxlX25hbWUgPC0gcGFzdGUwKHJlc3BvbnNlX2Nob2ljZSwgIl8iLCBGT0NBTF9DSEVNLCAiLmNzdiIpDQojd3JpdGUuY3N2KGRmX3Bsb3QsIGZpbGUgPSBmaWxlX25hbWUsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCg0KIyMjIyBjb2RlIGZvcm1hdCBmb3IgZmlndXJlIDQNCg0KYGBge3J9DQpnZ3Bsb3QoZGZfcGxvdCwgYWVzKHggPSBCaW5Db2xsYXBzZWQsIHkgPSBwcm9iKSkgKw0KICAjIENyZWF0ZSB0aGUgYmFycw0KICBnZW9tX2NvbChjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMC43KSArDQogICMgQWRkIGVycm9yIGJhcnMgKHVzaW5nIHRoZSA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZnJvbSB0aGUgZGF0YSBmcmFtZSkNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHByb2ItU0UsIHltYXggPSBwcm9iK1NFKSwgd2lkdGggPSAwLjIpICsNCiAgIyBGb3JtYXR0aW5nDQogIHNjYWxlX3lfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKDAsIDEpLCANCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIA0KICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjA1KSkgDQogICkgKw0KICANCiAgc2NhbGVfeF9kaXNjcmV0ZShkcm9wID0gRkFMU0UpICsNCiAgbGFicyh0aXRsZSA9IEZPQ0FMX0NIRU0sDQogICAgICAgeCA9ICJCaW4iLA0KICAgICAgIHkgPSAiUHJlZGljdGVkIFByb2JhYmlsaXR5IG9mIEFwaXNpc3RpcyBJbmZlY3Rpb24gKCUpIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBndWlkZXMoZmlsbCA9ICJub25lIikgICsgIyBSZW1vdmVzIHJlZHVuZGFudCBsZWdlbmQNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwYW5lbCIsICAgICAgICAgICAgICMgQWxpZ25zIHRoZSB0aXRsZSB0byB0aGUgcGxvdCBwYW5lbCBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBmaWd1cmUNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgaGp1c3QgPSAwLjUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENlbnRlcnMgdGhlIHRpdGxlIHRleHQNCiAgICAgIHZqdXN0ID0gLTIuNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOZWdhdGl2ZSB2YWx1ZSBwdWxscyB0aGUgdGl0bGUgRE9XTiBpbnRvIHRoZSBncmFwaA0KICAgICAgZmFjZSA9ICJib2xkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsOiBNYWtlcyBpdCBzdGFuZCBvdXQgaW5zaWRlIHRoZSBwbG90DQogICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IC0yMCkgICAgICAgICAgICAgICAgICMgUHJldmVudHMgdGhlIHBsb3QgZnJvbSBjcmVhdGluZyBleHRyYSB3aGl0ZSBzcGFjZSBhYm92ZQ0KICAgICkNCiAgKQ0KDQpgYGANCg0KDQo=