Start Using the neg.reg Function

From the negligible R package


Introduction

Goal

This function evaluates whether a certain predictor variable in a multiple regression model can be considered statistically and practically negligible according to a predefined interval. i.e., minimally meaningful effect size (MMES)/smallest effect size of interest (SESOI). The effect tested is the (partial) relationship between the predictor of interest and the outcome variable, holding all other predictors constant.

Background

Unlike most common null hypothesis significance tests looking to detect a difference or the existence of an effect statistically different than zero, in negligible effect testing, the hypotheses are flipped: In essence, \(H_0\) states that the effect is non-negligible, whereas \(H_1\) states that the effect is in fact statistically and practically negligible.

The statistical tests are based on Anderson-Hauck (1983) and Schuirmann’s (1987) Two One-Sided Test (TOST) equivalence testing procedures; namely addressing the question of whether the estimated effect size (and its associated uncertainty) of a predictor variable in a multiple regression model is smaller than the what the user defines as negligible effect size. Defining what is considered negligible effect is done by specifying the negligible (equivalence) interval: its upper (eiu) and lower (eil) bounds.

The negligible (equivalence) interval should be set based on the context of the research. Because the predictor’s effect size can be in either standardized or unstandardized units, setting eil and eiu is a matter of determining what magnitude of the relationship between predictor and outcome in either standardized or unstandardized units is the minimally meaningful effect size given the context of the research.

Instructions

There are two main approaches to using neg.reg:

  • The first (and recommended) is by inserting a dataset (data = argument) into the function. If the user/s have access to the dataset, they should use the following set of arguments: data =, formula =, predictor =, bootstrap = (optional), nboot = (optional), and seed = (optional). However, this function also accommodates cases where no dataset is available which is discussed next.

  • The second approach should be used when the dataset is not available. In this case, users can use the following set of arguments instead: b =, se =, n =, and nop =. In either situation, users must specify the negligible interval bounds (eiu = and eil =).

Other optional arguments and features include: alpha =, std =, test =, plots =, and saveplots =.

Applied Examples

Example 1: “Unlinking” Deliberate Mind Wandering and OCD Symptomatology

Our first example comes from Seli et al. (2017) where the authors investigated the relationship between everyday experiences of mind wandering and OCD symptomatology. Seli and colleagues make a clear distinction between two types of mind wandering: the first is an unintentional, spontaneous mind wandering (MW-S), and the second is a voluntary and deliberate off-task thought (MW-D). This distinction is important because the authors hypothesized that MW-S will show a meaningful relationship with each of the four dimensions of OCD (contamination, responsibility for harm and mistakes, unacceptable thoughts, and symmetry/completeness) whereas MW-D will demonstrate a negligible, or no, association.

Because Seli et al. (2017) sought to demonstrate that MW-D was negligibly (or not at all) associated with each of the four OCD dimensions, we can use the neg.reg function. But, before we do, we must first define what is a (practically) meaningful effect in this context, i.e., the SESOI. Ideally, the SESOI should be derived from substantive knowledge of the effects in the research area, prior to inspecting the data. Numerous approaches to selecting the SESOI are possible; however, these details are beyond the scope of this vignette. For more information on justifying the SESOI, with examples, we recommend reading Anvari and Lakens (2021) and Lakens et al. (2018).

For our purposes, let’s set the SESOI at 5% of the maximum possible score on the Contamination dimension from the OCD scale. The Contamination subscale is measured from 0 to 20, therefore the SESOI was set at b = 1 (measured in unstandardized units of the outcome variable) such that our equivalence interval is (-1, 1). We hence set eil = -1 and eiu = 1. If the observed effect for MW-D and its associated uncertainty falls entirely within the SESOI bounds, from -1 to 1, we can conclude a negligible association between MW-D and Contamination.

With access to the dataset, users should first import their data file into the RStudio environment. The object name under which the imported dataset is saved (e.g., ocd) should then be inserted as the input for the first argument in the neg.reg function, such as data = ocd.

The next argument, formula =, requires the user to specify the regression model consisting of the outcome (i.e., criterion/dependent variable) to the left of the tilde symbol (~), followed by all the predictor variables in the model with the + sign between each predictor name.

Users should identify the exact variable names in the imported dataset they are interested in modelling and pay close attention to lower or capital case. In our example, the first outcome variable is contamination (one of the OCD symptomatology dimensions), labelled here ocd_cont. We have only two predictors in our example model, MW-D and MW-S (MWD + MWS), which then go to the left of the ~, such as formula = ocd_cont ~ MWD + MWS.

The predictor = argument asks users to specify which of the predictors they would like to test for a negligible effect. Because Seli et al. (2017) hypothesized a negligible or no association of MW-D with the outcomes, we specified predictor = MWD in the code example below.

Putting It All Together (when data is available)

library(negligible) # load the package

neg.reg(data = ocd, # name of dataset 
        formula = ocd_cont ~ MWD + MWS, # regression formula 
        predictor = MWD, # name of the predictor of interest 
        eiu = 1, # upper bound of SESOI (unstandardized) 
        eil = -1, # lower bound of SESOI (unstandardized) 
        std = FALSE, # using unstandardized units 
        bootstrap = FALSE) # not using bootstrap in example # <1>


*** Evaluating Negligible Effects Between Predictor and Outcome in Multiple Regression ***

Unstandardized regression coefficient for MWD:
b = -0.018, 95% CI [-0.109, 0.072]
std. error = 0.046

**********************

Anderson-Hauck (AH) procedure: 

Equivalence interval: lower= -1, upper= 1
Anderson-Hauck T statistic = -0.4
p < 0.001
NHST decision: The null hypothesis that the regression coefficient is non-negligible can be rejected. A negligible effect is concluded. Be sure to interpret the magnitude (and precision) of the effect size.

*Note that in rare cases, where p is close to α, NHST decisions using the AH procedure may not match TOST NHST results or the Symmetric CI Approach at 100*(1-2α)% illustrated in the plots. 

**********************

Proportional Distance 

Proportional distance: -0.018 
95% confidence interval for the proportional distance: (-0.115, 0.078)

*Note that the confidence interval for the proportional distance may not be precise with small sample sizes 
******************* 

In Example 1 above, we used the neg.reg function with access to the raw data to answer whether deliberate mind wandering truly has a negligible association with contamination, partialling out the effect of spontaneous mind wandering. The AH T statistics is statistically significant, \(AH-T = -0.4, p < 0.001\), indicating that the null hypothesis that the regression coefficient is non-negligible can be rejected. That is, the alternative hypothesis of a negligible effect is supported.

Results from the negligible effect testing approach using the neg.reg function are congruent with Seli et al.’s (2017) conclusion, which was obtained from a statistically nonsignificant difference-based test. It is often the case, however, that results from negligible effect testing contradict negligible association conclusions made using results from a nonsignificant difference-based test; this scenario will be demonstrated in Example 2 in the following section. Example 2 also shows how users can employ the neg.reg function without access to raw data.

