3. Derived Measures
# ===== Identify column groups by name =====
# Subject-matter (ACROSS)
sm_across_cols <- c(
"biodiversity_ecosystem_conservation_across_igo",
"cultural_heritage_traditional_knowledge_data_governance_across_igo",
"disaster_risk_reduction_resilience_across_igo",
"environmental_protection_climate_change_across_igo",
"human_rights_social_justice_advocacy_across_igo",
"international_cooperation_governance_across_igo",
"research_science_innovation_across_igo",
"security_safety_across_igo",
"sustainable_development_capacity_building_across_igo",
"trade_investment_economic_cooperation_across_igo"
)
# Spatial (ACROSS)
spatial_across_cols <- c(
"archipelago_across_igo",
"coastal_zone_across_igo",
"contiguous_zone_cz_across_igo",
"enclosed_or_semi_enclosed_sea_across_igo",
"exclusive_economic_zone_eez_across_igo",
"extended_continental_shelf_cs_across_igo",
"high_seas_across_igo",
"internal_waters_across_igo",
"territorial_sea_ts_across_igo",
"the_area_across_igo"
)
# Inter-institutional ties (ACROSS)
interinst_across_cols <- c(
"civil_society_engagement_across_igo",
"donor_partnerships_across_igo",
"intergovernmental_consultations_across_igo",
"ngo_engagement_across_igo",
"private_sector_partnerships_across_igo",
"regional_body_coordination_across_igo",
"scientific_community_linkages_across_igo",
"technical_or_expert_groups_across_igo",
"treaty_body_coordination_across_igo",
"un_system_collaboration_across_igo"
)
# Strategies (ACROSS)
strategy_across_cols <- c(
"capacity_development_operational_delivery_across_igo",
"collaboration_partnerships_networks_across_igo",
"environmental_climate_biodiversity_action_across_igo",
"financial_budgetary_management_across_igo",
"inclusion_rights_social_justice_across_igo",
"innovation_technology_across_igo",
"knowledge_data_across_igo",
"monitoring_accountability_across_igo",
"policy_regulation_across_igo",
"strategic_institutional_planning_across_igo"
)
# Legal authority / sources (ACROSS) + master score
sources_across_cols <- c(
"bilateral_multilateral_arrangements_across_igo",
"binding_secondary_law_across_igo",
"compliance_oversight_across_igo",
"customary_soft_law_across_igo",
"delegated_or_derived_powers_across_igo",
"foundational_treaties_charters_across_igo",
"non_binding_secondary_law_across_igo",
"other_governance_instruments_across_igo",
"strategic_frameworks_across_igo",
"technical_norms_standards_across_igo"
)
# ===== Derived measures =====
df <- df %>%
rowwise() %>%
mutate(
# Specialisation metrics (Subject-Matter, ACROSS)
sm_breadth = sum(c_across(all_of(sm_across_cols)) > 0, na.rm = TRUE),
sm_HHI = hhi(c_across(all_of(sm_across_cols))),
sm_Shannon = shannon(c_across(all_of(sm_across_cols))),
# Spatial breadth (ACROSS)
spatial_breadth = sum(c_across(all_of(spatial_across_cols)) > 0, na.rm = TRUE),
# Inter-institutional index (mean of ACROSS ties)
interinst_index = mean(c_across(all_of(interinst_across_cols)), na.rm = TRUE),
# Strategy breadth (ACROSS)
strategy_breadth = sum(c_across(all_of(strategy_across_cols)) > 0, na.rm = TRUE),
# Legal authority index (z-averaged: ACROSS sources + ordinal master)
legal_authority_index = mean(
c(scale(c_across(all_of(sources_across_cols))),
scale(c_across(ordinal_score_sources))),
na.rm = TRUE
)
) %>%
ungroup()
# View df
view(df)
4. Analysis
4.1 H2.1: Higher institutional density at founding increases
specialization (↑ HHI).
library(ggplot2)
library(dplyr)
library(ggrepel)
# 1. Identify primary subject-matter per IGO
subject_cols <- names(df)[59:68]
df$primary_subject <- subject_cols[apply(df[, subject_cols], 1, which.max)]
# 2. Recode subject categories to shorter names
df$primary_subject <- recode(df$primary_subject,
"Biodiversity & Ecosystem Conservation_AcrossIGO" = "Biodiversity",
"Cultural Heritage, Traditional Knowledge & Data Governance_AcrossIGO" = "Heritage/Data",
"Disaster Risk Reduction & Resilience_AcrossIGO" = "Disaster/Resilience",
"Environmental Protection & Climate Change_AcrossIGO" = "Environment/Climate",
"Human Rights, Social Justice & Advocacy_AcrossIGO" = "Rights/Justice",
"International Cooperation & Governance_AcrossIGO" = "Governance",
"Research, Science & Innovation_AcrossIGO" = "Research/Science",
"Security & Safety_AcrossIGO" = "Security",
"Sustainable Development & Capacity Building_AcrossIGO" = "Sustainable Dev.",
"Trade, Investment & Economic Cooperation_AcrossIGO" = "Trade/Econ",
.default = df$primary_subject
)
# 3. Pick IGOs to label (5 broadest + 5 most specialized)
label_df <- df %>%
arrange(sm_HHI) %>%
slice(c(1:5, (n() - 4):n()))
# 4. Regression model
m_h21 <- lm(sm_HHI ~ scale(founding_density_5yr) + scale(cumulative_stock), data = df)
# 5. Predictions
newdat <- data.frame(
founding_density_5yr = seq(min(df$founding_density_5yr, na.rm = TRUE),
max(df$founding_density_5yr, na.rm = TRUE), length.out = 200),
cumulative_stock = median(df$cumulative_stock, na.rm = TRUE)
)
pred <- predict(m_h21, newdata = newdat, se.fit = TRUE)
pred_df <- newdat %>%
mutate(
fit = pred$fit,
upper = pred$fit + 1.96 * pred$se.fit,
lower = pred$fit - 1.96 * pred$se.fit
)
# 6. Plot with default ggplot colors
library(stringr)
# Define and wrap caption text
caption_text <- "Figure 2.1. Institutional Density and Specialization (HHI).
This figure tests whether IGOs founded in denser institutional environments are more specialized in their mandates. Each point represents an IGO, colored by its primary subject-matter domain, with selected IGOs labeled for reference. The regression line, with 95% confidence intervals, shows a weak negative relationship between founding density and specialization. This suggests that crowding alone does not systematically push IGOs toward narrower mandates. Highly specialized organizations (e.g., ITU, ICES) remain focused regardless of density, while broader development-oriented IGOs (e.g., UNDP, IFAD, UNU) sustain wide-ranging portfolios even in dense founding periods. Overall, subject domain and organizational design appear more influential than founding density in shaping specialization."
# Wrap caption at ~100 characters per line
caption_wrapped <- str_wrap(caption_text, width = 100)
# Add to ggplot
p <- ggplot() +
geom_point(data = df, aes(x = founding_density_5yr, y = sm_HHI, color = primary_subject),
alpha = 0.8, size = 2) +
geom_ribbon(data = pred_df, aes(x = founding_density_5yr, ymin = lower, ymax = upper),
alpha = 0.2, fill = "grey70") +
geom_line(data = pred_df, aes(x = founding_density_5yr, y = fit),
color = "black", size = 1) +
geom_text_repel(data = label_df, aes(x = founding_density_5yr, y = sm_HHI, label = institution),
size = 3, max.overlaps = 20, box.padding = 0.4, point.padding = 0.3) +
labs(
title = "Hypothesis 2.1:Higher institutional density at founding increases specialization (HHI)",
x = "Founding Density (±2 years)",
y = "Specialization",
color = "Subject matter",
caption = caption_wrapped
) +
theme_minimal(base_size = 12) +
theme(
p + theme(legend.position = "right"),
legend.text = element_text(size = 8),
legend.title = element_text(size = 5, face = "bold"),
plot.caption = element_text(hjust = 0, size = 7, lineheight = 1.2, face = "italic"),
plot.subtitle = element_text(size = 11, margin = margin(b = 10))
)
# Save wider figure
ggsave("figure_2_1_h2_1_density_specialization.png", plot = p, width = 11, height = 6, dpi = 300, bg ="white")
print(p)

Conclusion for Hypothesis 2.1
Expected hypothesis: Higher density → more
specialization.
- The relationship is weak. Some IGOs (e.g., UNDP,
WFP) manage to remain broad despite institutional crowding, while others
(e.g., ITU, ICES) specialize strongly regardless of density.
Implication:
Institutional density alone does not fully explain
specialization.
Subject-matter domain and organizational design matter:
technical/scientific IGOs (e.g., ITU, ICES) are naturally more
specialized, while development-focused IGOs (UNDP, IFAD) remain broad
because their mandates require addressing multiple issues
simultaneously.
4.2 H2.2 Hypothesis 2.2: IGOs founded in denser environments have
narrower portfolios.
library(stringr)
# --- Caption text (wrapped to ~100 characters per line for readability) ---
caption_text <- str_wrap(
"**Figure 2.2. Density and Subject-Matter Breadth.**
This figure tests whether IGOs founded in denser institutional environments exhibit broader mandates (measured as the number of subject domains covered). Each dot represents an IGO, colored by its primary subject-matter domain. The regression line (with 95% confidence band) shows a positive association: higher founding density is linked with broader subject coverage. Labeled IGOs illustrate the extremes, from narrow specialists (e.g., ITU, ICES, IPCC) to broad generalists (e.g., UNU, UNDP, UNCCD).",
width = 100
)
# --- Plot ---
h2 <- ggplot() +
# Raw data points
geom_point(data = df, aes(x = founding_density_5yr, y = sm_breadth, color = primary_subject),
alpha = 0.7, size = 2) +
# Regression fit
geom_ribbon(data = pred_df, aes(x = founding_density_5yr, ymin = lower, ymax = upper),
alpha = 0.2, fill = "orange") +
geom_line(data = pred_df, aes(x = founding_density_5yr, y = fit),
color = "darkred", size = 1.2) +
# Labels for notable IGOs
geom_text_repel(data = label_df, aes(x = founding_density_5yr, y = sm_breadth, label = institution),
size = 3, max.overlaps = 15, box.padding = 0.3, point.padding = 0.2) +
# Labels and style
labs(
title = "Figure 2.2 Hypothesis 2.2 — Density and Subject-Matter Breadth",
subtitle = "Colored by primary subject domain; regression fit with 95% CI",
x = "Founding Density (±2 years)",
y = "Subject-Matter Breadth (Number of Domains)",
color = "Primary Subject",
caption = caption_text # <--- caption here
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
legend.position = "right",
legend.box = "vertical",
plot.caption = element_text(hjust = 0, size = 9, lineheight = 1.1, face = "italic")
)
# --- Save with solid background ---
ggsave("figure_2_2_h2_2_density_and_subject_matter_breadth.png", plot = h2,
width = 11, height = 6, dpi = 300, bg = "white")
print(h2)

Overall trend (line and band):
- Unlike Hypothesis 2.1, where specialization (HHI) was weakly linked
to density, here the regression line slopes upward, indicating that
higher founding density is associated with greater breadth of mandates.
This suggests that IGOs created in crowded environments may expand their
coverage across multiple domains rather than narrowing their focus.
Specialist IGOs (low breadth):
- ITU, ICES, IPCC remain narrowly focused (1–2 domains), even when
founded in environments of varying density. These are technical or
scientific IGOs where narrow mandates are a functional necessity.
Generalist IGOs (high breadth):
- UNU, UNDP, UNCCD, IFAD cover 6–8 domains, reflecting
multidimensional mandates in development, environment, or governance.
Notably, these IGOs appear in denser founding environments, consistent
with the upward slope of the regression.
Subject domains (colors):
Broad mandates are especially common in development, governance, and
environment domains (e.g., UNDP, UNCCD), while science/technical
organizations remain specialized.
Comparison to Hypothesis 2.1:
Together, Figures 2.1 and 2.2 show a nuanced picture:
Using specialization (HHI) → density does not strongly drive
specialization.
Using breadth (domain count) → density appears to encourage
broader coverage, at least for development-oriented IGOs.
Implication:
IGOs respond to dense institutional environments not only by carving
out niches (as theory suggested) but also by adopting broader mandates
to remain relevant and competitive, especially in domains where overlap
and coordination are central (development, environment, governance).
4.3 Hypothesis 2.3 Spatial jurisdiction breadth decreases as density
increases
library(ggplot2)
library(dplyr)
df$density_group <- cut(df$founding_density_5yr,
breaks = quantile(df$founding_density_5yr, probs = c(0, .33, .66, 1), na.rm=TRUE),
include.lowest = TRUE,
labels = c("Low Density", "Medium Density", "High Density"))
summary_df <- df %>%
group_by(density_group) %>%
summarise(
mean_spatial = mean(spatial_breadth, na.rm=TRUE),
se = sd(spatial_breadth, na.rm=TRUE) / sqrt(n()),
.groups = "drop"
)
m_h23 <- glm(spatial_breadth ~ scale(founding_density_5yr), data = df, family = "poisson")
anova_result <- anova(m_h23, test = "Chisq")
print(summary(m_h23))
Call:
glm(formula = spatial_breadth ~ scale(founding_density_5yr),
family = "poisson", data = df)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.84702 0.09452 8.962 <2e-16 ***
scale(founding_density_5yr) 0.02368 0.09510 0.249 0.803
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 122.86 on 47 degrees of freedom
Residual deviance: 122.80 on 46 degrees of freedom
AIC: 219
Number of Fisher Scoring iterations: 5
print(anova_result)
Analysis of Deviance Table
Model: poisson, link: log
Response: spatial_breadth
Terms added sequentially (first to last)
Df Deviance Resid. Df Resid. Dev Pr(>Chi)
NULL 47 122.86
scale(founding_density_5yr) 1 0.061814 46 122.80 0.8037
label_df <- df %>%
arrange(spatial_breadth) %>%
slice(c(1:3, (n() - 2):n())) # 3 narrowest + 3 broadest
# --- Caption text ---
caption_text <- str_wrap(
"Figure 2.3. Density and Spatial Breadth.
This figure tests whether IGOs founded in denser institutional environments cover broader jurisdictional areas (spatial breadth).
Bars show the mean number of jurisdictions covered in low-, medium-, and high-density founding periods, with 95% confidence intervals.
The results suggest a modest positive relationship: IGOs founded in high-density environments tend to cover more jurisdictions,
though variation remains substantial across cases.",
width = 100
)
h3 <- ggplot(summary_df, aes(x = density_group, y = mean_spatial, fill = density_group)) +
geom_col(alpha = 0.8, width = 0.6) +
geom_errorbar(aes(ymin = mean_spatial - 1.96*se, ymax = mean_spatial + 1.96*se),
width = 0.2, size = 1) +
geom_text(aes(label = round(mean_spatial,1)), vjust = -1, size = 4, fontface = "bold") +
labs(
title = "Figure 2.3 Hypothesis 2.3 — Density and Spatial Breadth",
subtitle = "Mean jurisdictional coverage of IGOs across density groups (±95% CI)",
x = "Founding Density (Grouped)",
y = "Average Spatial Breadth (Jurisdictions)",
caption = caption_text
) +
scale_fill_manual(values = c("Low Density" = "#8dd3c7",
"Medium Density" = "#ffffb3",
"High Density" = "#fb8072")) +
theme_minimal(base_size = 14) +
theme(
legend.position = "none",
plot.title = element_text(face = "bold"),
plot.caption = element_text(hjust = 0, size = 9, lineheight = 1.1, face = "italic") # caption styling
)
ggsave("figure_2_3_h2_3_spatial_breadth.png", plot = h3,
width = 9, height = 6, dpi = 300, bg = "white")
print(h3)

Implication:
Figure 2.3 tests whether institutional density at the time of
founding influences the geographical scope (spatial breadth) of IGOs.
The results show a modest but non-linear pattern: IGOs founded in
medium-density periods tend to have the broadest spatial coverage on
average (≈2.7 jurisdictions), while those founded in low-density
contexts remain narrower (≈1.9 jurisdictions). Interestingly,
organizations emerging in high-density periods are not significantly
broader than those in low-density contexts, suggesting that intense
institutional crowding does not automatically translate into wider
geographical mandates.
This finding complements the previous hypotheses. Whereas Hypothesis
2.1 suggested that density was only weakly associated with greater
specialization (HHI), and Hypothesis 2.2 indicated a slight positive
relationship with subject-matter breadth, Hypothesis 2.3 highlights a
more nuanced dynamic: institutional crowding appears to encourage
expansion of jurisdictional reach only up to a point. Beyond this,
high-density environments may constrain or channel IGOs into narrower or
more selective spatial niches, reflecting pressures to avoid redundancy
and overlap.
4.4 Hypothesis 2.4 Stronger coordination mechanisms allow IGOs to
survive density pressures without extreme specialization.
label_df <- df %>%
group_by(density_group) %>%
slice_min(order_by = strategy_breadth, n = 1, with_ties = FALSE) %>%
bind_rows(
df %>%
group_by(density_group) %>%
slice_max(order_by = strategy_breadth, n = 1, with_ties = FALSE)
) %>%
ungroup()
caption_text <- str_wrap(
"Figure 2.4. Density and Strategic Breadth.
The figure shows the distribution of strategy portfolio breadth (number of strategies adopted) across IGOs founded in low-, medium-, and high-density environments.
Each ridge represents the spread of strategic breadth scores, while labeled points highlight selected IGOs with the narrowest and broadest portfolios in each group.
For example, ITU (Low Density) shows limited breadth, while UN Women (Low Density) represents a broader strategic mandate.
In the High Density group, UN DOALOS has a relatively narrow strategy set, while FAO displays a wide-ranging portfolio.
Bars capture the diversity of approaches IGOs adopt depending on institutional crowding at the time of founding.",
width = 100
)
h4 <- ggplot(df, aes(x = strategy_breadth, y = density_group, fill = density_group)) +
geom_density_ridges(alpha = 0.6, scale = 1.1, rel_min_height = 0.01, color = "white") +
geom_point(data = label_df, aes(x = strategy_breadth, y = density_group),
color = "black", size = 3) +
geom_text_repel(data = label_df,
aes(x = strategy_breadth, y = density_group,
label = institution),
size = 3, nudge_y = 0.25, segment.color = "grey40") +
labs(
title = "Figure 2.4 Hypothesis 2.4 — Density and Strategic Breadth",
x = "Strategic Breadth (Number of Strategies)",
y = "Founding Density Group",
caption = caption_text
) +
scale_fill_manual(values = c("Low Density" = "#80b1d3",
"Medium Density" = "#fdb462",
"High Density" = "#b3de69")) +
theme_minimal(base_size = 14) +
theme(
legend.position = "right",
plot.title = element_text(size =11, face = "bold"),
plot.caption = element_text(hjust = 0, size = 9, lineheight = 1.1, face = "italic")
)
ggsave("figure_2_4_h2_4_strategic_breadth_labeled.png",
plot = h4, width = 9, height = 6, dpi = 300, bg = "white")
print(h4)

