# 0) Packages
library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(broom)
library(stringr)
library(forcats)
# clustering helpers
library(factoextra) # visualization + elbow/silhouette
library(cluster) # silhouette
# 1) File path
excel_path <- "UNO Survey Responses v4.xlsx"
# --------------------------------------------------
# UNO theme colors (brown / mustard / cream)
# --------------------------------------------------
# Primary bar color for simple count charts
primary_fill <- "#A8743A" # warm brown
primary_fill_light <- "#C09A6B"
neutral_cream <- "#FBF6EC"
text_brown <- "#5B3A29"
# Likert 1–5 (UNO Q1)
likert_colors <- c(
"1" = "#F2ECE4",
"2" = "#E3D5C3",
"3" = "#C9A77D",
"4" = "#A8743A",
"5" = "#7A4A1E"
)
# Likert 1–7 (UNO Q2)
likert7_colors <- c(
"1" = "#F5EFE8",
"2" = "#E9DDCF",
"3" = "#D8C1A3",
"4" = "#C09A6B",
"5" = "#A8743A",
"6" = "#8B5A2B",
"7" = "#6A3E1E"
)
# Comparative (UNO Q3)
eval_colors <- c(
"Very Bad" = "#EFE6DC",
"Bad" = "#E0CDB8",
"Same" = "#C7B299",
"Good" = "#A8743A",
"Very Good" = "#7A4A1E"
)
. Project
Background
(MDP / MRP / Research Questions)
Management Decision
Problem (MDP)
UNO aims to increase its market share in Türkiye and must decide
between two growth paths:
-
Market penetration: Strengthening traditional packaged
breads.
-
Product development: Launching an international/premium
bread line (e.g., brioche).
Marketing Research
Problem (MRP)
This research aims to identify which strategic direction—market
penetration or product development—better aligns with consumer behavior,
brand perception, and current market dynamics in Türkiye.
Research Questions
& Hypotheses
We focus on consumer behavior, unmet needs, trial intent, segment
differences, and UNO brand equity fit.
Key hypotheses include:
- H1 (Penetration): Purchase frequency can increase
if UNO improves freshness, pricing, and availability.
- H2 (Product Development): Consumers perceive
packaged breads as similar; differentiated products (brioche) may
satisfy novelty needs.
- H3 (Product Development): Younger/urban consumers
have higher adoption potential for international-style breads.
- H4 (Brand Equity): UNO is strongly linked to
traditional breads, but can extend to premium through branding and
packaging.
. Research Design &
Data Sources
We use a mixed-method design: exploratory (focus group + expert
interview) followed by a descriptive online survey and a conjoint-style
rating experiment.
Qualitative
Insights
Focus group insights highlight:
- Concerns about additives/shelf life,
- Packaging smell/material issues,
- Emotional connection to traditional white bread,
- Brioche as taste/experience (not daily health choice),
- Trial triggers: tasting, novelty, social media virality, “not found
in bakeries”.
Expert (dietitian) interview highlights:
- Consumers struggle to find “clean-label + fresh” bread,
- Brioche is an indulgence means pleasure driven consumption (weekend
breakfasts, guests/snacking),
- Core trial triggers: ingredient quality and taste,
- UNO is perceived as a reliable everyday brand (more
traditional).
. Data Import (Survey
Summaries + Conjoint)
Survey data were collected via Google Forms and exported to Excel.
The dataset was then reorganized into multiple sheets representing
demographic summaries, behavioral questions, and UNO brand evaluation
questions. In addition, a separate sheet contains the conjoint
experiment data used for regression analysis.
For clarity, the data import and preprocessing code is hidden in this
report, while all analytical results and visualizations are shown and
discussed.
read_summary_sheet <- function(path, sheet_name) {
raw <- read_excel(path, sheet = sheet_name, col_names = FALSE)
header_row <- which(apply(raw, 1, function(x) any(str_detect(as.character(x), "^Count$"))))[1]
if (is.na(header_row)) header_row <- 1
df <- raw[(header_row):nrow(raw), ]
colnames(df) <- as.character(df[1, ])
df <- df[-1, ] %>% as.data.frame()
if ("Count" %in% names(df)) {
df$Count <- as.numeric(df$Count)
}
df
}
# Demographics (Option/Count)
# Category behavior (Option/Count)
# UNO questions (grid counts)
# Conjoint (individual-level)
ageData <- read_summary_sheet(excel_path, "Age")
incomeData <- read_summary_sheet(excel_path, "Income")
genderData <- read_summary_sheet(excel_path, "Gender")
educationData <- read_summary_sheet(excel_path, "Education")
usageOccasion <- read_summary_sheet(excel_path, "Bread Usage Occasion")
trialMotives <- read_summary_sheet(excel_path, "Premium_Bread_Trial_Motivation")
purchaseSev <- read_summary_sheet(excel_path, "Purchase Severity")
briochePurch <- read_summary_sheet(excel_path, "Brioche Purchasing")
uno_q1 <- read_excel(excel_path, sheet = "UNO Question1")
uno_q2 <- read_excel(excel_path, sheet = "UNO Question2")
uno_q3 <- read_excel(excel_path, sheet = "UNO Question3")
conjoint <- read_excel(excel_path, sheet = "Conjoint_Long")
survey_full <- read_excel(excel_path, sheet = "Form Responses 1")
. Sample Profile
(Demographics)
Age Distribution
ggplot(ageData, aes(x = .data[[names(ageData)[1]]], y = Count)) +
geom_col(fill = primary_fill) +
labs(title = "Age Distribution", x = "Age Range", y = "Number of Respondents") +
theme_minimal()

Gender / Education /
Income
plot_count_bar <- function(df, title, xlab) {
ggplot(df, aes(x = .data[[names(df)[1]]], y = Count)) +
geom_col(fill = primary_fill) +
labs(title = title, x = xlab, y = "Number of Respondents") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 20, hjust = 1))
}
plot_count_bar(genderData, "Gender Distribution", "Gender")

plot_count_bar(educationData, "Education Distribution", "Education")

plot_count_bar(incomeData, "Income Distribution", "Income Range")

Profile
Summary
The respondent profile is concentrated in the 25–54 age range with a
female-majority sample. Education levels are primarily Bachelor’s and
Master’s, and a substantial share of respondents fall into higher-income
brackets. Overall, the sample reflects urban, economically active
consumers who are relevant for evaluating premium packaged bread
positioning.
. Category Behavior
Findings
Bread Usage
Occasion
plot_count_bar(usageOccasion, "When Do Consumers Use Packaged Bread?", "Occasion")

Interpretation:
-
The top occasions indicate whether packaged bread is mainly used for
daily convenience vs special moments.
-
Use this to connect to the focus group’s “daily habits + freshness”
themes.
Motivation to Try a
New Premium Bread
plot_count_bar(trialMotives, "Top Motivations to Try Premium Packaged Bread", "Motivation")

Key Insight – Motivation to Try
Premium Packaged Bread
Premium or organic-looking packaging is the strongest motivation for
trying a premium packaged bread, followed closely by the availability of
unique or differentiated varieties. In contrast, viral social media
promotion plays a relatively minor role, while free sampling has a
moderate but secondary impact.
These findings suggest that consumers associate premium bread
primarily with tangible quality cues—such as packaging and product
differentiation—rather than promotional hype. Therefore, premium
positioning should emphasize packaging design, ingredient quality, and
variety, supported by in-store visibility rather than relying heavily on
social media virality.
Purchase
Severity
purchaseSev <- purchaseSev %>%
mutate(pct = round(100 * Count / sum(Count), 1)) %>%
arrange(desc(Count))
purchaseSev
purchaseSev %>%
mutate(Purchase_Severity = fct_reorder(Purchase_Severity, Count)) %>%
ggplot(aes(x = Purchase_Severity, y = Count)) +
geom_col(fill = primary_fill) +
geom_text(aes(label = paste0(pct, "%")), vjust = -0.3, size = 3) +
labs(
title = "Purchase Severity (Category Engagement)",
x = "Purchase Frequency / Severity",
y = "Number of Respondents"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 20, hjust = 1))

Interpretation:
The purchase severity distribution indicates the overall intensity of
packaged bread consumption in our sample. This is important because it
frames whether demand is driven by daily routines (supporting market
penetration) or whether premium and specialty products would remain
niche (supporting a more targeted product development strategy).
International Bread
Usage Purpose
briochePurch <- briochePurch %>%
mutate(pct = round(100 * Count / sum(Count), 1)) %>%
arrange(desc(Count))
briochePurch
briochePurch %>%
mutate(International_Bread_Usage_Purpose =
fct_reorder(International_Bread_Usage_Purpose, Count)) %>%
ggplot(aes(x = International_Bread_Usage_Purpose, y = Count)) +
geom_col(fill = primary_fill) +
geom_text(aes(label = paste0(pct, "%")), vjust = -0.3, size = 3) +
labs(
title = "Why Consumers Eat International Breads (Brioche/Baguette)",
x = "Usage Purpose",
y = "Number of Respondents"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 20, hjust = 1))

Interpretation:
International breads (e.g., brioche/baguette) are consumed mainly for
specific occasions rather than as a daily staple. This aligns with our
qualitative findings that brioche is often seen as an indulgent or
“special moment” product (e.g., weekend breakfasts, guests, snacking),
suggesting that a premium/international line would likely be an
adjacent growth opportunity rather than a replacement for core
daily breads.
. UNO Question 1 —
Brand Perceptions
q1_item <- names(uno_q1)[1] # first column = statement name (e.g., High_Quality)
uno_q1_long <- uno_q1 %>%
pivot_longer(cols = where(is.numeric),
names_to = "Scale",
values_to = "Count") %>%
mutate(Scale = as.factor(Scale))
ggplot(uno_q1_long, aes(x = Scale, y = Count, fill = Scale)) +
geom_col(width = 0.7) +
facet_wrap(~ UNO_Agreement_Level, scales = "free_y") +
scale_fill_manual(values = likert_colors) +
labs(
title = "UNO Brand Perceptions (1 = Low, 5 = High)",
x = "Agreement Level",
y = "Number of Respondents"
) +
theme_minimal(base_size = 11) +
theme(
legend.position = "bottom",
strip.text = element_text(face = "bold"),
plot.title = element_text(face = "bold")
)

q1_topbox <- uno_q1_long %>%
group_by(.data[[q1_item]]) %>%
summarise(
total = sum(Count, na.rm=TRUE),
topbox_4_5 = sum(Count[Scale %in% c("4","5")], na.rm=TRUE),
topbox_pct = round(100 * topbox_4_5 / total, 1),
.groups = "drop"
) %>%
arrange(desc(topbox_pct))
q1_topbox
UNO Brand Perceptions — Key
Insights:
-
Strongest association: New Product Success (55.4%)
-
Solid core strengths: Reliable Everyday (45.8%), Value
for Money (42.2%), Healthy Trust (41.0%)
-
Weaker perceptions: Premium Brand (32.5%), Attractive
Packaging (31.3%)
Overall, respondents believe that UNO can successfully develop new
products and perceive it as a reliable everyday brand offering
reasonable value and health-related trust. However, premium brand
perception and packaging attractiveness are relatively weaker. This
suggests that while UNO has the credibility to launch a premium line,
premium cues—particularly packaging design and positioning—must be
strengthened to justify higher pricing.
. UNO Question 2 —
Action Likelihood for Premium Bread
q2_item <- names(uno_q2)[1]
uno_q2_long <- uno_q2 %>%
pivot_longer(
cols = where(is.numeric),
names_to = "Scale",
values_to = "Count"
) %>%
mutate(Scale = as.factor(Scale))
ggplot(uno_q2_long, aes(x = Scale, y = Count, fill = Scale)) +
geom_col(width = 0.7) +
facet_wrap(as.formula(paste("~", q2_item)), scales = "free_y") +
scale_fill_manual(values = likert7_colors) +
labs(
title = "Likelihood of Actions if UNO Launches Premium Bread (1 = Low, 7 = High)",
x = "Likelihood Level",
y = "Number of Respondents"
) +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")

q2_topbox <- uno_q2_long %>%
group_by(.data[[q2_item]]) %>%
summarise(
total = sum(Count, na.rm=TRUE),
topbox_6_7 = sum(Count[Scale %in% c("6","7")], na.rm=TRUE),
topbox_pct = round(100 * topbox_6_7 / total, 1),
.groups = "drop"
) %>%
arrange(desc(topbox_pct))
q2_topbox
Behavioral Intentions — Funnel
Interpretation:
The strongest intention is trying UNO’s premium bread at least once,
indicating high trial potential. In contrast, willingness to pay a
premium price is more moderate and purchase-on-promotion appears
important, suggesting price sensitivity. Following product announcements
online is low, implying that awareness-building may work better through
in-store visibility, packaging, and sampling rather than relying on
consumers actively tracking updates online.
Managerial Interpretation:
Trial intention for a premium UNO bread is high, indicating strong
curiosity and openness among consumers. However, willingness to pay a
higher price is more moderate, and buying on promotion appears
important. This suggests that premium adoption will depend on clear
value communication and controlled pricing rather than purely
brand-driven willingness to pay.
. UNO Question 3 —
Comparative UNO Ratings
q3_item <- names(uno_q3)[1] # attribute name column (Taste, Freshness, etc.)
uno_q3_long <- uno_q3 %>%
pivot_longer(cols = -all_of(q3_item),
names_to = "Evaluation",
values_to = "Count") %>%
mutate(Evaluation = factor(Evaluation, levels = c("Very Bad","Bad","Same","Good","Very Good")))
ggplot(uno_q3_long, aes(x = Evaluation, y = Count, fill = Evaluation)) +
geom_col(width = 0.7) +
facet_wrap(~ Comparative_UNO_Ratings, scales = "free_y") +
scale_fill_manual(values = eval_colors) +
labs(
title = "UNO vs Other Bread Brands (Comparative Evaluation)",
x = "Evaluation",
y = "Number of Respondents"
) +
theme_minimal(base_size = 11) +
theme(
legend.position = "bottom",
strip.text = element_text(face = "bold"),
plot.title = element_text(face = "bold")
)

