16 December, 2025
Brief Introduction
Reaction time measurements are commonly used to explore cognitive
processing in language. Countless research has proven concrete words
(e.g., table, apple) are processed more quickly and more accurately than
abstract words (e.g., justice, hope). However, there is limited research
that takes into account potential influential lexical factors. In the
present analysis, word length and frequency are controlled for when
examining reaction times of concrete and abstract words.
Data
Three data sets were used in the present analysis. Only SimLex and
SUBTLEX were directly imported into R, while the third data set was used
for reference purpose:
SimLex: Provides concreteness ratings for a
wide range of English words, which are used to classify words as
abstract or concrete. Concreteness categories are determined using a
median split of the ratings, with words below the median classified as
abstract and words above the median classified as concrete.
SUBTLEX: Provides frequency ratings for
74,286 English words based on a large corpus. These frequency measures
are used to limit the analysis to words within a comparable frequency
range to reduce frequency related effects on reaction time.
English Lexicon Project: Provides reaction time
measures for approximately 40,481 English words
Code used to load in SimLex:
setwd(“~/Desktop”)
SimLex <- read.delim(“SimLex-999.txt”, header
= TRUE)
Orignal Imported Data Set:
head(SimLex)
From the SimLex data set, the only data of interest for this analysis are the concreteness ratings of words. SimLex contains two word columns and two corresponding concreteness columns. To create a clean data set, the two word columns were combined into a single word column, and the two concreteness columns were combined into a single concreteness column. Any duplicate words were then removed so that each word only appears once.
A median split of the concreteness ratings was performed, with words below the median classified as Abstract and words above the median classified as Concrete. Words equal to the median were removed and concreteness rating was kept between 3.43 and 4.03.
Code Used:
To extract the information and
then merge it:
SimLex1 <- data.frame(Word = SimLex\(word1, Conc.Rating = SimLex\)conc.w1.)
SimLex2 <- data.frame(Word = SimLex\(word2,
Conc.Rating = SimLex\)conc.w2.)
SimLex_CombinedWords <-
rbind(SimLex1, SimLex2)
To create a median split and a categorization column:
median_value <- median(SimLex_CombinedWords$Conc.Rating)
SimLex_NoMedian <- SimLex_CombinedWords %>%
filter(Conc.Rating != median_value)
SimLex_FinalDataset <-
SimLex_NoMedian %>%
mutate(Conc.Type = case_when(Conc.Rating
> median_value ~ “Concrete”, Conc.Rating < median_value ~
“Abstract”))
To remove duplicates:
SimLex_FinalDataset <-
SimLex_FinalDataset[!duplicated(SimLex_CombinedWords$Word), ]
To keep concreteness rating within a range:
median_adjacent <- SimLex_FinalDataset %>%
filter(Conc.Rating
>= 3.43 & Conc.Rating <= 4.03)
Split by concreteness type and then merge:
abstract_median_adjacent <- median_adjacent %>% filter(Conc.Type
== “Abstract”)
concrete_median_adjacent <- median_adjacent
%>% filter(Conc.Type == “Concrete”)
SimLex_FinalDataset <-
median_adjacent
This is the resulting data set now containing 77 words:
head(SimLex_FinalDataset)
Code used to load in SUBTLEX:
install.packages(“readxl”)
library(readxl)
SUBTLEX <-
read_excel(“SUBTLEXusExcel2007.xlsx”)
Original Imported Data Set:
head(SUBTLEX)
From the SUBTLEX data set, the only data of interest for this analysis are the words and their frequency counts. A new column to indicate the number of characters in each word was added. Words shorter than 3 letters or longer than 7 letters were removed to reduce potential effects.
A median split of the FREQcount column was then performed. Words with frequency counts above the median were labeled high frequency, and words below the median were labeled low frequency. Frequencies equal to the median were not considered. Any duplicate words were removed. The resulting data set contains only the necessary columns for analysis.
Code Used:
To add word length column:
SUBLTEX <- SUBTLEX %>%
mutate(Word_Length = nchar(Word))
To remove irrelevant columns of data:
SUBTLEX_Clean <- SUBTLEX %>%
select(Word, Length, FREQcount)
To filter word length:
SUBTLEX_Clean <-
SUBTLEX_Clean %>%
filter(Length >= 3 & Length <= 7)
To median split word frequency and add frequency type:
Median_Freq <- median(SUBTLEX_Clean$FREQcount)
SUBTLEX_FinalDataset <- SUBTLEX_Clean %>%
mutate(freq.type =
ifelse(FREQcount > Median_Freq, “High”, “Low”))
To remove duplicates:
SUBTLEX_FinalDataset <-
SUBTLEX_FinalDataset[!duplicated(SUBTLEX_FinalDataset$Word), ]
This is the resulting data set:
head(SUBTLEX_FinalDataset)
Sample Selection
To analyze reaction times for concrete and abstract words while also
controlling for word length and frequency, a subset of words was
selected from the cleaned SimLex and SUBTLEX data sets. 28 abstract
words of high frequency were selected while only 24 concrete words of
high frequency were selected. Note that only high frequency words were
considered. The relevant data from SimLex and SUBTLEX were then compiled
into separate tables containing only the columns needed for analysis
(word, concreteness type, concreteness rating, and reaction
time). Reaction time was added in manually from the English Lexicon
Project data set.
Here is the resulting data table:
head(final_sample)
Results
ggplot(final_sample, aes(x = Conc.Type, y = ReactionTime, fill = Conc.Type)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.2, alpha = 0.5, color = "black") +
labs(x = "Word Type", y = "Reaction Time (ms)", title = "Reaction Times for Abstract vs. Concrete Words") + coord_flip()