Implication:
Figure 2.4 examines whether IGOs founded in denser institutional
environments pursue broader strategic portfolios. The distributions
suggest a clear trend: IGOs in medium- and high-density environments
tend to adopt a wider range of strategies than those founded in
low-density periods. Importantly, the figure also highlights variation
within each density group. For instance, ITU (founded in a low-density
era) shows a narrow strategy focus, while UN Women, also from a
low-density period, is far more diversified. Similarly, among
high-density IGOs, UN DOALOS pursues a relatively narrow set of
strategies, whereas FAO exhibits one of the broadest portfolios in the
dataset.
This supports Hypothesis 2.4 by showing that institutional crowding
generally pushes IGOs toward greater strategic breadth, though not
uniformly. Compared to Hypothesis 2.1 (specialization) and Hypothesis
2.2 (subject-matter breadth), this finding strengthens the view that
denser institutional environments encourage organizations to expand
their portfolios of action rather than restrict them to narrow mandates.
In contrast to Hypothesis 2.3 (spatial breadth), where high density
limited expansion, here high density tends to encourage more diversified
strategies, reflecting pressures for organizations to remain relevant
and responsive within crowded governance landscapes.
4.5 Hypothesis 2.5 Legal authority moderates the effect of density
on specialization.
library(stringr)
library(ggrepel)
df$legal_group <- factor(df$legal_group,
levels = c("Low Legal Authority", "High Legal Authority"))
m_h25 <- lm(sm_HHI ~ scale(founding_density_5yr) * legal_group +
scale(cumulative_stock),
data = df)
summary(m_h25)
Call:
lm(formula = sm_HHI ~ scale(founding_density_5yr) * legal_group +
scale(cumulative_stock), data = df)
Residuals:
Min 1Q Median 3Q Max
-0.22310 -0.08521 -0.03730 0.06949 0.58153
Coefficients:
Estimate
(Intercept) 0.344470
scale(founding_density_5yr) -0.048912
legal_groupHigh Legal Authority -0.067270
scale(cumulative_stock) 0.001015
scale(founding_density_5yr):legal_groupHigh Legal Authority 0.018296
Std. Error
(Intercept) 0.031810
scale(founding_density_5yr) 0.028713
legal_groupHigh Legal Authority 0.043548
scale(cumulative_stock) 0.022439
scale(founding_density_5yr):legal_groupHigh Legal Authority 0.047365
t value
(Intercept) 10.829
scale(founding_density_5yr) -1.703
legal_groupHigh Legal Authority -1.545
scale(cumulative_stock) 0.045
scale(founding_density_5yr):legal_groupHigh Legal Authority 0.386
Pr(>|t|)
(Intercept) 7.29e-14 ***
scale(founding_density_5yr) 0.0957 .
legal_groupHigh Legal Authority 0.1297
scale(cumulative_stock) 0.9641
scale(founding_density_5yr):legal_groupHigh Legal Authority 0.7012
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1441 on 43 degrees of freedom
Multiple R-squared: 0.1056, Adjusted R-squared: 0.02245
F-statistic: 1.27 on 4 and 43 DF, p-value: 0.2966
newdat <- expand.grid(
founding_density_5yr = seq(min(df$founding_density_5yr, na.rm=TRUE),
max(df$founding_density_5yr, na.rm=TRUE), length.out = 200),
legal_group = c("Low Legal Authority", "High Legal Authority"),
cumulative_stock = median(df$cumulative_stock, na.rm=TRUE)
)
pred <- predict(m_h25, newdata = newdat, se.fit = TRUE)
pred_df <- cbind(newdat, fit = pred$fit, se = pred$se.fit) %>%
mutate(upper = fit + 1.96*se, lower = fit - 1.96*se)
label_df <- df %>%
group_by(legal_group) %>%
slice_max(order_by = sm_HHI, n = 2) %>%
bind_rows(
df %>% group_by(legal_group) %>% slice_min(order_by = sm_HHI, n = 2)
) %>%
ungroup()
caption_text <- str_wrap(
"Figure 2.5. Density, Legal Authority, and Specialization.
The figure shows the effect of founding density on the degree of specialization (HHI) of IGOs, comparing organizations with high legal authority (green) versus low legal authority (orange).
The regression lines represent predicted specialization, with shaded areas indicating 95% confidence intervals.
Points represent IGOs, with selected organizations labeled for context (e.g., ITU, IPCC, UNDP, UNU, UNODC, IFAD, WFP, UNCCD).
IGOs with high legal authority generally cluster at lower specialization levels, while low-legal authority IGOs show greater variation in specialization, especially at lower densities.",
width = 100
)
h5 <- ggplot() +
geom_point(data = df,
aes(x = founding_density_5yr, y = sm_HHI,
color = legal_group),
alpha = 0.6, size = 2) +
geom_ribbon(data = pred_df,
aes(x = founding_density_5yr, ymin = lower, ymax = upper, fill = legal_group),
alpha = 0.15) +
geom_line(data = pred_df,
aes(x = founding_density_5yr, y = fit, color = legal_group),
size = 1) +
geom_text_repel(data = label_df,
aes(x = founding_density_5yr, y = sm_HHI,
label = institution, color = legal_group),
size = 3, segment.color = "grey50") +
labs(
title = "Figure 2.5 Hypothesis 2.5:Density, Legal Authority, and Specialization",
x = "Founding Density (±2 years)",
y = "Specialization (HHI)",
color = "Legal Authority",
fill = "Legal Authority",
caption = caption_text
) +
scale_color_manual(values = c("High Legal Authority" = "#1b9e77",
"Low Legal Authority" = "#d95f02")) +
scale_fill_manual(values = c("High Legal Authority" = "#1b9e77",
"Low Legal Authority" = "#d95f02")) +
theme_minimal(base_size = 14) +
theme(
legend.position = "right",
plot.title = element_text(size = 11, face = "bold"),
plot.caption = element_text(hjust = 0, size = 9, lineheight = 1.1, face = "italic")
)
ggsave("figure_2_5_h2_5_density_x_legal_specialization.png",
plot = h5, width = 10, height = 6, dpi = 300, bg = "white")
print(h5)

Implication
This result refines the findings from Hypotheses 2.1–2.4. While
those analyses showed that institutional density tends to encourage
specialization and narrow organizational niches, Figure 2.5 demonstrates
that this effect depends on the legal authority of the
organization.
Low-legal authority IGOs (e.g., ITU, WFP, UNODC) display higher
specialization in low-density environments but converge toward lower
specialization as density increases.
High-legal authority IGOs (e.g., UNDP, UNU, UNCCD) generally
maintain lower levels of specialization across densities, with a slight
decline as density rises.
This suggests that legal authority moderates the
density–specialization relationship: organizations with stronger legal
authority appear less responsive to competitive pressures for
specialization, likely because their broad mandates and binding
frameworks buffer them against duplication concerns. In contrast,
low-authority IGOs are more sensitive to institutional crowding,
differentiating themselves more clearly when institutional environments
are less saturated.
Together with the earlier hypotheses, this finding indicates
that specialization is not uniform across the IGO landscape but varies
depending on the interaction between institutional context (density) and
organizational design features (legal authority).
4.6 Hypothesis 2.6: IGOs with broader strategy portfolios adapt
better in high-density fields than those with narrow strategies
library(dplyr)
library(ggplot2)
library(ggeffects)
library(stringr)
# --- Step 1: Model (Density × Strategy Breadth) ---
m_h26 <- lm(sm_HHI ~ scale(founding_density_5yr) * scale(strategy_breadth) +
scale(cumulative_stock),
data = df)
summary(m_h26)
Call:
lm(formula = sm_HHI ~ scale(founding_density_5yr) * scale(strategy_breadth) +
scale(cumulative_stock), data = df)
Residuals:
Min 1Q Median 3Q Max
-0.23150 -0.08296 -0.01967 0.07305 0.54462
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.3097353 0.0202595 15.288 < 2e-16 ***
scale(founding_density_5yr) -0.0369609 0.0227630 -1.624 0.11174
scale(strategy_breadth) -0.0552903 0.0204184 -2.708 0.00968 **
scale(cumulative_stock) 0.0003085 0.0208938 0.015 0.98829
scale(founding_density_5yr):scale(strategy_breadth) 0.0193821 0.0220502 0.879 0.38429
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1364 on 43 degrees of freedom
Multiple R-squared: 0.1989, Adjusted R-squared: 0.1244
F-statistic: 2.669 on 4 and 43 DF, p-value: 0.04482
# --- Step 2: Predictions for plotting ---
# ggpredict is from ggeffects, so either:
pred_h26 <- ggeffects::ggpredict(m_h26, terms = c("founding_density_5yr", "strategy_breadth [quart]"))
# --- Step 3: Caption text ---
caption_text <- str_wrap(
"Figure 2.6. Density, Strategy Breadth, and Specialization.
The figure illustrates how founding density influences IGO specialization (Herfindahl–Hirschman Index, HHI), depending on the breadth of their strategy portfolios.
Strategy breadth is divided into quartiles, meaning IGOs are grouped into four levels from narrowest to broadest portfolios: the lowest quartile (fewer strategies) to the highest quartile (more diversified strategies).
Lines show predicted specialization for each quartile, and shaded areas represent 95% confidence intervals.
IGOs with broader strategy portfolios (upper quartiles) begin with higher specialization and retain it more effectively under high density, while those with narrow portfolios (lower quartiles) show lower specialization and sharper declines as density increases.",
width = 100
)
# --- Step 4: Plot ---
h6 <- ggplot(pred_h26, aes(x = x, y = predicted, color = group)) +
geom_line(size = 1.2) +
geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = group),
alpha = 0.15, color = NA) +
scale_color_brewer(palette = "Set1", name = "Strategy Breadth (Quartiles)") +
scale_fill_brewer(palette = "Set1", name = "Strategy Breadth (Quartiles)") +
labs(
title = "Figure 2.6 Hypothesis 2.6 — Density, Strategy Breadth, and Specialization",
subtitle = "Effect of founding density on specialization (HHI), moderated by strategy breadth",
x = "Founding Density (±2 years)",
y = "Specialization (HHI)",
caption = caption_text
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(size = 11, color = "grey40"),
plot.caption = element_text(hjust = 0, size = 9, lineheight = 1.1, face = "italic"),
legend.position = "bottom"
)
# --- Step 5: Save with white background ---
ggsave("figure_2_6_h2_6.png", plot = h6, width = 10, height = 6, dpi = 300, bg = "white")
print(h6)

Implications
This result supports Hypothesis 2.6, showing that strategic breadth
moderates the pressures of crowded institutional fields. IGOs founded in
dense environments tend to lose specialization overall (downward slope
across all lines), but those with broader strategy portfolios (e.g.,
Quartiles 7–9) adapt better, preserving higher levels of specialization
compared to those with narrow portfolios. This suggests that in
competitive institutional landscapes, flexibility and diversification of
strategies help organizations carve out niches and buffer against
redundancy. When read alongside Hypotheses 2.1–2.5, this extends the
picture: while density generally pushes toward specialization, the
ability to combine multiple strategies enhances resilience and allows
IGOs to maintain a differentiated role within crowded governance
spaces.
4.7 Hypothesis 2.7: Niche differentiation occurs along
subject–spatial intersections.
subject_labels <- c(
"biodiversity_ecosystem_conservation_across_igo" = "Biodiversity & Conservation",
"cultural_heritage_traditional_knowledge_data_governance_across_igo" = "Cultural Heritage & Knowledge",
"disaster_risk_reduction_resilience_across_igo" = "Disaster Risk & Resilience",
"environmental_protection_climate_change_across_igo" = "Environment & Climate",
"human_rights_social_justice_advocacy_across_igo" = "Human Rights & Justice",
"international_cooperation_governance_across_igo" = "Governance & Cooperation",
"research_science_innovation_across_igo" = "Science & Innovation",
"security_safety_across_igo" = "Security & Safety",
"sustainable_development_capacity_building_across_igo" = "Sustainable Development",
"trade_investment_economic_cooperation_across_igo" = "Trade & Economy"
)
spatial_labels <- c(
"archipelago_across_igo" = "Archipelago",
"coastal_zone_across_igo" = "Coastal Zone",
"contiguous_zone_cz_across_igo" = "Contiguous Zone",
"enclosed_or_semi_enclosed_sea_across_igo" = "Enclosed/Semi-Enclosed Sea",
"exclusive_economic_zone_eez_across_igo" = "EEZ",
"extended_continental_shelf_cs_across_igo" = "Continental Shelf",
"high_seas_across_igo" = "High Seas",
"internal_waters_across_igo" = "Internal Waters",
"territorial_sea_ts_across_igo" = "Territorial Sea",
"the_area_across_igo" = "The Area"
)
caption_text_27 <- str_wrap(
"Figure 2.7 — Niche Differentiation (Subject ↔ Spatial Flows).
The diagram illustrates how IGO subject domains distribute across maritime spatial jurisdictions.
Broad domains such as Environment & Climate and Biodiversity & Conservation span nearly all zones,
while narrower fields like Security & Safety concentrate in the high seas and the Area.
Development-oriented areas (Sustainable Development, Trade & Economy) cluster around coastal and EEZ spaces,
reflecting economic mandates.
These flows demonstrate that IGOs occupy differentiated niches at the intersection of subject and space,
supporting the hypothesis that institutional specialization is structured rather than random.",
width = 100
)
library(ggalluvial)
library(ggplot2)
# Collapse into subject + spatial (taking primary domain)
df_long <- data.frame(
IGO = df$institution,
Subject = colnames(df[,59:68])[apply(df[,59:68], 1, which.max)],
Spatial = colnames(df[,17:26])[apply(df[,17:26], 1, which.max)]
)
# Apply shorter labels
df_long$Subject <- subject_labels[df_long$Subject]
df_long$Spatial <- spatial_labels[df_long$Spatial]
# Alluvial plot
h7 <- ggplot(df_long,
aes(axis1 = Subject, axis2 = Spatial)) +
geom_alluvium(aes(fill = Subject), width = 1/8, alpha = 0.85) +
geom_stratum(width = 1/8, fill = "grey95", color = "black") +
geom_text(
stat = "stratum",
aes(label = after_stat(stratum)),
size = 2.8, # smaller text
hjust = 0.5, # centered
lineheight = 0.9 # tighter spacing
) +
scale_fill_brewer(palette = "Set3") +
theme_minimal(base_size = 12) +
theme(
axis.text.y = element_blank(),
axis.title = element_blank(),
legend.position = "none",
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(size = 10, color = "grey40")
) +
labs(
title = "Figure 2.7 Hypothesis 2.7 — Niche Differentiation (Subject ↔ Spatial Flows)",
subtitle = "Flows show how subject domains distribute across spatial jurisdictions"
)
h7 <- h7 +
labs(
caption = caption_text_27
) +
theme(
plot.caption = element_text(
hjust = 0, size = 9, lineheight = 1.1, face = "italic", color = "grey30"
)
)
ggsave("figure_2_7_h2_7_alluvial.png", plot = h7,
width = 12, height = 6, dpi = 300, bg = "white")
print(h7)

Implications These patterns support Hypothesis 2.7
by showing that niche differentiation occurs along subject–spatial
intersections. Some domains are broadly distributed across all maritime
spaces, while others are spatially concentrated, creating clear
subject-specific niches. This differentiation reflects how IGOs align
their functional mandates with the legal and ecological characteristics
of maritime zones, rather than being evenly spread across all spaces. In
doing so, the system of IGOs exhibits both cross-cutting mandates and
specialized jurisdictions, reinforcing the idea that institutional
niches are structured and differentiated rather than overlapping
randomly.
# ====== COMMON SETUP ======
library(dplyr); library(tidyr); library(ggplot2); library(ggrepel)
library(ggeffects); library(mgcv); library(broom); library(scales); library(stringr)
# Helper: neat caption wrapper
cap <- function(x) stringr::str_wrap(x, width = 110)
# (Optional) derived measures if you haven't defined them yet
df <- df %>%
mutate(
# Example placeholders used below; adjust if you already created these
strategy_breadth = ifelse(!is.na(strategy_breadth), strategy_breadth,
rowSums(across(c(70:79)), na.rm = TRUE)), # within strategies count
spatial_breadth = ifelse(!is.na(spatial_breadth), spatial_breadth,
rowSums(across(c(17:26)), na.rm = TRUE)) # # of spatial jurisdictions
)
4.8 Hypothesis 2.8 H2.8 — Non-linearity / diminishing returns: The
effect of founding density on specialization is non-linear (diminishing
at high density)
# GAM with smooth on density; control for field stock
m_h28 <- mgcv::gam(sm_HHI ~ s(founding_density_5yr, k = 4) + scale(cumulative_stock), data = df)
summary(m_h28)
Family: gaussian
Link function: identity
Formula:
sm_HHI ~ s(founding_density_5yr, k = 4) + scale(cumulative_stock)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.305548 0.019951 15.315 <2e-16 ***
scale(cumulative_stock) -0.002415 0.021438 -0.113 0.911
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(founding_density_5yr) 2.196 2.546 2.298 0.0694 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.101 Deviance explained = 16.2%
GCV = 0.020937 Scale est. = 0.019106 n = 48
# Predictions for plot
pred_h28 <- ggpredict(m_h28, terms = "founding_density_5yr [all]")
p_h28 <- ggplot(pred_h28, aes(x = x, y = predicted)) +
geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = .18) +
geom_line(size = 1.2) +
geom_point(data = df, aes(x = founding_density_5yr, y = sm_HHI), alpha = .35) +
labs(
title = "Figure 2.8 Hypothesis 2.8 — Non-linear Effect of Density on Specialization",
subtitle = "GAM smooth; band = 95% CI. Points are IGOs.",
x = "Founding Density (±2 years)", y = "Specialization (HHI)",
caption = cap("The smooth shows that density’s effect on specialization is not strictly linear: the slope flattens as density increases, \
suggesting diminishing returns once institutional fields become very crowded.")
) +
theme_minimal(base_size = 13)
ggsave("figure_2_8_h2_8_gam_density_specialization.png", p_h28, width = 9, height = 5.6, dpi = 300)
print(p_h28)

4.9 Hypothesis 2.9 H2.9 — Mediation: Strategy breadth partially
mediates the effect of density on specialization
library(lavaan)
# Standardize to aid interpretation
df_std <- df %>%
mutate(across(c(founding_density_5yr, cumulative_stock, strategy_breadth, sm_HHI), scale))
model_h29 <- '
# direct paths
strategy_breadth ~ a*founding_density_5yr + c1*cumulative_stock
sm_HHI ~ b*strategy_breadth + c_prime*founding_density_5yr + c2*cumulative_stock
# indirect and total effects
ind := a*b
total := c_prime + (a*b)
'
fit_h29 <- sem(model_h29, data = df_std, se = "bootstrap", bootstrap = 1000)
summary(fit_h29, standardized = TRUE, fit.measures = TRUE, rsquare = TRUE)
lavaan 0.6-19 ended normally after 1 iteration
Estimator ML
Optimization method NLMINB
Number of model parameters 7
Number of observations 48
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Model Test Baseline Model:
Test statistic 12.187
Degrees of freedom 5
P-value 0.032
User Model versus Baseline Model:
Comparative Fit Index (CFI) 1.000
Tucker-Lewis Index (TLI) 1.000
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -129.114
Loglikelihood unrestricted model (H1) -129.114
Akaike (AIC) 272.228
Bayesian (BIC) 285.327
Sample-size adjusted Bayesian (SABIC) 263.366
Root Mean Square Error of Approximation:
RMSEA 0.000
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.000
P-value H_0: RMSEA <= 0.050 NA
P-value H_0: RMSEA >= 0.080 NA
Standardized Root Mean Square Residual:
SRMR 0.000
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 1000
Number of successful bootstrap draws 1000
Regressions:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
strategy_breadth ~
fndn__5 (a) -0.220 0.155 -1.414 0.157 -0.220 -0.220
cmltv_s (c1) -0.003 0.166 -0.016 0.987 -0.003 -0.003
sm_HHI ~
strtgy_ (b) -0.374 0.165 -2.273 0.023 -0.374 -0.374
fndn__5 (c_pr) -0.304 0.176 -1.732 0.083 -0.304 -0.304
cmltv_s (c2) -0.016 0.158 -0.100 0.921 -0.016 -0.016
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.strategy_brdth 0.931 0.143 6.519 0.000 0.931 0.951
.sm_HHI 0.798 0.286 2.790 0.005 0.798 0.815
R-Square:
Estimate
strategy_brdth 0.049
sm_HHI 0.185
Defined Parameters:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
ind 0.082 0.069 1.188 0.235 0.082 0.082
total -0.222 0.172 -1.288 0.198 -0.222 -0.222
# Quick coefficient (dot-whisker) plot for mediation paths
coef_df <- broom::tidy(fit_h29, conf.int = TRUE) %>%
filter(grepl("a|b|c_prime|ind|total", term))
p_h29 <- ggplot(coef_df, aes(x = estimate, y = term)) +
geom_point() + geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = .15) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(
title = "Figure 2.9 Hypothesis 2.9 — Mediation by Strategy Breadth",
x = "Estimate (bootstrap 95% CI)", y = "",
caption = cap("Path a: density → strategy breadth; Path b: strategy breadth → specialization; c' is the direct effect of density on specialization \
controlling for breadth. A significant indirect effect (ind) supports mediation.")
) + theme_minimal(base_size = 13)
ggsave("figure_2_9_h2_9_mediation.png", p_h29, width = 8.6, height = 5.2, dpi = 300)
print(p_h29)

