#Getting Started
For those of you new to R, the first thing you generally need to do
is load packages that you will use. The tidyverse package
has most of the tools we’ll need today.
If you have never used the package before, you’ll need to install it
manually. Click the “Packages” tab in the bottom right window, then
click the “Install” button, and type “tidyverse” and click
“Install”.
library(tidyverse)
Now we’ll read in data that Anu has graciously shared with us.
data <- read_csv("Pune_SchoolData.csv", na = c("", "NA", "na"))
#Preparing Data
This dataset is currently in long format, meaning there are separate
rows for each trial of Anu’s experiment. It also means that participant
background data, which does not vary across trials, is repeated.
unique(data$participant_id)
[1] "A01" "A02" "A03" "A04" "A05" "A06" "A07" "A08" "B01" "B02" "B03" "B04" "B05" "B06" "B07" "B08" "B09" "B10" "B11" "B12" "B13" "C01"
[23] "C02" "C03" "C04" "C05" "C06" "C07" "D01" "D02" "D03" "D04" "D05" "D06" "C08" "C09" "C10" "C11" "C12" "C13" "C14" "C15" "C16" "C17"
900+ rows, but only a few dozen participants.
length(unique(data$participant_id))
[1] 44
44 participants, to be precise!
We want to do a little work on that background data first, so we’ll
make a separate dataset for that.
bg <- data %>%
select(participant_id:marathi_home) %>%
distinct()
Now we have a dataframe calld bg with 44 rows; one for
each participant.
We want to compute a (fairly) precise age for each participant based
on their birthday (month and year, it looks like) and the date of data
collection. Months are a very meaningful unit of time in child language
acquisition, so we can’t just round to the nearest year.
We’ll use some tidyverse functions that are part of the
lubridate package.
#change collection data to a special date format
bg$collection_date <- as.Date(bg$collection_date, "%m/%d/%Y")
#also change birthdate to a special date format
bg$birthdate <- as.Date(bg$birthdate, "%m/%d/%Y")
#subtract birthdate from collection date (result in days)
bg$age_cont <- difftime(bg$collection_date, bg$birthdate)/365#divide by 365 to get years
#make this a number
bg$age_cont <- as.numeric(bg$age_cont)*12 #multiply by 12 to get months
Let’s do a little bit of summarizing and plotting to see what our
participants’ ages look like.
bg %>% summarise(mean = mean(age_cont),
sd = sd(age_cont),
median = median(age_cont),
min = min(age_cont),
max = max(age_cont)) %>%
round(2)
Now for a histogram…
bg %>% ggplot(aes(x = age_cont))+
geom_vline(xintercept = 48, linetype = 2)+
geom_vline(xintercept = 60, linetype = 2)+
geom_vline(xintercept = 72, linetype = 2)+
geom_histogram(binwidth = 1)+
scale_x_continuous(breaks = c(48, 60, 72))+
scale_y_continuous(expand = c(0,0), limits = c(0, 5.5))+
labs(x = "Age (mos.)")+
theme_bw()

Anu’s data also has an age category, which corresponds to Junior and
Senior kindergarten. Let’s compare the ages of the two groups:
bg %>% group_by(age_cat) %>%
summarise(n = n(),
mean = mean(age_cont),
sd = sd(age_cont),
median = median(age_cont),
min = min(age_cont),
max = max(age_cont))
As expected, the Senior Kindergarteners are about a year older, on
average, than the junior kindergarteners.
Visually:
bg %>% ggplot(aes(x = age_cat, y = age_cont)) +
geom_boxplot()+
geom_jitter(height = 0, width = .1, color = "blue")+
stat_summary(fun = "mean", color = "red", geom = "point", size = 4)+
theme_bw()