Comparative Evaluation:
This section evaluates how UNO performs relative to other packaged
bread brands across key attributes such as taste, freshness, price,
packaging, healthiness, availability, innovativeness, and premium feel.
Overall, UNO performs strongly on core functional attributes. Taste and
availability receive a high concentration of “Good” and “Very Good”
ratings, indicating that consumers perceive UNO as competitive or
superior to other brands in everyday consumption contexts. Healthiness
also shows a favorable distribution, supporting earlier qualitative
insights that position UNO as a reliable and trusted option for daily
bread needs. In contrast, attributes related to premium
positioning—particularly premium feel and innovativeness—show a more
mixed distribution, with many respondents selecting “Same” rather than
“Good” or “Very Good.” This suggests that while UNO is not perceived as
weak in these dimensions, it is not yet clearly differentiated as a
premium or highly innovative brand compared to alternatives.
These results reinforce the interpretation that UNO’s current brand
strength lies in functional performance and reliability rather than
symbolic or premium differentiation. Consequently, any premium bread
extension would need to rely on stronger innovation signals, packaging
design, and product storytelling to shift consumer perceptions beyond
parity with existing brands.
. Conjoint
Regression
# Ensure categorical fields are treated as factors
conjoint <- conjoint %>%
mutate(
Bread_Type = as.factor(Bread_Type),
Slice_Type = as.factor(Slice_Type),
Package_Type = as.factor(Package_Type),
Price = as.factor(Price)
)
rating_model <- lm(Rating ~ Bread_Type + Slice_Type + Price + Package_Type, data = conjoint)
summary(rating_model)
##
## Call:
## lm(formula = Rating ~ Bread_Type + Slice_Type + Price + Package_Type,
## data = conjoint)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.3940 -1.4284 -0.2546 1.3089 4.8860
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.10782 0.17067 24.069 < 2e-16 ***
## Bread_TypeTraditional -0.01912 0.12146 -0.157 0.87496
## Bread_TypeWhole grain 0.38851 0.12146 3.199 0.00141 **
## Slice_TypeThick -0.29523 0.12207 -2.419 0.01570 *
## Slice_TypeThin -0.37151 0.12740 -2.916 0.00360 **
## Price150 TL -0.78767 0.15431 -5.105 3.74e-07 ***
## Price25 TL -0.10233 0.17102 -0.598 0.54969
## Price35 TL -0.17494 0.14914 -1.173 0.24098
## Price50 TL -0.35000 0.15710 -2.228 0.02604 *
## Package_TypePlastic Bag -0.89179 0.10087 -8.841 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.876 on 1484 degrees of freedom
## Multiple R-squared: 0.08997, Adjusted R-squared: 0.08446
## F-statistic: 16.3 on 9 and 1484 DF, p-value: < 2.2e-16
Conjoint Regression Results:
A rating-based conjoint regression was estimated to examine how
different product attributes influence overall bread ratings. The model
is statistically significant (F-test p < 0.001), indicating that the
included attributes collectively explain variation in consumer
preferences. While the R-squared value is modest, this is expected in
consumer preference data and does not limit the interpretability of
relative attribute effects.
The regression results reveal clear differences in how
consumers evaluate product attributes:
Bread Type: Whole grain bread has a positive and
statistically significant effect on ratings, indicating a strong
preference for healthier or more natural bread options. Traditional
bread does not significantly increase ratings relative to the reference
category.
Slice Type: Both thick and thin slice options
negatively affect ratings. This suggests that consumers prefer a
standard slice thickness and penalize deviations from it.
Price: Higher prices reduce ratings,
particularly at the extreme level (150 TL), which has a strong negative
effect. Lower price increases show weaker and mostly insignificant
effects, suggesting some tolerance at moderate price levels.
Package Type: Plastic packaging has the
strongest negative impact on ratings. This highlights packaging as a
critical driver of preference and suggests that plastic is perceived as
inconsistent with quality or premium positioning.
What Drives Consumer
Ratings for Packaged Bread?
coef_df <- tidy(rating_model) %>% filter(term != "(Intercept)")
ggplot(coef_df, aes(x = estimate, y = reorder(term, estimate))) +
geom_point(size = 3) +
geom_errorbarh(aes(xmin = estimate - 1.96*std.error, xmax = estimate + 1.96*std.error), height = 0.2) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(title = "Conjoint Regression: Effect of Attributes on Rating",
x = "Estimated impact on Rating", y = "Attribute level") +
theme_minimal()
## Warning: `geom_errorbarh()` was deprecated in ggplot2 4.0.0.
## ℹ Please use the `orientation` argument of `geom_errorbar()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `height` was translated to `width`.

Interpretation:
This analysis shows which product attributes matter most for consumer
ratings. Packaging and price have the strongest impact, while bread type
also plays an important role. High prices and plastic packaging reduce
product appeal, whereas healthier bread options increase ratings. These
results highlight the importance of premium packaging and disciplined
pricing in any premium UNO bread concept.
. Utility-Based
Segmentation Using Conjoint Results
To identify distinct preference-based consumer segments, we conducted
a cluster analysis using individual-level part-worth utilities derived
from the full-profile conjoint experiment. Each respondent’s utilities
capture how strongly different product attributes influence their
overall evaluations. These utilities were used as segmentation variables
to group respondents with similar preference structures. This approach
enables segmentation based purely on underlying preferences, independent
of demographics or stated attitudes.
# Conjoint long format
conjoint_long <- conjoint
# Ensure correct data types
conjoint_long <- conjoint_long %>%
mutate(
Bread_Type = as.factor(Bread_Type),
Slice_Type = as.factor(Slice_Type),
Package_Type = as.factor(Package_Type),
Price = as.factor(Price)
)
Estimate
Individual-Level Utilities
individual_utilities <- conjoint_long %>%
group_by(RespondentID) %>%
do(
tidy(
lm(Rating ~ Bread_Type + Slice_Type + Package_Type + Price, data = .)
)
) %>%
ungroup() %>%
filter(term != "(Intercept)") %>%
select(RespondentID, term, estimate) %>%
pivot_wider(names_from = term, values_from = estimate)
## Warning in summary.lm(x): essentially perfect fit: summary may be unreliable
## Warning in summary.lm(x): essentially perfect fit: summary may be unreliable
## Warning in summary.lm(x): essentially perfect fit: summary may be unreliable
## Warning in summary.lm(x): essentially perfect fit: summary may be unreliable
# Replace missing utilities with 0 (standard practice)
individual_utilities[is.na(individual_utilities)] <- 0
Each respondent gets their own regression → coefficients =
individual utilities.
utility_vars <- setdiff(names(individual_utilities), "RespondentID")
X <- individual_utilities %>%
select(all_of(utility_vars)) %>%
as.data.frame()
# Standardize utilities (critical for clustering)
X_scaled <- scale(X)
Decide Number of
Clusters
Elbow method
fviz_nbclust(X_scaled, kmeans, method = "wss") +
labs(title = "Elbow Method for Selecting Number of Preference Segments")

“Based on the elbow, a three-segment solution was selected.”
Run Cluster Analysis
(k-means)
set.seed(123)
k <- 3 # choose based on diagnostics
kmeans_fit <- kmeans(X_scaled, centers = k, nstart = 50)
individual_utilities <- individual_utilities %>%
mutate(Preference_Segment = factor(kmeans_fit$cluster))
# Segment sizes
individual_utilities %>% count(Preference_Segment)
Visualize
Segments
pca <- prcomp(X_scaled)
pca_df <- data.frame(
PC1 = pca$x[,1],
PC2 = pca$x[,2],
Segment = individual_utilities$Preference_Segment
)
ggplot(pca_df, aes(PC1, PC2, color = Segment)) +
geom_point(size = 2, alpha = 0.7) +
labs(
title = "Preference-Based Consumer Segments (Conjoint Utilities)",
x = "Principal Component 1",
y = "Principal Component 2"
) +
theme_minimal()

Segment Profile
segment_means <- individual_utilities %>%
group_by(Preference_Segment) %>%
summarise(across(all_of(utility_vars), mean), .groups = "drop")
segment_means
Identify What
Differentiates Each Segment
segment_long <- individual_utilities %>%
pivot_longer(
cols = all_of(utility_vars),
names_to = "Utility",
values_to = "Value"
) %>%
group_by(Preference_Segment, Utility) %>%
summarise(MeanUtility = mean(Value), .groups = "drop") %>%
arrange(Preference_Segment, desc(abs(MeanUtility)))
top_drivers <- segment_long %>%
group_by(Preference_Segment) %>%
slice_max(order_by = abs(MeanUtility), n = 6)
top_drivers
ggplot(top_drivers, aes(x = MeanUtility, y = reorder(Utility, MeanUtility))) +
geom_col() +
facet_wrap(~ Preference_Segment, scales = "free_y") +
labs(
title = "Key Preference Drivers by Segment",
x = "Mean Utility (Direction & Strength)",
y = "Attribute Level"
) +
theme_minimal()