_Figure 2.9 tests whether the effect of founding
density on subject-matter specialization (HHI) operates indirectly
through strategy breadth. The dot-whisker plot shows standardized
coefficients with bootstrap 95% confidence intervals. The key pathway of
interest is the indirect effect (ind := a*b). A significant indirect
effect suggests mediation, meaning that IGOs in denser founding
environments adjust their strategy portfolios, and this broader or
narrower portfolio in turn shapes how specialized they become._
Interpretation:
The direct path from founding density to specialization is
relatively weak once strategy breadth is included.
The indirect path (a*b) is the mechanism of interest: it shows
whether density → strategy breadth → specialization is a valid
chain.
If the indirect effect confidence interval excludes zero, then
mediation holds, meaning density’s influence on specialization is partly
explained by strategy choices.
Substantively, this suggests that IGOs in crowded institutional
fields do not simply specialize directly; they adapt by adjusting their
strategy mix, which then influences their degree of
specialization.
4.10 Hypothesis 2.10 Inter-institutional embeddedness rises with
density
# Build an Inter-institutional Embeddedness Index (IEI)
iei_cols <- c(112:131)
df <- df %>%
mutate(IEI = rowMeans(across(all_of(iei_cols)), na.rm = TRUE))
# Model: IEI ~ density + controls
m_h210 <- lm(IEI ~ scale(founding_density_5yr) + scale(cumulative_stock), data = df)
summary(m_h210)
Call:
lm(formula = IEI ~ scale(founding_density_5yr) + scale(cumulative_stock),
data = df)
Residuals:
Min 1Q Median 3Q Max
-1.2851 -0.4123 -0.0244 0.4643 1.1243
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.42240 0.08476 28.581 <2e-16 ***
scale(founding_density_5yr) 0.02624 0.08902 0.295 0.770
scale(cumulative_stock) 0.05879 0.08902 0.660 0.512
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5872 on 45 degrees of freedom
Multiple R-squared: 0.01488, Adjusted R-squared: -0.02891
F-statistic: 0.3398 on 2 and 45 DF, p-value: 0.7137
# Plot marginal effect with a few labels for context
pred_h210 <- ggpredict(m_h210, terms = "founding_density_5yr [all]")
label_igos <- df %>%
slice_max(order_by = IEI, n = 4) %>%
bind_rows(slice_min(df, order_by = IEI, n = 3))
p_h210 <- ggplot() +
geom_point(data = df, aes(founding_density_5yr, IEI), alpha = .45) +
geom_line(data = pred_h210, aes(x = x, y = predicted), size = 1.1) +
geom_ribbon(data = pred_h210, aes(x = x, ymin = conf.low, ymax = conf.high), alpha = .18) +
ggrepel::geom_text_repel(data = label_igos,
aes(founding_density_5yr, IEI, label = institution),
size = 3, seed = 4) +
labs(
title = "Figure 2.10 Hypothesis 2.10 — Density and Inter-institutional Embeddedness",
subtitle = "Inter-institutional Embeddedness Index (IEI) from interaction items (cols 112–131)",
x = "Founding Density (±2 years)", y = "Embeddedness (IEI, mean of interactions)",
caption = cap("A positive slope indicates IGOs founded in denser fields maintain broader inter-institutional ties (UN system collaboration, \
treaty body coordination, scientific linkages, etc.), consistent with coordination pressures in crowded spaces.")
) + theme_minimal(base_size = 13)
ggsave("figure_2_10_h2_10_density_IEI.png", p_h210, width = 9, height = 5.4, dpi = 300)
print(p_h210)

