Leah Kelly
Introduction
This project examines recognition accuracy across repeated learning
cycles in two groups: Healthy Controls (HC) and People with Aphasia
(PWA). Learning and recognition performance are important topics in
psycholinguistics because they show how language processing changes over
time and how neurological differences shape learning outcomes. By
comparing performance across cycles and groups, this analysis highlights
both group level patterns and individual variability.
Using quantitative methods introduced in LNGN 320/APLN 536, this
project relies on data visualization to explore trends, variation, and
group differences. Rather than focusing on raw data alone, the analysis
uses summary measures and multiple visualization types to make patterns
in learning and accuracy easier to interpret.
Dataset Description
Data on recognition accuracy is gathered over several learning cycles
to make up the dataset. The researchers who conducted this study took
two groups of people, Healthy Control and Person with Aphasia, and
presented them with a set of made-up words.
The analysis represents novel word learning and measured by
recognition accuracy across the repeated learning cycles between the two
groups (HC and PWA). Recognition based measures is more useful to
measure in people with aphasia since their speech production is
typically limited or hindered. This way, the researchers can examine
lexical learning while not focusing too much on phonological
production.
Group and cycle variables were converted to factors, and missing or
invalid recognition values were excluded from visualizations where
necessary. No transformations were applied beyond these basic cleaning
steps, allowing the patterns observed in the figures to closely reflect
the original data structure.
Research Questions
This analysis addresses the following research questions:
How does recognition accuracy change across learning
cycles?
Do Healthy Controls and People with Aphasia differ in overall
recognition accuracy?
How much variability exists within each group across
cycles?
These questions are designed to be answered visually and
quantitatively using summary statistics and comparative plots.
library(tidyverse)
# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")
# Clean data
data_clean <- data %>%
mutate(
group = factor(group, levels = c("HC", "PWA")),
cycle = factor(cycle)
)
# Summary stats
rec_summary <- data_clean %>%
group_by(group, cycle) %>%
summarise(
n = sum(!is.na(recognition)),
mean_recognition = mean(recognition, na.rm = TRUE),
sd_recognition = sd(recognition, na.rm = TRUE),
se_recognition = sd_recognition / sqrt(n),
.groups = "drop"
)
# Plot
ggplot(rec_summary, aes(x = cycle, y = mean_recognition, group = group,
linetype = group, shape = group)) +
geom_line() +
geom_point(size = 3) +
geom_errorbar(
aes(ymin = mean_recognition - se_recognition,
ymax = mean_recognition + se_recognition),
width = 0.1
) +
scale_y_continuous(
labels = scales::percent_format(accuracy = 1),
limits = c(0, 1)
) +
labs(
title = "Recognition Accuracy Across Learning Cycles",
subtitle = "Comparing Healthy Controls (HC) and People with Aphasia (PWA)",
x = "Cycle",
y = "Mean recognition accuracy",
linetype = "Group",
shape = "Group"
) +
theme_minimal(base_size = 13)

2.1 Visualization Type 1: Mean Accuracy Across Learning
Cycles
The first visualization demonstrates mean recognition accuracy across
learning cycles for both groups, along with measures of variability.
This type of plot is well suited for identifying overall trends and
comparing group performance over time.
Figure 1 shows that recognition accuracy increases across cycles for
both groups, showing increased learning over time. Healthy Controls
consistently demonstrate higher mean accuracy than People with Aphasia
at each cycle. However, the upward trend for both groups suggests that
repeated exposure supports improvement regardless of group. Error bars
are there for variability around the mean and show that while the groups
differ, their performance ranges partially overlap.
library(tidyverse)
# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")
# Clean + optional filter to avoid missing/out-of-range warnings
data_clean <- data %>%
mutate(
group = factor(group, levels = c("HC", "PWA")),
cycle = factor(cycle)
) %>%
filter(!is.na(recognition), recognition >= 0, recognition <= 1)
# Summary stats (mean ± SE)
rec_summary <- data_clean %>%
group_by(group, cycle) %>%
summarise(
n = n(),
mean_recognition = mean(recognition),
sd_recognition = sd(recognition),
se_recognition = sd_recognition / sqrt(n),
.groups = "drop"
) %>%
mutate(
ymin = pmax(0, mean_recognition - se_recognition),
ymax = pmin(1, mean_recognition + se_recognition)
)
# Plot
ggplot(rec_summary, aes(x = cycle, y = mean_recognition, group = group)) +
geom_ribbon(
aes(ymin = ymin, ymax = ymax, fill = group),
alpha = 0.18,
color = NA
) +
geom_jitter(
data = data_clean,
aes(x = cycle, y = recognition, color = group),
width = 0.12,
alpha = 0.35,
size = 2,
inherit.aes = FALSE
) +
geom_line(aes(color = group), linewidth = 1.2) +
geom_point(aes(color = group), size = 3) +
scale_y_continuous(
labels = scales::percent_format(accuracy = 1),
limits = c(0, 1)
) +
scale_color_brewer(palette = "Set2") +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Recognition Accuracy Across Learning Cycles (Raw + Mean)",
subtitle = "Dots = individual scores. Line = group mean. Band = mean ± 1 SE.",
x = "Cycle",
y = "Recognition accuracy",
color = "Group",
fill = "Group"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
legend.position = "top"
)