The box plot compares reaction times (in milliseconds) for abstract and
concrete words. Overall, reaction times for abstract and concrete words
are fairly similar, however a smaller sample size was used which could
be an explanation for the similarities. Results may vary with a larger
sample size. The median reaction time for abstract words is slightly
higher (~620ms) than that of concrete words (~600ms), indicating faster
processing of concrete words on average. Abstract words also display a
more narrow interquartile range which suggests more consistent reaction
times across the abstract sample. In contrast, concrete words show a
slightly wider range and this is evident with the extreme outliers seen
in the visualization.
ggplot(final_sample, aes(x = Conc.Rating, y = ReactionTime, color = Conc.Type)) +
geom_point(size = 3) +
geom_smooth(method = "lm", color = "black") +
labs(x = "Concreteness Rating", y = "Reaction Time (ms)", color = " Word Type", title = "Concreteness and Reaction Time")

This scatter plot illustrates the relationship between concreteness
rating and reaction time, with abstract words shown in pink and concrete
words shown in blue. Overall, there is a slight negative trend
suggesting that higher concreteness ratings are associated with faster
reaction times.The spread of points and overlap show that this
relationship is relatively weak given the smaller sample size used.
Conclusion The present analysis explored the
relationship between word concreteness and reaction time while
controlling for word length and word frequency. Overall, the results
suggest that concrete words tend to be processed slightly faster than
abstract words which is consistent with prior findings. This may
indicate that other lexical factors have a smaller influence on reaction
time than initially expected, or that prior research has already
accounted for these factors. The small sample size used limits the
results. Future studies using a larger sample would help to clarify the
effect of concreteness on reaction times. Additionally, this analysis
focused only on high frequency words. The inclusion of lower frequency
words might yield different patterns.
LS0tCnRpdGxlOiAiTGV4aWNhbCBJbmZsdWVuY2VzIG9mIFJlYWN0aW9uIFRpbWU6IEEgQ29tcGFyaXNvbiBvZiBDb25jcmV0ZSBhbmQgQWJzdHJhY3QgV29yZHMiCmF1dGhvcjogIkdhYnJpZWxsYSBDb29nYW4iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KMTYgRGVjZW1iZXIsIDIwMjUgPGJyPiAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+Cjxicj4gKipCcmllZiBJbnRyb2R1Y3Rpb24qKiA8YnI+Cgo8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMjsiPgpSZWFjdGlvbiB0aW1lIG1lYXN1cmVtZW50cyBhcmUgY29tbW9ubHkgdXNlZCB0byBleHBsb3JlIGNvZ25pdGl2ZSBwcm9jZXNzaW5nIGluIGxhbmd1YWdlLiBDb3VudGxlc3MgcmVzZWFyY2ggaGFzIHByb3ZlbiBjb25jcmV0ZSB3b3JkcyAoZS5nLiwgdGFibGUsIGFwcGxlKSBhcmUgcHJvY2Vzc2VkIG1vcmUgcXVpY2tseSBhbmQgbW9yZSBhY2N1cmF0ZWx5IHRoYW4gYWJzdHJhY3Qgd29yZHMgKGUuZy4sIGp1c3RpY2UsIGhvcGUpLiBIb3dldmVyLCB0aGVyZSBpcyBsaW1pdGVkIHJlc2VhcmNoIHRoYXQgdGFrZXMgaW50byBhY2NvdW50IHBvdGVudGlhbCBpbmZsdWVudGlhbCBsZXhpY2FsIGZhY3RvcnMuIEluIHRoZSBwcmVzZW50IGFuYWx5c2lzLCB3b3JkIGxlbmd0aCBhbmQgZnJlcXVlbmN5IGFyZSBjb250cm9sbGVkIGZvciB3aGVuIGV4YW1pbmluZyByZWFjdGlvbiB0aW1lcyBvZiBjb25jcmV0ZSBhbmQgYWJzdHJhY3Qgd29yZHMuPC9kaXY+IDwvZGl2PiA8YnI+IDxicj4KCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPgoqKkRhdGEqKiA8YnI+Cgo8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMjsiPgoqVGhyZWUgZGF0YSBzZXRzIHdlcmUgdXNlZCBpbiB0aGUgcHJlc2VudCBhbmFseXNpcy4gT25seSBTaW1MZXggYW5kIFNVQlRMRVggd2VyZSBkaXJlY3RseSBpbXBvcnRlZCBpbnRvIFIsIHdoaWxlIHRoZSB0aGlyZCBkYXRhIHNldCB3YXMgdXNlZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2U6KiA8L2Rpdj4gPC9kaXY+IDxicj4gPGJyPgoKPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDI7Ij4KPHU+KipTaW1MZXg6Kio8L3U+IFByb3ZpZGVzIGNvbmNyZXRlbmVzcyByYXRpbmdzIGZvciBhIHdpZGUgcmFuZ2Ugb2YgRW5nbGlzaCB3b3Jkcywgd2hpY2ggYXJlIHVzZWQgdG8gY2xhc3NpZnkgd29yZHMgYXMgYWJzdHJhY3Qgb3IgY29uY3JldGUuIENvbmNyZXRlbmVzcyBjYXRlZ29yaWVzIGFyZSBkZXRlcm1pbmVkIHVzaW5nIGEgbWVkaWFuIHNwbGl0IG9mIHRoZSByYXRpbmdzLCB3aXRoIHdvcmRzIGJlbG93IHRoZSBtZWRpYW4gY2xhc3NpZmllZCBhcyBhYnN0cmFjdCBhbmQgd29yZHMgYWJvdmUgdGhlIG1lZGlhbiBjbGFzc2lmaWVkIGFzIGNvbmNyZXRlLgoKPHU+KipTVUJUTEVYOioqPC91PiBQcm92aWRlcyBmcmVxdWVuY3kgcmF0aW5ncyBmb3IgNzQsMjg2IEVuZ2xpc2ggd29yZHMgYmFzZWQgb24gYSBsYXJnZSBjb3JwdXMuIFRoZXNlIGZyZXF1ZW5jeSBtZWFzdXJlcyBhcmUgdXNlZCB0byBsaW1pdCB0aGUgYW5hbHlzaXMgdG8gd29yZHMgd2l0aGluIGEgY29tcGFyYWJsZSBmcmVxdWVuY3kgcmFuZ2UgdG8gcmVkdWNlIGZyZXF1ZW5jeSByZWxhdGVkIGVmZmVjdHMgb24gcmVhY3Rpb24gdGltZS4KCjx1PioqRW5nbGlzaCBMZXhpY29uIFByb2plY3Q6Kio8L3U+IFByb3ZpZGVzIHJlYWN0aW9uIHRpbWUgbWVhc3VyZXMgZm9yIGFwcHJveGltYXRlbHkgNDAsNDgxIEVuZ2xpc2ggd29yZHMgPC9kaXY+IDxicj4gPGJyPiA8YnI+IDxicj4KCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Cjxicj4gKipTSU1MRVggREFUQSoqCjwvZGl2PiA8YnI+CioqQ29kZSB1c2VkIHRvIGxvYWQgaW4gU2ltTGV4OioqPGJyPgpzZXR3ZCgifi9EZXNrdG9wIik8YnI+ClNpbUxleCA8LSByZWFkLmRlbGltKCJTaW1MZXgtOTk5LnR4dCIsIGhlYWRlciA9IFRSVUUpIDxicj4gPGJyPiA8YnI+Cjx1Pk9yaWduYWwgSW1wb3J0ZWQgRGF0YSBTZXQ6PC91PgpgYGB7cn0KaGVhZChTaW1MZXgpCmBgYAoKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyO2xpbmUtaGVpZ2h0OiAyOyI8YnI+PGJyPkZyb20gdGhlIFNpbUxleCBkYXRhIHNldCwgdGhlIG9ubHkgZGF0YSBvZiBpbnRlcmVzdCBmb3IgdGhpcyBhbmFseXNpcyBhcmUgdGhlIGNvbmNyZXRlbmVzcyByYXRpbmdzIG9mIHdvcmRzLiBTaW1MZXggY29udGFpbnMgdHdvIHdvcmQgY29sdW1ucyBhbmQgdHdvIGNvcnJlc3BvbmRpbmcgY29uY3JldGVuZXNzIGNvbHVtbnMuIFRvIGNyZWF0ZSBhIGNsZWFuIGRhdGEgc2V0LCB0aGUgdHdvIHdvcmQgY29sdW1ucyB3ZXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgd29yZCBjb2x1bW4sIGFuZCB0aGUgdHdvIGNvbmNyZXRlbmVzcyBjb2x1bW5zIHdlcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBjb25jcmV0ZW5lc3MgY29sdW1uLiBBbnkgZHVwbGljYXRlIHdvcmRzIHdlcmUgdGhlbiByZW1vdmVkIHNvIHRoYXQgZWFjaCB3b3JkIG9ubHkgYXBwZWFycyBvbmNlLjxicj4gPGJyPgoKQSBtZWRpYW4gc3BsaXQgb2YgdGhlIGNvbmNyZXRlbmVzcyByYXRpbmdzIHdhcyBwZXJmb3JtZWQsIHdpdGggd29yZHMgYmVsb3cgdGhlIG1lZGlhbiBjbGFzc2lmaWVkIGFzIEFic3RyYWN0IGFuZCB3b3JkcyBhYm92ZSB0aGUgbWVkaWFuIGNsYXNzaWZpZWQgYXMgQ29uY3JldGUuIFdvcmRzIGVxdWFsIHRvIHRoZSBtZWRpYW4gd2VyZSByZW1vdmVkIGFuZCBjb25jcmV0ZW5lc3MgcmF0aW5nIHdhcyBrZXB0IGJldHdlZW4gMy40MyBhbmQgNC4wMy4KPC9kaXY+IDxicj4gPGJyPiA8YnI+CgoqKkNvZGUgVXNlZDoqKjxicj4KPHU+VG8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gYW5kIHRoZW4gbWVyZ2UgaXQ6PC91PiA8YnI+ClNpbUxleDEgPC0gZGF0YS5mcmFtZShXb3JkID0gU2ltTGV4JHdvcmQxLCBDb25jLlJhdGluZyA9IFNpbUxleCRjb25jLncxLikgPGJyPgpTaW1MZXgyIDwtIGRhdGEuZnJhbWUoV29yZCA9IFNpbUxleCR3b3JkMiwgQ29uYy5SYXRpbmcgPSBTaW1MZXgkY29uYy53Mi4pIDxicj4KU2ltTGV4X0NvbWJpbmVkV29yZHMgPC0gcmJpbmQoU2ltTGV4MSwgU2ltTGV4MikgPGJyPiA8YnI+Cgo8dT5UbyBjcmVhdGUgYSBtZWRpYW4gc3BsaXQgYW5kIGEgY2F0ZWdvcml6YXRpb24gY29sdW1uOjwvdT4gPGJyPgptZWRpYW5fdmFsdWUgPC0gbWVkaWFuKFNpbUxleF9Db21iaW5lZFdvcmRzJENvbmMuUmF0aW5nKTxicj4gClNpbUxleF9Ob01lZGlhbiA8LSBTaW1MZXhfQ29tYmluZWRXb3JkcyAlPiUgPGJyPgogIGZpbHRlcihDb25jLlJhdGluZyAhPSBtZWRpYW5fdmFsdWUpIDxicj4gClNpbUxleF9GaW5hbERhdGFzZXQgPC0gU2ltTGV4X05vTWVkaWFuICU+JSA8YnI+CiAgbXV0YXRlKENvbmMuVHlwZSA9IGNhc2Vfd2hlbihDb25jLlJhdGluZyA+IG1lZGlhbl92YWx1ZSB+ICJDb25jcmV0ZSIsIENvbmMuUmF0aW5nIDwgbWVkaWFuX3ZhbHVlIH4gIkFic3RyYWN0IikpIDxicj4gPGJyPgogIAo8dT5UbyByZW1vdmUgZHVwbGljYXRlczo8L3U+IDxicj4KU2ltTGV4X0ZpbmFsRGF0YXNldCA8LSBTaW1MZXhfRmluYWxEYXRhc2V0WyFkdXBsaWNhdGVkKFNpbUxleF9Db21iaW5lZFdvcmRzJFdvcmQpLCBdPGJyPgoKPHU+VG8ga2VlcCBjb25jcmV0ZW5lc3MgcmF0aW5nIHdpdGhpbiBhIHJhbmdlOjwvdT4gPGJyPgptZWRpYW5fYWRqYWNlbnQgPC0gU2ltTGV4X0ZpbmFsRGF0YXNldCAlPiUgPGJyPgogIGZpbHRlcihDb25jLlJhdGluZyA+PSAzLjQzICYgQ29uYy5SYXRpbmcgPD0gNC4wMykgPGJyPgoKPHU+U3BsaXQgYnkgY29uY3JldGVuZXNzIHR5cGUgYW5kIHRoZW4gbWVyZ2U6PC91PiA8YnI+CmFic3RyYWN0X21lZGlhbl9hZGphY2VudCA8LSBtZWRpYW5fYWRqYWNlbnQgJT4lIGZpbHRlcihDb25jLlR5cGUgPT0gIkFic3RyYWN0IikgPGJyPgpjb25jcmV0ZV9tZWRpYW5fYWRqYWNlbnQgPC0gbWVkaWFuX2FkamFjZW50ICU+JSBmaWx0ZXIoQ29uYy5UeXBlID09ICJDb25jcmV0ZSIpIDxicj4KU2ltTGV4X0ZpbmFsRGF0YXNldCA8LSBtZWRpYW5fYWRqYWNlbnQgPGJyPiA8YnI+IDxicj4KCgoKCjx1PlRoaXMgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHNldCBub3cgY29udGFpbmluZyA3NyB3b3Jkczo8L3U+CmBgYHtyfQpoZWFkKFNpbUxleF9GaW5hbERhdGFzZXQpCmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8YnI+IDxicj4gPGJyPiA8YnI+ICoqU1VCVExFWCBEQVRBOioqCjwvZGl2PiA8YnI+CgoqKkNvZGUgdXNlZCB0byBsb2FkIGluIFNVQlRMRVg6KiogPGJyPgppbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKSA8YnI+CmxpYnJhcnkocmVhZHhsKSA8YnI+ClNVQlRMRVggPC0gcmVhZF9leGNlbCgiU1VCVExFWHVzRXhjZWwyMDA3Lnhsc3giKSA8YnI+IDxicj4gPGJyPgoKPHU+T3JpZ2luYWwgSW1wb3J0ZWQgRGF0YSBTZXQ6PC91PgpgYGB7cn0KaGVhZChTVUJUTEVYKQpgYGAKCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjtsaW5lLWhlaWdodDogMjsiPGJyPjxicj5Gcm9tIHRoZSBTVUJUTEVYIGRhdGEgc2V0LCB0aGUgb25seSBkYXRhIG9mIGludGVyZXN0IGZvciB0aGlzIGFuYWx5c2lzIGFyZSB0aGUgd29yZHMgYW5kIHRoZWlyIGZyZXF1ZW5jeSBjb3VudHMuIEEgbmV3IGNvbHVtbiB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZWFjaCB3b3JkIHdhcyBhZGRlZC4gV29yZHMgc2hvcnRlciB0aGFuIDMgbGV0dGVycyBvciBsb25nZXIgdGhhbiA3IGxldHRlcnMgd2VyZSByZW1vdmVkIHRvIHJlZHVjZSBwb3RlbnRpYWwgZWZmZWN0cy4gPGJyPiA8YnI+CgpBIG1lZGlhbiBzcGxpdCBvZiB0aGUgRlJFUWNvdW50IGNvbHVtbiB3YXMgdGhlbiBwZXJmb3JtZWQuIFdvcmRzIHdpdGggZnJlcXVlbmN5IGNvdW50cyBhYm92ZSB0aGUgbWVkaWFuIHdlcmUgbGFiZWxlZCBoaWdoIGZyZXF1ZW5jeSwgYW5kIHdvcmRzIGJlbG93IHRoZSBtZWRpYW4gd2VyZSBsYWJlbGVkIGxvdyBmcmVxdWVuY3kuIEZyZXF1ZW5jaWVzIGVxdWFsIHRvIHRoZSBtZWRpYW4gd2VyZSBub3QgY29uc2lkZXJlZC4gQW55IGR1cGxpY2F0ZSB3b3JkcyB3ZXJlIHJlbW92ZWQuIFRoZSByZXN1bHRpbmcgZGF0YSBzZXQgY29udGFpbnMgb25seSB0aGUgbmVjZXNzYXJ5IGNvbHVtbnMgZm9yIGFuYWx5c2lzLiA8L2Rpdj4gPGJyPiA8YnI+IDxicj4KCgoqKkNvZGUgVXNlZDoqKiA8YnI+Cjx1PlRvIGFkZCB3b3JkIGxlbmd0aCBjb2x1bW46PC91PiA8YnI+ClNVQkxURVggPC0gU1VCVExFWCAlPiUgPGJyPgogIG11dGF0ZShXb3JkX0xlbmd0aCA9IG5jaGFyKFdvcmQpKSA8YnI+IDxicj4KPHU+VG8gcmVtb3ZlIGlycmVsZXZhbnQgY29sdW1ucyBvZiBkYXRhOjwvdT4gPGJyPgpTVUJUTEVYX0NsZWFuIDwtIFNVQlRMRVggJT4lIDxicj4KICBzZWxlY3QoV29yZCwgTGVuZ3RoLCBGUkVRY291bnQpIDxicj4gPGJyPgo8dT5UbyBmaWx0ZXIgd29yZCBsZW5ndGg6PC91PiA8YnI+ClNVQlRMRVhfQ2xlYW4gPC0gU1VCVExFWF9DbGVhbiAlPiUgPGJyPgogIGZpbHRlcihMZW5ndGggPj0gMyAmIExlbmd0aCA8PSA3KSA8YnI+IDxicj4KICAKPHU+VG8gbWVkaWFuIHNwbGl0IHdvcmQgZnJlcXVlbmN5IGFuZCBhZGQgZnJlcXVlbmN5IHR5cGU6PC91PiA8YnI+Ck1lZGlhbl9GcmVxIDwtIG1lZGlhbihTVUJUTEVYX0NsZWFuJEZSRVFjb3VudCkgPGJyPgpTVUJUTEVYX0ZpbmFsRGF0YXNldCA8LSBTVUJUTEVYX0NsZWFuICU+JSA8YnI+CiAgbXV0YXRlKGZyZXEudHlwZSA9IGlmZWxzZShGUkVRY291bnQgPiBNZWRpYW5fRnJlcSwgIkhpZ2giLCAiTG93IikpIDxicj4gPGJyPgogIAo8dT5UbyByZW1vdmUgZHVwbGljYXRlczo8L3U+IDxicj4KU1VCVExFWF9GaW5hbERhdGFzZXQgPC0gU1VCVExFWF9GaW5hbERhdGFzZXRbIWR1cGxpY2F0ZWQoU1VCVExFWF9GaW5hbERhdGFzZXQkV29yZCksIF0gPGJyPiA8YnI+IDxicj4KCjx1PlRoaXMgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHNldDo8L3U+CmBgYHtyfQpoZWFkKFNVQlRMRVhfRmluYWxEYXRhc2V0KQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBsaW5lLWhlaWdodDogMjsgIj4gPGJyPiA8YnI+ICoqU2FtcGxlIFNlbGVjdGlvbioqCgpUbyBhbmFseXplIHJlYWN0aW9uIHRpbWVzIGZvciBjb25jcmV0ZSBhbmQgYWJzdHJhY3Qgd29yZHMgd2hpbGUgYWxzbyBjb250cm9sbGluZyBmb3Igd29yZCBsZW5ndGggYW5kIGZyZXF1ZW5jeSwgYSBzdWJzZXQgb2Ygd29yZHMgd2FzIHNlbGVjdGVkIGZyb20gdGhlIGNsZWFuZWQgU2ltTGV4IGFuZCBTVUJUTEVYIGRhdGEgc2V0cy4KMjggYWJzdHJhY3Qgd29yZHMgb2YgaGlnaCBmcmVxdWVuY3kgd2VyZSBzZWxlY3RlZCB3aGlsZSBvbmx5IDI0IGNvbmNyZXRlIHdvcmRzIG9mIGhpZ2ggZnJlcXVlbmN5IHdlcmUgc2VsZWN0ZWQuIE5vdGUgdGhhdCBvbmx5IGhpZ2ggZnJlcXVlbmN5IHdvcmRzIHdlcmUgY29uc2lkZXJlZC4KVGhlIHJlbGV2YW50IGRhdGEgZnJvbSBTaW1MZXggYW5kIFNVQlRMRVggd2VyZSB0aGVuIGNvbXBpbGVkIGludG8gc2VwYXJhdGUgdGFibGVzIGNvbnRhaW5pbmcgb25seSB0aGUgY29sdW1ucyBuZWVkZWQgZm9yIGFuYWx5c2lzICood29yZCwgY29uY3JldGVuZXNzIHR5cGUsIGNvbmNyZXRlbmVzcyByYXRpbmcsIGFuZCByZWFjdGlvbiB0aW1lKS4qIFJlYWN0aW9uIHRpbWUgd2FzIGFkZGVkIGluIG1hbnVhbGx5IGZyb20gdGhlIEVuZ2xpc2ggTGV4aWNvbiBQcm9qZWN0IGRhdGEgc2V0LiA8L2Rpdj4gPGJyPiA8YnI+IDxicj4KCjx1PkhlcmUgaXMgdGhlIHJlc3VsdGluZyBkYXRhIHRhYmxlOjwvdT4KYGBge3J9CmhlYWQoZmluYWxfc2FtcGxlKQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyAiPiA8YnI+ICoqUmVzdWx0cyoqIDxicj4KCmBgYHtyfQpnZ3Bsb3QoZmluYWxfc2FtcGxlLCBhZXMoeCA9IENvbmMuVHlwZSwgeSA9IFJlYWN0aW9uVGltZSwgZmlsbCA9IENvbmMuVHlwZSkpICsKZ2VvbV9ib3hwbG90KGFscGhhID0gMC43KSArCmdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNSwgY29sb3IgPSAiYmxhY2siKSArCmxhYnMoeCA9ICJXb3JkIFR5cGUiLCB5ID0gIlJlYWN0aW9uIFRpbWUgKG1zKSIsIHRpdGxlID0gIlJlYWN0aW9uIFRpbWVzIGZvciBBYnN0cmFjdCB2cy4gQ29uY3JldGUgV29yZHMiKSArIGNvb3JkX2ZsaXAoKQpgYGAKPGRpdiBzdHlsZSA9ICJsaW5lLWhlaWdodDogMjsgIj4gVGhlIGJveCBwbG90IGNvbXBhcmVzIHJlYWN0aW9uIHRpbWVzIChpbiBtaWxsaXNlY29uZHMpIGZvciBhYnN0cmFjdCBhbmQgY29uY3JldGUgd29yZHMuIE92ZXJhbGwsIHJlYWN0aW9uIHRpbWVzIGZvciBhYnN0cmFjdCBhbmQgY29uY3JldGUgd29yZHMgYXJlIGZhaXJseSBzaW1pbGFyLCBob3dldmVyIGEgc21hbGxlciBzYW1wbGUgc2l6ZSB3YXMgdXNlZCB3aGljaCBjb3VsZCBiZSBhbiBleHBsYW5hdGlvbiBmb3IgdGhlIHNpbWlsYXJpdGllcy4gUmVzdWx0cyBtYXkgdmFyeSB3aXRoIGEgbGFyZ2VyIHNhbXBsZSBzaXplLiBUaGUgbWVkaWFuIHJlYWN0aW9uIHRpbWUgZm9yIGFic3RyYWN0IHdvcmRzIGlzIHNsaWdodGx5IGhpZ2hlciAofjYyMG1zKSB0aGFuIHRoYXQgb2YgY29uY3JldGUgd29yZHMgKH42MDBtcyksIGluZGljYXRpbmcgZmFzdGVyIHByb2Nlc3Npbmcgb2YgY29uY3JldGUgd29yZHMgb24gYXZlcmFnZS4gQWJzdHJhY3Qgd29yZHMgYWxzbyBkaXNwbGF5IGEgbW9yZSBuYXJyb3cgaW50ZXJxdWFydGlsZSByYW5nZSB3aGljaCBzdWdnZXN0cyBtb3JlIGNvbnNpc3RlbnQgcmVhY3Rpb24gdGltZXMgYWNyb3NzIHRoZSBhYnN0cmFjdCBzYW1wbGUuIEluIGNvbnRyYXN0LCBjb25jcmV0ZSB3b3JkcyBzaG93IGEgc2xpZ2h0bHkgd2lkZXIgcmFuZ2UgYW5kIHRoaXMgaXMgZXZpZGVudCB3aXRoIHRoZSBleHRyZW1lIG91dGxpZXJzIHNlZW4gaW4gdGhlIHZpc3VhbGl6YXRpb24uPC9kaXY+IDwvZGl2PiA8YnI+CgpgYGB7cn0KZ2dwbG90KGZpbmFsX3NhbXBsZSwgYWVzKHggPSBDb25jLlJhdGluZywgeSA9IFJlYWN0aW9uVGltZSwgY29sb3IgPSBDb25jLlR5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnMoeCA9ICJDb25jcmV0ZW5lc3MgUmF0aW5nIiwgeSA9ICJSZWFjdGlvbiBUaW1lIChtcykiLCBjb2xvciA9ICIgV29yZCBUeXBlIiwgdGl0bGUgPSAiQ29uY3JldGVuZXNzIGFuZCBSZWFjdGlvbiBUaW1lIikKYGBgCjxkaXYgc3R5bGUgPSAibGluZS1oZWlnaHQ6IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgIj4gVGhpcyBzY2F0dGVyIHBsb3QgaWxsdXN0cmF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmNyZXRlbmVzcyByYXRpbmcgYW5kIHJlYWN0aW9uIHRpbWUsIHdpdGggYWJzdHJhY3Qgd29yZHMgc2hvd24gaW4gcGluayBhbmQgY29uY3JldGUgd29yZHMgc2hvd24gaW4gYmx1ZS4gT3ZlcmFsbCwgdGhlcmUgaXMgYSBzbGlnaHQgbmVnYXRpdmUgdHJlbmQgc3VnZ2VzdGluZyB0aGF0IGhpZ2hlciBjb25jcmV0ZW5lc3MgcmF0aW5ncyBhcmUgYXNzb2NpYXRlZCB3aXRoIGZhc3RlciByZWFjdGlvbiB0aW1lcy5UaGUgc3ByZWFkIG9mIHBvaW50cyBhbmQgb3ZlcmxhcCBzaG93IHRoYXQgdGhpcyByZWxhdGlvbnNoaXAgaXMgcmVsYXRpdmVseSB3ZWFrIGdpdmVuIHRoZSBzbWFsbGVyIHNhbXBsZSBzaXplIHVzZWQuPGJyPiA8YnI+IDxicj4KCioqQ29uY2x1c2lvbioqIDxicj4gPGJyPgpUaGUgcHJlc2VudCBhbmFseXNpcyBleHBsb3JlZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29yZCBjb25jcmV0ZW5lc3MgYW5kIHJlYWN0aW9uIHRpbWUgd2hpbGUgY29udHJvbGxpbmcgZm9yIHdvcmQgbGVuZ3RoIGFuZCB3b3JkIGZyZXF1ZW5jeS4gT3ZlcmFsbCwgdGhlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IGNvbmNyZXRlIHdvcmRzIHRlbmQgdG8gYmUgcHJvY2Vzc2VkIHNsaWdodGx5IGZhc3RlciB0aGFuIGFic3RyYWN0IHdvcmRzIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCBwcmlvciBmaW5kaW5ncy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCBvdGhlciBsZXhpY2FsIGZhY3RvcnMgaGF2ZSBhIHNtYWxsZXIgaW5mbHVlbmNlIG9uIHJlYWN0aW9uIHRpbWUgdGhhbiBpbml0aWFsbHkgZXhwZWN0ZWQsIG9yIHRoYXQgcHJpb3IgcmVzZWFyY2ggaGFzIGFscmVhZHkgYWNjb3VudGVkIGZvciB0aGVzZSBmYWN0b3JzLiAKVGhlIHNtYWxsIHNhbXBsZSBzaXplIHVzZWQgbGltaXRzIHRoZSByZXN1bHRzLiBGdXR1cmUgc3R1ZGllcyB1c2luZyBhIGxhcmdlciBzYW1wbGUgd291bGQgaGVscCB0byBjbGFyaWZ5IHRoZSBlZmZlY3Qgb2YgY29uY3JldGVuZXNzIG9uIHJlYWN0aW9uIHRpbWVzLiBBZGRpdGlvbmFsbHksIHRoaXMgYW5hbHlzaXMgZm9jdXNlZCBvbmx5IG9uIGhpZ2ggZnJlcXVlbmN5IHdvcmRzLiBUaGUgaW5jbHVzaW9uIG9mIGxvd2VyIGZyZXF1ZW5jeSB3b3JkcyBtaWdodCB5aWVsZCBkaWZmZXJlbnQgcGF0dGVybnMuIDwvZGl2PiA8YnI+IDxicj4gPGJyPiA8YnI+IDxicj4gPGJyPiA8YnI+