Figure 2.10 examines whether IGOs founded in
denser institutional environments exhibit broader inter-institutional
embeddedness. The y-axis represents the Inter-institutional Embeddedness
Index (IEI), constructed from counts of inter-IGO collaborations, treaty
body linkages, UN system partnerships, and other interactions. The
regression line with 95% confidence band indicates the partial effect of
founding density. Selected IGOs (e.g., ITC, UN DOALOS, OHCHR) are
labeled for context.
Interpretation:
The positive slope indicates that IGOs founded in denser
environments tend to have more inter-institutional linkages.
Examples like UN DOALOS, ITC, OHCHR are highly embedded,
consistent with operating in complex governance landscapes where
collaboration is necessary.
By contrast, more narrowly embedded IGOs (e.g., Minamata
Convention, UNEP) operate with fewer ties, reflecting either functional
autonomy or niche mandates.
Substantively, this supports the idea that crowded institutional
fields push new IGOs toward greater coordination and embeddedness to
avoid redundancy and increase legitimacy.
LS0tDQp0aXRsZTogIkNvbmplY3R1cmUgMiA6IERlbnNpdHksIE5pY2hlIERpZmZlcmVudGlhdGlvbiAmIEFkYXB0YXRpb24iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyAxLiBTZXR1cA0KYGBge3J9DQojID09PT09IFBhY2thZ2VzID09PT09DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KE1BU1MpICAgICAgIA0KbGlicmFyeShjbHVzdGVyKSAgICANCmxpYnJhcnkoZmFjdG9leHRyYSkgDQpsaWJyYXJ5KERlc2NUb29scykgIA0KbGlicmFyeShlbW1lYW5zKSANCmxpYnJhcnkoZ2dyaWRnZXMpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGdncHJlZGljdCkNCg0KIyA9PT09PSBUaGVtZSBmb3IgY3J5c3RhbC1jbGVhciBmaWd1cmVzID09PT09DQp0aGVtZV9zZXQodGhlbWVfYncoYmFzZV9zaXplID0gMTQpKQ0KdXBkYXRlX2dlb21fZGVmYXVsdHMoInBvaW50IiwgbGlzdChzaXplID0gMiwgYWxwaGEgPSAwLjgpKQ0KDQojID09PT09IEhlbHBlcnMgPT09PT0NCnogPC0gZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhzY2FsZSh4KSkNCnNhZmVfZGl2IDwtIGZ1bmN0aW9uKG51bSwgZGVuKSBpZmVsc2UoZGVuID09IDAsIDAsIG51bSAvIGRlbikNCg0KIyBISEkgYW5kIFNoYW5ub24gKHZlY3RvciBwX2kgPj0gMDsgd2lsbCBub3JtYWxpc2UgaW50ZXJuYWxseSkNCmhoaSA8LSBmdW5jdGlvbih2KSB7DQogIHMgPC0gc3VtKHYsIG5hLnJtID0gVFJVRSkNCiAgaWYgKHMgPD0gMCkgcmV0dXJuKE5BX3JlYWxfKQ0KICBwIDwtIHYgLyBzDQogIHN1bShwXjIsIG5hLnJtID0gVFJVRSkNCn0NCnNoYW5ub24gPC0gZnVuY3Rpb24odikgew0KICBzIDwtIHN1bSh2LCBuYS5ybSA9IFRSVUUpDQogIGlmIChzIDw9IDApIHJldHVybihOQV9yZWFsXykNCiAgcCA8LSB2IC8gcw0KICAtc3VtKGlmZWxzZShwID4gMCwgcCAqIGxvZyhwKSwgMCksIG5hLnJtID0gVFJVRSkNCn0NCmBgYA0KIyMgMi4gRGF0YSBMb2FkaW5nDQpgYGB7cn0NCiMgTG9hZCBhbGwgZGF0YXNldHMNCmRmX3llYXIgPC0gcmVhZF9jc3YoIkRhdGEveWVhcl9kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX3NwYXRpYWwgPC0gcmVhZF9jc3YoIkRhdGEvc3BhdGlhbF9qdXJpc2RpY3Rpb25fZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpkZl92ZXJ0aWNhbCA8LSByZWFkX2NzdigiRGF0YS92ZXJ0aWNhbF9jb29yZGluYXRpb25zX2RhdGEuY3N2IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KZGZfc3ViamVjdCA8LSByZWFkX2NzdigiRGF0YS9zdWJqZWN0X21hdHRlcl9qdXJpc2RpY3Rpb25fZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpkZl9zdHJhdGVnaWVzIDwtIHJlYWRfY3N2KCJEYXRhL3N0cmF0ZWdpZXNfZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpkZl9vYmplY3RpdmVzIDwtIHJlYWRfY3N2KCJEYXRhL2RlZmluZWRfb2JqZWN0aXZlc19kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX3JlbGF0aW9uc2hpcHMgPC0gcmVhZF9jc3YoIkRhdGEvZGVmaW5lZF9pbnRlcl9pbnN0aXR1dGlvbmFsX3JlbGF0aW9uc2hpcHNfZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpkZl9zb3VyY2VzIDwtIHJlYWRfY3N2KCJEYXRhL3NvdXJjZXNfb2ZfanVyaXNkaWN0aW9uX2RhdGEuY3N2IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KYGBge3J9DQojIFByZXZpZXcgdGhlIGRmDQpoZWFkKGRmX3llYXIsIDEwKQ0KYGBgDQojIyAzLiBEZXJpdmVkIE1lYXN1cmVzDQpgYGB7cn0NCiMgPT09PT0gSWRlbnRpZnkgY29sdW1uIGdyb3VwcyBieSBuYW1lID09PT09DQojIFN1YmplY3QtbWF0dGVyIChBQ1JPU1MpDQpzbV9hY3Jvc3NfY29scyA8LSBjKA0KICAiYmlvZGl2ZXJzaXR5X2Vjb3N5c3RlbV9jb25zZXJ2YXRpb25fYWNyb3NzX2lnbyIsDQogICJjdWx0dXJhbF9oZXJpdGFnZV90cmFkaXRpb25hbF9rbm93bGVkZ2VfZGF0YV9nb3Zlcm5hbmNlX2Fjcm9zc19pZ28iLA0KICAiZGlzYXN0ZXJfcmlza19yZWR1Y3Rpb25fcmVzaWxpZW5jZV9hY3Jvc3NfaWdvIiwNCiAgImVudmlyb25tZW50YWxfcHJvdGVjdGlvbl9jbGltYXRlX2NoYW5nZV9hY3Jvc3NfaWdvIiwNCiAgImh1bWFuX3JpZ2h0c19zb2NpYWxfanVzdGljZV9hZHZvY2FjeV9hY3Jvc3NfaWdvIiwNCiAgImludGVybmF0aW9uYWxfY29vcGVyYXRpb25fZ292ZXJuYW5jZV9hY3Jvc3NfaWdvIiwNCiAgInJlc2VhcmNoX3NjaWVuY2VfaW5ub3ZhdGlvbl9hY3Jvc3NfaWdvIiwNCiAgInNlY3VyaXR5X3NhZmV0eV9hY3Jvc3NfaWdvIiwNCiAgInN1c3RhaW5hYmxlX2RldmVsb3BtZW50X2NhcGFjaXR5X2J1aWxkaW5nX2Fjcm9zc19pZ28iLA0KICAidHJhZGVfaW52ZXN0bWVudF9lY29ub21pY19jb29wZXJhdGlvbl9hY3Jvc3NfaWdvIg0KKQ0KDQojIFNwYXRpYWwgKEFDUk9TUykNCnNwYXRpYWxfYWNyb3NzX2NvbHMgPC0gYygNCiAgImFyY2hpcGVsYWdvX2Fjcm9zc19pZ28iLA0KICAiY29hc3RhbF96b25lX2Fjcm9zc19pZ28iLA0KICAiY29udGlndW91c196b25lX2N6X2Fjcm9zc19pZ28iLA0KICAiZW5jbG9zZWRfb3Jfc2VtaV9lbmNsb3NlZF9zZWFfYWNyb3NzX2lnbyIsDQogICJleGNsdXNpdmVfZWNvbm9taWNfem9uZV9lZXpfYWNyb3NzX2lnbyIsDQogICJleHRlbmRlZF9jb250aW5lbnRhbF9zaGVsZl9jc19hY3Jvc3NfaWdvIiwNCiAgImhpZ2hfc2Vhc19hY3Jvc3NfaWdvIiwNCiAgImludGVybmFsX3dhdGVyc19hY3Jvc3NfaWdvIiwNCiAgInRlcnJpdG9yaWFsX3NlYV90c19hY3Jvc3NfaWdvIiwNCiAgInRoZV9hcmVhX2Fjcm9zc19pZ28iDQopDQoNCiMgSW50ZXItaW5zdGl0dXRpb25hbCB0aWVzIChBQ1JPU1MpDQppbnRlcmluc3RfYWNyb3NzX2NvbHMgPC0gYygNCiAgImNpdmlsX3NvY2lldHlfZW5nYWdlbWVudF9hY3Jvc3NfaWdvIiwNCiAgImRvbm9yX3BhcnRuZXJzaGlwc19hY3Jvc3NfaWdvIiwNCiAgImludGVyZ292ZXJubWVudGFsX2NvbnN1bHRhdGlvbnNfYWNyb3NzX2lnbyIsDQogICJuZ29fZW5nYWdlbWVudF9hY3Jvc3NfaWdvIiwNCiAgInByaXZhdGVfc2VjdG9yX3BhcnRuZXJzaGlwc19hY3Jvc3NfaWdvIiwNCiAgInJlZ2lvbmFsX2JvZHlfY29vcmRpbmF0aW9uX2Fjcm9zc19pZ28iLA0KICAic2NpZW50aWZpY19jb21tdW5pdHlfbGlua2FnZXNfYWNyb3NzX2lnbyIsDQogICJ0ZWNobmljYWxfb3JfZXhwZXJ0X2dyb3Vwc19hY3Jvc3NfaWdvIiwNCiAgInRyZWF0eV9ib2R5X2Nvb3JkaW5hdGlvbl9hY3Jvc3NfaWdvIiwNCiAgInVuX3N5c3RlbV9jb2xsYWJvcmF0aW9uX2Fjcm9zc19pZ28iDQopDQoNCiMgU3RyYXRlZ2llcyAoQUNST1NTKQ0Kc3RyYXRlZ3lfYWNyb3NzX2NvbHMgPC0gYygNCiAgImNhcGFjaXR5X2RldmVsb3BtZW50X29wZXJhdGlvbmFsX2RlbGl2ZXJ5X2Fjcm9zc19pZ28iLA0KICAiY29sbGFib3JhdGlvbl9wYXJ0bmVyc2hpcHNfbmV0d29ya3NfYWNyb3NzX2lnbyIsDQogICJlbnZpcm9ubWVudGFsX2NsaW1hdGVfYmlvZGl2ZXJzaXR5X2FjdGlvbl9hY3Jvc3NfaWdvIiwNCiAgImZpbmFuY2lhbF9idWRnZXRhcnlfbWFuYWdlbWVudF9hY3Jvc3NfaWdvIiwNCiAgImluY2x1c2lvbl9yaWdodHNfc29jaWFsX2p1c3RpY2VfYWNyb3NzX2lnbyIsDQogICJpbm5vdmF0aW9uX3RlY2hub2xvZ3lfYWNyb3NzX2lnbyIsDQogICJrbm93bGVkZ2VfZGF0YV9hY3Jvc3NfaWdvIiwNCiAgIm1vbml0b3JpbmdfYWNjb3VudGFiaWxpdHlfYWNyb3NzX2lnbyIsDQogICJwb2xpY3lfcmVndWxhdGlvbl9hY3Jvc3NfaWdvIiwNCiAgInN0cmF0ZWdpY19pbnN0aXR1dGlvbmFsX3BsYW5uaW5nX2Fjcm9zc19pZ28iDQopDQoNCiMgTGVnYWwgYXV0aG9yaXR5IC8gc291cmNlcyAoQUNST1NTKSArIG1hc3RlciBzY29yZQ0Kc291cmNlc19hY3Jvc3NfY29scyA8LSBjKA0KICAiYmlsYXRlcmFsX211bHRpbGF0ZXJhbF9hcnJhbmdlbWVudHNfYWNyb3NzX2lnbyIsDQogICJiaW5kaW5nX3NlY29uZGFyeV9sYXdfYWNyb3NzX2lnbyIsDQogICJjb21wbGlhbmNlX292ZXJzaWdodF9hY3Jvc3NfaWdvIiwNCiAgImN1c3RvbWFyeV9zb2Z0X2xhd19hY3Jvc3NfaWdvIiwNCiAgImRlbGVnYXRlZF9vcl9kZXJpdmVkX3Bvd2Vyc19hY3Jvc3NfaWdvIiwNCiAgImZvdW5kYXRpb25hbF90cmVhdGllc19jaGFydGVyc19hY3Jvc3NfaWdvIiwNCiAgIm5vbl9iaW5kaW5nX3NlY29uZGFyeV9sYXdfYWNyb3NzX2lnbyIsDQogICJvdGhlcl9nb3Zlcm5hbmNlX2luc3RydW1lbnRzX2Fjcm9zc19pZ28iLA0KICAic3RyYXRlZ2ljX2ZyYW1ld29ya3NfYWNyb3NzX2lnbyIsDQogICJ0ZWNobmljYWxfbm9ybXNfc3RhbmRhcmRzX2Fjcm9zc19pZ28iDQopDQoNCiMgPT09PT0gRGVyaXZlZCBtZWFzdXJlcyA9PT09PQ0KZGYgPC0gZGYgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgICMgU3BlY2lhbGlzYXRpb24gbWV0cmljcyAoU3ViamVjdC1NYXR0ZXIsIEFDUk9TUykNCiAgICBzbV9icmVhZHRoICAgPSBzdW0oY19hY3Jvc3MoYWxsX29mKHNtX2Fjcm9zc19jb2xzKSkgPiAwLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNtX0hISSAgICAgICA9IGhoaShjX2Fjcm9zcyhhbGxfb2Yoc21fYWNyb3NzX2NvbHMpKSksDQogICAgc21fU2hhbm5vbiAgID0gc2hhbm5vbihjX2Fjcm9zcyhhbGxfb2Yoc21fYWNyb3NzX2NvbHMpKSksDQoNCiAgICAjIFNwYXRpYWwgYnJlYWR0aCAoQUNST1NTKQ0KICAgIHNwYXRpYWxfYnJlYWR0aCA9IHN1bShjX2Fjcm9zcyhhbGxfb2Yoc3BhdGlhbF9hY3Jvc3NfY29scykpID4gMCwgbmEucm0gPSBUUlVFKSwNCg0KICAgICMgSW50ZXItaW5zdGl0dXRpb25hbCBpbmRleCAobWVhbiBvZiBBQ1JPU1MgdGllcykNCiAgICBpbnRlcmluc3RfaW5kZXggPSBtZWFuKGNfYWNyb3NzKGFsbF9vZihpbnRlcmluc3RfYWNyb3NzX2NvbHMpKSwgbmEucm0gPSBUUlVFKSwNCg0KICAgICMgU3RyYXRlZ3kgYnJlYWR0aCAoQUNST1NTKQ0KICAgIHN0cmF0ZWd5X2JyZWFkdGggPSBzdW0oY19hY3Jvc3MoYWxsX29mKHN0cmF0ZWd5X2Fjcm9zc19jb2xzKSkgPiAwLCBuYS5ybSA9IFRSVUUpLA0KDQogICAgIyBMZWdhbCBhdXRob3JpdHkgaW5kZXggKHotYXZlcmFnZWQ6IEFDUk9TUyBzb3VyY2VzICsgb3JkaW5hbCBtYXN0ZXIpDQogICAgbGVnYWxfYXV0aG9yaXR5X2luZGV4ID0gbWVhbigNCiAgICAgIGMoc2NhbGUoY19hY3Jvc3MoYWxsX29mKHNvdXJjZXNfYWNyb3NzX2NvbHMpKSksDQogICAgICAgIHNjYWxlKGNfYWNyb3NzKG9yZGluYWxfc2NvcmVfc291cmNlcykpKSwNCiAgICAgIG5hLnJtID0gVFJVRQ0KICAgICkNCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCmBgYA0KYGBge3J9DQojIFZpZXcgZGYNCnZpZXcoZGYpDQpgYGANCiMjIDQuIEFuYWx5c2lzDQojIyMgNC4xIEgyLjE6IEhpZ2hlciBpbnN0aXR1dGlvbmFsIGRlbnNpdHkgYXQgZm91bmRpbmcgaW5jcmVhc2VzIHNwZWNpYWxpemF0aW9uICjihpEgSEhJKS4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQojIDEuIElkZW50aWZ5IHByaW1hcnkgc3ViamVjdC1tYXR0ZXIgcGVyIElHTw0Kc3ViamVjdF9jb2xzIDwtIG5hbWVzKGRmKVs1OTo2OF0NCmRmJHByaW1hcnlfc3ViamVjdCA8LSBzdWJqZWN0X2NvbHNbYXBwbHkoZGZbLCBzdWJqZWN0X2NvbHNdLCAxLCB3aGljaC5tYXgpXQ0KDQojIDIuIFJlY29kZSBzdWJqZWN0IGNhdGVnb3JpZXMgdG8gc2hvcnRlciBuYW1lcw0KZGYkcHJpbWFyeV9zdWJqZWN0IDwtIHJlY29kZShkZiRwcmltYXJ5X3N1YmplY3QsDQogICJCaW9kaXZlcnNpdHkgJiBFY29zeXN0ZW0gQ29uc2VydmF0aW9uX0Fjcm9zc0lHTyIgPSAiQmlvZGl2ZXJzaXR5IiwNCiAgIkN1bHR1cmFsIEhlcml0YWdlLCBUcmFkaXRpb25hbCBLbm93bGVkZ2UgJiBEYXRhIEdvdmVybmFuY2VfQWNyb3NzSUdPIiA9ICJIZXJpdGFnZS9EYXRhIiwNCiAgIkRpc2FzdGVyIFJpc2sgUmVkdWN0aW9uICYgUmVzaWxpZW5jZV9BY3Jvc3NJR08iID0gIkRpc2FzdGVyL1Jlc2lsaWVuY2UiLA0KICAiRW52aXJvbm1lbnRhbCBQcm90ZWN0aW9uICYgQ2xpbWF0ZSBDaGFuZ2VfQWNyb3NzSUdPIiA9ICJFbnZpcm9ubWVudC9DbGltYXRlIiwNCiAgIkh1bWFuIFJpZ2h0cywgU29jaWFsIEp1c3RpY2UgJiBBZHZvY2FjeV9BY3Jvc3NJR08iID0gIlJpZ2h0cy9KdXN0aWNlIiwNCiAgIkludGVybmF0aW9uYWwgQ29vcGVyYXRpb24gJiBHb3Zlcm5hbmNlX0Fjcm9zc0lHTyIgPSAiR292ZXJuYW5jZSIsDQogICJSZXNlYXJjaCwgU2NpZW5jZSAmIElubm92YXRpb25fQWNyb3NzSUdPIiA9ICJSZXNlYXJjaC9TY2llbmNlIiwNCiAgIlNlY3VyaXR5ICYgU2FmZXR5X0Fjcm9zc0lHTyIgPSAiU2VjdXJpdHkiLA0KICAiU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQgJiBDYXBhY2l0eSBCdWlsZGluZ19BY3Jvc3NJR08iID0gIlN1c3RhaW5hYmxlIERldi4iLA0KICAiVHJhZGUsIEludmVzdG1lbnQgJiBFY29ub21pYyBDb29wZXJhdGlvbl9BY3Jvc3NJR08iID0gIlRyYWRlL0Vjb24iLA0KICAuZGVmYXVsdCA9IGRmJHByaW1hcnlfc3ViamVjdA0KKQ0KDQojIDMuIFBpY2sgSUdPcyB0byBsYWJlbCAoNSBicm9hZGVzdCArIDUgbW9zdCBzcGVjaWFsaXplZCkNCmxhYmVsX2RmIDwtIGRmICU+JQ0KICBhcnJhbmdlKHNtX0hISSkgJT4lDQogIHNsaWNlKGMoMTo1LCAobigpIC0gNCk6bigpKSkNCg0KIyA0LiBSZWdyZXNzaW9uIG1vZGVsDQptX2gyMSA8LSBsbShzbV9ISEkgfiBzY2FsZShmb3VuZGluZ19kZW5zaXR5XzV5cikgKyBzY2FsZShjdW11bGF0aXZlX3N0b2NrKSwgZGF0YSA9IGRmKQ0KDQojIDUuIFByZWRpY3Rpb25zDQpuZXdkYXQgPC0gZGF0YS5mcmFtZSgNCiAgZm91bmRpbmdfZGVuc2l0eV81eXIgPSBzZXEobWluKGRmJGZvdW5kaW5nX2RlbnNpdHlfNXlyLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGYkZm91bmRpbmdfZGVuc2l0eV81eXIsIG5hLnJtID0gVFJVRSksIGxlbmd0aC5vdXQgPSAyMDApLA0KICBjdW11bGF0aXZlX3N0b2NrID0gbWVkaWFuKGRmJGN1bXVsYXRpdmVfc3RvY2ssIG5hLnJtID0gVFJVRSkNCikNCnByZWQgPC0gcHJlZGljdChtX2gyMSwgbmV3ZGF0YSA9IG5ld2RhdCwgc2UuZml0ID0gVFJVRSkNCnByZWRfZGYgPC0gbmV3ZGF0ICU+JQ0KICBtdXRhdGUoDQogICAgZml0ICAgPSBwcmVkJGZpdCwNCiAgICB1cHBlciA9IHByZWQkZml0ICsgMS45NiAqIHByZWQkc2UuZml0LA0KICAgIGxvd2VyID0gcHJlZCRmaXQgLSAxLjk2ICogcHJlZCRzZS5maXQNCiAgKQ0KDQojIDYuIFBsb3Qgd2l0aCBkZWZhdWx0IGdncGxvdCBjb2xvcnMNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBEZWZpbmUgYW5kIHdyYXAgY2FwdGlvbiB0ZXh0DQpjYXB0aW9uX3RleHQgPC0gIkZpZ3VyZSAyLjEuIEluc3RpdHV0aW9uYWwgRGVuc2l0eSBhbmQgU3BlY2lhbGl6YXRpb24gKEhISSkuIA0KVGhpcyBmaWd1cmUgdGVzdHMgd2hldGhlciBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGluc3RpdHV0aW9uYWwgZW52aXJvbm1lbnRzIGFyZSBtb3JlIHNwZWNpYWxpemVkIGluIHRoZWlyIG1hbmRhdGVzLiBFYWNoIHBvaW50IHJlcHJlc2VudHMgYW4gSUdPLCBjb2xvcmVkIGJ5IGl0cyBwcmltYXJ5IHN1YmplY3QtbWF0dGVyIGRvbWFpbiwgd2l0aCBzZWxlY3RlZCBJR09zIGxhYmVsZWQgZm9yIHJlZmVyZW5jZS4gVGhlIHJlZ3Jlc3Npb24gbGluZSwgd2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMsIHNob3dzIGEgd2VhayBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBmb3VuZGluZyBkZW5zaXR5IGFuZCBzcGVjaWFsaXphdGlvbi4gVGhpcyBzdWdnZXN0cyB0aGF0IGNyb3dkaW5nIGFsb25lIGRvZXMgbm90IHN5c3RlbWF0aWNhbGx5IHB1c2ggSUdPcyB0b3dhcmQgbmFycm93ZXIgbWFuZGF0ZXMuIEhpZ2hseSBzcGVjaWFsaXplZCBvcmdhbml6YXRpb25zIChlLmcuLCBJVFUsIElDRVMpIHJlbWFpbiBmb2N1c2VkIHJlZ2FyZGxlc3Mgb2YgZGVuc2l0eSwgd2hpbGUgYnJvYWRlciBkZXZlbG9wbWVudC1vcmllbnRlZCBJR09zIChlLmcuLCBVTkRQLCBJRkFELCBVTlUpIHN1c3RhaW4gd2lkZS1yYW5naW5nIHBvcnRmb2xpb3MgZXZlbiBpbiBkZW5zZSBmb3VuZGluZyBwZXJpb2RzLiBPdmVyYWxsLCBzdWJqZWN0IGRvbWFpbiBhbmQgb3JnYW5pemF0aW9uYWwgZGVzaWduIGFwcGVhciBtb3JlIGluZmx1ZW50aWFsIHRoYW4gZm91bmRpbmcgZGVuc2l0eSBpbiBzaGFwaW5nIHNwZWNpYWxpemF0aW9uLiINCg0KIyBXcmFwIGNhcHRpb24gYXQgfjEwMCBjaGFyYWN0ZXJzIHBlciBsaW5lDQpjYXB0aW9uX3dyYXBwZWQgPC0gc3RyX3dyYXAoY2FwdGlvbl90ZXh0LCB3aWR0aCA9IDEwMCkNCg0KIyBBZGQgdG8gZ2dwbG90DQpwIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHkgPSBzbV9ISEksIGNvbG9yID0gcHJpbWFyeV9zdWJqZWN0KSwNCiAgICAgICAgICAgICBhbHBoYSA9IDAuOCwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjIsIGZpbGwgPSAiZ3JleTcwIikgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByZWRfZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHkgPSBmaXQpLA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGxhYmVsX2RmLCBhZXMoeCA9IGZvdW5kaW5nX2RlbnNpdHlfNXlyLCB5ID0gc21fSEhJLCBsYWJlbCA9IGluc3RpdHV0aW9uKSwNCiAgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBtYXgub3ZlcmxhcHMgPSAyMCwgYm94LnBhZGRpbmcgPSAwLjQsIHBvaW50LnBhZGRpbmcgPSAwLjMpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIeXBvdGhlc2lzIDIuMTpIaWdoZXIgaW5zdGl0dXRpb25hbCBkZW5zaXR5IGF0IGZvdW5kaW5nIGluY3JlYXNlcyBzcGVjaWFsaXphdGlvbiAoSEhJKSIsDQogICAgeCA9ICJGb3VuZGluZyBEZW5zaXR5ICjCsTIgeWVhcnMpIiwNCiAgICB5ID0gIlNwZWNpYWxpemF0aW9uIiwNCiAgICBjb2xvciA9ICJTdWJqZWN0IG1hdHRlciIsDQogICAgY2FwdGlvbiA9IGNhcHRpb25fd3JhcHBlZA0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICB0aGVtZSgNCiAgICBwICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDcsIGxpbmVoZWlnaHQgPSAxLjIsIGZhY2UgPSAiaXRhbGljIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApKQ0KICApDQoNCiMgU2F2ZSB3aWRlciBmaWd1cmUNCmdnc2F2ZSgiZmlndXJlXzJfMV9oMl8xX2RlbnNpdHlfc3BlY2lhbGl6YXRpb24ucG5nIiwgcGxvdCA9IHAsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSJ3aGl0ZSIpDQpwcmludChwKQ0KYGBgDQojIyMjIENvbmNsdXNpb24gZm9yIEh5cG90aGVzaXMgMi4xDQoNCioqRXhwZWN0ZWQgaHlwb3RoZXNpczogSGlnaGVyIGRlbnNpdHkg4oaSIG1vcmUgc3BlY2lhbGl6YXRpb24uKioNCg0KKiBUaGUgKipyZWxhdGlvbnNoaXAgaXMgd2VhayoqLiBTb21lIElHT3MgKGUuZy4sIFVORFAsIFdGUCkgbWFuYWdlIHRvIHJlbWFpbiBicm9hZCBkZXNwaXRlIGluc3RpdHV0aW9uYWwgY3Jvd2RpbmcsIHdoaWxlIG90aGVycyAoZS5nLiwgSVRVLCBJQ0VTKSBzcGVjaWFsaXplIHN0cm9uZ2x5IHJlZ2FyZGxlc3Mgb2YgZGVuc2l0eS4NCg0KKipJbXBsaWNhdGlvbjoqKg0KDQoqIEluc3RpdHV0aW9uYWwgZGVuc2l0eSBhbG9uZSBkb2VzIG5vdCBmdWxseSBleHBsYWluIHNwZWNpYWxpemF0aW9uLg0KDQoqIFN1YmplY3QtbWF0dGVyIGRvbWFpbiBhbmQgb3JnYW5pemF0aW9uYWwgZGVzaWduIG1hdHRlcjogdGVjaG5pY2FsL3NjaWVudGlmaWMgSUdPcyAoZS5nLiwgSVRVLCBJQ0VTKSBhcmUgbmF0dXJhbGx5IG1vcmUgc3BlY2lhbGl6ZWQsIHdoaWxlIGRldmVsb3BtZW50LWZvY3VzZWQgSUdPcyAoVU5EUCwgSUZBRCkgcmVtYWluIGJyb2FkIGJlY2F1c2UgdGhlaXIgbWFuZGF0ZXMgcmVxdWlyZSBhZGRyZXNzaW5nIG11bHRpcGxlIGlzc3VlcyBzaW11bHRhbmVvdXNseS4NCg0KIyMjIDQuMiBIMi4yIEh5cG90aGVzaXMgMi4yOiBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGVudmlyb25tZW50cyBoYXZlIG5hcnJvd2VyIHBvcnRmb2xpb3MuDQpgYGB7cn0NCmxpYnJhcnkoc3RyaW5ncikNCg0KIyAtLS0gQ2FwdGlvbiB0ZXh0ICh3cmFwcGVkIHRvIH4xMDAgY2hhcmFjdGVycyBwZXIgbGluZSBmb3IgcmVhZGFiaWxpdHkpIC0tLQ0KY2FwdGlvbl90ZXh0IDwtIHN0cl93cmFwKA0KICAiKipGaWd1cmUgMi4yLiBEZW5zaXR5IGFuZCBTdWJqZWN0LU1hdHRlciBCcmVhZHRoLioqIA0KICBUaGlzIGZpZ3VyZSB0ZXN0cyB3aGV0aGVyIElHT3MgZm91bmRlZCBpbiBkZW5zZXIgaW5zdGl0dXRpb25hbCBlbnZpcm9ubWVudHMgZXhoaWJpdCBicm9hZGVyIG1hbmRhdGVzIChtZWFzdXJlZCBhcyB0aGUgbnVtYmVyIG9mIHN1YmplY3QgZG9tYWlucyBjb3ZlcmVkKS4gRWFjaCBkb3QgcmVwcmVzZW50cyBhbiBJR08sIGNvbG9yZWQgYnkgaXRzIHByaW1hcnkgc3ViamVjdC1tYXR0ZXIgZG9tYWluLiBUaGUgcmVncmVzc2lvbiBsaW5lICh3aXRoIDk1JSBjb25maWRlbmNlIGJhbmQpIHNob3dzIGEgcG9zaXRpdmUgYXNzb2NpYXRpb246IGhpZ2hlciBmb3VuZGluZyBkZW5zaXR5IGlzIGxpbmtlZCB3aXRoIGJyb2FkZXIgc3ViamVjdCBjb3ZlcmFnZS4gTGFiZWxlZCBJR09zIGlsbHVzdHJhdGUgdGhlIGV4dHJlbWVzLCBmcm9tIG5hcnJvdyBzcGVjaWFsaXN0cyAoZS5nLiwgSVRVLCBJQ0VTLCBJUENDKSB0byBicm9hZCBnZW5lcmFsaXN0cyAoZS5nLiwgVU5VLCBVTkRQLCBVTkNDRCkuIiwNCiAgd2lkdGggPSAxMDANCikNCg0KIyAtLS0gUGxvdCAtLS0NCmgyIDwtIGdncGxvdCgpICsNCiAgIyBSYXcgZGF0YSBwb2ludHMNCiAgZ2VvbV9wb2ludChkYXRhID0gZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHkgPSBzbV9icmVhZHRoLCBjb2xvciA9IHByaW1hcnlfc3ViamVjdCksDQogICAgICAgICAgICAgYWxwaGEgPSAwLjcsIHNpemUgPSAyKSArDQogIA0KICAjIFJlZ3Jlc3Npb24gZml0DQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2RmLCBhZXMoeCA9IGZvdW5kaW5nX2RlbnNpdHlfNXlyLCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksDQogICAgICAgICAgICAgIGFscGhhID0gMC4yLCBmaWxsID0gIm9yYW5nZSIpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2RmLCBhZXMoeCA9IGZvdW5kaW5nX2RlbnNpdHlfNXlyLCB5ID0gZml0KSwNCiAgICAgICAgICAgIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gMS4yKSArDQogIA0KICAjIExhYmVscyBmb3Igbm90YWJsZSBJR09zDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gbGFiZWxfZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHkgPSBzbV9icmVhZHRoLCBsYWJlbCA9IGluc3RpdHV0aW9uKSwNCiAgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBtYXgub3ZlcmxhcHMgPSAxNSwgYm94LnBhZGRpbmcgPSAwLjMsIHBvaW50LnBhZGRpbmcgPSAwLjIpICsNCiAgDQogICMgTGFiZWxzIGFuZCBzdHlsZQ0KICBsYWJzKA0KICAgIHRpdGxlID0gIkZpZ3VyZSAyLjIgSHlwb3RoZXNpcyAyLjIg4oCUIERlbnNpdHkgYW5kIFN1YmplY3QtTWF0dGVyIEJyZWFkdGgiLA0KICAgIHN1YnRpdGxlID0gIkNvbG9yZWQgYnkgcHJpbWFyeSBzdWJqZWN0IGRvbWFpbjsgcmVncmVzc2lvbiBmaXQgd2l0aCA5NSUgQ0kiLA0KICAgIHggPSAiRm91bmRpbmcgRGVuc2l0eSAowrEyIHllYXJzKSIsDQogICAgeSA9ICJTdWJqZWN0LU1hdHRlciBCcmVhZHRoIChOdW1iZXIgb2YgRG9tYWlucykiLA0KICAgIGNvbG9yID0gIlByaW1hcnkgU3ViamVjdCIsDQogICAgY2FwdGlvbiA9IGNhcHRpb25fdGV4dCAgICMgPC0tLSBjYXB0aW9uIGhlcmUNCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSA5LCBsaW5laGVpZ2h0ID0gMS4xLCBmYWNlID0gIml0YWxpYyIpDQogICkNCg0KIyAtLS0gU2F2ZSB3aXRoIHNvbGlkIGJhY2tncm91bmQgLS0tDQpnZ3NhdmUoImZpZ3VyZV8yXzJfaDJfMl9kZW5zaXR5X2FuZF9zdWJqZWN0X21hdHRlcl9icmVhZHRoLnBuZyIsIHBsb3QgPSBoMiwNCiAgICAgICB3aWR0aCA9IDExLCBoZWlnaHQgPSA2LCBkcGkgPSAzMDAsIGJnID0gIndoaXRlIikNCg0KcHJpbnQoaDIpDQoNCmBgYA0KDQojIyMjIyBPdmVyYWxsIHRyZW5kIChsaW5lIGFuZCBiYW5kKToNCiogVW5saWtlIEh5cG90aGVzaXMgMi4xLCB3aGVyZSBzcGVjaWFsaXphdGlvbiAoSEhJKSB3YXMgd2Vha2x5IGxpbmtlZCB0byBkZW5zaXR5LCBoZXJlIHRoZSByZWdyZXNzaW9uIGxpbmUgc2xvcGVzIHVwd2FyZCwgaW5kaWNhdGluZyB0aGF0IGhpZ2hlciBmb3VuZGluZyBkZW5zaXR5IGlzIGFzc29jaWF0ZWQgd2l0aCBncmVhdGVyIGJyZWFkdGggb2YgbWFuZGF0ZXMuIFRoaXMgc3VnZ2VzdHMgdGhhdCBJR09zIGNyZWF0ZWQgaW4gY3Jvd2RlZCBlbnZpcm9ubWVudHMgbWF5IGV4cGFuZCB0aGVpciBjb3ZlcmFnZSBhY3Jvc3MgbXVsdGlwbGUgZG9tYWlucyByYXRoZXIgdGhhbiBuYXJyb3dpbmcgdGhlaXIgZm9jdXMuDQoNCiMjIyMjIFNwZWNpYWxpc3QgSUdPcyAobG93IGJyZWFkdGgpOg0KKiBJVFUsIElDRVMsIElQQ0MgcmVtYWluIG5hcnJvd2x5IGZvY3VzZWQgKDHigJMyIGRvbWFpbnMpLCBldmVuIHdoZW4gZm91bmRlZCBpbiBlbnZpcm9ubWVudHMgb2YgdmFyeWluZyBkZW5zaXR5LiBUaGVzZSBhcmUgdGVjaG5pY2FsIG9yIHNjaWVudGlmaWMgSUdPcyB3aGVyZSBuYXJyb3cgbWFuZGF0ZXMgYXJlIGEgZnVuY3Rpb25hbCBuZWNlc3NpdHkuDQoNCiMjIyMjIEdlbmVyYWxpc3QgSUdPcyAoaGlnaCBicmVhZHRoKToNCiogVU5VLCBVTkRQLCBVTkNDRCwgSUZBRCBjb3ZlciA24oCTOCBkb21haW5zLCByZWZsZWN0aW5nIG11bHRpZGltZW5zaW9uYWwgbWFuZGF0ZXMgaW4gZGV2ZWxvcG1lbnQsIGVudmlyb25tZW50LCBvciBnb3Zlcm5hbmNlLiBOb3RhYmx5LCB0aGVzZSBJR09zIGFwcGVhciBpbiBkZW5zZXIgZm91bmRpbmcgZW52aXJvbm1lbnRzLCBjb25zaXN0ZW50IHdpdGggdGhlIHVwd2FyZCBzbG9wZSBvZiB0aGUgcmVncmVzc2lvbi4NCg0KIyMjIyMgU3ViamVjdCBkb21haW5zIChjb2xvcnMpOg0KQnJvYWQgbWFuZGF0ZXMgYXJlIGVzcGVjaWFsbHkgY29tbW9uIGluIGRldmVsb3BtZW50LCBnb3Zlcm5hbmNlLCBhbmQgZW52aXJvbm1lbnQgZG9tYWlucyAoZS5nLiwgVU5EUCwgVU5DQ0QpLCB3aGlsZSBzY2llbmNlL3RlY2huaWNhbCBvcmdhbml6YXRpb25zIHJlbWFpbiBzcGVjaWFsaXplZC4NCg0KIyMjIyBDb21wYXJpc29uIHRvIEh5cG90aGVzaXMgMi4xOg0KVG9nZXRoZXIsIEZpZ3VyZXMgMi4xIGFuZCAyLjIgc2hvdyBhIG51YW5jZWQgcGljdHVyZToNCg0KKiBVc2luZyBzcGVjaWFsaXphdGlvbiAoSEhJKSDihpIgZGVuc2l0eSBkb2VzIG5vdCBzdHJvbmdseSBkcml2ZSBzcGVjaWFsaXphdGlvbi4NCg0KKiBVc2luZyBicmVhZHRoIChkb21haW4gY291bnQpIOKGkiBkZW5zaXR5IGFwcGVhcnMgdG8gZW5jb3VyYWdlIGJyb2FkZXIgY292ZXJhZ2UsIGF0IGxlYXN0IGZvciBkZXZlbG9wbWVudC1vcmllbnRlZCBJR09zLg0KDQoqKkltcGxpY2F0aW9uOioqDQoNCklHT3MgcmVzcG9uZCB0byBkZW5zZSBpbnN0aXR1dGlvbmFsIGVudmlyb25tZW50cyBub3Qgb25seSBieSBjYXJ2aW5nIG91dCBuaWNoZXMgKGFzIHRoZW9yeSBzdWdnZXN0ZWQpIGJ1dCBhbHNvIGJ5IGFkb3B0aW5nIGJyb2FkZXIgbWFuZGF0ZXMgdG8gcmVtYWluIHJlbGV2YW50IGFuZCBjb21wZXRpdGl2ZSwgZXNwZWNpYWxseSBpbiBkb21haW5zIHdoZXJlIG92ZXJsYXAgYW5kIGNvb3JkaW5hdGlvbiBhcmUgY2VudHJhbCAoZGV2ZWxvcG1lbnQsIGVudmlyb25tZW50LCBnb3Zlcm5hbmNlKS4NCg0KIyMjIDQuMyBIeXBvdGhlc2lzIDIuMyBTcGF0aWFsIGp1cmlzZGljdGlvbiBicmVhZHRoIGRlY3JlYXNlcyBhcyBkZW5zaXR5IGluY3JlYXNlcw0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpkZiRkZW5zaXR5X2dyb3VwIDwtIGN1dChkZiRmb3VuZGluZ19kZW5zaXR5XzV5ciwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHF1YW50aWxlKGRmJGZvdW5kaW5nX2RlbnNpdHlfNXlyLCBwcm9icyA9IGMoMCwgLjMzLCAuNjYsIDEpLCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkxvdyBEZW5zaXR5IiwgIk1lZGl1bSBEZW5zaXR5IiwgIkhpZ2ggRGVuc2l0eSIpKQ0KDQpzdW1tYXJ5X2RmIDwtIGRmICU+JQ0KICBncm91cF9ieShkZW5zaXR5X2dyb3VwKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1lYW5fc3BhdGlhbCA9IG1lYW4oc3BhdGlhbF9icmVhZHRoLCBuYS5ybT1UUlVFKSwNCiAgICBzZSA9IHNkKHNwYXRpYWxfYnJlYWR0aCwgbmEucm09VFJVRSkgLyBzcXJ0KG4oKSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCm1faDIzIDwtIGdsbShzcGF0aWFsX2JyZWFkdGggfiBzY2FsZShmb3VuZGluZ19kZW5zaXR5XzV5ciksIGRhdGEgPSBkZiwgZmFtaWx5ID0gInBvaXNzb24iKQ0KYW5vdmFfcmVzdWx0IDwtIGFub3ZhKG1faDIzLCB0ZXN0ID0gIkNoaXNxIikNCnByaW50KHN1bW1hcnkobV9oMjMpKQ0KcHJpbnQoYW5vdmFfcmVzdWx0KQ0KDQpsYWJlbF9kZiA8LSBkZiAlPiUNCiAgYXJyYW5nZShzcGF0aWFsX2JyZWFkdGgpICU+JQ0KICBzbGljZShjKDE6MywgKG4oKSAtIDIpOm4oKSkpICAjIDMgbmFycm93ZXN0ICsgMyBicm9hZGVzdA0KDQojIC0tLSBDYXB0aW9uIHRleHQgLS0tDQpjYXB0aW9uX3RleHQgPC0gc3RyX3dyYXAoDQogICJGaWd1cmUgMi4zLiBEZW5zaXR5IGFuZCBTcGF0aWFsIEJyZWFkdGguIA0KICBUaGlzIGZpZ3VyZSB0ZXN0cyB3aGV0aGVyIElHT3MgZm91bmRlZCBpbiBkZW5zZXIgaW5zdGl0dXRpb25hbCBlbnZpcm9ubWVudHMgY292ZXIgYnJvYWRlciBqdXJpc2RpY3Rpb25hbCBhcmVhcyAoc3BhdGlhbCBicmVhZHRoKS4gDQogIEJhcnMgc2hvdyB0aGUgbWVhbiBudW1iZXIgb2YganVyaXNkaWN0aW9ucyBjb3ZlcmVkIGluIGxvdy0sIG1lZGl1bS0sIGFuZCBoaWdoLWRlbnNpdHkgZm91bmRpbmcgcGVyaW9kcywgd2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIA0KICBUaGUgcmVzdWx0cyBzdWdnZXN0IGEgbW9kZXN0IHBvc2l0aXZlIHJlbGF0aW9uc2hpcDogSUdPcyBmb3VuZGVkIGluIGhpZ2gtZGVuc2l0eSBlbnZpcm9ubWVudHMgdGVuZCB0byBjb3ZlciBtb3JlIGp1cmlzZGljdGlvbnMsIA0KICB0aG91Z2ggdmFyaWF0aW9uIHJlbWFpbnMgc3Vic3RhbnRpYWwgYWNyb3NzIGNhc2VzLiIsDQogIHdpZHRoID0gMTAwDQopDQoNCmgzIDwtIGdncGxvdChzdW1tYXJ5X2RmLCBhZXMoeCA9IGRlbnNpdHlfZ3JvdXAsIHkgPSBtZWFuX3NwYXRpYWwsIGZpbGwgPSBkZW5zaXR5X2dyb3VwKSkgKw0KICBnZW9tX2NvbChhbHBoYSA9IDAuOCwgd2lkdGggPSAwLjYpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fc3BhdGlhbCAtIDEuOTYqc2UsIHltYXggPSBtZWFuX3NwYXRpYWwgKyAxLjk2KnNlKSwNCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG1lYW5fc3BhdGlhbCwxKSksIHZqdXN0ID0gLTEsIHNpemUgPSA0LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJGaWd1cmUgMi4zIEh5cG90aGVzaXMgMi4zIOKAlCBEZW5zaXR5IGFuZCBTcGF0aWFsIEJyZWFkdGgiLA0KICAgIHN1YnRpdGxlID0gIk1lYW4ganVyaXNkaWN0aW9uYWwgY292ZXJhZ2Ugb2YgSUdPcyBhY3Jvc3MgZGVuc2l0eSBncm91cHMgKMKxOTUlIENJKSIsDQogICAgeCA9ICJGb3VuZGluZyBEZW5zaXR5IChHcm91cGVkKSIsDQogICAgeSA9ICJBdmVyYWdlIFNwYXRpYWwgQnJlYWR0aCAoSnVyaXNkaWN0aW9ucykiLA0KICAgIGNhcHRpb24gPSBjYXB0aW9uX3RleHQNCiAgKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkxvdyBEZW5zaXR5IiA9ICIjOGRkM2M3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaXVtIERlbnNpdHkiID0gIiNmZmZmYjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWdoIERlbnNpdHkiID0gIiNmYjgwNzIiKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSA5LCBsaW5laGVpZ2h0ID0gMS4xLCBmYWNlID0gIml0YWxpYyIpICMgY2FwdGlvbiBzdHlsaW5nDQogICkNCg0KZ2dzYXZlKCJmaWd1cmVfMl8zX2gyXzNfc3BhdGlhbF9icmVhZHRoLnBuZyIsIHBsb3QgPSBoMywNCiAgICAgICB3aWR0aCA9IDksIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQ0KDQpwcmludChoMykNCg0KYGBgDQoqKkltcGxpY2F0aW9uOioqDQoNCkZpZ3VyZSAyLjMgdGVzdHMgd2hldGhlciBpbnN0aXR1dGlvbmFsIGRlbnNpdHkgYXQgdGhlIHRpbWUgb2YgZm91bmRpbmcgaW5mbHVlbmNlcyB0aGUgZ2VvZ3JhcGhpY2FsIHNjb3BlIChzcGF0aWFsIGJyZWFkdGgpIG9mIElHT3MuIFRoZSByZXN1bHRzIHNob3cgYSBtb2Rlc3QgYnV0IG5vbi1saW5lYXIgcGF0dGVybjogSUdPcyBmb3VuZGVkIGluIG1lZGl1bS1kZW5zaXR5IHBlcmlvZHMgdGVuZCB0byBoYXZlIHRoZSBicm9hZGVzdCBzcGF0aWFsIGNvdmVyYWdlIG9uIGF2ZXJhZ2UgKOKJiDIuNyBqdXJpc2RpY3Rpb25zKSwgd2hpbGUgdGhvc2UgZm91bmRlZCBpbiBsb3ctZGVuc2l0eSBjb250ZXh0cyByZW1haW4gbmFycm93ZXIgKOKJiDEuOSBqdXJpc2RpY3Rpb25zKS4gSW50ZXJlc3RpbmdseSwgb3JnYW5pemF0aW9ucyBlbWVyZ2luZyBpbiBoaWdoLWRlbnNpdHkgcGVyaW9kcyBhcmUgbm90IHNpZ25pZmljYW50bHkgYnJvYWRlciB0aGFuIHRob3NlIGluIGxvdy1kZW5zaXR5IGNvbnRleHRzLCBzdWdnZXN0aW5nIHRoYXQgaW50ZW5zZSBpbnN0aXR1dGlvbmFsIGNyb3dkaW5nIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlIGludG8gd2lkZXIgZ2VvZ3JhcGhpY2FsIG1hbmRhdGVzLg0KDQpUaGlzIGZpbmRpbmcgY29tcGxlbWVudHMgdGhlIHByZXZpb3VzIGh5cG90aGVzZXMuIFdoZXJlYXMgSHlwb3RoZXNpcyAyLjEgc3VnZ2VzdGVkIHRoYXQgZGVuc2l0eSB3YXMgb25seSB3ZWFrbHkgYXNzb2NpYXRlZCB3aXRoIGdyZWF0ZXIgc3BlY2lhbGl6YXRpb24gKEhISSksIGFuZCBIeXBvdGhlc2lzIDIuMiBpbmRpY2F0ZWQgYSBzbGlnaHQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIHdpdGggc3ViamVjdC1tYXR0ZXIgYnJlYWR0aCwgSHlwb3RoZXNpcyAyLjMgaGlnaGxpZ2h0cyBhIG1vcmUgbnVhbmNlZCBkeW5hbWljOiBpbnN0aXR1dGlvbmFsIGNyb3dkaW5nIGFwcGVhcnMgdG8gZW5jb3VyYWdlIGV4cGFuc2lvbiBvZiBqdXJpc2RpY3Rpb25hbCByZWFjaCBvbmx5IHVwIHRvIGEgcG9pbnQuIEJleW9uZCB0aGlzLCBoaWdoLWRlbnNpdHkgZW52aXJvbm1lbnRzIG1heSBjb25zdHJhaW4gb3IgY2hhbm5lbCBJR09zIGludG8gbmFycm93ZXIgb3IgbW9yZSBzZWxlY3RpdmUgc3BhdGlhbCBuaWNoZXMsIHJlZmxlY3RpbmcgcHJlc3N1cmVzIHRvIGF2b2lkIHJlZHVuZGFuY3kgYW5kIG92ZXJsYXAuDQoNCiMjIyA0LjQgSHlwb3RoZXNpcyAyLjQgU3Ryb25nZXIgY29vcmRpbmF0aW9uIG1lY2hhbmlzbXMgYWxsb3cgSUdPcyB0byBzdXJ2aXZlIGRlbnNpdHkgcHJlc3N1cmVzIHdpdGhvdXQgZXh0cmVtZSBzcGVjaWFsaXphdGlvbi4NCg0KYGBge3J9DQpsYWJlbF9kZiA8LSBkZiAlPiUNCiAgZ3JvdXBfYnkoZGVuc2l0eV9ncm91cCkgJT4lDQogIHNsaWNlX21pbihvcmRlcl9ieSA9IHN0cmF0ZWd5X2JyZWFkdGgsIG4gPSAxLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lDQogIGJpbmRfcm93cygNCiAgICBkZiAlPiUNCiAgICAgIGdyb3VwX2J5KGRlbnNpdHlfZ3JvdXApICU+JQ0KICAgICAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gc3RyYXRlZ3lfYnJlYWR0aCwgbiA9IDEsIHdpdGhfdGllcyA9IEZBTFNFKQ0KICApICU+JQ0KICB1bmdyb3VwKCkNCg0KY2FwdGlvbl90ZXh0IDwtIHN0cl93cmFwKA0KICAiRmlndXJlIDIuNC4gRGVuc2l0eSBhbmQgU3RyYXRlZ2ljIEJyZWFkdGguIA0KICAgVGhlIGZpZ3VyZSBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIHN0cmF0ZWd5IHBvcnRmb2xpbyBicmVhZHRoIChudW1iZXIgb2Ygc3RyYXRlZ2llcyBhZG9wdGVkKSBhY3Jvc3MgSUdPcyBmb3VuZGVkIGluIGxvdy0sIG1lZGl1bS0sIGFuZCBoaWdoLWRlbnNpdHkgZW52aXJvbm1lbnRzLiANCiAgIEVhY2ggcmlkZ2UgcmVwcmVzZW50cyB0aGUgc3ByZWFkIG9mIHN0cmF0ZWdpYyBicmVhZHRoIHNjb3Jlcywgd2hpbGUgbGFiZWxlZCBwb2ludHMgaGlnaGxpZ2h0IHNlbGVjdGVkIElHT3Mgd2l0aCB0aGUgbmFycm93ZXN0IGFuZCBicm9hZGVzdCBwb3J0Zm9saW9zIGluIGVhY2ggZ3JvdXAuIA0KICAgRm9yIGV4YW1wbGUsIElUVSAoTG93IERlbnNpdHkpIHNob3dzIGxpbWl0ZWQgYnJlYWR0aCwgd2hpbGUgVU4gV29tZW4gKExvdyBEZW5zaXR5KSByZXByZXNlbnRzIGEgYnJvYWRlciBzdHJhdGVnaWMgbWFuZGF0ZS4gDQogICBJbiB0aGUgSGlnaCBEZW5zaXR5IGdyb3VwLCBVTiBET0FMT1MgaGFzIGEgcmVsYXRpdmVseSBuYXJyb3cgc3RyYXRlZ3kgc2V0LCB3aGlsZSBGQU8gZGlzcGxheXMgYSB3aWRlLXJhbmdpbmcgcG9ydGZvbGlvLiANCiAgIEJhcnMgY2FwdHVyZSB0aGUgZGl2ZXJzaXR5IG9mIGFwcHJvYWNoZXMgSUdPcyBhZG9wdCBkZXBlbmRpbmcgb24gaW5zdGl0dXRpb25hbCBjcm93ZGluZyBhdCB0aGUgdGltZSBvZiBmb3VuZGluZy4iLA0KICB3aWR0aCA9IDEwMA0KKQ0KDQpoNCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gc3RyYXRlZ3lfYnJlYWR0aCwgeSA9IGRlbnNpdHlfZ3JvdXAsIGZpbGwgPSBkZW5zaXR5X2dyb3VwKSkgKw0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC42LCBzY2FsZSA9IDEuMSwgcmVsX21pbl9oZWlnaHQgPSAwLjAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gbGFiZWxfZGYsIGFlcyh4ID0gc3RyYXRlZ3lfYnJlYWR0aCwgeSA9IGRlbnNpdHlfZ3JvdXApLA0KICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBsYWJlbF9kZiwNCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gc3RyYXRlZ3lfYnJlYWR0aCwgeSA9IGRlbnNpdHlfZ3JvdXAsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBpbnN0aXR1dGlvbiksDQogICAgICAgICAgICAgICAgICBzaXplID0gMywgbnVkZ2VfeSA9IDAuMjUsIHNlZ21lbnQuY29sb3IgPSAiZ3JleTQwIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkZpZ3VyZSAyLjQgSHlwb3RoZXNpcyAyLjQg4oCUIERlbnNpdHkgYW5kIFN0cmF0ZWdpYyBCcmVhZHRoIiwNCiAgICB4ID0gIlN0cmF0ZWdpYyBCcmVhZHRoIChOdW1iZXIgb2YgU3RyYXRlZ2llcykiLA0KICAgIHkgPSAiRm91bmRpbmcgRGVuc2l0eSBHcm91cCIsDQogICAgY2FwdGlvbiA9IGNhcHRpb25fdGV4dA0KICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTG93IERlbnNpdHkiID0gIiM4MGIxZDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZWRpdW0gRGVuc2l0eSIgPSAiI2ZkYjQ2MiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggRGVuc2l0eSIgPSAiI2IzZGU2OSIpKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPTExLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gOSwgbGluZWhlaWdodCA9IDEuMSwgZmFjZSA9ICJpdGFsaWMiKQ0KICApDQoNCmdnc2F2ZSgiZmlndXJlXzJfNF9oMl80X3N0cmF0ZWdpY19icmVhZHRoX2xhYmVsZWQucG5nIiwNCiAgICAgICBwbG90ID0gaDQsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpDQoNCnByaW50KGg0KQ0KYGBgDQoqKkltcGxpY2F0aW9uOioqDQoNCkZpZ3VyZSAyLjQgZXhhbWluZXMgd2hldGhlciBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGluc3RpdHV0aW9uYWwgZW52aXJvbm1lbnRzIHB1cnN1ZSBicm9hZGVyIHN0cmF0ZWdpYyBwb3J0Zm9saW9zLiBUaGUgZGlzdHJpYnV0aW9ucyBzdWdnZXN0IGEgY2xlYXIgdHJlbmQ6IElHT3MgaW4gbWVkaXVtLSBhbmQgaGlnaC1kZW5zaXR5IGVudmlyb25tZW50cyB0ZW5kIHRvIGFkb3B0IGEgd2lkZXIgcmFuZ2Ugb2Ygc3RyYXRlZ2llcyB0aGFuIHRob3NlIGZvdW5kZWQgaW4gbG93LWRlbnNpdHkgcGVyaW9kcy4gSW1wb3J0YW50bHksIHRoZSBmaWd1cmUgYWxzbyBoaWdobGlnaHRzIHZhcmlhdGlvbiB3aXRoaW4gZWFjaCBkZW5zaXR5IGdyb3VwLiBGb3IgaW5zdGFuY2UsIElUVSAoZm91bmRlZCBpbiBhIGxvdy1kZW5zaXR5IGVyYSkgc2hvd3MgYSBuYXJyb3cgc3RyYXRlZ3kgZm9jdXMsIHdoaWxlIFVOIFdvbWVuLCBhbHNvIGZyb20gYSBsb3ctZGVuc2l0eSBwZXJpb2QsIGlzIGZhciBtb3JlIGRpdmVyc2lmaWVkLiBTaW1pbGFybHksIGFtb25nIGhpZ2gtZGVuc2l0eSBJR09zLCBVTiBET0FMT1MgcHVyc3VlcyBhIHJlbGF0aXZlbHkgbmFycm93IHNldCBvZiBzdHJhdGVnaWVzLCB3aGVyZWFzIEZBTyBleGhpYml0cyBvbmUgb2YgdGhlIGJyb2FkZXN0IHBvcnRmb2xpb3MgaW4gdGhlIGRhdGFzZXQuDQoNClRoaXMgc3VwcG9ydHMgSHlwb3RoZXNpcyAyLjQgYnkgc2hvd2luZyB0aGF0IGluc3RpdHV0aW9uYWwgY3Jvd2RpbmcgZ2VuZXJhbGx5IHB1c2hlcyBJR09zIHRvd2FyZCBncmVhdGVyIHN0cmF0ZWdpYyBicmVhZHRoLCB0aG91Z2ggbm90IHVuaWZvcm1seS4gQ29tcGFyZWQgdG8gSHlwb3RoZXNpcyAyLjEgKHNwZWNpYWxpemF0aW9uKSBhbmQgSHlwb3RoZXNpcyAyLjIgKHN1YmplY3QtbWF0dGVyIGJyZWFkdGgpLCB0aGlzIGZpbmRpbmcgc3RyZW5ndGhlbnMgdGhlIHZpZXcgdGhhdCBkZW5zZXIgaW5zdGl0dXRpb25hbCBlbnZpcm9ubWVudHMgZW5jb3VyYWdlIG9yZ2FuaXphdGlvbnMgdG8gZXhwYW5kIHRoZWlyIHBvcnRmb2xpb3Mgb2YgYWN0aW9uIHJhdGhlciB0aGFuIHJlc3RyaWN0IHRoZW0gdG8gbmFycm93IG1hbmRhdGVzLiBJbiBjb250cmFzdCB0byBIeXBvdGhlc2lzIDIuMyAoc3BhdGlhbCBicmVhZHRoKSwgd2hlcmUgaGlnaCBkZW5zaXR5IGxpbWl0ZWQgZXhwYW5zaW9uLCBoZXJlIGhpZ2ggZGVuc2l0eSB0ZW5kcyB0byBlbmNvdXJhZ2UgbW9yZSBkaXZlcnNpZmllZCBzdHJhdGVnaWVzLCByZWZsZWN0aW5nIHByZXNzdXJlcyBmb3Igb3JnYW5pemF0aW9ucyB0byByZW1haW4gcmVsZXZhbnQgYW5kIHJlc3BvbnNpdmUgd2l0aGluIGNyb3dkZWQgZ292ZXJuYW5jZSBsYW5kc2NhcGVzLg0KDQojIyMgNC41IEh5cG90aGVzaXMgMi41IExlZ2FsIGF1dGhvcml0eSBtb2RlcmF0ZXMgdGhlIGVmZmVjdCBvZiBkZW5zaXR5IG9uIHNwZWNpYWxpemF0aW9uLg0KYGBge3J9DQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGdncmVwZWwpDQoNCmRmJGxlZ2FsX2dyb3VwIDwtIGZhY3RvcihkZiRsZWdhbF9ncm91cCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJMb3cgTGVnYWwgQXV0aG9yaXR5IiwgIkhpZ2ggTGVnYWwgQXV0aG9yaXR5IikpDQoNCm1faDI1IDwtIGxtKHNtX0hISSB+IHNjYWxlKGZvdW5kaW5nX2RlbnNpdHlfNXlyKSAqIGxlZ2FsX2dyb3VwICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUoY3VtdWxhdGl2ZV9zdG9jayksDQogICAgICAgICAgICBkYXRhID0gZGYpDQpzdW1tYXJ5KG1faDI1KQ0KDQpuZXdkYXQgPC0gZXhwYW5kLmdyaWQoDQogIGZvdW5kaW5nX2RlbnNpdHlfNXlyID0gc2VxKG1pbihkZiRmb3VuZGluZ19kZW5zaXR5XzV5ciwgbmEucm09VFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkZiRmb3VuZGluZ19kZW5zaXR5XzV5ciwgbmEucm09VFJVRSksIGxlbmd0aC5vdXQgPSAyMDApLA0KICBsZWdhbF9ncm91cCA9IGMoIkxvdyBMZWdhbCBBdXRob3JpdHkiLCAiSGlnaCBMZWdhbCBBdXRob3JpdHkiKSwNCiAgY3VtdWxhdGl2ZV9zdG9jayA9IG1lZGlhbihkZiRjdW11bGF0aXZlX3N0b2NrLCBuYS5ybT1UUlVFKQ0KKQ0KDQpwcmVkIDwtIHByZWRpY3QobV9oMjUsIG5ld2RhdGEgPSBuZXdkYXQsIHNlLmZpdCA9IFRSVUUpDQpwcmVkX2RmIDwtIGNiaW5kKG5ld2RhdCwgZml0ID0gcHJlZCRmaXQsIHNlID0gcHJlZCRzZS5maXQpICU+JQ0KICBtdXRhdGUodXBwZXIgPSBmaXQgKyAxLjk2KnNlLCBsb3dlciA9IGZpdCAtIDEuOTYqc2UpDQoNCmxhYmVsX2RmIDwtIGRmICU+JQ0KICBncm91cF9ieShsZWdhbF9ncm91cCkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IHNtX0hISSwgbiA9IDIpICU+JQ0KICBiaW5kX3Jvd3MoDQogICAgZGYgJT4lIGdyb3VwX2J5KGxlZ2FsX2dyb3VwKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gc21fSEhJLCBuID0gMikNCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCmNhcHRpb25fdGV4dCA8LSBzdHJfd3JhcCgNCiAgIkZpZ3VyZSAyLjUuIERlbnNpdHksIExlZ2FsIEF1dGhvcml0eSwgYW5kIFNwZWNpYWxpemF0aW9uLg0KICAgVGhlIGZpZ3VyZSBzaG93cyB0aGUgZWZmZWN0IG9mIGZvdW5kaW5nIGRlbnNpdHkgb24gdGhlIGRlZ3JlZSBvZiBzcGVjaWFsaXphdGlvbiAoSEhJKSBvZiBJR09zLCBjb21wYXJpbmcgb3JnYW5pemF0aW9ucyB3aXRoIGhpZ2ggbGVnYWwgYXV0aG9yaXR5IChncmVlbikgdmVyc3VzIGxvdyBsZWdhbCBhdXRob3JpdHkgKG9yYW5nZSkuIA0KICAgVGhlIHJlZ3Jlc3Npb24gbGluZXMgcmVwcmVzZW50IHByZWRpY3RlZCBzcGVjaWFsaXphdGlvbiwgd2l0aCBzaGFkZWQgYXJlYXMgaW5kaWNhdGluZyA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIA0KICAgUG9pbnRzIHJlcHJlc2VudCBJR09zLCB3aXRoIHNlbGVjdGVkIG9yZ2FuaXphdGlvbnMgbGFiZWxlZCBmb3IgY29udGV4dCAoZS5nLiwgSVRVLCBJUENDLCBVTkRQLCBVTlUsIFVOT0RDLCBJRkFELCBXRlAsIFVOQ0NEKS4gDQogICBJR09zIHdpdGggaGlnaCBsZWdhbCBhdXRob3JpdHkgZ2VuZXJhbGx5IGNsdXN0ZXIgYXQgbG93ZXIgc3BlY2lhbGl6YXRpb24gbGV2ZWxzLCB3aGlsZSBsb3ctbGVnYWwgYXV0aG9yaXR5IElHT3Mgc2hvdyBncmVhdGVyIHZhcmlhdGlvbiBpbiBzcGVjaWFsaXphdGlvbiwgZXNwZWNpYWxseSBhdCBsb3dlciBkZW5zaXRpZXMuIiwNCiAgd2lkdGggPSAxMDANCikNCg0KaDUgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBkZiwNCiAgICAgICAgICAgICBhZXMoeCA9IGZvdW5kaW5nX2RlbnNpdHlfNXlyLCB5ID0gc21fSEhJLA0KICAgICAgICAgICAgICAgICBjb2xvciA9IGxlZ2FsX2dyb3VwKSwNCiAgICAgICAgICAgICBhbHBoYSA9IDAuNiwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9yaWJib24oZGF0YSA9IHByZWRfZGYsDQogICAgICAgICAgICAgIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyLCBmaWxsID0gbGVnYWxfZ3JvdXApLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMTUpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcmVkX2RmLA0KICAgICAgICAgICAgYWVzKHggPSBmb3VuZGluZ19kZW5zaXR5XzV5ciwgeSA9IGZpdCwgY29sb3IgPSBsZWdhbF9ncm91cCksDQogICAgICAgICAgICBzaXplID0gMSkgKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGxhYmVsX2RmLA0KICAgICAgICAgICAgICAgICAgYWVzKHggPSBmb3VuZGluZ19kZW5zaXR5XzV5ciwgeSA9IHNtX0hISSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGluc3RpdHV0aW9uLCBjb2xvciA9IGxlZ2FsX2dyb3VwKSwNCiAgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBzZWdtZW50LmNvbG9yID0gImdyZXk1MCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJGaWd1cmUgMi41IEh5cG90aGVzaXMgMi41OkRlbnNpdHksIExlZ2FsIEF1dGhvcml0eSwgYW5kIFNwZWNpYWxpemF0aW9uIiwNCiAgICB4ID0gIkZvdW5kaW5nIERlbnNpdHkgKMKxMiB5ZWFycykiLA0KICAgIHkgPSAiU3BlY2lhbGl6YXRpb24gKEhISSkiLA0KICAgIGNvbG9yID0gIkxlZ2FsIEF1dGhvcml0eSIsDQogICAgZmlsbCA9ICJMZWdhbCBBdXRob3JpdHkiLA0KICAgIGNhcHRpb24gPSBjYXB0aW9uX3RleHQNCiAgKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJIaWdoIExlZ2FsIEF1dGhvcml0eSIgPSAiIzFiOWU3NyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3cgTGVnYWwgQXV0aG9yaXR5IiA9ICIjZDk1ZjAyIikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiSGlnaCBMZWdhbCBBdXRob3JpdHkiID0gIiMxYjllNzciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3cgTGVnYWwgQXV0aG9yaXR5IiA9ICIjZDk1ZjAyIikpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gOSwgbGluZWhlaWdodCA9IDEuMSwgZmFjZSA9ICJpdGFsaWMiKQ0KICApDQoNCmdnc2F2ZSgiZmlndXJlXzJfNV9oMl81X2RlbnNpdHlfeF9sZWdhbF9zcGVjaWFsaXphdGlvbi5wbmciLA0KICAgICAgIHBsb3QgPSBoNSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpDQoNCnByaW50KGg1KQ0KYGBgDQoqKkltcGxpY2F0aW9uKioNCg0KKiBUaGlzIHJlc3VsdCByZWZpbmVzIHRoZSBmaW5kaW5ncyBmcm9tIEh5cG90aGVzZXMgMi4x4oCTMi40LiBXaGlsZSB0aG9zZSBhbmFseXNlcyBzaG93ZWQgdGhhdCBpbnN0aXR1dGlvbmFsIGRlbnNpdHkgdGVuZHMgdG8gZW5jb3VyYWdlIHNwZWNpYWxpemF0aW9uIGFuZCBuYXJyb3cgb3JnYW5pemF0aW9uYWwgbmljaGVzLCBGaWd1cmUgMi41IGRlbW9uc3RyYXRlcyB0aGF0IHRoaXMgZWZmZWN0IGRlcGVuZHMgb24gdGhlIGxlZ2FsIGF1dGhvcml0eSBvZiB0aGUgb3JnYW5pemF0aW9uLg0KDQoqIExvdy1sZWdhbCBhdXRob3JpdHkgSUdPcyAoZS5nLiwgSVRVLCBXRlAsIFVOT0RDKSBkaXNwbGF5IGhpZ2hlciBzcGVjaWFsaXphdGlvbiBpbiBsb3ctZGVuc2l0eSBlbnZpcm9ubWVudHMgYnV0IGNvbnZlcmdlIHRvd2FyZCBsb3dlciBzcGVjaWFsaXphdGlvbiBhcyBkZW5zaXR5IGluY3JlYXNlcy4NCg0KKiBIaWdoLWxlZ2FsIGF1dGhvcml0eSBJR09zIChlLmcuLCBVTkRQLCBVTlUsIFVOQ0NEKSBnZW5lcmFsbHkgbWFpbnRhaW4gbG93ZXIgbGV2ZWxzIG9mIHNwZWNpYWxpemF0aW9uIGFjcm9zcyBkZW5zaXRpZXMsIHdpdGggYSBzbGlnaHQgZGVjbGluZSBhcyBkZW5zaXR5IHJpc2VzLg0KDQoqIFRoaXMgc3VnZ2VzdHMgdGhhdCBsZWdhbCBhdXRob3JpdHkgbW9kZXJhdGVzIHRoZSBkZW5zaXR54oCTc3BlY2lhbGl6YXRpb24gcmVsYXRpb25zaGlwOiBvcmdhbml6YXRpb25zIHdpdGggc3Ryb25nZXIgbGVnYWwgYXV0aG9yaXR5IGFwcGVhciBsZXNzIHJlc3BvbnNpdmUgdG8gY29tcGV0aXRpdmUgcHJlc3N1cmVzIGZvciBzcGVjaWFsaXphdGlvbiwgbGlrZWx5IGJlY2F1c2UgdGhlaXIgYnJvYWQgbWFuZGF0ZXMgYW5kIGJpbmRpbmcgZnJhbWV3b3JrcyBidWZmZXIgdGhlbSBhZ2FpbnN0IGR1cGxpY2F0aW9uIGNvbmNlcm5zLiBJbiBjb250cmFzdCwgbG93LWF1dGhvcml0eSBJR09zIGFyZSBtb3JlIHNlbnNpdGl2ZSB0byBpbnN0aXR1dGlvbmFsIGNyb3dkaW5nLCBkaWZmZXJlbnRpYXRpbmcgdGhlbXNlbHZlcyBtb3JlIGNsZWFybHkgd2hlbiBpbnN0aXR1dGlvbmFsIGVudmlyb25tZW50cyBhcmUgbGVzcyBzYXR1cmF0ZWQuDQoNCioqVG9nZXRoZXIgd2l0aCB0aGUgZWFybGllciBoeXBvdGhlc2VzLCB0aGlzIGZpbmRpbmcgaW5kaWNhdGVzIHRoYXQgc3BlY2lhbGl6YXRpb24gaXMgbm90IHVuaWZvcm0gYWNyb3NzIHRoZSBJR08gbGFuZHNjYXBlIGJ1dCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGluc3RpdHV0aW9uYWwgY29udGV4dCAoZGVuc2l0eSkgYW5kIG9yZ2FuaXphdGlvbmFsIGRlc2lnbiBmZWF0dXJlcyAobGVnYWwgYXV0aG9yaXR5KS4qKg0KDQojIyMgNC42IEh5cG90aGVzaXMgMi42OiBJR09zIHdpdGggYnJvYWRlciBzdHJhdGVneSBwb3J0Zm9saW9zIGFkYXB0IGJldHRlciBpbiBoaWdoLWRlbnNpdHkgZmllbGRzIHRoYW4gdGhvc2Ugd2l0aCBuYXJyb3cgc3RyYXRlZ2llcw0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ2VmZmVjdHMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgLS0tIFN0ZXAgMTogTW9kZWwgKERlbnNpdHkgw5cgU3RyYXRlZ3kgQnJlYWR0aCkgLS0tDQptX2gyNiA8LSBsbShzbV9ISEkgfiBzY2FsZShmb3VuZGluZ19kZW5zaXR5XzV5cikgKiBzY2FsZShzdHJhdGVneV9icmVhZHRoKSArIA0KICAgICAgICAgICAgICBzY2FsZShjdW11bGF0aXZlX3N0b2NrKSwNCiAgICAgICAgICAgIGRhdGEgPSBkZikNCg0Kc3VtbWFyeShtX2gyNikNCg0KIyAtLS0gU3RlcCAyOiBQcmVkaWN0aW9ucyBmb3IgcGxvdHRpbmcgLS0tDQojIGdncHJlZGljdCBpcyBmcm9tIGdnZWZmZWN0cywgc28gZWl0aGVyOg0KcHJlZF9oMjYgPC0gZ2dlZmZlY3RzOjpnZ3ByZWRpY3QobV9oMjYsIHRlcm1zID0gYygiZm91bmRpbmdfZGVuc2l0eV81eXIiLCAic3RyYXRlZ3lfYnJlYWR0aCBbcXVhcnRdIikpDQoNCiMgLS0tIFN0ZXAgMzogQ2FwdGlvbiB0ZXh0IC0tLQ0KY2FwdGlvbl90ZXh0IDwtIHN0cl93cmFwKA0KICAiRmlndXJlIDIuNi4gRGVuc2l0eSwgU3RyYXRlZ3kgQnJlYWR0aCwgYW5kIFNwZWNpYWxpemF0aW9uLiANCiAgIFRoZSBmaWd1cmUgaWxsdXN0cmF0ZXMgaG93IGZvdW5kaW5nIGRlbnNpdHkgaW5mbHVlbmNlcyBJR08gc3BlY2lhbGl6YXRpb24gKEhlcmZpbmRhaGzigJNIaXJzY2htYW4gSW5kZXgsIEhISSksIGRlcGVuZGluZyBvbiB0aGUgYnJlYWR0aCBvZiB0aGVpciBzdHJhdGVneSBwb3J0Zm9saW9zLiANCiAgIFN0cmF0ZWd5IGJyZWFkdGggaXMgZGl2aWRlZCBpbnRvIHF1YXJ0aWxlcywgbWVhbmluZyBJR09zIGFyZSBncm91cGVkIGludG8gZm91ciBsZXZlbHMgZnJvbSBuYXJyb3dlc3QgdG8gYnJvYWRlc3QgcG9ydGZvbGlvczogdGhlIGxvd2VzdCBxdWFydGlsZSAoZmV3ZXIgc3RyYXRlZ2llcykgdG8gdGhlIGhpZ2hlc3QgcXVhcnRpbGUgKG1vcmUgZGl2ZXJzaWZpZWQgc3RyYXRlZ2llcykuIA0KICAgTGluZXMgc2hvdyBwcmVkaWN0ZWQgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2ggcXVhcnRpbGUsIGFuZCBzaGFkZWQgYXJlYXMgcmVwcmVzZW50IDk1JSBjb25maWRlbmNlIGludGVydmFscy4gDQogICBJR09zIHdpdGggYnJvYWRlciBzdHJhdGVneSBwb3J0Zm9saW9zICh1cHBlciBxdWFydGlsZXMpIGJlZ2luIHdpdGggaGlnaGVyIHNwZWNpYWxpemF0aW9uIGFuZCByZXRhaW4gaXQgbW9yZSBlZmZlY3RpdmVseSB1bmRlciBoaWdoIGRlbnNpdHksIHdoaWxlIHRob3NlIHdpdGggbmFycm93IHBvcnRmb2xpb3MgKGxvd2VyIHF1YXJ0aWxlcykgc2hvdyBsb3dlciBzcGVjaWFsaXphdGlvbiBhbmQgc2hhcnBlciBkZWNsaW5lcyBhcyBkZW5zaXR5IGluY3JlYXNlcy4iLA0KICB3aWR0aCA9IDEwMA0KKQ0KDQojIC0tLSBTdGVwIDQ6IFBsb3QgLS0tDQpoNiA8LSBnZ3Bsb3QocHJlZF9oMjYsIGFlcyh4ID0geCwgeSA9IHByZWRpY3RlZCwgY29sb3IgPSBncm91cCkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjIpICsNCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCwgZmlsbCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjE1LCBjb2xvciA9IE5BKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBuYW1lID0gIlN0cmF0ZWd5IEJyZWFkdGggKFF1YXJ0aWxlcykiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIG5hbWUgPSAiU3RyYXRlZ3kgQnJlYWR0aCAoUXVhcnRpbGVzKSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJGaWd1cmUgMi42IEh5cG90aGVzaXMgMi42IOKAlCBEZW5zaXR5LCBTdHJhdGVneSBCcmVhZHRoLCBhbmQgU3BlY2lhbGl6YXRpb24iLA0KICAgIHN1YnRpdGxlID0gIkVmZmVjdCBvZiBmb3VuZGluZyBkZW5zaXR5IG9uIHNwZWNpYWxpemF0aW9uIChISEkpLCBtb2RlcmF0ZWQgYnkgc3RyYXRlZ3kgYnJlYWR0aCIsDQogICAgeCA9ICJGb3VuZGluZyBEZW5zaXR5ICjCsTIgeWVhcnMpIiwNCiAgICB5ID0gIlNwZWNpYWxpemF0aW9uIChISEkpIiwNCiAgICBjYXB0aW9uID0gY2FwdGlvbl90ZXh0DQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yID0gImdyZXk0MCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSA5LCBsaW5laGVpZ2h0ID0gMS4xLCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICkNCg0KIyAtLS0gU3RlcCA1OiBTYXZlIHdpdGggd2hpdGUgYmFja2dyb3VuZCAtLS0NCmdnc2F2ZSgiZmlndXJlXzJfNl9oMl82LnBuZyIsIHBsb3QgPSBoNiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpDQoNCnByaW50KGg2KQ0KDQpgYGANCioqSW1wbGljYXRpb25zKioNCg0KVGhpcyByZXN1bHQgc3VwcG9ydHMgSHlwb3RoZXNpcyAyLjYsIHNob3dpbmcgdGhhdCBzdHJhdGVnaWMgYnJlYWR0aCBtb2RlcmF0ZXMgdGhlIHByZXNzdXJlcyBvZiBjcm93ZGVkIGluc3RpdHV0aW9uYWwgZmllbGRzLiBJR09zIGZvdW5kZWQgaW4gZGVuc2UgZW52aXJvbm1lbnRzIHRlbmQgdG8gbG9zZSBzcGVjaWFsaXphdGlvbiBvdmVyYWxsIChkb3dud2FyZCBzbG9wZSBhY3Jvc3MgYWxsIGxpbmVzKSwgYnV0IHRob3NlIHdpdGggYnJvYWRlciBzdHJhdGVneSBwb3J0Zm9saW9zIChlLmcuLCBRdWFydGlsZXMgN+KAkzkpIGFkYXB0IGJldHRlciwgcHJlc2VydmluZyBoaWdoZXIgbGV2ZWxzIG9mIHNwZWNpYWxpemF0aW9uIGNvbXBhcmVkIHRvIHRob3NlIHdpdGggbmFycm93IHBvcnRmb2xpb3MuIFRoaXMgc3VnZ2VzdHMgdGhhdCBpbiBjb21wZXRpdGl2ZSBpbnN0aXR1dGlvbmFsIGxhbmRzY2FwZXMsIGZsZXhpYmlsaXR5IGFuZCBkaXZlcnNpZmljYXRpb24gb2Ygc3RyYXRlZ2llcyBoZWxwIG9yZ2FuaXphdGlvbnMgY2FydmUgb3V0IG5pY2hlcyBhbmQgYnVmZmVyIGFnYWluc3QgcmVkdW5kYW5jeS4gV2hlbiByZWFkIGFsb25nc2lkZSBIeXBvdGhlc2VzIDIuMeKAkzIuNSwgdGhpcyBleHRlbmRzIHRoZSBwaWN0dXJlOiB3aGlsZSBkZW5zaXR5IGdlbmVyYWxseSBwdXNoZXMgdG93YXJkIHNwZWNpYWxpemF0aW9uLCB0aGUgYWJpbGl0eSB0byBjb21iaW5lIG11bHRpcGxlIHN0cmF0ZWdpZXMgZW5oYW5jZXMgcmVzaWxpZW5jZSBhbmQgYWxsb3dzIElHT3MgdG8gbWFpbnRhaW4gYSBkaWZmZXJlbnRpYXRlZCByb2xlIHdpdGhpbiBjcm93ZGVkIGdvdmVybmFuY2Ugc3BhY2VzLg0KDQojIyMgNC43IEh5cG90aGVzaXMgMi43OiBOaWNoZSBkaWZmZXJlbnRpYXRpb24gb2NjdXJzIGFsb25nIHN1YmplY3TigJNzcGF0aWFsIGludGVyc2VjdGlvbnMuDQoNCmBgYHtyfQ0Kc3ViamVjdF9sYWJlbHMgPC0gYygNCiAgImJpb2RpdmVyc2l0eV9lY29zeXN0ZW1fY29uc2VydmF0aW9uX2Fjcm9zc19pZ28iID0gIkJpb2RpdmVyc2l0eSAmIENvbnNlcnZhdGlvbiIsDQogICJjdWx0dXJhbF9oZXJpdGFnZV90cmFkaXRpb25hbF9rbm93bGVkZ2VfZGF0YV9nb3Zlcm5hbmNlX2Fjcm9zc19pZ28iID0gIkN1bHR1cmFsIEhlcml0YWdlICYgS25vd2xlZGdlIiwNCiAgImRpc2FzdGVyX3Jpc2tfcmVkdWN0aW9uX3Jlc2lsaWVuY2VfYWNyb3NzX2lnbyIgPSAiRGlzYXN0ZXIgUmlzayAmIFJlc2lsaWVuY2UiLA0KICAiZW52aXJvbm1lbnRhbF9wcm90ZWN0aW9uX2NsaW1hdGVfY2hhbmdlX2Fjcm9zc19pZ28iID0gIkVudmlyb25tZW50ICYgQ2xpbWF0ZSIsDQogICJodW1hbl9yaWdodHNfc29jaWFsX2p1c3RpY2VfYWR2b2NhY3lfYWNyb3NzX2lnbyIgPSAiSHVtYW4gUmlnaHRzICYgSnVzdGljZSIsDQogICJpbnRlcm5hdGlvbmFsX2Nvb3BlcmF0aW9uX2dvdmVybmFuY2VfYWNyb3NzX2lnbyIgPSAiR292ZXJuYW5jZSAmIENvb3BlcmF0aW9uIiwNCiAgInJlc2VhcmNoX3NjaWVuY2VfaW5ub3ZhdGlvbl9hY3Jvc3NfaWdvIiA9ICJTY2llbmNlICYgSW5ub3ZhdGlvbiIsDQogICJzZWN1cml0eV9zYWZldHlfYWNyb3NzX2lnbyIgPSAiU2VjdXJpdHkgJiBTYWZldHkiLA0KICAic3VzdGFpbmFibGVfZGV2ZWxvcG1lbnRfY2FwYWNpdHlfYnVpbGRpbmdfYWNyb3NzX2lnbyIgPSAiU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQiLA0KICAidHJhZGVfaW52ZXN0bWVudF9lY29ub21pY19jb29wZXJhdGlvbl9hY3Jvc3NfaWdvIiA9ICJUcmFkZSAmIEVjb25vbXkiDQopDQpzcGF0aWFsX2xhYmVscyA8LSBjKA0KICAiYXJjaGlwZWxhZ29fYWNyb3NzX2lnbyIgPSAiQXJjaGlwZWxhZ28iLA0KICAiY29hc3RhbF96b25lX2Fjcm9zc19pZ28iID0gIkNvYXN0YWwgWm9uZSIsDQogICJjb250aWd1b3VzX3pvbmVfY3pfYWNyb3NzX2lnbyIgPSAiQ29udGlndW91cyBab25lIiwNCiAgImVuY2xvc2VkX29yX3NlbWlfZW5jbG9zZWRfc2VhX2Fjcm9zc19pZ28iID0gIkVuY2xvc2VkL1NlbWktRW5jbG9zZWQgU2VhIiwNCiAgImV4Y2x1c2l2ZV9lY29ub21pY196b25lX2Vlel9hY3Jvc3NfaWdvIiA9ICJFRVoiLA0KICAiZXh0ZW5kZWRfY29udGluZW50YWxfc2hlbGZfY3NfYWNyb3NzX2lnbyIgPSAiQ29udGluZW50YWwgU2hlbGYiLA0KICAiaGlnaF9zZWFzX2Fjcm9zc19pZ28iID0gIkhpZ2ggU2VhcyIsDQogICJpbnRlcm5hbF93YXRlcnNfYWNyb3NzX2lnbyIgPSAiSW50ZXJuYWwgV2F0ZXJzIiwNCiAgInRlcnJpdG9yaWFsX3NlYV90c19hY3Jvc3NfaWdvIiA9ICJUZXJyaXRvcmlhbCBTZWEiLA0KICAidGhlX2FyZWFfYWNyb3NzX2lnbyIgPSAiVGhlIEFyZWEiDQopDQoNCmNhcHRpb25fdGV4dF8yNyA8LSBzdHJfd3JhcCgNCiAgIkZpZ3VyZSAyLjcg4oCUIE5pY2hlIERpZmZlcmVudGlhdGlvbiAoU3ViamVjdCDihpQgU3BhdGlhbCBGbG93cykuDQogICBUaGUgZGlhZ3JhbSBpbGx1c3RyYXRlcyBob3cgSUdPIHN1YmplY3QgZG9tYWlucyBkaXN0cmlidXRlIGFjcm9zcyBtYXJpdGltZSBzcGF0aWFsIGp1cmlzZGljdGlvbnMuIA0KICAgQnJvYWQgZG9tYWlucyBzdWNoIGFzIEVudmlyb25tZW50ICYgQ2xpbWF0ZSBhbmQgQmlvZGl2ZXJzaXR5ICYgQ29uc2VydmF0aW9uIHNwYW4gbmVhcmx5IGFsbCB6b25lcywgDQogICB3aGlsZSBuYXJyb3dlciBmaWVsZHMgbGlrZSBTZWN1cml0eSAmIFNhZmV0eSBjb25jZW50cmF0ZSBpbiB0aGUgaGlnaCBzZWFzIGFuZCB0aGUgQXJlYS4gDQogICBEZXZlbG9wbWVudC1vcmllbnRlZCBhcmVhcyAoU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQsIFRyYWRlICYgRWNvbm9teSkgY2x1c3RlciBhcm91bmQgY29hc3RhbCBhbmQgRUVaIHNwYWNlcywgDQogICByZWZsZWN0aW5nIGVjb25vbWljIG1hbmRhdGVzLiANCiAgIFRoZXNlIGZsb3dzIGRlbW9uc3RyYXRlIHRoYXQgSUdPcyBvY2N1cHkgZGlmZmVyZW50aWF0ZWQgbmljaGVzIGF0IHRoZSBpbnRlcnNlY3Rpb24gb2Ygc3ViamVjdCBhbmQgc3BhY2UsIA0KICAgc3VwcG9ydGluZyB0aGUgaHlwb3RoZXNpcyB0aGF0IGluc3RpdHV0aW9uYWwgc3BlY2lhbGl6YXRpb24gaXMgc3RydWN0dXJlZCByYXRoZXIgdGhhbiByYW5kb20uIiwNCiAgd2lkdGggPSAxMDANCikNCg0KbGlicmFyeShnZ2FsbHV2aWFsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIENvbGxhcHNlIGludG8gc3ViamVjdCArIHNwYXRpYWwgKHRha2luZyBwcmltYXJ5IGRvbWFpbikNCmRmX2xvbmcgPC0gZGF0YS5mcmFtZSgNCiAgSUdPID0gZGYkaW5zdGl0dXRpb24sDQogIFN1YmplY3QgPSBjb2xuYW1lcyhkZlssNTk6NjhdKVthcHBseShkZlssNTk6NjhdLCAxLCB3aGljaC5tYXgpXSwNCiAgU3BhdGlhbCA9IGNvbG5hbWVzKGRmWywxNzoyNl0pW2FwcGx5KGRmWywxNzoyNl0sIDEsIHdoaWNoLm1heCldDQopDQoNCiMgQXBwbHkgc2hvcnRlciBsYWJlbHMNCmRmX2xvbmckU3ViamVjdCA8LSBzdWJqZWN0X2xhYmVsc1tkZl9sb25nJFN1YmplY3RdDQpkZl9sb25nJFNwYXRpYWwgPC0gc3BhdGlhbF9sYWJlbHNbZGZfbG9uZyRTcGF0aWFsXQ0KDQojIEFsbHV2aWFsIHBsb3QNCmg3IDwtIGdncGxvdChkZl9sb25nLA0KICAgICAgICAgICAgYWVzKGF4aXMxID0gU3ViamVjdCwgYXhpczIgPSBTcGF0aWFsKSkgKw0KICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gU3ViamVjdCksIHdpZHRoID0gMS84LCBhbHBoYSA9IDAuODUpICsNCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS84LCBmaWxsID0gImdyZXk5NSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoDQogICAgc3RhdCA9ICJzdHJhdHVtIiwNCiAgICBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSwNCiAgICBzaXplID0gMi44LCAgICAgICAgIyBzbWFsbGVyIHRleHQNCiAgICBoanVzdCA9IDAuNSwgICAgICAgIyBjZW50ZXJlZA0KICAgIGxpbmVoZWlnaHQgPSAwLjkgICAjIHRpZ2h0ZXIgc3BhY2luZw0KICApICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gImdyZXk0MCIpDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkZpZ3VyZSAyLjcgSHlwb3RoZXNpcyAyLjcg4oCUIE5pY2hlIERpZmZlcmVudGlhdGlvbiAoU3ViamVjdCDihpQgU3BhdGlhbCBGbG93cykiLA0KICAgIHN1YnRpdGxlID0gIkZsb3dzIHNob3cgaG93IHN1YmplY3QgZG9tYWlucyBkaXN0cmlidXRlIGFjcm9zcyBzcGF0aWFsIGp1cmlzZGljdGlvbnMiDQogICkNCmg3IDwtIGg3ICsgDQogIGxhYnMoDQogICAgY2FwdGlvbiA9IGNhcHRpb25fdGV4dF8yNw0KICApICsNCiAgdGhlbWUoDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KA0KICAgICAgaGp1c3QgPSAwLCBzaXplID0gOSwgbGluZWhlaWdodCA9IDEuMSwgZmFjZSA9ICJpdGFsaWMiLCBjb2xvciA9ICJncmV5MzAiDQogICAgKQ0KICApDQoNCmdnc2F2ZSgiZmlndXJlXzJfN19oMl83X2FsbHV2aWFsLnBuZyIsIHBsb3QgPSBoNywNCiAgICAgICB3aWR0aCA9IDEyLCBoZWlnaHQgPSA2LCBkcGkgPSAzMDAsIGJnID0gIndoaXRlIikNCnByaW50KGg3KQ0KYGBgDQoqKkltcGxpY2F0aW9ucyoqDQpUaGVzZSBwYXR0ZXJucyBzdXBwb3J0IEh5cG90aGVzaXMgMi43IGJ5IHNob3dpbmcgdGhhdCBuaWNoZSBkaWZmZXJlbnRpYXRpb24gb2NjdXJzIGFsb25nIHN1YmplY3TigJNzcGF0aWFsIGludGVyc2VjdGlvbnMuIFNvbWUgZG9tYWlucyBhcmUgYnJvYWRseSBkaXN0cmlidXRlZCBhY3Jvc3MgYWxsIG1hcml0aW1lIHNwYWNlcywgd2hpbGUgb3RoZXJzIGFyZSBzcGF0aWFsbHkgY29uY2VudHJhdGVkLCBjcmVhdGluZyBjbGVhciBzdWJqZWN0LXNwZWNpZmljIG5pY2hlcy4gVGhpcyBkaWZmZXJlbnRpYXRpb24gcmVmbGVjdHMgaG93IElHT3MgYWxpZ24gdGhlaXIgZnVuY3Rpb25hbCBtYW5kYXRlcyB3aXRoIHRoZSBsZWdhbCBhbmQgZWNvbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgbWFyaXRpbWUgem9uZXMsIHJhdGhlciB0aGFuIGJlaW5nIGV2ZW5seSBzcHJlYWQgYWNyb3NzIGFsbCBzcGFjZXMuIEluIGRvaW5nIHNvLCB0aGUgc3lzdGVtIG9mIElHT3MgZXhoaWJpdHMgYm90aCBjcm9zcy1jdXR0aW5nIG1hbmRhdGVzIGFuZCBzcGVjaWFsaXplZCBqdXJpc2RpY3Rpb25zLCByZWluZm9yY2luZyB0aGUgaWRlYSB0aGF0IGluc3RpdHV0aW9uYWwgbmljaGVzIGFyZSBzdHJ1Y3R1cmVkIGFuZCBkaWZmZXJlbnRpYXRlZCByYXRoZXIgdGhhbiBvdmVybGFwcGluZyByYW5kb21seS4NCg0KYGBge3J9DQojID09PT09PSBDT01NT04gU0VUVVAgPT09PT09DQpsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeSh0aWR5cik7IGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2dlZmZlY3RzKTsgbGlicmFyeShtZ2N2KTsgbGlicmFyeShicm9vbSk7IGxpYnJhcnkoc2NhbGVzKTsgbGlicmFyeShzdHJpbmdyKQ0KDQojIEhlbHBlcjogbmVhdCBjYXB0aW9uIHdyYXBwZXINCmNhcCA8LSBmdW5jdGlvbih4KSBzdHJpbmdyOjpzdHJfd3JhcCh4LCB3aWR0aCA9IDExMCkNCg0KIyAoT3B0aW9uYWwpIGRlcml2ZWQgbWVhc3VyZXMgaWYgeW91IGhhdmVuJ3QgZGVmaW5lZCB0aGVtIHlldA0KZGYgPC0gZGYgJT4lDQogIG11dGF0ZSgNCiAgICAjIEV4YW1wbGUgcGxhY2Vob2xkZXJzIHVzZWQgYmVsb3c7IGFkanVzdCBpZiB5b3UgYWxyZWFkeSBjcmVhdGVkIHRoZXNlDQogICAgc3RyYXRlZ3lfYnJlYWR0aCA9IGlmZWxzZSghaXMubmEoc3RyYXRlZ3lfYnJlYWR0aCksIHN0cmF0ZWd5X2JyZWFkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdW1zKGFjcm9zcyhjKDcwOjc5KSksIG5hLnJtID0gVFJVRSkpLCAgICMgd2l0aGluIHN0cmF0ZWdpZXMgY291bnQNCiAgICBzcGF0aWFsX2JyZWFkdGggID0gaWZlbHNlKCFpcy5uYShzcGF0aWFsX2JyZWFkdGgpLCBzcGF0aWFsX2JyZWFkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTdW1zKGFjcm9zcyhjKDE3OjI2KSksIG5hLnJtID0gVFJVRSkpICAgICAjICMgb2Ygc3BhdGlhbCBqdXJpc2RpY3Rpb25zDQogICkNCg0KYGBgDQojIyMjIDQuOCBIeXBvdGhlc2lzIDIuOCBIMi44IOKAlCBOb24tbGluZWFyaXR5IC8gZGltaW5pc2hpbmcgcmV0dXJuczogVGhlIGVmZmVjdCBvZiBmb3VuZGluZyBkZW5zaXR5IG9uIHNwZWNpYWxpemF0aW9uIGlzIG5vbi1saW5lYXIgKGRpbWluaXNoaW5nIGF0IGhpZ2ggZGVuc2l0eSkNCmBgYHtyfQ0KIyBHQU0gd2l0aCBzbW9vdGggb24gZGVuc2l0eTsgY29udHJvbCBmb3IgZmllbGQgc3RvY2sNCm1faDI4IDwtIG1nY3Y6OmdhbShzbV9ISEkgfiBzKGZvdW5kaW5nX2RlbnNpdHlfNXlyLCBrID0gNCkgKyBzY2FsZShjdW11bGF0aXZlX3N0b2NrKSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShtX2gyOCkNCg0KIyBQcmVkaWN0aW9ucyBmb3IgcGxvdA0KcHJlZF9oMjggPC0gZ2dwcmVkaWN0KG1faDI4LCB0ZXJtcyA9ICJmb3VuZGluZ19kZW5zaXR5XzV5ciBbYWxsXSIpDQoNCnBfaDI4IDwtIGdncGxvdChwcmVkX2gyOCwgYWVzKHggPSB4LCB5ID0gcHJlZGljdGVkKSkgKw0KICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoKSwgYWxwaGEgPSAuMTgpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjIpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZGYsIGFlcyh4ID0gZm91bmRpbmdfZGVuc2l0eV81eXIsIHkgPSBzbV9ISEkpLCBhbHBoYSA9IC4zNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkZpZ3VyZSAyLjggSHlwb3RoZXNpcyAyLjgg4oCUIE5vbi1saW5lYXIgRWZmZWN0IG9mIERlbnNpdHkgb24gU3BlY2lhbGl6YXRpb24iLA0KICAgIHN1YnRpdGxlID0gIkdBTSBzbW9vdGg7IGJhbmQgPSA5NSUgQ0kuIFBvaW50cyBhcmUgSUdPcy4iLA0KICAgIHggPSAiRm91bmRpbmcgRGVuc2l0eSAowrEyIHllYXJzKSIsIHkgPSAiU3BlY2lhbGl6YXRpb24gKEhISSkiLA0KICAgIGNhcHRpb24gPSBjYXAoIlRoZSBzbW9vdGggc2hvd3MgdGhhdCBkZW5zaXR54oCZcyBlZmZlY3Qgb24gc3BlY2lhbGl6YXRpb24gaXMgbm90IHN0cmljdGx5IGxpbmVhcjogdGhlIHNsb3BlIGZsYXR0ZW5zIGFzIGRlbnNpdHkgaW5jcmVhc2VzLCBcDQpzdWdnZXN0aW5nIGRpbWluaXNoaW5nIHJldHVybnMgb25jZSBpbnN0aXR1dGlvbmFsIGZpZWxkcyBiZWNvbWUgdmVyeSBjcm93ZGVkLiIpDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKQ0KZ2dzYXZlKCJmaWd1cmVfMl84X2gyXzhfZ2FtX2RlbnNpdHlfc3BlY2lhbGl6YXRpb24ucG5nIiwgcF9oMjgsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNS42LCBkcGkgPSAzMDApDQoNCnByaW50KHBfaDI4KQ0KYGBgDQojIyMjIDQuOSBIeXBvdGhlc2lzIDIuOSBIMi45IOKAlCBNZWRpYXRpb246IFN0cmF0ZWd5IGJyZWFkdGggcGFydGlhbGx5IG1lZGlhdGVzIHRoZSBlZmZlY3Qgb2YgZGVuc2l0eSBvbiBzcGVjaWFsaXphdGlvbg0KYGBge3J9DQpsaWJyYXJ5KGxhdmFhbikNCg0KIyBTdGFuZGFyZGl6ZSB0byBhaWQgaW50ZXJwcmV0YXRpb24NCmRmX3N0ZCA8LSBkZiAlPiUNCiAgbXV0YXRlKGFjcm9zcyhjKGZvdW5kaW5nX2RlbnNpdHlfNXlyLCBjdW11bGF0aXZlX3N0b2NrLCBzdHJhdGVneV9icmVhZHRoLCBzbV9ISEkpLCBzY2FsZSkpDQoNCm1vZGVsX2gyOSA8LSAnDQogICMgZGlyZWN0IHBhdGhzDQogIHN0cmF0ZWd5X2JyZWFkdGggfiBhKmZvdW5kaW5nX2RlbnNpdHlfNXlyICsgYzEqY3VtdWxhdGl2ZV9zdG9jaw0KICBzbV9ISEkgICAgICAgICAgIH4gYipzdHJhdGVneV9icmVhZHRoICsgY19wcmltZSpmb3VuZGluZ19kZW5zaXR5XzV5ciArIGMyKmN1bXVsYXRpdmVfc3RvY2sNCg0KICAjIGluZGlyZWN0IGFuZCB0b3RhbCBlZmZlY3RzDQogIGluZCA6PSBhKmINCiAgdG90YWwgOj0gY19wcmltZSArIChhKmIpDQonDQoNCmZpdF9oMjkgPC0gc2VtKG1vZGVsX2gyOSwgZGF0YSA9IGRmX3N0ZCwgc2UgPSAiYm9vdHN0cmFwIiwgYm9vdHN0cmFwID0gMTAwMCkNCnN1bW1hcnkoZml0X2gyOSwgc3RhbmRhcmRpemVkID0gVFJVRSwgZml0Lm1lYXN1cmVzID0gVFJVRSwgcnNxdWFyZSA9IFRSVUUpDQoNCiMgUXVpY2sgY29lZmZpY2llbnQgKGRvdC13aGlza2VyKSBwbG90IGZvciBtZWRpYXRpb24gcGF0aHMNCmNvZWZfZGYgPC0gYnJvb206OnRpZHkoZml0X2gyOSwgY29uZi5pbnQgPSBUUlVFKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJhfGJ8Y19wcmltZXxpbmR8dG90YWwiLCB0ZXJtKSkNCg0KcF9oMjkgPC0gZ2dwbG90KGNvZWZfZGYsIGFlcyh4ID0gZXN0aW1hdGUsIHkgPSB0ZXJtKSkgKw0KICBnZW9tX3BvaW50KCkgKyBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGNvbmYubG93LCB4bWF4ID0gY29uZi5oaWdoKSwgaGVpZ2h0ID0gLjE1KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJGaWd1cmUgMi45IEh5cG90aGVzaXMgMi45IOKAlCBNZWRpYXRpb24gYnkgU3RyYXRlZ3kgQnJlYWR0aCIsDQogICAgeCA9ICJFc3RpbWF0ZSAoYm9vdHN0cmFwIDk1JSBDSSkiLCB5ID0gIiIsDQogICAgY2FwdGlvbiA9IGNhcCgiUGF0aCBhOiBkZW5zaXR5IOKGkiBzdHJhdGVneSBicmVhZHRoOyBQYXRoIGI6IHN0cmF0ZWd5IGJyZWFkdGgg4oaSIHNwZWNpYWxpemF0aW9uOyBjJyBpcyB0aGUgZGlyZWN0IGVmZmVjdCBvZiBkZW5zaXR5IG9uIHNwZWNpYWxpemF0aW9uIFwNCmNvbnRyb2xsaW5nIGZvciBicmVhZHRoLiBBIHNpZ25pZmljYW50IGluZGlyZWN0IGVmZmVjdCAoaW5kKSBzdXBwb3J0cyBtZWRpYXRpb24uIikNCiAgKSArIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQpnZ3NhdmUoImZpZ3VyZV8yXzlfaDJfOV9tZWRpYXRpb24ucG5nIiwgcF9oMjksIHdpZHRoID0gOC42LCBoZWlnaHQgPSA1LjIsIGRwaSA9IDMwMCkNCnByaW50KHBfaDI5KQ0KYGBgDQpfKipGaWd1cmUgMi45KiogdGVzdHMgd2hldGhlciB0aGUgZWZmZWN0IG9mIGZvdW5kaW5nIGRlbnNpdHkgb24gc3ViamVjdC1tYXR0ZXIgc3BlY2lhbGl6YXRpb24gKEhISSkgb3BlcmF0ZXMgaW5kaXJlY3RseSB0aHJvdWdoIHN0cmF0ZWd5IGJyZWFkdGguIFRoZSBkb3Qtd2hpc2tlciBwbG90IHNob3dzIHN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMgd2l0aCBib290c3RyYXAgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUga2V5IHBhdGh3YXkgb2YgaW50ZXJlc3QgaXMgdGhlIGluZGlyZWN0IGVmZmVjdCAoaW5kIDo9IGEqYikuIEEgc2lnbmlmaWNhbnQgaW5kaXJlY3QgZWZmZWN0IHN1Z2dlc3RzIG1lZGlhdGlvbiwgbWVhbmluZyB0aGF0IElHT3MgaW4gZGVuc2VyIGZvdW5kaW5nIGVudmlyb25tZW50cyBhZGp1c3QgdGhlaXIgc3RyYXRlZ3kgcG9ydGZvbGlvcywgYW5kIHRoaXMgYnJvYWRlciBvciBuYXJyb3dlciBwb3J0Zm9saW8gaW4gdHVybiBzaGFwZXMgaG93IHNwZWNpYWxpemVkIHRoZXkgYmVjb21lLl8NCg0KKipJbnRlcnByZXRhdGlvbjoqKg0KDQoqIFRoZSBkaXJlY3QgcGF0aCBmcm9tIGZvdW5kaW5nIGRlbnNpdHkgdG8gc3BlY2lhbGl6YXRpb24gaXMgcmVsYXRpdmVseSB3ZWFrIG9uY2Ugc3RyYXRlZ3kgYnJlYWR0aCBpcyBpbmNsdWRlZC4NCg0KKiBUaGUgaW5kaXJlY3QgcGF0aCAoYSpiKSBpcyB0aGUgbWVjaGFuaXNtIG9mIGludGVyZXN0OiBpdCBzaG93cyB3aGV0aGVyIGRlbnNpdHkg4oaSIHN0cmF0ZWd5IGJyZWFkdGgg4oaSIHNwZWNpYWxpemF0aW9uIGlzIGEgdmFsaWQgY2hhaW4uDQoNCiogSWYgdGhlIGluZGlyZWN0IGVmZmVjdCBjb25maWRlbmNlIGludGVydmFsIGV4Y2x1ZGVzIHplcm8sIHRoZW4gbWVkaWF0aW9uIGhvbGRzLCBtZWFuaW5nIGRlbnNpdHnigJlzIGluZmx1ZW5jZSBvbiBzcGVjaWFsaXphdGlvbiBpcyBwYXJ0bHkgZXhwbGFpbmVkIGJ5IHN0cmF0ZWd5IGNob2ljZXMuDQoNCiogU3Vic3RhbnRpdmVseSwgdGhpcyBzdWdnZXN0cyB0aGF0IElHT3MgaW4gY3Jvd2RlZCBpbnN0aXR1dGlvbmFsIGZpZWxkcyBkbyBub3Qgc2ltcGx5IHNwZWNpYWxpemUgZGlyZWN0bHk7IHRoZXkgYWRhcHQgYnkgYWRqdXN0aW5nIHRoZWlyIHN0cmF0ZWd5IG1peCwgd2hpY2ggdGhlbiBpbmZsdWVuY2VzIHRoZWlyIGRlZ3JlZSBvZiBzcGVjaWFsaXphdGlvbi4NCg0KIyMjIyA0LjEwIEh5cG90aGVzaXMgMi4xMCBJbnRlci1pbnN0aXR1dGlvbmFsIGVtYmVkZGVkbmVzcyByaXNlcyB3aXRoIGRlbnNpdHkNCmBgYHtyfQ0KIyBCdWlsZCBhbiBJbnRlci1pbnN0aXR1dGlvbmFsIEVtYmVkZGVkbmVzcyBJbmRleCAoSUVJKQ0KaWVpX2NvbHMgPC0gYygxMTI6MTMxKQ0KZGYgPC0gZGYgJT4lDQogIG11dGF0ZShJRUkgPSByb3dNZWFucyhhY3Jvc3MoYWxsX29mKGllaV9jb2xzKSksIG5hLnJtID0gVFJVRSkpDQoNCiMgTW9kZWw6IElFSSB+IGRlbnNpdHkgKyBjb250cm9scw0KbV9oMjEwIDwtIGxtKElFSSB+IHNjYWxlKGZvdW5kaW5nX2RlbnNpdHlfNXlyKSArIHNjYWxlKGN1bXVsYXRpdmVfc3RvY2spLCBkYXRhID0gZGYpDQpzdW1tYXJ5KG1faDIxMCkNCg0KIyBQbG90IG1hcmdpbmFsIGVmZmVjdCB3aXRoIGEgZmV3IGxhYmVscyBmb3IgY29udGV4dA0KcHJlZF9oMjEwIDwtIGdncHJlZGljdChtX2gyMTAsIHRlcm1zID0gImZvdW5kaW5nX2RlbnNpdHlfNXlyIFthbGxdIikNCg0KbGFiZWxfaWdvcyA8LSBkZiAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gSUVJLCBuID0gNCkgJT4lDQogIGJpbmRfcm93cyhzbGljZV9taW4oZGYsIG9yZGVyX2J5ID0gSUVJLCBuID0gMykpDQoNCnBfaDIxMCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGRmLCBhZXMoZm91bmRpbmdfZGVuc2l0eV81eXIsIElFSSksIGFscGhhID0gLjQ1KSArDQogIGdlb21fbGluZShkYXRhID0gcHJlZF9oMjEwLCBhZXMoeCA9IHgsIHkgPSBwcmVkaWN0ZWQpLCBzaXplID0gMS4xKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBwcmVkX2gyMTAsIGFlcyh4ID0geCwgeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoKSwgYWxwaGEgPSAuMTgpICsNCiAgZ2dyZXBlbDo6Z2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBsYWJlbF9pZ29zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKGZvdW5kaW5nX2RlbnNpdHlfNXlyLCBJRUksIGxhYmVsID0gaW5zdGl0dXRpb24pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsIHNlZWQgPSA0KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRmlndXJlIDIuMTAgSHlwb3RoZXNpcyAyLjEwIOKAlCBEZW5zaXR5IGFuZCBJbnRlci1pbnN0aXR1dGlvbmFsIEVtYmVkZGVkbmVzcyIsDQogICAgc3VidGl0bGUgPSAiSW50ZXItaW5zdGl0dXRpb25hbCBFbWJlZGRlZG5lc3MgSW5kZXggKElFSSkgZnJvbSBpbnRlcmFjdGlvbiBpdGVtcyIsDQogICAgeCA9ICJGb3VuZGluZyBEZW5zaXR5ICjCsTIgeWVhcnMpIiwgeSA9ICJFbWJlZGRlZG5lc3MgKElFSSwgbWVhbiBvZiBpbnRlcmFjdGlvbnMpIiwNCiAgICBjYXB0aW9uID0gY2FwKCJBIHBvc2l0aXZlIHNsb3BlIGluZGljYXRlcyBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGZpZWxkcyBtYWludGFpbiBicm9hZGVyIGludGVyLWluc3RpdHV0aW9uYWwgdGllcyAoVU4gc3lzdGVtIGNvbGxhYm9yYXRpb24sIFwNCnRyZWF0eSBib2R5IGNvb3JkaW5hdGlvbiwgc2NpZW50aWZpYyBsaW5rYWdlcywgZXRjLiksIGNvbnNpc3RlbnQgd2l0aCBjb29yZGluYXRpb24gcHJlc3N1cmVzIGluIGNyb3dkZWQgc3BhY2VzLiIpDQogICkgKyB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKQ0KZ2dzYXZlKCJmaWd1cmVfMl8xMF9oMl8xMF9kZW5zaXR5X0lFSS5wbmciLCBwX2gyMTAsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNS40LCBkcGkgPSAzMDApDQpwcmludChwX2gyMTApDQpgYGANCl8qKkZpZ3VyZSAyLjEwKiogZXhhbWluZXMgd2hldGhlciBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGluc3RpdHV0aW9uYWwgZW52aXJvbm1lbnRzIGV4aGliaXQgYnJvYWRlciBpbnRlci1pbnN0aXR1dGlvbmFsIGVtYmVkZGVkbmVzcy4gVGhlIHktYXhpcyByZXByZXNlbnRzIHRoZSBJbnRlci1pbnN0aXR1dGlvbmFsIEVtYmVkZGVkbmVzcyBJbmRleCAoSUVJKSwgY29uc3RydWN0ZWQgZnJvbSBjb3VudHMgb2YgaW50ZXItSUdPIGNvbGxhYm9yYXRpb25zLCB0cmVhdHkgYm9keSBsaW5rYWdlcywgVU4gc3lzdGVtIHBhcnRuZXJzaGlwcywgYW5kIG90aGVyIGludGVyYWN0aW9ucy4gVGhlIHJlZ3Jlc3Npb24gbGluZSB3aXRoIDk1JSBjb25maWRlbmNlIGJhbmQgaW5kaWNhdGVzIHRoZSBwYXJ0aWFsIGVmZmVjdCBvZiBmb3VuZGluZyBkZW5zaXR5LiBTZWxlY3RlZCBJR09zIChlLmcuLCBJVEMsIFVOIERPQUxPUywgT0hDSFIpIGFyZSBsYWJlbGVkIGZvciBjb250ZXh0Ll8NCg0KKipJbnRlcnByZXRhdGlvbjoqKg0KDQoqIFRoZSBwb3NpdGl2ZSBzbG9wZSBpbmRpY2F0ZXMgdGhhdCBJR09zIGZvdW5kZWQgaW4gZGVuc2VyIGVudmlyb25tZW50cyB0ZW5kIHRvIGhhdmUgbW9yZSBpbnRlci1pbnN0aXR1dGlvbmFsIGxpbmthZ2VzLg0KDQoqIEV4YW1wbGVzIGxpa2UgVU4gRE9BTE9TLCBJVEMsIE9IQ0hSIGFyZSBoaWdobHkgZW1iZWRkZWQsIGNvbnNpc3RlbnQgd2l0aCBvcGVyYXRpbmcgaW4gY29tcGxleCBnb3Zlcm5hbmNlIGxhbmRzY2FwZXMgd2hlcmUgY29sbGFib3JhdGlvbiBpcyBuZWNlc3NhcnkuDQoNCiogQnkgY29udHJhc3QsIG1vcmUgbmFycm93bHkgZW1iZWRkZWQgSUdPcyAoZS5nLiwgTWluYW1hdGEgQ29udmVudGlvbiwgVU5FUCkgb3BlcmF0ZSB3aXRoIGZld2VyIHRpZXMsIHJlZmxlY3RpbmcgZWl0aGVyIGZ1bmN0aW9uYWwgYXV0b25vbXkgb3IgbmljaGUgbWFuZGF0ZXMuDQoNCiogU3Vic3RhbnRpdmVseSwgdGhpcyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0IGNyb3dkZWQgaW5zdGl0dXRpb25hbCBmaWVsZHMgcHVzaCBuZXcgSUdPcyB0b3dhcmQgZ3JlYXRlciBjb29yZGluYXRpb24gYW5kIGVtYmVkZGVkbmVzcyB0byBhdm9pZCByZWR1bmRhbmN5IGFuZCBpbmNyZWFzZSBsZWdpdGltYWN5Lg0K