1 Introduction

Experimental design is a structured approach used in scientific research to plan, conduct, and analyze experiments in a way that ensures valid, reliable, and efficient results. The primary goal is to establish cause-and-effect relationships by systematically manipulating variables while controlling for extraneous influences.

The role and prominence of experimental design may seem diminished in some fields today due to shifts in technology, data availability, and the overall landscape of analytical fields. It reflects a combination of shifting academic priorities, an overcrowded curriculum, and changes in the statistical landscape.

  • Big Data and Observational Analysis: With massive datasets available, some researchers lean on sophisticated statistical or machine learning models to infer relationships without running controlled experiments.

  • A/B Testing Is Ubiquitous but Simple: In the business world, many practical applications require using basic A/B testing (various comparisons among groups), which doesn’t require deep design knowledge. This leads people to think that experimental design is not a core technique anymore.

  • Simulation and Modeling: In engineering or systems biology, simulations can sometimes replace physical experiments, though they’re often based on data originally gathered from well-designed experiments.

  • Data-Driven Culture: There’s sometimes a bias toward exploratory data analysis over hypothesis-driven work, which can downplay the importance of prior design.

However, fields like agriculture, biology, medicine, marketing, UX (user experience), and manufacturing still depend on it heavily.

In this short and non-technical note, we will introduce the basics of the principles of the classic experimental designs.


2 The Logical Process of Experimental Design

Experimental design follows a systematic, step-by-step approach to ensure that research is valid, reliable, and interpretable. It is like building a roadmap—it ensures you reach valid conclusions without getting lost in biases or errors. By following this logical process, researchers can confidently test hypotheses and contribute meaningful findings to science.

Below is the logical sequence researchers follow when designing an experiment:


1. Define the Research Problem & Objectives

  • What is the research question? We start with a clearly defined research question. For example, does a new fertilizer increase crop yield compared to the standard one?

  • What are the hypotheses? The well-formulated research question needs to be translated into an analytic question in the form of a statistical hypothesis. For example,

\[ H_0: \text{No difference between fertilizers} \ \ \ \text{vs} \ \ \ H_a: \text{The new fertilizer increases yield} \]

2. Identify Variables

  • Independent Variable (IV) - the cause: The factor variable that is manipulated by the experimenter. For example, fertilizer type, drug doses in clinical trials, etc.

  • Dependent Variable (DV) - the effect: The outcome that is measured. For example, crop yield, recovery rate after receiving the drug, etc.

  • Control Variables (Constants): Factors kept unchanged across groups to ensure that only the IV affects the DV. For example, soil type, water amount, age group, environmental condition, etc.

  • Extraneous Variables (Confounding Factors): Unwanted variables that could influence the DV if not controlled. For example, sunlight, pests, diet, stress levels, or measurement errors.

3 Choose the Experimental Design

Select a design that best fits the research question. There are many different designs. The following is a short list of commonly used designs. We will discuss some of them with more detail in the next Section.

  • Completely Randomized Design (CRD): A Completely Randomized Design (CRD) assigns treatments to experimental units purely at random to guarantee that each unit has an equal probability of receiving any treatment. CRD is excellent for isolating causal effects when units are homogeneous

  • Randomized Block Design (RBD): In a Randomized Block Design, experimental units are grouped (blocked) to share a known characteristic that is not primarily studied, but it could affect the outcome. Within each block, all treatments are randomly assigned. Controlling for known blocking variables improves the precision of treatment estimates. For example, dividing plants by soil quality or patients by age/gender.

  • Factorial Design: A factorial design tests two or more independent variables (factors) simultaneously, using all possible combinations of their levels. This allows assessment of both main effects (individual factor impact) and interaction effects (when the effect of one factor depends on another): For example, in a recent Lancet study, older adults were randomized across two vaccine types (Pfizer‑BioNTech vs. Oxford‑AstraZeneca) and two dosing intervals (3 weeks vs. 12 weeks), creating four groups. The researchers measured antibody levels to assess main effects (vaccine type, dose interval) and whether there was an interaction—i.e., whether the dosing interval effect differed by vaccine type. They found higher antibodies overall with Pfizer, and longer intervals boosted response in both vaccine groups.

  • Repeated Measures: This design involves measuring the same participants (or units) multiple times under different conditions or time points. It controls for individual differences and boosts statistical power because each participant acts as their control. Some examples include:

    • Cognitive tests at ages 30, 40, and 50 to track decline or improvement;
    • Drug A vs. Drug B - each participant takes both in different orders;
    • Testing three different drugs for smoking cravings - the same participants receive each drug on different days.

5. Randomization, Blinding & Assignment

These three techniques are critical for minimizing bias, ensuring validity, and strengthening causal inferences in experiments. Below is a detailed breakdown of each concept, its importance, and how they are implemented.

  • Randomize participants or units to treatments to avoid selection bias.
    • Simple Randomization - For example, in a drug trial, 100 patients are randomly assigned to either the new drug or placebo (pill with no drug ingredient) group using a computer-generated random sequence.
    • Block Randomization - Ensures equal group sizes by randomizing within small blocks.
    • Stratified Randomization - Randomizes within subgroups (e.g., by age or gender) to maintain balance.
  • Blind participants and/or researchers when possible, to reduce expectation effects.
    • Single-Blind: to participants only. It prevents placebo effects.
    • Double-Blind: to both participants and researchers. It eliminates experimenter bias & participant bias.
    • Triple-Blind to participants, researchers, and data analysts. It reduces bias in interpretation.
  • Assignment refers to how participants or experimental units are allocated to different treatment groups. Proper assignment is crucial for valid comparisons and minimizing bias.
    • Between-Subjects (Independent Measures): Different participants are assigned to each treatment group.
    • Within-Subjects (Repeated Measures): The same participants experience all conditions
    • Matched-Pairs Design: Participants are paired based on key traits (e.g., age, IQ), then split into groups.

6. Plan Sampling & Data Collection

  • Sampling refers to how you select experimental units (e.g., plots, animals, people) from the larger population—ideally through random sampling to ensure representativeness.

  • Record measurements accurately (e.g., crop weight, plant height).

7. Analyze Data and Interpretation

This will be discussed in detail in separate notes. The key is to choose appropriate statistical procedures to perform analysis and make a relevant diagnosis. This is an iterative process. Make sure that all assumptions are satisfied before interpreting the results.

8. Reporting and Validating

This is the final step. We will also discuss this in the subsequent note. The key idea is to follow the best practices:

3 CRD and RBD

This section briefly introduces two most commonly used experimental designs: the completely randomized design and the randomized block design, in more detail. We will also organize the resulting data in a format suitable for data analysis using either a software program or manually.

3.1 Completely Randomized Design

The Completely Randomized Design (CRD) is one of the most basic and widely used experimental designs in research. It is particularly suitable when experimental units are homogeneous, meaning there are no significant differences among them before applying treatments. CRD follows the principle of randomization, where subjects (or experimental units) are randomly assigned to treatments. That means each subject has an equal chance of receiving any treatment, and the assignment is done independently of any grouping.

Depending on the number of replications per treatment (i.e., the number of experimental units that receive the same treatment independently), a CRD can be classified as either balanced or imbalanced. Understanding the differences between these two variations is crucial for proper experimental design and statistical analysis.

In the above figure, the number of subjects in each treatment is equal, \(n_1 = n_2 = n_3\), and the hypothetical CRD is a balanced design.

This design is commonly used in agricultural experiments, clinical trials, industrial studies, and laboratory research due to its simplicity and flexibility.

The key characteristics of CRD include:

  • Random Assignment: Treatments are allocated randomly to experimental units to minimize bias.

  • Homogeneous Experimental Units: All subjects or plots are assumed to be similar before treatment application.

  • No Blocking: Unlike Randomized Block Design (RBD), CRD does not group units into blocks to control variability.

  • Flexibility: It can accommodate any number of treatments and replications.

  • Simple Analysis: Data from CRD can be easily analyzed using one-way ANOVA (Analysis of Variance).

A Non-numerical Example

Suppose a pharmaceutical company wants to test three different drug formulations (A, B, C) on blood pressure. A balanced, completely randomized design will follow the next few steps.

Step 1: Select 30 similar patients.

Step 2: Randomly assign 10 patients to each drug group.

Step 3: Administer treatments and measure blood pressure after a set period.

The next figure illustrates how to read the CRD data table cell.

The formats required for analysis using different software programs will be discussed in subsequent notes focusing on analyzing different experimental designs.


The Completely Randomized Design is a fundamental experimental approach due to its simplicity and ease of application. While it is highly effective in homogeneous settings, its limitations become apparent when dealing with variability. Researchers must carefully assess whether CRD is appropriate or if more advanced designs (e.g., Randomized Block Design) are needed. Despite its constraints, CRD remains a cornerstone of experimental research, providing a solid foundation for statistical analysis and scientific discovery.