Example 2: Personal Control Moderates the Association Between Organizational Stability and Identification

Proudfoot and Kay (2018) predicted that feelings of personal control would moderate the relationship between perceived organizational stability and organization identification. Specifically, they wished to demonstrate that a relationship between organizational stability and identification exists for participants with low personal control (“control threat” condition), but that no such effect is present for participants with high personal control (“control affirmation” condition).

To test their hypothesis, the authors modeled an interaction between organizational stability and personal control on organization identification in their multiple regression analysis. As reported in Study 3, the control × stability interaction (higher-order effect) was indeed statistically significant. Inspecting the simple slopes, the authors found that participants in the “control threat” condition exhibited a statistically significant relationship between stability and identification, whereas participants in the “control affirmation” condition did not, \(b = 0.15, SE = .12, t(190) = 1.18, p = .24\). It was concluded that “for participants who recalled an event wherein they had control, there was no effect of perceived organizational stability on identification” (Proudfoot & Kay, 2018, p. 110).

In this example, we do not have access to the dataset. Still, we can formally test whether the association between perceived organizational stability on identification is indeed negligible for participants in the “control affirmation” condition using the neg.reg function. Specifically, we will need the following:

  • the regression coefficient point estimate for organizational stability (\(b = 0.15\)) and its associated standard error (\(SE = 0.12\)),

  • the sample size used in the analysis (\(n = 194\)),

  • the number of predictors in the multiple regression model (\(k = 3\)),

  • and the nominal Type I error rate (\(α = .05\)).

Note that the reported effect and its associated standard error are measured in unstandardized units.

Again, we must identify our definition of practical significance in this context (selecting a SESOI). Let’s consider a SESOI of \(b = 0.33\) (measured in unstandardized units).

We can now plug the input into the neg.reg function’s arguments as demonstrated below

Putting It All Together (when data is unavailable)

neg.reg(b = 0.15, # effect size of the predictor of interest
        se = 0.12, # standard error associated with the effect
        n = 194, # sample size used in the analysis
        nop = 3, # number of predictors         
        eiu = 0.33, # upper bound of SESOI (unstandardized)
        eil = -0.33, # lower bound of SESOI (unstandardized)
        std = FALSE) # using unstandardized units


*** Evaluating Negligible Effects Between Predictor and Outcome in Multiple Regression ***

Unstandardized regression coefficient for predictor of interest:
b = 0.15, 95% CI [-0.087, 0.387]
std. error = 0.12

**********************

Anderson-Hauck (AH) procedure: 

Equivalence interval: lower= -0.33, upper= 0.33
Anderson-Hauck T statistic = 1.25
p = 0.068
NHST decision: The null hypothesis that the regression coefficient is non-negligible cannot be rejected. There is insufficient evidence to conclude a negligible effect. Be sure to interpret the magnitude (and precision) of the effect size.

*Note that in rare cases, where p is close to α, NHST decisions using the AH procedure may not match TOST NHST results or the Symmetric CI Approach at 100*(1-2α)% illustrated in the plots. 

**********************

Proportional Distance 

Proportional distance: 0.455 
95% confidence interval for the proportional distance: (-0.263, 1.172)

*Note that the confidence interval for the proportional distance may not be precise with small sample sizes 
******************* 

Additional Features

Finally, there are additional, optional features included in the function such as using bootstrap (and setting the number of iterations and/or seed) to calculate the standard errors, changing test type from AH (default) to TOST or nominal Type I error from .05 to another, custom rate, saving the resulted plots locally (e.g., as .png, or .jpeg) etc. Users are welcome to test these features following these brief argument definitions:

  • plots: If TRUE, plot will be generated in the output (highly recommended)
  • test: "AH" is the default based on recommendation in Alter & Counsell (2023), "TOST" is an additional option
  • bootstrap: logical, default is TRUE, incorporating bootstrapping when calculating regression coefficients, SE, and CIs
  • nboot: 1000 is the default. Indicates if other number of bootstrapping iterations is desired
  • saveplots: FALSE for no, "png" and "jpeg" for different formats
  • seed: to reproduce previous analyses using bootstrapping, the user can set their seed of choice

Other Considerations

It is necessary to be consistent with the units of measurement. For example, unstandardized negligible interval bounds (i.e., eil and eiu) must only be used when std = FALSE (default). If the effect size (b), standard error (se), and sample size (n) are entered manually as arguments (i.e., without the dataset), these should also be in the same units of measurements. Whereas if the user prefers to specify eiu and eil in standardized unites, std = TRUE should be specified. In which case, any units entered into the function must also be in standardized form. Mixing unstandardized and standardized units would yield inaccurate results and likely lead to invalid conclusions. Thus, users must be cognizant of the measurement units of the negligible interval.

The proportional distance (PD; effect size/eiu) estimates the proportional distance of the estimated effect to eiu, and acts as an alternative effect size measure.

The confidence interval for the PD is computed via bootstrapping (percentile bootstrap), unless the user does not insert a dataset. In which case, the PD confidence interval is calculated by dividing the upper and lower CI bounds for the effect size estimate by the absolute value of the negligible interval bounds.

For additional resources, see:

