library(tidyverse)
library(plotly)
connor_survey <- read_csv("https://docs.google.com/spreadsheets/d/1WDcxG3s01lN-vDpLROUwdDU2l8xionMTqcSNd3s91t4/export?format=csv")
Parsed with column specification:
cols(
Timestamp = [31mcol_character()[39m,
`In a regular week, how many days per week do you exercise?` = [32mcol_double()[39m,
`When you exercise, how many minutes do you exercise for?` = [31mcol_character()[39m,
`When you exercise, which kind of exercises do you normally do?` = [31mcol_character()[39m,
`What is your primary reason for exercising?` = [31mcol_character()[39m,
`Where do you primarily exercise at?` = [31mcol_character()[39m,
`Are you a student-athlete?` = [31mcol_character()[39m,
`What is your year in school?` = [31mcol_character()[39m,
`What is your age?` = [31mcol_character()[39m
)
For my survey, I was interested in exercise habits of the MSUB student population. I decided to include different parameters of measured exercise type, frequency, and duration, the reason for exercising, and where they exercise. I also included a question asking whether they were a student-athlete or not, because that population may return different answers for exercise habits.
glimpse(connor_survey)
Observations: 12
Variables: 9
$ Timestamp [3m[90m<chr>[39m[23m "3/16/2020 15:53:29", "3/18/2020 15:13:29", "3/18/2020 15:22:49", "3/18…
$ `In a regular week, how many days per week do you exercise?` [3m[90m<dbl>[39m[23m 5, 4, 3, 5, 3, 4, 2, 4, 4, 5, 1, 5
$ `When you exercise, how many minutes do you exercise for?` [3m[90m<chr>[39m[23m "21-30", "60+", "51-60", "41-50", "51-60", "51-60", "51-60", "51-60", "…
$ `When you exercise, which kind of exercises do you normally do?` [3m[90m<chr>[39m[23m "Medium to High Intensity Cardio (Running/Biking/Swimming)", "Resistanc…
$ `What is your primary reason for exercising?` [3m[90m<chr>[39m[23m "Recreation", "Clear the mind", "Clear the mind", "Improve Physique", "…
$ `Where do you primarily exercise at?` [3m[90m<chr>[39m[23m "Outdoors", "Outdoors", "Outdoors", "Local fitness club", "Local fitnes…
$ `Are you a student-athlete?` [3m[90m<chr>[39m[23m "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No"
$ `What is your year in school?` [3m[90m<chr>[39m[23m "Junior", "Senior", "Non-traditional Student", "Graduate Student", "Gra…
$ `What is your age?` [3m[90m<chr>[39m[23m "18-20", "21-23", "21-23", "24-26", "21-23", "24-26", "21-23", "24-26",…
Here are all the variables for my survey. For exercise frequency and duration, I asked how many days per week (in a typical week) they exercise, and for how many minutes (in a typical session) each time. I asked about what kind of exercise they typically do: low to high intensity cardio, strength/resistance training, yoga/stretching, team sports, or outdoor recreation. I asked their reason for exercising: for maintaining general fitness, for athletic requirements (primarily aimed at student-athletes), to “clear the mind”, for recreation, as a social activity, or to improve their physique. I asked where they typically exercise at: a school gym or recreation center, a local fitness club, at home, or outdoors. I asked their year in school (freshman, sophmore, junior, senior, graduate student, or non-traditional) and their age (18-20, 21-23, 24-26, 27-29, or 30+). For analysis purposes I’m going to focus on what year in school the participants are, as I’m more interested in their schooling level compared to their general age.
connor_survey <- connor_survey %>%
rename(days_per_week = `In a regular week, how many days per week do you exercise?`) %>%
rename(exercise_minutes = `When you exercise, how many minutes do you exercise for?`) %>%
rename(exercise_type = `When you exercise, which kind of exercises do you normally do?`) %>%
rename(exercise_reason = `What is your primary reason for exercising?`) %>%
rename(exercise_location = `Where do you primarily exercise at?`) %>%
rename(student_athlete = `Are you a student-athlete?`) %>%
rename(year_in_school = `What is your year in school?`) %>%
rename(age = `What is your age?`)
connor_survey <- connor_survey %>%
mutate(days_per_week= as.numeric(recode(days_per_week,
"0" = "0",
"1" = "1",
"2" = "2",
"3" = "3",
"4" = "4",
"5" = "5",
"6" = "6",
"7" = "7"))) %>%
mutate(exercise_minutes= as.numeric(recode(exercise_minutes, "1-10" = "1", "11-20" = "2", "21-30" = "3", "31-40" = "4", "41-50" = "5", "51-60" = "6", "60+" = "7"))) %>%
mutate(exercise_type = as.numeric(recode(exercise_type, "Resistance/Strength Training (Weightlifting)" = "1", "Medium to High Intensity Cardio (Running/Biking/Swimming)" = "2", "Yoga" = "3", "Stretching" = "4", "Low Intensity Cardio (Walking)" = "5", "Team Sports (Soccer/Basketball etc)" = "6", "Outdoor/Recreational Sports (Skiing/Rock Climbing/Hiking etc)" = "7"))) %>%
mutate(exercise_reason= as.numeric(recode(exercise_reason, "General fitness/Health" = "1", "Required for athletics" = "2", "Clear the mind" = "3", "Social Activity" = "4", "Recreation" = "5", "Improve Physique" = "6"))) %>%
mutate(exercise_location= as.numeric(recode(exercise_location, "School Gym/Recreation Center" = "1", "Local fitness club" = "2", "Home" = "3", "Outdoors" = "4"))) %>%
mutate(student_athlete= as.numeric(recode(student_athlete, "Yes" = "1", "No" = "2"))) %>%
mutate(year_in_school= as.numeric(recode(year_in_school, "Freshman" = "1", "Sophomore" = "2", "Junior" = "3", "Senior" = "4", "Graduate Student" = "5", "Non-traditional Student" = "6"))) %>%
mutate(age= as.numeric(recode(age, "18-20" = "1", "21-23" = "2", "24-26" = "3", "27-29" = "4", "30+" = "5")))
glimpse(connor_survey)
Observations: 12
Variables: 9
$ Timestamp [3m[90m<chr>[39m[23m "3/16/2020 15:53:29", "3/18/2020 15:13:29", "3/18/2020 15:22:49", "3/18/2020 16:13:52", "3/18/2020 16:39:09", "3/18/20…
$ days_per_week [3m[90m<dbl>[39m[23m 5, 4, 3, 5, 3, 4, 2, 4, 4, 5, 1, 5
$ exercise_minutes [3m[90m<dbl>[39m[23m 3, 7, 6, 5, 6, 6, 6, 6, 6, 4, 4, 7
$ exercise_type [3m[90m<dbl>[39m[23m 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 3, 1
$ exercise_reason [3m[90m<dbl>[39m[23m 5, 3, 3, 6, 3, 3, 6, 5, 4, 5, 3, 1
$ exercise_location [3m[90m<dbl>[39m[23m 4, 4, 4, 2, 2, 2, 2, 3, 2, 1, 4, 1
$ student_athlete [3m[90m<dbl>[39m[23m 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
$ year_in_school [3m[90m<dbl>[39m[23m 3, 4, 6, 5, 5, 5, 6, 6, 5, 4, 4, 4
$ age [3m[90m<dbl>[39m[23m 1, 2, 2, 3, 2, 3, 2, 3, 2, 2, 2, 2
Here are all the verbal responses recoded to numerical values, in order to perform statistical analysis. In general, the lower the number, the lower the age/frequency/duration of the responses. Location, exercise type, and reason are all coded to a specific value.
Student athlete results
connor_survey %>%
count(student_athlete)
Before going into the analysis, I should note the response of the student-athlete question. I received a total of 12 survey responses. The student-athlete answer was coded as “1” representing “yes” and “2” representing “no.” From the survey responses there are zero student-athletes, so there will not be any analysis of this question.
National DPHHS guidelines for health, Days by Minutes
I was interested to see how the exercise responses of my sample compared to the guidelines for health and fitness as recommended by the National Department of Health and Human Services. The guidelines are as follows:
“For substantial health benefits, adults should do at least 150 minutes to 300 minutes a week of moderate-intensity, or 75 minutes to 150 minutes a week of vigorous-intensity aerobic physical activity, or an equivalent combination of moderate- and vigorous-intensity aerobic activity”
I decided to break it down into a daily amount: over one week, a person would need to exercise at least 21-43 minutes a day (of aerobic activity) of moderate to vigorous activity to meet the recommended guidelines.
connor_survey %>%
ggplot(aes(x=exercise_type, fill=exercise_minutes))+
geom_bar(fill="gold")+
theme_classic()

# plot_ly(x=~exercise_type, y=~exercise_minutes) %>%
#add_bars()
#add_bars(y=~5, x=~2) %>%
#add_bars(y=~3, x=~2)
The graph above shows the breakdown of the survey responses of exercise type and duration of exercise. Regarding type, “1” is strength training (such as lifting weights), “2” is medium to high intensity cardio (such as running), and “3” is yoga/stretching.
According to the graph, the vast majority of the respondants meet the chronological requirements for maintaining fitness, but most are doing strength training instead of cardio. While there is certainly nothing wrong with doing strength training it’s interesting to see that most respondants favor it over cardio, even though cardio is recommended over strength training for “optimal” general health.
Year by days per week, minutes per session
This is probably the distribution of greatest interest to me. It signifies the general activity habits of the student population, regardless of what specific kind of activity they do which is the most important factor for developing healthy habits. As long as you stay active consistently, you’re doing it right!
connor_survey %>%
plot_ly(x=~days_per_week, y=~exercise_minutes, z=~year_in_school) %>%
add_histogram2dcontour(nbinsx=7, nbinsy=7) %>%
layout(title = "The typical amount of exercise per week by MSUB students", xaxis = list(title = "Days per week", yaxis = list(title = "Minutes per session", zaxis = list("Year in School"))))
NA
Here is a heatmap of the number of days per week MSUB students typically exercise (on the x-axis), and how long they exercise for during a session (on the y-axis). The number of minutes are coded into incremements of 10, beginning at 1-10 minutes equalling “1”. The year in school is shown by color, with lighter shades indicating a higher year (i.e., a senior will indicate a yellow while a freshman will be dark). According to the heatmap, most of the students are exercising 3-4 days per week for 50-60 minutes each. Although the age is slightly skewed toward older students taking the survey, it’s very encouraging to see the general trend of students report being active fairly frequently.
Year in school and location, year in school and reason
I was interested to see the distribution between year in school, the location of exercise, and reasons for exercising. Given that college students have free access to the school gym, I imagined that most of the responses would reflect that. However, I was unsure as to what reasons may be most prominent, since everyone has different fitness goals and life situations.
connor_survey %>%
plot_ly(x=~exercise_location, y=~exercise_reason, z=~year_in_school) %>%
add_histogram2dcontour(nbinsx=7, nbinsy=7) %>%
layout(title = "The typical exercise reasons and locations in MSUB students", xaxis = list(title = "Location", yaxis = list(title = "Reason for exercising", zaxis = list("Year in School"))))
NA
The heatmap illustrates the three-way relationship of the year in school, location, and reason for exercising variables. The location coding is shown on the x-axis, with “School Gym/Recreation Center” being 1, “Local fitness club” being 2, “Home” being 3, and “Outdoors” being 4. The exercise reason coding is shown on the y-axis, with General fitness/Health" being 1, “Required for athletics” being 2, “Clear the mind” being 3, “Social Activity” being 4, “Recreation” being 5, “Improve Physique” being 6.
According to the heatmap, the most concentrated area indicates that the majority of the respondents are at least juniors in college who exercise outdoors to “clear their mind.” Since we are in Montana, this isn’t too surprising. With the abundance of outdoor activities available to us, it makes complete sense to spend lots of time exercising outside. Other areas of concentration include exercising at a local fitness club as a social activity, and exercising at a local fitness club to improve their physique.
Minutes and location
I was curious to see the relationship between how long people exercise for in relation to where they exercise at.
connor_survey %>%
ggplot(aes(x=exercise_location, fill=exercise_minutes))+
geom_bar(fill="navy blue")+
labs(title = "Number of minutes per session and location of exercise in MSUB students", x="Location", y="Minutes per session")+
theme_classic()

# plot_ly(x=~exercise_location, y=~exercise_minutes) %>%
# add_bars() %>%
#layout(title = "Number of minutes per session and location of exercise in MSUB students", xaxis = list(title = "Location", yaxis = list(title = "Minutes per session")))
The number of minutes are shown on the y-axis, coded in ten-minute increments. One to ten minutes is “1”, 11-20 minutes is “2”, 21-30 minutes is “3”, 31-40 minutes is “4”, 41-50 minutes is “5”, 51-60 minutes is “6”, and 60+ minutes is “7.” The graph above shows that most of the respondents exercise either at a fitness club (2) or outdoors (4). Those at a fitness club typically spend just under an hour there, and those outside spend around 40 minutes doing it. From this graph, those who exercise at a fitness club seem to spend more time exercising there compared to the school gym (1) or at home (3).
Reason for exercising and days spent exercising per week
I decided to look at why people exercise and how many days per week they spend doing it. It could be reasoned that different reasons may warrant a different amount of days exercising. For example, someone who is looking to maintain general fitness may spend less time exercising compared to somone who is exercising to improve their physique or if it’s required for athletics.
connor_survey %>%
ggplot(aes(x=exercise_reason, fill=days_per_week))+
geom_bar(fill="gold")+
labs(title = "Reason for exercising and how many days spent exercising per week", x="Reason", y="Days per week")+
theme_classic()

The graph above shows the results, and there are some clear results. Those who exercise for “clearing the mind” (3) spend more days per week exercising compared to any other reason. The second highest weekly-exercisers are those doing it for recreation (5) who spend three days per week doing it. Since college is a stressful time, it seems that most of the sample population is using exercise as a way to destress.
Discussion
While the number of respondents was low and the age of respondents was skewed toward the older range of college, the results show that MSUB’s student popultion is fairly active and healthy. This is encouraging to note, as college can be a stressful time and exercise is an excellent way to stay on top of mental health and take care of yourself. The locations that seem to be most prominent include the outdoors and fitness centers, and the most students are exercising for at least 40 minutes a few days a week. Improvements to this analysis include a larger sample population and more in-depth survey questions. This could include giving participants the option to select multiple responses, which might reflect more accurate exercise habits since most people have a variety of reasons for exercising and perform different activities.
Generally speaking, the fitness habits of the MSUB student population are healthy. One area that could be improved upon is the frequency of aerobic activity performed. Most of the respondents indicated they preferred other activities over doing cardio work. Since fitness guidelines recommend having a healthy cardiovascular system as a “hallmark” of fitness, it might be recommended to go for a jog, bike ride, or swim a little more frequently. However there are many lifestyle factors going into maintaining a healthy lifestlye, and as it has been said “the best exercise regiment is the one you follow” which seems to be the case with MSUB’s students.
LS0tCnRpdGxlOiAiQ29ubm9yIFN1cnZleSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgoKYGBge3J9CmNvbm5vcl9zdXJ2ZXkgPC0gcmVhZF9jc3YoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFXRGN4RzNzMDFsTi12RHBMUk9Vd2REVTJsOHhpb25NVHFjU05kM3M5MXQ0L2V4cG9ydD9mb3JtYXQ9Y3N2IikKYGBgCkZvciBteSBzdXJ2ZXksIEkgd2FzIGludGVyZXN0ZWQgaW4gZXhlcmNpc2UgaGFiaXRzIG9mIHRoZSBNU1VCIHN0dWRlbnQgcG9wdWxhdGlvbi4gSSBkZWNpZGVkIHRvIGluY2x1ZGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgb2YgbWVhc3VyZWQgZXhlcmNpc2UgdHlwZSwgZnJlcXVlbmN5LCBhbmQgZHVyYXRpb24sIHRoZSByZWFzb24gZm9yIGV4ZXJjaXNpbmcsIGFuZCB3aGVyZSB0aGV5IGV4ZXJjaXNlLiBJIGFsc28gaW5jbHVkZWQgYSBxdWVzdGlvbiBhc2tpbmcgd2hldGhlciB0aGV5IHdlcmUgYSBzdHVkZW50LWF0aGxldGUgb3Igbm90LCBiZWNhdXNlIHRoYXQgcG9wdWxhdGlvbiBtYXkgcmV0dXJuIGRpZmZlcmVudCBhbnN3ZXJzIGZvciBleGVyY2lzZSBoYWJpdHMuIAoKYGBge3J9CmdsaW1wc2UoY29ubm9yX3N1cnZleSkKYGBgCkhlcmUgYXJlIGFsbCB0aGUgdmFyaWFibGVzIGZvciBteSBzdXJ2ZXkuIApGb3IgZXhlcmNpc2UgZnJlcXVlbmN5IGFuZCBkdXJhdGlvbiwgSSBhc2tlZCBob3cgbWFueSBkYXlzIHBlciB3ZWVrIChpbiBhIHR5cGljYWwgd2VlaykgdGhleSBleGVyY2lzZSwgYW5kIGZvciBob3cgbWFueSBtaW51dGVzIChpbiBhIHR5cGljYWwgc2Vzc2lvbikgZWFjaCB0aW1lLiAKSSBhc2tlZCBhYm91dCB3aGF0IGtpbmQgb2YgZXhlcmNpc2UgdGhleSB0eXBpY2FsbHkgZG86IGxvdyB0byBoaWdoIGludGVuc2l0eSBjYXJkaW8sIHN0cmVuZ3RoL3Jlc2lzdGFuY2UgdHJhaW5pbmcsIHlvZ2Evc3RyZXRjaGluZywgdGVhbSBzcG9ydHMsIG9yIG91dGRvb3IgcmVjcmVhdGlvbi4KSSBhc2tlZCB0aGVpciByZWFzb24gZm9yIGV4ZXJjaXNpbmc6IGZvciBtYWludGFpbmluZyBnZW5lcmFsIGZpdG5lc3MsIGZvciBhdGhsZXRpYyByZXF1aXJlbWVudHMgKHByaW1hcmlseSBhaW1lZCBhdCBzdHVkZW50LWF0aGxldGVzKSwgdG8gImNsZWFyIHRoZSBtaW5kIiwgZm9yIHJlY3JlYXRpb24sIGFzIGEgc29jaWFsIGFjdGl2aXR5LCBvciB0byBpbXByb3ZlIHRoZWlyIHBoeXNpcXVlLiAKSSBhc2tlZCB3aGVyZSB0aGV5IHR5cGljYWxseSBleGVyY2lzZSBhdDogYSBzY2hvb2wgZ3ltIG9yIHJlY3JlYXRpb24gY2VudGVyLCBhIGxvY2FsIGZpdG5lc3MgY2x1YiwgYXQgaG9tZSwgb3Igb3V0ZG9vcnMuIApJIGFza2VkIHRoZWlyIHllYXIgaW4gc2Nob29sIChmcmVzaG1hbiwgc29waG1vcmUsIGp1bmlvciwgc2VuaW9yLCBncmFkdWF0ZSBzdHVkZW50LCBvciBub24tdHJhZGl0aW9uYWwpIGFuZCB0aGVpciBhZ2UgKDE4LTIwLCAyMS0yMywgMjQtMjYsIDI3LTI5LCBvciAzMCspLiBGb3IgYW5hbHlzaXMgcHVycG9zZXMgSSdtIGdvaW5nIHRvIGZvY3VzIG9uIHdoYXQgeWVhciBpbiBzY2hvb2wgdGhlIHBhcnRpY2lwYW50cyBhcmUsIGFzIEknbSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlaXIgc2Nob29saW5nIGxldmVsIGNvbXBhcmVkIHRvIHRoZWlyIGdlbmVyYWwgYWdlLiAKCmBgYHtyfQpjb25ub3Jfc3VydmV5IDwtIGNvbm5vcl9zdXJ2ZXkgJT4lIAogIHJlbmFtZShkYXlzX3Blcl93ZWVrID0gYEluIGEgcmVndWxhciB3ZWVrLCBob3cgbWFueSBkYXlzIHBlciB3ZWVrIGRvIHlvdSBleGVyY2lzZT9gKSAlPiUgCiAgcmVuYW1lKGV4ZXJjaXNlX21pbnV0ZXMgPSBgV2hlbiB5b3UgZXhlcmNpc2UsIGhvdyBtYW55IG1pbnV0ZXMgZG8geW91IGV4ZXJjaXNlIGZvcj9gKSAlPiUgCiAgcmVuYW1lKGV4ZXJjaXNlX3R5cGUgPSBgV2hlbiB5b3UgZXhlcmNpc2UsIHdoaWNoIGtpbmQgb2YgZXhlcmNpc2VzIGRvIHlvdSBub3JtYWxseSBkbz9gKSAlPiUKICByZW5hbWUoZXhlcmNpc2VfcmVhc29uID0gYFdoYXQgaXMgeW91ciBwcmltYXJ5IHJlYXNvbiBmb3IgZXhlcmNpc2luZz9gKSAlPiUgCiAgcmVuYW1lKGV4ZXJjaXNlX2xvY2F0aW9uID0gYFdoZXJlIGRvIHlvdSBwcmltYXJpbHkgZXhlcmNpc2UgYXQ/YCkgJT4lIAogIHJlbmFtZShzdHVkZW50X2F0aGxldGUgPSBgQXJlIHlvdSBhIHN0dWRlbnQtYXRobGV0ZT9gKSAlPiUgCiAgcmVuYW1lKHllYXJfaW5fc2Nob29sID0gYFdoYXQgaXMgeW91ciB5ZWFyIGluIHNjaG9vbD9gKSAlPiUgCiAgcmVuYW1lKGFnZSA9IGBXaGF0IGlzIHlvdXIgYWdlP2ApCmBgYAoKCmBgYHtyfQpjb25ub3Jfc3VydmV5IDwtIGNvbm5vcl9zdXJ2ZXkgJT4lIAogIG11dGF0ZShkYXlzX3Blcl93ZWVrPSBhcy5udW1lcmljKHJlY29kZShkYXlzX3Blcl93ZWVrLAogICAgICAgICAgICAgICAgICAgICAgIjAiID0gIjAiLAogICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjEiLAogICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjIiLAogICAgICAgICAgICAgICAgICAgICAgIjMiID0gIjMiLAogICAgICAgICAgICAgICAgICAgICAgIjQiID0gIjQiLAogICAgICAgICAgICAgICAgICAgICAgIjUiID0gIjUiLCAKICAgICAgICAgICAgICAgICAgICAgICI2IiA9ICI2IiwKICAgICAgICAgICAgICAgICAgICAgICI3IiA9ICI3IikpKSAlPiUgCiAgbXV0YXRlKGV4ZXJjaXNlX21pbnV0ZXM9IGFzLm51bWVyaWMocmVjb2RlKGV4ZXJjaXNlX21pbnV0ZXMsICIxLTEwIiA9ICIxIiwgIjExLTIwIiA9ICIyIiwgIjIxLTMwIiA9ICIzIiwgIjMxLTQwIiA9ICI0IiwgIjQxLTUwIiA9ICI1IiwgIjUxLTYwIiA9ICI2IiwgIjYwKyIgPSAiNyIpKSkgJT4lIAogIG11dGF0ZShleGVyY2lzZV90eXBlID0gYXMubnVtZXJpYyhyZWNvZGUoZXhlcmNpc2VfdHlwZSwgIlJlc2lzdGFuY2UvU3RyZW5ndGggVHJhaW5pbmcgKFdlaWdodGxpZnRpbmcpIiA9ICIxIiwgIk1lZGl1bSB0byBIaWdoIEludGVuc2l0eSBDYXJkaW8gKFJ1bm5pbmcvQmlraW5nL1N3aW1taW5nKSIgPSAiMiIsICJZb2dhIiA9ICIzIiwgIlN0cmV0Y2hpbmciID0gIjQiLCAiTG93IEludGVuc2l0eSBDYXJkaW8gKFdhbGtpbmcpIiA9ICI1IiwgIlRlYW0gU3BvcnRzIChTb2NjZXIvQmFza2V0YmFsbCBldGMpIiA9ICI2IiwgIk91dGRvb3IvUmVjcmVhdGlvbmFsIFNwb3J0cyAoU2tpaW5nL1JvY2sgQ2xpbWJpbmcvSGlraW5nIGV0YykiID0gIjciKSkpICU+JQogIG11dGF0ZShleGVyY2lzZV9yZWFzb249IGFzLm51bWVyaWMocmVjb2RlKGV4ZXJjaXNlX3JlYXNvbiwgIkdlbmVyYWwgZml0bmVzcy9IZWFsdGgiID0gIjEiLCAiUmVxdWlyZWQgZm9yIGF0aGxldGljcyIgPSAiMiIsICJDbGVhciB0aGUgbWluZCIgPSAiMyIsICJTb2NpYWwgQWN0aXZpdHkiID0gIjQiLCAiUmVjcmVhdGlvbiIgPSAiNSIsICJJbXByb3ZlIFBoeXNpcXVlIiA9ICI2IikpKSAlPiUgCiAgbXV0YXRlKGV4ZXJjaXNlX2xvY2F0aW9uPSBhcy5udW1lcmljKHJlY29kZShleGVyY2lzZV9sb2NhdGlvbiwgIlNjaG9vbCBHeW0vUmVjcmVhdGlvbiBDZW50ZXIiID0gIjEiLCAiTG9jYWwgZml0bmVzcyBjbHViIiA9ICIyIiwgIkhvbWUiID0gIjMiLCAiT3V0ZG9vcnMiID0gIjQiKSkpICU+JSAKICBtdXRhdGUoc3R1ZGVudF9hdGhsZXRlPSBhcy5udW1lcmljKHJlY29kZShzdHVkZW50X2F0aGxldGUsICJZZXMiID0gIjEiLCAiTm8iID0gIjIiKSkpICU+JSAKICBtdXRhdGUoeWVhcl9pbl9zY2hvb2w9IGFzLm51bWVyaWMocmVjb2RlKHllYXJfaW5fc2Nob29sLCAiRnJlc2htYW4iID0gIjEiLCAiU29waG9tb3JlIiA9ICIyIiwgIkp1bmlvciIgPSAiMyIsICJTZW5pb3IiID0gIjQiLCAiR3JhZHVhdGUgU3R1ZGVudCIgPSAiNSIsICJOb24tdHJhZGl0aW9uYWwgU3R1ZGVudCIgPSAiNiIpKSkgJT4lIAogIG11dGF0ZShhZ2U9IGFzLm51bWVyaWMocmVjb2RlKGFnZSwgIjE4LTIwIiA9ICIxIiwgIjIxLTIzIiA9ICIyIiwgIjI0LTI2IiA9ICIzIiwgIjI3LTI5IiA9ICI0IiwgIjMwKyIgPSAiNSIpKSkKZ2xpbXBzZShjb25ub3Jfc3VydmV5KQpgYGAKSGVyZSBhcmUgYWxsIHRoZSB2ZXJiYWwgcmVzcG9uc2VzIHJlY29kZWQgdG8gbnVtZXJpY2FsIHZhbHVlcywgaW4gb3JkZXIgdG8gcGVyZm9ybSBzdGF0aXN0aWNhbCBhbmFseXNpcy4gSW4gZ2VuZXJhbCwgdGhlIGxvd2VyIHRoZSBudW1iZXIsIHRoZSBsb3dlciB0aGUgYWdlL2ZyZXF1ZW5jeS9kdXJhdGlvbiBvZiB0aGUgcmVzcG9uc2VzLiBMb2NhdGlvbiwgZXhlcmNpc2UgdHlwZSwgYW5kIHJlYXNvbiBhcmUgYWxsIGNvZGVkIHRvIGEgc3BlY2lmaWMgdmFsdWUuCgojIyMgU3R1ZGVudCBhdGhsZXRlIHJlc3VsdHMKYGBge3J9CmNvbm5vcl9zdXJ2ZXkgJT4lIAogIGNvdW50KHN0dWRlbnRfYXRobGV0ZSkKYGBgCkJlZm9yZSBnb2luZyBpbnRvIHRoZSBhbmFseXNpcywgSSBzaG91bGQgbm90ZSB0aGUgcmVzcG9uc2Ugb2YgdGhlIHN0dWRlbnQtYXRobGV0ZSBxdWVzdGlvbi4gSSByZWNlaXZlZCBhIHRvdGFsIG9mIDEyIHN1cnZleSByZXNwb25zZXMuIFRoZSAKc3R1ZGVudC1hdGhsZXRlIGFuc3dlciB3YXMgY29kZWQgYXMgIjEiIHJlcHJlc2VudGluZyAieWVzIiBhbmQgIjIiIHJlcHJlc2VudGluZyAibm8uIiBGcm9tIHRoZSBzdXJ2ZXkgcmVzcG9uc2VzIHRoZXJlIGFyZSB6ZXJvIHN0dWRlbnQtYXRobGV0ZXMsIHNvIHRoZXJlIHdpbGwgbm90IGJlIGFueSBhbmFseXNpcyBvZiB0aGlzIHF1ZXN0aW9uLgoKCgojIyBOYXRpb25hbCBEUEhIUyBndWlkZWxpbmVzIGZvciBoZWFsdGgsIERheXMgYnkgTWludXRlcwoKSSB3YXMgaW50ZXJlc3RlZCB0byBzZWUgaG93IHRoZSBleGVyY2lzZSByZXNwb25zZXMgb2YgbXkgc2FtcGxlIGNvbXBhcmVkIHRvIHRoZSBndWlkZWxpbmVzIGZvciBoZWFsdGggYW5kIGZpdG5lc3MgYXMgcmVjb21tZW5kZWQgYnkgdGhlIE5hdGlvbmFsIERlcGFydG1lbnQgb2YgSGVhbHRoIGFuZCBIdW1hbiBTZXJ2aWNlcy4gVGhlIGd1aWRlbGluZXMgYXJlIGFzIGZvbGxvd3M6CgoiRm9yIHN1YnN0YW50aWFsIGhlYWx0aCBiZW5lZml0cywgYWR1bHRzIHNob3VsZCBkbyBhdCBsZWFzdCAxNTAgbWludXRlcyB0byAzMDAgbWludXRlcyBhIHdlZWsgb2YgbW9kZXJhdGUtaW50ZW5zaXR5LCBvciA3NSBtaW51dGVzIHRvIDE1MCBtaW51dGVzIGEgd2VlayBvZiB2aWdvcm91cy1pbnRlbnNpdHkgYWVyb2JpYyBwaHlzaWNhbCBhY3Rpdml0eSwgb3IgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbiBvZiBtb2RlcmF0ZS0gYW5kIHZpZ29yb3VzLWludGVuc2l0eSBhZXJvYmljIGFjdGl2aXR5IgoKSSBkZWNpZGVkIHRvIGJyZWFrIGl0IGRvd24gaW50byBhIGRhaWx5IGFtb3VudDogb3ZlciBvbmUgd2VlaywgYSBwZXJzb24gd291bGQgbmVlZCB0byBleGVyY2lzZSBhdCBsZWFzdCAyMS00MyBtaW51dGVzIGEgZGF5IChvZiBhZXJvYmljIGFjdGl2aXR5KSBvZiBtb2RlcmF0ZSB0byB2aWdvcm91cyBhY3Rpdml0eSB0byBtZWV0IHRoZSByZWNvbW1lbmRlZCBndWlkZWxpbmVzLiAKYGBge3J9CmNvbm5vcl9zdXJ2ZXkgJT4lIAogIGdncGxvdChhZXMoeD1leGVyY2lzZV90eXBlLCBmaWxsPWV4ZXJjaXNlX21pbnV0ZXMpKSsKICBnZW9tX2JhcihmaWxsPSJnb2xkIikrCiAgdGhlbWVfY2xhc3NpYygpCmBgYApUaGUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIGJyZWFrZG93biBvZiB0aGUgc3VydmV5IHJlc3BvbnNlcyBvZiBleGVyY2lzZSB0eXBlIGFuZCBkdXJhdGlvbiBvZiBleGVyY2lzZS4gUmVnYXJkaW5nIHR5cGUsICIxIiBpcyBzdHJlbmd0aCB0cmFpbmluZyAoc3VjaCBhcyBsaWZ0aW5nIHdlaWdodHMpLCAiMiIgaXMgbWVkaXVtIHRvIGhpZ2ggaW50ZW5zaXR5IGNhcmRpbyAoc3VjaCBhcyBydW5uaW5nKSwgYW5kICIzIiBpcyB5b2dhL3N0cmV0Y2hpbmcuCgpBY2NvcmRpbmcgdG8gdGhlIGdyYXBoLCB0aGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgcmVzcG9uZGFudHMgbWVldCB0aGUgY2hyb25vbG9naWNhbCByZXF1aXJlbWVudHMgZm9yIG1haW50YWluaW5nIGZpdG5lc3MsIGJ1dCBtb3N0IGFyZSBkb2luZyBzdHJlbmd0aCB0cmFpbmluZyBpbnN0ZWFkIG9mIGNhcmRpby4gV2hpbGUgdGhlcmUgaXMgY2VydGFpbmx5IG5vdGhpbmcgd3Jvbmcgd2l0aCBkb2luZyBzdHJlbmd0aCB0cmFpbmluZyBpdCdzIGludGVyZXN0aW5nIHRvIHNlZSB0aGF0IG1vc3QgcmVzcG9uZGFudHMgZmF2b3IgaXQgb3ZlciBjYXJkaW8sIGV2ZW4gdGhvdWdoIGNhcmRpbyBpcyByZWNvbW1lbmRlZCBvdmVyIHN0cmVuZ3RoIHRyYWluaW5nIGZvciAib3B0aW1hbCIgZ2VuZXJhbCBoZWFsdGguIAoKCgoKCgoKIyMjIFllYXIgYnkgZGF5cyBwZXIgd2VlaywgbWludXRlcyBwZXIgc2Vzc2lvbgoKVGhpcyBpcyBwcm9iYWJseSB0aGUgZGlzdHJpYnV0aW9uIG9mIGdyZWF0ZXN0IGludGVyZXN0IHRvIG1lLiBJdCBzaWduaWZpZXMgdGhlIGdlbmVyYWwgYWN0aXZpdHkgaGFiaXRzIG9mIHRoZSBzdHVkZW50IHBvcHVsYXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBzcGVjaWZpYyBraW5kIG9mIGFjdGl2aXR5IHRoZXkgZG8gd2hpY2ggaXMgdGhlIG1vc3QgaW1wb3J0YW50IGZhY3RvciBmb3IgZGV2ZWxvcGluZyBoZWFsdGh5IGhhYml0cy4gQXMgbG9uZyBhcyB5b3Ugc3RheSBhY3RpdmUgY29uc2lzdGVudGx5LCB5b3UncmUgZG9pbmcgaXQgcmlnaHQhCmBgYHtyfQpjb25ub3Jfc3VydmV5ICU+JSAKICBwbG90X2x5KHg9fmRheXNfcGVyX3dlZWssIHk9fmV4ZXJjaXNlX21pbnV0ZXMsIHo9fnllYXJfaW5fc2Nob29sKSAlPiUgCiAgYWRkX2hpc3RvZ3JhbTJkY29udG91cihuYmluc3g9NywgbmJpbnN5PTcpICU+JQogIGxheW91dCh0aXRsZSA9ICJUaGUgdHlwaWNhbCBhbW91bnQgb2YgZXhlcmNpc2UgcGVyIHdlZWsgYnkgTVNVQiBzdHVkZW50cyIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJEYXlzIHBlciB3ZWVrIiwgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1pbnV0ZXMgcGVyIHNlc3Npb24iLCB6YXhpcyA9IGxpc3QoIlllYXIgaW4gU2Nob29sIikpKSkKICAKYGBgCkhlcmUgaXMgYSBoZWF0bWFwIG9mIHRoZSBudW1iZXIgb2YgZGF5cyBwZXIgd2VlayBNU1VCIHN0dWRlbnRzIHR5cGljYWxseSBleGVyY2lzZSAob24gdGhlIHgtYXhpcyksIGFuZCBob3cgbG9uZyB0aGV5IGV4ZXJjaXNlIGZvciBkdXJpbmcgYSBzZXNzaW9uIChvbiB0aGUgeS1heGlzKS4gVGhlIG51bWJlciBvZiBtaW51dGVzIGFyZSBjb2RlZCBpbnRvIGluY3JlbWVtZW50cyBvZiAxMCwgYmVnaW5uaW5nIGF0IDEtMTAgbWludXRlcyBlcXVhbGxpbmcgIjEiLiBUaGUgeWVhciBpbiBzY2hvb2wgaXMgc2hvd24gYnkgY29sb3IsIHdpdGggbGlnaHRlciBzaGFkZXMgaW5kaWNhdGluZyBhIGhpZ2hlciB5ZWFyIChpLmUuLCBhIHNlbmlvciB3aWxsIGluZGljYXRlIGEgeWVsbG93IHdoaWxlIGEgZnJlc2htYW4gd2lsbCBiZSBkYXJrKS4gQWNjb3JkaW5nIHRvIHRoZSBoZWF0bWFwLCBtb3N0IG9mIHRoZSBzdHVkZW50cyBhcmUgZXhlcmNpc2luZyAzLTQgZGF5cyBwZXIgd2VlayBmb3IgNTAtNjAgbWludXRlcyBlYWNoLiBBbHRob3VnaCB0aGUgYWdlIGlzIHNsaWdodGx5IHNrZXdlZCB0b3dhcmQgb2xkZXIgc3R1ZGVudHMgdGFraW5nIHRoZSBzdXJ2ZXksIGl0J3MgdmVyeSBlbmNvdXJhZ2luZyB0byBzZWUgdGhlIGdlbmVyYWwgdHJlbmQgb2Ygc3R1ZGVudHMgcmVwb3J0IGJlaW5nIGFjdGl2ZSBmYWlybHkgZnJlcXVlbnRseS4gCgoKCgoKIyMjIFllYXIgaW4gc2Nob29sIGFuZCBsb2NhdGlvbiwgeWVhciBpbiBzY2hvb2wgYW5kIHJlYXNvbgoKSSB3YXMgaW50ZXJlc3RlZCB0byBzZWUgdGhlIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHllYXIgaW4gc2Nob29sLCB0aGUgbG9jYXRpb24gb2YgZXhlcmNpc2UsIGFuZCByZWFzb25zIGZvciBleGVyY2lzaW5nLiBHaXZlbiB0aGF0IGNvbGxlZ2Ugc3R1ZGVudHMgaGF2ZSBmcmVlIGFjY2VzcyB0byB0aGUgc2Nob29sIGd5bSwgSSBpbWFnaW5lZCB0aGF0IG1vc3Qgb2YgdGhlIHJlc3BvbnNlcyB3b3VsZCByZWZsZWN0IHRoYXQuIEhvd2V2ZXIsIEkgd2FzIHVuc3VyZSBhcyB0byB3aGF0IHJlYXNvbnMgbWF5IGJlIG1vc3QgcHJvbWluZW50LCBzaW5jZSBldmVyeW9uZSBoYXMgZGlmZmVyZW50IGZpdG5lc3MgZ29hbHMgYW5kIGxpZmUgc2l0dWF0aW9ucy4KYGBge3J9CmNvbm5vcl9zdXJ2ZXkgJT4lIAogIHBsb3RfbHkoeD1+ZXhlcmNpc2VfbG9jYXRpb24sIHk9fmV4ZXJjaXNlX3JlYXNvbiwgej1+eWVhcl9pbl9zY2hvb2wpICU+JSAKICBhZGRfaGlzdG9ncmFtMmRjb250b3VyKG5iaW5zeD03LCBuYmluc3k9NykgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlRoZSB0eXBpY2FsIGV4ZXJjaXNlIHJlYXNvbnMgYW5kIGxvY2F0aW9ucyBpbiBNU1VCIHN0dWRlbnRzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkxvY2F0aW9uIiwgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlYXNvbiBmb3IgZXhlcmNpc2luZyIsIHpheGlzID0gbGlzdCgiWWVhciBpbiBTY2hvb2wiKSkpKQpgYGAKVGhlIGhlYXRtYXAgaWxsdXN0cmF0ZXMgdGhlIHRocmVlLXdheSByZWxhdGlvbnNoaXAgb2YgdGhlIHllYXIgaW4gc2Nob29sLCBsb2NhdGlvbiwgYW5kIHJlYXNvbiBmb3IgZXhlcmNpc2luZyB2YXJpYWJsZXMuIFRoZSBsb2NhdGlvbiBjb2RpbmcgaXMgc2hvd24gb24gdGhlIHgtYXhpcywgd2l0aCAiU2Nob29sIEd5bS9SZWNyZWF0aW9uIENlbnRlciIgYmVpbmcgMSwgIkxvY2FsIGZpdG5lc3MgY2x1YiIgYmVpbmcgMiwgIkhvbWUiIGJlaW5nIDMsIGFuZCAiT3V0ZG9vcnMiIGJlaW5nIDQuIApUaGUgZXhlcmNpc2UgcmVhc29uIGNvZGluZyBpcyBzaG93biBvbiB0aGUgeS1heGlzLCB3aXRoIEdlbmVyYWwgZml0bmVzcy9IZWFsdGgiIGJlaW5nIDEsICJSZXF1aXJlZCBmb3IgYXRobGV0aWNzIiBiZWluZyAyLCAiQ2xlYXIgdGhlIG1pbmQiIGJlaW5nIDMsICJTb2NpYWwgQWN0aXZpdHkiIGJlaW5nIDQsICJSZWNyZWF0aW9uIiBiZWluZyA1LCAiSW1wcm92ZSBQaHlzaXF1ZSIgYmVpbmcgNi4KCkFjY29yZGluZyB0byB0aGUgaGVhdG1hcCwgdGhlIG1vc3QgY29uY2VudHJhdGVkIGFyZWEgaW5kaWNhdGVzIHRoYXQgdGhlIG1ham9yaXR5IG9mIHRoZSByZXNwb25kZW50cyBhcmUgYXQgbGVhc3QganVuaW9ycyBpbiBjb2xsZWdlIHdobyBleGVyY2lzZSBvdXRkb29ycyB0byAiY2xlYXIgdGhlaXIgbWluZC4iIFNpbmNlIHdlIGFyZSBpbiBNb250YW5hLCB0aGlzIGlzbid0IHRvbyBzdXJwcmlzaW5nLiBXaXRoIHRoZSBhYnVuZGFuY2Ugb2Ygb3V0ZG9vciBhY3Rpdml0aWVzIGF2YWlsYWJsZSB0byB1cywgaXQgbWFrZXMgY29tcGxldGUgc2Vuc2UgdG8gc3BlbmQgbG90cyBvZiB0aW1lIGV4ZXJjaXNpbmcgb3V0c2lkZS4gT3RoZXIgYXJlYXMgb2YgY29uY2VudHJhdGlvbiBpbmNsdWRlIGV4ZXJjaXNpbmcgYXQgYSBsb2NhbCBmaXRuZXNzIGNsdWIgYXMgYSBzb2NpYWwgYWN0aXZpdHksIGFuZCBleGVyY2lzaW5nIGF0IGEgbG9jYWwgZml0bmVzcyBjbHViIHRvIGltcHJvdmUgdGhlaXIgcGh5c2lxdWUuCgoKCiMjIyBNaW51dGVzIGFuZCBsb2NhdGlvbgoKSSB3YXMgY3VyaW91cyB0byBzZWUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhvdyBsb25nIHBlb3BsZSBleGVyY2lzZSBmb3IgaW4gcmVsYXRpb24gdG8gd2hlcmUgdGhleSBleGVyY2lzZSBhdC4gCmBgYHtyfQpjb25ub3Jfc3VydmV5ICU+JSAKZ2dwbG90KGFlcyh4PWV4ZXJjaXNlX2xvY2F0aW9uLCBmaWxsPWV4ZXJjaXNlX21pbnV0ZXMpKSsKICBnZW9tX2JhcihmaWxsPSJuYXZ5IGJsdWUiKSsKICBsYWJzKHRpdGxlID0gIk51bWJlciBvZiBtaW51dGVzIHBlciBzZXNzaW9uIGFuZCBsb2NhdGlvbiBvZiBleGVyY2lzZSBpbiBNU1VCIHN0dWRlbnRzIiwgeD0iTG9jYXRpb24iLCB5PSJNaW51dGVzIHBlciBzZXNzaW9uIikrCiAgdGhlbWVfY2xhc3NpYygpCmBgYApUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgYXJlIHNob3duIG9uIHRoZSB5LWF4aXMsIGNvZGVkIGluIHRlbi1taW51dGUgaW5jcmVtZW50cy4gT25lIHRvIHRlbiBtaW51dGVzIGlzICIxIiwgMTEtMjAgbWludXRlcyBpcyAiMiIsIDIxLTMwIG1pbnV0ZXMgaXMgIjMiLCAzMS00MCBtaW51dGVzIGlzICI0IiwgNDEtNTAgbWludXRlcyBpcyAiNSIsIDUxLTYwIG1pbnV0ZXMgaXMgIjYiLCBhbmQgNjArIG1pbnV0ZXMgaXMgIjcuIgpUaGUgZ3JhcGggYWJvdmUgc2hvd3MgdGhhdCBtb3N0IG9mIHRoZSByZXNwb25kZW50cyBleGVyY2lzZSBlaXRoZXIgYXQgYSBmaXRuZXNzIGNsdWIgKDIpIG9yIG91dGRvb3JzICg0KS4gVGhvc2UgYXQgYSBmaXRuZXNzIGNsdWIgdHlwaWNhbGx5IHNwZW5kIGp1c3QgdW5kZXIgYW4gaG91ciB0aGVyZSwgYW5kIHRob3NlIG91dHNpZGUgc3BlbmQgYXJvdW5kIDQwIG1pbnV0ZXMgZG9pbmcgaXQuIEZyb20gdGhpcyBncmFwaCwgdGhvc2Ugd2hvIGV4ZXJjaXNlIGF0IGEgZml0bmVzcyBjbHViIHNlZW0gdG8gc3BlbmQgbW9yZSB0aW1lIGV4ZXJjaXNpbmcgdGhlcmUgY29tcGFyZWQgdG8gdGhlIHNjaG9vbCBneW0gKDEpIG9yIGF0IGhvbWUgKDMpLgoKIyMjIFJlYXNvbiBmb3IgZXhlcmNpc2luZyBhbmQgZGF5cyBzcGVudCBleGVyY2lzaW5nIHBlciB3ZWVrCgpJIGRlY2lkZWQgdG8gbG9vayBhdCB3aHkgcGVvcGxlIGV4ZXJjaXNlIGFuZCBob3cgbWFueSBkYXlzIHBlciB3ZWVrIHRoZXkgc3BlbmQgZG9pbmcgaXQuIEl0IGNvdWxkIGJlIHJlYXNvbmVkIHRoYXQgZGlmZmVyZW50IHJlYXNvbnMgbWF5IHdhcnJhbnQgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGRheXMgZXhlcmNpc2luZy4gRm9yIGV4YW1wbGUsIHNvbWVvbmUgd2hvIGlzIGxvb2tpbmcgdG8gbWFpbnRhaW4gZ2VuZXJhbCBmaXRuZXNzIG1heSBzcGVuZCBsZXNzIHRpbWUgZXhlcmNpc2luZyBjb21wYXJlZCB0byBzb21vbmUgd2hvIGlzIGV4ZXJjaXNpbmcgdG8gaW1wcm92ZSB0aGVpciBwaHlzaXF1ZSBvciBpZiBpdCdzIHJlcXVpcmVkIGZvciBhdGhsZXRpY3MuIApgYGB7cn0KY29ubm9yX3N1cnZleSAlPiUgCiAgZ2dwbG90KGFlcyh4PWV4ZXJjaXNlX3JlYXNvbiwgZmlsbD1kYXlzX3Blcl93ZWVrKSkrCiAgZ2VvbV9iYXIoZmlsbD0iZ29sZCIpKwogIGxhYnModGl0bGUgPSAiUmVhc29uIGZvciBleGVyY2lzaW5nIGFuZCBob3cgbWFueSBkYXlzIHNwZW50IGV4ZXJjaXNpbmcgcGVyIHdlZWsiLCB4PSJSZWFzb24iLCB5PSJEYXlzIHBlciB3ZWVrIikrCiAgdGhlbWVfY2xhc3NpYygpCmBgYApUaGUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIHJlc3VsdHMsIGFuZCB0aGVyZSBhcmUgc29tZSBjbGVhciByZXN1bHRzLiBUaG9zZSB3aG8gZXhlcmNpc2UgZm9yICJjbGVhcmluZyB0aGUgbWluZCIgKDMpIHNwZW5kIG1vcmUgZGF5cyBwZXIgd2VlayBleGVyY2lzaW5nIGNvbXBhcmVkIHRvIGFueSBvdGhlciByZWFzb24uIFRoZSBzZWNvbmQgaGlnaGVzdCB3ZWVrbHktZXhlcmNpc2VycyBhcmUgdGhvc2UgZG9pbmcgaXQgZm9yIHJlY3JlYXRpb24gKDUpIHdobyBzcGVuZCB0aHJlZSBkYXlzIHBlciB3ZWVrIGRvaW5nIGl0LiBTaW5jZSBjb2xsZWdlIGlzIGEgc3RyZXNzZnVsIHRpbWUsIGl0IHNlZW1zIHRoYXQgbW9zdCBvZiB0aGUgc2FtcGxlIHBvcHVsYXRpb24gaXMgdXNpbmcgZXhlcmNpc2UgYXMgYSB3YXkgdG8gZGVzdHJlc3MuIAoKCgojIyBEaXNjdXNzaW9uCgpXaGlsZSB0aGUgbnVtYmVyIG9mIHJlc3BvbmRlbnRzIHdhcyBsb3cgYW5kIHRoZSBhZ2Ugb2YgcmVzcG9uZGVudHMgd2FzIHNrZXdlZCB0b3dhcmQgdGhlIG9sZGVyIHJhbmdlIG9mIGNvbGxlZ2UsIHRoZSByZXN1bHRzIHNob3cgdGhhdCBNU1VCJ3Mgc3R1ZGVudCBwb3B1bHRpb24gaXMgZmFpcmx5IGFjdGl2ZSBhbmQgaGVhbHRoeS4gVGhpcyBpcyBlbmNvdXJhZ2luZyB0byBub3RlLCBhcyBjb2xsZWdlIGNhbiBiZSBhIHN0cmVzc2Z1bCB0aW1lIGFuZCBleGVyY2lzZSBpcyBhbiBleGNlbGxlbnQgd2F5IHRvIHN0YXkgb24gdG9wIG9mIG1lbnRhbCBoZWFsdGggYW5kIHRha2UgY2FyZSBvZiB5b3Vyc2VsZi4gVGhlIGxvY2F0aW9ucyB0aGF0IHNlZW0gdG8gYmUgbW9zdCBwcm9taW5lbnQgaW5jbHVkZSB0aGUgb3V0ZG9vcnMgYW5kIGZpdG5lc3MgY2VudGVycywgYW5kIHRoZSBtb3N0IHN0dWRlbnRzIGFyZSBleGVyY2lzaW5nIGZvciBhdCBsZWFzdCA0MCBtaW51dGVzIGEgZmV3IGRheXMgYSB3ZWVrLiBJbXByb3ZlbWVudHMgdG8gdGhpcyBhbmFseXNpcyBpbmNsdWRlIGEgbGFyZ2VyIHNhbXBsZSBwb3B1bGF0aW9uIGFuZCBtb3JlIGluLWRlcHRoIHN1cnZleSBxdWVzdGlvbnMuIFRoaXMgY291bGQgaW5jbHVkZSBnaXZpbmcgcGFydGljaXBhbnRzIHRoZSBvcHRpb24gdG8gc2VsZWN0IG11bHRpcGxlIHJlc3BvbnNlcywgd2hpY2ggbWlnaHQgcmVmbGVjdCBtb3JlIGFjY3VyYXRlIGV4ZXJjaXNlIGhhYml0cyBzaW5jZSBtb3N0IHBlb3BsZSBoYXZlIGEgdmFyaWV0eSBvZiByZWFzb25zIGZvciBleGVyY2lzaW5nIGFuZCBwZXJmb3JtIGRpZmZlcmVudCBhY3Rpdml0aWVzLiAKCkdlbmVyYWxseSBzcGVha2luZywgdGhlIGZpdG5lc3MgaGFiaXRzIG9mIHRoZSBNU1VCIHN0dWRlbnQgcG9wdWxhdGlvbiBhcmUgaGVhbHRoeS4gT25lIGFyZWEgdGhhdCBjb3VsZCBiZSBpbXByb3ZlZCB1cG9uIGlzIHRoZSBmcmVxdWVuY3kgb2YgYWVyb2JpYyBhY3Rpdml0eSBwZXJmb3JtZWQuIE1vc3Qgb2YgdGhlIHJlc3BvbmRlbnRzIGluZGljYXRlZCB0aGV5IHByZWZlcnJlZCBvdGhlciBhY3Rpdml0aWVzIG92ZXIgZG9pbmcgY2FyZGlvIHdvcmsuIFNpbmNlIGZpdG5lc3MgZ3VpZGVsaW5lcyByZWNvbW1lbmQgaGF2aW5nIGEgaGVhbHRoeSBjYXJkaW92YXNjdWxhciBzeXN0ZW0gYXMgYSAiaGFsbG1hcmsiIG9mIGZpdG5lc3MsIGl0IG1pZ2h0IGJlIHJlY29tbWVuZGVkIHRvIGdvIGZvciBhIGpvZywgYmlrZSByaWRlLCBvciBzd2ltIGEgbGl0dGxlIG1vcmUgZnJlcXVlbnRseS4gSG93ZXZlciB0aGVyZSBhcmUgbWFueSBsaWZlc3R5bGUgZmFjdG9ycyBnb2luZyBpbnRvIG1haW50YWluaW5nIGEgaGVhbHRoeSBsaWZlc3RseWUsIGFuZCBhcyBpdCBoYXMgYmVlbiBzYWlkICJ0aGUgYmVzdCBleGVyY2lzZSByZWdpbWVudCBpcyB0aGUgb25lIHlvdSBmb2xsb3ciIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjYXNlIHdpdGggTVNVQidzIHN0dWRlbnRzLiAKCgo=