The following YouTube video explains CRD (first 15 Minutes, https://www.youtube.com/watch?v=KJ5G2KjcXcA). The analysis part will be discussed in the next note on One-way ANOVA.



3.2 Randomized Block Design

The Randomized Block Design (RBD) is a widely used experimental design that improves precision by controlling known sources of variability. Unlike the Completely Randomized Design (CRD), which assumes homogeneous experimental units, RBD groups similar units into blocks and then randomizes treatments within each block. This approach reduces experimental error and enhances the accuracy of treatment comparisons. RBD is commonly applied in agriculture, clinical trials, industrial experiments, and ecological studies where external factors (e.g., soil fertility, patient age, machine differences) may influence results.

Two related (but sometimes confusing) concepts

  • Extraneous Variable - Any variable other than the independent variable that might affect the outcome (dependent variable). It may or may not be a problem. If properly controlled or randomized, it doesn’t bias the results. For example, in a plant growth experiment, sunlight and water are extraneous variables if you’re testing the effect of fertilizer.

  • Confounding Variable - A type of extraneous variable that is not controlled and systematically varies with the treatment. It confounds (i.e., mixes up) the effect of the treatment, making it hard to know whether the observed effect is due to the treatment or the confounder.

To summarize, we create the following table to do back-to-back comparisons.

Term Is it a problem? Systematically related to treatment? Affects outcome?
Extraneous Variable Not always Not necessarily Possibly
Confounding Variable Yes (if uncontrolled) Yes Yes


3.2.1 Major Components in RBD

As mentioned earlier, an RBD is an experimental design where subjects or experimental units are grouped into homogeneous groups /blocks based on some similarity (like age, weight, location) to control for variability that isn’t of primary interest. Within each block, treatments are randomly assigned to the units.

Experimental Unit

This is the smallest division of the experimental material to which a treatment can be assigned. For example, in agricultural experiments, a plot of land can be an experimental unit where different fertilizers (treatments) are applied.

Treatment

This refers to the different conditions or interventions whose effects are being studied. For instance, different dosages of a drug are used in a medical trial.

Block

A block is a group of experimental units that are similar in some way that is expected to affect the response to the treatments. The idea is to make comparisons within blocks to reduce the impact of variability between blocks.

In CRD, multiple experimental units are assigned to each treatment. In RBD, introducing a blocking variable makes the design and data layout more complex than the CRD since we need to consider the combinations of blocks and treatments when assigning experimental units.


3.2.2 RBD without Replicates (Basics RBD)

In this scenario, for each block, there is exactly one experimental unit assigned to each treatment. If there are \(t\) treatments, then each block will have \(t\) experimental units, one for each treatment.

The resulting data table has the following structure.

treat 1 treat 2 \(\cdots\) treat t
block 1 \(y_{11}\) \(y_{21}\) \(\cdots\) \(y_{t1}\)
block 2 \(y_{12}\) \(y_{22}\) \(\cdots\) \(y_{t2}\)
\(\cdots\) \(\cdots\) \(\cdots\) \(\cdots\) \(\cdots\)
block b \(y_{1b}\) \(y_{2b}\) \(\cdots\) \(y_{tb}\)

Example: Let’s consider an agricultural example to make this concrete. Assume that there are three treatments: 3 different types of fertilizers (F1, F2, F3) and four blocks: 4 different fields (Block1, Block2, Block3, Block4) which may vary in soil quality, sunlight, etc. In each block (field), we have 3 plots (experimental units), each assigned to one of the 3 fertilizers randomly, and then measure the yields (\(y_{ij}\)).

The assignment table has the following layout:

Plot 1 Plot 2 Plot 3
Block 2 F2 F1 F3
Block 3 F1 F3 F1
Block 4 F3 F2 F2

Here, each treatment appears exactly once in each block, and within each block, the assignment is random. The corresponding data table is

Plot 1 Plot 2 Plot 3
Block 2 \(y_{11}\) \(y_{21}\) \(y_{31}\)
Block 3 \(y_{12}\) \(y_{22}\) \(y_{32}\)
Block 4 \(y_{13}\) \(y_{23}\) \(y_{33}\)

This design guarantees that:

  • Control of Variability: By grouping similar experimental units into blocks, we control for the variability between blocks. This increases the precision of the treatment effect estimates.

  • Balance: Each treatment appears equally often in each block, making the design balanced, which simplifies analysis.

  • Randomization: Random assignment within blocks helps in avoiding systematic bias.

3.2.3 RBD with Replicates (Replicated RBD)

The basic RBD is simple and easy to understand. Some practical information is not available in this simple design, for example,

  • We cannot estimate interaction between treatments and blocks or have a pure error estimate within blocks since only one experimental unit is assigned in the combination of treatment and block.

  • In the modeling phase, we cannot assess the potential interactive effect. That is, the effect of a treatment depends on the block (or vice versa). For example, if F1 performs best in Block 1 but worst in Block 2, there is likely a treatment × block interaction.

  • The Randomized Block Design (RBD) requires homogeneity (i.e., equal variance) within blocks and treatments in order to be effective. However, the basic RBD does not provide enough information to assess this homogeneity because there is only a single experimental unit for each combination of block and treatment.

There are different ways to overcome the above limitations. One way is to modify the basic RBD to allow assigning multiple experimental units to every combination of blocks and treatments - Replicated RBD.

A Replicated RBD is an extension of the standard Randomized Block Design where each treatment is applied to multiple experimental units within each block. The basic structure of replicated RBD is characterized in the following.

  • Treatments (a): Different levels of the factor being tested (e.g., fertilizers, drugs).

  • Blocks (b): Groups of homogeneous experimental units (e.g., fields, patients with similar characteristics).

  • **Replicates (p)*: Number of times each treatment is repeated per block.

The general data table of a replicated RBD design is depicted by

The data table cell has three indices to capture information about blocking, treatments, and measurements of replicated response, as shown below.

The next YouTube video explains the RBD (with no replicates) using a nice example. You can skip the analysis part now. The video is at (https://www.youtube.com/watch?v=zqZ9iuk5Ngk&t=193s)



3.2.4 Concluding Remarks on RBD

The Randomized Block Design (RBD) is a fundamental experimental approach that enhances precision by grouping similar experimental units into blocks to control for known sources of variability. The choice between RBD without replication (one experimental unit per treatment per block) and RBD with replication (multiple units per treatment per block) depends on the research objectives, resource availability, and underlying assumptions about treatment-block interactions.

RBD without replication is a simple yet powerful design when interactions between treatments and blocks are negligible. It efficiently reduces error variance by accounting for block effects while requiring fewer experimental units. However, its inability to test for interactions means that any hidden treatment-block dependencies may inflate the error term, potentially masking true treatment effects. This design is ideal if we have prior knowledge suggesting consistent treatment effects across blocks.

In contrast, RBD with replication offers greater flexibility and precision by allowing researchers to detect and quantify treatment-block interactions. This design also has limitations. For example, this design cannot handle the situation where a fertilizer performs differently in distinct soil types. The analysis of replicated RBD is also more complex than the basic RBD.

Ultimately, the decision between these two approaches hinges on balancing practical constraints with scientific rigor. RBD without replication provides an efficient solution for straightforward comparisons, while RBD with replication delivers deeper insights when interactions are plausible or higher precision is required.

LS0tDQp0aXRsZTogIlByaW5jaXBsZXMgb2YgRXhwZXJpbWVudGFsIERlc2lnbiINCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiU1RBMjAwIFN0YXRpc3RpY3MgSUkgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KIyBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICJDOi9Vc2Vycy83NUNQRU5HL09uZURyaXZlIC0gV2VzdCBDaGVzdGVyIFVuaXZlcnNpdHkgb2YgUEEvRG9jdW1lbnRzIikNCiMga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzpcXFNUQTQ5MFxcdzA1IikNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9ICJ8IikNCmBgYA0KDQoNCg0KXA0KDQoNCiMgSW50cm9kdWN0aW9uDQoNCkV4cGVyaW1lbnRhbCBkZXNpZ24gaXMgYSA8Zm9udCBjb2xvciA9ICJyZWQiPipcY29sb3J7cmVkfXN0cnVjdHVyZWQgYXBwcm9hY2ggdXNlZCBpbiBzY2llbnRpZmljIHJlc2VhcmNoKjwvZm9udD4gdG8gKipwbGFuKiosICoqY29uZHVjdCoqLCBhbmQgKiphbmFseXplKiogZXhwZXJpbWVudHMgaW4gYSB3YXkgdGhhdCBlbnN1cmVzIHZhbGlkLCByZWxpYWJsZSwgYW5kIGVmZmljaWVudCByZXN1bHRzLiBUaGUgcHJpbWFyeSBnb2FsIGlzIHRvIGVzdGFibGlzaCAqKmNhdXNlLWFuZC1lZmZlY3QgcmVsYXRpb25zaGlwcyoqIGJ5IHN5c3RlbWF0aWNhbGx5IG1hbmlwdWxhdGluZyB2YXJpYWJsZXMgd2hpbGUgY29udHJvbGxpbmcgZm9yIGV4dHJhbmVvdXMgaW5mbHVlbmNlcy4NCg0KVGhlIHJvbGUgYW5kIHByb21pbmVuY2Ugb2YgKipleHBlcmltZW50YWwgZGVzaWduKiogbWF5IHNlZW0gKipkaW1pbmlzaGVkKiogaW4gc29tZSBmaWVsZHMgdG9kYXkgZHVlIHRvIHNoaWZ0cyBpbiAqKnRlY2hub2xvZ3ksIGRhdGEgYXZhaWxhYmlsaXR5LCBhbmQgdGhlIG92ZXJhbGwgbGFuZHNjYXBlIG9mIGFuYWx5dGljYWwgZmllbGRzKiouIEl0IHJlZmxlY3RzIGEgKipjb21iaW5hdGlvbiBvZiBzaGlmdGluZyBhY2FkZW1pYyBwcmlvcml0aWVzLCBhbiBvdmVyY3Jvd2RlZCBjdXJyaWN1bHVtLCBhbmQgY2hhbmdlcyBpbiB0aGUgc3RhdGlzdGljYWwgbGFuZHNjYXBlKiouDQoNCiogKipCaWcgRGF0YSBhbmQgT2JzZXJ2YXRpb25hbCBBbmFseXNpcyoqOiBXaXRoICoqbWFzc2l2ZSBkYXRhc2V0cyoqIGF2YWlsYWJsZSwgc29tZSByZXNlYXJjaGVycyBsZWFuIG9uIHNvcGhpc3RpY2F0ZWQgc3RhdGlzdGljYWwgb3IgbWFjaGluZSBsZWFybmluZyBtb2RlbHMgdG8gaW5mZXIgcmVsYXRpb25zaGlwcyB3aXRob3V0IHJ1bm5pbmcgY29udHJvbGxlZCBleHBlcmltZW50cy4NCg0KKiAqKkEvQiBUZXN0aW5nIElzIFViaXF1aXRvdXMgYnV0IFNpbXBsZSoqOiBJbiB0aGUgYnVzaW5lc3Mgd29ybGQsIG1hbnkgcHJhY3RpY2FsIGFwcGxpY2F0aW9ucyByZXF1aXJlIHVzaW5nIGJhc2ljICoqQS9CIHRlc3RpbmcqKiAodmFyaW91cyBjb21wYXJpc29ucyBhbW9uZyBncm91cHMpLCB3aGljaCBkb2Vzbid0IHJlcXVpcmUgZGVlcCBkZXNpZ24ga25vd2xlZGdlLiBUaGlzIGxlYWRzIHBlb3BsZSB0byB0aGluayB0aGF0ICoqZXhwZXJpbWVudGFsIGRlc2lnbioqIGlzIG5vdCBhIGNvcmUgdGVjaG5pcXVlIGFueW1vcmUuDQoNCiogKipTaW11bGF0aW9uIGFuZCBNb2RlbGluZyoqOiBJbiBlbmdpbmVlcmluZyBvciBzeXN0ZW1zIGJpb2xvZ3ksIHNpbXVsYXRpb25zIGNhbiBzb21ldGltZXMgcmVwbGFjZSBwaHlzaWNhbCBleHBlcmltZW50cywgdGhvdWdoIHRoZXnigJlyZSBvZnRlbiBiYXNlZCBvbiBkYXRhIG9yaWdpbmFsbHkgZ2F0aGVyZWQgZnJvbSB3ZWxsLWRlc2lnbmVkIGV4cGVyaW1lbnRzLg0KDQoqICoqRGF0YS1Ecml2ZW4gQ3VsdHVyZSoqOiBUaGVyZeKAmXMgc29tZXRpbWVzIGEgYmlhcyB0b3dhcmQgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBvdmVyIGh5cG90aGVzaXMtZHJpdmVuIHdvcmssIHdoaWNoIGNhbiBkb3ducGxheSB0aGUgaW1wb3J0YW5jZSBvZiBwcmlvciBkZXNpZ24uDQoNCkhvd2V2ZXIsIGZpZWxkcyBsaWtlIGFncmljdWx0dXJlLCBiaW9sb2d5LCBtZWRpY2luZSwgbWFya2V0aW5nLCBVWCAodXNlciBleHBlcmllbmNlKSwgYW5kIG1hbnVmYWN0dXJpbmcgc3RpbGwgZGVwZW5kIG9uIGl0IGhlYXZpbHkuDQoNCg0KSW4gdGhpcyBzaG9ydCBhbmQgbm9uLXRlY2huaWNhbCBub3RlLCB3ZSB3aWxsIGludHJvZHVjZSB0aGUgYmFzaWNzIG9mIHRoZSBwcmluY2lwbGVzIG9mIHRoZSBjbGFzc2ljICoqZXhwZXJpbWVudGFsIGRlc2lnbnMqKi4NCg0KXA0KDQojIFRoZSBMb2dpY2FsIFByb2Nlc3Mgb2YgRXhwZXJpbWVudGFsIERlc2lnbg0KDQoqKkV4cGVyaW1lbnRhbCBkZXNpZ24qKiBmb2xsb3dzIGEgc3lzdGVtYXRpYywgc3RlcC1ieS1zdGVwIGFwcHJvYWNoIHRvIGVuc3VyZSB0aGF0IHJlc2VhcmNoIGlzIHZhbGlkLCByZWxpYWJsZSwgYW5kIGludGVycHJldGFibGUuIEl0IGlzIGxpa2UgYnVpbGRpbmcgYSByb2FkbWFw4oCUaXQgZW5zdXJlcyB5b3UgcmVhY2ggdmFsaWQgY29uY2x1c2lvbnMgd2l0aG91dCBnZXR0aW5nIGxvc3QgaW4gYmlhc2VzIG9yIGVycm9ycy4gQnkgZm9sbG93aW5nIHRoaXMgbG9naWNhbCBwcm9jZXNzLCByZXNlYXJjaGVycyBjYW4gY29uZmlkZW50bHkgdGVzdCBoeXBvdGhlc2VzIGFuZCBjb250cmlidXRlIG1lYW5pbmdmdWwgZmluZGluZ3MgdG8gc2NpZW5jZS4NCg0KQmVsb3cgaXMgdGhlIGxvZ2ljYWwgc2VxdWVuY2UgcmVzZWFyY2hlcnMgZm9sbG93IHdoZW4gZGVzaWduaW5nIGFuIGV4cGVyaW1lbnQ6DQoNClwNCg0KKioxLiBEZWZpbmUgdGhlIFJlc2VhcmNoIFByb2JsZW0gJiBPYmplY3RpdmVzKioNCg0KKiAqV2hhdCBpcyB0aGUgcmVzZWFyY2ggcXVlc3Rpb24/KiAgV2Ugc3RhcnQgd2l0aCBhIGNsZWFybHkgZGVmaW5lZCByZXNlYXJjaCBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIGRvZXMgYSBuZXcgZmVydGlsaXplciBpbmNyZWFzZSBjcm9wIHlpZWxkIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCBvbmU/DQoNCiogKldoYXQgYXJlIHRoZSBoeXBvdGhlc2VzPyogVGhlIHdlbGwtZm9ybXVsYXRlZCByZXNlYXJjaCBxdWVzdGlvbiBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8gYW4gYW5hbHl0aWMgcXVlc3Rpb24gaW4gdGhlIGZvcm0gb2YgYSBzdGF0aXN0aWNhbCBoeXBvdGhlc2lzLiBGb3IgZXhhbXBsZSwgDQoNCiQkDQpIXzA6ICBcdGV4dHtObyAgZGlmZmVyZW5jZSAgYmV0d2VlbiAgZmVydGlsaXplcnN9IFwgXCBcIFx0ZXh0e3ZzfSBcICBcIFwgSF9hOiBcdGV4dHtUaGUgIG5ldyAgZmVydGlsaXplciAgaW5jcmVhc2VzICB5aWVsZH0NCiQkDQoNCioqMi4gSWRlbnRpZnkgVmFyaWFibGVzKioNCg0KKiAqSW5kZXBlbmRlbnQgVmFyaWFibGUgKElWKSogLSB0aGUgY2F1c2U6IFRoZSBmYWN0b3IgdmFyaWFibGUgdGhhdCBpcyBtYW5pcHVsYXRlZCBieSB0aGUgZXhwZXJpbWVudGVyLiBGb3IgZXhhbXBsZSwgZmVydGlsaXplciB0eXBlLCBkcnVnIGRvc2VzIGluIGNsaW5pY2FsIHRyaWFscywgZXRjLg0KDQoqICpEZXBlbmRlbnQgVmFyaWFibGUgKERWKSogLSB0aGUgZWZmZWN0OiBUaGUgb3V0Y29tZSB0aGF0IGlzIG1lYXN1cmVkLiBGb3IgZXhhbXBsZSwgY3JvcCB5aWVsZCwgcmVjb3ZlcnkgcmF0ZSBhZnRlciByZWNlaXZpbmcgdGhlIGRydWcsIGV0Yy4NCg0KKiAqQ29udHJvbCBWYXJpYWJsZXMgIChDb25zdGFudHMpKjogRmFjdG9ycyBrZXB0ICoqdW5jaGFuZ2VkKiogYWNyb3NzIGdyb3VwcyB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZSBJViBhZmZlY3RzIHRoZSBEVi4gRm9yIGV4YW1wbGUsIHNvaWwgdHlwZSwgd2F0ZXIgYW1vdW50LCBhZ2UgZ3JvdXAsIGVudmlyb25tZW50YWwgY29uZGl0aW9uLCBldGMuDQoNCiogKkV4dHJhbmVvdXMgVmFyaWFibGVzIChDb25mb3VuZGluZyBGYWN0b3JzKSo6IFVud2FudGVkIHZhcmlhYmxlcyB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgRFYgaWYgbm90IGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCBzdW5saWdodCwgcGVzdHMsIGRpZXQsIHN0cmVzcyBsZXZlbHMsIG9yIG1lYXN1cmVtZW50IGVycm9ycy4NCg0KDQoNCioqMyBDaG9vc2UgdGhlIEV4cGVyaW1lbnRhbCBEZXNpZ24qKg0KDQpTZWxlY3QgYSBkZXNpZ24gdGhhdCBiZXN0IGZpdHMgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLiBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgZGVzaWducy4gVGhlIGZvbGxvd2luZyBpcyBhIHNob3J0IGxpc3Qgb2YgY29tbW9ubHkgdXNlZCBkZXNpZ25zLiBXZSB3aWxsIGRpc2N1c3Mgc29tZSBvZiB0aGVtIHdpdGggbW9yZSBkZXRhaWwgaW4gdGhlIG5leHQgU2VjdGlvbi4NCg0KKiAqQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiAoQ1JEKSo6IEEgKipDb21wbGV0ZWx5IFJhbmRvbWl6ZWQgRGVzaWduIChDUkQpKiogYXNzaWducyB0cmVhdG1lbnRzIHRvIGV4cGVyaW1lbnRhbCB1bml0cyBwdXJlbHkgYXQgcmFuZG9tIHRvIGd1YXJhbnRlZSB0aGF0IGVhY2ggdW5pdCBoYXMgYW4gZXF1YWwgcHJvYmFiaWxpdHkgb2YgcmVjZWl2aW5nIGFueSB0cmVhdG1lbnQuIENSRCBpcyBleGNlbGxlbnQgZm9yIGlzb2xhdGluZyBjYXVzYWwgZWZmZWN0cyB3aGVuIHVuaXRzIGFyZSBob21vZ2VuZW91cyANCg0KKiAqKlJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpKio6IEluIGEgKipSYW5kb21pemVkIEJsb2NrIERlc2lnbioqLCAgZXhwZXJpbWVudGFsIHVuaXRzIGFyZSBncm91cGVkIChibG9ja2VkKSB0byBzaGFyZSBhIGtub3duIGNoYXJhY3RlcmlzdGljIHRoYXQgaXMgbm90IHByaW1hcmlseSBzdHVkaWVkLCBidXQgaXQgY291bGQgYWZmZWN0IHRoZSBvdXRjb21lLiBXaXRoaW4gZWFjaCBibG9jaywgYWxsIHRyZWF0bWVudHMgYXJlIHJhbmRvbWx5IGFzc2lnbmVkLiBDb250cm9sbGluZyBmb3Iga25vd24gYmxvY2tpbmcgdmFyaWFibGVzIGltcHJvdmVzIHRoZSBwcmVjaXNpb24gb2YgdHJlYXRtZW50IGVzdGltYXRlcy4gRm9yIGV4YW1wbGUsIGRpdmlkaW5nIHBsYW50cyBieSBzb2lsIHF1YWxpdHkgb3IgcGF0aWVudHMgYnkgYWdlL2dlbmRlci4gDQoNCg0KKiAqKkZhY3RvcmlhbCBEZXNpZ24qKjogQSBmYWN0b3JpYWwgZGVzaWduIHRlc3RzIHR3byBvciBtb3JlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoZmFjdG9ycykgc2ltdWx0YW5lb3VzbHksIHVzaW5nIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlaXIgbGV2ZWxzLiBUaGlzIGFsbG93cyBhc3Nlc3NtZW50IG9mIGJvdGggbWFpbiBlZmZlY3RzIChpbmRpdmlkdWFsIGZhY3RvciBpbXBhY3QpIGFuZCBpbnRlcmFjdGlvbiBlZmZlY3RzICh3aGVuIHRoZSBlZmZlY3Qgb2Ygb25lIGZhY3RvciBkZXBlbmRzIG9uIGFub3RoZXIpOiBGb3IgZXhhbXBsZSwgKmluIGEgcmVjZW50IExhbmNldCBzdHVkeSwgb2xkZXIgYWR1bHRzIHdlcmUgcmFuZG9taXplZCBhY3Jvc3MgdHdvIHZhY2NpbmUgdHlwZXMgKFBmaXplcuKAkUJpb05UZWNoIHZzLiBPeGZvcmTigJFBc3RyYVplbmVjYSkgYW5kIHR3byBkb3NpbmcgaW50ZXJ2YWxzICgzIHdlZWtzIHZzLiAxMiB3ZWVrcyksIGNyZWF0aW5nIGZvdXIgZ3JvdXBzLiBUaGUgcmVzZWFyY2hlcnMgbWVhc3VyZWQgYW50aWJvZHkgbGV2ZWxzIHRvIGFzc2VzcyBtYWluIGVmZmVjdHMgKHZhY2NpbmUgdHlwZSwgZG9zZSBpbnRlcnZhbCkgYW5kIHdoZXRoZXIgdGhlcmUgd2FzIGFuIGludGVyYWN0aW9u4oCUaS5lLiwgd2hldGhlciB0aGUgZG9zaW5nIGludGVydmFsIGVmZmVjdCBkaWZmZXJlZCBieSB2YWNjaW5lIHR5cGUuIFRoZXkgZm91bmQgaGlnaGVyIGFudGlib2RpZXMgb3ZlcmFsbCB3aXRoIFBmaXplciwgYW5kIGxvbmdlciBpbnRlcnZhbHMgYm9vc3RlZCByZXNwb25zZSBpbiBib3RoIHZhY2NpbmUgZ3JvdXBzLiogDQoNCg0KKiAqKlJlcGVhdGVkIE1lYXN1cmVzKio6IFRoaXMgZGVzaWduIGludm9sdmVzIG1lYXN1cmluZyB0aGUgKipzYW1lIHBhcnRpY2lwYW50cyAob3IgdW5pdHMpKiogbXVsdGlwbGUgdGltZXMgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMgb3IgdGltZSBwb2ludHMuIEl0IGNvbnRyb2xzIGZvciBpbmRpdmlkdWFsIGRpZmZlcmVuY2VzIGFuZCBib29zdHMgc3RhdGlzdGljYWwgcG93ZXIgYmVjYXVzZSBlYWNoIHBhcnRpY2lwYW50IGFjdHMgYXMgdGhlaXIgY29udHJvbC4gU29tZSBleGFtcGxlcyBpbmNsdWRlOg0KICArICBDb2duaXRpdmUgdGVzdHMgYXQgYWdlcyAzMCwgNDAsIGFuZCA1MCB0byB0cmFjayBkZWNsaW5lIG9yIGltcHJvdmVtZW50Ow0KICArICBEcnVnIEEgdnMuIERydWcgQiAtIGVhY2ggcGFydGljaXBhbnQgdGFrZXMgYm90aCBpbiBkaWZmZXJlbnQgb3JkZXJzOw0KICArICBUZXN0aW5nIHRocmVlIGRpZmZlcmVudCBkcnVncyBmb3Igc21va2luZyBjcmF2aW5ncyAtIHRoZSBzYW1lIHBhcnRpY2lwYW50cyByZWNlaXZlIGVhY2ggZHJ1ZyBvbiBkaWZmZXJlbnQgZGF5cy4NCg0KDQoqKjUuIFJhbmRvbWl6YXRpb24sIEJsaW5kaW5nICYgQXNzaWdubWVudCoqDQoNClRoZXNlIHRocmVlIHRlY2huaXF1ZXMgYXJlIGNyaXRpY2FsIGZvciBtaW5pbWl6aW5nIGJpYXMsIGVuc3VyaW5nIHZhbGlkaXR5LCBhbmQgc3RyZW5ndGhlbmluZyBjYXVzYWwgaW5mZXJlbmNlcyBpbiBleHBlcmltZW50cy4gQmVsb3cgaXMgYSBkZXRhaWxlZCBicmVha2Rvd24gb2YgZWFjaCBjb25jZXB0LCBpdHMgaW1wb3J0YW5jZSwgYW5kIGhvdyB0aGV5IGFyZSBpbXBsZW1lbnRlZC4NCg0KKiBSYW5kb21pemUgcGFydGljaXBhbnRzIG9yIHVuaXRzIHRvIHRyZWF0bWVudHMgdG8gYXZvaWQgKipzZWxlY3Rpb24gYmlhcyoqLg0KICArIFNpbXBsZSBSYW5kb21pemF0aW9uIC0gRm9yIGV4YW1wbGUsIGluIGEgZHJ1ZyB0cmlhbCwgMTAwIHBhdGllbnRzIGFyZSByYW5kb21seSBhc3NpZ25lZCB0byBlaXRoZXIgdGhlIG5ldyBkcnVnIG9yIHBsYWNlYm8gKHBpbGwgd2l0aCBubyBkcnVnIGluZ3JlZGllbnQpIGdyb3VwIHVzaW5nIGEgY29tcHV0ZXItZ2VuZXJhdGVkIHJhbmRvbSBzZXF1ZW5jZS4NCiAgKyBCbG9jayBSYW5kb21pemF0aW9uIC0gRW5zdXJlcyBlcXVhbCBncm91cCBzaXplcyBieSByYW5kb21pemluZyB3aXRoaW4gc21hbGwgYmxvY2tzLg0KICArIFN0cmF0aWZpZWQgUmFuZG9taXphdGlvbiAtIFJhbmRvbWl6ZXMgd2l0aGluIHN1Ymdyb3VwcyAoZS5nLiwgYnkgYWdlIG9yIGdlbmRlcikgdG8gbWFpbnRhaW4gYmFsYW5jZS4NCiAgDQoqIEJsaW5kIHBhcnRpY2lwYW50cyBhbmQvb3IgcmVzZWFyY2hlcnMgd2hlbiBwb3NzaWJsZSwgdG8gcmVkdWNlIGV4cGVjdGF0aW9uIGVmZmVjdHMuDQogICsgKipTaW5nbGUtQmxpbmQqKjoJdG8gcGFydGljaXBhbnRzIG9ubHkuIEl0IHByZXZlbnRzIHBsYWNlYm8gZWZmZWN0cy4NCiAgKyAqKkRvdWJsZS1CbGluZCoqOgl0byBib3RoIHBhcnRpY2lwYW50cyBhbmQgcmVzZWFyY2hlcnMuIEl0IGVsaW1pbmF0ZXMgZXhwZXJpbWVudGVyIGJpYXMgJiBwYXJ0aWNpcGFudCBiaWFzLg0KICArICoqVHJpcGxlLUJsaW5kKioJdG8gcGFydGljaXBhbnRzLCByZXNlYXJjaGVycywgYW5kIGRhdGEgYW5hbHlzdHMuIEl0IHJlZHVjZXMgYmlhcyBpbiBpbnRlcnByZXRhdGlvbi4NCg0KDQoqIEFzc2lnbm1lbnQgcmVmZXJzIHRvIGhvdyBwYXJ0aWNpcGFudHMgb3IgZXhwZXJpbWVudGFsIHVuaXRzIGFyZSBhbGxvY2F0ZWQgdG8gZGlmZmVyZW50IHRyZWF0bWVudCBncm91cHMuIFByb3BlciBhc3NpZ25tZW50IGlzIGNydWNpYWwgZm9yIHZhbGlkIGNvbXBhcmlzb25zIGFuZCBtaW5pbWl6aW5nIGJpYXMuIA0KICArICoqQmV0d2Vlbi1TdWJqZWN0cyoqIChJbmRlcGVuZGVudCBNZWFzdXJlcyk6IERpZmZlcmVudCBwYXJ0aWNpcGFudHMgYXJlIGFzc2lnbmVkIHRvIGVhY2ggdHJlYXRtZW50IGdyb3VwLg0KICArICoqV2l0aGluLVN1YmplY3RzKiogKFJlcGVhdGVkIE1lYXN1cmVzKTogVGhlIHNhbWUgcGFydGljaXBhbnRzIGV4cGVyaWVuY2UgYWxsIGNvbmRpdGlvbnMNCiAgKyAqKk1hdGNoZWQtUGFpcnMgRGVzaWduKio6IFBhcnRpY2lwYW50cyBhcmUgcGFpcmVkIGJhc2VkIG9uIGtleSB0cmFpdHMgKGUuZy4sIGFnZSwgSVEpLCB0aGVuIHNwbGl0IGludG8gZ3JvdXBzLg0KDQoNCg0KKio2LiBQbGFuIFNhbXBsaW5nICYgRGF0YSBDb2xsZWN0aW9uKioNCg0KKiAqKlNhbXBsaW5nKiogcmVmZXJzIHRvIGhvdyB5b3Ugc2VsZWN0IGV4cGVyaW1lbnRhbCB1bml0cyAoZS5nLiwgcGxvdHMsIGFuaW1hbHMsIHBlb3BsZSkgZnJvbSB0aGUgbGFyZ2VyIHBvcHVsYXRpb27igJRpZGVhbGx5IHRocm91Z2ggcmFuZG9tIHNhbXBsaW5nIHRvIGVuc3VyZSByZXByZXNlbnRhdGl2ZW5lc3MuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjkwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvU2FtcGxpbmdQbGFucy5wbmciKQ0KYGBgDQoNCiogUmVjb3JkIG1lYXN1cmVtZW50cyBhY2N1cmF0ZWx5IChlLmcuLCBjcm9wIHdlaWdodCwgcGxhbnQgaGVpZ2h0KS4NCg0KDQoqKjcuIEFuYWx5emUgRGF0YSBhbmQgSW50ZXJwcmV0YXRpb24qKg0KDQpUaGlzIHdpbGwgYmUgZGlzY3Vzc2VkIGluIGRldGFpbCBpbiBzZXBhcmF0ZSBub3Rlcy4gVGhlIGtleSBpcyB0byBjaG9vc2UgYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgcHJvY2VkdXJlcyB0byBwZXJmb3JtIGFuYWx5c2lzIGFuZCBtYWtlIGEgcmVsZXZhbnQgZGlhZ25vc2lzLiBUaGlzIGlzIGFuIGl0ZXJhdGl2ZSBwcm9jZXNzLiBNYWtlIHN1cmUgdGhhdCBhbGwgYXNzdW1wdGlvbnMgYXJlIHNhdGlzZmllZCBiZWZvcmUgaW50ZXJwcmV0aW5nIHRoZSByZXN1bHRzLg0KDQoqKjguIFJlcG9ydGluZyBhbmQgVmFsaWRhdGluZyoqDQoNClRoaXMgaXMgdGhlIGZpbmFsIHN0ZXAuIFdlIHdpbGwgYWxzbyBkaXNjdXNzIHRoaXMgaW4gdGhlIHN1YnNlcXVlbnQgbm90ZS4gVGhlIGtleSBpZGVhIGlzIHRvIGZvbGxvdyB0aGUgYmVzdCBwcmFjdGljZXM6IA0KDQoNCiMgQ1JEIGFuZCBSQkQNCg0KVGhpcyBzZWN0aW9uIGJyaWVmbHkgaW50cm9kdWNlcyB0d28gbW9zdCBjb21tb25seSB1c2VkIGV4cGVyaW1lbnRhbCBkZXNpZ25zOiB0aGUgY29tcGxldGVseSByYW5kb21pemVkIGRlc2lnbiBhbmQgdGhlIHJhbmRvbWl6ZWQgYmxvY2sgZGVzaWduLCBpbiBtb3JlIGRldGFpbC4gV2Ugd2lsbCBhbHNvIG9yZ2FuaXplIHRoZSByZXN1bHRpbmcgZGF0YSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YSBhbmFseXNpcyB1c2luZyBlaXRoZXIgYSBzb2Z0d2FyZSBwcm9ncmFtIG9yIG1hbnVhbGx5Lg0KDQoNCiMjIENvbXBsZXRlbHkgUmFuZG9taXplZCBEZXNpZ24NCg0KVGhlICoqQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiAoQ1JEKSoqIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBhbmQgd2lkZWx5IHVzZWQgZXhwZXJpbWVudGFsIGRlc2lnbnMgaW4gcmVzZWFyY2guIEl0IGlzIHBhcnRpY3VsYXJseSBzdWl0YWJsZSB3aGVuIGV4cGVyaW1lbnRhbCB1bml0cyBhcmUgaG9tb2dlbmVvdXMsIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGFtb25nIHRoZW0gYmVmb3JlIGFwcGx5aW5nIHRyZWF0bWVudHMuIENSRCBmb2xsb3dzIHRoZSAqKnByaW5jaXBsZSBvZiByYW5kb21pemF0aW9uKiosIHdoZXJlIHN1YmplY3RzIChvciBleHBlcmltZW50YWwgdW5pdHMpIGFyZSByYW5kb21seSBhc3NpZ25lZCB0byB0cmVhdG1lbnRzLiBUaGF0IG1lYW5zIDxmb250IGNvbG9yID0gInJlZCI+KipcY29sb3J7cmVkfWVhY2ggc3ViamVjdCBoYXMgYW4gZXF1YWwgY2hhbmNlIG9mIHJlY2VpdmluZyBhbnkgdHJlYXRtZW50LCBhbmQgdGhlIGFzc2lnbm1lbnQgaXMgZG9uZSBpbmRlcGVuZGVudGx5IG9mIGFueSBncm91cGluZyoqPC9mb250Pi4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0iNzAlIn0NCmluY2x1ZGVfZ3JhcGhpY3MoIndlZWswNC9DUkQucG5nIikNCmBgYA0KDQpEZXBlbmRpbmcgb24gKnRoZSBudW1iZXIgb2YgcmVwbGljYXRpb25zIHBlciB0cmVhdG1lbnQqICg8Zm9udCBjb2xvciA9ICJyZWQiPmkuZS4sIHRoZSBudW1iZXIgb2YgZXhwZXJpbWVudGFsIHVuaXRzIHRoYXQgcmVjZWl2ZSB0aGUgc2FtZSB0cmVhdG1lbnQgaW5kZXBlbmRlbnRseTwvZm9udD4pLCAqKmEgQ1JEIGNhbiBiZSBjbGFzc2lmaWVkIGFzIGVpdGhlciBiYWxhbmNlZCBvciBpbWJhbGFuY2VkKiouIFVuZGVyc3RhbmRpbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhdGlvbnMgaXMgY3J1Y2lhbCBmb3IgcHJvcGVyIGV4cGVyaW1lbnRhbCBkZXNpZ24gYW5kIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KDQpJbiB0aGUgYWJvdmUgZmlndXJlLCB0aGUgbnVtYmVyIG9mIHN1YmplY3RzIGluIGVhY2ggdHJlYXRtZW50IGlzIGVxdWFsLCAkbl8xID0gbl8yID0gbl8zJCwgYW5kIHRoZSBoeXBvdGhldGljYWwgQ1JEIGlzIGEgYmFsYW5jZWQgZGVzaWduLg0KDQoNClRoaXMgZGVzaWduIGlzIGNvbW1vbmx5IHVzZWQgaW4gYWdyaWN1bHR1cmFsIGV4cGVyaW1lbnRzLCBjbGluaWNhbCB0cmlhbHMsIGluZHVzdHJpYWwgc3R1ZGllcywgYW5kIGxhYm9yYXRvcnkgcmVzZWFyY2ggZHVlIHRvIGl0cyBzaW1wbGljaXR5IGFuZCBmbGV4aWJpbGl0eS4NCg0KDQoNCioqVGhlIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgQ1JEIGluY2x1ZGUqKjoNCg0KKiAqKlJhbmRvbSBBc3NpZ25tZW50Kio6IFRyZWF0bWVudHMgYXJlIGFsbG9jYXRlZCByYW5kb21seSB0byBleHBlcmltZW50YWwgdW5pdHMgdG8gbWluaW1pemUgYmlhcy4NCg0KKiAqKkhvbW9nZW5lb3VzIEV4cGVyaW1lbnRhbCBVbml0cyoqOiBBbGwgc3ViamVjdHMgb3IgcGxvdHMgYXJlIGFzc3VtZWQgdG8gYmUgc2ltaWxhciBiZWZvcmUgdHJlYXRtZW50IGFwcGxpY2F0aW9uLg0KDQoqICoqTm8gQmxvY2tpbmcqKjogVW5saWtlIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpLCBDUkQgZG9lcyBub3QgZ3JvdXAgdW5pdHMgaW50byBibG9ja3MgdG8gY29udHJvbCB2YXJpYWJpbGl0eS4NCg0KKiAqKkZsZXhpYmlsaXR5Kio6IEl0IGNhbiBhY2NvbW1vZGF0ZSBhbnkgbnVtYmVyIG9mIHRyZWF0bWVudHMgYW5kIHJlcGxpY2F0aW9ucy4NCg0KKiAqKlNpbXBsZSBBbmFseXNpcyoqOiBEYXRhIGZyb20gQ1JEIGNhbiBiZSBlYXNpbHkgYW5hbHl6ZWQgdXNpbmcgb25lLXdheSBBTk9WQSAoQW5hbHlzaXMgb2YgVmFyaWFuY2UpLg0KDQoNCioqQSBOb24tbnVtZXJpY2FsIEV4YW1wbGUqKg0KDQpTdXBwb3NlIGEgcGhhcm1hY2V1dGljYWwgY29tcGFueSB3YW50cyB0byB0ZXN0IHRocmVlIGRpZmZlcmVudCBkcnVnIGZvcm11bGF0aW9ucyAoQSwgQiwgQykgb24gYmxvb2QgcHJlc3N1cmUuIEEgYmFsYW5jZWQsIGNvbXBsZXRlbHkgcmFuZG9taXplZCBkZXNpZ24gd2lsbCBmb2xsb3cgdGhlIG5leHQgZmV3IHN0ZXBzLg0KDQoqKlN0ZXAgMSoqOiBTZWxlY3QgMzAgc2ltaWxhciBwYXRpZW50cy4NCg0KKipTdGVwIDIqKjogUmFuZG9tbHkgYXNzaWduIDEwIHBhdGllbnRzIHRvIGVhY2ggZHJ1ZyBncm91cC4NCg0KKipTdGVwIDMqKjogQWRtaW5pc3RlciB0cmVhdG1lbnRzIGFuZCBtZWFzdXJlIGJsb29kIHByZXNzdXJlIGFmdGVyIGEgc2V0IHBlcmlvZC4NCg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoPSI3MCUifQ0KaW5jbHVkZV9ncmFwaGljcygid2VlazA0L0NSRC1FeGFtcGxlLnBuZyIpDQpgYGANCg0KDQpUaGUgbmV4dCBmaWd1cmUgaWxsdXN0cmF0ZXMgaG93IHRvIHJlYWQgdGhlIENSRCBkYXRhIHRhYmxlIGNlbGwuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjUwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvQ1JELWNlbGwucG5nIikNCmBgYA0KDQpUaGUgZm9ybWF0cyByZXF1aXJlZCBmb3IgYW5hbHlzaXMgdXNpbmcgZGlmZmVyZW50IHNvZnR3YXJlIHByb2dyYW1zIHdpbGwgYmUgZGlzY3Vzc2VkIGluIHN1YnNlcXVlbnQgbm90ZXMgZm9jdXNpbmcgb24gYW5hbHl6aW5nIGRpZmZlcmVudCBleHBlcmltZW50YWwgZGVzaWducy4gDQoNCg0KXA0KDQpUaGUgQ29tcGxldGVseSBSYW5kb21pemVkIERlc2lnbiBpcyBhIGZ1bmRhbWVudGFsIGV4cGVyaW1lbnRhbCBhcHByb2FjaCBkdWUgdG8gaXRzIHNpbXBsaWNpdHkgYW5kIGVhc2Ugb2YgYXBwbGljYXRpb24uIFdoaWxlIGl0IGlzIGhpZ2hseSBlZmZlY3RpdmUgaW4gaG9tb2dlbmVvdXMgc2V0dGluZ3MsIGl0cyBsaW1pdGF0aW9ucyBiZWNvbWUgYXBwYXJlbnQgd2hlbiBkZWFsaW5nIHdpdGggdmFyaWFiaWxpdHkuIFJlc2VhcmNoZXJzIG11c3QgY2FyZWZ1bGx5IGFzc2VzcyB3aGV0aGVyIENSRCBpcyBhcHByb3ByaWF0ZSBvciBpZiBtb3JlIGFkdmFuY2VkIGRlc2lnbnMgKGUuZy4sIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduKSBhcmUgbmVlZGVkLiBEZXNwaXRlIGl0cyBjb25zdHJhaW50cywgQ1JEIHJlbWFpbnMgYSBjb3JuZXJzdG9uZSBvZiBleHBlcmltZW50YWwgcmVzZWFyY2gsIHByb3ZpZGluZyBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGFuZCBzY2llbnRpZmljIGRpc2NvdmVyeS4NCg0KVGhlIGZvbGxvd2luZyBZb3VUdWJlIHZpZGVvIGV4cGxhaW5zIENSRCAoZmlyc3QgMTUgTWludXRlcywgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9S0o1RzJLamNYY0E+KS4gVGhlIGFuYWx5c2lzIHBhcnQgd2lsbCBiZSBkaXNjdXNzZWQgaW4gdGhlIG5leHQgbm90ZSBvbiBPbmUtd2F5IEFOT1ZBLiANCg0KXA0KDQo8Y2VudGVyPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9S0o1RzJLamNYY0EiIHRhcmdldD0icG9wdXAiIA0KICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUtKNUcyS2pjWGNBJywNCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsJ3dpZHRoPTg1MCxoZWlnaHQ9NTAwJykiPjxpbWcgc3JjID0gImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL01BVDEyMVc1L2ltZy9WaWRlb0ljb24ucG5nIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjEyMCI+PC9hPg0KPC9jZW50ZXI+DQoNClwNCg0KDQoNCiMjIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduDQoNClRoZSBSYW5kb21pemVkIEJsb2NrIERlc2lnbiAoUkJEKSBpcyBhIHdpZGVseSB1c2VkIGV4cGVyaW1lbnRhbCBkZXNpZ24gdGhhdCBpbXByb3ZlcyBwcmVjaXNpb24gYnkgY29udHJvbGxpbmcga25vd24gc291cmNlcyBvZiB2YXJpYWJpbGl0eS4gVW5saWtlIHRoZSBDb21wbGV0ZWx5IFJhbmRvbWl6ZWQgRGVzaWduIChDUkQpLCB3aGljaCBhc3N1bWVzIGhvbW9nZW5lb3VzIGV4cGVyaW1lbnRhbCB1bml0cywgUkJEIGdyb3VwcyBzaW1pbGFyIHVuaXRzIGludG8gYmxvY2tzIGFuZCB0aGVuIHJhbmRvbWl6ZXMgdHJlYXRtZW50cyB3aXRoaW4gZWFjaCBibG9jay4gVGhpcyBhcHByb2FjaCByZWR1Y2VzIGV4cGVyaW1lbnRhbCBlcnJvciBhbmQgZW5oYW5jZXMgdGhlIGFjY3VyYWN5IG9mIHRyZWF0bWVudCBjb21wYXJpc29ucy4gUkJEIGlzIGNvbW1vbmx5IGFwcGxpZWQgaW4gYWdyaWN1bHR1cmUsIGNsaW5pY2FsIHRyaWFscywgaW5kdXN0cmlhbCBleHBlcmltZW50cywgYW5kIGVjb2xvZ2ljYWwgc3R1ZGllcyB3aGVyZSBleHRlcm5hbCBmYWN0b3JzIChlLmcuLCBzb2lsIGZlcnRpbGl0eSwgcGF0aWVudCBhZ2UsIG1hY2hpbmUgZGlmZmVyZW5jZXMpIG1heSBpbmZsdWVuY2UgcmVzdWx0cy4NCg0KDQoqKlR3byByZWxhdGVkIChidXQgc29tZXRpbWVzIGNvbmZ1c2luZykgY29uY2VwdHMqKg0KDQoqICoqRXh0cmFuZW91cyBWYXJpYWJsZSoqIC0gQW55IHZhcmlhYmxlIG90aGVyIHRoYW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSBvdXRjb21lIChkZXBlbmRlbnQgdmFyaWFibGUpLiBJdCBtYXkgb3IgbWF5IG5vdCBiZSBhIHByb2JsZW0uIElmIHByb3Blcmx5IGNvbnRyb2xsZWQgb3IgcmFuZG9taXplZCwgaXQgZG9lc27igJl0IGJpYXMgdGhlIHJlc3VsdHMuIEZvciBleGFtcGxlLCBpbiBhIHBsYW50IGdyb3d0aCBleHBlcmltZW50LCBzdW5saWdodCBhbmQgd2F0ZXIgYXJlIGV4dHJhbmVvdXMgdmFyaWFibGVzIGlmIHlvdSdyZSB0ZXN0aW5nIHRoZSBlZmZlY3Qgb2YgZmVydGlsaXplci4NCg0KKiAqKkNvbmZvdW5kaW5nIFZhcmlhYmxlKiogLSBBIHR5cGUgb2YgZXh0cmFuZW91cyB2YXJpYWJsZSB0aGF0IGlzIG5vdCBjb250cm9sbGVkIGFuZCBzeXN0ZW1hdGljYWxseSB2YXJpZXMgd2l0aCB0aGUgdHJlYXRtZW50LiBJdCAqKmNvbmZvdW5kcyAoaS5lLiwgbWl4ZXMgdXApKiogdGhlIGVmZmVjdCBvZiB0aGUgdHJlYXRtZW50LCBtYWtpbmcgaXQgaGFyZCB0byBrbm93IHdoZXRoZXIgdGhlIG9ic2VydmVkIGVmZmVjdCBpcyBkdWUgdG8gdGhlIHRyZWF0bWVudCBvciB0aGUgY29uZm91bmRlci4NCg0KVG8gc3VtbWFyaXplLCB3ZSBjcmVhdGUgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBkbyBiYWNrLXRvLWJhY2sgY29tcGFyaXNvbnMuDQoNCnwgVGVybQkgIHwgIElzIGl0IGEgcHJvYmxlbT8JfCAgIFN5c3RlbWF0aWNhbGx5IHJlbGF0ZWQgdG8gdHJlYXRtZW50PyB8CUFmZmVjdHMgb3V0Y29tZT8gfA0KfDotLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tfA0KfEV4dHJhbmVvdXMgVmFyaWFibGV8CU5vdCBhbHdheXN8CU5vdCBuZWNlc3NhcmlseQl8UG9zc2libHl8DQp8Q29uZm91bmRpbmcgVmFyaWFibGV8CVllcyAoaWYgdW5jb250cm9sbGVkKQl8WWVzfAlZZXN8DQoNClwNCg0KIyMjIE1ham9yIENvbXBvbmVudHMgaW4gUkJEDQoNCkFzIG1lbnRpb25lZCBlYXJsaWVyLCBhbiBSQkQgaXMgYW4gZXhwZXJpbWVudGFsIGRlc2lnbiB3aGVyZSBzdWJqZWN0cyBvciAqKmV4cGVyaW1lbnRhbCB1bml0cyoqIGFyZSBncm91cGVkIGludG8gKipob21vZ2VuZW91cyBncm91cHMgL2Jsb2NrcyoqIGJhc2VkIG9uIHNvbWUgc2ltaWxhcml0eSAobGlrZSBhZ2UsIHdlaWdodCwgbG9jYXRpb24pIHRvIGNvbnRyb2wgZm9yIHZhcmlhYmlsaXR5IHRoYXQgaXNuJ3Qgb2YgcHJpbWFyeSBpbnRlcmVzdC4gV2l0aGluIGVhY2ggYmxvY2ssICoqdHJlYXRtZW50cyoqIGFyZSAqKnJhbmRvbWx5IGFzc2lnbmVkKiogdG8gdGhlIHVuaXRzLg0KDQoNCioqRXhwZXJpbWVudGFsIFVuaXQqKg0KDQpUaGlzIGlzIHRoZSBzbWFsbGVzdCBkaXZpc2lvbiBvZiB0aGUgZXhwZXJpbWVudGFsIG1hdGVyaWFsIHRvIHdoaWNoIGEgdHJlYXRtZW50IGNhbiBiZSBhc3NpZ25lZC4gRm9yIGV4YW1wbGUsIGluIGFncmljdWx0dXJhbCBleHBlcmltZW50cywgYSBwbG90IG9mIGxhbmQgY2FuIGJlIGFuIGV4cGVyaW1lbnRhbCB1bml0IHdoZXJlIGRpZmZlcmVudCBmZXJ0aWxpemVycyAodHJlYXRtZW50cykgYXJlIGFwcGxpZWQuDQoNCioqVHJlYXRtZW50KioNCg0KVGhpcyByZWZlcnMgdG8gdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIG9yIGludGVydmVudGlvbnMgd2hvc2UgZWZmZWN0cyBhcmUgYmVpbmcgc3R1ZGllZC4gRm9yIGluc3RhbmNlLCBkaWZmZXJlbnQgZG9zYWdlcyBvZiBhIGRydWcgYXJlIHVzZWQgaW4gYSBtZWRpY2FsIHRyaWFsLg0KDQoqKkJsb2NrKioNCg0KQSBibG9jayBpcyBhIGdyb3VwIG9mIGV4cGVyaW1lbnRhbCB1bml0cyB0aGF0IGFyZSBzaW1pbGFyIGluIHNvbWUgd2F5IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYWZmZWN0IHRoZSByZXNwb25zZSB0byB0aGUgdHJlYXRtZW50cy4gVGhlIGlkZWEgaXMgdG8gbWFrZSBjb21wYXJpc29ucyB3aXRoaW4gYmxvY2tzIHRvIHJlZHVjZSB0aGUgaW1wYWN0IG9mIHZhcmlhYmlsaXR5IGJldHdlZW4gYmxvY2tzLg0KDQoNCkluIENSRCwgKiptdWx0aXBsZSBleHBlcmltZW50YWwqKiB1bml0cyBhcmUgYXNzaWduZWQgdG8gZWFjaCB0cmVhdG1lbnQuIEluIFJCRCwgaW50cm9kdWNpbmcgYSBibG9ja2luZyB2YXJpYWJsZSBtYWtlcyB0aGUgZGVzaWduIGFuZCBkYXRhIGxheW91dCBtb3JlIGNvbXBsZXggdGhhbiB0aGUgQ1JEIHNpbmNlIHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvbWJpbmF0aW9ucyBvZiBibG9ja3MgYW5kIHRyZWF0bWVudHMgd2hlbiBhc3NpZ25pbmcgZXhwZXJpbWVudGFsIHVuaXRzLg0KDQoNClwNCg0KIyMjIFJCRCB3aXRob3V0IFJlcGxpY2F0ZXMgKEJhc2ljcyBSQkQpDQoNCkluIHRoaXMgc2NlbmFyaW8sIGZvciBlYWNoIGJsb2NrLCB0aGVyZSBpcyBleGFjdGx5IG9uZSBleHBlcmltZW50YWwgdW5pdCBhc3NpZ25lZCB0byBlYWNoIHRyZWF0bWVudC4gSWYgdGhlcmUgYXJlICR0JCB0cmVhdG1lbnRzLCB0aGVuIGVhY2ggYmxvY2sgd2lsbCBoYXZlICR0JCBleHBlcmltZW50YWwgdW5pdHMsIG9uZSBmb3IgZWFjaCB0cmVhdG1lbnQuDQoNClRoZSByZXN1bHRpbmcgZGF0YSB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuDQoNCnwgICAgIHwgKip0cmVhdCAxKiogIHwgICoqdHJlYXQgMioqICB8ICAgJFxjZG90cyQgIHwgKip0cmVhdCB0KiogfA0KfDotLS0tLS0tLS0tfDotLS0tLS0tLS0tfDotLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tfA0KfCAqKmJsb2NrIDEqKiB8ICR5X3sxMX0kIHwgICR5X3syMX0kICB8ICAkXGNkb3RzJCAgfCAkeV97dDF9JCB8DQp8ICoqYmxvY2sgMioqIHwgJHlfezEyfSQgfCAgJHlfezIyfSQgIHwgICRcY2RvdHMkICB8ICR5X3t0Mn0kIHwNCnwgICRcY2RvdHMkICAgfCAkXGNkb3RzJCB8ICAkXGNkb3RzJCAgfCAgJFxjZG90cyQgIHwgJFxjZG90cyQgfA0KfCAqKmJsb2NrIGIqKiB8ICR5X3sxYn0kIHwgICR5X3syYn0kICB8ICAkXGNkb3RzJCAgfCAkeV97dGJ9JCB8DQoNCg0KYGBge3IgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0iNTAlIn0NCmluY2x1ZGVfZ3JhcGhpY3MoIndlZWswNC9SQkQtTm9SZXAtY2VsbC5wbmciKQ0KYGBgDQoNCioqRXhhbXBsZSoqOiBMZXQncyBjb25zaWRlciBhbiBhZ3JpY3VsdHVyYWwgZXhhbXBsZSB0byBtYWtlIHRoaXMgY29uY3JldGUuIEFzc3VtZSB0aGF0IHRoZXJlIGFyZSB0aHJlZSB0cmVhdG1lbnRzOiAzIGRpZmZlcmVudCB0eXBlcyBvZiBmZXJ0aWxpemVycyAoRjEsIEYyLCBGMykgYW5kIGZvdXIgYmxvY2tzOiA0IGRpZmZlcmVudCBmaWVsZHMgKEJsb2NrMSwgQmxvY2syLCBCbG9jazMsIEJsb2NrNCkgd2hpY2ggbWF5IHZhcnkgaW4gc29pbCBxdWFsaXR5LCBzdW5saWdodCwgZXRjLiBJbiBlYWNoIGJsb2NrIChmaWVsZCksIHdlIGhhdmUgMyBwbG90cyAoZXhwZXJpbWVudGFsIHVuaXRzKSwgZWFjaCBhc3NpZ25lZCB0byBvbmUgb2YgdGhlIDMgZmVydGlsaXplcnMgcmFuZG9tbHksIGFuZCB0aGVuIG1lYXN1cmUgdGhlIHlpZWxkcyAoJHlfe2lqfSQpLg0KDQpUaGUgYXNzaWdubWVudCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6DQoNCnwgICAgICB8ICAgKipQbG90IDEqKiB8ICoqUGxvdCAyKiogfCAqKlBsb3QgMyoqIHwNCnw6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS18DQp8KipCbG9jayAyKiogfCBGMiAgfCBGMSB8ICBGMyB8DQp8KipCbG9jayAzKiogfCBGMSAgfCBGMyB8ICBGMSB8DQp8KipCbG9jayA0KiogfCBGMyAgfCBGMiB8ICBGMiB8DQoNCkhlcmUsIGVhY2ggdHJlYXRtZW50IGFwcGVhcnMgZXhhY3RseSBvbmNlIGluIGVhY2ggYmxvY2ssIGFuZCB3aXRoaW4gZWFjaCBibG9jaywgdGhlIGFzc2lnbm1lbnQgaXMgcmFuZG9tLiBUaGUgY29ycmVzcG9uZGluZyBkYXRhIHRhYmxlIGlzDQoNCnwgICAgICB8ICAgKipQbG90IDEqKiB8ICoqUGxvdCAyKiogfCAqKlBsb3QgMyoqIHwNCnw6LS0tLS0tLS0tLS18Oi0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS18DQp8KipCbG9jayAyKiogfCAkeV97MTF9JCAgfCAkeV97MjF9JCB8ICAkeV97MzF9JCB8DQp8KipCbG9jayAzKiogfCAkeV97MTJ9JCAgfCAkeV97MjJ9JCB8ICAkeV97MzJ9JCB8DQp8KipCbG9jayA0KiogfCAkeV97MTN9JCAgfCAkeV97MjN9JCB8ICAkeV97MzN9JCB8DQoNCg0KVGhpcyBkZXNpZ24gZ3VhcmFudGVlcyB0aGF0Og0KDQoqICoqQ29udHJvbCBvZiBWYXJpYWJpbGl0eSoqOiBCeSBncm91cGluZyBzaW1pbGFyIGV4cGVyaW1lbnRhbCB1bml0cyBpbnRvIGJsb2Nrcywgd2UgY29udHJvbCBmb3IgdGhlIHZhcmlhYmlsaXR5IGJldHdlZW4gYmxvY2tzLiBUaGlzIGluY3JlYXNlcyB0aGUgcHJlY2lzaW9uIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcy4NCg0KKiAqKkJhbGFuY2UqKjogRWFjaCB0cmVhdG1lbnQgYXBwZWFycyBlcXVhbGx5IG9mdGVuIGluIGVhY2ggYmxvY2ssIG1ha2luZyB0aGUgZGVzaWduIGJhbGFuY2VkLCB3aGljaCBzaW1wbGlmaWVzIGFuYWx5c2lzLg0KDQoqICoqUmFuZG9taXphdGlvbioqOiAqKlJhbmRvbSBhc3NpZ25tZW50Kiogd2l0aGluIGJsb2NrcyBoZWxwcyBpbiBhdm9pZGluZyBzeXN0ZW1hdGljIGJpYXMuDQoNCg0KIyMjIFJCRCB3aXRoIFJlcGxpY2F0ZXMgKFJlcGxpY2F0ZWQgUkJEKQ0KDQpUaGUgYmFzaWMgUkJEIGlzIHNpbXBsZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLiBTb21lIHByYWN0aWNhbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgc2ltcGxlIGRlc2lnbiwgZm9yIGV4YW1wbGUsDQoNCiogV2UgY2Fubm90IGVzdGltYXRlIGludGVyYWN0aW9uIGJldHdlZW4gdHJlYXRtZW50cyBhbmQgYmxvY2tzIG9yIGhhdmUgYSBwdXJlIGVycm9yIGVzdGltYXRlIHdpdGhpbiBibG9ja3Mgc2luY2Ugb25seSBvbmUgZXhwZXJpbWVudGFsIHVuaXQgaXMgYXNzaWduZWQgaW4gdGhlIGNvbWJpbmF0aW9uIG9mIHRyZWF0bWVudCBhbmQgYmxvY2suDQoNCiogSW4gdGhlIG1vZGVsaW5nIHBoYXNlLCB3ZSBjYW5ub3QgYXNzZXNzIHRoZSBwb3RlbnRpYWwgaW50ZXJhY3RpdmUgZWZmZWN0LiBUaGF0IGlzLCB0aGUgZWZmZWN0IG9mIGEgdHJlYXRtZW50IGRlcGVuZHMgb24gdGhlIGJsb2NrIChvciB2aWNlIHZlcnNhKS4gIEZvciBleGFtcGxlLCBpZiAqKkYxKiogcGVyZm9ybXMgYmVzdCBpbiAqKkJsb2NrIDEqKiBidXQgd29yc3QgaW4gKipCbG9jayAyKiosIHRoZXJlIGlzIGxpa2VseSBhICoqdHJlYXRtZW50IMOXIGJsb2NrKiogaW50ZXJhY3Rpb24uDQoNCiogVGhlIFJhbmRvbWl6ZWQgQmxvY2sgRGVzaWduIChSQkQpIHJlcXVpcmVzIGhvbW9nZW5laXR5IChpLmUuLCBlcXVhbCB2YXJpYW5jZSkgKip3aXRoaW4gYmxvY2tzIGFuZCB0cmVhdG1lbnRzKiogaW4gb3JkZXIgdG8gYmUgZWZmZWN0aXZlLiBIb3dldmVyLCB0aGUgYmFzaWMgUkJEIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFzc2VzcyB0aGlzIGhvbW9nZW5laXR5IGJlY2F1c2UgdGhlcmUgaXMgb25seSBhICoqc2luZ2xlIGV4cGVyaW1lbnRhbCB1bml0KiogZm9yIGVhY2ggY29tYmluYXRpb24gb2YgYmxvY2sgYW5kIHRyZWF0bWVudC4NCg0KDQpUaGVyZSBhcmUgZGlmZmVyZW50IHdheXMgdG8gb3ZlcmNvbWUgdGhlIGFib3ZlIGxpbWl0YXRpb25zLiBPbmUgd2F5IGlzIHRvIG1vZGlmeSB0aGUgYmFzaWMgUkJEIHRvIGFsbG93IGFzc2lnbmluZyBtdWx0aXBsZSBleHBlcmltZW50YWwgdW5pdHMgdG8gZXZlcnkgY29tYmluYXRpb24gb2YgYmxvY2tzIGFuZCB0cmVhdG1lbnRzIC0gKipSZXBsaWNhdGVkIFJCRCoqLg0KDQoNCkEgUmVwbGljYXRlZCBSQkQgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBzdGFuZGFyZCBSYW5kb21pemVkIEJsb2NrIERlc2lnbiB3aGVyZSBlYWNoIHRyZWF0bWVudCBpcyBhcHBsaWVkIHRvIG11bHRpcGxlIGV4cGVyaW1lbnRhbCB1bml0cyB3aXRoaW4gZWFjaCBibG9jay4gVGhlIGJhc2ljIHN0cnVjdHVyZSBvZiByZXBsaWNhdGVkIFJCRCBpcyBjaGFyYWN0ZXJpemVkIGluIHRoZSBmb2xsb3dpbmcuDQoNCiogKipUcmVhdG1lbnRzIChhKSoqOiBEaWZmZXJlbnQgbGV2ZWxzIG9mIHRoZSBmYWN0b3IgYmVpbmcgdGVzdGVkIChlLmcuLCBmZXJ0aWxpemVycywgZHJ1Z3MpLg0KDQoqICoqQmxvY2tzIChiKSoqOiBHcm91cHMgb2YgaG9tb2dlbmVvdXMgZXhwZXJpbWVudGFsIHVuaXRzIChlLmcuLCBmaWVsZHMsIHBhdGllbnRzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MpLg0KDQoqICoqUmVwbGljYXRlcyAocCkqOiBOdW1iZXIgb2YgdGltZXMgZWFjaCB0cmVhdG1lbnQgaXMgcmVwZWF0ZWQgcGVyIGJsb2NrLg0KDQpUaGUgZ2VuZXJhbCBkYXRhIHRhYmxlIG9mIGEgcmVwbGljYXRlZCBSQkQgZGVzaWduIGlzIGRlcGljdGVkIGJ5DQoNCg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoPSI5MCUifQ0KaW5jbHVkZV9ncmFwaGljcygid2VlazA0L1JCRC1EYXRhTGF5b3V0LnBuZyIpDQpgYGANCg0KVGhlIGRhdGEgdGFibGUgY2VsbCBoYXMgdGhyZWUgaW5kaWNlcyB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IGJsb2NraW5nLCB0cmVhdG1lbnRzLCBhbmQgbWVhc3VyZW1lbnRzIG9mIHJlcGxpY2F0ZWQgcmVzcG9uc2UsIGFzIHNob3duIGJlbG93Lg0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9IjkwJSJ9DQppbmNsdWRlX2dyYXBoaWNzKCJ3ZWVrMDQvUmVwbGljYXRlZFJCRC1jZWxsLnBuZyIpDQpgYGANCg0KDQpUaGUgbmV4dCBZb3VUdWJlIHZpZGVvIGV4cGxhaW5zIHRoZSBSQkQgKHdpdGggbm8gcmVwbGljYXRlcykgdXNpbmcgYSBuaWNlIGV4YW1wbGUuIFlvdSBjYW4gc2tpcCB0aGUgYW5hbHlzaXMgcGFydCBub3cuIFRoZSB2aWRlbyBpcyBhdCAoPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9enFaOWl1azVOZ2smdD0xOTNzPikNCg0KDQpcDQoNCjxjZW50ZXI+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj16cVo5aXVrNU5nayZ0PTE5M3MiIHRhcmdldD0icG9wdXAiIA0KICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXpxWjlpdWs1TmdrJnQ9MTkzcycsDQogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCd3aWR0aD04NTAsaGVpZ2h0PTUwMCcpIj48aW1nIHNyYyA9ICJodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9NQVQxMjFXNS9pbWcvVmlkZW9JY29uLnBuZyIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMjAiPjwvYT4NCjwvY2VudGVyPg0KDQpcDQoNCg0KDQojIyMgQ29uY2x1ZGluZyBSZW1hcmtzIG9uIFJCRA0KDQpUaGUgUmFuZG9taXplZCBCbG9jayBEZXNpZ24gKFJCRCkgaXMgYSBmdW5kYW1lbnRhbCBleHBlcmltZW50YWwgYXBwcm9hY2ggdGhhdCBlbmhhbmNlcyBwcmVjaXNpb24gYnkgZ3JvdXBpbmcgc2ltaWxhciBleHBlcmltZW50YWwgdW5pdHMgaW50byBibG9ja3MgdG8gY29udHJvbCBmb3Iga25vd24gc291cmNlcyBvZiB2YXJpYWJpbGl0eS4gVGhlIGNob2ljZSBiZXR3ZWVuIFJCRCB3aXRob3V0IHJlcGxpY2F0aW9uIChvbmUgZXhwZXJpbWVudGFsIHVuaXQgcGVyIHRyZWF0bWVudCBwZXIgYmxvY2spIGFuZCBSQkQgd2l0aCByZXBsaWNhdGlvbiAobXVsdGlwbGUgdW5pdHMgcGVyIHRyZWF0bWVudCBwZXIgYmxvY2spIGRlcGVuZHMgb24gdGhlIHJlc2VhcmNoIG9iamVjdGl2ZXMsIHJlc291cmNlIGF2YWlsYWJpbGl0eSwgYW5kIHVuZGVybHlpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdHJlYXRtZW50LWJsb2NrIGludGVyYWN0aW9ucy4NCg0KUkJEIHdpdGhvdXQgcmVwbGljYXRpb24gaXMgYSBzaW1wbGUgeWV0IHBvd2VyZnVsIGRlc2lnbiB3aGVuIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRyZWF0bWVudHMgYW5kIGJsb2NrcyBhcmUgbmVnbGlnaWJsZS4gSXQgZWZmaWNpZW50bHkgcmVkdWNlcyBlcnJvciB2YXJpYW5jZSBieSBhY2NvdW50aW5nIGZvciBibG9jayBlZmZlY3RzIHdoaWxlIHJlcXVpcmluZyBmZXdlciBleHBlcmltZW50YWwgdW5pdHMuIEhvd2V2ZXIsIGl0cyBpbmFiaWxpdHkgdG8gdGVzdCBmb3IgaW50ZXJhY3Rpb25zIG1lYW5zIHRoYXQgYW55IGhpZGRlbiB0cmVhdG1lbnQtYmxvY2sgZGVwZW5kZW5jaWVzIG1heSBpbmZsYXRlIHRoZSBlcnJvciB0ZXJtLCBwb3RlbnRpYWxseSBtYXNraW5nIHRydWUgdHJlYXRtZW50IGVmZmVjdHMuIFRoaXMgZGVzaWduIGlzIGlkZWFsIGlmIHdlIGhhdmUgcHJpb3Iga25vd2xlZGdlIHN1Z2dlc3RpbmcgY29uc2lzdGVudCB0cmVhdG1lbnQgZWZmZWN0cyBhY3Jvc3MgYmxvY2tzLg0KDQpJbiBjb250cmFzdCwgUkJEIHdpdGggcmVwbGljYXRpb24gb2ZmZXJzIGdyZWF0ZXIgZmxleGliaWxpdHkgYW5kIHByZWNpc2lvbiBieSBhbGxvd2luZyByZXNlYXJjaGVycyB0byBkZXRlY3QgYW5kIHF1YW50aWZ5IHRyZWF0bWVudC1ibG9jayBpbnRlcmFjdGlvbnMuIFRoaXMgZGVzaWduIGFsc28gaGFzIGxpbWl0YXRpb25zLiBGb3IgZXhhbXBsZSwgdGhpcyBkZXNpZ24gY2Fubm90IGhhbmRsZSB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgZmVydGlsaXplciBwZXJmb3JtcyBkaWZmZXJlbnRseSBpbiBkaXN0aW5jdCBzb2lsIHR5cGVzLiBUaGUgYW5hbHlzaXMgb2YgcmVwbGljYXRlZCBSQkQgaXMgYWxzbyBtb3JlIGNvbXBsZXggdGhhbiB0aGUgYmFzaWMgUkJELg0KDQpVbHRpbWF0ZWx5LCB0aGUgZGVjaXNpb24gYmV0d2VlbiB0aGVzZSB0d28gYXBwcm9hY2hlcyBoaW5nZXMgb24gYmFsYW5jaW5nIHByYWN0aWNhbCBjb25zdHJhaW50cyB3aXRoIHNjaWVudGlmaWMgcmlnb3IuIFJCRCB3aXRob3V0IHJlcGxpY2F0aW9uIHByb3ZpZGVzIGFuIGVmZmljaWVudCBzb2x1dGlvbiBmb3Igc3RyYWlnaHRmb3J3YXJkIGNvbXBhcmlzb25zLCB3aGlsZSBSQkQgd2l0aCByZXBsaWNhdGlvbiBkZWxpdmVycyBkZWVwZXIgaW5zaWdodHMgd2hlbiBpbnRlcmFjdGlvbnMgYXJlIHBsYXVzaWJsZSBvciBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlcXVpcmVkLg0KDQoNCg0KDQoNCg==