Essential of Probability

Assignment ~ Week 10

Boma satrio (52250061)

Logo

Introduction

Probability is a field of mathematics that studies the likelihood of an event occurring. Understanding this concept is crucial as it forms the basis for data analysis, statistics, and decision-making under uncertainty.

This report is based on six videos that systematically discuss the flow of probability concepts. The first video introduces the sample space and events as the foundation for probability calculation. The second video explains the difference between independent and dependent events. The third video discusses the rules for the union and intersection of events. The fourth video reaffirms the basic probability rules. The fifth video introduces the binomial experiment and its formula, while the sixth video visualizes the binomial distribution for easier comprehension.

Overall, these six videos complement each other and provide a concise, comprehensive overview of fundamental concepts up to the initial applications of probability.


6.1 Fundamental Concept

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/ynjHKBCiGXY

This video explains the basic definitions in probability theory: sample space, event, and how to determine the probability of an event. It then introduces the basic rules of probability: every probability value is between 0 and 1; the total probability of all outcomes in the sample space equals 1.

✨ 1. Probability and Value

Probability (\(P(A)\)) is a measure of how likely an event is to occur.
Probability Value: The value of \(P(A)\) must always be in the range of 0 to 1.

\[0 \le P(A) \le 1\]

  • \(0\): The event is impossible.
  • \(1\): The event is certain to occur.

✨ 2. Sample Space (\(S\))

The sample space (\(S\)) is the set of all possible outcomes of an experiment.
- Event (\(A\)): An event is a single outcome or a collection of outcomes (a subset) of the sample space.
- Basic Formula: If every outcome is equally likely (fair), then:

\[ P(A) = \frac{\text{Number of outcomes in } A \text{ (favorable outcomes)}}{\text{Number of outcomes in sample space} \text{ (total possible outcomes)}}\]

✨ 3. Basic Probability Rules

All probability problems must satisfy these two essential conditions:
a. Probability Range: The probability of an event must always be between 0 and 1: \[0 \le P(A) \le 1\] b. Total Probability: The total probability of all outcomes in the sample space must always equal 1: \[P(S) = 1\] - Example: \(P(\text{Heads}) + P(\text{Tails}) = 0.5 + 0.5 = 1.0\).

✨ 4. Complement Rule

The Complement Rule is used to calculate the probability that an event does not occur.
- Complement (\(A^c\)): The complement of event \(A\) is the event that \(A\) does not occur.
- Rule: \[ P(A^c) = 1 - P(A)\] - This rule holds because \(A\) and \(A^c\) together cover the entire sample space (\(P(A) + P(A^c) = 1\)).

Logo click if Image does not appear

  • Usefulness: This rule is very useful when it is easier to calculate the probability of the opposite (complement) than to calculate the probability of the original event directly.

✨ 5. Example Application of the Complement Rule

Situation: Tossing two coins. Determine the probability of NOT getting two tails (\(A^c\)).
1. Calculate the probability of event \(A\) (getting two tails): \(P(TT) = 0.25\).
2. Use the Complement Rule: \[P(\text{Not } TT) = 1 - P(TT) = 1 - 0.25 = 0.75\] The probability of not getting two tails is \(0.75\) or \(75\%\).


6.2 Independent and Dependent

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/LS-_ihDKr2M

This video explains the difference between independent events and dependent events in probability. It also explains how to calculate the probability of two events occurring simultaneously (\(A\) and \(B\)), called the Intersection, the formula for which depends on whether the events are Independent or Dependent.

☀️ 1. Basic Definitions

# Load library
library(knitr)

# Membuat data frame
tabel_konsep <- data.frame(
  Concept = c("Event", "Intersection (A∩B)"),
  Brief_Explanation = c("An outcome or a collection of outcomes that can occur in a random experiment.", "The probability that event A and event B occur together.")
)

# Menampilkan tabel
kable(tabel_konsep, caption = "Basic Probability Concepts")
Basic Probability Concepts
Concept Brief_Explanation
Event An outcome or a collection of outcomes that can occur in a random experiment.
Intersection (A∩B) The probability that event A and event B occur together.

☀️ 2. Independent Events

Two events \(A\) and \(B\) are called independent if the occurrence of \(A\) does not affect the probability of \(B\) occurring.

Main Formula:
The probability of the intersection is calculated by multiplying the probabilities of the individual events. \[P(A \cap B) = P(A) \times P(B)\] Characteristics & Examples: - Constant Probability:The probability of the next event remains the same, as nothing changes in the sample space. - Sampling Type: Usually occurs with sampling with replacement. - Example: Tossing a coin twice, or drawing a marble and then replacing it before the second draw.

☀️ 3. Dependent Events

Two events \(A\) and \(B\) are called dependent if the occurrence of \(A\) changes the probability of \(B\) occurring.

Key Concept: Conditional Probability
For dependent events, we use the concept of Conditional Probability, symbolized as \(P(B \mid A)\).
- \(P(B \mid A)\) is the probability that event \(B\) occurs, given that event \(A\) has already occurred.

Main Formula:
The probability of the intersection is calculated by multiplying the probability of the first event by the probability of the second event after the first one has occurred. \[P(A \cap B) = P(A) \times P(B \mid A)\] Characteristics & Examples:
- Changing Probability: The probability of \(B\) changes because the composition of the sample space has changed after \(A\) occurred.
- Sampling Type: Usually occurs with sampling without replacement.
- Example: Drawing a card from a deck without replacing it, or drawing a marble and not replacing it.4. Example ApplicationSituation: A jar contains 4 Red and 6 Blue marbles (Total 10). You want to draw 2 Red marbles consecutively.

☀️ 4. Example Application

Situation: A jar contains 4 Red and 6 Blue marbles (Total 10). You want to draw 2 Red marbles consecutively.

library(knitr)

# Membuat data frame
tabel_kejadian <- data.frame(
  Event_Type = c("Independent", "Dependent"),
  Condition = c("Sampling with replacement", "Sampling without replacement"),
  Calculation = c(
    "$$P(R1 \\cap R2) = P(R1) \\times P(R2) = \\frac{4}{10} \\times \\frac{4}{10} = \\frac{16}{100} = 0.16$$",
    "$$P(R1 \\cap R2) = P(R1) \\times P(R2 \\mid R1) = \\frac{4}{10} \\times \\frac{3}{9} = \\frac{12}{90} \\approx 0.133$$"
  )
)

# Menampilkan tabel
kable(tabel_kejadian, caption = "Probability Calculation for Independent and Dependent Events", escape = FALSE)
Probability Calculation for Independent and Dependent Events
Event_Type Condition Calculation
Independent Sampling with replacement \[P(R1 \cap R2) = P(R1) \times P(R2) = \frac{4}{10} \times \frac{4}{10} = \frac{16}{100} = 0.16\]
Dependent Sampling without replacement \[P(R1 \cap R2) = P(R1) \times P(R2 \mid R1) = \frac{4}{10} \times \frac{3}{9} = \frac{12}{90} \approx 0.133\]

6.3 Union of Events

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/vqKAbhCqSTc

This video explains how to calculate the probability of “A or B” or “A and B” when dealing with two (or more) events. Key terms:

  • Union — means “A or B (or both)”. Written as: (A B)
  • Intersection — means “A and B occur together”. Written as: (A B)

Because there can be overlap (the area where two events occur simultaneously / intersection) between A and B, we must avoid double-counting the intersection when calculating the union probability.

🚀 1. Basic Definitions in Probability (Review)

  1. Sample Space (\(S\)):
  • The Sample Space is the set of all possible outcomes of a random experiment.
  • Example from the Video: Rolling two 6-sided dice; the total sample space is \(6 \times 6 = 36\) possible outcomes.
  1. Event:
  • An event is a subset of the sample space, which is a collection of outcomes that satisfy a specific condition.
  1. Intersection (\(A \cap B\)):
  • \(A \cap B\) is the set of outcomes included in both \(A\) and \(B\) — meaning both events occur simultaneously.
  • This is called the overlap area or duplicate outcomes.
  1. Union (\(A \cup B\)):
  • \(A \cup B\) is the probability that at least one of the events occurs (\(A\) or \(B\) occurs, or both).

Logo click if Image does not appear

🚀 2. Formula for Union Probability — General Addition Rule

We use this formula when the question contains the keyword “or”.
General Addition Rule: \[P(A \cup B) = P(A) + P(B) - P(A \cap B)\] - \(P(A \cup B)\): The probability that \(A\) or \(B\) occurs.
- \(P(A \cap B)\): The probability of the intersection (\(A\) and \(B\) occur simultaneously).

For Disjoint (Mutually Exclusive) Events:
If \(A\) and \(B\) are disjoint, their intersection probability is zero: \[P(A \cap B) = 0\] Thus, the formula simplifies to: \[P(A \cup B) = P(A) + P(B)\]

🚀 3. Why Must We Subtract the Intersection (\(P(A \cap B)\))?

  • Objective: The union formula requires the term \(- P(A \cap B)\) because we want to eliminate duplicate outcomes.
  • Visual Explanation: When you directly add \(P(A) + P(B)\), the outcomes in the intersection area (\(A \cap B\)) are counted twice.
  • To ensure every outcome in the sample space is counted exactly once, the intersection probability must be subtracted once.

🚀 4. Example Application

Using the example of rolling two dice:
- A: Event “Getting two even numbers” \(\rightarrow P(A) = \frac{9}{36}\)
- B: Event “Getting at least one 2” \(\rightarrow P(B) = \frac{11}{36}\)

Then:
- Intersection (\(A \cap B\)): Event “Getting two even numbers AND at least one 2”. \[ P(A \cap B) = \frac{5}{36} \quad \text{(taken from the sample space overlap)}\] - Union (\(A \cup B\)): Probability of getting \(A\) OR \(B\). \[\begin{aligned}P(A \cup B) &= P(A) + P(B) - P(A \cap B) \&= \frac{9}{36} + \frac{11}{36} - \frac{5}{36} \&= \frac{15}{36} \approx 0.4167\end{aligned}\] Meaning: the probability of getting “two even or at least one 2” is approximately 41.67%.

6.4 Exclusive and Exhaustive

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/f7agTv9nA5k

This video explains the difference and definitions of two types of events in probability theory:

  • Mutually Exclusive Events — two events that cannot occur simultaneously.
  • Exhaustive Events — a collection of events that covers all possible outcomes of an experiment.

⭐ 1. Exclusive Events (Mutually Exclusive)

Definition
Two events are said to be mutually exclusive if they cannot occur at the same time. This means no outcome appears in both events simultaneously.

Mathematically: \[A \cap B = \emptyset\] There is no “overlap”.

Example:
On a single die roll:

  • A = rolling an even number = {2,4,6}
  • B = rolling an odd number = {1,3,5}
  • A and B have no intersection → mutually exclusive.

Formula ConsequenceIf A and B are mutually exclusive: \[P(A \cup B) = P(A) + P(B)\] No need to subtract the overlap because there is no intersection.

Logo click if Image does not appear

⭐ 2. Exhaustive Events (Collectively Exhaustive / Comprehensive)D

efinition
Events are called exhaustive if together they cover the entire sample space. \[P(A \cup B) = S\] All possible outcomes are included in A or B or both.

Example
Die roll:

  • A = even number = {2,4,6}
  • B = odd number = {1,3,5}
  • Union of A and B = S = {1,2,3,4,5,6}

→ A & B are exhaustive. Note: They are both exhaustive and mutually exclusive.

Another example that is not mutually exclusive but is still exhaustive:

  • A = number > 3 → {4,5,6}
  • B = number \(\le\) 3 → {1,2,3}

The union = the entire sample space. There is no requirement to be mutually exclusive.

⭐3. Key Differences

Differences Between Mutually Exclusive and Exhaustive Events
Concept Mutually_Exclusive Exhaustive
Can A and B occur together? No Yes (overlap is allowed or not allowed)
Intersection A ∩ B Always empty Can be empty / can be non-empty
Union A ∪ B Not necessarily = S Must equal the entire sample space
Example Even vs Odd Even & Odd, or >3 ≤ 3

⭐ 4. Relationship Between the Two

  • Two events can be mutually exclusive + exhaustive (example: even vs. odd).
  • They can be exhaustive but not exclusive (example: A = \(\ge 3\), B = \(\le 4\)).
  • They can be exclusive but not exhaustive (example: A = 1, B = 6 on a die → they don’t cover the whole 1–6).

⭐ 5. Example ApplicationE

xample 1 (Mutually Exclusive)
Given:

  • A = rolling a 2
  • B = rolling a 5

Then: \[P(A \cup B) = P(A) + P(B) = \frac{1}{6} + \frac{1}{6} = \frac{2}{6}\]

Example 2 (Exhaustive)
Given:

  • A = rolling a number \(\le 3\)
  • B = rolling a number \(\ge 3\)

The union covers the entire sample space → exhaustiveness.

6.5 Binomial Experiment

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/nRuQAtajJYk

This video explains the basic concept of a Binomial Experiment and how to calculate probabilities using the Binomial Formula. The core concept of the binomial probability distribution is that it is a probability distribution for an experiment that is repeated multiple times and yields only two possible outcomes (as indicated by the prefix “bi-”), which are: Success or Failure.

🪐 1. Binomial Experiment

A Binomial Experiment is a type of statistical trial that satisfies four key characteristics:
- There is a fixed number of trials (\(n\)).
- Each trial has only two outcomes: success or failure.The probability of success (\(p\)) is constant for every trial.
- The trials are independent (they do not influence each other).

Case examples:Coin Toss:
- Calculating the probability of getting exactly one head (success) in three coin tosses. Since all 4 conditions are met (fixed number of trials \(n=3\), only two outcomes, constant probability \(p=0.5\), and independent trials), this is a binomial experiment.
- Marble Draw: Calculating the probability of getting exactly two green marbles (success) in five draws with replacement. Replacement ensures that the probability of success remains constant in every trial, thus satisfying the binomial condition.

🪐 2. Conditions for a Binomial Experiment

A trial is called binomial if it meets four conditions:

✔ Fixed number of trials
The number of trials \(n\) is predetermined.
✔ Two possible outcomes
Each trial yields only success or failure.
✔ Constant probability
The probability of success \(p\) is the same for every trial.
✔ Independent trials
One trial does not affect the others.

🪐 3. Important Notation in Binomial Distribution

  • \(n\) = number of trials
  • \(x\) = number of successes
  • \(p\) = probability of success
  • \(q = 1 - p\) = probability of failure
  • \(P(X = x)\) = probability of getting exactly \(x\) successes