#Proportions of verb interpretations
Anu’s data involves children having to interpret verbs as being
causative or conjunctive in Marathi (I think…). These are all
intransitive verbs, and can have markers attached(or in proximity? - I
know nothing about Marathi!).
We can use the table(), xtabs(), and
count() or tally() functions to get a sense of
the design and stimuli.
table(data$verb, data$interp)
xtabs(~verb+token_type , data = data)
data %>% group_by(verb, verb_type) %>% count()
data %>% group_by(verb, marker) %>% tally()
Six verbs (cry, getwet, laugh, rise, scare, sleep) are the targets
and it seems like Anu is interested how case markers affect verb
interpretations (causative or conjunctive) for children at different
ages.
data %>% filter(!is.na(interp)) %>%
group_by(age_cat, marker, interp) %>%
count() %>%
pivot_wider(names_from = interp, values_from = n) %>%
mutate(total = causative + conjunctive,
cause_perc = (causative/total)*100,
conj_perc = (conjunctive/total)*100)
And now for a plot of causatives…
data %>% filter(!is.na(interp)) %>%
group_by(age_cat, marker, interp) %>%
count() %>%
pivot_wider(names_from = interp, values_from = n) %>%
mutate(total = causative + conjunctive,
cause_perc = (causative/total)*100,
conj_perc = (conjunctive/total)*100) %>%
ggplot(aes(x = marker, y = cause_perc, fill = age_cat))+
geom_bar(stat = "identity", position = "dodge")+
theme_bw()

And now for a plot of conjunctives…
data %>% filter(!is.na(interp)) %>%
group_by(age_cat, marker, interp) %>%
count() %>%
pivot_wider(names_from = interp, values_from = n) %>%
mutate(total = causative + conjunctive,
cause_perc = (causative/total)*100,
conj_perc = (conjunctive/total)*100) %>%
ggplot(aes(x = marker, y = conj_perc, fill = age_cat))+
geom_bar(stat = "identity", position = "dodge")+
theme_bw()
Now we’ll do something similar, but at the participant level so we
can look in greater detail at trends across ages.
And now some plotting….
data %>% filter(!is.na(interp)) %>%
group_by(participant_id, marker, interp) %>%
count(.drop = F) %>%
pivot_wider(names_from = interp, values_from = n) %>%
mutate(causative = ifelse(is.na(causative), 0, causative),
conjunctive = ifelse(is.na(conjunctive), 0, conjunctive),
total = causative + conjunctive,
cause_perc = (causative/total)*100,
conj_perc = (conjunctive/total)*100) %>%
left_join(.,select(bg, participant_id, age_cont), by = "participant_id") %>%
select(participant_id, age_cont, marker, cause_perc, conj_perc) %>%
pivot_longer(cause_perc:conj_perc, names_to = "interp", values_to = "percent") %>%
ggplot(aes(x = age_cont, color = marker, y = percent))+
geom_point(alpha = .4)+
geom_smooth(method = "lm")+
theme_bw()+
facet_wrap(~interp+marker, nrow = 2)