2.2 Visualization Type 2: Distribution of Accuracy
Scores
To complement the mean-based analysis, the second visualization
focuses on the distribution of recognition accuracy scores using violin
and boxplot elements. This visualization highlights the spread, and
shape of the data within each cycle and group.
Figure 2 reveals substantial variability within both groups, mainly
in earlier cycles. The distribution for People with Aphasia is wider,
suggesting greater individual differences in performance. Healthy
Controls show more clustered scores, especially in later cycles,
suggesting more consistent recognition accuracy. This visualization
demonstrates why relying solely on means can be misleading, recognizing
individual scores in the data is important to the bigger picture.
library(tidyverse)
# Load data
data <- read_csv("/Users/leahkelly/Downloads/DataR (2).csv")
# Clean data
data_clean <- data %>%
mutate(
group = factor(group, levels = c("HC", "PWA")),
cycle = factor(cycle)
)
# Create Correct vs Not Correct (assumes recognition is 0/1)
data_binary <- data_clean %>%
filter(!is.na(recognition)) %>%
mutate(outcome = if_else(recognition == 1, "Correct", "Not Correct"))
# Proportions per group/cycle
prop_data <- data_binary %>%
count(group, cycle, outcome) %>%
group_by(group, cycle) %>%
mutate(prop = n / sum(n)) %>%
ungroup()
# Plot
ggplot(prop_data, aes(x = cycle, y = prop, fill = outcome)) +
geom_col(width = 0.75) +
facet_wrap(~ group) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Correct vs Not Correct Responses Across Learning Cycles",
subtitle = "Each bar totals 100% within each group and cycle",
x = "Cycle",
y = "Percentage of responses",
fill = ""
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
legend.position = "top"
)