🪐 4. Binomial Distribution Formula

The binomial probability formula: \[P(k) = {n \choose k} \cdot p^k \cdot (1-p)^{\,n-k}\] Where:
- \(P(k)\) : the probability of getting exactly \(k\) successes.
- \({n \choose k}\) : the combination, which is the number of ways to get \(k\) successes fromsukses dari \(n\) trials.
- \(n\) : total number of trials.
- \(k\) : desired number of successes.
- \(p\) : probability of success on a single trial.
- \((1-p)\) : probability of failure on a single trial.

🪐 5. Binomial Example Problem

Using the marble draw case to demonstrate the formula:
Case: If 5 marbles are drawn with replacement, what is the probability of getting exactly 2 green marbles?

\(n = 5\) (Trials)
\(k = 2\) (Successes)
\(p = 0.2\) (Probability of green, from \(\frac{2}{10}\))
\(1-p = 0.8\) (Probability of non-green)

Thus: \[P(k=2) = {5 \choose 2}(0.2)^2(1-0.2)^{5-2}\] \[P(k=2) = 10 \times (0.04) \times (0.8)^3\] \[P(k=2) = 10 \times 0.04 \times 0.512\] \[P(k=2) = 0.2048\] So, the probability is 0.2048.

##🪐 6. Why is it called “Binomial”?

The name Binomial comes from the fact that this distribution always has two possible outcomes in every trial, indicated by the prefix bi (meaning two).

6.6 Binomial Distribution

Explanatory Video

If the video does not appear, please click the YouTube link below:

https://youtu.be/Y2-vSWFmgyI

This video continues the discussion on the Binomial Distribution, focusing on how to visualize the data and understand its distributional properties, and visually explaining how the shape of the Binomial Distribution graph is influenced by changes in the number of trials ((n)) and the probability of success ((p)).

🌙 1. Formula and Basic Visualization

  • Objective: The Binomial Distribution is used to calculate the probability of getting a specific number of successes (\(k\)) from a fixed number of trials (\(n\)).
  • Example: Tossing a coin 2 times (\(n=2\)) with a probability of Head (\(p=0.5\)). The probabilities for getting 0, 1, or 2 Heads are calculated using the Binomial Formula.
  • Graph: These probabilities are visualized using a bar chart (histogram), where the X-axis is the number of successes (\(k\)) and the Y-axis is the probability (\(P(k)\)).

🌙 2. Important Parameters

Formulas for parameters to measure the Binomial Distribution:

# Load library for kable
library(knitr)

# Membuat data frame tabel
tabel_binomial <- data.frame(
  Parameter = c("Mean (μ)", "Variance (σ²)", "Standard Deviation (σ)"),
  Formula = c("μ = n · p",
            "σ² = n · p · (1 - p)",
            "σ = √(n · p · (1 - p))"),
  Description = c("The expected average number of successes.",
                 "A measure of the spread of the data from the mean.",
                 "The square root of the variance.")
)

# Menampilkan tabel
kable(tabel_binomial, caption = "Table of Binomial Distribution Parameters")
Table of Binomial Distribution Parameters
Parameter Formula Description
Mean (μ) μ = n · p The expected average number of successes.
Variance (σ²) σ² = n · p · (1 - p) A measure of the spread of the data from the mean.
Standard Deviation (σ) σ = √(n · p · (1 - p)) The square root of the variance.

🌙 3. Influence of Probability of Success (\(p\)) on Distribution Shape

The probability of success (\(p\)) controls the shape of the distribution curve. It determines whether the graph will be symmetrical or skewed:
✨ Shape of the Binomial Distribution ✨
Value_p Distribution_Shape Description
p = 0.5 (50%) Symmetrical Perfectly symmetrical distribution, its peak is in the middle, resembling the Normal Distribution.
p < 0.5 Skewed Right Low probability of success, so most outcomes pile up at small number of successes (near 0).
p > 0.5 Skewed Left High probability of success, so most outcomes pile up at large number of successes (near n).

Visualization of Probability (\(p\)) Influence:Logo click if Image does not appear

  1. Case \(p < 0.5\)
  • (Skewed Right)Visual: The graph on the left.
  • Observation: The histogram peak is near the value 0 (small number of successes). The tail of the curve extends to the right towards larger number of successes. This happens because the probability of failure (\(1-p\)) is greater than the probability of success (\(p\)), making the most likely outcome a large number of failures.
  1. Case \(p = 0.5\)
  • (Symmetrical)Visual: The graph in the center.
  • Observation: The histogram is perfectly symmetrical, resembling a bell shape. The peak is exactly in the middle (at \(\mu = n \cdot p\)). This happens because the probability of success and failure are equal (\(50\%\)), balancing the probability distribution.
  1. Case \(p > 0.5\)
  • (Skewed Left)Visual: The graph on the right.
  • Observation: The histogram peak shifts to the right, piling up near the value \(n\) (large number of successes). The tail of the curve extends to the left towards the value 0. This happens because the probability of success (\(p\)) is greater than the probability of failure, making the most likely outcome a high number of successes.

🌙 4. Normal Approximation to Binomial

As the value of the number of trials (\(n\)) increases, the shape of the Binomial Distribution becomes increasingly similar to the bell curve of the Normal Distribution.
- Approximation Condition: Normal Approximation to Binomial can be used (to simplify calculations) if both of the following conditions are met:
1. \[n \cdot p \ge 10\] 2. \[n \cdot (1-p) \ge 10\]

Visualization of Number of Trials (\(n\)) Influence: Logo Click if Image does not appear

  1. Small \(n\) (e.g., \(n=5, p=0.5\))
  • Representation: The first graph at the top.
  • Observation: The histogram (blue bars) looks discrete and the difference in height between bars is significant. The Normal curve (red line) looks very wide and is not suitable for modeling this Binomial histogram.
  • Validity: \(n \cdot p = 5 \cdot 0.5 = 2.5\). Since \(2.5 < 10\), the approximation is invalid.
  1. Medium \(n\) (e.g., \(n=20, p=0.5\))
  • Representation: The middle graph.
  • Observation: The histogram is starting to become symmetrical and shows a bell shape. The Normal curve is starting to encompass the histogram bars better.
  • Validity: \(n \cdot p = 20 \cdot 0.5 = 10\). Since \(10 \ge 10\), the approximation condition is beginning to be met. This approximation can start to be used, although accuracy may need improvement (usually requiring continuity correction).
  1. Large \(n\) (e.g., \(n=50, p=0.5\))
  • Representation: The bottom graph.
  • Observation: The histogram becomes very dense and smooth. The midpoint of each histogram bar almost falls perfectly on top of the Normal Distribution bell curve.
  • Validity: \(n \cdot p = 50 \cdot 0.5 = 25\). Since \(25 \ge 10\), the approximation is highly valid and yields very accurate results. This is the perfect visualization of the Normal Approximation to Binomial.

Conclusion

The material in these six videos is the backbone that strengthens our understanding of uncertainty. In Data Science, everything is based on probability. By mastering Probability and the Binomial Distribution, we have the mathematical logic foundation to build, test, and trust all prediction models and conclusions we make.

📋 1. Summary of 6 Key Topics

  1. Fundamental Concepts
    Introduction to the basics of probability (sample space, events, chance/likelihood).
  2. Independent & Dependent Events
    Understanding whether the outcome of one event affects the probability of another.
  3. Union of Events
    Rules for calculating the probability of one or more events occurring (\(P(A \text{ or } B)\)).
  4. Exclusive & Exhaustive Events
    Classification of relationships between events. For example, mutually exclusive events mean both cannot occur simultaneously.
  5. Binomial Experiment
    Defining the conditions for a trial to have its probability calculated using the Binomial formula (e.g., only two outcomes: success/failure, and trials are repeated independently).
  6. Binomial Distribution
    Application tool for calculating the probability of obtaining a specific number of successes in a fixed number of trials that satisfy the Binomial conditions.

📋 2. Interconnection (Logical Progression)

The interrelation among these six videos is a progression from the most basic rules to the use of a specific model tool:

  1. Logical Foundation (V1-V4)
    Videos 1 to 4 form the philosophical and mathematical basis of probability. We must understand what probability is, how events influence each other (V2 - Independent and Dependent), and how to calculate the probability of a union (V3 - Union) before we can go further. The concepts in V4 (Exclusive and Exhaustive) help us classify the relationship between these events.
  2. Moving Towards Application (V5)
    The concepts from V1-V4 are used to establish the conditions of a trial. Video 5 (Binomial Experiment) teaches us how to identify real-world situations that satisfy all those basic probability rules (e.g., the outcome of each coin toss is independent, consistent with V2). This is the stage of determining whether the Binomial model can be used.
  3. Using the Tool (V6)
    Once we are confident that the situation meets the conditions (V5), we then use the Binomial Distribution (V6) to calculate specific probabilities (e.g., what is the probability of getting 7 successes out of 10 trials). This calculation depends on the validity of the conditions learned in V1-V5.(Basic Probability Rules (V1-V4) validate the Trial Conditions (V5), which then allows us to use the Model (V6) for prediction.)

📋3. Impact of This Material on Statistics Learning in Data Science

A deep understanding of Probability Theory, especially the Binomial Distribution, is crucial because it is the foundation for Statistical Inference and Binary Data Modeling (success/failure outcomes) in Data Science.
✨ Positive Impact of the Binomial Distribution ✨
Positive_Impact Easy_Explanation
Understanding A/B Testing The Binomial Distribution is the primary tool in A/B Testing…
Foundation for Classification Models Many Data Science problems are binary classification…
Validation and P-Value This concept is closely related to hypothesis testing and p-value…
Basis for Sampling Independent and Dependent concepts are crucial for valid samples…

References