LS0tDQp0aXRsZTogIlN0YXJ0IFVzaW5nIHRoZSBgbmVnLnJlZ2AgRnVuY3Rpb24iDQpzdWJ0aXRsZTogfCANCiAgICBGcm9tIHRoZSBbYG5lZ2xpZ2libGVgXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbmVnbGlnaWJsZS9pbmRleC5odG1sKSBSIHBhY2thZ2UhW10oSTovTXkgRHJpdmUvUmVzZWFyY2gvQ3JpYmJpZSBMYWIvbmVnbGlnaWJsZSBWaWduZXR0ZXMvVGVtcGxhdGUvbmVnLmxvZ28ucG5nKXt3aWR0aD0xMCV9ICANCmF1dGhvcjogIltVZGkgQWx0ZXJdIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJvYm9ib29rOg0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0UsIG1lc3NhZ2VzPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInJtZGZvcm1hdHMiKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocm1kZm9ybWF0cywgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoa25pdHIsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkocGxvdGx5LCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShyZWFkeGwsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHBsb3RseSwgd2Fybi5jb25mbGljdHM9RkFMU0UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoTWV0QnJld2VyLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShnZ2FuaW1hdGUsIHdhcm4uY29uZmxpY3RzPUZBTFNFKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGRwbHlyLCB3YXJuLmNvbmZsaWN0cz1GQUxTRSkpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iNzUiKQ0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0Kb3B0c19rbml0JHNldCh3aWR0aD03NSkNCmBgYA0KDQo8YnIvPg0KDQoNCiMjIEludHJvZHVjdGlvbiANCg0KDQoNCiMjIyBHb2FsDQoNClRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzICoqd2hldGhlciBhIGNlcnRhaW4gcHJlZGljdG9yIHZhcmlhYmxlIGluIGEgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCBjYW4gYmUgY29uc2lkZXJlZCBzdGF0aXN0aWNhbGx5IGFuZCBwcmFjdGljYWxseSBuZWdsaWdpYmxlKiogYWNjb3JkaW5nIHRvIGEgcHJlZGVmaW5lZCBpbnRlcnZhbC4gaS5lLiwgbWluaW1hbGx5IG1lYW5pbmdmdWwgZWZmZWN0IHNpemUgKE1NRVMpL3NtYWxsZXN0IGVmZmVjdCBzaXplIG9mIGludGVyZXN0IChTRVNPSSkuIFRoZSBlZmZlY3QgdGVzdGVkIGlzIHRoZSAocGFydGlhbCkgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHByZWRpY3RvciBvZiBpbnRlcmVzdCBhbmQgdGhlIG91dGNvbWUgdmFyaWFibGUsIGhvbGRpbmcgYWxsIG90aGVyIHByZWRpY3RvcnMgY29uc3RhbnQuDQoNCiMjIyBCYWNrZ3JvdW5kDQoNClVubGlrZSBtb3N0IGNvbW1vbiBudWxsIGh5cG90aGVzaXMgc2lnbmlmaWNhbmNlIHRlc3RzIGxvb2tpbmcgdG8gZGV0ZWN0IGEgZGlmZmVyZW5jZSBvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGVmZmVjdCBzdGF0aXN0aWNhbGx5IGRpZmZlcmVudCB0aGFuIHplcm8sICoqaW4gbmVnbGlnaWJsZSBlZmZlY3QgdGVzdGluZywgdGhlIGh5cG90aGVzZXMgYXJlIGZsaXBwZWQ6IEluIGVzc2VuY2UsKiogJEhfMCQgc3RhdGVzIHRoYXQgdGhlIGVmZmVjdCBpcyBub24tbmVnbGlnaWJsZSwgd2hlcmVhcyAkSF8xJCBzdGF0ZXMgdGhhdCB0aGUgZWZmZWN0IGlzIGluIGZhY3Qgc3RhdGlzdGljYWxseSBhbmQgcHJhY3RpY2FsbHkgbmVnbGlnaWJsZS4NCg0KVGhlIHN0YXRpc3RpY2FsIHRlc3RzIGFyZSBiYXNlZCBvbiBBbmRlcnNvbi1IYXVjayAoMTk4MykgYW5kIFNjaHVpcm1hbm4ncyAoMTk4NykgVHdvIE9uZS1TaWRlZCBUZXN0IChUT1NUKSBlcXVpdmFsZW5jZSB0ZXN0aW5nIHByb2NlZHVyZXM7IG5hbWVseSBhZGRyZXNzaW5nIHRoZSBxdWVzdGlvbiBvZiAqKndoZXRoZXIgdGhlIGVzdGltYXRlZCBlZmZlY3Qgc2l6ZSAoYW5kIGl0cyBhc3NvY2lhdGVkIHVuY2VydGFpbnR5KSBvZiBhIHByZWRpY3RvciB2YXJpYWJsZSBpbiBhIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgaXMgc21hbGxlciB0aGFuIHRoZSB3aGF0IHRoZSB1c2VyIGRlZmluZXMgYXMgbmVnbGlnaWJsZSBlZmZlY3Qgc2l6ZS4qKiBEZWZpbmluZyB3aGF0IGlzIGNvbnNpZGVyZWQgbmVnbGlnaWJsZSBlZmZlY3QgaXMgZG9uZSBieSBzcGVjaWZ5aW5nIHRoZSBuZWdsaWdpYmxlIChlcXVpdmFsZW5jZSkgaW50ZXJ2YWw6IGl0cyB1cHBlciAoYGVpdWApIGFuZCBsb3dlciAoYGVpbGApIGJvdW5kcy4NCg0KVGhlIG5lZ2xpZ2libGUgKGVxdWl2YWxlbmNlKSBpbnRlcnZhbCBzaG91bGQgYmUgc2V0IGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHRoZSByZXNlYXJjaC4gQmVjYXVzZSB0aGUgcHJlZGljdG9yJ3MgZWZmZWN0IHNpemUgY2FuIGJlIGluIGVpdGhlciBzdGFuZGFyZGl6ZWQgb3IgdW5zdGFuZGFyZGl6ZWQgdW5pdHMsIHNldHRpbmcgYGVpbGAgYW5kIGBlaXVgIGlzIGEgbWF0dGVyIG9mIGRldGVybWluaW5nIHdoYXQgbWFnbml0dWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwcmVkaWN0b3IgYW5kIG91dGNvbWUgaW4gZWl0aGVyIHN0YW5kYXJkaXplZCBvciB1bnN0YW5kYXJkaXplZCB1bml0cyBpcyB0aGUgbWluaW1hbGx5IG1lYW5pbmdmdWwgZWZmZWN0IHNpemUgZ2l2ZW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlc2VhcmNoLg0KDQojIyBJbnN0cnVjdGlvbnMNCg0KVGhlcmUgYXJlIHR3byBtYWluIGFwcHJvYWNoZXMgdG8gdXNpbmcgYG5lZy5yZWdgOg0KDQotICAgVGhlIGZpcnN0ICoqKGFuZCByZWNvbW1lbmRlZCkqKiBpcyBieSBpbnNlcnRpbmcgYSBkYXRhc2V0IChgZGF0YSA9IGAgYXJndW1lbnQpIGludG8gdGhlIGZ1bmN0aW9uLiBJZiB0aGUgdXNlci9zIGhhdmUgYWNjZXNzIHRvIHRoZSBkYXRhc2V0LCB0aGV5IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyBzZXQgb2YgYXJndW1lbnRzOiBgZGF0YSA9YCwgYGZvcm11bGEgPWAsIGBwcmVkaWN0b3IgPWAsIGBib290c3RyYXAgPWAgKG9wdGlvbmFsKSwgYG5ib290ID1gIChvcHRpb25hbCksIGFuZCBgc2VlZCA9YCAob3B0aW9uYWwpLiBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIGFsc28gYWNjb21tb2RhdGVzIGNhc2VzIHdoZXJlIG5vIGRhdGFzZXQgaXMgYXZhaWxhYmxlIHdoaWNoIGlzIGRpc2N1c3NlZCBuZXh0Lg0KDQotIFRoZSBzZWNvbmQgYXBwcm9hY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZGF0YXNldCBpcyBub3QgYXZhaWxhYmxlLiBJbiB0aGlzIGNhc2UsIHVzZXJzIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBzZXQgb2YgYXJndW1lbnRzIGluc3RlYWQ6IGBiID1gLCBgc2UgPWAsIGBuID1gLCBhbmQgYG5vcCA9YC4gSW4gZWl0aGVyIHNpdHVhdGlvbiwgdXNlcnMgbXVzdCBzcGVjaWZ5IHRoZSBuZWdsaWdpYmxlIGludGVydmFsIGJvdW5kcyAoYGVpdSA9YCBhbmQgYGVpbCA9YCkuIA0KDQpPdGhlciBvcHRpb25hbCBhcmd1bWVudHMgYW5kIGZlYXR1cmVzIGluY2x1ZGU6IGBhbHBoYSA9YCwgYHN0ZCA9YCwgYHRlc3QgPWAsIGBwbG90cyA9YCwgYW5kIGBzYXZlcGxvdHMgPWAuDQoNCg0KIyMgQXBwbGllZCBFeGFtcGxlcw0KDQojIyMgRXhhbXBsZSAxOiDigJxVbmxpbmtpbmfigJ0gRGVsaWJlcmF0ZSBNaW5kIFdhbmRlcmluZyBhbmQgT0NEIFN5bXB0b21hdG9sb2d5DQoNCg0KDQpPdXIgZmlyc3QgZXhhbXBsZSBjb21lcyBmcm9tIFtTZWxpIGV0IGFsLiAoMjAxNyldKGh0dHBzOi8vcHN5Y25ldC5hcGEub3JnL2RvaUxhbmRpbmc/ZG9pPTEwLjEwMzclMkZhMDAzMTQzOCkgd2hlcmUgdGhlIGF1dGhvcnMgaW52ZXN0aWdhdGVkIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBldmVyeWRheSBleHBlcmllbmNlcyBvZiBtaW5kIHdhbmRlcmluZyBhbmQgT0NEIHN5bXB0b21hdG9sb2d5LiBTZWxpIGFuZCBjb2xsZWFndWVzIG1ha2UgYSBjbGVhciBkaXN0aW5jdGlvbiBiZXR3ZWVuIHR3byB0eXBlcyBvZiBtaW5kIHdhbmRlcmluZzogdGhlIGZpcnN0IGlzIGFuIHVuaW50ZW50aW9uYWwsIHNwb250YW5lb3VzIG1pbmQgd2FuZGVyaW5nIChNVy1TKSwgYW5kIHRoZSBzZWNvbmQgaXMgYSB2b2x1bnRhcnkgYW5kIGRlbGliZXJhdGUgb2ZmLXRhc2sgdGhvdWdodCAoTVctRCkuIFRoaXMgZGlzdGluY3Rpb24gaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGF1dGhvcnMgaHlwb3RoZXNpemVkIHRoYXQgTVctUyB3aWxsIHNob3cgYSBtZWFuaW5nZnVsIHJlbGF0aW9uc2hpcCB3aXRoIGVhY2ggb2YgdGhlIGZvdXIgZGltZW5zaW9ucyBvZiBPQ0QgKGNvbnRhbWluYXRpb24sIHJlc3BvbnNpYmlsaXR5IGZvciBoYXJtIGFuZCBtaXN0YWtlcywgdW5hY2NlcHRhYmxlIHRob3VnaHRzLCBhbmQgc3ltbWV0cnkvY29tcGxldGVuZXNzKSB3aGVyZWFzIE1XLUQgd2lsbCBkZW1vbnN0cmF0ZSBhIG5lZ2xpZ2libGUsIG9yIG5vLCBhc3NvY2lhdGlvbi4NCg0KQmVjYXVzZSBbU2VsaSBldCBhbC4gKDIwMTcpXShodHRwczovL3BzeWNuZXQuYXBhLm9yZy9kb2lMYW5kaW5nP2RvaT0xMC4xMDM3JTJGYTAwMzE0MzgpIHNvdWdodCB0byBkZW1vbnN0cmF0ZSB0aGF0IE1XLUQgd2FzIG5lZ2xpZ2libHkgKG9yIG5vdCBhdCBhbGwpIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9mIHRoZSBmb3VyIE9DRCBkaW1lbnNpb25zLCB3ZSBjYW4gdXNlIHRoZSBgbmVnLnJlZ2AgZnVuY3Rpb24uIEJ1dCwgYmVmb3JlIHdlIGRvLCB3ZSBtdXN0IGZpcnN0IGRlZmluZSB3aGF0IGlzIGEgKHByYWN0aWNhbGx5KSBtZWFuaW5nZnVsIGVmZmVjdCBpbiB0aGlzIGNvbnRleHQsIGkuZS4sIHRoZSBTRVNPSS4gSWRlYWxseSwgdGhlIFNFU09JIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gc3Vic3RhbnRpdmUga25vd2xlZGdlIG9mIHRoZSBlZmZlY3RzIGluIHRoZSByZXNlYXJjaCBhcmVhLCBwcmlvciB0byBpbnNwZWN0aW5nIHRoZSBkYXRhLiBOdW1lcm91cyBhcHByb2FjaGVzIHRvIHNlbGVjdGluZyB0aGUgU0VTT0kgYXJlIHBvc3NpYmxlOyBob3dldmVyLCB0aGVzZSBkZXRhaWxzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgdmlnbmV0dGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGp1c3RpZnlpbmcgdGhlIFNFU09JLCB3aXRoIGV4YW1wbGVzLCB3ZSByZWNvbW1lbmQgcmVhZGluZyBBbnZhcmkgYW5kIExha2VucyAoMjAyMSkgYW5kIExha2VucyBldCBhbC4gKDIwMTgpLg0KDQpGb3Igb3VyIHB1cnBvc2VzLCBsZXQncyBzZXQgdGhlIFNFU09JIGF0IDUlIG9mIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHNjb3JlIG9uIHRoZSBDb250YW1pbmF0aW9uIGRpbWVuc2lvbiBmcm9tIHRoZSBPQ0Qgc2NhbGUuIFRoZSBDb250YW1pbmF0aW9uIHN1YnNjYWxlIGlzIG1lYXN1cmVkIGZyb20gMCB0byAyMCwgdGhlcmVmb3JlIHRoZSBTRVNPSSB3YXMgc2V0IGF0IGIgPSAxIChtZWFzdXJlZCBpbiB1bnN0YW5kYXJkaXplZCB1bml0cyBvZiB0aGUgb3V0Y29tZSB2YXJpYWJsZSkgc3VjaCB0aGF0ICoqb3VyIGVxdWl2YWxlbmNlIGludGVydmFsIGlzICgtMSwgMSkqKi4gV2UgaGVuY2Ugc2V0IGBlaWwgPSAtMWAgYW5kIGBlaXUgPSAxYC4gSWYgdGhlIG9ic2VydmVkIGVmZmVjdCBmb3IgTVctRCBhbmQgaXRzIGFzc29jaWF0ZWQgdW5jZXJ0YWludHkgZmFsbHMgZW50aXJlbHkgd2l0aGluIHRoZSBTRVNPSSBib3VuZHMsIGZyb20gLTEgdG8gMSwgd2UgY2FuIGNvbmNsdWRlIGEgbmVnbGlnaWJsZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIE1XLUQgYW5kIENvbnRhbWluYXRpb24uDQoNCg0KV2l0aCBhY2Nlc3MgdG8gdGhlIGRhdGFzZXQsIHVzZXJzIHNob3VsZCBmaXJzdCBpbXBvcnQgdGhlaXIgZGF0YSBmaWxlIGludG8gdGhlIFJTdHVkaW8gZW52aXJvbm1lbnQuIFRoZSBvYmplY3QgbmFtZSB1bmRlciB3aGljaCB0aGUgaW1wb3J0ZWQgZGF0YXNldCBpcyBzYXZlZCAoZS5nLiwgb2NkKSBzaG91bGQgdGhlbiBiZSBpbnNlcnRlZCBhcyB0aGUgaW5wdXQgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBpbiB0aGUgYG5lZy5yZWdgIGZ1bmN0aW9uLCBzdWNoIGFzIGBkYXRhID0gb2NkYC4gDQoNCg0KDQpUaGUgbmV4dCBhcmd1bWVudCwgYGZvcm11bGEgPWAsIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHJlZ3Jlc3Npb24gbW9kZWwgY29uc2lzdGluZyBvZiB0aGUgb3V0Y29tZSAoaS5lLiwgY3JpdGVyaW9uL2RlcGVuZGVudCB2YXJpYWJsZSkgdG8gdGhlIGxlZnQgb2YgdGhlIHRpbGRlIHN5bWJvbCAoYH5gKSwgZm9sbG93ZWQgYnkgYWxsIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIGluIHRoZSBtb2RlbCB3aXRoIHRoZSBgK2Agc2lnbiBiZXR3ZWVuIGVhY2ggcHJlZGljdG9yIG5hbWUuIA0KDQoNCg0KVXNlcnMgc2hvdWxkIGlkZW50aWZ5IHRoZSBleGFjdCB2YXJpYWJsZSBuYW1lcyBpbiB0aGUgaW1wb3J0ZWQgZGF0YXNldCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIG1vZGVsbGluZyBhbmQgcGF5IGNsb3NlIGF0dGVudGlvbiB0byBsb3dlciBvciBjYXBpdGFsIGNhc2UuIEluIG91ciBleGFtcGxlLCB0aGUgZmlyc3Qgb3V0Y29tZSB2YXJpYWJsZSBpcyBjb250YW1pbmF0aW9uIChvbmUgb2YgdGhlIE9DRCBzeW1wdG9tYXRvbG9neSBkaW1lbnNpb25zKSwgbGFiZWxsZWQgaGVyZSBgb2NkX2NvbnRgLiBXZSBoYXZlIG9ubHkgdHdvIHByZWRpY3RvcnMgaW4gb3VyIGV4YW1wbGUgbW9kZWwsIE1XLUQgYW5kIE1XLVMgKGBNV0QgKyBNV1NgKSwgd2hpY2ggdGhlbiBnbyB0byB0aGUgbGVmdCBvZiB0aGUgYH5gLCBzdWNoIGFzIGBmb3JtdWxhID0gb2NkX2NvbnQgfiBNV0QgKyBNV1NgLg0KDQoNClRoZSBgcHJlZGljdG9yID1gIGFyZ3VtZW50IGFza3MgdXNlcnMgdG8gc3BlY2lmeSB3aGljaCBvZiB0aGUgcHJlZGljdG9ycyB0aGV5IHdvdWxkIGxpa2UgdG8gdGVzdCBmb3IgYSBuZWdsaWdpYmxlIGVmZmVjdC4gQmVjYXVzZSBbU2VsaSBldCBhbC4gKDIwMTcpXShodHRwczovL3BzeWNuZXQuYXBhLm9yZy9kb2lMYW5kaW5nP2RvaT0xMC4xMDM3JTJGYTAwMzE0MzgpIGh5cG90aGVzaXplZCBhIG5lZ2xpZ2libGUgb3Igbm8gYXNzb2NpYXRpb24gb2YgTVctRCB3aXRoIHRoZSBvdXRjb21lcywgd2Ugc3BlY2lmaWVkIGBwcmVkaWN0b3IgPSBNV0RgIGluIHRoZSBjb2RlIGV4YW1wbGUgYmVsb3cuDQoNCg0KIyMjIyBQdXR0aW5nIEl0IEFsbCBUb2dldGhlciAod2hlbiBkYXRhIGlzIGF2YWlsYWJsZSkNCg0KDQpgYGB7ciBlY2hvPUYsIHJlc3VsdHM9J2hpZGUnfQ0KDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpPQ0QgPC0gcmVhZF9zYXYoIkk6L015IERyaXZlL1Jlc2VhcmNoL0NyaWJiaWUgTGFiL25lZ2xpZ2libGUgVmlnbmV0dGVzL1RlbXBsYXRlL09DRCBhbmQgTVcgKFNlbGkgZXQgYWwuLCAyMDE3KS5zYXYiKSAjIFVwbG9hZGluZyBkYXRhDQpoZWFkKE9DRCkNCg0Kb2NkIDwtIE9DRCAjIGR1YmxpY2F0aW5nIGRhdGFzZXQgZm9yIG1hbmlwdWxhdGlvbiANCg0KIyByZW5hbWluZyBjb2x1bW5zIHRvIHNsaWdoZXRseSBlYXNpZXIgbmFtZXMNCmNvbG5hbWVzKG9jZCkgPC0gYygiSUQiLCAic2FtcGxlIiwgImFnZSIsImdlbmRlciIsICJoYW5kIiwgIk1XUyIsICJNV0QiLCAnQlNDUycsICdvY2RfY29udCcsICdvY2RfcmVzcCcsICdvY2RfdW5hY3B0aHRzJywgJ29jZF9zeW1tJykNCg0KaGVhZChvY2QpDQoNCiMgbGVhdmluZyBvbmx5IHJlbGV2YW50IHZhcmlhYmxlcyAgDQpvY2QgPC0gb2NkICU+JSANCiAgICBkcGx5cjo6c2VsZWN0KCJJRCIsICJNV1MiLCAiTVdEIiwgIm9jZF9jb250IiwgIm9jZF9yZXNwIiwgIm9jZF91bmFjcHRodHMiLCAib2NkX3N5bW0iKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KbGlicmFyeShuZWdsaWdpYmxlKSAjIGxvYWQgdGhlIHBhY2thZ2UNCg0KbmVnLnJlZyhkYXRhID0gb2NkLCAjIG5hbWUgb2YgZGF0YXNldCANCiAgICAgICAgZm9ybXVsYSA9IG9jZF9jb250IH4gTVdEICsgTVdTLCAjIHJlZ3Jlc3Npb24gZm9ybXVsYSANCiAgICAgICAgcHJlZGljdG9yID0gTVdELCAjIG5hbWUgb2YgdGhlIHByZWRpY3RvciBvZiBpbnRlcmVzdCANCiAgICAgICAgZWl1ID0gMSwgIyB1cHBlciBib3VuZCBvZiBTRVNPSSAodW5zdGFuZGFyZGl6ZWQpIA0KICAgICAgICBlaWwgPSAtMSwgIyBsb3dlciBib3VuZCBvZiBTRVNPSSAodW5zdGFuZGFyZGl6ZWQpIA0KICAgICAgICBzdGQgPSBGQUxTRSwgIyB1c2luZyB1bnN0YW5kYXJkaXplZCB1bml0cyANCiAgICAgICAgYm9vdHN0cmFwID0gRkFMU0UpICMgbm90IHVzaW5nIGJvb3RzdHJhcCBpbiBleGFtcGxlICMgPDE+DQpgYGANCg0KDQpJbiBFeGFtcGxlIDEgYWJvdmUsIHdlIHVzZWQgdGhlIGBuZWcucmVnYCBmdW5jdGlvbiB3aXRoIGFjY2VzcyB0byB0aGUgcmF3IGRhdGEgdG8gYW5zd2VyIHdoZXRoZXIgZGVsaWJlcmF0ZSBtaW5kIHdhbmRlcmluZyB0cnVseSBoYXMgYSBuZWdsaWdpYmxlIGFzc29jaWF0aW9uIHdpdGggY29udGFtaW5hdGlvbiwgcGFydGlhbGxpbmcgb3V0IHRoZSBlZmZlY3Qgb2Ygc3BvbnRhbmVvdXMgbWluZCB3YW5kZXJpbmcuIFRoZSBBSCBUIHN0YXRpc3RpY3MgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgJEFILVQgPSAtMC40LCBwIDwgMC4wMDEkLCBpbmRpY2F0aW5nIHRoYXQgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGlzIG5vbi1uZWdsaWdpYmxlIGNhbiBiZSByZWplY3RlZC4gVGhhdCBpcywgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgb2YgYSBuZWdsaWdpYmxlIGVmZmVjdCBpcyBzdXBwb3J0ZWQuDQoNClJlc3VsdHMgZnJvbSB0aGUgbmVnbGlnaWJsZSBlZmZlY3QgdGVzdGluZyBhcHByb2FjaCB1c2luZyB0aGUgYG5lZy5yZWdgIGZ1bmN0aW9uIGFyZSBjb25ncnVlbnQgd2l0aCBbU2VsaSBldCBhbC7igJlzICgyMDE3KV0oaHR0cHM6Ly9wc3ljbmV0LmFwYS5vcmcvZG9pTGFuZGluZz9kb2k9MTAuMTAzNyUyRmEwMDMxNDM4KSBjb25jbHVzaW9uLCB3aGljaCB3YXMgb2J0YWluZWQgZnJvbSBhIHN0YXRpc3RpY2FsbHkgbm9uc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS1iYXNlZCB0ZXN0LiBJdCBpcyBvZnRlbiB0aGUgY2FzZSwgaG93ZXZlciwgdGhhdCByZXN1bHRzIGZyb20gbmVnbGlnaWJsZSBlZmZlY3QgdGVzdGluZyBjb250cmFkaWN0IG5lZ2xpZ2libGUgYXNzb2NpYXRpb24gY29uY2x1c2lvbnMgbWFkZSB1c2luZyByZXN1bHRzIGZyb20gYSBub25zaWduaWZpY2FudCBkaWZmZXJlbmNlLWJhc2VkIHRlc3Q7IHRoaXMgc2NlbmFyaW8gd2lsbCBiZSBkZW1vbnN0cmF0ZWQgaW4gRXhhbXBsZSAyIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4gRXhhbXBsZSAyIGFsc28gc2hvd3MgaG93IHVzZXJzIGNhbiBlbXBsb3kgdGhlIGBuZWcucmVnYCBmdW5jdGlvbiB3aXRob3V0IGFjY2VzcyB0byByYXcgZGF0YS4NCg0KDQojIyMgRXhhbXBsZSAyOiBQZXJzb25hbCBDb250cm9sIE1vZGVyYXRlcyB0aGUgQXNzb2NpYXRpb24gQmV0d2VlbiBPcmdhbml6YXRpb25hbCBTdGFiaWxpdHkgYW5kIElkZW50aWZpY2F0aW9uDQoNCg0KW1Byb3VkZm9vdCBhbmQgS2F5ICgyMDE4KV0oaHR0cHM6Ly93d3ctc2NpZW5jZWRpcmVjdC1jb20uZXpwcm94eS5saWJyYXJ5Lnlvcmt1LmNhL3NjaWVuY2UvYXJ0aWNsZS9waWkvUzAwMjIxMDMxMTczMDY4MzIpIHByZWRpY3RlZCB0aGF0IGZlZWxpbmdzIG9mIHBlcnNvbmFsIGNvbnRyb2wgd291bGQgbW9kZXJhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBlcmNlaXZlZCBvcmdhbml6YXRpb25hbCBzdGFiaWxpdHkgYW5kIG9yZ2FuaXphdGlvbiBpZGVudGlmaWNhdGlvbi4gU3BlY2lmaWNhbGx5LCB0aGV5IHdpc2hlZCB0byBkZW1vbnN0cmF0ZSB0aGF0IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gb3JnYW5pemF0aW9uYWwgc3RhYmlsaXR5IGFuZCBpZGVudGlmaWNhdGlvbiBleGlzdHMgZm9yIHBhcnRpY2lwYW50cyB3aXRoIGxvdyBwZXJzb25hbCBjb250cm9sICjigJxjb250cm9sIHRocmVhdOKAnSBjb25kaXRpb24pLCAqYnV0IHRoYXQgbm8gc3VjaCBlZmZlY3QgaXMgcHJlc2VudCBmb3IgcGFydGljaXBhbnRzIHdpdGggaGlnaCBwZXJzb25hbCBjb250cm9sICjigJxjb250cm9sIGFmZmlybWF0aW9u4oCdIGNvbmRpdGlvbikqLiANCg0KDQpUbyB0ZXN0IHRoZWlyIGh5cG90aGVzaXMsIHRoZSBhdXRob3JzIG1vZGVsZWQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBvcmdhbml6YXRpb25hbCBzdGFiaWxpdHkgYW5kIHBlcnNvbmFsIGNvbnRyb2wgb24gb3JnYW5pemF0aW9uIGlkZW50aWZpY2F0aW9uIGluIHRoZWlyIG11bHRpcGxlIHJlZ3Jlc3Npb24gYW5hbHlzaXMuIEFzIHJlcG9ydGVkIGluIFN0dWR5IDMsIHRoZSBjb250cm9sIMOXIHN0YWJpbGl0eSBpbnRlcmFjdGlvbiAoaGlnaGVyLW9yZGVyIGVmZmVjdCkgd2FzIGluZGVlZCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJbnNwZWN0aW5nIHRoZSBzaW1wbGUgc2xvcGVzLCB0aGUgYXV0aG9ycyBmb3VuZCB0aGF0IHBhcnRpY2lwYW50cyBpbiB0aGUg4oCcY29udHJvbCB0aHJlYXTigJ0gY29uZGl0aW9uIGV4aGliaXRlZCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RhYmlsaXR5IGFuZCBpZGVudGlmaWNhdGlvbiwgd2hlcmVhcyBwYXJ0aWNpcGFudHMgaW4gdGhlIOKAnGNvbnRyb2wgYWZmaXJtYXRpb27igJ0gY29uZGl0aW9uIGRpZCBub3QsICRiID0gMC4xNSwgU0UgPSAuMTIsIHQoMTkwKSA9IDEuMTgsIHAgPSAuMjQkLiBJdCB3YXMgY29uY2x1ZGVkIHRoYXQg4oCcZm9yIHBhcnRpY2lwYW50cyB3aG8gcmVjYWxsZWQgYW4gZXZlbnQgd2hlcmVpbiB0aGV5IGhhZCBjb250cm9sLCB0aGVyZSB3YXMgbm8gZWZmZWN0IG9mIHBlcmNlaXZlZCBvcmdhbml6YXRpb25hbCBzdGFiaWxpdHkgb24gaWRlbnRpZmljYXRpb27igJ0gKFtQcm91ZGZvb3QgJiBLYXksIDIwMTgsIHAuIDExMF0oaHR0cHM6Ly93d3ctc2NpZW5jZWRpcmVjdC1jb20uZXpwcm94eS5saWJyYXJ5Lnlvcmt1LmNhL3NjaWVuY2UvYXJ0aWNsZS9waWkvUzAwMjIxMDMxMTczMDY4MzIpKS4gDQoNCg0KSW4gdGhpcyBleGFtcGxlLCB3ZSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGRhdGFzZXQuIFN0aWxsLCB3ZSBjYW4gZm9ybWFsbHkgdGVzdCB3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBlcmNlaXZlZCBvcmdhbml6YXRpb25hbCBzdGFiaWxpdHkgb24gaWRlbnRpZmljYXRpb24gaXMgaW5kZWVkIG5lZ2xpZ2libGUgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUg4oCcY29udHJvbCBhZmZpcm1hdGlvbuKAnSBjb25kaXRpb24gdXNpbmcgdGhlIGBuZWcucmVnYCBmdW5jdGlvbi4gIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBuZWVkIHRoZSBmb2xsb3dpbmc6IA0KDQotIHRoZSAqcmVncmVzc2lvbiBjb2VmZmljaWVudCBwb2ludCBlc3RpbWF0ZSogZm9yIG9yZ2FuaXphdGlvbmFsIHN0YWJpbGl0eSAoJGIgPSAwLjE1JCkgYW5kIGl0cyAqYXNzb2NpYXRlZCBzdGFuZGFyZCBlcnJvciogKCRTRSA9IDAuMTIkKSwgDQoNCi0gdGhlICpzYW1wbGUgc2l6ZSogdXNlZCBpbiB0aGUgYW5hbHlzaXMgKCRuID0gMTk0JCksIA0KDQotIHRoZSAqbnVtYmVyIG9mIHByZWRpY3RvcnMqIGluIHRoZSBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsICgkayA9IDMkKSwgDQoNCi0gYW5kIHRoZSAqbm9taW5hbCBUeXBlIEkgZXJyb3IgcmF0ZSogKCTOsSA9IC4wNSQpLiANCg0KDQpOb3RlIHRoYXQgdGhlIHJlcG9ydGVkIGVmZmVjdCBhbmQgaXRzIGFzc29jaWF0ZWQgc3RhbmRhcmQgZXJyb3IgYXJlIG1lYXN1cmVkIGluIHVuc3RhbmRhcmRpemVkIHVuaXRzLiANCg0KDQpBZ2Fpbiwgd2UgbXVzdCBpZGVudGlmeSBvdXIgZGVmaW5pdGlvbiBvZiBwcmFjdGljYWwgc2lnbmlmaWNhbmNlIGluIHRoaXMgY29udGV4dCAoc2VsZWN0aW5nIGEgU0VTT0kpLiBMZXQncyBjb25zaWRlciBhIFNFU09JIG9mICRiID0gMC4zMyQgKG1lYXN1cmVkIGluIHVuc3RhbmRhcmRpemVkIHVuaXRzKS4NCg0KDQpXZSBjYW4gbm93IHBsdWcgdGhlIGlucHV0IGludG8gdGhlIGBuZWcucmVnYCBmdW5jdGlvbuKAmXMgYXJndW1lbnRzIGFzIGRlbW9uc3RyYXRlZCBiZWxvdw0KDQojIyMjIFB1dHRpbmcgSXQgQWxsIFRvZ2V0aGVyICh3aGVuIGRhdGEgaXMgdW5hdmFpbGFibGUpDQoNCmBgYHtyfQ0KDQpuZWcucmVnKGIgPSAwLjE1LCAjIGVmZmVjdCBzaXplIG9mIHRoZSBwcmVkaWN0b3Igb2YgaW50ZXJlc3QNCiAgICAgICAgc2UgPSAwLjEyLCAjIHN0YW5kYXJkIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWZmZWN0DQogICAgICAgIG4gPSAxOTQsICMgc2FtcGxlIHNpemUgdXNlZCBpbiB0aGUgYW5hbHlzaXMNCiAgICAgICAgbm9wID0gMywgIyBudW1iZXIgb2YgcHJlZGljdG9ycyAgICAgICAgIA0KICAgICAgICBlaXUgPSAwLjMzLCAjIHVwcGVyIGJvdW5kIG9mIFNFU09JICh1bnN0YW5kYXJkaXplZCkNCiAgICAgICAgZWlsID0gLTAuMzMsICMgbG93ZXIgYm91bmQgb2YgU0VTT0kgKHVuc3RhbmRhcmRpemVkKQ0KICAgICAgICBzdGQgPSBGQUxTRSkgIyB1c2luZyB1bnN0YW5kYXJkaXplZCB1bml0cw0KYGBgDQoNCg0KIyMgQWRkaXRpb25hbCBGZWF0dXJlcw0KDQoNCkZpbmFsbHksIHRoZXJlIGFyZSBhZGRpdGlvbmFsLCBvcHRpb25hbCBmZWF0dXJlcyBpbmNsdWRlZCBpbiB0aGUgZnVuY3Rpb24gc3VjaCBhcyB1c2luZyBib290c3RyYXAgKGFuZCBzZXR0aW5nIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbmQvb3Igc2VlZCkgdG8gY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvcnMsIGNoYW5naW5nIHRlc3QgdHlwZSBmcm9tIEFIIChkZWZhdWx0KSB0byBUT1NUIG9yIG5vbWluYWwgVHlwZSBJIGVycm9yIGZyb20gLjA1IHRvIGFub3RoZXIsIGN1c3RvbSByYXRlLCBzYXZpbmcgdGhlIHJlc3VsdGVkIHBsb3RzIGxvY2FsbHkgKGUuZy4sIGFzIC5wbmcsIG9yIC5qcGVnKSBldGMuIFVzZXJzIGFyZSB3ZWxjb21lIHRvIHRlc3QgdGhlc2UgZmVhdHVyZXMgZm9sbG93aW5nIHRoZXNlIGJyaWVmIGFyZ3VtZW50IGRlZmluaXRpb25zOg0KDQoNCi0gYHBsb3RzYDogSWYgYFRSVUVgLCBwbG90IHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSBvdXRwdXQgKGhpZ2hseSByZWNvbW1lbmRlZCkNCi0gYHRlc3RgOiBgIkFIImAgaXMgdGhlIGRlZmF1bHQgYmFzZWQgb24gcmVjb21tZW5kYXRpb24gaW4gW0FsdGVyICYgQ291bnNlbGwgKDIwMjMpXShodHRwczovL3d3dy50cW1wLm9yZy9SZWd1bGFyQXJ0aWNsZXMvdm9sMTktMS9wMDU5L3AwNTkucGRmKSwgYCJUT1NUImAgaXMgYW4gYWRkaXRpb25hbCBvcHRpb24NCi0gYGJvb3RzdHJhcGA6IGxvZ2ljYWwsIGRlZmF1bHQgaXMgYFRSVUVgLCBpbmNvcnBvcmF0aW5nIGJvb3RzdHJhcHBpbmcgd2hlbiBjYWxjdWxhdGluZyByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgU0UsIGFuZCBDSXMNCi0gYG5ib290YDogYDEwMDBgIGlzIHRoZSBkZWZhdWx0LiBJbmRpY2F0ZXMgaWYgb3RoZXIgbnVtYmVyIG9mIGJvb3RzdHJhcHBpbmcgaXRlcmF0aW9ucyBpcyBkZXNpcmVkDQotIGBzYXZlcGxvdHNgOiBgRkFMU0VgIGZvciBubywgYCJwbmciYCBhbmQgYCJqcGVnImAgZm9yIGRpZmZlcmVudCBmb3JtYXRzDQotIGBzZWVkYDogdG8gcmVwcm9kdWNlIHByZXZpb3VzIGFuYWx5c2VzIHVzaW5nIGJvb3RzdHJhcHBpbmcsIHRoZSB1c2VyIGNhbiBzZXQgdGhlaXIgc2VlZCBvZiBjaG9pY2UNCg0KDQoNCiMjIE90aGVyIENvbnNpZGVyYXRpb25zDQoNCioqSXQgaXMgbmVjZXNzYXJ5IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQuKiogRm9yIGV4YW1wbGUsIHVuc3RhbmRhcmRpemVkIG5lZ2xpZ2libGUgaW50ZXJ2YWwgYm91bmRzIChpLmUuLCBgZWlsYCBhbmQgYGVpdWApIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gYHN0ZCA9IEZBTFNFYCAoZGVmYXVsdCkuIElmIHRoZSBlZmZlY3Qgc2l6ZSAoYGJgKSwgc3RhbmRhcmQgZXJyb3IgKGBzZWApLCBhbmQgc2FtcGxlIHNpemUgKGBuYCkgYXJlIGVudGVyZWQgbWFudWFsbHkgYXMgYXJndW1lbnRzIChpLmUuLCB3aXRob3V0IHRoZSBkYXRhc2V0KSwgdGhlc2Ugc2hvdWxkIGFsc28gYmUgaW4gdGhlIHNhbWUgdW5pdHMgb2YgbWVhc3VyZW1lbnRzLiBXaGVyZWFzIGlmIHRoZSB1c2VyIHByZWZlcnMgdG8gc3BlY2lmeSBgZWl1YCBhbmQgYGVpbGAgaW4gc3RhbmRhcmRpemVkIHVuaXRlcywgYHN0ZCA9IFRSVUVgIHNob3VsZCBiZSBzcGVjaWZpZWQuIEluIHdoaWNoIGNhc2UsIGFueSB1bml0cyBlbnRlcmVkIGludG8gdGhlIGZ1bmN0aW9uIG11c3QgYWxzbyBiZSBpbiBzdGFuZGFyZGl6ZWQgZm9ybS4gTWl4aW5nIHVuc3RhbmRhcmRpemVkIGFuZCBzdGFuZGFyZGl6ZWQgdW5pdHMgd291bGQgeWllbGQgaW5hY2N1cmF0ZSByZXN1bHRzIGFuZCBsaWtlbHkgbGVhZCB0byBpbnZhbGlkIGNvbmNsdXNpb25zLiBUaHVzLCB1c2VycyBtdXN0IGJlIGNvZ25pemFudCBvZiB0aGUgbWVhc3VyZW1lbnQgdW5pdHMgb2YgdGhlIG5lZ2xpZ2libGUgaW50ZXJ2YWwuDQoNCg0KVGhlIHByb3BvcnRpb25hbCBkaXN0YW5jZSAoUEQ7IGVmZmVjdCBzaXplL2VpdSkgZXN0aW1hdGVzIHRoZSBwcm9wb3J0aW9uYWwgZGlzdGFuY2Ugb2YgdGhlIGVzdGltYXRlZCBlZmZlY3QgdG8gZWl1LCBhbmQgYWN0cyBhcyBhbiBhbHRlcm5hdGl2ZSBlZmZlY3Qgc2l6ZSBtZWFzdXJlLg0KDQpUaGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIFBEIGlzIGNvbXB1dGVkIHZpYSBib290c3RyYXBwaW5nIChwZXJjZW50aWxlIGJvb3RzdHJhcCksIHVubGVzcyB0aGUgdXNlciBkb2VzIG5vdCBpbnNlcnQgYSBkYXRhc2V0LiBJbiB3aGljaCBjYXNlLCB0aGUgUEQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZSB1cHBlciBhbmQgbG93ZXIgQ0kgYm91bmRzIGZvciB0aGUgZWZmZWN0IHNpemUgZXN0aW1hdGUgYnkgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBuZWdsaWdpYmxlIGludGVydmFsIGJvdW5kcy4NCg0KDQpGb3IgYWRkaXRpb25hbCByZXNvdXJjZXMsIHNlZToNCg0KLSBbQWx0ZXIgJiBDb3Vuc2VsbCAoMjAyMyldKGh0dHBzOi8vd3d3LnRxbXAub3JnL1JlZ3VsYXJBcnRpY2xlcy92b2wxOS0xL3AwNTkvcDA1OS5wZGYpDQotIFtTaGlueSBhcHBdKGh0dHBzOi8vdWRpYWx0ZXIuc2hpbnlhcHBzLmlvL25lZ3JlZy1zaGlueS8pDQotIFtJbnRlcmFjdGl2ZSBEYXNoYm9hcmRdKGh0dHBzOi8vdWRpYWx0ZXIuZ2l0aHViLmlvL0FsdGVyLWFuZC1Db3Vuc2VsbC0tMjAyMy0tSW50ZXJhY3RpdmUtRGFzaGJvYXJkLmh0bWwpDQo=