Segmentation Results:
Using individual-level conjoint utilities, three distinct
preference-based segments were identified. The segments differ primarily
in their sensitivity to price, packaging type, and bread type.
One segment shows strong negative utilities for higher prices and
plastic packaging, indicating a group that is highly price-sensitive and
quality-conscious. A second segment places positive utility on whole
grain bread and non-plastic packaging, suggesting a health- and
quality-oriented preference structure that is receptive to premium
positioning. The third segment exhibits more moderate utilities across
attributes, reflecting a balanced preference structure without a
dominant driver.
These results demonstrate that the packaged bread market is not
homogeneous in terms of preferences. A premium UNO bread concept is
therefore likely to appeal more strongly to specific preference segments
rather than the entire market.
. Hypothesis
Evaluation
H1 (Market Penetration):
Supported. UNO is perceived as reliable, accessible, and competitive in
taste and healthiness. These attributes support continued penetration in
the core packaged bread market.
H2 (Product Development – Differentiation):
Partially supported. Consumers show strong willingness to try a premium
UNO bread, but premium perceptions are not yet well established.
Differentiation would require clear innovation and packaging cues.
H3 (Premium Adoption Potential):
Partially supported. While trial intent is high, sustained behaviors
such as weekly purchase and willingness to pay a higher price are more
moderate, suggesting selective rather than mass adoption.
H4 (Brand Stretch to Premium):
Conditionally supported. UNO has strong brand credibility, but premium
positioning is weaker. A premium extension is feasible if supported by
distinctive packaging, health-oriented positioning, and controlled
pricing.
. Managerial
Recommendation
This analysis identifies the product attributes that most strongly
influence consumer ratings and therefore should guide managerial
decision-making for a potential premium UNO bread launch.
The results clearly show that packaging type and price are
the most influential drivers of consumer evaluations. Plastic
packaging has the strongest negative effect on ratings, indicating that
consumers associate plastic packaging with lower quality and weaker
premium value. From a managerial perspective, this implies that any
premium positioning effort would be undermined if plastic packaging is
used, regardless of other product features.
Price sensitivity is also pronounced. While moderate price levels do
not significantly reduce ratings, higher price points—especially at the
upper end—lead to a substantial drop in consumer evaluations. This
suggests that consumers are open to paying more for premium bread, but
only within acceptable thresholds and when the premium value is clearly
communicated.
Bread type plays a secondary but meaningful role. Whole grain options
positively influence ratings, signaling that health-oriented positioning
can enhance perceived value. In contrast, traditional bread types do not
provide differentiation in a premium context.
Slice type has a relatively weak and negative impact on ratings,
indicating that it is not a primary decision factor for consumers. This
suggests that slice thickness should be treated as a hygiene attribute
rather than a strategic lever.
Overall, the findings suggest that a successful premium UNO bread
strategy should focus on non-plastic, premium
packaging, health-oriented bread types, and
carefully calibrated pricing. Investments in these
areas are likely to yield higher returns than changes to secondary
attributes such as slice type.
However, these attribute-level insights represent average effects
across consumers. In addition, the preference-based segmentation derived
from individual-level conjoint utilities indicates that these managerial
implications do not apply uniformly across all consumers. The analysis
reveals meaningful heterogeneity in how different segments evaluate
price, packaging, and product attributes.
Specifically, one segment exhibits strong price sensitivity and
places limited value on premium cues, suggesting that premium
positioning would be less effective for this group. For these consumers,
maintaining competitive pricing and reinforcing UNO’s role as a reliable
everyday bread brand remains critical.
In contrast, another segment shows a stronger positive response to
health-oriented bread types and non-plastic, premium packaging, while
demonstrating greater tolerance for higher prices. This segment
represents the primary target for a premium UNO bread offering, as the
key drivers identified in the conjoint analysis align closely with their
underlying preference structure.
A third segment displays more balanced utilities across attributes,
indicating flexibility but weaker attachment to any single premium
driver. For this group, overall product coherence and communication may
matter more than specific attribute optimization.
Taken together, these findings suggest that a premium UNO bread
strategy should be implemented as a targeted initiative rather than a
mass-market repositioning. By leveraging preference-based segmentation,
UNO can selectively address segments that value premium packaging,
health-oriented products, and differentiated offerings, while continuing
to serve price-sensitive segments through its core product portfolio.
This segmented approach minimizes risk and maximizes the return on
investment from premium product development.
LS0tCnRpdGxlOiAiRGF0YSBJbnNpZ2h0cyBmb3IgTWFya2V0aW5nXG4oTWlNODEwKSIKc3VidGl0bGU6ICJVTk8gQnJlYWQgTWFya2V0aW5nIFJlc2VhcmNoIFByb2plY3QiCmF1dGhvcjogIkdyb3VwIDQiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICBjc3M6IHN0eWxlc191bm8uY3NzCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIG1hdGhqYXg6IGRlZmF1bHQKLS0tCgpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyAwKSBQYWNrYWdlcyAKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShicm9vbSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGZvcmNhdHMpCgojIGNsdXN0ZXJpbmcgaGVscGVycwpsaWJyYXJ5KGZhY3RvZXh0cmEpICAgIyB2aXN1YWxpemF0aW9uICsgZWxib3cvc2lsaG91ZXR0ZQpsaWJyYXJ5KGNsdXN0ZXIpICAgICAgIyBzaWxob3VldHRlCgojIDEpIEZpbGUgcGF0aApleGNlbF9wYXRoIDwtICJVTk8gU3VydmV5IFJlc3BvbnNlcyB2NC54bHN4IgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFVOTyB0aGVtZSBjb2xvcnMgKGJyb3duIC8gbXVzdGFyZCAvIGNyZWFtKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFByaW1hcnkgYmFyIGNvbG9yIGZvciBzaW1wbGUgY291bnQgY2hhcnRzCnByaW1hcnlfZmlsbCA8LSAiI0E4NzQzQSIgICAjIHdhcm0gYnJvd24KcHJpbWFyeV9maWxsX2xpZ2h0IDwtICIjQzA5QTZCIgpuZXV0cmFsX2NyZWFtIDwtICIjRkJGNkVDIgp0ZXh0X2Jyb3duIDwtICIjNUIzQTI5IgoKIyBMaWtlcnQgMeKAkzUgKFVOTyBRMSkKbGlrZXJ0X2NvbG9ycyA8LSBjKAogICIxIiA9ICIjRjJFQ0U0IiwKICAiMiIgPSAiI0UzRDVDMyIsCiAgIjMiID0gIiNDOUE3N0QiLAogICI0IiA9ICIjQTg3NDNBIiwKICAiNSIgPSAiIzdBNEExRSIKKQoKIyBMaWtlcnQgMeKAkzcgKFVOTyBRMikKbGlrZXJ0N19jb2xvcnMgPC0gYygKICAiMSIgPSAiI0Y1RUZFOCIsCiAgIjIiID0gIiNFOUREQ0YiLAogICIzIiA9ICIjRDhDMUEzIiwKICAiNCIgPSAiI0MwOUE2QiIsCiAgIjUiID0gIiNBODc0M0EiLAogICI2IiA9ICIjOEI1QTJCIiwKICAiNyIgPSAiIzZBM0UxRSIKKQoKIyBDb21wYXJhdGl2ZSAoVU5PIFEzKQpldmFsX2NvbG9ycyA8LSBjKAogICJWZXJ5IEJhZCIgID0gIiNFRkU2REMiLAogICJCYWQiICAgICAgID0gIiNFMENEQjgiLAogICJTYW1lIiAgICAgID0gIiNDN0IyOTkiLAogICJHb29kIiAgICAgID0gIiNBODc0M0EiLAogICJWZXJ5IEdvb2QiID0gIiM3QTRBMUUiCikKCgoKYGBgCgotLS0KCiMgLiBQcm9qZWN0IEJhY2tncm91bmQ8YnI+KE1EUCAvIE1SUCAvIFJlc2VhcmNoIFF1ZXN0aW9ucykKCiMjIE1hbmFnZW1lbnQgRGVjaXNpb24gUHJvYmxlbSAoTURQKQoKVU5PIGFpbXMgdG8gaW5jcmVhc2UgaXRzIG1hcmtldCBzaGFyZSBpbiBUw7xya2l5ZSBhbmQgbXVzdCBkZWNpZGUgYmV0d2VlbiB0d28gZ3Jvd3RoIHBhdGhzOgoKPG9sPgogIDxsaT48c3Ryb25nPk1hcmtldCBwZW5ldHJhdGlvbjo8L3N0cm9uZz4gU3RyZW5ndGhlbmluZyB0cmFkaXRpb25hbCBwYWNrYWdlZCBicmVhZHMuPC9saT4KICA8bGk+PHN0cm9uZz5Qcm9kdWN0IGRldmVsb3BtZW50Ojwvc3Ryb25nPiBMYXVuY2hpbmcgYW4gaW50ZXJuYXRpb25hbC9wcmVtaXVtIGJyZWFkIGxpbmUgKGUuZy4sIGJyaW9jaGUpLjwvbGk+Cjwvb2w+CgoKIyMgTWFya2V0aW5nIFJlc2VhcmNoIFByb2JsZW0gKE1SUCkKClRoaXMgcmVzZWFyY2ggYWltcyB0byBpZGVudGlmeSB3aGljaCBzdHJhdGVnaWMgZGlyZWN0aW9u4oCUbWFya2V0IHBlbmV0cmF0aW9uIG9yIHByb2R1Y3QgZGV2ZWxvcG1lbnTigJRiZXR0ZXIgYWxpZ25zIHdpdGggY29uc3VtZXIgYmVoYXZpb3IsIGJyYW5kIHBlcmNlcHRpb24sIGFuZCBjdXJyZW50IG1hcmtldCBkeW5hbWljcyBpbiBUw7xya2l5ZS4KCiMjIFJlc2VhcmNoIFF1ZXN0aW9ucyAmIEh5cG90aGVzZXMKCldlIGZvY3VzIG9uIGNvbnN1bWVyIGJlaGF2aW9yLCB1bm1ldCBuZWVkcywgdHJpYWwgaW50ZW50LCBzZWdtZW50IGRpZmZlcmVuY2VzLCBhbmQgVU5PIGJyYW5kIGVxdWl0eSBmaXQuCgoqKktleSBoeXBvdGhlc2VzIGluY2x1ZGU6KioKCi0gKipIMSAoUGVuZXRyYXRpb24pOioqIFB1cmNoYXNlIGZyZXF1ZW5jeSBjYW4gaW5jcmVhc2UgaWYgVU5PIGltcHJvdmVzIGZyZXNobmVzcywgcHJpY2luZywgYW5kIGF2YWlsYWJpbGl0eS4KLSAqKkgyIChQcm9kdWN0IERldmVsb3BtZW50KToqKiBDb25zdW1lcnMgcGVyY2VpdmUgcGFja2FnZWQgYnJlYWRzIGFzIHNpbWlsYXI7IGRpZmZlcmVudGlhdGVkIHByb2R1Y3RzIChicmlvY2hlKSBtYXkgc2F0aXNmeSBub3ZlbHR5IG5lZWRzLgotICoqSDMgKFByb2R1Y3QgRGV2ZWxvcG1lbnQpOioqIFlvdW5nZXIvdXJiYW4gY29uc3VtZXJzIGhhdmUgaGlnaGVyIGFkb3B0aW9uIHBvdGVudGlhbCBmb3IgaW50ZXJuYXRpb25hbC1zdHlsZSBicmVhZHMuCi0gKipINCAoQnJhbmQgRXF1aXR5KToqKiBVTk8gaXMgc3Ryb25nbHkgbGlua2VkIHRvIHRyYWRpdGlvbmFsIGJyZWFkcywgYnV0IGNhbiBleHRlbmQgdG8gcHJlbWl1bSB0aHJvdWdoIGJyYW5kaW5nIGFuZCBwYWNrYWdpbmcuCgoKIyAuIFJlc2VhcmNoIERlc2lnbiAmIERhdGEgU291cmNlcwoKV2UgdXNlIGEgbWl4ZWQtbWV0aG9kIGRlc2lnbjogZXhwbG9yYXRvcnkgKGZvY3VzIGdyb3VwICsgZXhwZXJ0IGludGVydmlldykgZm9sbG93ZWQgYnkgYSBkZXNjcmlwdGl2ZSBvbmxpbmUgc3VydmV5IGFuZCBhIGNvbmpvaW50LXN0eWxlIHJhdGluZyBleHBlcmltZW50LgoKIyMgUXVhbGl0YXRpdmUgSW5zaWdodHMKCkZvY3VzIGdyb3VwIGluc2lnaHRzIGhpZ2hsaWdodDoKCi0gQ29uY2VybnMgYWJvdXQgYWRkaXRpdmVzL3NoZWxmIGxpZmUsCi0gUGFja2FnaW5nIHNtZWxsL21hdGVyaWFsIGlzc3VlcywKLSBFbW90aW9uYWwgY29ubmVjdGlvbiB0byB0cmFkaXRpb25hbCB3aGl0ZSBicmVhZCwKLSBCcmlvY2hlIGFzIHRhc3RlL2V4cGVyaWVuY2UgKG5vdCBkYWlseSBoZWFsdGggY2hvaWNlKSwKLSBUcmlhbCB0cmlnZ2VyczogdGFzdGluZywgbm92ZWx0eSwgc29jaWFsIG1lZGlhIHZpcmFsaXR5LCDigJxub3QgZm91bmQgaW4gYmFrZXJpZXPigJ0uCgpFeHBlcnQgKGRpZXRpdGlhbikgaW50ZXJ2aWV3IGhpZ2hsaWdodHM6CgotIENvbnN1bWVycyBzdHJ1Z2dsZSB0byBmaW5kIOKAnGNsZWFuLWxhYmVsICsgZnJlc2jigJ0gYnJlYWQsCi0gQnJpb2NoZSBpcyBhbiBpbmR1bGdlbmNlIG1lYW5zIHBsZWFzdXJlIGRyaXZlbiBjb25zdW1wdGlvbiAod2Vla2VuZCBicmVha2Zhc3RzLCBndWVzdHMvc25hY2tpbmcpLAotIENvcmUgdHJpYWwgdHJpZ2dlcnM6IGluZ3JlZGllbnQgcXVhbGl0eSBhbmQgdGFzdGUsCi0gVU5PIGlzIHBlcmNlaXZlZCBhcyBhIHJlbGlhYmxlIGV2ZXJ5ZGF5IGJyYW5kIChtb3JlIHRyYWRpdGlvbmFsKS4KCiMgLiBEYXRhIEltcG9ydCAoU3VydmV5IFN1bW1hcmllcyArIENvbmpvaW50KQoKU3VydmV5IGRhdGEgd2VyZSBjb2xsZWN0ZWQgdmlhIEdvb2dsZSBGb3JtcyBhbmQgZXhwb3J0ZWQgdG8gRXhjZWwuIFRoZSBkYXRhc2V0IHdhcyB0aGVuIHJlb3JnYW5pemVkIGludG8gbXVsdGlwbGUgc2hlZXRzIHJlcHJlc2VudGluZyBkZW1vZ3JhcGhpYyBzdW1tYXJpZXMsIGJlaGF2aW9yYWwgcXVlc3Rpb25zLCBhbmQgVU5PIGJyYW5kIGV2YWx1YXRpb24gcXVlc3Rpb25zLiBJbiBhZGRpdGlvbiwgYSBzZXBhcmF0ZSBzaGVldCBjb250YWlucyB0aGUgY29uam9pbnQgZXhwZXJpbWVudCBkYXRhIHVzZWQgZm9yIHJlZ3Jlc3Npb24gYW5hbHlzaXMuCgpGb3IgY2xhcml0eSwgdGhlIGRhdGEgaW1wb3J0IGFuZCBwcmVwcm9jZXNzaW5nIGNvZGUgaXMgaGlkZGVuIGluIHRoaXMgcmVwb3J0LCB3aGlsZSBhbGwgYW5hbHl0aWNhbCByZXN1bHRzIGFuZCB2aXN1YWxpemF0aW9ucyBhcmUgc2hvd24gYW5kIGRpc2N1c3NlZC4KCgpgYGB7ciBoZWxwZXItcmVhZC1zdW1tYXJ5fQpyZWFkX3N1bW1hcnlfc2hlZXQgPC0gZnVuY3Rpb24ocGF0aCwgc2hlZXRfbmFtZSkgewogIHJhdyA8LSByZWFkX2V4Y2VsKHBhdGgsIHNoZWV0ID0gc2hlZXRfbmFtZSwgY29sX25hbWVzID0gRkFMU0UpCgogIGhlYWRlcl9yb3cgPC0gd2hpY2goYXBwbHkocmF3LCAxLCBmdW5jdGlvbih4KSBhbnkoc3RyX2RldGVjdChhcy5jaGFyYWN0ZXIoeCksICJeQ291bnQkIikpKSlbMV0KCiBpZiAoaXMubmEoaGVhZGVyX3JvdykpIGhlYWRlcl9yb3cgPC0gMQoKICBkZiA8LSByYXdbKGhlYWRlcl9yb3cpOm5yb3cocmF3KSwgXQogIGNvbG5hbWVzKGRmKSA8LSBhcy5jaGFyYWN0ZXIoZGZbMSwgXSkKICBkZiA8LSBkZlstMSwgXSAlPiUgYXMuZGF0YS5mcmFtZSgpCgogIGlmICgiQ291bnQiICVpbiUgbmFtZXMoZGYpKSB7CiAgICBkZiRDb3VudCA8LSBhcy5udW1lcmljKGRmJENvdW50KQogIH0KICBkZgp9CmBgYAoKYGBge3IgcmVhZC1kYXRhLCBtZXNzYWdlPUZBTFNFfQojIERlbW9ncmFwaGljcyAoT3B0aW9uL0NvdW50KQojIENhdGVnb3J5IGJlaGF2aW9yIChPcHRpb24vQ291bnQpCiMgVU5PIHF1ZXN0aW9ucyAoZ3JpZCBjb3VudHMpCiMgQ29uam9pbnQgKGluZGl2aWR1YWwtbGV2ZWwpCmFnZURhdGEgICAgICAgPC0gcmVhZF9zdW1tYXJ5X3NoZWV0KGV4Y2VsX3BhdGgsICJBZ2UiKQppbmNvbWVEYXRhICAgIDwtIHJlYWRfc3VtbWFyeV9zaGVldChleGNlbF9wYXRoLCAiSW5jb21lIikKZ2VuZGVyRGF0YSAgICA8LSByZWFkX3N1bW1hcnlfc2hlZXQoZXhjZWxfcGF0aCwgIkdlbmRlciIpCmVkdWNhdGlvbkRhdGEgPC0gcmVhZF9zdW1tYXJ5X3NoZWV0KGV4Y2VsX3BhdGgsICJFZHVjYXRpb24iKQoKdXNhZ2VPY2Nhc2lvbiA8LSByZWFkX3N1bW1hcnlfc2hlZXQoZXhjZWxfcGF0aCwgIkJyZWFkIFVzYWdlIE9jY2FzaW9uIikKdHJpYWxNb3RpdmVzICA8LSByZWFkX3N1bW1hcnlfc2hlZXQoZXhjZWxfcGF0aCwgIlByZW1pdW1fQnJlYWRfVHJpYWxfTW90aXZhdGlvbiIpCnB1cmNoYXNlU2V2ICAgPC0gcmVhZF9zdW1tYXJ5X3NoZWV0KGV4Y2VsX3BhdGgsICJQdXJjaGFzZSBTZXZlcml0eSIpCmJyaW9jaGVQdXJjaCAgPC0gcmVhZF9zdW1tYXJ5X3NoZWV0KGV4Y2VsX3BhdGgsICJCcmlvY2hlIFB1cmNoYXNpbmciKQoKCnVub19xMSA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIlVOTyBRdWVzdGlvbjEiKQp1bm9fcTIgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoLCBzaGVldCA9ICJVTk8gUXVlc3Rpb24yIikKdW5vX3EzIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiVU5PIFF1ZXN0aW9uMyIpCgpjb25qb2ludCA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIkNvbmpvaW50X0xvbmciKQpzdXJ2ZXlfZnVsbCA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIkZvcm0gUmVzcG9uc2VzIDEiKQoKYGBgCgoKLS0tCgojIC4gU2FtcGxlIFByb2ZpbGUgKERlbW9ncmFwaGljcykKCiMjIEFnZSBEaXN0cmlidXRpb24KCmBgYHtyIHBsb3QtYWdlfQpnZ3Bsb3QoYWdlRGF0YSwgYWVzKHggPSAuZGF0YVtbbmFtZXMoYWdlRGF0YSlbMV1dXSwgeSA9IENvdW50KSkgKwogIGdlb21fY29sKGZpbGwgPSBwcmltYXJ5X2ZpbGwpICsKICBsYWJzKHRpdGxlID0gIkFnZSBEaXN0cmlidXRpb24iLCB4ID0gIkFnZSBSYW5nZSIsIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgojIyBHZW5kZXIgLyBFZHVjYXRpb24gLyBJbmNvbWUKCmBgYHtyIHBsb3QtZGVtb2dyYXBoaWNzfQpwbG90X2NvdW50X2JhciA8LSBmdW5jdGlvbihkZiwgdGl0bGUsIHhsYWIpIHsKICBnZ3Bsb3QoZGYsIGFlcyh4ID0gLmRhdGFbW25hbWVzKGRmKVsxXV1dLCB5ID0gQ291bnQpKSArCiAgICBnZW9tX2NvbChmaWxsID0gcHJpbWFyeV9maWxsKSArCiAgICBsYWJzKHRpdGxlID0gdGl0bGUsIHggPSB4bGFiLCB5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDIwLCBoanVzdCA9IDEpKQp9CgpwbG90X2NvdW50X2JhcihnZW5kZXJEYXRhLCAgICAiR2VuZGVyIERpc3RyaWJ1dGlvbiIsICJHZW5kZXIiKQpwbG90X2NvdW50X2JhcihlZHVjYXRpb25EYXRhLCAiRWR1Y2F0aW9uIERpc3RyaWJ1dGlvbiIsICJFZHVjYXRpb24iKQpwbG90X2NvdW50X2JhcihpbmNvbWVEYXRhLCAgICAiSW5jb21lIERpc3RyaWJ1dGlvbiIsICJJbmNvbWUgUmFuZ2UiKQoKYGBgCgoKPGRpdiBjbGFzcz0ibm90ZS1ib3giPgo8c3BhbiBjbGFzcz0ibm90ZS10aXRsZSI+PHN0cm9uZz5Qcm9maWxlIFN1bW1hcnk8L3N0cm9uZz48L3NwYW4+PGJyPgoKVGhlIHJlc3BvbmRlbnQgcHJvZmlsZSBpcyBjb25jZW50cmF0ZWQgaW4gdGhlIDI14oCTNTQgYWdlIHJhbmdlIHdpdGggYSBmZW1hbGUtbWFqb3JpdHkgc2FtcGxlLiBFZHVjYXRpb24gbGV2ZWxzIGFyZSBwcmltYXJpbHkgQmFjaGVsb3LigJlzIGFuZCBNYXN0ZXLigJlzLCBhbmQgYSBzdWJzdGFudGlhbCBzaGFyZSBvZiByZXNwb25kZW50cyBmYWxsIGludG8gaGlnaGVyLWluY29tZSBicmFja2V0cy4gT3ZlcmFsbCwgdGhlIHNhbXBsZSByZWZsZWN0cyB1cmJhbiwgZWNvbm9taWNhbGx5IGFjdGl2ZSBjb25zdW1lcnMgd2hvIGFyZSByZWxldmFudCBmb3IgZXZhbHVhdGluZyBwcmVtaXVtIHBhY2thZ2VkIGJyZWFkIHBvc2l0aW9uaW5nLgo8L2Rpdj4KCi0tLQoKIyAuIENhdGVnb3J5IEJlaGF2aW9yIEZpbmRpbmdzCgojIyBCcmVhZCBVc2FnZSBPY2Nhc2lvbgoKCmBgYHtyIHBsb3QtdXNhZ2Utb2NjYXNpb259CnBsb3RfY291bnRfYmFyKHVzYWdlT2NjYXNpb24sICJXaGVuIERvIENvbnN1bWVycyBVc2UgUGFja2FnZWQgQnJlYWQ/IiwgIk9jY2FzaW9uIikKCmBgYAoKPGRpdiBjbGFzcz0ibm90ZS1ib3giPgo8c3BhbiBjbGFzcz0ibm90ZS10aXRsZSI+PHN0cm9uZz5JbnRlcnByZXRhdGlvbjogPC9zdHJvbmc+PC9zcGFuPjxicj4KCjx1bD4KICA8bGk+VGhlIHRvcCBvY2Nhc2lvbnMgaW5kaWNhdGUgd2hldGhlciBwYWNrYWdlZCBicmVhZCBpcyBtYWlubHkgdXNlZCBmb3IgKipkYWlseSBjb252ZW5pZW5jZSoqIHZzICoqc3BlY2lhbCBtb21lbnRzKiouPC9saT4KICA8bGk+VXNlIHRoaXMgdG8gY29ubmVjdCB0byB0aGUgZm9jdXMgZ3JvdXDigJlzIOKAnGRhaWx5IGhhYml0cyArIGZyZXNobmVzc+KAnSB0aGVtZXMuPC9saT4KPC91bD4KPC9kaXY+CgoKIyMgTW90aXZhdGlvbiB0byBUcnkgYSBOZXcgUHJlbWl1bSBCcmVhZAoKYGBge3IgcGxvdC10cmlhbC1tb3RpdmVzfQpwbG90X2NvdW50X2Jhcih0cmlhbE1vdGl2ZXMsICJUb3AgTW90aXZhdGlvbnMgdG8gVHJ5IFByZW1pdW0gUGFja2FnZWQgQnJlYWQiLCAiTW90aXZhdGlvbiIpCmBgYAoKPGRpdiBjbGFzcz0ibm90ZS1ib3giPgo8c3BhbiBjbGFzcz0ibm90ZS10aXRsZSI+PHN0cm9uZz5LZXkgSW5zaWdodCDigJMgTW90aXZhdGlvbiB0byBUcnkgUHJlbWl1bSBQYWNrYWdlZCBCcmVhZDwvc3Ryb25nPjwvc3Bhbj4KClByZW1pdW0gb3Igb3JnYW5pYy1sb29raW5nIHBhY2thZ2luZyBpcyB0aGUgc3Ryb25nZXN0IG1vdGl2YXRpb24gZm9yIHRyeWluZyBhIHByZW1pdW0gcGFja2FnZWQgYnJlYWQsIGZvbGxvd2VkIGNsb3NlbHkgYnkgdGhlIGF2YWlsYWJpbGl0eSBvZiB1bmlxdWUgb3IgZGlmZmVyZW50aWF0ZWQgdmFyaWV0aWVzLiBJbiBjb250cmFzdCwgdmlyYWwgc29jaWFsIG1lZGlhIHByb21vdGlvbiBwbGF5cyBhIHJlbGF0aXZlbHkgbWlub3Igcm9sZSwgd2hpbGUgZnJlZSBzYW1wbGluZyBoYXMgYSBtb2RlcmF0ZSBidXQgc2Vjb25kYXJ5IGltcGFjdC4KClRoZXNlIGZpbmRpbmdzIHN1Z2dlc3QgdGhhdCBjb25zdW1lcnMgYXNzb2NpYXRlIHByZW1pdW0gYnJlYWQgcHJpbWFyaWx5IHdpdGggdGFuZ2libGUgcXVhbGl0eSBjdWVz4oCUc3VjaCBhcyBwYWNrYWdpbmcgYW5kIHByb2R1Y3QgZGlmZmVyZW50aWF0aW9u4oCUcmF0aGVyIHRoYW4gcHJvbW90aW9uYWwgaHlwZS4gVGhlcmVmb3JlLCBwcmVtaXVtIHBvc2l0aW9uaW5nIHNob3VsZCBlbXBoYXNpemUgcGFja2FnaW5nIGRlc2lnbiwgaW5ncmVkaWVudCBxdWFsaXR5LCBhbmQgdmFyaWV0eSwgc3VwcG9ydGVkIGJ5IGluLXN0b3JlIHZpc2liaWxpdHkgcmF0aGVyIHRoYW4gcmVseWluZyBoZWF2aWx5IG9uIHNvY2lhbCBtZWRpYSB2aXJhbGl0eS4KPC9kaXY+CgoKIyMgUHVyY2hhc2UgU2V2ZXJpdHkgCgpgYGB7ciBwdXJjaGFzZS1zZXZlcml0eS10YWJsZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHVyY2hhc2VTZXYgPC0gcHVyY2hhc2VTZXYgJT4lCiAgbXV0YXRlKHBjdCA9IHJvdW5kKDEwMCAqIENvdW50IC8gc3VtKENvdW50KSwgMSkpICU+JQogIGFycmFuZ2UoZGVzYyhDb3VudCkpCgpwdXJjaGFzZVNldgpgYGAKCmBgYHtyIHB1cmNoYXNlLXNldmVyaXR5LXBsb3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnB1cmNoYXNlU2V2ICU+JQogIG11dGF0ZShQdXJjaGFzZV9TZXZlcml0eSA9IGZjdF9yZW9yZGVyKFB1cmNoYXNlX1NldmVyaXR5LCBDb3VudCkpICU+JQogIGdncGxvdChhZXMoeCA9IFB1cmNoYXNlX1NldmVyaXR5LCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woZmlsbCA9IHByaW1hcnlfZmlsbCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocGN0LCAiJSIpKSwgdmp1c3QgPSAtMC4zLCBzaXplID0gMykgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQdXJjaGFzZSBTZXZlcml0eSAoQ2F0ZWdvcnkgRW5nYWdlbWVudCkiLAogICAgeCA9ICJQdXJjaGFzZSBGcmVxdWVuY3kgLyBTZXZlcml0eSIsCiAgICB5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjAsIGhqdXN0ID0gMSkpCmBgYAoKPGRpdiBjbGFzcz0ibm90ZS1ib3giPgo8c3BhbiBjbGFzcz0ibm90ZS10aXRsZSI+PHN0cm9uZz5JbnRlcnByZXRhdGlvbjogPC9zdHJvbmc+PC9zcGFuPjxicj4KClRoZSBwdXJjaGFzZSBzZXZlcml0eSBkaXN0cmlidXRpb24gaW5kaWNhdGVzIHRoZSBvdmVyYWxsIGludGVuc2l0eSBvZiBwYWNrYWdlZCBicmVhZCBjb25zdW1wdGlvbiBpbiBvdXIgc2FtcGxlLiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGl0IGZyYW1lcyB3aGV0aGVyIGRlbWFuZCBpcyBkcml2ZW4gYnkgZGFpbHkgcm91dGluZXMgKHN1cHBvcnRpbmcgbWFya2V0IHBlbmV0cmF0aW9uKSBvciB3aGV0aGVyIHByZW1pdW0gYW5kIHNwZWNpYWx0eSBwcm9kdWN0cyB3b3VsZCByZW1haW4gbmljaGUgKHN1cHBvcnRpbmcgYSBtb3JlIHRhcmdldGVkIHByb2R1Y3QgZGV2ZWxvcG1lbnQgc3RyYXRlZ3kpLgoKPC9kaXY+CgoKIyMgSW50ZXJuYXRpb25hbCBCcmVhZCBVc2FnZSBQdXJwb3NlCgpgYGB7ciBpbnRsLWJyZWFkLXB1cnBvc2UtdGFibGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJyaW9jaGVQdXJjaCA8LSBicmlvY2hlUHVyY2ggJT4lCiAgbXV0YXRlKHBjdCA9IHJvdW5kKDEwMCAqIENvdW50IC8gc3VtKENvdW50KSwgMSkpICU+JQogIGFycmFuZ2UoZGVzYyhDb3VudCkpCgpicmlvY2hlUHVyY2gKYGBgCgoKCmBgYHtyIGludGwtYnJlYWQtcHVycG9zZS1wbG90LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpicmlvY2hlUHVyY2ggJT4lCiAgbXV0YXRlKEludGVybmF0aW9uYWxfQnJlYWRfVXNhZ2VfUHVycG9zZSA9CiAgICAgICAgICAgZmN0X3Jlb3JkZXIoSW50ZXJuYXRpb25hbF9CcmVhZF9Vc2FnZV9QdXJwb3NlLCBDb3VudCkpICU+JQogIGdncGxvdChhZXMoeCA9IEludGVybmF0aW9uYWxfQnJlYWRfVXNhZ2VfUHVycG9zZSwgeSA9IENvdW50KSkgKwogIGdlb21fY29sKGZpbGwgPSBwcmltYXJ5X2ZpbGwpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHBjdCwgIiUiKSksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMpICsKICBsYWJzKAogICAgdGl0bGUgPSAiV2h5IENvbnN1bWVycyBFYXQgSW50ZXJuYXRpb25hbCBCcmVhZHMgKEJyaW9jaGUvQmFndWV0dGUpIiwKICAgIHggPSAiVXNhZ2UgUHVycG9zZSIsCiAgICB5ID0gIk51bWJlciBvZiBSZXNwb25kZW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjAsIGhqdXN0ID0gMSkpCmBgYAoKCjxkaXYgY2xhc3M9Im5vdGUtYm94Ij4KPHNwYW4gY2xhc3M9Im5vdGUtdGl0bGUiPjxzdHJvbmc+SW50ZXJwcmV0YXRpb246IDwvc3Ryb25nPjwvc3Bhbj48YnI+CiAgCkludGVybmF0aW9uYWwgYnJlYWRzIChlLmcuLCBicmlvY2hlL2JhZ3VldHRlKSBhcmUgY29uc3VtZWQgbWFpbmx5IGZvciBzcGVjaWZpYyBvY2Nhc2lvbnMgcmF0aGVyIHRoYW4gYXMgYSBkYWlseSBzdGFwbGUuIFRoaXMgYWxpZ25zIHdpdGggb3VyIHF1YWxpdGF0aXZlIGZpbmRpbmdzIHRoYXQgYnJpb2NoZSBpcyBvZnRlbiBzZWVuIGFzIGFuIGluZHVsZ2VudCBvciDigJxzcGVjaWFsIG1vbWVudOKAnSBwcm9kdWN0IChlLmcuLCB3ZWVrZW5kIGJyZWFrZmFzdHMsIGd1ZXN0cywgc25hY2tpbmcpLCBzdWdnZXN0aW5nIHRoYXQgYSBwcmVtaXVtL2ludGVybmF0aW9uYWwgbGluZSB3b3VsZCBsaWtlbHkgYmUgYW4gKmFkamFjZW50KiBncm93dGggb3Bwb3J0dW5pdHkgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudCBmb3IgY29yZSBkYWlseSBicmVhZHMuCgo8L2Rpdj4KCiMgLiBVTk8gUXVlc3Rpb24gMSDigJQgQnJhbmQgUGVyY2VwdGlvbnMKCmBgYHtyIHVuby1xMS1wbG90fQpxMV9pdGVtIDwtIG5hbWVzKHVub19xMSlbMV0gICAjIGZpcnN0IGNvbHVtbiA9IHN0YXRlbWVudCBuYW1lIChlLmcuLCBIaWdoX1F1YWxpdHkpCgp1bm9fcTFfbG9uZyA8LSB1bm9fcTEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSB3aGVyZShpcy5udW1lcmljKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiU2NhbGUiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBtdXRhdGUoU2NhbGUgPSBhcy5mYWN0b3IoU2NhbGUpKQoKZ2dwbG90KHVub19xMV9sb25nLCBhZXMoeCA9IFNjYWxlLCB5ID0gQ291bnQsIGZpbGwgPSBTY2FsZSkpICsKICBnZW9tX2NvbCh3aWR0aCA9IDAuNykgKwogIGZhY2V0X3dyYXAofiBVTk9fQWdyZWVtZW50X0xldmVsLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGxpa2VydF9jb2xvcnMpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIEJyYW5kIFBlcmNlcHRpb25zICgxID0gTG93LCA1ID0gSGlnaCkiLAogICAgeCA9ICJBZ3JlZW1lbnQgTGV2ZWwiLAogICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMSkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQogICkKYGBgCgpgYGB7ciB1bm8tcTEtdG9wYm94fQpxMV90b3Bib3ggPC0gdW5vX3ExX2xvbmcgJT4lCiAgZ3JvdXBfYnkoLmRhdGFbW3ExX2l0ZW1dXSkgJT4lCiAgc3VtbWFyaXNlKAogICAgdG90YWwgPSBzdW0oQ291bnQsIG5hLnJtPVRSVUUpLAogICAgdG9wYm94XzRfNSA9IHN1bShDb3VudFtTY2FsZSAlaW4lIGMoIjQiLCI1IildLCBuYS5ybT1UUlVFKSwKICAgIHRvcGJveF9wY3QgPSByb3VuZCgxMDAgKiB0b3Bib3hfNF81IC8gdG90YWwsIDEpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkgJT4lCiAgYXJyYW5nZShkZXNjKHRvcGJveF9wY3QpKQoKcTFfdG9wYm94CgpgYGAKCjxkaXYgY2xhc3M9Im5vdGUtYm94Ij4KPHNwYW4gY2xhc3M9Im5vdGUtdGl0bGUiPjxzdHJvbmc+VU5PIEJyYW5kIFBlcmNlcHRpb25zIOKAlCBLZXkgSW5zaWdodHM6IDwvc3Ryb25nPjwvc3Bhbj4KCjx1bD4KICA8bGk+PHN0cm9uZz5TdHJvbmdlc3QgYXNzb2NpYXRpb246PC9zdHJvbmc+IE5ldyBQcm9kdWN0IFN1Y2Nlc3MgKDU1LjQlKTwvbGk+CiAgPGxpPjxzdHJvbmc+U29saWQgY29yZSBzdHJlbmd0aHM6PC9zdHJvbmc+IFJlbGlhYmxlIEV2ZXJ5ZGF5ICg0NS44JSksIFZhbHVlIGZvciBNb25leSAoNDIuMiUpLCBIZWFsdGh5IFRydXN0ICg0MS4wJSk8L2xpPgogIDxsaT48c3Ryb25nPldlYWtlciBwZXJjZXB0aW9uczo8L3N0cm9uZz4gUHJlbWl1bSBCcmFuZCAoMzIuNSUpLCBBdHRyYWN0aXZlIFBhY2thZ2luZyAoMzEuMyUpPC9saT4KPC91bD4KCk92ZXJhbGwsIHJlc3BvbmRlbnRzIGJlbGlldmUgdGhhdCBVTk8gY2FuIHN1Y2Nlc3NmdWxseSBkZXZlbG9wIG5ldyBwcm9kdWN0cyBhbmQgcGVyY2VpdmUgaXQgYXMgYSByZWxpYWJsZSBldmVyeWRheSBicmFuZCBvZmZlcmluZyByZWFzb25hYmxlIHZhbHVlIGFuZCBoZWFsdGgtcmVsYXRlZCB0cnVzdC4gSG93ZXZlciwgcHJlbWl1bSBicmFuZCBwZXJjZXB0aW9uIGFuZCBwYWNrYWdpbmcgYXR0cmFjdGl2ZW5lc3MgYXJlIHJlbGF0aXZlbHkgd2Vha2VyLiBUaGlzIHN1Z2dlc3RzIHRoYXQgd2hpbGUgVU5PIGhhcyB0aGUgY3JlZGliaWxpdHkgdG8gbGF1bmNoIGEgcHJlbWl1bSBsaW5lLCBwcmVtaXVtIGN1ZXPigJRwYXJ0aWN1bGFybHkgcGFja2FnaW5nIGRlc2lnbiBhbmQgcG9zaXRpb25pbmfigJRtdXN0IGJlIHN0cmVuZ3RoZW5lZCB0byBqdXN0aWZ5IGhpZ2hlciBwcmljaW5nLgo8L2Rpdj4KCgojIC4gVU5PIFF1ZXN0aW9uIDIg4oCUIEFjdGlvbiBMaWtlbGlob29kIGZvciBQcmVtaXVtIEJyZWFkCgpgYGB7ciB1bm8tcTItcGxvdH0KcTJfaXRlbSA8LSBuYW1lcyh1bm9fcTIpWzFdCgp1bm9fcTJfbG9uZyA8LSB1bm9fcTIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHdoZXJlKGlzLm51bWVyaWMpLAogICAgbmFtZXNfdG8gPSAiU2NhbGUiLAogICAgdmFsdWVzX3RvID0gIkNvdW50IgogICkgJT4lCiAgbXV0YXRlKFNjYWxlID0gYXMuZmFjdG9yKFNjYWxlKSkKCmdncGxvdCh1bm9fcTJfbG9uZywgYWVzKHggPSBTY2FsZSwgeSA9IENvdW50LCBmaWxsID0gU2NhbGUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjcpICsKICBmYWNldF93cmFwKGFzLmZvcm11bGEocGFzdGUoIn4iLCBxMl9pdGVtKSksIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbGlrZXJ0N19jb2xvcnMpICsKICBsYWJzKAogICAgdGl0bGUgPSAiTGlrZWxpaG9vZCBvZiBBY3Rpb25zIGlmIFVOTyBMYXVuY2hlcyBQcmVtaXVtIEJyZWFkICgxID0gTG93LCA3ID0gSGlnaCkiLAogICAgeCA9ICJMaWtlbGlob29kIExldmVsIiwKICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKCgoKYGBgCgoKYGBge3IgdW5vLXEyLXRvcGJveH0KcTJfdG9wYm94IDwtIHVub19xMl9sb25nICU+JQogIGdyb3VwX2J5KC5kYXRhW1txMl9pdGVtXV0pICU+JQogIHN1bW1hcmlzZSgKICAgIHRvdGFsID0gc3VtKENvdW50LCBuYS5ybT1UUlVFKSwKICAgIHRvcGJveF82XzcgPSBzdW0oQ291bnRbU2NhbGUgJWluJSBjKCI2IiwiNyIpXSwgbmEucm09VFJVRSksCiAgICB0b3Bib3hfcGN0ID0gcm91bmQoMTAwICogdG9wYm94XzZfNyAvIHRvdGFsLCAxKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApICU+JQogIGFycmFuZ2UoZGVzYyh0b3Bib3hfcGN0KSkKCnEyX3RvcGJveAoKYGBgCgo8ZGl2IGNsYXNzPSJub3RlLWJveCI+CjxzcGFuIGNsYXNzPSJub3RlLXRpdGxlIj48c3Ryb25nPkJlaGF2aW9yYWwgSW50ZW50aW9ucyDigJQgRnVubmVsIEludGVycHJldGF0aW9uOiA8L3N0cm9uZz48L3NwYW4+PGJyPgoKVGhlIHN0cm9uZ2VzdCBpbnRlbnRpb24gaXMgdHJ5aW5nIFVOT+KAmXMgcHJlbWl1bSBicmVhZCBhdCBsZWFzdCBvbmNlLCBpbmRpY2F0aW5nIGhpZ2ggdHJpYWwgcG90ZW50aWFsLiBJbiBjb250cmFzdCwgd2lsbGluZ25lc3MgdG8gcGF5IGEgcHJlbWl1bSBwcmljZSBpcyBtb3JlIG1vZGVyYXRlIGFuZCBwdXJjaGFzZS1vbi1wcm9tb3Rpb24gYXBwZWFycyBpbXBvcnRhbnQsIHN1Z2dlc3RpbmcgcHJpY2Ugc2Vuc2l0aXZpdHkuIEZvbGxvd2luZyBwcm9kdWN0IGFubm91bmNlbWVudHMgb25saW5lIGlzIGxvdywgaW1wbHlpbmcgdGhhdCBhd2FyZW5lc3MtYnVpbGRpbmcgbWF5IHdvcmsgYmV0dGVyIHRocm91Z2ggaW4tc3RvcmUgdmlzaWJpbGl0eSwgcGFja2FnaW5nLCBhbmQgc2FtcGxpbmcgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBjb25zdW1lcnMgYWN0aXZlbHkgdHJhY2tpbmcgdXBkYXRlcyBvbmxpbmUuCjwvZGl2PgoKPGRpdiBjbGFzcz0ibm90ZS1ib3giPgo8c3BhbiBjbGFzcz0ibm90ZS10aXRsZSI+PHN0cm9uZz5NYW5hZ2VyaWFsIEludGVycHJldGF0aW9uOiA8L3N0cm9uZz48L3NwYW4+PGJyPgoKVHJpYWwgaW50ZW50aW9uIGZvciBhIHByZW1pdW0gVU5PIGJyZWFkIGlzIGhpZ2gsIGluZGljYXRpbmcgc3Ryb25nIGN1cmlvc2l0eSBhbmQgb3Blbm5lc3MgYW1vbmcgY29uc3VtZXJzLiBIb3dldmVyLCB3aWxsaW5nbmVzcyB0byBwYXkgYSBoaWdoZXIgcHJpY2UgaXMgbW9yZSBtb2RlcmF0ZSwgYW5kIGJ1eWluZyBvbiBwcm9tb3Rpb24gYXBwZWFycyBpbXBvcnRhbnQuIFRoaXMgc3VnZ2VzdHMgdGhhdCBwcmVtaXVtIGFkb3B0aW9uIHdpbGwgZGVwZW5kIG9uIGNsZWFyIHZhbHVlIGNvbW11bmljYXRpb24gYW5kIGNvbnRyb2xsZWQgcHJpY2luZyByYXRoZXIgdGhhbiBwdXJlbHkgYnJhbmQtZHJpdmVuIHdpbGxpbmduZXNzIHRvIHBheS4KPC9kaXY+CgojIC4gVU5PIFF1ZXN0aW9uIDMg4oCUIENvbXBhcmF0aXZlIFVOTyBSYXRpbmdzCgpgYGB7ciB1bm8tcTMtcGxvdH0KcTNfaXRlbSA8LSBuYW1lcyh1bm9fcTMpWzFdICAjIGF0dHJpYnV0ZSBuYW1lIGNvbHVtbiAoVGFzdGUsIEZyZXNobmVzcywgZXRjLikKCnVub19xM19sb25nIDwtIHVub19xMyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1hbGxfb2YocTNfaXRlbSksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkV2YWx1YXRpb24iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBtdXRhdGUoRXZhbHVhdGlvbiA9IGZhY3RvcihFdmFsdWF0aW9uLCBsZXZlbHMgPSBjKCJWZXJ5IEJhZCIsIkJhZCIsIlNhbWUiLCJHb29kIiwiVmVyeSBHb29kIikpKQoKZ2dwbG90KHVub19xM19sb25nLCBhZXMoeCA9IEV2YWx1YXRpb24sIHkgPSBDb3VudCwgZmlsbCA9IEV2YWx1YXRpb24pKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjcpICsKICBmYWNldF93cmFwKH4gQ29tcGFyYXRpdmVfVU5PX1JhdGluZ3MsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gZXZhbF9jb2xvcnMpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIHZzIE90aGVyIEJyZWFkIEJyYW5kcyAoQ29tcGFyYXRpdmUgRXZhbHVhdGlvbikiLAogICAgeCA9ICJFdmFsdWF0aW9uIiwKICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTEpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikKICApCgoKYGBgCgo8ZGl2IGNsYXNzPSJub3RlLWJveCI+CjxzcGFuIGNsYXNzPSJub3RlLXRpdGxlIj48c3Ryb25nPkNvbXBhcmF0aXZlIEV2YWx1YXRpb246IDwvc3Ryb25nPjwvc3Bhbj48YnI+CgpUaGlzIHNlY3Rpb24gZXZhbHVhdGVzIGhvdyBVTk8gcGVyZm9ybXMgcmVsYXRpdmUgdG8gb3RoZXIgcGFja2FnZWQgYnJlYWQgYnJhbmRzIGFjcm9zcyBrZXkgYXR0cmlidXRlcyBzdWNoIGFzIHRhc3RlLCBmcmVzaG5lc3MsIHByaWNlLCBwYWNrYWdpbmcsIGhlYWx0aGluZXNzLCBhdmFpbGFiaWxpdHksIGlubm92YXRpdmVuZXNzLCBhbmQgcHJlbWl1bSBmZWVsLgpPdmVyYWxsLCBVTk8gcGVyZm9ybXMgc3Ryb25nbHkgb24gY29yZSBmdW5jdGlvbmFsIGF0dHJpYnV0ZXMuIFRhc3RlIGFuZCBhdmFpbGFiaWxpdHkgcmVjZWl2ZSBhIGhpZ2ggY29uY2VudHJhdGlvbiBvZiDigJxHb29k4oCdIGFuZCDigJxWZXJ5IEdvb2TigJ0gcmF0aW5ncywgaW5kaWNhdGluZyB0aGF0IGNvbnN1bWVycyBwZXJjZWl2ZSBVTk8gYXMgY29tcGV0aXRpdmUgb3Igc3VwZXJpb3IgdG8gb3RoZXIgYnJhbmRzIGluIGV2ZXJ5ZGF5IGNvbnN1bXB0aW9uIGNvbnRleHRzLiBIZWFsdGhpbmVzcyBhbHNvIHNob3dzIGEgZmF2b3JhYmxlIGRpc3RyaWJ1dGlvbiwgc3VwcG9ydGluZyBlYXJsaWVyIHF1YWxpdGF0aXZlIGluc2lnaHRzIHRoYXQgcG9zaXRpb24gVU5PIGFzIGEgcmVsaWFibGUgYW5kIHRydXN0ZWQgb3B0aW9uIGZvciBkYWlseSBicmVhZCBuZWVkcy4KSW4gY29udHJhc3QsIGF0dHJpYnV0ZXMgcmVsYXRlZCB0byBwcmVtaXVtIHBvc2l0aW9uaW5n4oCUcGFydGljdWxhcmx5IHByZW1pdW0gZmVlbCBhbmQgaW5ub3ZhdGl2ZW5lc3PigJRzaG93IGEgbW9yZSBtaXhlZCBkaXN0cmlidXRpb24sIHdpdGggbWFueSByZXNwb25kZW50cyBzZWxlY3Rpbmcg4oCcU2FtZeKAnSByYXRoZXIgdGhhbiDigJxHb29k4oCdIG9yIOKAnFZlcnkgR29vZC7igJ0gVGhpcyBzdWdnZXN0cyB0aGF0IHdoaWxlIFVOTyBpcyBub3QgcGVyY2VpdmVkIGFzIHdlYWsgaW4gdGhlc2UgZGltZW5zaW9ucywgaXQgaXMgbm90IHlldCBjbGVhcmx5IGRpZmZlcmVudGlhdGVkIGFzIGEgcHJlbWl1bSBvciBoaWdobHkgaW5ub3ZhdGl2ZSBicmFuZCBjb21wYXJlZCB0byBhbHRlcm5hdGl2ZXMuCgpUaGVzZSByZXN1bHRzIHJlaW5mb3JjZSB0aGUgaW50ZXJwcmV0YXRpb24gdGhhdCBVTk/igJlzIGN1cnJlbnQgYnJhbmQgc3RyZW5ndGggbGllcyBpbiBmdW5jdGlvbmFsIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJpbGl0eSByYXRoZXIgdGhhbiBzeW1ib2xpYyBvciBwcmVtaXVtIGRpZmZlcmVudGlhdGlvbi4gQ29uc2VxdWVudGx5LCBhbnkgcHJlbWl1bSBicmVhZCBleHRlbnNpb24gd291bGQgbmVlZCB0byByZWx5IG9uIHN0cm9uZ2VyIGlubm92YXRpb24gc2lnbmFscywgcGFja2FnaW5nIGRlc2lnbiwgYW5kIHByb2R1Y3Qgc3Rvcnl0ZWxsaW5nIHRvIHNoaWZ0IGNvbnN1bWVyIHBlcmNlcHRpb25zIGJleW9uZCBwYXJpdHkgd2l0aCBleGlzdGluZyBicmFuZHMuCgo8L2Rpdj4KCiMgLiBDb25qb2ludCBSZWdyZXNzaW9uCgpgYGB7ciBjb25qb2ludC1tb2RlbH0KIyBFbnN1cmUgY2F0ZWdvcmljYWwgZmllbGRzIGFyZSB0cmVhdGVkIGFzIGZhY3RvcnMKY29uam9pbnQgPC0gY29uam9pbnQgJT4lCiAgbXV0YXRlKAogICAgQnJlYWRfVHlwZSAgID0gYXMuZmFjdG9yKEJyZWFkX1R5cGUpLAogICAgU2xpY2VfVHlwZSAgID0gYXMuZmFjdG9yKFNsaWNlX1R5cGUpLAogICAgUGFja2FnZV9UeXBlID0gYXMuZmFjdG9yKFBhY2thZ2VfVHlwZSksCiAgICBQcmljZSAgICAgICAgPSBhcy5mYWN0b3IoUHJpY2UpCiAgKQoKcmF0aW5nX21vZGVsIDwtIGxtKFJhdGluZyB+IEJyZWFkX1R5cGUgKyBTbGljZV9UeXBlICsgUHJpY2UgKyBQYWNrYWdlX1R5cGUsIGRhdGEgPSBjb25qb2ludCkKc3VtbWFyeShyYXRpbmdfbW9kZWwpCgpgYGAKCjxkaXYgY2xhc3M9Im5vdGUtYm94Ij4KPHNwYW4gY2xhc3M9Im5vdGUtdGl0bGUiPjxzdHJvbmc+Q29uam9pbnQgUmVncmVzc2lvbiBSZXN1bHRzOiA8L3N0cm9uZz48L3NwYW4+PGJyPgoKQSByYXRpbmctYmFzZWQgY29uam9pbnQgcmVncmVzc2lvbiB3YXMgZXN0aW1hdGVkIHRvIGV4YW1pbmUgaG93IGRpZmZlcmVudCBwcm9kdWN0IGF0dHJpYnV0ZXMgaW5mbHVlbmNlIG92ZXJhbGwgYnJlYWQgcmF0aW5ncy4gVGhlIG1vZGVsIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKEYtdGVzdCBwIDwgMC4wMDEpLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGluY2x1ZGVkIGF0dHJpYnV0ZXMgY29sbGVjdGl2ZWx5IGV4cGxhaW4gdmFyaWF0aW9uIGluIGNvbnN1bWVyIHByZWZlcmVuY2VzLiBXaGlsZSB0aGUgUi1zcXVhcmVkIHZhbHVlIGlzIG1vZGVzdCwgdGhpcyBpcyBleHBlY3RlZCBpbiBjb25zdW1lciBwcmVmZXJlbmNlIGRhdGEgYW5kIGRvZXMgbm90IGxpbWl0IHRoZSBpbnRlcnByZXRhYmlsaXR5IG9mIHJlbGF0aXZlIGF0dHJpYnV0ZSBlZmZlY3RzLgoKKipUaGUgcmVncmVzc2lvbiByZXN1bHRzIHJldmVhbCBjbGVhciBkaWZmZXJlbmNlcyBpbiBob3cgY29uc3VtZXJzIGV2YWx1YXRlIHByb2R1Y3QgYXR0cmlidXRlczoqKgoKLSAqKkJyZWFkIFR5cGU6KiogV2hvbGUgZ3JhaW4gYnJlYWQgaGFzIGEgcG9zaXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IG9uIHJhdGluZ3MsIGluZGljYXRpbmcgYSBzdHJvbmcgcHJlZmVyZW5jZSBmb3IgaGVhbHRoaWVyIG9yIG1vcmUgbmF0dXJhbCBicmVhZCBvcHRpb25zLiBUcmFkaXRpb25hbCBicmVhZCBkb2VzIG5vdCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHJhdGluZ3MgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBjYXRlZ29yeS4KCi0gKipTbGljZSBUeXBlOioqIEJvdGggdGhpY2sgYW5kIHRoaW4gc2xpY2Ugb3B0aW9ucyBuZWdhdGl2ZWx5IGFmZmVjdCByYXRpbmdzLiBUaGlzIHN1Z2dlc3RzIHRoYXQgY29uc3VtZXJzIHByZWZlciBhIHN0YW5kYXJkIHNsaWNlIHRoaWNrbmVzcyBhbmQgcGVuYWxpemUgZGV2aWF0aW9ucyBmcm9tIGl0LgoKLSAqKlByaWNlOioqIEhpZ2hlciBwcmljZXMgcmVkdWNlIHJhdGluZ3MsIHBhcnRpY3VsYXJseSBhdCB0aGUgZXh0cmVtZSBsZXZlbCAoMTUwIFRMKSwgd2hpY2ggaGFzIGEgc3Ryb25nIG5lZ2F0aXZlIGVmZmVjdC4gTG93ZXIgcHJpY2UgaW5jcmVhc2VzIHNob3cgd2Vha2VyIGFuZCBtb3N0bHkgaW5zaWduaWZpY2FudCBlZmZlY3RzLCBzdWdnZXN0aW5nIHNvbWUgdG9sZXJhbmNlIGF0IG1vZGVyYXRlIHByaWNlIGxldmVscy4KCi0gKipQYWNrYWdlIFR5cGU6KiogUGxhc3RpYyBwYWNrYWdpbmcgaGFzIHRoZSBzdHJvbmdlc3QgbmVnYXRpdmUgaW1wYWN0IG9uIHJhdGluZ3MuIFRoaXMgaGlnaGxpZ2h0cyBwYWNrYWdpbmcgYXMgYSBjcml0aWNhbCBkcml2ZXIgb2YgcHJlZmVyZW5jZSBhbmQgc3VnZ2VzdHMgdGhhdCBwbGFzdGljIGlzIHBlcmNlaXZlZCBhcyBpbmNvbnNpc3RlbnQgd2l0aCBxdWFsaXR5IG9yIHByZW1pdW0gcG9zaXRpb25pbmcuCjwvZGl2PgoKIyMgV2hhdCBEcml2ZXMgQ29uc3VtZXIgUmF0aW5ncyBmb3IgUGFja2FnZWQgQnJlYWQ/CgpgYGB7ciBjb25qb2ludC1jb2VmLXBsb3R9CmNvZWZfZGYgPC0gdGlkeShyYXRpbmdfbW9kZWwpICU+JSBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKQoKZ2dwbG90KGNvZWZfZGYsIGFlcyh4ID0gZXN0aW1hdGUsIHkgPSByZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIDEuOTYqc3RkLmVycm9yLCB4bWF4ID0gZXN0aW1hdGUgKyAxLjk2KnN0ZC5lcnJvciksIGhlaWdodCA9IDAuMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHRpdGxlID0gIkNvbmpvaW50IFJlZ3Jlc3Npb246IEVmZmVjdCBvZiBBdHRyaWJ1dGVzIG9uIFJhdGluZyIsCiAgICAgICB4ID0gIkVzdGltYXRlZCBpbXBhY3Qgb24gUmF0aW5nIiwgeSA9ICJBdHRyaWJ1dGUgbGV2ZWwiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCjxkaXYgY2xhc3M9Im5vdGUtYm94Ij4KPHNwYW4gY2xhc3M9Im5vdGUtdGl0bGUiPjxzdHJvbmc+SW50ZXJwcmV0YXRpb246IDwvc3Ryb25nPjwvc3Bhbj48YnI+CgpUaGlzIGFuYWx5c2lzIHNob3dzIHdoaWNoIHByb2R1Y3QgYXR0cmlidXRlcyBtYXR0ZXIgbW9zdCBmb3IgY29uc3VtZXIgcmF0aW5ncy4gUGFja2FnaW5nIGFuZCBwcmljZSBoYXZlIHRoZSBzdHJvbmdlc3QgaW1wYWN0LCB3aGlsZSBicmVhZCB0eXBlIGFsc28gcGxheXMgYW4gaW1wb3J0YW50IHJvbGUuIEhpZ2ggcHJpY2VzIGFuZCBwbGFzdGljIHBhY2thZ2luZyByZWR1Y2UgcHJvZHVjdCBhcHBlYWwsIHdoZXJlYXMgaGVhbHRoaWVyIGJyZWFkIG9wdGlvbnMgaW5jcmVhc2UgcmF0aW5ncy4gVGhlc2UgcmVzdWx0cyBoaWdobGlnaHQgdGhlIGltcG9ydGFuY2Ugb2YgcHJlbWl1bSBwYWNrYWdpbmcgYW5kIGRpc2NpcGxpbmVkIHByaWNpbmcgaW4gYW55IHByZW1pdW0gVU5PIGJyZWFkIGNvbmNlcHQuCgo8L2Rpdj4KCgojIC4gVXRpbGl0eS1CYXNlZCBTZWdtZW50YXRpb24gVXNpbmcgQ29uam9pbnQgUmVzdWx0cwoKVG8gaWRlbnRpZnkgZGlzdGluY3QgcHJlZmVyZW5jZS1iYXNlZCBjb25zdW1lciBzZWdtZW50cywgd2UgY29uZHVjdGVkIGEgY2x1c3RlciBhbmFseXNpcyB1c2luZyBpbmRpdmlkdWFsLWxldmVsIHBhcnQtd29ydGggdXRpbGl0aWVzIGRlcml2ZWQgZnJvbSB0aGUgZnVsbC1wcm9maWxlIGNvbmpvaW50IGV4cGVyaW1lbnQuIEVhY2ggcmVzcG9uZGVudOKAmXMgdXRpbGl0aWVzIGNhcHR1cmUgaG93IHN0cm9uZ2x5IGRpZmZlcmVudCBwcm9kdWN0IGF0dHJpYnV0ZXMgaW5mbHVlbmNlIHRoZWlyIG92ZXJhbGwgZXZhbHVhdGlvbnMuIFRoZXNlIHV0aWxpdGllcyB3ZXJlIHVzZWQgYXMgc2VnbWVudGF0aW9uIHZhcmlhYmxlcyB0byBncm91cCByZXNwb25kZW50cyB3aXRoIHNpbWlsYXIgcHJlZmVyZW5jZSBzdHJ1Y3R1cmVzLiBUaGlzIGFwcHJvYWNoIGVuYWJsZXMgc2VnbWVudGF0aW9uIGJhc2VkIHB1cmVseSBvbiB1bmRlcmx5aW5nIHByZWZlcmVuY2VzLCBpbmRlcGVuZGVudCBvZiBkZW1vZ3JhcGhpY3Mgb3Igc3RhdGVkIGF0dGl0dWRlcy4KCgpgYGB7ciBzZWctY29uam9pbnQtY2xlYW59CiMgQ29uam9pbnQgbG9uZyBmb3JtYXQKY29uam9pbnRfbG9uZyA8LSBjb25qb2ludAoKIyBFbnN1cmUgY29ycmVjdCBkYXRhIHR5cGVzCmNvbmpvaW50X2xvbmcgPC0gY29uam9pbnRfbG9uZyAlPiUKICBtdXRhdGUoCiAgICBCcmVhZF9UeXBlICAgPSBhcy5mYWN0b3IoQnJlYWRfVHlwZSksCiAgICBTbGljZV9UeXBlICAgPSBhcy5mYWN0b3IoU2xpY2VfVHlwZSksCiAgICBQYWNrYWdlX1R5cGUgPSBhcy5mYWN0b3IoUGFja2FnZV9UeXBlKSwKICAgIFByaWNlICAgICAgICA9IGFzLmZhY3RvcihQcmljZSkKICApCgpgYGAKCi0tLQoKIyMgRXN0aW1hdGUgSW5kaXZpZHVhbC1MZXZlbCBVdGlsaXRpZXMKCgpgYGB7ciBzZWctaW5kaXZpZHVhbC11dGlsaXRpZXN9CmluZGl2aWR1YWxfdXRpbGl0aWVzIDwtIGNvbmpvaW50X2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmVzcG9uZGVudElEKSAlPiUKICBkbygKICAgIHRpZHkoCiAgICAgIGxtKFJhdGluZyB+IEJyZWFkX1R5cGUgKyBTbGljZV9UeXBlICsgUGFja2FnZV9UeXBlICsgUHJpY2UsIGRhdGEgPSAuKQogICAgKQogICkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JQogIHNlbGVjdChSZXNwb25kZW50SUQsIHRlcm0sIGVzdGltYXRlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdGVybSwgdmFsdWVzX2Zyb20gPSBlc3RpbWF0ZSkKCiMgUmVwbGFjZSBtaXNzaW5nIHV0aWxpdGllcyB3aXRoIDAgKHN0YW5kYXJkIHByYWN0aWNlKQppbmRpdmlkdWFsX3V0aWxpdGllc1tpcy5uYShpbmRpdmlkdWFsX3V0aWxpdGllcyldIDwtIDAKYGBgCgpFYWNoIHJlc3BvbmRlbnQgZ2V0cyB0aGVpciBvd24gcmVncmVzc2lvbiDihpIgY29lZmZpY2llbnRzID0gKippbmRpdmlkdWFsIHV0aWxpdGllcyoqLgoKLS0tCgpgYGB7ciBzZWctbWF0cml4fQp1dGlsaXR5X3ZhcnMgPC0gc2V0ZGlmZihuYW1lcyhpbmRpdmlkdWFsX3V0aWxpdGllcyksICJSZXNwb25kZW50SUQiKQoKWCA8LSBpbmRpdmlkdWFsX3V0aWxpdGllcyAlPiUKICBzZWxlY3QoYWxsX29mKHV0aWxpdHlfdmFycykpICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKIyBTdGFuZGFyZGl6ZSB1dGlsaXRpZXMgKGNyaXRpY2FsIGZvciBjbHVzdGVyaW5nKQpYX3NjYWxlZCA8LSBzY2FsZShYKQoKCmBgYAoKCiMjIERlY2lkZSBOdW1iZXIgb2YgQ2x1c3RlcnMKCioqRWxib3cgbWV0aG9kKioKCmBgYHtyIHNlZy1lbGJvd30KZnZpel9uYmNsdXN0KFhfc2NhbGVkLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKSArCiAgbGFicyh0aXRsZSA9ICJFbGJvdyBNZXRob2QgZm9yIFNlbGVjdGluZyBOdW1iZXIgb2YgUHJlZmVyZW5jZSBTZWdtZW50cyIpCmBgYAoKPiDigJxCYXNlZCBvbiB0aGUgZWxib3csIGEgdGhyZWUtc2VnbWVudCBzb2x1dGlvbiB3YXMgc2VsZWN0ZWQu4oCdCgotLS0KCiMjIFJ1biBDbHVzdGVyIEFuYWx5c2lzIChrLW1lYW5zKQoKCmBgYHtyIHNlZy1rbWVhbnN9CnNldC5zZWVkKDEyMykKCmsgPC0gMyAgICMgY2hvb3NlIGJhc2VkIG9uIGRpYWdub3N0aWNzCmttZWFuc19maXQgPC0ga21lYW5zKFhfc2NhbGVkLCBjZW50ZXJzID0gaywgbnN0YXJ0ID0gNTApCgppbmRpdmlkdWFsX3V0aWxpdGllcyA8LSBpbmRpdmlkdWFsX3V0aWxpdGllcyAlPiUKICBtdXRhdGUoUHJlZmVyZW5jZV9TZWdtZW50ID0gZmFjdG9yKGttZWFuc19maXQkY2x1c3RlcikpCgojIFNlZ21lbnQgc2l6ZXMKaW5kaXZpZHVhbF91dGlsaXRpZXMgJT4lIGNvdW50KFByZWZlcmVuY2VfU2VnbWVudCkKYGBgCgotLS0KCiMjIFZpc3VhbGl6ZSBTZWdtZW50cwoKCmBgYHtyIHNlZy1wY2F9CnBjYSA8LSBwcmNvbXAoWF9zY2FsZWQpCgpwY2FfZGYgPC0gZGF0YS5mcmFtZSgKICBQQzEgPSBwY2EkeFssMV0sCiAgUEMyID0gcGNhJHhbLDJdLAogIFNlZ21lbnQgPSBpbmRpdmlkdWFsX3V0aWxpdGllcyRQcmVmZXJlbmNlX1NlZ21lbnQKKQoKZ2dwbG90KHBjYV9kZiwgYWVzKFBDMSwgUEMyLCBjb2xvciA9IFNlZ21lbnQpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMiwgYWxwaGEgPSAwLjcpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUHJlZmVyZW5jZS1CYXNlZCBDb25zdW1lciBTZWdtZW50cyAoQ29uam9pbnQgVXRpbGl0aWVzKSIsCiAgICB4ID0gIlByaW5jaXBhbCBDb21wb25lbnQgMSIsCiAgICB5ID0gIlByaW5jaXBhbCBDb21wb25lbnQgMiIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKIyMgU2VnbWVudCBQcm9maWxlCgpgYGB7ciBzZWctbWVhbi11dGlsaXRpZXN9CnNlZ21lbnRfbWVhbnMgPC0gaW5kaXZpZHVhbF91dGlsaXRpZXMgJT4lCiAgZ3JvdXBfYnkoUHJlZmVyZW5jZV9TZWdtZW50KSAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGFsbF9vZih1dGlsaXR5X3ZhcnMpLCBtZWFuKSwgLmdyb3VwcyA9ICJkcm9wIikKCnNlZ21lbnRfbWVhbnMKCmBgYAoKCi0tLQoKIyMgSWRlbnRpZnkgV2hhdCBEaWZmZXJlbnRpYXRlcyBFYWNoIFNlZ21lbnQKCgpgYGB7ciBzZWctdG9wLWRyaXZlcnN9CnNlZ21lbnRfbG9uZyA8LSBpbmRpdmlkdWFsX3V0aWxpdGllcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYWxsX29mKHV0aWxpdHlfdmFycyksCiAgICBuYW1lc190byA9ICJVdGlsaXR5IiwKICAgIHZhbHVlc190byA9ICJWYWx1ZSIKICApICU+JQogIGdyb3VwX2J5KFByZWZlcmVuY2VfU2VnbWVudCwgVXRpbGl0eSkgJT4lCiAgc3VtbWFyaXNlKE1lYW5VdGlsaXR5ID0gbWVhbihWYWx1ZSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIGFycmFuZ2UoUHJlZmVyZW5jZV9TZWdtZW50LCBkZXNjKGFicyhNZWFuVXRpbGl0eSkpKQoKdG9wX2RyaXZlcnMgPC0gc2VnbWVudF9sb25nICU+JQogIGdyb3VwX2J5KFByZWZlcmVuY2VfU2VnbWVudCkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYWJzKE1lYW5VdGlsaXR5KSwgbiA9IDYpCgp0b3BfZHJpdmVycwpgYGAKCgpgYGB7ciBzZWctZHJpdmVyLXBsb3R9CmdncGxvdCh0b3BfZHJpdmVycywgYWVzKHggPSBNZWFuVXRpbGl0eSwgeSA9IHJlb3JkZXIoVXRpbGl0eSwgTWVhblV0aWxpdHkpKSkgKwogIGdlb21fY29sKCkgKwogIGZhY2V0X3dyYXAofiBQcmVmZXJlbmNlX1NlZ21lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgbGFicygKICAgIHRpdGxlID0gIktleSBQcmVmZXJlbmNlIERyaXZlcnMgYnkgU2VnbWVudCIsCiAgICB4ID0gIk1lYW4gVXRpbGl0eSAoRGlyZWN0aW9uICYgU3RyZW5ndGgpIiwKICAgIHkgPSAiQXR0cmlidXRlIExldmVsIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgo8ZGl2IGNsYXNzPSJub3RlLWJveCI+CjxzcGFuIGNsYXNzPSJub3RlLXRpdGxlIj48c3Ryb25nPlNlZ21lbnRhdGlvbiBSZXN1bHRzOiA8L3N0cm9uZz48L3NwYW4+PGJyPgoKVXNpbmcgaW5kaXZpZHVhbC1sZXZlbCBjb25qb2ludCB1dGlsaXRpZXMsIHRocmVlIGRpc3RpbmN0IHByZWZlcmVuY2UtYmFzZWQgc2VnbWVudHMgd2VyZSBpZGVudGlmaWVkLiBUaGUgc2VnbWVudHMgZGlmZmVyIHByaW1hcmlseSBpbiB0aGVpciBzZW5zaXRpdml0eSB0byBwcmljZSwgcGFja2FnaW5nIHR5cGUsIGFuZCBicmVhZCB0eXBlLgoKT25lIHNlZ21lbnQgc2hvd3Mgc3Ryb25nIG5lZ2F0aXZlIHV0aWxpdGllcyBmb3IgaGlnaGVyIHByaWNlcyBhbmQgcGxhc3RpYyBwYWNrYWdpbmcsIGluZGljYXRpbmcgYSBncm91cCB0aGF0IGlzIGhpZ2hseSBwcmljZS1zZW5zaXRpdmUgYW5kIHF1YWxpdHktY29uc2Npb3VzLiBBIHNlY29uZCBzZWdtZW50IHBsYWNlcyBwb3NpdGl2ZSB1dGlsaXR5IG9uIHdob2xlIGdyYWluIGJyZWFkIGFuZCBub24tcGxhc3RpYyBwYWNrYWdpbmcsIHN1Z2dlc3RpbmcgYSBoZWFsdGgtIGFuZCBxdWFsaXR5LW9yaWVudGVkIHByZWZlcmVuY2Ugc3RydWN0dXJlIHRoYXQgaXMgcmVjZXB0aXZlIHRvIHByZW1pdW0gcG9zaXRpb25pbmcuIFRoZSB0aGlyZCBzZWdtZW50IGV4aGliaXRzIG1vcmUgbW9kZXJhdGUgdXRpbGl0aWVzIGFjcm9zcyBhdHRyaWJ1dGVzLCByZWZsZWN0aW5nIGEgYmFsYW5jZWQgcHJlZmVyZW5jZSBzdHJ1Y3R1cmUgd2l0aG91dCBhIGRvbWluYW50IGRyaXZlci4KClRoZXNlIHJlc3VsdHMgZGVtb25zdHJhdGUgdGhhdCB0aGUgcGFja2FnZWQgYnJlYWQgbWFya2V0IGlzIG5vdCBob21vZ2VuZW91cyBpbiB0ZXJtcyBvZiBwcmVmZXJlbmNlcy4gQSBwcmVtaXVtIFVOTyBicmVhZCBjb25jZXB0IGlzIHRoZXJlZm9yZSBsaWtlbHkgdG8gYXBwZWFsIG1vcmUgc3Ryb25nbHkgdG8gc3BlY2lmaWMgcHJlZmVyZW5jZSBzZWdtZW50cyByYXRoZXIgdGhhbiB0aGUgZW50aXJlIG1hcmtldC4KCjwvZGl2PgoKIyAuIEh5cG90aGVzaXMgRXZhbHVhdGlvbgoKKipIMSAoTWFya2V0IFBlbmV0cmF0aW9uKToqKiAgClN1cHBvcnRlZC4gVU5PIGlzIHBlcmNlaXZlZCBhcyByZWxpYWJsZSwgYWNjZXNzaWJsZSwgYW5kIGNvbXBldGl0aXZlIGluIHRhc3RlIGFuZCBoZWFsdGhpbmVzcy4gVGhlc2UgYXR0cmlidXRlcyBzdXBwb3J0IGNvbnRpbnVlZCBwZW5ldHJhdGlvbiBpbiB0aGUgY29yZSBwYWNrYWdlZCBicmVhZCBtYXJrZXQuCgoqKkgyIChQcm9kdWN0IERldmVsb3BtZW50IOKAkyBEaWZmZXJlbnRpYXRpb24pOioqICAKUGFydGlhbGx5IHN1cHBvcnRlZC4gQ29uc3VtZXJzIHNob3cgc3Ryb25nIHdpbGxpbmduZXNzIHRvIHRyeSBhIHByZW1pdW0gVU5PIGJyZWFkLCBidXQgcHJlbWl1bSBwZXJjZXB0aW9ucyBhcmUgbm90IHlldCB3ZWxsIGVzdGFibGlzaGVkLiBEaWZmZXJlbnRpYXRpb24gd291bGQgcmVxdWlyZSBjbGVhciBpbm5vdmF0aW9uIGFuZCBwYWNrYWdpbmcgY3Vlcy4KCioqSDMgKFByZW1pdW0gQWRvcHRpb24gUG90ZW50aWFsKToqKiAgClBhcnRpYWxseSBzdXBwb3J0ZWQuIFdoaWxlIHRyaWFsIGludGVudCBpcyBoaWdoLCBzdXN0YWluZWQgYmVoYXZpb3JzIHN1Y2ggYXMgd2Vla2x5IHB1cmNoYXNlIGFuZCB3aWxsaW5nbmVzcyB0byBwYXkgYSBoaWdoZXIgcHJpY2UgYXJlIG1vcmUgbW9kZXJhdGUsIHN1Z2dlc3Rpbmcgc2VsZWN0aXZlIHJhdGhlciB0aGFuIG1hc3MgYWRvcHRpb24uCgoqKkg0IChCcmFuZCBTdHJldGNoIHRvIFByZW1pdW0pOioqICAKQ29uZGl0aW9uYWxseSBzdXBwb3J0ZWQuIFVOTyBoYXMgc3Ryb25nIGJyYW5kIGNyZWRpYmlsaXR5LCBidXQgcHJlbWl1bSBwb3NpdGlvbmluZyBpcyB3ZWFrZXIuIEEgcHJlbWl1bSBleHRlbnNpb24gaXMgZmVhc2libGUgaWYgc3VwcG9ydGVkIGJ5IGRpc3RpbmN0aXZlIHBhY2thZ2luZywgaGVhbHRoLW9yaWVudGVkIHBvc2l0aW9uaW5nLCBhbmQgY29udHJvbGxlZCBwcmljaW5nLgoKIyAuIE1hbmFnZXJpYWwgUmVjb21tZW5kYXRpb24KClRoaXMgYW5hbHlzaXMgaWRlbnRpZmllcyB0aGUgcHJvZHVjdCBhdHRyaWJ1dGVzIHRoYXQgbW9zdCBzdHJvbmdseSBpbmZsdWVuY2UgY29uc3VtZXIgcmF0aW5ncyBhbmQgdGhlcmVmb3JlIHNob3VsZCBndWlkZSBtYW5hZ2VyaWFsIGRlY2lzaW9uLW1ha2luZyBmb3IgYSBwb3RlbnRpYWwgcHJlbWl1bSBVTk8gYnJlYWQgbGF1bmNoLgoKVGhlIHJlc3VsdHMgY2xlYXJseSBzaG93IHRoYXQgKipwYWNrYWdpbmcgdHlwZSBhbmQgcHJpY2UgYXJlIHRoZSBtb3N0IGluZmx1ZW50aWFsIGRyaXZlcnMgb2YgY29uc3VtZXIgZXZhbHVhdGlvbnMqKi4gUGxhc3RpYyBwYWNrYWdpbmcgaGFzIHRoZSBzdHJvbmdlc3QgbmVnYXRpdmUgZWZmZWN0IG9uIHJhdGluZ3MsIGluZGljYXRpbmcgdGhhdCBjb25zdW1lcnMgYXNzb2NpYXRlIHBsYXN0aWMgcGFja2FnaW5nIHdpdGggbG93ZXIgcXVhbGl0eSBhbmQgd2Vha2VyIHByZW1pdW0gdmFsdWUuIEZyb20gYSBtYW5hZ2VyaWFsIHBlcnNwZWN0aXZlLCB0aGlzIGltcGxpZXMgdGhhdCBhbnkgcHJlbWl1bSBwb3NpdGlvbmluZyBlZmZvcnQgd291bGQgYmUgdW5kZXJtaW5lZCBpZiBwbGFzdGljIHBhY2thZ2luZyBpcyB1c2VkLCByZWdhcmRsZXNzIG9mIG90aGVyIHByb2R1Y3QgZmVhdHVyZXMuCgpQcmljZSBzZW5zaXRpdml0eSBpcyBhbHNvIHByb25vdW5jZWQuIFdoaWxlIG1vZGVyYXRlIHByaWNlIGxldmVscyBkbyBub3Qgc2lnbmlmaWNhbnRseSByZWR1Y2UgcmF0aW5ncywgaGlnaGVyIHByaWNlIHBvaW50c+KAlGVzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIGVuZOKAlGxlYWQgdG8gYSBzdWJzdGFudGlhbCBkcm9wIGluIGNvbnN1bWVyIGV2YWx1YXRpb25zLiBUaGlzIHN1Z2dlc3RzIHRoYXQgY29uc3VtZXJzIGFyZSBvcGVuIHRvIHBheWluZyBtb3JlIGZvciBwcmVtaXVtIGJyZWFkLCBidXQgb25seSB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGRzIGFuZCB3aGVuIHRoZSBwcmVtaXVtIHZhbHVlIGlzIGNsZWFybHkgY29tbXVuaWNhdGVkLgoKQnJlYWQgdHlwZSBwbGF5cyBhIHNlY29uZGFyeSBidXQgbWVhbmluZ2Z1bCByb2xlLiBXaG9sZSBncmFpbiBvcHRpb25zIHBvc2l0aXZlbHkgaW5mbHVlbmNlIHJhdGluZ3MsIHNpZ25hbGluZyB0aGF0IGhlYWx0aC1vcmllbnRlZCBwb3NpdGlvbmluZyBjYW4gZW5oYW5jZSBwZXJjZWl2ZWQgdmFsdWUuIEluIGNvbnRyYXN0LCB0cmFkaXRpb25hbCBicmVhZCB0eXBlcyBkbyBub3QgcHJvdmlkZSBkaWZmZXJlbnRpYXRpb24gaW4gYSBwcmVtaXVtIGNvbnRleHQuCgpTbGljZSB0eXBlIGhhcyBhIHJlbGF0aXZlbHkgd2VhayBhbmQgbmVnYXRpdmUgaW1wYWN0IG9uIHJhdGluZ3MsIGluZGljYXRpbmcgdGhhdCBpdCBpcyBub3QgYSBwcmltYXJ5IGRlY2lzaW9uIGZhY3RvciBmb3IgY29uc3VtZXJzLiBUaGlzIHN1Z2dlc3RzIHRoYXQgc2xpY2UgdGhpY2tuZXNzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgaHlnaWVuZSBhdHRyaWJ1dGUgcmF0aGVyIHRoYW4gYSBzdHJhdGVnaWMgbGV2ZXIuCgpPdmVyYWxsLCB0aGUgZmluZGluZ3Mgc3VnZ2VzdCB0aGF0IGEgc3VjY2Vzc2Z1bCBwcmVtaXVtIFVOTyBicmVhZCBzdHJhdGVneSBzaG91bGQgZm9jdXMgb24gKipub24tcGxhc3RpYywgcHJlbWl1bSBwYWNrYWdpbmcqKiwgKipoZWFsdGgtb3JpZW50ZWQgYnJlYWQgdHlwZXMqKiwgYW5kICoqY2FyZWZ1bGx5IGNhbGlicmF0ZWQgcHJpY2luZyoqLiBJbnZlc3RtZW50cyBpbiB0aGVzZSBhcmVhcyBhcmUgbGlrZWx5IHRvIHlpZWxkIGhpZ2hlciByZXR1cm5zIHRoYW4gY2hhbmdlcyB0byBzZWNvbmRhcnkgYXR0cmlidXRlcyBzdWNoIGFzIHNsaWNlIHR5cGUuCgpIb3dldmVyLCB0aGVzZSBhdHRyaWJ1dGUtbGV2ZWwgaW5zaWdodHMgcmVwcmVzZW50IGF2ZXJhZ2UgZWZmZWN0cyBhY3Jvc3MgY29uc3VtZXJzLgpJbiBhZGRpdGlvbiwgdGhlIHByZWZlcmVuY2UtYmFzZWQgc2VnbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBpbmRpdmlkdWFsLWxldmVsIGNvbmpvaW50IHV0aWxpdGllcyBpbmRpY2F0ZXMgdGhhdCB0aGVzZSBtYW5hZ2VyaWFsIGltcGxpY2F0aW9ucyBkbyBub3QgYXBwbHkgdW5pZm9ybWx5IGFjcm9zcyBhbGwgY29uc3VtZXJzLiBUaGUgYW5hbHlzaXMgcmV2ZWFscyBtZWFuaW5nZnVsIGhldGVyb2dlbmVpdHkgaW4gaG93IGRpZmZlcmVudCBzZWdtZW50cyBldmFsdWF0ZSBwcmljZSwgcGFja2FnaW5nLCBhbmQgcHJvZHVjdCBhdHRyaWJ1dGVzLgoKU3BlY2lmaWNhbGx5LCBvbmUgc2VnbWVudCBleGhpYml0cyBzdHJvbmcgcHJpY2Ugc2Vuc2l0aXZpdHkgYW5kIHBsYWNlcyBsaW1pdGVkIHZhbHVlIG9uIHByZW1pdW0gY3Vlcywgc3VnZ2VzdGluZyB0aGF0IHByZW1pdW0gcG9zaXRpb25pbmcgd291bGQgYmUgbGVzcyBlZmZlY3RpdmUgZm9yIHRoaXMgZ3JvdXAuIEZvciB0aGVzZSBjb25zdW1lcnMsIG1haW50YWluaW5nIGNvbXBldGl0aXZlIHByaWNpbmcgYW5kIHJlaW5mb3JjaW5nIFVOT+KAmXMgcm9sZSBhcyBhIHJlbGlhYmxlIGV2ZXJ5ZGF5IGJyZWFkIGJyYW5kIHJlbWFpbnMgY3JpdGljYWwuCgpJbiBjb250cmFzdCwgYW5vdGhlciBzZWdtZW50IHNob3dzIGEgc3Ryb25nZXIgcG9zaXRpdmUgcmVzcG9uc2UgdG8gaGVhbHRoLW9yaWVudGVkIGJyZWFkIHR5cGVzIGFuZCBub24tcGxhc3RpYywgcHJlbWl1bSBwYWNrYWdpbmcsIHdoaWxlIGRlbW9uc3RyYXRpbmcgZ3JlYXRlciB0b2xlcmFuY2UgZm9yIGhpZ2hlciBwcmljZXMuIFRoaXMgc2VnbWVudCByZXByZXNlbnRzIHRoZSBwcmltYXJ5IHRhcmdldCBmb3IgYSBwcmVtaXVtIFVOTyBicmVhZCBvZmZlcmluZywgYXMgdGhlIGtleSBkcml2ZXJzIGlkZW50aWZpZWQgaW4gdGhlIGNvbmpvaW50IGFuYWx5c2lzIGFsaWduIGNsb3NlbHkgd2l0aCB0aGVpciB1bmRlcmx5aW5nIHByZWZlcmVuY2Ugc3RydWN0dXJlLgoKQSB0aGlyZCBzZWdtZW50IGRpc3BsYXlzIG1vcmUgYmFsYW5jZWQgdXRpbGl0aWVzIGFjcm9zcyBhdHRyaWJ1dGVzLCBpbmRpY2F0aW5nIGZsZXhpYmlsaXR5IGJ1dCB3ZWFrZXIgYXR0YWNobWVudCB0byBhbnkgc2luZ2xlIHByZW1pdW0gZHJpdmVyLiBGb3IgdGhpcyBncm91cCwgb3ZlcmFsbCBwcm9kdWN0IGNvaGVyZW5jZSBhbmQgY29tbXVuaWNhdGlvbiBtYXkgbWF0dGVyIG1vcmUgdGhhbiBzcGVjaWZpYyBhdHRyaWJ1dGUgb3B0aW1pemF0aW9uLgoKVGFrZW4gdG9nZXRoZXIsIHRoZXNlIGZpbmRpbmdzIHN1Z2dlc3QgdGhhdCBhIHByZW1pdW0gVU5PIGJyZWFkIHN0cmF0ZWd5IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIHRhcmdldGVkIGluaXRpYXRpdmUgcmF0aGVyIHRoYW4gYSBtYXNzLW1hcmtldCByZXBvc2l0aW9uaW5nLiBCeSBsZXZlcmFnaW5nIHByZWZlcmVuY2UtYmFzZWQgc2VnbWVudGF0aW9uLCBVTk8gY2FuIHNlbGVjdGl2ZWx5IGFkZHJlc3Mgc2VnbWVudHMgdGhhdCB2YWx1ZSBwcmVtaXVtIHBhY2thZ2luZywgaGVhbHRoLW9yaWVudGVkIHByb2R1Y3RzLCBhbmQgZGlmZmVyZW50aWF0ZWQgb2ZmZXJpbmdzLCB3aGlsZSBjb250aW51aW5nIHRvIHNlcnZlIHByaWNlLXNlbnNpdGl2ZSBzZWdtZW50cyB0aHJvdWdoIGl0cyBjb3JlIHByb2R1Y3QgcG9ydGZvbGlvLiBUaGlzIHNlZ21lbnRlZCBhcHByb2FjaCBtaW5pbWl6ZXMgcmlzayBhbmQgbWF4aW1pemVzIHRoZSByZXR1cm4gb24gaW52ZXN0bWVudCBmcm9tIHByZW1pdW0gcHJvZHVjdCBkZXZlbG9wbWVudC4KCi0tLQo=