LS0tDQp0aXRsZTogIkVzc2VudGlhbCBvZiBQcm9iYWJpbGl0eSINCnN1YnRpdGxlOiAiQXNzaWdubWVudCB+IFdlZWsgMTAiDQphdXRob3I6ICJCb21hIFNhdHJpbyAtICg1MjI1MDA2MSkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBsaWJfZGlyOiAibGlicyINCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KLS0tDQo8ZGl2IGNsYXNzPSJtYWluLWNvbnRhaW5lciI+DQoNCiAgPGRpdiBjbGFzcz0iY2hpbGRpc2gtYm94Ij4NCiAgQm9tYSBzYXRyaW8NCiAgKDUyMjUwMDYxKQ0KDQogIDxpbWcgaWQ9IkZvdG8iIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JvbWFzczExMTYvaGVoZS9tYWluL2JvbWEuanBnIg0KICAgICAgIGFsdD0iTG9nbyINCiAgICAgICBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDE1cHggYXV0bzsgYm9yZGVyLXJhZGl1czogMTJweDsiPg0KPC9kaXY+DQoNCjwvZGl2Pg0KDQojIEludHJvZHVjdGlvbg0KDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYm94Ij4NCiAgPGRpdiBjbGFzcz0icGFzdGVsLXRpdGxlIj48L2Rpdj4NCiAgPHA+UHJvYmFiaWxpdHkgaXMgYSBmaWVsZCBvZiBtYXRoZW1hdGljcyB0aGF0IHN0dWRpZXMgdGhlIGxpa2VsaWhvb2Qgb2YgYW4gZXZlbnQgb2NjdXJyaW5nLiBVbmRlcnN0YW5kaW5nIHRoaXMgY29uY2VwdCBpcyBjcnVjaWFsIGFzIGl0IGZvcm1zIHRoZSBiYXNpcyBmb3IgZGF0YSBhbmFseXNpcywgc3RhdGlzdGljcywgYW5kIGRlY2lzaW9uLW1ha2luZyB1bmRlciB1bmNlcnRhaW50eS4NCg0KVGhpcyByZXBvcnQgaXMgYmFzZWQgb24gc2l4IHZpZGVvcyB0aGF0IHN5c3RlbWF0aWNhbGx5IGRpc2N1c3MgdGhlIGZsb3cgb2YgcHJvYmFiaWxpdHkgY29uY2VwdHMuIFRoZSBmaXJzdCB2aWRlbyBpbnRyb2R1Y2VzIHRoZSAqKnNhbXBsZSBzcGFjZSoqIGFuZCAqKmV2ZW50cyoqIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBwcm9iYWJpbGl0eSBjYWxjdWxhdGlvbi4gVGhlIHNlY29uZCB2aWRlbyBleHBsYWlucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICoqaW5kZXBlbmRlbnQqKiBhbmQgKipkZXBlbmRlbnQqKiBldmVudHMuIFRoZSB0aGlyZCB2aWRlbyBkaXNjdXNzZXMgdGhlIHJ1bGVzIGZvciB0aGUgKip1bmlvbioqIGFuZCAqKmludGVyc2VjdGlvbioqIG9mIGV2ZW50cy4gVGhlIGZvdXJ0aCB2aWRlbyByZWFmZmlybXMgdGhlIGJhc2ljIHByb2JhYmlsaXR5IHJ1bGVzLiBUaGUgZmlmdGggdmlkZW8gaW50cm9kdWNlcyB0aGUgKipiaW5vbWlhbCBleHBlcmltZW50KiogYW5kIGl0cyBmb3JtdWxhLCB3aGlsZSB0aGUgc2l4dGggdmlkZW8gdmlzdWFsaXplcyB0aGUgKipiaW5vbWlhbCBkaXN0cmlidXRpb24qKiBmb3IgZWFzaWVyIGNvbXByZWhlbnNpb24uDQoNCk92ZXJhbGwsIHRoZXNlIHNpeCB2aWRlb3MgY29tcGxlbWVudCBlYWNoIG90aGVyIGFuZCBwcm92aWRlIGEgY29uY2lzZSwgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiBmdW5kYW1lbnRhbCBjb25jZXB0cyB1cCB0byB0aGUgaW5pdGlhbCBhcHBsaWNhdGlvbnMgb2YgcHJvYmFiaWxpdHkuPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQotLS0NCg0KIyA2LjEgRnVuZGFtZW50YWwgQ29uY2VwdA0KDQo8aDI+PGk+RXhwbGFuYXRvcnkgVmlkZW88L2k+PC9oMj4NCg0KPGRpdiBjbGFzcz0ibWFpbi1jb250YWluZXIiPg0KDQogIDxjZW50ZXI+DQogICAgPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3luakhLQkNpR1hZIiANCiAgICAgICAgICAgIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiANCiAgICAgICAgICAgIHN0eWxlPSJib3JkZXI6MDsgYm9yZGVyLXJhZGl1czoxMnB4OyI+DQogICAgPC9pZnJhbWU+DQogIDwvY2VudGVyPg0KDQogIDxoMz5JZiB0aGUgdmlkZW8gZG9lcyBub3QgYXBwZWFyLCBwbGVhc2UgY2xpY2sgdGhlIFlvdVR1YmUgbGluayBiZWxvdzo8L2gzPg0KICA8cD48YSBocmVmPSJodHRwczovL3lvdXR1LmJlL3luakhLQkNpR1hZIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly95b3V0dS5iZS95bmpIS0JDaUdYWTwvYT48L3A+DQoNCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYm94Ij4NCiAgPGRpdiBjbGFzcz0icGFzdGVsLXRpdGxlIj48L2Rpdj4NCiAgPHA+DQpUaGlzIHZpZGVvIGV4cGxhaW5zIHRoZSBiYXNpYyBkZWZpbml0aW9ucyBpbiBwcm9iYWJpbGl0eSB0aGVvcnk6ICoqc2FtcGxlIHNwYWNlKiosICoqZXZlbnQqKiwgYW5kIGhvdyB0byBkZXRlcm1pbmUgdGhlIHByb2JhYmlsaXR5IG9mIGFuIGV2ZW50LiBJdCB0aGVuIGludHJvZHVjZXMgdGhlIGJhc2ljIHJ1bGVzIG9mIHByb2JhYmlsaXR5OiBldmVyeSBwcm9iYWJpbGl0eSB2YWx1ZSBpcyBiZXR3ZWVuIDAgYW5kIDE7IHRoZSB0b3RhbCBwcm9iYWJpbGl0eSBvZiBhbGwgb3V0Y29tZXMgaW4gdGhlIHNhbXBsZSBzcGFjZSBlcXVhbHMgMS4NCjwvcD4NCiAgPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyBmb250LXNpemU6MS40ZW07IGZvbnQtd2VpZ2h0OmJvbGQ7Ij48L3A+DQo8L2Rpdj4NCg0KIyMg4pyoIDEuIFByb2JhYmlsaXR5IGFuZCBWYWx1ZQ0KDQpQcm9iYWJpbGl0eSAoJFAoQSkkKSBpcyBhIG1lYXN1cmUgb2YgaG93IGxpa2VseSBhbiBldmVudCBpcyB0byBvY2N1ci4gPGJyPg0KUHJvYmFiaWxpdHkgVmFsdWU6IFRoZSB2YWx1ZSBvZiAkUChBKSQgbXVzdCBhbHdheXMgYmUgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMS4NCg0KJCQwIFxsZSBQKEEpIFxsZSAxJCQNCg0KLSAkMCQ6IFRoZSBldmVudCBpcyBpbXBvc3NpYmxlLjxicj4NCi0gJDEkOiBUaGUgZXZlbnQgaXMgY2VydGFpbiB0byBvY2N1ci4NCg0KIyMg4pyoIDIuIFNhbXBsZSBTcGFjZSAoJFMkKQ0KDQpUaGUgKipzYW1wbGUgc3BhY2UqKiAoJFMkKSBpcyB0aGUgc2V0IG9mIGFsbCBwb3NzaWJsZSBvdXRjb21lcyBvZiBhbiBleHBlcmltZW50Ljxicj4NCi0gKipFdmVudCoqICgkQSQpOiBBbiBldmVudCBpcyBhIHNpbmdsZSBvdXRjb21lIG9yIGEgY29sbGVjdGlvbiBvZiBvdXRjb21lcyAoYSBzdWJzZXQpIG9mIHRoZSBzYW1wbGUgc3BhY2UuPGJyPg0KLSBCYXNpYyBGb3JtdWxhOiBJZiBldmVyeSBvdXRjb21lIGlzIGVxdWFsbHkgbGlrZWx5IChmYWlyKSwgdGhlbjoNCg0KJCQgUChBKSA9IFxmcmFje1x0ZXh0e051bWJlciBvZiBvdXRjb21lcyBpbiB9IEEgXHRleHR7IChmYXZvcmFibGUgb3V0Y29tZXMpfX17XHRleHR7TnVtYmVyIG9mIG91dGNvbWVzIGluIHNhbXBsZSBzcGFjZX0gXHRleHR7ICh0b3RhbCBwb3NzaWJsZSBvdXRjb21lcyl9fSQkDQoNCi0gRXhhbXBsZSAoVG9zc2luZyAyIENvaW5zKTogU2FtcGxlIHNwYWNlOiBISCwgSFQsIFRILCBUVCAoVG90YWwgNCBvdXRjb21lcykuDQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ib21hc3MxMTE2L2NvbnRvaC9tYWluL2xpY2Vuc2VkLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCltDbGljayBpZiBJbWFnZSBkb2VzIG5vdCBhcHBlYXJdKGh0dHBzOi8vMWRydi5tcy9pL2MvMWFkMWY1M2JmOGFjYThkZS9FVks5dmYyVUxKaEdxUVV5U3h6WjVKSUJmY1l1S00xcHAtVF9IeDZfOUU1MXZnP2U9clNtSDFRKXsgd2lkdGg9NTAlIH0NCg0KIyMg4pyoIDMuIEJhc2ljIFByb2JhYmlsaXR5IFJ1bGVzDQoNCkFsbCBwcm9iYWJpbGl0eSBwcm9ibGVtcyBtdXN0IHNhdGlzZnkgdGhlc2UgdHdvIGVzc2VudGlhbCBjb25kaXRpb25zOjxicj4NCmEuIFByb2JhYmlsaXR5IFJhbmdlOiBUaGUgcHJvYmFiaWxpdHkgb2YgYW4gZXZlbnQgbXVzdCBhbHdheXMgYmUgYmV0d2VlbiAwIGFuZCAxOg0KJCQwIFxsZSBQKEEpIFxsZSAxJCQNCmIuIFRvdGFsIFByb2JhYmlsaXR5OiBUaGUgdG90YWwgcHJvYmFiaWxpdHkgb2YgYWxsIG91dGNvbWVzIGluIHRoZSBzYW1wbGUgc3BhY2UgbXVzdCBhbHdheXMgZXF1YWwgMToNCiQkUChTKSA9IDEkJA0KLSBFeGFtcGxlOiAkUChcdGV4dHtIZWFkc30pICsgUChcdGV4dHtUYWlsc30pID0gMC41ICsgMC41ID0gMS4wJC4NCg0KIyMg4pyoIDQuIENvbXBsZW1lbnQgUnVsZQ0KDQpUaGUgKipDb21wbGVtZW50IFJ1bGUqKiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhbiBldmVudCAqZG9lcyBub3QqIG9jY3VyLjxicj4NCi0gKipDb21wbGVtZW50KiogKCRBXmMkKTogVGhlIGNvbXBsZW1lbnQgb2YgZXZlbnQgJEEkIGlzIHRoZSBldmVudCB0aGF0ICRBJCBkb2VzIG5vdCBvY2N1ci48YnI+DQotIFJ1bGU6DQokJCBQKEFeYykgPSAxIC0gUChBKSQkDQotIFRoaXMgcnVsZSBob2xkcyBiZWNhdXNlICRBJCBhbmQgJEFeYyQgdG9nZXRoZXIgY292ZXIgdGhlIGVudGlyZSBzYW1wbGUgc3BhY2UgKCRQKEEpICsgUChBXmMpID0gMSQpLg0KDQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ib21hc3MxMTE2LzJrYWxpL21haW4vbGljZW5zZWQtLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCltjbGljayBpZiBJbWFnZSBkb2VzIG5vdCBhcHBlYXJdKGh0dHBzOi8vMWRydi5tcy9pL2MvMWFkMWY1M2JmOGFjYThkZS9FYjhXb1VJZ0JPNUduM1M1Rm9BTkx5TUJ0M0N4a3pYUWNBblhtV0pld2lkc1ZRP2U9ZUJwRXR2KXsgd2lkdGg9NTAlIH0NCg0KLSBVc2VmdWxuZXNzOiBUaGlzIHJ1bGUgaXMgdmVyeSB1c2VmdWwgd2hlbiBpdCBpcyBlYXNpZXIgdG8gY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgb3Bwb3NpdGUgKGNvbXBsZW1lbnQpIHRoYW4gdG8gY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgZGlyZWN0bHkuDQoNCiMjIOKcqCA1LiBFeGFtcGxlIEFwcGxpY2F0aW9uIG9mIHRoZSBDb21wbGVtZW50IFJ1bGUNCg0KU2l0dWF0aW9uOiBUb3NzaW5nIHR3byBjb2lucy4gRGV0ZXJtaW5lIHRoZSBwcm9iYWJpbGl0eSBvZiAqKk5PVCoqIGdldHRpbmcgdHdvIHRhaWxzICgkQV5jJCkuPGJyPg0KMS4gQ2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBldmVudCAkQSQgKGdldHRpbmcgdHdvIHRhaWxzKTogJFAoVFQpID0gMC4yNSQuPGJyPg0KMi4gVXNlIHRoZSBDb21wbGVtZW50IFJ1bGU6DQokJFAoXHRleHR7Tm90IH0gVFQpID0gMSAtIFAoVFQpID0gMSAtIDAuMjUgPSAwLjc1JCQNClRoZSBwcm9iYWJpbGl0eSBvZiBub3QgZ2V0dGluZyB0d28gdGFpbHMgaXMgJDAuNzUkIG9yICQ3NVwlJC4NCg0KLS0tDQoNCiMgNi4yIEluZGVwZW5kZW50IGFuZCBEZXBlbmRlbnQNCg0KPGgyPjxpPkV4cGxhbmF0b3J5IFZpZGVvPC9pPjwvaDI+DQoNCjxkaXYgY2xhc3M9Im1haW4tY29udGFpbmVyIj4NCg0KICA8Y2VudGVyPg0KICAgIDxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9MUy1faWhES3IyTSIgDQogICAgICAgICAgICB3aWR0aD0iNzY4IiBoZWlnaHQ9IjQwMCIgZGF0YS1leHRlcm5hbD0iMSIgDQogICAgICAgICAgICBzdHlsZT0iYm9yZGVyOjA7IGJvcmRlci1yYWRpdXM6MTJweDsiPg0KICAgIDwvaWZyYW1lPg0KICA8L2NlbnRlcj4NCg0KICA8aDM+SWYgdGhlIHZpZGVvIGRvZXMgbm90IGFwcGVhciwgcGxlYXNlIGNsaWNrIHRoZSBZb3VUdWJlIGxpbmsgYmVsb3c6PC9oMz4NCiAgPHA+PGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9MUy1faWhES3IyTSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8veW91dHUuYmUvTFMtX2loREtyMk08L2E+PC9wPg0KDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icGFzdGVsLWJveCI+DQogIDxkaXYgY2xhc3M9InBhc3RlbC10aXRsZSI+PC9kaXY+DQogIDxwPg0KVGhpcyB2aWRlbyBleHBsYWlucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICoqaW5kZXBlbmRlbnQgZXZlbnRzKiogYW5kICoqZGVwZW5kZW50IGV2ZW50cyoqIGluIHByb2JhYmlsaXR5LiBJdCBhbHNvIGV4cGxhaW5zIGhvdyB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIHR3byBldmVudHMgb2NjdXJyaW5nIHNpbXVsdGFuZW91c2x5ICgkQSQgYW5kICRCJCksIGNhbGxlZCB0aGUgKipJbnRlcnNlY3Rpb24qKiwgdGhlIGZvcm11bGEgZm9yIHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciB0aGUgZXZlbnRzIGFyZSBJbmRlcGVuZGVudCBvciBEZXBlbmRlbnQuDQo8L3A+DQogIDxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjEuNGVtOyBmb250LXdlaWdodDpib2xkOyI+PC9wPg0KPC9kaXY+DQoNCg0KIyMg4piA77iPIDEuIEJhc2ljIERlZmluaXRpb25zDQpgYGB7ciwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFfQ0KIyBMb2FkIGxpYnJhcnkNCmxpYnJhcnkoa25pdHIpDQoNCiMgTWVtYnVhdCBkYXRhIGZyYW1lDQp0YWJlbF9rb25zZXAgPC0gZGF0YS5mcmFtZSgNCiAgQ29uY2VwdCA9IGMoIkV2ZW50IiwgIkludGVyc2VjdGlvbiAoQeKIqUIpIiksDQogIEJyaWVmX0V4cGxhbmF0aW9uID0gYygiQW4gb3V0Y29tZSBvciBhIGNvbGxlY3Rpb24gb2Ygb3V0Y29tZXMgdGhhdCBjYW4gb2NjdXIgaW4gYSByYW5kb20gZXhwZXJpbWVudC4iLCAiVGhlIHByb2JhYmlsaXR5IHRoYXQgZXZlbnQgQSBhbmQgZXZlbnQgQiBvY2N1ciB0b2dldGhlci4iKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQprYWJsZSh0YWJlbF9rb25zZXAsIGNhcHRpb24gPSAiQmFzaWMgUHJvYmFiaWxpdHkgQ29uY2VwdHMiKQ0KYGBgDQoNCiMjIOKYgO+4jyAyLiBJbmRlcGVuZGVudCBFdmVudHMNCg0KVHdvIGV2ZW50cyAkQSQgYW5kICRCJCBhcmUgY2FsbGVkIGluZGVwZW5kZW50IGlmIHRoZSBvY2N1cnJlbmNlIG9mICRBJCBkb2VzIG5vdCBhZmZlY3QgdGhlIHByb2JhYmlsaXR5IG9mICRCJCBvY2N1cnJpbmcuDQoNCk1haW4gRm9ybXVsYTo8YnI+DQpUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIGludGVyc2VjdGlvbiBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBwcm9iYWJpbGl0aWVzIG9mIHRoZSBpbmRpdmlkdWFsIGV2ZW50cy4NCiQkUChBIFxjYXAgQikgPSBQKEEpIFx0aW1lcyBQKEIpJCQNCkNoYXJhY3RlcmlzdGljcyAmIEV4YW1wbGVzOg0KLSBDb25zdGFudCBQcm9iYWJpbGl0eTpUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIG5leHQgZXZlbnQgcmVtYWlucyB0aGUgc2FtZSwgYXMgbm90aGluZyBjaGFuZ2VzIGluIHRoZSBzYW1wbGUgc3BhY2UuDQotIFNhbXBsaW5nIFR5cGU6IFVzdWFsbHkgb2NjdXJzIHdpdGggc2FtcGxpbmcgd2l0aCByZXBsYWNlbWVudC4NCi0gRXhhbXBsZTogVG9zc2luZyBhIGNvaW4gdHdpY2UsIG9yIGRyYXdpbmcgYSBtYXJibGUgYW5kIHRoZW4gcmVwbGFjaW5nIGl0IGJlZm9yZSB0aGUgc2Vjb25kIGRyYXcuDQoNCiMjIOKYgO+4jyAzLiBEZXBlbmRlbnQgRXZlbnRzDQoNClR3byBldmVudHMgJEEkIGFuZCAkQiQgYXJlIGNhbGxlZCBkZXBlbmRlbnQgaWYgdGhlIG9jY3VycmVuY2Ugb2YgJEEkIGNoYW5nZXMgdGhlIHByb2JhYmlsaXR5IG9mICRCJCBvY2N1cnJpbmcuDQoNCktleSBDb25jZXB0OiBDb25kaXRpb25hbCBQcm9iYWJpbGl0eTxicj4NCkZvciBkZXBlbmRlbnQgZXZlbnRzLCB3ZSB1c2UgdGhlIGNvbmNlcHQgb2YgQ29uZGl0aW9uYWwgUHJvYmFiaWxpdHksIHN5bWJvbGl6ZWQgYXMgJFAoQiBcbWlkIEEpJC48YnI+DQotICRQKEIgXG1pZCBBKSQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgZXZlbnQgJEIkIG9jY3VycywgZ2l2ZW4gdGhhdCBldmVudCAkQSQgaGFzIGFscmVhZHkgb2NjdXJyZWQuDQoNCk1haW4gRm9ybXVsYTo8YnI+DQpUaGUgcHJvYmFiaWxpdHkgb2YgdGhlIGludGVyc2VjdGlvbiBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgZmlyc3QgZXZlbnQgYnkgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSBzZWNvbmQgZXZlbnQgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBoYXMgb2NjdXJyZWQuDQokJFAoQSBcY2FwIEIpID0gUChBKSBcdGltZXMgUChCIFxtaWQgQSkkJA0KQ2hhcmFjdGVyaXN0aWNzICYgRXhhbXBsZXM6PGJyPg0KLSBDaGFuZ2luZyBQcm9iYWJpbGl0eTogVGhlIHByb2JhYmlsaXR5IG9mICRCJCBjaGFuZ2VzIGJlY2F1c2UgdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSBzYW1wbGUgc3BhY2UgaGFzIGNoYW5nZWQgYWZ0ZXIgJEEkIG9jY3VycmVkLjxicj4NCi0gU2FtcGxpbmcgVHlwZTogVXN1YWxseSBvY2N1cnMgd2l0aCBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50Ljxicj4NCi0gRXhhbXBsZTogRHJhd2luZyBhIGNhcmQgZnJvbSBhIGRlY2sgd2l0aG91dCByZXBsYWNpbmcgaXQsIG9yIGRyYXdpbmcgYSBtYXJibGUgYW5kIG5vdCByZXBsYWNpbmcgaXQuNC4gRXhhbXBsZSBBcHBsaWNhdGlvblNpdHVhdGlvbjogQSBqYXIgY29udGFpbnMgNCBSZWQgYW5kIDYgQmx1ZSBtYXJibGVzIChUb3RhbCAxMCkuIFlvdSB3YW50IHRvIGRyYXcgMiBSZWQgbWFyYmxlcyBjb25zZWN1dGl2ZWx5Lg0KDQojIyDimIDvuI8gNC4gRXhhbXBsZSBBcHBsaWNhdGlvbg0KDQpTaXR1YXRpb246IEEgamFyIGNvbnRhaW5zIDQgUmVkIGFuZCA2IEJsdWUgbWFyYmxlcyAoVG90YWwgMTApLiBZb3Ugd2FudCB0byBkcmF3IDIgUmVkIG1hcmJsZXMgY29uc2VjdXRpdmVseS4NCg0KYGBge3IsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQoNCiMgTWVtYnVhdCBkYXRhIGZyYW1lDQp0YWJlbF9rZWphZGlhbiA8LSBkYXRhLmZyYW1lKA0KICBFdmVudF9UeXBlID0gYygiSW5kZXBlbmRlbnQiLCAiRGVwZW5kZW50IiksDQogIENvbmRpdGlvbiA9IGMoIlNhbXBsaW5nIHdpdGggcmVwbGFjZW1lbnQiLCAiU2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudCIpLA0KICBDYWxjdWxhdGlvbiA9IGMoDQogICAgIiQkUChSMSBcXGNhcCBSMikgPSBQKFIxKSBcXHRpbWVzIFAoUjIpID0gXFxmcmFjezR9ezEwfSBcXHRpbWVzIFxcZnJhY3s0fXsxMH0gPSBcXGZyYWN7MTZ9ezEwMH0gPSAwLjE2JCQiLA0KICAgICIkJFAoUjEgXFxjYXAgUjIpID0gUChSMSkgXFx0aW1lcyBQKFIyIFxcbWlkIFIxKSA9IFxcZnJhY3s0fXsxMH0gXFx0aW1lcyBcXGZyYWN7M317OX0gPSBcXGZyYWN7MTJ9ezkwfSBcXGFwcHJveCAwLjEzMyQkIg0KICApDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwNCmthYmxlKHRhYmVsX2tlamFkaWFuLCBjYXB0aW9uID0gIlByb2JhYmlsaXR5IENhbGN1bGF0aW9uIGZvciBJbmRlcGVuZGVudCBhbmQgRGVwZW5kZW50IEV2ZW50cyIsIGVzY2FwZSA9IEZBTFNFKQ0KYGBgDQoNCiMgNi4zIFVuaW9uIG9mIEV2ZW50cw0KDQo8aDI+PGk+RXhwbGFuYXRvcnkgVmlkZW88L2k+PC9oMj4NCg0KPGRpdiBjbGFzcz0ibWFpbi1jb250YWluZXIiPg0KDQo8Y2VudGVyPiANCiA8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvdnFLQWJoQ3FTVGMiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBzdHlsZT0iYm9yZGVyOjA7IGJvcmRlci1yYWRpdXM6MTJweDsiPiANCiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQo8aDM+SWYgdGhlIHZpZGVvIGRvZXMgbm90IGFwcGVhciwgcGxlYXNlIGNsaWNrIHRoZSBZb3VUdWJlIGxpbmsgYmVsb3c6PC9oMz4gPHA+PGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS92cUtBYmhDcVNUYyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8veW91dHUuYmUvdnFLQWJoQ3FTVGM8L2E+PC9wPg0KDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icGFzdGVsLWJveCI+DQogIDxkaXYgY2xhc3M9InBhc3RlbC10aXRsZSI+PC9kaXY+DQogIDxwPiANClRoaXMgdmlkZW8gZXhwbGFpbnMgaG93IHRvIGNhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgb2YgIkEgb3IgQiIgb3IgIkEgYW5kIEIiIHdoZW4gZGVhbGluZyB3aXRoIHR3byAob3IgbW9yZSkgZXZlbnRzLiBLZXkgdGVybXM6DQo8L3A+DQoNCjx1bD4gDQo8bGk+PHN0cm9uZz5Vbmlvbjwvc3Ryb25nPiDigJQgbWVhbnMgIkEgb3IgQiAob3IgYm90aCkiLiBXcml0dGVuIGFzOiAoQSBcY3VwIEIpPC9saT4gPGxpPjxzdHJvbmc+SW50ZXJzZWN0aW9uPC9zdHJvbmc+IOKAlCBtZWFucyAiQSBhbmQgQiBvY2N1ciB0b2dldGhlciIuIFdyaXR0ZW4gYXM6IChBIFxjYXAgQik8L2xpPiANCjwvdWw+DQoNCiAgPHA+IA0KQmVjYXVzZSB0aGVyZSBjYW4gYmUgb3ZlcmxhcCAodGhlIGFyZWEgd2hlcmUgdHdvIGV2ZW50cyBvY2N1ciBzaW11bHRhbmVvdXNseSAvIGludGVyc2VjdGlvbikgYmV0d2VlbiBBIGFuZCBCLCB3ZSBtdXN0IGF2b2lkIGRvdWJsZS1jb3VudGluZyB0aGUgaW50ZXJzZWN0aW9uIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHVuaW9uIHByb2JhYmlsaXR5Lg0KPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQojIyDwn5qAIDEuIEJhc2ljIERlZmluaXRpb25zIGluIFByb2JhYmlsaXR5IChSZXZpZXcpDQoNCmEuIFNhbXBsZSBTcGFjZSAoJFMkKTo8YnI+DQotIFRoZSBTYW1wbGUgU3BhY2UgaXMgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgb3V0Y29tZXMgb2YgYSByYW5kb20gZXhwZXJpbWVudC48YnI+DQotIEV4YW1wbGUgZnJvbSB0aGUgVmlkZW86IFJvbGxpbmcgdHdvIDYtc2lkZWQgZGljZTsgdGhlIHRvdGFsIHNhbXBsZSBzcGFjZSBpcyAkNiBcdGltZXMgNiA9IDM2JCBwb3NzaWJsZSBvdXRjb21lcy4NCg0KYi4gRXZlbnQ6PGJyPg0KLSBBbiBldmVudCBpcyBhIHN1YnNldCBvZiB0aGUgc2FtcGxlIHNwYWNlLCB3aGljaCBpcyBhIGNvbGxlY3Rpb24gb2Ygb3V0Y29tZXMgdGhhdCBzYXRpc2Z5IGEgc3BlY2lmaWMgY29uZGl0aW9uLg0KDQpjLiBJbnRlcnNlY3Rpb24gKCRBIFxjYXAgQiQpOjxicj4NCi0gJEEgXGNhcCBCJCBpcyB0aGUgc2V0IG9mIG91dGNvbWVzIGluY2x1ZGVkIGluIGJvdGggJEEkIGFuZCAkQiQg4oCUIG1lYW5pbmcgYm90aCBldmVudHMgb2NjdXIgc2ltdWx0YW5lb3VzbHkuDQotIFRoaXMgaXMgY2FsbGVkIHRoZSBvdmVybGFwIGFyZWEgb3IgZHVwbGljYXRlIG91dGNvbWVzLg0KDQpkLiBVbmlvbiAoJEEgXGN1cCBCJCk6PGJyPg0KLSAkQSBcY3VwIEIkIGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgZXZlbnRzIG9jY3VycyAoJEEkIG9yICRCJCBvY2N1cnMsIG9yIGJvdGgpLg0KDQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ib21hc3MxMTE2L3Vubm4vbWFpbi9iaW5vbWlhbC5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQpbY2xpY2sgaWYgSW1hZ2UgZG9lcyBub3QgYXBwZWFyXShodHRwczovLzFkcnYubXMvaS9jLzFhZDFmNTNiZjhhY2E4ZGUvRVY1ZThOZGZLN1ZKdEFBckhwM0hiQWtCbDZTRVlyMl9wSkhqNHJXclQxMEVIQT9lPTBvNGkzWSl7IHdpZHRoPTUwJSB9DQoNCvCfmoAgMi4gRm9ybXVsYSBmb3IgVW5pb24gUHJvYmFiaWxpdHkg4oCUIEdlbmVyYWwgQWRkaXRpb24gUnVsZQ0KDQpXZSB1c2UgdGhpcyBmb3JtdWxhIHdoZW4gdGhlIHF1ZXN0aW9uIGNvbnRhaW5zIHRoZSBrZXl3b3JkICJvciIuPGJyPg0KR2VuZXJhbCBBZGRpdGlvbiBSdWxlOg0KJCRQKEEgXGN1cCBCKSA9IFAoQSkgKyBQKEIpIC0gUChBIFxjYXAgQikkJA0KLSAkUChBIFxjdXAgQikkOiBUaGUgcHJvYmFiaWxpdHkgdGhhdCAkQSQgb3IgJEIkIG9jY3Vycy48YnI+DQotICRQKEEgXGNhcCBCKSQ6IFRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgaW50ZXJzZWN0aW9uICgkQSQgYW5kICRCJCBvY2N1ciBzaW11bHRhbmVvdXNseSkuDQoNCkZvciBEaXNqb2ludCAoTXV0dWFsbHkgRXhjbHVzaXZlKSBFdmVudHM6PGJyPg0KSWYgJEEkIGFuZCAkQiQgYXJlIGRpc2pvaW50LCB0aGVpciBpbnRlcnNlY3Rpb24gcHJvYmFiaWxpdHkgaXMgemVybzoNCiQkUChBIFxjYXAgQikgPSAwJCQNClRodXMsIHRoZSBmb3JtdWxhIHNpbXBsaWZpZXMgdG86DQokJFAoQSBcY3VwIEIpID0gUChBKSArIFAoQikkJA0KDQojIyDwn5qAIDMuIFdoeSBNdXN0IFdlIFN1YnRyYWN0IHRoZSBJbnRlcnNlY3Rpb24gKCRQKEEgXGNhcCBCKSQpPw0KDQotIE9iamVjdGl2ZTogVGhlIHVuaW9uIGZvcm11bGEgcmVxdWlyZXMgdGhlIHRlcm0gJC0gUChBIFxjYXAgQikkIGJlY2F1c2Ugd2Ugd2FudCB0byBlbGltaW5hdGUgZHVwbGljYXRlIG91dGNvbWVzLjxicj4NCi0gVmlzdWFsIEV4cGxhbmF0aW9uOiBXaGVuIHlvdSBkaXJlY3RseSBhZGQgJFAoQSkgKyBQKEIpJCwgdGhlIG91dGNvbWVzIGluIHRoZSBpbnRlcnNlY3Rpb24gYXJlYSAoJEEgXGNhcCBCJCkgYXJlIGNvdW50ZWQgdHdpY2UuPGJyPg0KLSBUbyBlbnN1cmUgZXZlcnkgb3V0Y29tZSBpbiB0aGUgc2FtcGxlIHNwYWNlIGlzIGNvdW50ZWQgZXhhY3RseSBvbmNlLCB0aGUgaW50ZXJzZWN0aW9uIHByb2JhYmlsaXR5IG11c3QgYmUgc3VidHJhY3RlZCBvbmNlLg0KDQojIyDwn5qAIDQuIEV4YW1wbGUgQXBwbGljYXRpb24NCg0KVXNpbmcgdGhlIGV4YW1wbGUgb2Ygcm9sbGluZyB0d28gZGljZTo8YnI+DQotIEE6IEV2ZW50IOKAnEdldHRpbmcgdHdvIGV2ZW4gbnVtYmVyc+KAnSAkXHJpZ2h0YXJyb3cgUChBKSA9IFxmcmFjezl9ezM2fSQ8YnI+DQotIEI6IEV2ZW50IOKAnEdldHRpbmcgYXQgbGVhc3Qgb25lIDLigJ0gJFxyaWdodGFycm93IFAoQikgPSBcZnJhY3sxMX17MzZ9JA0KDQpUaGVuOjxicj4NCi0gSW50ZXJzZWN0aW9uICgkQSBcY2FwIEIkKTogRXZlbnQg4oCcR2V0dGluZyB0d28gZXZlbiBudW1iZXJzIEFORCBhdCBsZWFzdCBvbmUgMuKAnS4NCiQkIFAoQSBcY2FwIEIpID0gXGZyYWN7NX17MzZ9IFxxdWFkIFx0ZXh0eyh0YWtlbiBmcm9tIHRoZSBzYW1wbGUgc3BhY2Ugb3ZlcmxhcCl9JCQNCi0gVW5pb24gKCRBIFxjdXAgQiQpOiBQcm9iYWJpbGl0eSBvZiBnZXR0aW5nICRBJCBPUiAkQiQuDQokJFxiZWdpbnthbGlnbmVkfVAoQSBcY3VwIEIpICY9IFAoQSkgKyBQKEIpIC0gUChBIFxjYXAgQikgXCY9IFxmcmFjezl9ezM2fSArIFxmcmFjezExfXszNn0gLSBcZnJhY3s1fXszNn0gXCY9IFxmcmFjezE1fXszNn0gXGFwcHJveCAwLjQxNjdcZW5ke2FsaWduZWR9JCQNCk1lYW5pbmc6IHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nICJ0d28gZXZlbiBvciBhdCBsZWFzdCBvbmUgMiIgaXMgYXBwcm94aW1hdGVseSA0MS42NyUuDQoNCiMgNi40IEV4Y2x1c2l2ZSBhbmQgRXhoYXVzdGl2ZQ0KPGgyPjxpPkV4cGxhbmF0b3J5IFZpZGVvPC9pPjwvaDI+DQoNCjxkaXYgY2xhc3M9Im1haW4tY29udGFpbmVyIj4NCg0KPGNlbnRlcj4gDQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvZjdhZ1R2OW5BNWsiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBzdHlsZT0iYm9yZGVyOjA7IGJvcmRlci1yYWRpdXM6MTJweDsiPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQo8aDM+SWYgdGhlIHZpZGVvIGRvZXMgbm90IGFwcGVhciwgcGxlYXNlIGNsaWNrIHRoZSBZb3VUdWJlIGxpbmsgYmVsb3c6PC9oMz4gPHA+PGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9mN2FnVHY5bkE1ayIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8veW91dHUuYmUvZjdhZ1R2OW5BNWs8L2E+PC9wPg0KDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icGFzdGVsLWJveCI+DQogIDxkaXYgY2xhc3M9InBhc3RlbC10aXRsZSI+PC9kaXY+DQogIDxwPiANClRoaXMgdmlkZW8gZXhwbGFpbnMgdGhlIGRpZmZlcmVuY2UgYW5kIGRlZmluaXRpb25zIG9mIHR3byB0eXBlcyBvZiBldmVudHMgaW4gcHJvYmFiaWxpdHkgdGhlb3J5OiANCjx1bD4NCjxsaT48c3Ryb25nPk11dHVhbGx5IEV4Y2x1c2l2ZSBFdmVudHM8L3N0cm9uZz4g4oCUIHR3byBldmVudHMgdGhhdCBjYW5ub3Qgb2NjdXIgc2ltdWx0YW5lb3VzbHkuPC9saT4gDQo8bGk+PHN0cm9uZz5FeGhhdXN0aXZlIEV2ZW50czwvc3Ryb25nPiDigJQgYSBjb2xsZWN0aW9uIG9mIGV2ZW50cyB0aGF0IGNvdmVycyBhbGwgcG9zc2libGUgb3V0Y29tZXMgb2YgYW4gZXhwZXJpbWVudC48L2xpPiANCjwvdWw+IA0KPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQojIyDirZAgMS4gRXhjbHVzaXZlIEV2ZW50cyAoTXV0dWFsbHkgRXhjbHVzaXZlKQ0KDQpEZWZpbml0aW9uPGJyPg0KVHdvIGV2ZW50cyBhcmUgc2FpZCB0byBiZSBtdXR1YWxseSBleGNsdXNpdmUgaWYgdGhleSBjYW5ub3Qgb2NjdXIgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBtZWFucyBubyBvdXRjb21lIGFwcGVhcnMgaW4gYm90aCBldmVudHMgc2ltdWx0YW5lb3VzbHkuDQoNCk1hdGhlbWF0aWNhbGx5Og0KJCRBIFxjYXAgQiA9IFxlbXB0eXNldCQkDQpUaGVyZSBpcyBubyAib3ZlcmxhcCIuDQoNCkV4YW1wbGU6PGJyPg0KT24gYSBzaW5nbGUgZGllIHJvbGw6DQoNCi0gQSA9IHJvbGxpbmcgYW4gZXZlbiBudW1iZXIgPSB7Miw0LDZ9DQotIEIgPSByb2xsaW5nIGFuIG9kZCBudW1iZXIgPSB7MSwzLDV9DQotIEEgYW5kIEIgaGF2ZSBubyBpbnRlcnNlY3Rpb24g4oaSIG11dHVhbGx5IGV4Y2x1c2l2ZS4NCg0KRm9ybXVsYSBDb25zZXF1ZW5jZUlmIEEgYW5kIEIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZToNCiQkUChBIFxjdXAgQikgPSBQKEEpICsgUChCKSQkDQpObyBuZWVkIHRvIHN1YnRyYWN0IHRoZSBvdmVybGFwIGJlY2F1c2UgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLg0KDQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ib21hc3MxMTE2L2V4bGN2L21haW4vVy5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQpbY2xpY2sgaWYgSW1hZ2UgZG9lcyBub3QgYXBwZWFyXShodHRwczovLzFkcnYubXMvaS9jLzFhZDFmNTNiZjhhY2E4ZGUvRVVCc3dtdWsxWUZOdHlmVVM2VFdVTW9CX2dhRVFwSjdVckNOclhSWFpLT2VhZz9lPWp1c2dkSSl7IHdpZHRoPTUwJSB9DQoNCiMjIOKtkCAyLiBFeGhhdXN0aXZlIEV2ZW50cyAoQ29sbGVjdGl2ZWx5IEV4aGF1c3RpdmUgLyBDb21wcmVoZW5zaXZlKUQNCg0KZWZpbml0aW9uPGJyPg0KRXZlbnRzIGFyZSBjYWxsZWQgZXhoYXVzdGl2ZSBpZiB0b2dldGhlciB0aGV5IGNvdmVyIHRoZSBlbnRpcmUgc2FtcGxlIHNwYWNlLg0KJCRQKEEgXGN1cCBCKSA9IFMkJA0KQWxsIHBvc3NpYmxlIG91dGNvbWVzIGFyZSBpbmNsdWRlZCBpbiBBIG9yIEIgb3IgYm90aC4NCg0KRXhhbXBsZTxicj4NCkRpZSByb2xsOg0KDQotIEEgPSBldmVuIG51bWJlciA9IHsyLDQsNn0NCi0gQiA9IG9kZCBudW1iZXIgPSB7MSwzLDV9DQotIFVuaW9uIG9mIEEgYW5kIEIgPSBTID0gezEsMiwzLDQsNSw2fQ0KDQrihpIgQSAmIEIgYXJlIGV4aGF1c3RpdmUuDQpOb3RlOiBUaGV5IGFyZSBib3RoIGV4aGF1c3RpdmUgYW5kIG11dHVhbGx5IGV4Y2x1c2l2ZS4NCg0KQW5vdGhlciBleGFtcGxlIHRoYXQgaXMgbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBidXQgaXMgc3RpbGwgZXhoYXVzdGl2ZToNCg0KLSBBID0gbnVtYmVyID4gMyDihpIgezQsNSw2fTxicj4NCi0gQiA9IG51bWJlciAkXGxlJCAzIOKGkiB7MSwyLDN9DQoNClRoZSB1bmlvbiA9IHRoZSBlbnRpcmUgc2FtcGxlIHNwYWNlLg0KVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gYmUgbXV0dWFsbHkgZXhjbHVzaXZlLg0KDQojIyDirZAzLiBLZXkgRGlmZmVyZW5jZXMNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCg0KdGFiZWxfZXhjbHVzaXZlX2V4aGF1c3RpdmUgPC0gZGF0YS5mcmFtZSgNCiAgQ29uY2VwdCA9IGMoDQogICAgIkNhbiBBIGFuZCBCIG9jY3VyIHRvZ2V0aGVyPyIsDQogICAgIkludGVyc2VjdGlvbiBBICZjYXA7IEIiLA0KICAgICJVbmlvbiBBICZjdXA7IEIiLA0KICAgICJFeGFtcGxlIg0KICApLA0KICBNdXR1YWxseV9FeGNsdXNpdmUgPSBjKA0KICAgICJObyIsDQogICAgIkFsd2F5cyBlbXB0eSIsDQogICAgIk5vdCBuZWNlc3NhcmlseSA9IFMiLA0KICAgICJFdmVuIHZzIE9kZCINCiAgKSwNCiAgRXhoYXVzdGl2ZSA9IGMoDQogICAgIlllcyAob3ZlcmxhcCBpcyBhbGxvd2VkIG9yIG5vdCBhbGxvd2VkKSIsDQogICAgIkNhbiBiZSBlbXB0eSAvIGNhbiBiZSBub24tZW1wdHkiLA0KICAgICJNdXN0IGVxdWFsIHRoZSBlbnRpcmUgc2FtcGxlIHNwYWNlIiwNCiAgICAiRXZlbiAmIE9kZCwgb3IgPjMgJmxlOyAzIg0KICApLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCmthYmxlKA0KICB0YWJlbF9leGNsdXNpdmVfZXhoYXVzdGl2ZSwNCiAgY2FwdGlvbiA9ICJEaWZmZXJlbmNlcyBCZXR3ZWVuIE11dHVhbGx5IEV4Y2x1c2l2ZSBhbmQgRXhoYXVzdGl2ZSBFdmVudHMiLA0KICBlc2NhcGUgPSBGQUxTRQ0KKQ0KYGBgDQoNCiMjIOKtkCA0LiBSZWxhdGlvbnNoaXAgQmV0d2VlbiB0aGUgVHdvDQoNCi0gVHdvIGV2ZW50cyBjYW4gYmUgbXV0dWFsbHkgZXhjbHVzaXZlICsgZXhoYXVzdGl2ZSAoZXhhbXBsZTogZXZlbiB2cy4gb2RkKS48YnI+DQotIFRoZXkgY2FuIGJlIGV4aGF1c3RpdmUgYnV0IG5vdCBleGNsdXNpdmUgKGV4YW1wbGU6IEEgPSAkXGdlIDMkLCBCID0gJFxsZSA0JCkuPGJyPg0KLSBUaGV5IGNhbiBiZSBleGNsdXNpdmUgYnV0IG5vdCBleGhhdXN0aXZlIChleGFtcGxlOiBBID0gMSwgQiA9IDYgb24gYSBkaWUg4oaSIHRoZXkgZG9uJ3QgY292ZXIgdGhlIHdob2xlIDHigJM2KS4NCg0KIyMg4q2QIDUuIEV4YW1wbGUgQXBwbGljYXRpb25FDQoNCnhhbXBsZSAxIChNdXR1YWxseSBFeGNsdXNpdmUpPGJyPg0KR2l2ZW46DQoNCi0gQSA9IHJvbGxpbmcgYSAyDQotIEIgPSByb2xsaW5nIGEgNQ0KDQpUaGVuOg0KJCRQKEEgXGN1cCBCKSA9IFAoQSkgKyBQKEIpID0gXGZyYWN7MX17Nn0gKyBcZnJhY3sxfXs2fSA9IFxmcmFjezJ9ezZ9JCQNCg0KRXhhbXBsZSAyIChFeGhhdXN0aXZlKTxicj4NCkdpdmVuOg0KDQotIEEgPSByb2xsaW5nIGEgbnVtYmVyICRcbGUgMyQNCi0gQiA9IHJvbGxpbmcgYSBudW1iZXIgJFxnZSAzJA0KDQpUaGUgdW5pb24gY292ZXJzIHRoZSBlbnRpcmUgc2FtcGxlIHNwYWNlIOKGkiBleGhhdXN0aXZlbmVzcy4NCg0KIyA2LjUgQmlub21pYWwgRXhwZXJpbWVudA0KPGgyPjxpPkV4cGxhbmF0b3J5IFZpZGVvPC9pPjwvaDI+DQoNCjxkaXYgY2xhc3M9Im1haW4tY29udGFpbmVyIj4NCg0KPGNlbnRlcj4gDQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvblJ1UUF0YWpKWWsiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBzdHlsZT0iYm9yZGVyOjA7IGJvcmRlci1yYWRpdXM6MTJweDsiPiA8L2lmcmFtZT4gDQo8L2NlbnRlcj4NCg0KPGgzPklmIHRoZSB2aWRlbyBkb2VzIG5vdCBhcHBlYXIsIHBsZWFzZSBjbGljayB0aGUgWW91VHViZSBsaW5rIGJlbG93OjwvaDM+IDxwPjxhIGhyZWY9Imh0dHBzOi8veW91dHUuYmUvblJ1UUF0YWpKWWsiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL3lvdXR1LmJlL25SdVFBdGFqSllrPC9hPjwvcD4NCg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9InBhc3RlbC1ib3giPg0KICA8ZGl2IGNsYXNzPSJwYXN0ZWwtdGl0bGUiPjwvZGl2Pg0KICA8cD4gDQpUaGlzIHZpZGVvIGV4cGxhaW5zIHRoZSBiYXNpYyBjb25jZXB0IG9mIGEgQmlub21pYWwgRXhwZXJpbWVudCBhbmQgaG93IHRvIGNhbGN1bGF0ZSBwcm9iYWJpbGl0aWVzIHVzaW5nIHRoZSBCaW5vbWlhbCBGb3JtdWxhLiBUaGUgY29yZSBjb25jZXB0IG9mIHRoZSBiaW5vbWlhbCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gaXMgdGhhdCBpdCBpcyBhIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBmb3IgYW4gZXhwZXJpbWVudCB0aGF0IGlzIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzIGFuZCB5aWVsZHMgb25seSB0d28gcG9zc2libGUgb3V0Y29tZXMgKGFzIGluZGljYXRlZCBieSB0aGUgcHJlZml4ICJiaS0iKSwgd2hpY2ggYXJlOiBTdWNjZXNzIG9yIEZhaWx1cmUuIA0KPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQojIyDwn6qQIDEuIEJpbm9taWFsIEV4cGVyaW1lbnQNCg0KQSBCaW5vbWlhbCBFeHBlcmltZW50IGlzIGEgdHlwZSBvZiBzdGF0aXN0aWNhbCB0cmlhbCB0aGF0IHNhdGlzZmllcyBmb3VyIGtleSBjaGFyYWN0ZXJpc3RpY3M6PGJyPg0KLSBUaGVyZSBpcyBhIGZpeGVkIG51bWJlciBvZiB0cmlhbHMgKCRuJCkuPGJyPg0KLSBFYWNoIHRyaWFsIGhhcyBvbmx5IHR3byBvdXRjb21lczogc3VjY2VzcyBvciBmYWlsdXJlLlRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzICgkcCQpIGlzIGNvbnN0YW50IGZvciBldmVyeSB0cmlhbC48YnI+DQotIFRoZSB0cmlhbHMgYXJlIGluZGVwZW5kZW50ICh0aGV5IGRvIG5vdCBpbmZsdWVuY2UgZWFjaCBvdGhlcikuDQoNCkNhc2UgZXhhbXBsZXM6Q29pbiBUb3NzOiA8YnI+DQotIENhbGN1bGF0aW5nIHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIGV4YWN0bHkgb25lIGhlYWQgKHN1Y2Nlc3MpIGluIHRocmVlIGNvaW4gdG9zc2VzLiBTaW5jZSBhbGwgNCBjb25kaXRpb25zIGFyZSBtZXQgKGZpeGVkIG51bWJlciBvZiB0cmlhbHMgJG49MyQsIG9ubHkgdHdvIG91dGNvbWVzLCBjb25zdGFudCBwcm9iYWJpbGl0eSAkcD0wLjUkLCBhbmQgaW5kZXBlbmRlbnQgdHJpYWxzKSwgdGhpcyBpcyBhIGJpbm9taWFsIGV4cGVyaW1lbnQuPGJyPg0KLSBNYXJibGUgRHJhdzogQ2FsY3VsYXRpbmcgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgZXhhY3RseSB0d28gZ3JlZW4gbWFyYmxlcyAoc3VjY2VzcykgaW4gZml2ZSBkcmF3cyB3aXRoIHJlcGxhY2VtZW50LiBSZXBsYWNlbWVudCBlbnN1cmVzIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3MgcmVtYWlucyBjb25zdGFudCBpbiBldmVyeSB0cmlhbCwgdGh1cyBzYXRpc2Z5aW5nIHRoZSBiaW5vbWlhbCBjb25kaXRpb24uDQoNCiMjIPCfqpAgMi4gQ29uZGl0aW9ucyBmb3IgYSBCaW5vbWlhbCBFeHBlcmltZW50DQoNCkEgdHJpYWwgaXMgY2FsbGVkIGJpbm9taWFsIGlmIGl0IG1lZXRzIGZvdXIgY29uZGl0aW9uczoNCg0K4pyUIEZpeGVkIG51bWJlciBvZiB0cmlhbHM8YnI+DQpUaGUgbnVtYmVyIG9mIHRyaWFscyAkbiQgaXMgcHJlZGV0ZXJtaW5lZC48YnI+DQrinJQgVHdvIHBvc3NpYmxlIG91dGNvbWVzPGJyPg0KRWFjaCB0cmlhbCB5aWVsZHMgb25seSBzdWNjZXNzIG9yIGZhaWx1cmUuPGJyPg0K4pyUIENvbnN0YW50IHByb2JhYmlsaXR5PGJyPg0KVGhlIHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3MgJHAkIGlzIHRoZSBzYW1lIGZvciBldmVyeSB0cmlhbC48YnI+DQrinJQgSW5kZXBlbmRlbnQgdHJpYWxzPGJyPg0KT25lIHRyaWFsIGRvZXMgbm90IGFmZmVjdCB0aGUgb3RoZXJzLg0KDQojIyDwn6qQIDMuIEltcG9ydGFudCBOb3RhdGlvbiBpbiBCaW5vbWlhbCBEaXN0cmlidXRpb24NCg0KLSBcKCBuIFwpID0gbnVtYmVyIG9mIHRyaWFscw0KLSBcKCB4IFwpID0gbnVtYmVyIG9mIHN1Y2Nlc3Nlcw0KLSBcKCBwIFwpID0gcHJvYmFiaWxpdHkgb2Ygc3VjY2Vzcw0KLSBcKCBxID0gMSAtIHAgXCkgPSBwcm9iYWJpbGl0eSBvZiBmYWlsdXJlDQotIFwoIFAoWCA9IHgpIFwpID0gcHJvYmFiaWxpdHkgb2YgZ2V0dGluZyBleGFjdGx5IFwoIHggXCkgc3VjY2Vzc2VzDQoNCiMjIPCfqpAgNC4gQmlub21pYWwgRGlzdHJpYnV0aW9uIEZvcm11bGENCg0KVGhlIGJpbm9taWFsIHByb2JhYmlsaXR5IGZvcm11bGE6DQokJFAoaykgPSB7biBcY2hvb3NlIGt9IFxjZG90IHBeayBcY2RvdCAoMS1wKV57XCxuLWt9JCQNCldoZXJlOjxicj4NCi0gXCggUChrKSBcKSA6IHRoZSBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIGV4YWN0bHkgXCggayBcKSBzdWNjZXNzZXMuPGJyPg0KLSBcKCB7biBcY2hvb3NlIGt9IFwpIDogdGhlIGNvbWJpbmF0aW9uLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHdheXMgdG8gZ2V0IFwoIGsgXCkgc3VjY2Vzc2VzIGZyb21zdWtzZXMgZGFyaSBcKCBuIFwpIHRyaWFscy48YnI+DQotIFwoIG4gXCkgOiB0b3RhbCBudW1iZXIgb2YgdHJpYWxzLjxicj4NCi0gXCggayBcKSA6IGRlc2lyZWQgbnVtYmVyIG9mIHN1Y2Nlc3Nlcy48YnI+DQotIFwoIHAgXCkgOiBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIG9uIGEgc2luZ2xlIHRyaWFsLjxicj4NCi0gXCggKDEtcCkgXCkgOiBwcm9iYWJpbGl0eSBvZiBmYWlsdXJlIG9uIGEgc2luZ2xlIHRyaWFsLg0KDQojIyDwn6qQIDUuIEJpbm9taWFsIEV4YW1wbGUgUHJvYmxlbQ0KDQpVc2luZyB0aGUgbWFyYmxlIGRyYXcgY2FzZSB0byBkZW1vbnN0cmF0ZSB0aGUgZm9ybXVsYTo8YnI+DQpDYXNlOiBJZiA1IG1hcmJsZXMgYXJlIGRyYXduIHdpdGggcmVwbGFjZW1lbnQsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgZXhhY3RseSAyIGdyZWVuIG1hcmJsZXM/DQoNCiRuID0gNSQgKFRyaWFscyk8YnI+DQokayA9IDIkIChTdWNjZXNzZXMpPGJyPg0KJHAgPSAwLjIkIChQcm9iYWJpbGl0eSBvZiBncmVlbiwgZnJvbSAkXGZyYWN7Mn17MTB9JCk8YnI+DQokMS1wID0gMC44JCAoUHJvYmFiaWxpdHkgb2Ygbm9uLWdyZWVuKQ0KDQpUaHVzOg0KJCRQKGs9MikgPSB7NSBcY2hvb3NlIDJ9KDAuMileMigxLTAuMileezUtMn0kJA0KJCRQKGs9MikgPSAxMCBcdGltZXMgKDAuMDQpIFx0aW1lcyAoMC44KV4zJCQNCiQkUChrPTIpID0gMTAgXHRpbWVzIDAuMDQgXHRpbWVzIDAuNTEyJCQNCiQkUChrPTIpID0gMC4yMDQ4JCQNClNvLCB0aGUgcHJvYmFiaWxpdHkgaXMgMC4yMDQ4Lg0KDQojI/CfqpAgNi4gV2h5IGlzIGl0IGNhbGxlZCAiQmlub21pYWwiPw0KDQpUaGUgbmFtZSBCaW5vbWlhbCBjb21lcyBmcm9tIHRoZSBmYWN0IHRoYXQgdGhpcyBkaXN0cmlidXRpb24gYWx3YXlzIGhhcyB0d28gcG9zc2libGUgb3V0Y29tZXMgaW4gZXZlcnkgdHJpYWwsIGluZGljYXRlZCBieSB0aGUgcHJlZml4IGJpIChtZWFuaW5nIHR3bykuDQoNCiMgNi42IEJpbm9taWFsIERpc3RyaWJ1dGlvbg0KPGgyPjxpPkV4cGxhbmF0b3J5IFZpZGVvPC9pPjwvaDI+DQoNCjxkaXYgY2xhc3M9Im1haW4tY29udGFpbmVyIj4NCg0KPGNlbnRlcj4gDQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvWTItdlNXRm1neUkiIHdpZHRoPSI3NjgiIGhlaWdodD0iNDAwIiBkYXRhLWV4dGVybmFsPSIxIiBzdHlsZT0iYm9yZGVyOjA7IGJvcmRlci1yYWRpdXM6MTJweDsiPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQo8aDM+SWYgdGhlIHZpZGVvIGRvZXMgbm90IGFwcGVhciwgcGxlYXNlIGNsaWNrIHRoZSBZb3VUdWJlIGxpbmsgYmVsb3c6PC9oMz4gPHA+PGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS9ZMi12U1dGbWd5SSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8veW91dHUuYmUvWTItdlNXRm1neUk8L2E+PC9wPg0KDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0icGFzdGVsLWJveCI+DQogIDxkaXYgY2xhc3M9InBhc3RlbC10aXRsZSI+PC9kaXY+DQogIDxwPiANClRoaXMgdmlkZW8gY29udGludWVzIHRoZSBkaXNjdXNzaW9uIG9uIHRoZSBCaW5vbWlhbCBEaXN0cmlidXRpb24sIGZvY3VzaW5nIG9uIGhvdyB0byB2aXN1YWxpemUgdGhlIGRhdGEgYW5kIHVuZGVyc3RhbmQgaXRzIGRpc3RyaWJ1dGlvbmFsIHByb3BlcnRpZXMsIGFuZCB2aXN1YWxseSBleHBsYWluaW5nIGhvdyB0aGUgc2hhcGUgb2YgdGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbiBncmFwaCBpcyBpbmZsdWVuY2VkIGJ5IGNoYW5nZXMgaW4gdGhlIG51bWJlciBvZiB0cmlhbHMgKChuKSkgYW5kIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzICgocCkpLg0KPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQojIyDwn4yZIDEuIEZvcm11bGEgYW5kIEJhc2ljIFZpc3VhbGl6YXRpb24NCg0KLSBPYmplY3RpdmU6IFRoZSBCaW5vbWlhbCBEaXN0cmlidXRpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2Ygc3VjY2Vzc2VzICgkayQpIGZyb20gYSBmaXhlZCBudW1iZXIgb2YgdHJpYWxzICgkbiQpLjxicj4NCi0gRXhhbXBsZTogVG9zc2luZyBhIGNvaW4gMiB0aW1lcyAoJG49MiQpIHdpdGggYSBwcm9iYWJpbGl0eSBvZiBIZWFkICgkcD0wLjUkKS4gVGhlIHByb2JhYmlsaXRpZXMgZm9yIGdldHRpbmcgMCwgMSwgb3IgMiBIZWFkcyBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgQmlub21pYWwgRm9ybXVsYS48YnI+DQotIEdyYXBoOiBUaGVzZSBwcm9iYWJpbGl0aWVzIGFyZSB2aXN1YWxpemVkIHVzaW5nIGEgYmFyIGNoYXJ0IChoaXN0b2dyYW0pLCB3aGVyZSB0aGUgWC1heGlzIGlzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzICgkayQpIGFuZCB0aGUgWS1heGlzIGlzIHRoZSBwcm9iYWJpbGl0eSAoJFAoaykkKS48YnI+DQoNCiMjIPCfjJkgMi4gSW1wb3J0YW50IFBhcmFtZXRlcnMNCg0KRm9ybXVsYXMgZm9yIHBhcmFtZXRlcnMgdG8gbWVhc3VyZSB0aGUgQmlub21pYWwgRGlzdHJpYnV0aW9uOg0KYGBge3IsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRX0NCiMgTG9hZCBsaWJyYXJ5IGZvciBrYWJsZQ0KbGlicmFyeShrbml0cikNCg0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdGFiZWwNCnRhYmVsX2Jpbm9taWFsIDwtIGRhdGEuZnJhbWUoDQogIFBhcmFtZXRlciA9IGMoIk1lYW4gKM68KSIsICJWYXJpYW5jZSAoz4PCsikiLCAiU3RhbmRhcmQgRGV2aWF0aW9uICjPgykiKSwNCiAgRm9ybXVsYSA9IGMoIs68ID0gbiDCtyBwIiwNCiAgICAgICAgICAgICLPg8KyID0gbiDCtyBwIMK3ICgxIC0gcCkiLA0KICAgICAgICAgICAgIs+DID0g4oiaKG4gwrcgcCDCtyAoMSAtIHApKSIpLA0KICBEZXNjcmlwdGlvbiA9IGMoIlRoZSBleHBlY3RlZCBhdmVyYWdlIG51bWJlciBvZiBzdWNjZXNzZXMuIiwNCiAgICAgICAgICAgICAgICAgIkEgbWVhc3VyZSBvZiB0aGUgc3ByZWFkIG9mIHRoZSBkYXRhIGZyb20gdGhlIG1lYW4uIiwNCiAgICAgICAgICAgICAgICAgIlRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UuIikNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0Ka2FibGUodGFiZWxfYmlub21pYWwsIGNhcHRpb24gPSAiVGFibGUgb2YgQmlub21pYWwgRGlzdHJpYnV0aW9uIFBhcmFtZXRlcnMiKQ0KYGBgDQoNCiMjIPCfjJkgMy4gSW5mbHVlbmNlIG9mIFByb2JhYmlsaXR5IG9mIFN1Y2Nlc3MgKCRwJCkgb24gRGlzdHJpYnV0aW9uIFNoYXBlDQoNClRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzICgkcCQpIGNvbnRyb2xzIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uIGN1cnZlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdyYXBoIHdpbGwgYmUgc3ltbWV0cmljYWwgb3Igc2tld2VkOg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQoNCiMgRGF0YSBmcmFtZQ0KdGFiZWxfc2tldyA8LSBkYXRhLmZyYW1lKA0KICBWYWx1ZV9wID0gYygicCA9IDAuNSAoNTAlKSIsICJwIDwgMC41IiwgInAgPiAwLjUiKSwNCiAgRGlzdHJpYnV0aW9uX1NoYXBlID0gYygNCiAgICAiU3ltbWV0cmljYWwiLA0KICAgICJTa2V3ZWQgUmlnaHQiLA0KICAgICJTa2V3ZWQgTGVmdCINCiAgKSwNCiAgRGVzY3JpcHRpb24gPSBjKA0KICAgICJQZXJmZWN0bHkgc3ltbWV0cmljYWwgZGlzdHJpYnV0aW9uLCBpdHMgcGVhayBpcyBpbiB0aGUgbWlkZGxlLCByZXNlbWJsaW5nIHRoZSBOb3JtYWwgRGlzdHJpYnV0aW9uLiIsDQogICAgIkxvdyBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzLCBzbyBtb3N0IG91dGNvbWVzIHBpbGUgdXAgYXQgc21hbGwgbnVtYmVyIG9mIHN1Y2Nlc3NlcyAobmVhciAwKS4iLA0KICAgICJIaWdoIHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3MsIHNvIG1vc3Qgb3V0Y29tZXMgcGlsZSB1cCBhdCBsYXJnZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIChuZWFyIG4pLiINCiAgKQ0KKQ0KDQojIFRhYmVsIGthYmxlIEJJQVNBDQp0YmwgPC0ga2FibGUoDQogIHRhYmVsX3NrZXcsDQogIGZvcm1hdCA9ICJodG1sIiwNCiAgY2FwdGlvbiA9ICLinKggU2hhcGUgb2YgdGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbiDinKgiLA0KICB0YWJsZS5hdHRyID0gJ2NsYXNzPSJ5MmstYmx1ZS10YWJsZSInDQopDQoNCiMgQ2V0YWsgSFRNTCBhcGEgYWRhbnlhDQpjYXQodGJsKQ0KYGBgDQoNClZpc3VhbGl6YXRpb24gb2YgUHJvYmFiaWxpdHkgKCRwJCkgSW5mbHVlbmNlOjxpbWcgaWQ9IkZvdG8iIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JvbWFzczExMTYvYWFtL21haW4vaHN0Z3JtLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCltjbGljayBpZiBJbWFnZSBkb2VzIG5vdCBhcHBlYXJdKGh0dHBzOi8vMWRydi5tcy9pL2MvMWFkMWY1M2JmOGFjYThkZS9FU2EyNWo0TTVKQkhxdDBobmwwczV3b0I4eUZTM3pCcV9BcjRwUXRMMVhSNl9BP2U9WWUwVFZNKXsgd2lkdGg9NTAlIH0NCg0KMS4gQ2FzZSAkcCA8IDAuNSQNCi0gKFNrZXdlZCBSaWdodClWaXN1YWw6IFRoZSBncmFwaCBvbiB0aGUgbGVmdC4NCi0gT2JzZXJ2YXRpb246IFRoZSBoaXN0b2dyYW0gcGVhayBpcyBuZWFyIHRoZSB2YWx1ZSAwIChzbWFsbCBudW1iZXIgb2Ygc3VjY2Vzc2VzKS4gVGhlIHRhaWwgb2YgdGhlIGN1cnZlIGV4dGVuZHMgdG8gdGhlIHJpZ2h0IHRvd2FyZHMgbGFyZ2VyIG51bWJlciBvZiBzdWNjZXNzZXMuIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSBwcm9iYWJpbGl0eSBvZiBmYWlsdXJlICgkMS1wJCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzICgkcCQpLCBtYWtpbmcgdGhlIG1vc3QgbGlrZWx5IG91dGNvbWUgYSBsYXJnZSBudW1iZXIgb2YgZmFpbHVyZXMuDQoNCjIuIENhc2UgJHAgPSAwLjUkIA0KLSAoU3ltbWV0cmljYWwpVmlzdWFsOiBUaGUgZ3JhcGggaW4gdGhlIGNlbnRlci4NCi0gT2JzZXJ2YXRpb246IFRoZSBoaXN0b2dyYW0gaXMgcGVyZmVjdGx5IHN5bW1ldHJpY2FsLCByZXNlbWJsaW5nIGEgYmVsbCBzaGFwZS4gVGhlIHBlYWsgaXMgZXhhY3RseSBpbiB0aGUgbWlkZGxlIChhdCAkXG11ID0gbiBcY2RvdCBwJCkuIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIGFuZCBmYWlsdXJlIGFyZSBlcXVhbCAoJDUwXCUkKSwgYmFsYW5jaW5nIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24uDQoNCjMuIENhc2UgJHAgPiAwLjUkIA0KLSAoU2tld2VkIExlZnQpVmlzdWFsOiBUaGUgZ3JhcGggb24gdGhlIHJpZ2h0Lg0KLSBPYnNlcnZhdGlvbjogVGhlIGhpc3RvZ3JhbSBwZWFrIHNoaWZ0cyB0byB0aGUgcmlnaHQsIHBpbGluZyB1cCBuZWFyIHRoZSB2YWx1ZSAkbiQgKGxhcmdlIG51bWJlciBvZiBzdWNjZXNzZXMpLiBUaGUgdGFpbCBvZiB0aGUgY3VydmUgZXh0ZW5kcyB0byB0aGUgbGVmdCB0b3dhcmRzIHRoZSB2YWx1ZSAwLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB0aGUgcHJvYmFiaWxpdHkgb2Ygc3VjY2VzcyAoJHAkKSBpcyBncmVhdGVyIHRoYW4gdGhlIHByb2JhYmlsaXR5IG9mIGZhaWx1cmUsIG1ha2luZyB0aGUgbW9zdCBsaWtlbHkgb3V0Y29tZSBhIGhpZ2ggbnVtYmVyIG9mIHN1Y2Nlc3Nlcy4NCg0KIyMg8J+MmSA0LiBOb3JtYWwgQXBwcm94aW1hdGlvbiB0byBCaW5vbWlhbA0KDQpBcyB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBvZiB0cmlhbHMgKCRuJCkgaW5jcmVhc2VzLCB0aGUgc2hhcGUgb2YgdGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbiBiZWNvbWVzIGluY3JlYXNpbmdseSBzaW1pbGFyIHRvIHRoZSBiZWxsIGN1cnZlIG9mIHRoZSBOb3JtYWwgRGlzdHJpYnV0aW9uLjxicj4NCi0gQXBwcm94aW1hdGlvbiBDb25kaXRpb246IE5vcm1hbCBBcHByb3hpbWF0aW9uIHRvIEJpbm9taWFsIGNhbiBiZSB1c2VkICh0byBzaW1wbGlmeSBjYWxjdWxhdGlvbnMpIGlmIGJvdGggb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6PGJyPg0KMS4NCiQkbiBcY2RvdCBwIFxnZSAxMCQkDQoyLg0KJCRuIFxjZG90ICgxLXApIFxnZSAxMCQkDQoNClZpc3VhbGl6YXRpb24gb2YgTnVtYmVyIG9mIFRyaWFscyAoJG4kKSBJbmZsdWVuY2U6DQo8aW1nIGlkPSJGb3RvIiBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ib21hc3MxMTE2Ly4uLi9tYWluL2hpc3RvZ3JhbS5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQpbQ2xpY2sgaWYgSW1hZ2UgZG9lcyBub3QgYXBwZWFyXShodHRwczovLzFkcnYubXMvaS9jLzFhZDFmNTNiZjhhY2E4ZGUvRVNQbXZRMWo5RUZKck9FV3AxOWZCVndCaF9CbVVoNjIzMHlVcjNNVG5sOXFVdz9lPTRJakl4eil7IHdpZHRoPTUwJSB9DQoNCjEuIFNtYWxsICRuJCAoZS5nLiwgJG49NSwgcD0wLjUkKQ0KLSBSZXByZXNlbnRhdGlvbjogVGhlIGZpcnN0IGdyYXBoIGF0IHRoZSB0b3AuDQotIE9ic2VydmF0aW9uOiBUaGUgaGlzdG9ncmFtIChibHVlIGJhcnMpIGxvb2tzIGRpc2NyZXRlIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiBoZWlnaHQgYmV0d2VlbiBiYXJzIGlzIHNpZ25pZmljYW50LiBUaGUgTm9ybWFsIGN1cnZlIChyZWQgbGluZSkgbG9va3MgdmVyeSB3aWRlIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yIG1vZGVsaW5nIHRoaXMgQmlub21pYWwgaGlzdG9ncmFtLg0KLSBWYWxpZGl0eTogJG4gXGNkb3QgcCA9IDUgXGNkb3QgMC41ID0gMi41JC4gU2luY2UgJDIuNSA8IDEwJCwgdGhlIGFwcHJveGltYXRpb24gaXMgaW52YWxpZC4NCg0KMi4gTWVkaXVtICRuJCAoZS5nLiwgJG49MjAsIHA9MC41JCkNCi0gUmVwcmVzZW50YXRpb246IFRoZSBtaWRkbGUgZ3JhcGguDQotIE9ic2VydmF0aW9uOiBUaGUgaGlzdG9ncmFtIGlzIHN0YXJ0aW5nIHRvIGJlY29tZSBzeW1tZXRyaWNhbCBhbmQgc2hvd3MgYSBiZWxsIHNoYXBlLiBUaGUgTm9ybWFsIGN1cnZlIGlzIHN0YXJ0aW5nIHRvIGVuY29tcGFzcyB0aGUgaGlzdG9ncmFtIGJhcnMgYmV0dGVyLg0KLSBWYWxpZGl0eTogJG4gXGNkb3QgcCA9IDIwIFxjZG90IDAuNSA9IDEwJC4gU2luY2UgJDEwIFxnZSAxMCQsIHRoZSBhcHByb3hpbWF0aW9uIGNvbmRpdGlvbiBpcyBiZWdpbm5pbmcgdG8gYmUgbWV0LiBUaGlzIGFwcHJveGltYXRpb24gY2FuIHN0YXJ0IHRvIGJlIHVzZWQsIGFsdGhvdWdoIGFjY3VyYWN5IG1heSBuZWVkIGltcHJvdmVtZW50ICh1c3VhbGx5IHJlcXVpcmluZyBjb250aW51aXR5IGNvcnJlY3Rpb24pLg0KDQozLiBMYXJnZSAkbiQgKGUuZy4sICRuPTUwLCBwPTAuNSQpDQotIFJlcHJlc2VudGF0aW9uOiBUaGUgYm90dG9tIGdyYXBoLg0KLSBPYnNlcnZhdGlvbjogVGhlIGhpc3RvZ3JhbSBiZWNvbWVzIHZlcnkgZGVuc2UgYW5kIHNtb290aC4gVGhlIG1pZHBvaW50IG9mIGVhY2ggaGlzdG9ncmFtIGJhciBhbG1vc3QgZmFsbHMgcGVyZmVjdGx5IG9uIHRvcCBvZiB0aGUgTm9ybWFsIERpc3RyaWJ1dGlvbiBiZWxsIGN1cnZlLg0KLSBWYWxpZGl0eTogJG4gXGNkb3QgcCA9IDUwIFxjZG90IDAuNSA9IDI1JC4gU2luY2UgJDI1IFxnZSAxMCQsIHRoZSBhcHByb3hpbWF0aW9uIGlzIGhpZ2hseSB2YWxpZCBhbmQgeWllbGRzIHZlcnkgYWNjdXJhdGUgcmVzdWx0cy4gVGhpcyBpcyB0aGUgcGVyZmVjdCB2aXN1YWxpemF0aW9uIG9mIHRoZSBOb3JtYWwgQXBwcm94aW1hdGlvbiB0byBCaW5vbWlhbC4NCg0KIyBDb25jbHVzaW9uDQoNCjxkaXYgY2xhc3M9InBhc3RlbC1ib3giPg0KICA8ZGl2IGNsYXNzPSJwYXN0ZWwtdGl0bGUiPjwvZGl2Pg0KICA8cD5UaGUgbWF0ZXJpYWwgaW4gdGhlc2Ugc2l4IHZpZGVvcyBpcyB0aGUgYmFja2JvbmUgdGhhdCBzdHJlbmd0aGVucyBvdXIgdW5kZXJzdGFuZGluZyBvZiB1bmNlcnRhaW50eS4gSW4gRGF0YSBTY2llbmNlLCBldmVyeXRoaW5nIGlzIGJhc2VkIG9uIHByb2JhYmlsaXR5LiBCeSBtYXN0ZXJpbmcgUHJvYmFiaWxpdHkgYW5kIHRoZSBCaW5vbWlhbCBEaXN0cmlidXRpb24sIHdlIGhhdmUgdGhlIG1hdGhlbWF0aWNhbCBsb2dpYyBmb3VuZGF0aW9uIHRvIGJ1aWxkLCB0ZXN0LCBhbmQgdHJ1c3QgYWxsIHByZWRpY3Rpb24gbW9kZWxzIGFuZCBjb25jbHVzaW9ucyB3ZSBtYWtlLg0KPC9wPg0KICA8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtc2l6ZToxLjRlbTsgZm9udC13ZWlnaHQ6Ym9sZDsiPjwvcD4NCjwvZGl2Pg0KDQojIyDwn5OLIDEuIFN1bW1hcnkgb2YgNiBLZXkgVG9waWNzDQoNCjEuIEZ1bmRhbWVudGFsIENvbmNlcHRzPGJyPg0KSW50cm9kdWN0aW9uIHRvIHRoZSBiYXNpY3Mgb2YgcHJvYmFiaWxpdHkgKHNhbXBsZSBzcGFjZSwgZXZlbnRzLCBjaGFuY2UvbGlrZWxpaG9vZCkuDQoyLiBJbmRlcGVuZGVudCAmIERlcGVuZGVudCBFdmVudHM8YnI+DQpVbmRlcnN0YW5kaW5nIHdoZXRoZXIgdGhlIG91dGNvbWUgb2Ygb25lIGV2ZW50IGFmZmVjdHMgdGhlIHByb2JhYmlsaXR5IG9mIGFub3RoZXIuDQozLiBVbmlvbiBvZiBFdmVudHM8YnI+DQpSdWxlcyBmb3IgY2FsY3VsYXRpbmcgdGhlIHByb2JhYmlsaXR5IG9mIG9uZSBvciBtb3JlIGV2ZW50cyBvY2N1cnJpbmcgKCRQKEEgXHRleHR7IG9yIH0gQikkKS48YnI+DQo0LiBFeGNsdXNpdmUgJiBFeGhhdXN0aXZlIEV2ZW50czxicj4NCkNsYXNzaWZpY2F0aW9uIG9mIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBldmVudHMuIEZvciBleGFtcGxlLCBtdXR1YWxseSBleGNsdXNpdmUgZXZlbnRzIG1lYW4gYm90aCBjYW5ub3Qgb2NjdXIgc2ltdWx0YW5lb3VzbHkuPGJyPg0KNS4gQmlub21pYWwgRXhwZXJpbWVudDxicj4NCkRlZmluaW5nIHRoZSBjb25kaXRpb25zIGZvciBhIHRyaWFsIHRvIGhhdmUgaXRzIHByb2JhYmlsaXR5IGNhbGN1bGF0ZWQgdXNpbmcgdGhlIEJpbm9taWFsIGZvcm11bGEgKGUuZy4sIG9ubHkgdHdvIG91dGNvbWVzOiBzdWNjZXNzL2ZhaWx1cmUsIGFuZCB0cmlhbHMgYXJlIHJlcGVhdGVkIGluZGVwZW5kZW50bHkpLjxicj4NCjYuIEJpbm9taWFsIERpc3RyaWJ1dGlvbjxicj4NCkFwcGxpY2F0aW9uIHRvb2wgZm9yIGNhbGN1bGF0aW5nIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnRhaW5pbmcgYSBzcGVjaWZpYyBudW1iZXIgb2Ygc3VjY2Vzc2VzIGluIGEgZml4ZWQgbnVtYmVyIG9mIHRyaWFscyB0aGF0IHNhdGlzZnkgdGhlIEJpbm9taWFsIGNvbmRpdGlvbnMuDQoNCiMjIPCfk4sgMi4gSW50ZXJjb25uZWN0aW9uIChMb2dpY2FsIFByb2dyZXNzaW9uKQ0KDQpUaGUgaW50ZXJyZWxhdGlvbiBhbW9uZyB0aGVzZSBzaXggdmlkZW9zIGlzIGEgcHJvZ3Jlc3Npb24gZnJvbSB0aGUgbW9zdCBiYXNpYyBydWxlcyB0byB0aGUgdXNlIG9mIGEgc3BlY2lmaWMgbW9kZWwgdG9vbDoNCg0KMS4gTG9naWNhbCBGb3VuZGF0aW9uIChWMS1WNCk8YnI+DQpWaWRlb3MgMSB0byA0IGZvcm0gdGhlIHBoaWxvc29waGljYWwgYW5kIG1hdGhlbWF0aWNhbCBiYXNpcyBvZiBwcm9iYWJpbGl0eS4gV2UgbXVzdCB1bmRlcnN0YW5kIHdoYXQgcHJvYmFiaWxpdHkgaXMsIGhvdyBldmVudHMgaW5mbHVlbmNlIGVhY2ggb3RoZXIgKFYyIC0gSW5kZXBlbmRlbnQgYW5kIERlcGVuZGVudCksIGFuZCBob3cgdG8gY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHVuaW9uIChWMyAtIFVuaW9uKSBiZWZvcmUgd2UgY2FuIGdvIGZ1cnRoZXIuIFRoZSBjb25jZXB0cyBpbiBWNCAoRXhjbHVzaXZlIGFuZCBFeGhhdXN0aXZlKSBoZWxwIHVzIGNsYXNzaWZ5IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBldmVudHMuPGJyPg0KMi4gTW92aW5nIFRvd2FyZHMgQXBwbGljYXRpb24gKFY1KTxicj4NClRoZSBjb25jZXB0cyBmcm9tIFYxLVY0IGFyZSB1c2VkIHRvIGVzdGFibGlzaCB0aGUgY29uZGl0aW9ucyBvZiBhIHRyaWFsLiBWaWRlbyA1IChCaW5vbWlhbCBFeHBlcmltZW50KSB0ZWFjaGVzIHVzIGhvdyB0byBpZGVudGlmeSByZWFsLXdvcmxkIHNpdHVhdGlvbnMgdGhhdCBzYXRpc2Z5IGFsbCB0aG9zZSBiYXNpYyBwcm9iYWJpbGl0eSBydWxlcyAoZS5nLiwgdGhlIG91dGNvbWUgb2YgZWFjaCBjb2luIHRvc3MgaXMgaW5kZXBlbmRlbnQsIGNvbnNpc3RlbnQgd2l0aCBWMikuIFRoaXMgaXMgdGhlIHN0YWdlIG9mIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIEJpbm9taWFsIG1vZGVsIGNhbiBiZSB1c2VkLjxicj4NCjMuIFVzaW5nIHRoZSBUb29sIChWNik8YnI+DQpPbmNlIHdlIGFyZSBjb25maWRlbnQgdGhhdCB0aGUgc2l0dWF0aW9uIG1lZXRzIHRoZSBjb25kaXRpb25zIChWNSksIHdlIHRoZW4gdXNlIHRoZSBCaW5vbWlhbCBEaXN0cmlidXRpb24gKFY2KSB0byBjYWxjdWxhdGUgc3BlY2lmaWMgcHJvYmFiaWxpdGllcyAoZS5nLiwgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgZ2V0dGluZyA3IHN1Y2Nlc3NlcyBvdXQgb2YgMTAgdHJpYWxzKS4gVGhpcyBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZGl0aW9ucyBsZWFybmVkIGluIFYxLVY1LihCYXNpYyBQcm9iYWJpbGl0eSBSdWxlcyAoVjEtVjQpIHZhbGlkYXRlIHRoZSBUcmlhbCBDb25kaXRpb25zIChWNSksIHdoaWNoIHRoZW4gYWxsb3dzIHVzIHRvIHVzZSB0aGUgTW9kZWwgKFY2KSBmb3IgcHJlZGljdGlvbi4pDQoNCiMjIPCfk4szLiBJbXBhY3Qgb2YgVGhpcyBNYXRlcmlhbCBvbiBTdGF0aXN0aWNzIExlYXJuaW5nIGluIERhdGEgU2NpZW5jZQ0KDQpBIGRlZXAgdW5kZXJzdGFuZGluZyBvZiBQcm9iYWJpbGl0eSBUaGVvcnksIGVzcGVjaWFsbHkgdGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbiwgaXMgY3J1Y2lhbCBiZWNhdXNlIGl0IGlzIHRoZSBmb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBJbmZlcmVuY2UgYW5kIEJpbmFyeSBEYXRhIE1vZGVsaW5nIChzdWNjZXNzL2ZhaWx1cmUgb3V0Y29tZXMpIGluIERhdGEgU2NpZW5jZS4NCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWFncml0dHIpICAgIyBvcHRpb25hbCwgYnV0IHNhZmUNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KdGFiZWxfZGFtcGFrIDwtIGRhdGEuZnJhbWUoDQogIFBvc2l0aXZlX0ltcGFjdCA9IGMoDQogICAgIlVuZGVyc3RhbmRpbmcgQS9CIFRlc3RpbmciLA0KICAgICJGb3VuZGF0aW9uIGZvciBDbGFzc2lmaWNhdGlvbiBNb2RlbHMiLA0KICAgICJWYWxpZGF0aW9uIGFuZCBQLVZhbHVlIiwNCiAgICAiQmFzaXMgZm9yIFNhbXBsaW5nIg0KICApLA0KICBFYXN5X0V4cGxhbmF0aW9uID0gYygNCiAgICAiVGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbiBpcyB0aGUgcHJpbWFyeSB0b29sIGluIEEvQiBUZXN0aW5nLi4uIiwNCiAgICAiTWFueSBEYXRhIFNjaWVuY2UgcHJvYmxlbXMgYXJlIGJpbmFyeSBjbGFzc2lmaWNhdGlvbi4uLiIsDQogICAgIlRoaXMgY29uY2VwdCBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gaHlwb3RoZXNpcyB0ZXN0aW5nIGFuZCBwLXZhbHVlLi4uIiwNCiAgICAiSW5kZXBlbmRlbnQgYW5kIERlcGVuZGVudCBjb25jZXB0cyBhcmUgY3J1Y2lhbCBmb3IgdmFsaWQgc2FtcGxlcy4uLiINCiAgKQ0KKQ0KDQp0YWJlbF9kYW1wYWsgJT4lDQogIGthYmxlKCJodG1sIiwgZXNjYXBlID0gRkFMU0UsDQogICAgICAgIGNhcHRpb24gPSAi4pyoIFBvc2l0aXZlIEltcGFjdCBvZiB0aGUgQmlub21pYWwgRGlzdHJpYnV0aW9uIOKcqCIpDQpgYGANCg0KIyBSZWZlcmVuY2VzDQoNCjxkaXYgY2xhc3M9InBhc3RlbC1ib3giPg0KICA8ZGl2IGNsYXNzPSJwYXN0ZWwtdGl0bGUiPjwvZGl2Pg0KICA8cD4NCi0gaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2ludHJvX3N0YXRpc3RpY3MvMDYtRXNzZW50aWFsc19vZl9Qcm9iYWJpbGl0eS5odG1sDQotIGh0dHBzOi8veW91dHUuYmUveW5qSEtCQ2lHWFkgKEZ1bmRhbWVudGFsIENvbmNlcHQpDQotIGh0dHBzOi8veW91dHUuYmUvTFMtX2loREtyMk0gKEluZGVwZW5kZW50IGFuZCBEZXBlbmRlbnQpDQotIGh0dHBzOi8veW91dHUuYmUvdnFLQWJoQ3FTVGMgKFVuaW9uIG9mIEV2ZW50cykNCi0gaHR0cHM6Ly95b3V0dS5iZS9mN2FnVHY5bkE1ayAoRXhjbHVzaXZlIGFuZCBFeGhhdXN0aXZlKQ0KLSBodHRwczovL3lvdXR1LmJlL25SdVFBdGFqSllrIChCaW5vbWlhbCBFeHBlcmltZW50KQ0KLSBodHRwczovL3lvdXR1LmJlL1kyLXZTV0ZtZ3lJIChCaW5vbWlhbCBEaXN0cmlidXRpb24pDQotIGh0dHBzOi8vZ2VtaW5pLmdvb2dsZS5jb20vYXBwDQotIGh0dHBzOi8vY2hhdGdwdC5jb20vDQotIFdhbHBvbGUsIFJvbmFsZCBFLiwgUmF5bW9uZCBILiBNeWVycywgYW5kIFNoYXJvbiBMLiBNeWVycy48YnI+DQpQcm9iYWJpbGl0eSBhbmQgU3RhdGlzdGljcyBmb3IgRW5naW5lZXJzIGFuZCBTY2llbnRpc3RzLiBbaHR0cHM6Ly9ib29rcy5nb29nbGUuY29tL2Jvb2tzL2Fib3V0L1Byb2JhYmlsaXR5X1N0YXRpc3RpY3NfZm9yX0VuZ2luZWVyc19TY2kuaHRtbD9pZD10QXM1MGJwZVg5b0NdIChBZGRlZCBhcyBhIGNvcmUgcmVmZXJlbmNlIGZvciBwcm9iYWJpbGl0eSBhbmQgZGlzdHJpYnV0aW9ucy4pDQotIEZyZXVuZCwgSm9obiBFLjxicj4NCk1hdGhlbWF0aWNhbCBTdGF0aXN0aWNzLiBbaHR0cHM6Ly93d3cucHJvYmFiaWxpdHljb3Vyc2UuY29tL10gKEFkZGVkIGFzIGEgY29yZSByZWZlcmVuY2UgZm9yIHRoZW9yZXRpY2FsIHN0YXRpc3RpY3MuKQ0KLSBIb2dnLCBSb2JlcnQgVi4sIEpvc2VwaCBXLiBNY0tlYW4sIGFuZCBBbGxlbiBULiBDcmFpZy48YnI+DQpJbnRyb2R1Y3Rpb24gdG8gTWF0aGVtYXRpY2FsIFN0YXRpc3RpY3MuIFtodHRwczovL29wZW5saWJyYXJ5LnRlbGtvbXVuaXZlcnNpdHkuYWMuaWQvaG9tZS9jYXRhbG9nL2lkLzE1MTAzMS9zbHVnL2ludHJvZHVjdGlvbi10by1tYXRoZW1hdGljYWwtc3RhdGlzdGljcy5odG1sXSAoQWRkZWQgYXMgYSBjb3JlIHJlZmVyZW5jZSBmb3IgdGhlb3JldGljYWwgc3RhdGlzdGljcywgYWx0ZXJuYXRpdmUgdG8gRnJldW5kLikNCi0gU3BpZWdlbCwgTXVycmF5IFIuLCBhbmQgTGFycnkgSi4gU3RlcGhlbnMuPGJyPg0KU2NoYXVtJ3MgT3V0bGluZSBvZiBUaGVvcnkgYW5kIFByb2JsZW1zIG9mIFN0YXRpc3RpY3MuIFtodHRwczovL2FueWZsaXAuY29tL2xqam1oL2NnbnIvYmFzaWNdIChBZGRlZCBhcyBhIHN1cHBsZW1lbnRhcnkgcmVmZXJlbmNlIGZvciBwcm9ibGVtcyBhbmQgdGhlb3J5LikNCjwvcD4NCiAgPHAgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyBmb250LXNpemU6MS40ZW07IGZvbnQtd2VpZ2h0OmJvbGQ7Ij48L3A+DQo8L2Rpdj4NCg==