LS0tDQp0aXRsZTogIlFSREcgRGF0YSBBbmFseXNpcyBXb3Jrc2hvcCBOb3YuIDIwMjIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojR2V0dGluZyBTdGFydGVkDQoNCkZvciB0aG9zZSBvZiB5b3UgbmV3IHRvIFIsIHRoZSBmaXJzdCB0aGluZyB5b3UgZ2VuZXJhbGx5IG5lZWQgdG8gZG8gaXMgbG9hZCBwYWNrYWdlcyB0aGF0IHlvdSB3aWxsIHVzZS4gVGhlIGB0aWR5dmVyc2VgIHBhY2thZ2UgaGFzIG1vc3Qgb2YgdGhlIHRvb2xzIHdlJ2xsIG5lZWQgdG9kYXkuDQoNCklmIHlvdSBoYXZlIG5ldmVyIHVzZWQgdGhlIHBhY2thZ2UgYmVmb3JlLCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIGl0IG1hbnVhbGx5LiBDbGljayB0aGUgIlBhY2thZ2VzIiB0YWIgaW4gdGhlIGJvdHRvbSByaWdodCB3aW5kb3csIHRoZW4gY2xpY2sgdGhlICJJbnN0YWxsIiBidXR0b24sIGFuZCB0eXBlICJ0aWR5dmVyc2UiIGFuZCBjbGljayAiSW5zdGFsbCIuDQoNCmBgYHtyIGVjaG89VCwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQpOb3cgd2UnbGwgcmVhZCBpbiBkYXRhIHRoYXQgQW51IGhhcyBncmFjaW91c2x5IHNoYXJlZCB3aXRoIHVzLg0KDQpgYGB7ciBlY2hvPVQsIHJlc3VsdHM9J2hpZGUnfQ0KZGF0YSA8LSByZWFkX2NzdigiUHVuZV9TY2hvb2xEYXRhLmNzdiIsIG5hID0gYygiIiwgIk5BIiwgIm5hIikpDQpgYGANCg0KI1ByZXBhcmluZyBEYXRhDQoNClRoaXMgZGF0YXNldCBpcyBjdXJyZW50bHkgaW4gbG9uZyBmb3JtYXQsIG1lYW5pbmcgdGhlcmUgYXJlIHNlcGFyYXRlIHJvd3MgZm9yIGVhY2ggdHJpYWwgb2YgQW51J3MgZXhwZXJpbWVudC4gSXQgYWxzbyBtZWFucyB0aGF0IHBhcnRpY2lwYW50IGJhY2tncm91bmQgZGF0YSwgd2hpY2ggZG9lcyBub3QgdmFyeSBhY3Jvc3MgdHJpYWxzLCBpcyByZXBlYXRlZC4gDQoNCmBgYHtyfQ0KdW5pcXVlKGRhdGEkcGFydGljaXBhbnRfaWQpDQpgYGANCjkwMCsgcm93cywgYnV0IG9ubHkgYSBmZXcgZG96ZW4gcGFydGljaXBhbnRzLg0KDQpgYGB7cn0NCmxlbmd0aCh1bmlxdWUoZGF0YSRwYXJ0aWNpcGFudF9pZCkpDQpgYGANCjQ0IHBhcnRpY2lwYW50cywgdG8gYmUgcHJlY2lzZSENCg0KV2Ugd2FudCB0byBkbyBhIGxpdHRsZSB3b3JrIG9uIHRoYXQgYmFja2dyb3VuZCBkYXRhIGZpcnN0LCBzbyB3ZSdsbCBtYWtlIGEgc2VwYXJhdGUgZGF0YXNldCBmb3IgdGhhdC4NCg0KYGBge3J9DQpiZyA8LSBkYXRhICU+JQ0KICBzZWxlY3QocGFydGljaXBhbnRfaWQ6bWFyYXRoaV9ob21lKSAlPiUNCiAgZGlzdGluY3QoKQ0KYGBgDQoNCk5vdyB3ZSBoYXZlIGEgZGF0YWZyYW1lIGNhbGxkIGBiZ2Agd2l0aCA0NCByb3dzOyBvbmUgZm9yIGVhY2ggcGFydGljaXBhbnQuDQoNCldlIHdhbnQgdG8gY29tcHV0ZSBhIChmYWlybHkpIHByZWNpc2UgYWdlIGZvciBlYWNoIHBhcnRpY2lwYW50IGJhc2VkIG9uIHRoZWlyIGJpcnRoZGF5IChtb250aCBhbmQgeWVhciwgaXQgbG9va3MgbGlrZSkgYW5kIHRoZSBkYXRlIG9mIGRhdGEgY29sbGVjdGlvbi4gTW9udGhzIGFyZSBhIHZlcnkgbWVhbmluZ2Z1bCB1bml0IG9mIHRpbWUgaW4gY2hpbGQgbGFuZ3VhZ2UgYWNxdWlzaXRpb24sIHNvIHdlIGNhbid0IGp1c3Qgcm91bmQgdG8gdGhlIG5lYXJlc3QgeWVhci4NCg0KV2UnbGwgdXNlIHNvbWUgYHRpZHl2ZXJzZWAgZnVuY3Rpb25zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGBsdWJyaWRhdGVgIHBhY2thZ2UuDQoNCmBgYHtyfQ0KI2NoYW5nZSBjb2xsZWN0aW9uIGRhdGEgdG8gYSBzcGVjaWFsIGRhdGUgZm9ybWF0DQpiZyRjb2xsZWN0aW9uX2RhdGUgPC0gYXMuRGF0ZShiZyRjb2xsZWN0aW9uX2RhdGUsICIlbS8lZC8lWSIpDQoNCiNhbHNvIGNoYW5nZSBiaXJ0aGRhdGUgdG8gYSBzcGVjaWFsIGRhdGUgZm9ybWF0DQpiZyRiaXJ0aGRhdGUgPC0gYXMuRGF0ZShiZyRiaXJ0aGRhdGUsICIlbS8lZC8lWSIpDQoNCiNzdWJ0cmFjdCBiaXJ0aGRhdGUgZnJvbSBjb2xsZWN0aW9uIGRhdGUgKHJlc3VsdCBpbiBkYXlzKQ0KYmckYWdlX2NvbnQgPC0gZGlmZnRpbWUoYmckY29sbGVjdGlvbl9kYXRlLCBiZyRiaXJ0aGRhdGUpLzM2NSNkaXZpZGUgYnkgMzY1IHRvIGdldCB5ZWFycw0KDQojbWFrZSB0aGlzIGEgbnVtYmVyDQpiZyRhZ2VfY29udCA8LSBhcy5udW1lcmljKGJnJGFnZV9jb250KSoxMiAjbXVsdGlwbHkgYnkgMTIgdG8gZ2V0IG1vbnRocw0KYGBgDQoNCkxldCdzIGRvIGEgbGl0dGxlIGJpdCBvZiBzdW1tYXJpemluZyBhbmQgcGxvdHRpbmcgdG8gc2VlIHdoYXQgb3VyIHBhcnRpY2lwYW50cycgYWdlcyBsb29rIGxpa2UuDQoNCmBgYHtyfQ0KYmcgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihhZ2VfY29udCksDQogICAgICAgICAgICAgICAgIHNkID0gc2QoYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtaW4gPSBtaW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtYXggPSBtYXgoYWdlX2NvbnQpKSAlPiUNCiAgcm91bmQoMikNCmBgYA0KDQpOb3cgZm9yIGEgaGlzdG9ncmFtLi4uDQoNCmBgYHtyfQ0KYmcgJT4lIGdncGxvdChhZXMoeCA9IGFnZV9jb250KSkrDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQ4LCBsaW5ldHlwZSA9IDIpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2MCwgbGluZXR5cGUgPSAyKSsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNzIsIGxpbmV0eXBlID0gMikrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ4LCA2MCwgNzIpKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLCA1LjUpKSsNCiAgbGFicyh4ID0gIkFnZSAobW9zLikiKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KQW51J3MgZGF0YSBhbHNvIGhhcyBhbiBhZ2UgY2F0ZWdvcnksIHdoaWNoIGNvcnJlc3BvbmRzIHRvIEp1bmlvciBhbmQgU2VuaW9yIGtpbmRlcmdhcnRlbi4gTGV0J3MgY29tcGFyZSB0aGUgYWdlcyBvZiB0aGUgdHdvIGdyb3VwczoNCg0KYGBge3J9DQpiZyAlPiUgZ3JvdXBfYnkoYWdlX2NhdCkgJT4lDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgbWVhbiA9IG1lYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgc2QgPSBzZChhZ2VfY29udCksDQogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgbWluID0gbWluKGFnZV9jb250KSwgICAgICAgICAgICAgICANCiAgICAgICAgICAgIG1heCA9IG1heChhZ2VfY29udCkpIA0KYGBgDQoNCkFzIGV4cGVjdGVkLCB0aGUgU2VuaW9yIEtpbmRlcmdhcnRlbmVycyBhcmUgYWJvdXQgYSB5ZWFyIG9sZGVyLCBvbiBhdmVyYWdlLCB0aGFuIHRoZSBqdW5pb3Iga2luZGVyZ2FydGVuZXJzLg0KDQpWaXN1YWxseToNCg0KYGBge3J9DQpiZyAlPiUgZ2dwbG90KGFlcyh4ID0gYWdlX2NhdCwgeSA9IGFnZV9jb250KSkgKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAuMSwgY29sb3IgPSAiYmx1ZSIpKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gIm1lYW4iLCBjb2xvciA9ICJyZWQiLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDQpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojUHJvcG9ydGlvbnMgb2YgdmVyYiBpbnRlcnByZXRhdGlvbnMNCg0KQW51J3MgZGF0YSBpbnZvbHZlcyBjaGlsZHJlbiBoYXZpbmcgdG8gaW50ZXJwcmV0IHZlcmJzIGFzIGJlaW5nIGNhdXNhdGl2ZSBvciBjb25qdW5jdGl2ZSBpbiBNYXJhdGhpIChJIHRoaW5rLi4uKS4gVGhlc2UgYXJlIGFsbCBpbnRyYW5zaXRpdmUgdmVyYnMsIGFuZCBjYW4gaGF2ZSBtYXJrZXJzIGF0dGFjaGVkKG9yIGluIHByb3hpbWl0eT8gLSBJIGtub3cgbm90aGluZyBhYm91dCBNYXJhdGhpISkuDQoNCldlIGNhbiB1c2UgdGhlIGB0YWJsZSgpYCwgYHh0YWJzKClgLCBhbmQgYGNvdW50KClgIG9yIGB0YWxseSgpYCBmdW5jdGlvbnMgdG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIGRlc2lnbiBhbmQgc3RpbXVsaS4NCg0KYGBge3IgZWNobz1ULCByZXN1bHRzPSdoaWRlJ30NCnRhYmxlKGRhdGEkdmVyYiwgZGF0YSRpbnRlcnApDQp4dGFicyh+dmVyYit0b2tlbl90eXBlICwgZGF0YSA9IGRhdGEpDQpkYXRhICU+JSBncm91cF9ieSh2ZXJiLCB2ZXJiX3R5cGUpICU+JSBjb3VudCgpDQpkYXRhICU+JSBncm91cF9ieSh2ZXJiLCBtYXJrZXIpICU+JSB0YWxseSgpDQpgYGANCg0KU2l4IHZlcmJzIChjcnksIGdldHdldCwgbGF1Z2gsIHJpc2UsIHNjYXJlLCBzbGVlcCkgYXJlIHRoZSB0YXJnZXRzIGFuZCBpdCBzZWVtcyBsaWtlIEFudSBpcyBpbnRlcmVzdGVkIGhvdyBjYXNlIG1hcmtlcnMgYWZmZWN0IHZlcmIgaW50ZXJwcmV0YXRpb25zIChjYXVzYXRpdmUgb3IgY29uanVuY3RpdmUpIGZvciBjaGlsZHJlbiBhdCBkaWZmZXJlbnQgYWdlcy4NCg0KYGBge3J9DQpkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKGludGVycCkpICU+JQ0KICBncm91cF9ieShhZ2VfY2F0LCBtYXJrZXIsIGludGVycCkgJT4lDQogIGNvdW50KCkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcnAsIHZhbHVlc19mcm9tID0gbikgJT4lDQogIG11dGF0ZSh0b3RhbCA9IGNhdXNhdGl2ZSArIGNvbmp1bmN0aXZlLA0KICAgICAgICAgY2F1c2VfcGVyYyA9IChjYXVzYXRpdmUvdG90YWwpKjEwMCwNCiAgICAgICAgIGNvbmpfcGVyYyA9IChjb25qdW5jdGl2ZS90b3RhbCkqMTAwKQ0KYGBgDQoNCkFuZCBub3cgZm9yIGEgcGxvdCBvZiBjYXVzYXRpdmVzLi4uDQoNCmBgYHtyfQ0KZGF0YSAlPiUgZmlsdGVyKCFpcy5uYShpbnRlcnApKSAlPiUNCiAgZ3JvdXBfYnkoYWdlX2NhdCwgbWFya2VyLCBpbnRlcnApICU+JQ0KICBjb3VudCgpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJwLCB2YWx1ZXNfZnJvbSA9IG4pICU+JQ0KICBtdXRhdGUodG90YWwgPSBjYXVzYXRpdmUgKyBjb25qdW5jdGl2ZSwNCiAgICAgICAgIGNhdXNlX3BlcmMgPSAoY2F1c2F0aXZlL3RvdGFsKSoxMDAsDQogICAgICAgICBjb25qX3BlcmMgPSAoY29uanVuY3RpdmUvdG90YWwpKjEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IG1hcmtlciwgeSA9IGNhdXNlX3BlcmMsIGZpbGwgPSBhZ2VfY2F0KSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KQW5kIG5vdyBmb3IgYSBwbG90IG9mIGNvbmp1bmN0aXZlcy4uLg0KDQpgYGB7cn0NCmRhdGEgJT4lIGZpbHRlcighaXMubmEoaW50ZXJwKSkgJT4lDQogIGdyb3VwX2J5KGFnZV9jYXQsIG1hcmtlciwgaW50ZXJwKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVycCwgdmFsdWVzX2Zyb20gPSBuKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gY2F1c2F0aXZlICsgY29uanVuY3RpdmUsDQogICAgICAgICBjYXVzZV9wZXJjID0gKGNhdXNhdGl2ZS90b3RhbCkqMTAwLA0KICAgICAgICAgY29ual9wZXJjID0gKGNvbmp1bmN0aXZlL3RvdGFsKSoxMDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtYXJrZXIsIHkgPSBjb25qX3BlcmMsIGZpbGwgPSBhZ2VfY2F0KSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQpOb3cgd2UnbGwgZG8gc29tZXRoaW5nIHNpbWlsYXIsIGJ1dCBhdCB0aGUgcGFydGljaXBhbnQgbGV2ZWwgc28gd2UgY2FuIGxvb2sgaW4gZ3JlYXRlciBkZXRhaWwgYXQgdHJlbmRzIGFjcm9zcyBhZ2VzLg0KDQpgYGB7cn0NCmRhdGEgJT4lIGZpbHRlcighaXMubmEoaW50ZXJwKSkgJT4lDQogIGdyb3VwX2J5KHBhcnRpY2lwYW50X2lkLCBtYXJrZXIsIGludGVycCkgJT4lDQogIGNvdW50KC5kcm9wID0gRikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcnAsIHZhbHVlc19mcm9tID0gbikgJT4lDQogIG11dGF0ZShjYXVzYXRpdmUgPSBpZmVsc2UoaXMubmEoY2F1c2F0aXZlKSwgMCwgY2F1c2F0aXZlKSwNCiAgICAgICAgIGNvbmp1bmN0aXZlID0gaWZlbHNlKGlzLm5hKGNvbmp1bmN0aXZlKSwgMCwgY29uanVuY3RpdmUpLA0KICAgICAgICAgdG90YWwgPSBjYXVzYXRpdmUgKyBjb25qdW5jdGl2ZSwNCiAgICAgICAgIGNhdXNlX3BlcmMgPSAoY2F1c2F0aXZlL3RvdGFsKSoxMDAsDQogICAgICAgICBjb25qX3BlcmMgPSAoY29uanVuY3RpdmUvdG90YWwpKjEwMCkgJT4lDQogIGxlZnRfam9pbiguLHNlbGVjdChiZywgcGFydGljaXBhbnRfaWQsIGFnZV9jb250KSwgYnkgPSAicGFydGljaXBhbnRfaWQiKQ0KYGBgDQoNCkFuZCBub3cgc29tZSBwbG90dGluZy4uLi4NCg0KYGBge3J9DQpkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKGludGVycCkpICU+JQ0KICBncm91cF9ieShwYXJ0aWNpcGFudF9pZCwgbWFya2VyLCBpbnRlcnApICU+JQ0KICBjb3VudCguZHJvcCA9IEYpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJwLCB2YWx1ZXNfZnJvbSA9IG4pICU+JQ0KICBtdXRhdGUoY2F1c2F0aXZlID0gaWZlbHNlKGlzLm5hKGNhdXNhdGl2ZSksIDAsIGNhdXNhdGl2ZSksDQogICAgICAgICBjb25qdW5jdGl2ZSA9IGlmZWxzZShpcy5uYShjb25qdW5jdGl2ZSksIDAsIGNvbmp1bmN0aXZlKSwNCiAgICAgICAgIHRvdGFsID0gY2F1c2F0aXZlICsgY29uanVuY3RpdmUsDQogICAgICAgICBjYXVzZV9wZXJjID0gKGNhdXNhdGl2ZS90b3RhbCkqMTAwLA0KICAgICAgICAgY29ual9wZXJjID0gKGNvbmp1bmN0aXZlL3RvdGFsKSoxMDApICU+JQ0KICBsZWZ0X2pvaW4oLixzZWxlY3QoYmcsIHBhcnRpY2lwYW50X2lkLCBhZ2VfY29udCksIGJ5ID0gInBhcnRpY2lwYW50X2lkIikgJT4lDQogIHNlbGVjdChwYXJ0aWNpcGFudF9pZCwgYWdlX2NvbnQsIG1hcmtlciwgY2F1c2VfcGVyYywgY29ual9wZXJjKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNhdXNlX3BlcmM6Y29ual9wZXJjLCBuYW1lc190byA9ICJpbnRlcnAiLCB2YWx1ZXNfdG8gPSAicGVyY2VudCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2VfY29udCwgY29sb3IgPSBtYXJrZXIsIHkgPSBwZXJjZW50KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAuNCkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICB0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5pbnRlcnArbWFya2VyLCBucm93ID0gMikNCmBgYA0KDQo=