2.3 Visualization Type 3: Correct vs. Not Correct
Responses
The third visualization displays the proportion of correct versus not
correct responses across learning cycles using a stacked bar chart. This
format emphasizes relative proportions and makes group comparisons
intuitive.
Figure 3 shows an increasing proportion of correct responses across
cycles for both groups. Healthy Controls reach a higher proportion of
correct responses earlier, while People with Aphasia show more gradual
improvement. Because each bar sums to 100%, this visualization makes it
easy to compare accuracy patterns across cycles without being influenced
by differences in raw counts.
Conclusion and Discussion
Across all visualizations, a consistent pattern emerges: recognition
accuracy improves across learning cycles for both groups, but Healthy
Controls outperform People with Aphasia at each stage. The combination
of visualizations reveals complementary insights. Mean based plots
highlight overall trends, distributional plots expose individual
variability, and proportional charts clarify group differences in
correctness.
This data bolsters the fact that with repeated exposure to a word, it
becomes easier for the brain to retain in healthy individuals, but also
in people who have neurological conditions as well.
These visualizations are particularly useful because they make
abstract numerical patterns visible and easy to digest and interpret.
Overall, this project demonstrates how quantitative visualization
techniques can be used to explore learning and recognition patterns in
linguistic data in a clear and meaningful way.
These visualizations support the study’s conclusion that recognition
based measurement provide a more informative assessment of novel word
learning in individuals with aphasia. Although we are not provided more
information on lesion location or type of aphasia, the overall data
reflects a meaningful pattern in learning performance.
LS0tCnRpdGxlOiAiUmVjb2duaXRpb24gQWNjdXJhY3kgSGVhbHRoeSBJbmRpdmlkdWFscyB2cy4gUGVvcGxlIFdpdGggQXBoYXNpYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKTGVhaCBLZWxseQoKIyMgWyoqSW50cm9kdWN0aW9uKipdey51bmRlcmxpbmV9CgpUaGlzIHByb2plY3QgZXhhbWluZXMgcmVjb2duaXRpb24gYWNjdXJhY3kgYWNyb3NzIHJlcGVhdGVkIGxlYXJuaW5nIGN5Y2xlcyBpbiB0d28gZ3JvdXBzOiBIZWFsdGh5IENvbnRyb2xzIChIQykgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgKFBXQSkuIExlYXJuaW5nIGFuZCByZWNvZ25pdGlvbiBwZXJmb3JtYW5jZSBhcmUgaW1wb3J0YW50IHRvcGljcyBpbiBwc3ljaG9saW5ndWlzdGljcyBiZWNhdXNlIHRoZXkgc2hvdyBob3cgbGFuZ3VhZ2UgcHJvY2Vzc2luZyBjaGFuZ2VzIG92ZXIgdGltZSBhbmQgaG93IG5ldXJvbG9naWNhbCBkaWZmZXJlbmNlcyBzaGFwZSBsZWFybmluZyBvdXRjb21lcy4gQnkgY29tcGFyaW5nIHBlcmZvcm1hbmNlIGFjcm9zcyBjeWNsZXMgYW5kIGdyb3VwcywgdGhpcyBhbmFseXNpcyBoaWdobGlnaHRzIGJvdGggZ3JvdXAgbGV2ZWwgcGF0dGVybnMgYW5kIGluZGl2aWR1YWwgdmFyaWFiaWxpdHkuCgpVc2luZyBxdWFudGl0YXRpdmUgbWV0aG9kcyBpbnRyb2R1Y2VkIGluIExOR04gMzIwL0FQTE4gNTM2LCB0aGlzIHByb2plY3QgcmVsaWVzIG9uIGRhdGEgdmlzdWFsaXphdGlvbiB0byBleHBsb3JlIHRyZW5kcywgdmFyaWF0aW9uLCBhbmQgZ3JvdXAgZGlmZmVyZW5jZXMuIFJhdGhlciB0aGFuIGZvY3VzaW5nIG9uIHJhdyBkYXRhIGFsb25lLCB0aGUgYW5hbHlzaXMgdXNlcyBzdW1tYXJ5IG1lYXN1cmVzIGFuZCBtdWx0aXBsZSB2aXN1YWxpemF0aW9uIHR5cGVzIHRvIG1ha2UgcGF0dGVybnMgaW4gbGVhcm5pbmcgYW5kIGFjY3VyYWN5IGVhc2llciB0byBpbnRlcnByZXQuCgojIyBbKipEYXRhc2V0IERlc2NyaXB0aW9uKipdey51bmRlcmxpbmV9CgpEYXRhIG9uIHJlY29nbml0aW9uIGFjY3VyYWN5IGlzIGdhdGhlcmVkIG92ZXIgc2V2ZXJhbCBsZWFybmluZyBjeWNsZXMgdG8gbWFrZSB1cCB0aGUgZGF0YXNldC4gVGhlIHJlc2VhcmNoZXJzIHdobyBjb25kdWN0ZWQgdGhpcyBzdHVkeSB0b29rIHR3byBncm91cHMgb2YgcGVvcGxlLCBIZWFsdGh5IENvbnRyb2wgYW5kIFBlcnNvbiB3aXRoIEFwaGFzaWEsIGFuZCBwcmVzZW50ZWQgdGhlbSB3aXRoIGEgc2V0IG9mIG1hZGUtdXAgd29yZHMuCgpUaGUgYW5hbHlzaXMgcmVwcmVzZW50cyBub3ZlbCB3b3JkIGxlYXJuaW5nIGFuZCBtZWFzdXJlZCBieSByZWNvZ25pdGlvbiBhY2N1cmFjeSBhY3Jvc3MgdGhlIHJlcGVhdGVkIGxlYXJuaW5nIGN5Y2xlcyBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzIChIQyBhbmQgUFdBKS4gUmVjb2duaXRpb24gYmFzZWQgbWVhc3VyZXMgaXMgbW9yZSB1c2VmdWwgdG8gbWVhc3VyZSBpbiBwZW9wbGUgd2l0aCBhcGhhc2lhIHNpbmNlIHRoZWlyIHNwZWVjaCBwcm9kdWN0aW9uIGlzIHR5cGljYWxseSBsaW1pdGVkIG9yIGhpbmRlcmVkLiBUaGlzIHdheSwgdGhlIHJlc2VhcmNoZXJzIGNhbiBleGFtaW5lIGxleGljYWwgbGVhcm5pbmcgd2hpbGUgbm90IGZvY3VzaW5nIHRvbyBtdWNoIG9uIHBob25vbG9naWNhbCBwcm9kdWN0aW9uLgoKR3JvdXAgYW5kIGN5Y2xlIHZhcmlhYmxlcyB3ZXJlIGNvbnZlcnRlZCB0byBmYWN0b3JzLCBhbmQgbWlzc2luZyBvciBpbnZhbGlkIHJlY29nbml0aW9uIHZhbHVlcyB3ZXJlIGV4Y2x1ZGVkIGZyb20gdmlzdWFsaXphdGlvbnMgd2hlcmUgbmVjZXNzYXJ5LiBObyB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBhcHBsaWVkIGJleW9uZCB0aGVzZSBiYXNpYyBjbGVhbmluZyBzdGVwcywgYWxsb3dpbmcgdGhlIHBhdHRlcm5zIG9ic2VydmVkIGluIHRoZSBmaWd1cmVzIHRvIGNsb3NlbHkgcmVmbGVjdCB0aGUgb3JpZ2luYWwgZGF0YSBzdHJ1Y3R1cmUuCgojIyBbKipSZXNlYXJjaCBRdWVzdGlvbnMqKl17LnVuZGVybGluZX0KClRoaXMgYW5hbHlzaXMgYWRkcmVzc2VzIHRoZSBmb2xsb3dpbmcgcmVzZWFyY2ggcXVlc3Rpb25zOgoKMS4gIEhvdyBkb2VzIHJlY29nbml0aW9uIGFjY3VyYWN5IGNoYW5nZSBhY3Jvc3MgbGVhcm5pbmcgY3ljbGVzPwoKMi4gIERvIEhlYWx0aHkgQ29udHJvbHMgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgZGlmZmVyIGluIG92ZXJhbGwgcmVjb2duaXRpb24gYWNjdXJhY3k/CgozLiAgSG93IG11Y2ggdmFyaWFiaWxpdHkgZXhpc3RzIHdpdGhpbiBlYWNoIGdyb3VwIGFjcm9zcyBjeWNsZXM/CgpUaGVzZSBxdWVzdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGJlIGFuc3dlcmVkIHZpc3VhbGx5IGFuZCBxdWFudGl0YXRpdmVseSB1c2luZyBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGNvbXBhcmF0aXZlIHBsb3RzLgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQoKIyBMb2FkIGRhdGEKZGF0YSA8LSByZWFkX2NzdigiL1VzZXJzL2xlYWhrZWxseS9Eb3dubG9hZHMvRGF0YVIgKDIpLmNzdiIpCgojIENsZWFuIGRhdGEKZGF0YV9jbGVhbiA8LSBkYXRhICU+JQogIG11dGF0ZSgKICAgIGdyb3VwID0gZmFjdG9yKGdyb3VwLCBsZXZlbHMgPSBjKCJIQyIsICJQV0EiKSksCiAgICBjeWNsZSA9IGZhY3RvcihjeWNsZSkKICApCgojIFN1bW1hcnkgc3RhdHMKcmVjX3N1bW1hcnkgPC0gZGF0YV9jbGVhbiAlPiUKICBncm91cF9ieShncm91cCwgY3ljbGUpICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBzdW0oIWlzLm5hKHJlY29nbml0aW9uKSksCiAgICBtZWFuX3JlY29nbml0aW9uID0gbWVhbihyZWNvZ25pdGlvbiwgbmEucm0gPSBUUlVFKSwKICAgIHNkX3JlY29nbml0aW9uID0gc2QocmVjb2duaXRpb24sIG5hLnJtID0gVFJVRSksCiAgICBzZV9yZWNvZ25pdGlvbiA9IHNkX3JlY29nbml0aW9uIC8gc3FydChuKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgojIFBsb3QKZ2dwbG90KHJlY19zdW1tYXJ5LCBhZXMoeCA9IGN5Y2xlLCB5ID0gbWVhbl9yZWNvZ25pdGlvbiwgZ3JvdXAgPSBncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBncm91cCwgc2hhcGUgPSBncm91cCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IG1lYW5fcmVjb2duaXRpb24gLSBzZV9yZWNvZ25pdGlvbiwKICAgICAgICB5bWF4ID0gbWVhbl9yZWNvZ25pdGlvbiArIHNlX3JlY29nbml0aW9uKSwKICAgIHdpZHRoID0gMC4xCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgbGltaXRzID0gYygwLCAxKQogICkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZWNvZ25pdGlvbiBBY2N1cmFjeSBBY3Jvc3MgTGVhcm5pbmcgQ3ljbGVzIiwKICAgIHN1YnRpdGxlID0gIkNvbXBhcmluZyBIZWFsdGh5IENvbnRyb2xzIChIQykgYW5kIFBlb3BsZSB3aXRoIEFwaGFzaWEgKFBXQSkiLAogICAgeCA9ICJDeWNsZSIsCiAgICB5ID0gIk1lYW4gcmVjb2duaXRpb24gYWNjdXJhY3kiLAogICAgbGluZXR5cGUgPSAiR3JvdXAiLAogICAgc2hhcGUgPSAiR3JvdXAiCiAgKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykKCmBgYAoKIyMgWyoqMi4xIFZpc3VhbGl6YXRpb24gVHlwZSAxOiBNZWFuIEFjY3VyYWN5IEFjcm9zcyBMZWFybmluZyBDeWNsZXMqKl17LnVuZGVybGluZX0KClRoZSBmaXJzdCB2aXN1YWxpemF0aW9uIGRlbW9uc3RyYXRlcyBtZWFuIHJlY29nbml0aW9uIGFjY3VyYWN5IGFjcm9zcyBsZWFybmluZyBjeWNsZXMgZm9yIGJvdGggZ3JvdXBzLCBhbG9uZyB3aXRoIG1lYXN1cmVzIG9mIHZhcmlhYmlsaXR5LiBUaGlzIHR5cGUgb2YgcGxvdCBpcyB3ZWxsIHN1aXRlZCBmb3IgaWRlbnRpZnlpbmcgb3ZlcmFsbCB0cmVuZHMgYW5kIGNvbXBhcmluZyBncm91cCBwZXJmb3JtYW5jZSBvdmVyIHRpbWUuCgpGaWd1cmUgMSBzaG93cyB0aGF0IHJlY29nbml0aW9uIGFjY3VyYWN5IGluY3JlYXNlcyBhY3Jvc3MgY3ljbGVzIGZvciBib3RoIGdyb3Vwcywgc2hvd2luZyBpbmNyZWFzZWQgbGVhcm5pbmcgb3ZlciB0aW1lLiBIZWFsdGh5IENvbnRyb2xzIGNvbnNpc3RlbnRseSBkZW1vbnN0cmF0ZSBoaWdoZXIgbWVhbiBhY2N1cmFjeSB0aGFuIFBlb3BsZSB3aXRoIEFwaGFzaWEgYXQgZWFjaCBjeWNsZS4gSG93ZXZlciwgdGhlIHVwd2FyZCB0cmVuZCBmb3IgYm90aCBncm91cHMgc3VnZ2VzdHMgdGhhdCByZXBlYXRlZCBleHBvc3VyZSBzdXBwb3J0cyBpbXByb3ZlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwLiBFcnJvciBiYXJzIGFyZSB0aGVyZSBmb3IgdmFyaWFiaWxpdHkgYXJvdW5kIHRoZSBtZWFuIGFuZCBzaG93IHRoYXQgd2hpbGUgdGhlIGdyb3VwcyBkaWZmZXIsIHRoZWlyIHBlcmZvcm1hbmNlIHJhbmdlcyBwYXJ0aWFsbHkgb3ZlcmxhcC4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiMgTG9hZCBkYXRhCmRhdGEgPC0gcmVhZF9jc3YoIi9Vc2Vycy9sZWFoa2VsbHkvRG93bmxvYWRzL0RhdGFSICgyKS5jc3YiKQoKIyBDbGVhbiArIG9wdGlvbmFsIGZpbHRlciB0byBhdm9pZCBtaXNzaW5nL291dC1vZi1yYW5nZSB3YXJuaW5ncwpkYXRhX2NsZWFuIDwtIGRhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIkhDIiwgIlBXQSIpKSwKICAgIGN5Y2xlID0gZmFjdG9yKGN5Y2xlKQogICkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWNvZ25pdGlvbiksIHJlY29nbml0aW9uID49IDAsIHJlY29nbml0aW9uIDw9IDEpCgojIFN1bW1hcnkgc3RhdHMgKG1lYW4gwrEgU0UpCnJlY19zdW1tYXJ5IDwtIGRhdGFfY2xlYW4gJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIGN5Y2xlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgbWVhbl9yZWNvZ25pdGlvbiA9IG1lYW4ocmVjb2duaXRpb24pLAogICAgc2RfcmVjb2duaXRpb24gPSBzZChyZWNvZ25pdGlvbiksCiAgICBzZV9yZWNvZ25pdGlvbiA9IHNkX3JlY29nbml0aW9uIC8gc3FydChuKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApICU+JQogIG11dGF0ZSgKICAgIHltaW4gPSBwbWF4KDAsIG1lYW5fcmVjb2duaXRpb24gLSBzZV9yZWNvZ25pdGlvbiksCiAgICB5bWF4ID0gcG1pbigxLCBtZWFuX3JlY29nbml0aW9uICsgc2VfcmVjb2duaXRpb24pCiAgKQoKIyBQbG90CmdncGxvdChyZWNfc3VtbWFyeSwgYWVzKHggPSBjeWNsZSwgeSA9IG1lYW5fcmVjb2duaXRpb24sIGdyb3VwID0gZ3JvdXApKSArCiAgZ2VvbV9yaWJib24oCiAgICBhZXMoeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZ3JvdXApLAogICAgYWxwaGEgPSAwLjE4LAogICAgY29sb3IgPSBOQQogICkgKwogIGdlb21faml0dGVyKAogICAgZGF0YSA9IGRhdGFfY2xlYW4sCiAgICBhZXMoeCA9IGN5Y2xlLCB5ID0gcmVjb2duaXRpb24sIGNvbG9yID0gZ3JvdXApLAogICAgd2lkdGggPSAwLjEyLAogICAgYWxwaGEgPSAwLjM1LAogICAgc2l6ZSA9IDIsCiAgICBpbmhlcml0LmFlcyA9IEZBTFNFCiAgKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGdyb3VwKSwgbGluZXdpZHRoID0gMS4yKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBncm91cCksIHNpemUgPSAzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgbGltaXRzID0gYygwLCAxKQogICkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZWNvZ25pdGlvbiBBY2N1cmFjeSBBY3Jvc3MgTGVhcm5pbmcgQ3ljbGVzIChSYXcgKyBNZWFuKSIsCiAgICBzdWJ0aXRsZSA9ICJEb3RzID0gaW5kaXZpZHVhbCBzY29yZXMuIExpbmUgPSBncm91cCBtZWFuLiBCYW5kID0gbWVhbiDCsSAxIFNFLiIsCiAgICB4ID0gIkN5Y2xlIiwKICAgIHkgPSAiUmVjb2duaXRpb24gYWNjdXJhY3kiLAogICAgY29sb3IgPSAiR3JvdXAiLAogICAgZmlsbCA9ICJHcm91cCIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiCiAgKQoKYGBgCgojIyBbMi4yIFZpc3VhbGl6YXRpb24gVHlwZSAyOiBEaXN0cmlidXRpb24gb2YgQWNjdXJhY3kgU2NvcmVzXXsudW5kZXJsaW5lfQoKVG8gY29tcGxlbWVudCB0aGUgbWVhbi1iYXNlZCBhbmFseXNpcywgdGhlIHNlY29uZCB2aXN1YWxpemF0aW9uIGZvY3VzZXMgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiByZWNvZ25pdGlvbiBhY2N1cmFjeSBzY29yZXMgdXNpbmcgdmlvbGluIGFuZCBib3hwbG90IGVsZW1lbnRzLiBUaGlzIHZpc3VhbGl6YXRpb24gaGlnaGxpZ2h0cyB0aGUgc3ByZWFkLCBhbmQgc2hhcGUgb2YgdGhlIGRhdGEgd2l0aGluIGVhY2ggY3ljbGUgYW5kIGdyb3VwLgoKRmlndXJlIDIgcmV2ZWFscyBzdWJzdGFudGlhbCB2YXJpYWJpbGl0eSB3aXRoaW4gYm90aCBncm91cHMsIG1haW5seSBpbiBlYXJsaWVyIGN5Y2xlcy4gVGhlIGRpc3RyaWJ1dGlvbiBmb3IgUGVvcGxlIHdpdGggQXBoYXNpYSBpcyB3aWRlciwgc3VnZ2VzdGluZyBncmVhdGVyIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMgaW4gcGVyZm9ybWFuY2UuIEhlYWx0aHkgQ29udHJvbHMgc2hvdyBtb3JlIGNsdXN0ZXJlZCBzY29yZXMsIGVzcGVjaWFsbHkgaW4gbGF0ZXIgY3ljbGVzLCBzdWdnZXN0aW5nIG1vcmUgY29uc2lzdGVudCByZWNvZ25pdGlvbiBhY2N1cmFjeS4gVGhpcyB2aXN1YWxpemF0aW9uIGRlbW9uc3RyYXRlcyB3aHkgcmVseWluZyBzb2xlbHkgb24gbWVhbnMgY2FuIGJlIG1pc2xlYWRpbmcsIHJlY29nbml6aW5nIGluZGl2aWR1YWwgc2NvcmVzIGluIHRoZSBkYXRhIGlzIGltcG9ydGFudCB0byB0aGUgYmlnZ2VyIHBpY3R1cmUuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCgojIExvYWQgZGF0YQpkYXRhIDwtIHJlYWRfY3N2KCIvVXNlcnMvbGVhaGtlbGx5L0Rvd25sb2Fkcy9EYXRhUiAoMikuY3N2IikKCiMgQ2xlYW4gZGF0YQpkYXRhX2NsZWFuIDwtIGRhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIkhDIiwgIlBXQSIpKSwKICAgIGN5Y2xlID0gZmFjdG9yKGN5Y2xlKQogICkKCiMgQ3JlYXRlIENvcnJlY3QgdnMgTm90IENvcnJlY3QgKGFzc3VtZXMgcmVjb2duaXRpb24gaXMgMC8xKQpkYXRhX2JpbmFyeSA8LSBkYXRhX2NsZWFuICU+JQogIGZpbHRlcighaXMubmEocmVjb2duaXRpb24pKSAlPiUKICBtdXRhdGUob3V0Y29tZSA9IGlmX2Vsc2UocmVjb2duaXRpb24gPT0gMSwgIkNvcnJlY3QiLCAiTm90IENvcnJlY3QiKSkKCiMgUHJvcG9ydGlvbnMgcGVyIGdyb3VwL2N5Y2xlCnByb3BfZGF0YSA8LSBkYXRhX2JpbmFyeSAlPiUKICBjb3VudChncm91cCwgY3ljbGUsIG91dGNvbWUpICU+JQogIGdyb3VwX2J5KGdyb3VwLCBjeWNsZSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuIC8gc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkKCiMgUGxvdApnZ3Bsb3QocHJvcF9kYXRhLCBhZXMoeCA9IGN5Y2xlLCB5ID0gcHJvcCwgZmlsbCA9IG91dGNvbWUpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAwLjc1KSArCiAgZmFjZXRfd3JhcCh+IGdyb3VwKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiQ29ycmVjdCB2cyBOb3QgQ29ycmVjdCBSZXNwb25zZXMgQWNyb3NzIExlYXJuaW5nIEN5Y2xlcyIsCiAgICBzdWJ0aXRsZSA9ICJFYWNoIGJhciB0b3RhbHMgMTAwJSB3aXRoaW4gZWFjaCBncm91cCBhbmQgY3ljbGUiLAogICAgeCA9ICJDeWNsZSIsCiAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgcmVzcG9uc2VzIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIKICApCgpgYGAKCiMjIFsqKjIuMyBWaXN1YWxpemF0aW9uIFR5cGUgMzogQ29ycmVjdCB2cy4gTm90IENvcnJlY3QgUmVzcG9uc2VzKipdey51bmRlcmxpbmV9CgpUaGUgdGhpcmQgdmlzdWFsaXphdGlvbiBkaXNwbGF5cyB0aGUgcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHZlcnN1cyBub3QgY29ycmVjdCByZXNwb25zZXMgYWNyb3NzIGxlYXJuaW5nIGN5Y2xlcyB1c2luZyBhIHN0YWNrZWQgYmFyIGNoYXJ0LiBUaGlzIGZvcm1hdCBlbXBoYXNpemVzIHJlbGF0aXZlIHByb3BvcnRpb25zIGFuZCBtYWtlcyBncm91cCBjb21wYXJpc29ucyBpbnR1aXRpdmUuCgpGaWd1cmUgMyBzaG93cyBhbiBpbmNyZWFzaW5nIHByb3BvcnRpb24gb2YgY29ycmVjdCByZXNwb25zZXMgYWNyb3NzIGN5Y2xlcyBmb3IgYm90aCBncm91cHMuIEhlYWx0aHkgQ29udHJvbHMgcmVhY2ggYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHJlc3BvbnNlcyBlYXJsaWVyLCB3aGlsZSBQZW9wbGUgd2l0aCBBcGhhc2lhIHNob3cgbW9yZSBncmFkdWFsIGltcHJvdmVtZW50LiBCZWNhdXNlIGVhY2ggYmFyIHN1bXMgdG8gMTAwJSwgdGhpcyB2aXN1YWxpemF0aW9uIG1ha2VzIGl0IGVhc3kgdG8gY29tcGFyZSBhY2N1cmFjeSBwYXR0ZXJucyBhY3Jvc3MgY3ljbGVzIHdpdGhvdXQgYmVpbmcgaW5mbHVlbmNlZCBieSBkaWZmZXJlbmNlcyBpbiByYXcgY291bnRzLgoKIyMgWyoqQ29uY2x1c2lvbiBhbmQgRGlzY3Vzc2lvbioqXXsudW5kZXJsaW5lfQoKQWNyb3NzIGFsbCB2aXN1YWxpemF0aW9ucywgYSBjb25zaXN0ZW50IHBhdHRlcm4gZW1lcmdlczogcmVjb2duaXRpb24gYWNjdXJhY3kgaW1wcm92ZXMgYWNyb3NzIGxlYXJuaW5nIGN5Y2xlcyBmb3IgYm90aCBncm91cHMsIGJ1dCBIZWFsdGh5IENvbnRyb2xzIG91dHBlcmZvcm0gUGVvcGxlIHdpdGggQXBoYXNpYSBhdCBlYWNoIHN0YWdlLiBUaGUgY29tYmluYXRpb24gb2YgdmlzdWFsaXphdGlvbnMgcmV2ZWFscyBjb21wbGVtZW50YXJ5IGluc2lnaHRzLiBNZWFuIGJhc2VkIHBsb3RzIGhpZ2hsaWdodCBvdmVyYWxsIHRyZW5kcywgZGlzdHJpYnV0aW9uYWwgcGxvdHMgZXhwb3NlIGluZGl2aWR1YWwgdmFyaWFiaWxpdHksIGFuZCBwcm9wb3J0aW9uYWwgY2hhcnRzIGNsYXJpZnkgZ3JvdXAgZGlmZmVyZW5jZXMgaW4gY29ycmVjdG5lc3MuCgpUaGlzIGRhdGEgYm9sc3RlcnMgdGhlIGZhY3QgdGhhdCB3aXRoIHJlcGVhdGVkIGV4cG9zdXJlIHRvIGEgd29yZCwgaXQgYmVjb21lcyBlYXNpZXIgZm9yIHRoZSBicmFpbiB0byByZXRhaW4gaW4gaGVhbHRoeSBpbmRpdmlkdWFscywgYnV0IGFsc28gaW4gcGVvcGxlIHdobyBoYXZlIG5ldXJvbG9naWNhbCBjb25kaXRpb25zIGFzIHdlbGwuCgpUaGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgcGFydGljdWxhcmx5IHVzZWZ1bCBiZWNhdXNlIHRoZXkgbWFrZSBhYnN0cmFjdCBudW1lcmljYWwgcGF0dGVybnMgdmlzaWJsZSBhbmQgZWFzeSB0byBkaWdlc3QgYW5kIGludGVycHJldC4gT3ZlcmFsbCwgdGhpcyBwcm9qZWN0IGRlbW9uc3RyYXRlcyBob3cgcXVhbnRpdGF0aXZlIHZpc3VhbGl6YXRpb24gdGVjaG5pcXVlcyBjYW4gYmUgdXNlZCB0byBleHBsb3JlIGxlYXJuaW5nIGFuZCByZWNvZ25pdGlvbiBwYXR0ZXJucyBpbiBsaW5ndWlzdGljIGRhdGEgaW4gYSBjbGVhciBhbmQgbWVhbmluZ2Z1bCB3YXkuCgpUaGVzZSB2aXN1YWxpemF0aW9ucyBzdXBwb3J0IHRoZSBzdHVkeSdzIGNvbmNsdXNpb24gdGhhdCByZWNvZ25pdGlvbiBiYXNlZCBtZWFzdXJlbWVudCBwcm92aWRlIGEgbW9yZSBpbmZvcm1hdGl2ZSBhc3Nlc3NtZW50IG9mIG5vdmVsIHdvcmQgbGVhcm5pbmcgaW4gaW5kaXZpZHVhbHMgd2l0aCBhcGhhc2lhLiBBbHRob3VnaCB3ZSBhcmUgbm90IHByb3ZpZGVkIG1vcmUgaW5mb3JtYXRpb24gb24gbGVzaW9uIGxvY2F0aW9uIG9yIHR5cGUgb2YgYXBoYXNpYSwgdGhlIG92ZXJhbGwgZGF0YSByZWZsZWN0cyBhIG1lYW5pbmdmdWwgcGF0dGVybiBpbiBsZWFybmluZyBwZXJmb3JtYW5jZS4K