Introduction
For this assignment, we will be looking at a data set for a survey
done on student experience and satisfaction. This survey asks students
questions regarding their experience in college. These questions include
gathering information on a student’s academic background, their year
level and credit status, along with their engagement in learning their
class material both inside and outside of school. This survey also asks
students about which campus resources they have used throughout their
time in college. The survey looks at the satisfaction rating students
have regarding the college, along with their information to gather data
about the students at the college and their opinions regarding their
experience and their satisfaction level regarding their college.
For this project, we will take a look at this survey data and begin
with analyzing the data set along with conducting some exploratory data
analysis steps to start. Then, we will perform internal reliability
analysis of the subscales in the survey. We will consider some potential
consulting questions which could be drawn from this survey data for
future projects on this survey data set.
Data Description
Let’s read in the survey data set from GitHub. We will call the data
set as “survey”.
survey <- read.csv("https://raw.githubusercontent.com/JosieGallop/STA490/refs/heads/main/student-satisfaction-survey.csv")
As we can see, the survey data set contains 332 observations of 121
variables. The variables represent the different questions within the
survey.
Exploratory Data
Analysis
We will perform some exploratory data analysis to gain a better
understanding of the survey data set, and to further prepare the data
for additional analysis related to reliability and validation of the
survey data.
Dealing with the
Missing Values
For the first step of our exploratory data analysis, we will check
for and fix any missing value concerns within our data set. First, let’s
check to see if there indeed are some missing values which we will need
to fix.
colSums(is.na(survey))
q1 q2 q3 q41 q42 q43 q44 q45 q46 q47
0 0 0 0 0 0 0 0 0 0
q48 q49 q410 q411 q412 q413 q414 q415 q416 q417
0 0 0 0 0 0 0 0 0 0
q418 q419 q420 q421 q51 q52 q53 q54 q55 q56
0 0 0 0 0 0 0 0 0 0
q61 q62 q63 q7 q81 q82 q83 q84 q85 q86
0 0 0 0 0 0 0 0 0 0
q87 q88 q89 q91 q92 q93 q94 q95 q96 q97
0 0 0 0 0 0 0 0 0 0
q101 q102 q103 q104 q105 q106 q107 q108 q109 q1010
0 0 0 0 0 0 0 0 0 0
q1011 q1012 q1013 q1014 q1015 q111.1 q111.2 q111.3 q112.1 q112.2
0 0 0 0 0 0 0 0 0 0
q112.3 q113.1 q113.2 q113.3 q114.1 q114.2 q114.3 q115.1 q115.2 q115.3
0 0 0 0 0 0 0 0 0 0
q116.1 q116.2 q116.3 q117.1 q117.2 q117.3 q118.1 q118.2 q118.3 q119.1
0 0 0 0 0 0 0 0 0 0
q119.2 q119.3 q1110.1 q1110.2 q1110.3 q1111.1 q1111.2 q1111.3 q121 q122
0 0 0 0 0 0 0 0 0 0
q123 q124 q125 q131 q132 q133 q134 q135 q136 q14
0 0 0 0 0 0 0 0 0 0
q15 q16 q17 q18 q19 q20 q21 q22 q23 q24
0 0 0 0 0 0 0 0 0 0
q25
0
It turns out that there are exactly zero missing values in this
survey data set, meaning that we do not have any missing values to worry
about. So, we do not have to do any imputation to fix any missing
values, because we do not have any missing values in the survey data
set.
Splitting the Survey
Data Set
We have two main components of our survey, the student experience
portion and the student satisfaction portion. We will split these apart
for our further analysis of the survey data set.
Student Experience
Portion
First, let’s separate the student experience portion of the survey
data set. The student experience portion looks at the personal and
academic background of students at the college. This information gives
some background details about the student along with their experience at
the college. The goal of this survey is to see how these experience
factors may affect a student’s college satisfaction.
The student experience portion takes up majority of the survey
questionarre. So, this student experience portion will contain the
majority of the questions within the survey data set.
experience = survey[, 1:112]
Now we have created the experience subset of our survey data.
Student Satisfaction
Portion
The second portion of the survey data set is the student satisfaction
questions. These questions look at a student’s overall satisfaction and
feelings towards their college. There are only two questions within the
survey questionarre which ask about student satisfaction related topics,
so this subset portion of the data set will be much smaller than the
student experience portion of the data set.
satisfaction = survey[, 113:114]
Now we have created the satisfaction subset of our survey data.
Reliability
Analysis
Now that we have prepared the data set, we will perform internal
reliability and validity assessments in order to further investigate the
survey data set.
Student Experience
Reliability Analysis
First, let’s look at the correlation plots for the student experience
subset of our survey data set.
The experience portion of the survey is incredibly large, so let’s
take a smaller subset of this portion in order to make our correlation
plot easier to interpret. We will look at questions 5, 6, and 7 for this
subset. We will call this subset “experience.1”.
experience.1 = survey[, 25:34]
Now, let’s look at the correlation plot for this subset of the
student experience portion of the survey.
M=cor(experience.1)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)

We can see some moderate correlation between the student experience
survey datafrom how some of the ellipses do appear to be moderately long
and stretched in their shape.
Student Satisfaction
Reliability Analysis
Next, let’s look at the correlation plots for the student
satisfaction subset of the survey data set.
M=cor(satisfaction)
corrplot.mixed(M, lower.col = "purple", upper = "ellipse", number.cex = .7, tl.cex = 0.7)

The satisfaction portion of the survey was so short compared to the
student experience portion, that it is quite hard to judge the
correlation due to the lack of entries on our plot. The ellipse does
appear to be noticeably streched and long, indicating some moderate
correlation does indeed exist.
Cronbach Alpha
Levels
Next, we will calculate the Cronbach alpha levels for each of our two
subsets, along with their 95% confidence intervals. This will allow us
to assess the reliability of the two subsets.
Student
Experience
First, let’s calculate the Cronbach alpha level for the student
experience portion of the survey data set.
cronbach.e = as.numeric(alpha(experience.1)$total[1])
Some items ( q61 q62 q63 q7 ) were negatively correlated with the first principal component and
probably should be reversed.
To do this, run the function again with the 'check.keys=TRUE' option
CI.e = cronbach.alpha.CI(alpha=cronbach.e, n=332, items=10, conf.level = 0.95)
CI.comp = cbind(LCI = CI.e[1], alpha = cronbach.e, UCI =CI.e[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confidence Interval of Cronbach Alpha")
Confidence Interval of Cronbach Alpha
0.4298 |
0.5119 |
0.5866 |
The Cronbach alpha level for the student experience portion of the
survey data set is 0.5119, 95% CI [0.4298, 0.5866]. This value of 0.5119
is not that high, but it is not incredibly low either. This indicates
that their is moderate, but not great, reliability.
Student
Satisfaction
Next, let’s calculate the Cronbach alpha level for the student
satisfaction portion of the survey data set.
cronbach.s = as.numeric(alpha(satisfaction)$total[1])
CI.s = cronbach.alpha.CI(alpha=cronbach.s, n=332, items=2, conf.level = 0.95)
CI.comp = cbind(LCI = CI.s[1], alpha = cronbach.s, UCI =CI.s[2])
row.names(CI.comp) = ""
pander(CI.comp, caption="Confidence Interval of Cronbach Alpha")
Confidence Interval of Cronbach Alpha
0.4854 |
0.5853 |
0.6658 |
The Cronbach alpha level for the student experience portion of the
survey data set is 0.5853, 95% CI [0.4298, 0.6658]. TOnce again, this
value of 0.5853 is not that high, but it is not incredibly low either.
This indicates that their is moderate, but not great, reliability. This
value is slightly higher than that of the student experience subset,
indicating the student satisfaction subset has slightly better
reliability of the two.
Project Questions
Lastly, we will now look at some potential project questions based
upon the analysis of the survey data set and the results that were
found.
Some potential questions include:
Which factors of student experience showed the strongest
influence on student satisfaction?
Did these particular factors with the strongest influence on
satisfaction show stronger reliability when compared to the
others?
Do students appear to be mostly satisfied with their school
experience?
For this project, I would be interesting in looking into particuarly
the topic of which student experience factors have the greatest
significance or effect on a student’s satisfaction with their college
experience. This would be helpful because it would give specific factors
for college faculty or advisors to look out for in their students in
order to help them have a more positive and satisfactory experience
during their time in college.
I think it would be interesing to see if these particular factors
with stronger influence on a student’s satisfaction have stronger
reliability. It would be interesting to compare the reliability results
of these particular factors to see if their appears stronger or weaker
than the average. This would help to see if these findings truly are
reliable or not.
LS0tDQp0aXRsZTogIlN1cnZleSBBbmFseXNpczogSW50ZXJuYWwgUmVsaWFiaWxpdHkiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiMjAyNS0wNC0wOCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCiAgIGxpYnJhcnkobGVhZmxldCkNCn0NCmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQ0KICAgbGlicmFyeShFbnZTdGF0cykNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQ0KICAgbGlicmFyeShwaHl0b29scykNCn0NCmlmKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiR1BBcm90YXRpb24iKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR1BBcm90YXRpb24iKQ0KICAgbGlicmFyeShHUEFyb3RhdGlvbikNCn0NCmlmICghcmVxdWlyZSgibkZhY3RvcnMiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibkZhY3RvcnMiKQ0KICAgbGlicmFyeShuRmFjdG9ycykNCn0NCmlmICghcmVxdWlyZSgicGFyYW1ldGVycyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYXJhbWV0ZXJzIikNCiAgIGxpYnJhcnkocGFyYW1ldGVycykNCn0NCmlmICghcmVxdWlyZSgiY29ycnBsb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQ0KICAgbGlicmFyeShjb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2djb3JycGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikNCiAgIGxpYnJhcnkoZ2djb3JycGxvdCkNCn0NCmlmICghcmVxdWlyZSgiZ2dmb3J0aWZ5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdnZm9ydGlmeSIpDQogICBsaWJyYXJ5KGdnZm9ydGlmeSkNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgiQ0NBIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkNDQSIpDQogICBsaWJyYXJ5KENDQSkNCn0NCmlmICghcmVxdWlyZSgib2xzcnIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygib2xzcnIiKQ0KICAgbGlicmFyeShvbHNycikNCn0NCmlmICghcmVxdWlyZSgiY29jcm9uIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvY3JvbiIpDQogICBsaWJyYXJ5KGNvY3JvbikNCn0NCmlmKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYoIXJlcXVpcmUoIm1pY2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibWljZSIpDQogICBsaWJyYXJ5KG1pY2UpDQp9DQppZighcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYoIXJlcXVpcmUoImJyb29tLm1peGVkIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJyb29tLm1peGVkIikNCiAgIGxpYnJhcnkoYnJvb20ubWl4ZWQpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmKCFyZXF1aXJlKCJjYXJldCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQogICBsaWJyYXJ5KGNhcmV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJwUk9DIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBST0MiKQ0KICAgbGlicmFyeShwUk9DKQ0KfQ0KIyBTcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZQ0KICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICMgU29tZXRpbWVzLCB5b3VyIGNvZGUgbWF5IHByb2R1Y2UgYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMsIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BLCAgICAgIyBTdXBwcmVzcyBoYXNoLXRhZ3MgaW4gdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLg0KICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbj0nY2VudGVyJywgDQogICAgICAgICAgICAgICAgICAgZmlnLnBvcyA9ICdodCcNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRm9yIHRoaXMgYXNzaWdubWVudCwgd2Ugd2lsbCBiZSBsb29raW5nIGF0IGEgZGF0YSBzZXQgZm9yIGEgc3VydmV5IGRvbmUgb24gc3R1ZGVudCBleHBlcmllbmNlIGFuZCBzYXRpc2ZhY3Rpb24uIFRoaXMgc3VydmV5IGFza3Mgc3R1ZGVudHMgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGVpciBleHBlcmllbmNlIGluIGNvbGxlZ2UuIFRoZXNlIHF1ZXN0aW9ucyBpbmNsdWRlIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBvbiBhIHN0dWRlbnQncyBhY2FkZW1pYyBiYWNrZ3JvdW5kLCB0aGVpciB5ZWFyIGxldmVsIGFuZCBjcmVkaXQgc3RhdHVzLCBhbG9uZyB3aXRoIHRoZWlyIGVuZ2FnZW1lbnQgaW4gbGVhcm5pbmcgdGhlaXIgY2xhc3MgbWF0ZXJpYWwgYm90aCBpbnNpZGUgYW5kIG91dHNpZGUgb2Ygc2Nob29sLiBUaGlzIHN1cnZleSBhbHNvIGFza3Mgc3R1ZGVudHMgYWJvdXQgd2hpY2ggY2FtcHVzIHJlc291cmNlcyB0aGV5IGhhdmUgdXNlZCB0aHJvdWdob3V0IHRoZWlyIHRpbWUgaW4gY29sbGVnZS4gVGhlIHN1cnZleSBsb29rcyBhdCB0aGUgc2F0aXNmYWN0aW9uIHJhdGluZyBzdHVkZW50cyBoYXZlIHJlZ2FyZGluZyB0aGUgY29sbGVnZSwgYWxvbmcgd2l0aCB0aGVpciBpbmZvcm1hdGlvbiB0byBnYXRoZXIgZGF0YSBhYm91dCB0aGUgc3R1ZGVudHMgYXQgdGhlIGNvbGxlZ2UgYW5kIHRoZWlyIG9waW5pb25zIHJlZ2FyZGluZyB0aGVpciBleHBlcmllbmNlIGFuZCB0aGVpciBzYXRpc2ZhY3Rpb24gbGV2ZWwgcmVnYXJkaW5nIHRoZWlyIGNvbGxlZ2UuIA0KDQpGb3IgdGhpcyBwcm9qZWN0LCB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoaXMgc3VydmV5IGRhdGEgYW5kIGJlZ2luIHdpdGggYW5hbHl6aW5nIHRoZSBkYXRhIHNldCBhbG9uZyB3aXRoIGNvbmR1Y3Rpbmcgc29tZSBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIHN0ZXBzIHRvIHN0YXJ0LiBUaGVuLCB3ZSB3aWxsIHBlcmZvcm0gaW50ZXJuYWwgcmVsaWFiaWxpdHkgYW5hbHlzaXMgb2YgdGhlIHN1YnNjYWxlcyBpbiB0aGUgc3VydmV5LiBXZSB3aWxsIGNvbnNpZGVyIHNvbWUgcG90ZW50aWFsIGNvbnN1bHRpbmcgcXVlc3Rpb25zIHdoaWNoIGNvdWxkIGJlIGRyYXduIGZyb20gdGhpcyBzdXJ2ZXkgZGF0YSBmb3IgZnV0dXJlIHByb2plY3RzIG9uIHRoaXMgc3VydmV5IGRhdGEgc2V0LiANCg0KDQojIyBEYXRhIERlc2NyaXB0aW9uDQoNCkxldCdzIHJlYWQgaW4gdGhlIHN1cnZleSBkYXRhIHNldCBmcm9tIEdpdEh1Yi4gV2Ugd2lsbCBjYWxsIHRoZSBkYXRhIHNldCBhcyAic3VydmV5Ii4gDQoNCmBgYHtyfQ0Kc3VydmV5IDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSm9zaWVHYWxsb3AvU1RBNDkwL3JlZnMvaGVhZHMvbWFpbi9zdHVkZW50LXNhdGlzZmFjdGlvbi1zdXJ2ZXkuY3N2IikNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgc3VydmV5IGRhdGEgc2V0IGNvbnRhaW5zIDMzMiBvYnNlcnZhdGlvbnMgb2YgMTIxIHZhcmlhYmxlcy4gVGhlIHZhcmlhYmxlcyByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgd2l0aGluIHRoZSBzdXJ2ZXkuIA0KDQoNCg0KDQojIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KV2Ugd2lsbCBwZXJmb3JtIHNvbWUgZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyB0byBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN1cnZleSBkYXRhIHNldCwgYW5kIHRvIGZ1cnRoZXIgcHJlcGFyZSB0aGUgZGF0YSBmb3IgYWRkaXRpb25hbCBhbmFseXNpcyByZWxhdGVkIHRvIHJlbGlhYmlsaXR5IGFuZCB2YWxpZGF0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YS4gDQoNCg0KIyMgRGVhbGluZyB3aXRoIHRoZSBNaXNzaW5nIFZhbHVlcw0KDQpGb3IgdGhlIGZpcnN0IHN0ZXAgb2Ygb3VyIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMsIHdlIHdpbGwgY2hlY2sgZm9yIGFuZCBmaXggYW55IG1pc3NpbmcgdmFsdWUgY29uY2VybnMgd2l0aGluIG91ciBkYXRhIHNldC4gRmlyc3QsIGxldCdzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpbmRlZWQgYXJlIHNvbWUgbWlzc2luZyB2YWx1ZXMgd2hpY2ggd2Ugd2lsbCBuZWVkIHRvIGZpeC4NCg0KYGBge3J9DQpjb2xTdW1zKGlzLm5hKHN1cnZleSkpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIGV4YWN0bHkgemVybyBtaXNzaW5nIHZhbHVlcyBpbiB0aGlzIHN1cnZleSBkYXRhIHNldCwgbWVhbmluZyB0aGF0IHdlIGRvIG5vdCBoYXZlIGFueSBtaXNzaW5nIHZhbHVlcyB0byB3b3JyeSBhYm91dC4gU28sIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueSBpbXB1dGF0aW9uIHRvIGZpeCBhbnkgbWlzc2luZyB2YWx1ZXMsIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgYW55IG1pc3NpbmcgdmFsdWVzIGluIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCg0KDQoNCiMgU3BsaXR0aW5nIHRoZSBTdXJ2ZXkgRGF0YSBTZXQNCg0KV2UgaGF2ZSB0d28gbWFpbiBjb21wb25lbnRzIG9mIG91ciBzdXJ2ZXksIHRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiBhbmQgdGhlIHN0dWRlbnQgc2F0aXNmYWN0aW9uIHBvcnRpb24uIFdlIHdpbGwgc3BsaXQgdGhlc2UgYXBhcnQgZm9yIG91ciBmdXJ0aGVyIGFuYWx5c2lzIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCg0KIyMgU3R1ZGVudCBFeHBlcmllbmNlIFBvcnRpb24NCg0KRmlyc3QsIGxldCdzIHNlcGFyYXRlIHRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiBvZiB0aGUgc3VydmV5IGRhdGEgc2V0LiBUaGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gbG9va3MgYXQgdGhlIHBlcnNvbmFsIGFuZCBhY2FkZW1pYyBiYWNrZ3JvdW5kIG9mIHN0dWRlbnRzIGF0IHRoZSBjb2xsZWdlLiBUaGlzIGluZm9ybWF0aW9uIGdpdmVzIHNvbWUgYmFja2dyb3VuZCBkZXRhaWxzIGFib3V0IHRoZSBzdHVkZW50IGFsb25nIHdpdGggdGhlaXIgZXhwZXJpZW5jZSBhdCB0aGUgY29sbGVnZS4gVGhlIGdvYWwgb2YgdGhpcyBzdXJ2ZXkgaXMgdG8gc2VlIGhvdyB0aGVzZSBleHBlcmllbmNlIGZhY3RvcnMgbWF5IGFmZmVjdCBhIHN0dWRlbnQncyBjb2xsZWdlIHNhdGlzZmFjdGlvbi4gDQoNClRoZSBzdHVkZW50IGV4cGVyaWVuY2UgcG9ydGlvbiB0YWtlcyB1cCBtYWpvcml0eSBvZiB0aGUgc3VydmV5IHF1ZXN0aW9uYXJyZS4gU28sIHRoaXMgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gd2lsbCBjb250YWluIHRoZSBtYWpvcml0eSBvZiB0aGUgcXVlc3Rpb25zIHdpdGhpbiB0aGUgc3VydmV5IGRhdGEgc2V0Lg0KDQpgYGB7cn0NCmV4cGVyaWVuY2UgPSBzdXJ2ZXlbLCAxOjExMl0NCmBgYA0KDQpOb3cgd2UgaGF2ZSBjcmVhdGVkIHRoZSBleHBlcmllbmNlIHN1YnNldCBvZiBvdXIgc3VydmV5IGRhdGEuIA0KDQoNCg0KIyMgU3R1ZGVudCBTYXRpc2ZhY3Rpb24gUG9ydGlvbg0KDQpUaGUgc2Vjb25kIHBvcnRpb24gb2YgdGhlIHN1cnZleSBkYXRhIHNldCBpcyB0aGUgc3R1ZGVudCBzYXRpc2ZhY3Rpb24gcXVlc3Rpb25zLiBUaGVzZSBxdWVzdGlvbnMgbG9vayBhdCBhIHN0dWRlbnQncyBvdmVyYWxsIHNhdGlzZmFjdGlvbiBhbmQgZmVlbGluZ3MgdG93YXJkcyB0aGVpciBjb2xsZWdlLiBUaGVyZSBhcmUgb25seSB0d28gcXVlc3Rpb25zIHdpdGhpbiB0aGUgc3VydmV5IHF1ZXN0aW9uYXJyZSB3aGljaCBhc2sgYWJvdXQgc3R1ZGVudCBzYXRpc2ZhY3Rpb24gcmVsYXRlZCB0b3BpY3MsIHNvIHRoaXMgc3Vic2V0IHBvcnRpb24gb2YgdGhlIGRhdGEgc2V0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIHRoYW4gdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBkYXRhIHNldC4NCg0KYGBge3J9DQpzYXRpc2ZhY3Rpb24gPSBzdXJ2ZXlbLCAxMTM6MTE0XQ0KYGBgDQoNCk5vdyB3ZSBoYXZlIGNyZWF0ZWQgdGhlIHNhdGlzZmFjdGlvbiBzdWJzZXQgb2Ygb3VyIHN1cnZleSBkYXRhLiANCg0KDQoNCiMgUmVsaWFiaWxpdHkgQW5hbHlzaXMNCg0KTm93IHRoYXQgd2UgaGF2ZSBwcmVwYXJlZCB0aGUgZGF0YSBzZXQsIHdlIHdpbGwgcGVyZm9ybSBpbnRlcm5hbCByZWxpYWJpbGl0eSBhbmQgdmFsaWRpdHkgYXNzZXNzbWVudHMgaW4gb3JkZXIgdG8gZnVydGhlciBpbnZlc3RpZ2F0ZSB0aGUgc3VydmV5IGRhdGEgc2V0Lg0KDQoNCiMjIFN0dWRlbnQgRXhwZXJpZW5jZSBSZWxpYWJpbGl0eSBBbmFseXNpcw0KDQpGaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdHMgZm9yIHRoZSBzdHVkZW50IGV4cGVyaWVuY2Ugc3Vic2V0IG9mIG91ciBzdXJ2ZXkgZGF0YSBzZXQuDQoNClRoZSBleHBlcmllbmNlIHBvcnRpb24gb2YgdGhlIHN1cnZleSBpcyBpbmNyZWRpYmx5IGxhcmdlLCBzbyBsZXQncyB0YWtlIGEgc21hbGxlciBzdWJzZXQgb2YgdGhpcyBwb3J0aW9uIGluIG9yZGVyIHRvIG1ha2Ugb3VyIGNvcnJlbGF0aW9uIHBsb3QgZWFzaWVyIHRvIGludGVycHJldC4gV2Ugd2lsbCBsb29rIGF0IHF1ZXN0aW9ucyA1LCA2LCBhbmQgNyBmb3IgdGhpcyBzdWJzZXQuIFdlIHdpbGwgY2FsbCB0aGlzIHN1YnNldCAiZXhwZXJpZW5jZS4xIi4NCg0KDQpgYGB7cn0NCmV4cGVyaWVuY2UuMSA9IHN1cnZleVssIDI1OjM0XQ0KYGBgDQoNCk5vdywgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdCBmb3IgdGhpcyBzdWJzZXQgb2YgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkuDQoNCmBgYHtyfQ0KTT1jb3IoZXhwZXJpZW5jZS4xKQ0KY29ycnBsb3QubWl4ZWQoTSwgbG93ZXIuY29sID0gInB1cnBsZSIsIHVwcGVyID0gImVsbGlwc2UiLCBudW1iZXIuY2V4ID0gLjcsIHRsLmNleCA9IDAuNykNCmBgYA0KDQpXZSBjYW4gc2VlIHNvbWUgbW9kZXJhdGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHN1cnZleSBkYXRhZnJvbSBob3cgc29tZSBvZiB0aGUgZWxsaXBzZXMgZG8gYXBwZWFyIHRvIGJlIG1vZGVyYXRlbHkgbG9uZyBhbmQgc3RyZXRjaGVkIGluIHRoZWlyIHNoYXBlLg0KDQoNCg0KIyMgU3R1ZGVudCBTYXRpc2ZhY3Rpb24gUmVsaWFiaWxpdHkgQW5hbHlzaXMNCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgY29ycmVsYXRpb24gcGxvdHMgZm9yIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBzdWJzZXQgb2YgdGhlIHN1cnZleSBkYXRhIHNldC4NCg0KYGBge3J9DQpNPWNvcihzYXRpc2ZhY3Rpb24pDQpjb3JycGxvdC5taXhlZChNLCBsb3dlci5jb2wgPSAicHVycGxlIiwgdXBwZXIgPSAiZWxsaXBzZSIsIG51bWJlci5jZXggPSAuNywgdGwuY2V4ID0gMC43KQ0KYGBgDQoNClRoZSBzYXRpc2ZhY3Rpb24gcG9ydGlvbiBvZiB0aGUgc3VydmV5IHdhcyBzbyBzaG9ydCBjb21wYXJlZCB0byB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24sIHRoYXQgaXQgaXMgcXVpdGUgaGFyZCB0byBqdWRnZSB0aGUgY29ycmVsYXRpb24gZHVlIHRvIHRoZSBsYWNrIG9mIGVudHJpZXMgb24gb3VyIHBsb3QuIFRoZSBlbGxpcHNlIGRvZXMgYXBwZWFyIHRvIGJlIG5vdGljZWFibHkgc3RyZWNoZWQgYW5kIGxvbmcsIGluZGljYXRpbmcgc29tZSBtb2RlcmF0ZSBjb3JyZWxhdGlvbiBkb2VzIGluZGVlZCBleGlzdC4gDQoNCg0KDQojIENyb25iYWNoIEFscGhhIExldmVscw0KDQpOZXh0LCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgQ3JvbmJhY2ggYWxwaGEgbGV2ZWxzIGZvciBlYWNoIG9mIG91ciB0d28gc3Vic2V0cywgYWxvbmcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhc3Nlc3MgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSB0d28gc3Vic2V0cy4NCg0KIyMgU3R1ZGVudCBFeHBlcmllbmNlDQoNCkZpcnN0LCBsZXQncyBjYWxjdWxhdGUgdGhlIENyb25iYWNoIGFscGhhIGxldmVsIGZvciB0aGUgc3R1ZGVudCBleHBlcmllbmNlIHBvcnRpb24gb2YgdGhlIHN1cnZleSBkYXRhIHNldC4NCg0KYGBge3J9DQpjcm9uYmFjaC5lID0gYXMubnVtZXJpYyhhbHBoYShleHBlcmllbmNlLjEpJHRvdGFsWzFdKQ0KQ0kuZSA9IGNyb25iYWNoLmFscGhhLkNJKGFscGhhPWNyb25iYWNoLmUsIG49MzMyLCBpdGVtcz0xMCwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuZVsxXSwgYWxwaGEgPSBjcm9uYmFjaC5lLCBVQ0kgPUNJLmVbMl0pDQpyb3cubmFtZXMoQ0kuY29tcCkgPSAiIg0KcGFuZGVyKENJLmNvbXAsIGNhcHRpb249IkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2ggQWxwaGEiKQ0KYGBgDQoNClRoZSBDcm9uYmFjaCBhbHBoYSBsZXZlbCBmb3IgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQgaXMgMC41MTE5LCA5NSUgQ0kgWzAuNDI5OCwgMC41ODY2XS4gVGhpcyB2YWx1ZSBvZiAwLjUxMTkgaXMgbm90IHRoYXQgaGlnaCwgYnV0IGl0IGlzIG5vdCBpbmNyZWRpYmx5IGxvdyBlaXRoZXIuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlaXIgaXMgbW9kZXJhdGUsIGJ1dCBub3QgZ3JlYXQsIHJlbGlhYmlsaXR5LiANCg0KDQoNCiMjIFN0dWRlbnQgU2F0aXNmYWN0aW9uDQoNCk5leHQsIGxldCdzIGNhbGN1bGF0ZSB0aGUgQ3JvbmJhY2ggYWxwaGEgbGV2ZWwgZm9yIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQuDQoNCmBgYHtyfQ0KY3JvbmJhY2gucyA9IGFzLm51bWVyaWMoYWxwaGEoc2F0aXNmYWN0aW9uKSR0b3RhbFsxXSkNCkNJLnMgPSBjcm9uYmFjaC5hbHBoYS5DSShhbHBoYT1jcm9uYmFjaC5zLCBuPTMzMiwgaXRlbXM9MiwgY29uZi5sZXZlbCA9IDAuOTUpDQpDSS5jb21wID0gY2JpbmQoTENJID0gQ0kuc1sxXSwgYWxwaGEgPSBjcm9uYmFjaC5zLCBVQ0kgPUNJLnNbMl0pDQpyb3cubmFtZXMoQ0kuY29tcCkgPSAiIg0KcGFuZGVyKENJLmNvbXAsIGNhcHRpb249IkNvbmZpZGVuY2UgSW50ZXJ2YWwgb2YgQ3JvbmJhY2ggQWxwaGEiKQ0KYGBgDQoNClRoZSBDcm9uYmFjaCBhbHBoYSBsZXZlbCBmb3IgdGhlIHN0dWRlbnQgZXhwZXJpZW5jZSBwb3J0aW9uIG9mIHRoZSBzdXJ2ZXkgZGF0YSBzZXQgaXMgMC41ODUzLCA5NSUgQ0kgWzAuNDI5OCwgMC42NjU4XS4gVE9uY2UgYWdhaW4sIHRoaXMgdmFsdWUgb2YgMC41ODUzIGlzIG5vdCB0aGF0IGhpZ2gsIGJ1dCBpdCBpcyBub3QgaW5jcmVkaWJseSBsb3cgZWl0aGVyLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZWlyIGlzIG1vZGVyYXRlLCBidXQgbm90IGdyZWF0LCByZWxpYWJpbGl0eS4gVGhpcyB2YWx1ZSBpcyBzbGlnaHRseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBzdHVkZW50IGV4cGVyaWVuY2Ugc3Vic2V0LCBpbmRpY2F0aW5nIHRoZSBzdHVkZW50IHNhdGlzZmFjdGlvbiBzdWJzZXQgaGFzIHNsaWdodGx5IGJldHRlciByZWxpYWJpbGl0eSBvZiB0aGUgdHdvLg0KDQoNCg0KDQojIFByb2plY3QgUXVlc3Rpb25zDQoNCkxhc3RseSwgd2Ugd2lsbCBub3cgbG9vayBhdCBzb21lIHBvdGVudGlhbCBwcm9qZWN0IHF1ZXN0aW9ucyBiYXNlZCB1cG9uIHRoZSBhbmFseXNpcyBvZiB0aGUgc3VydmV5IGRhdGEgc2V0IGFuZCB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgZm91bmQuDQoNClNvbWUgcG90ZW50aWFsIHF1ZXN0aW9ucyBpbmNsdWRlOg0KDQoqIFdoaWNoIGZhY3RvcnMgb2Ygc3R1ZGVudCBleHBlcmllbmNlIHNob3dlZCB0aGUgc3Ryb25nZXN0IGluZmx1ZW5jZSBvbiBzdHVkZW50IHNhdGlzZmFjdGlvbj8gDQoNCiogRGlkIHRoZXNlIHBhcnRpY3VsYXIgZmFjdG9ycyB3aXRoIHRoZSBzdHJvbmdlc3QgaW5mbHVlbmNlIG9uIHNhdGlzZmFjdGlvbiBzaG93IHN0cm9uZ2VyIHJlbGlhYmlsaXR5IHdoZW4gY29tcGFyZWQgdG8gdGhlIG90aGVycz8NCg0KKiBEbyBzdHVkZW50cyBhcHBlYXIgdG8gYmUgbW9zdGx5IHNhdGlzZmllZCB3aXRoIHRoZWlyIHNjaG9vbCBleHBlcmllbmNlPw0KDQoNCkZvciB0aGlzIHByb2plY3QsIEkgd291bGQgYmUgaW50ZXJlc3RpbmcgaW4gbG9va2luZyBpbnRvIHBhcnRpY3Vhcmx5IHRoZSB0b3BpYyBvZiB3aGljaCBzdHVkZW50IGV4cGVyaWVuY2UgZmFjdG9ycyBoYXZlIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2Ugb3IgZWZmZWN0IG9uIGEgc3R1ZGVudCdzIHNhdGlzZmFjdGlvbiB3aXRoIHRoZWlyIGNvbGxlZ2UgZXhwZXJpZW5jZS4gVGhpcyB3b3VsZCBiZSBoZWxwZnVsIGJlY2F1c2UgaXQgd291bGQgZ2l2ZSBzcGVjaWZpYyBmYWN0b3JzIGZvciBjb2xsZWdlIGZhY3VsdHkgb3IgYWR2aXNvcnMgdG8gbG9vayBvdXQgZm9yIGluIHRoZWlyIHN0dWRlbnRzIGluIG9yZGVyIHRvIGhlbHAgdGhlbSBoYXZlIGEgbW9yZSBwb3NpdGl2ZSBhbmQgc2F0aXNmYWN0b3J5IGV4cGVyaWVuY2UgZHVyaW5nIHRoZWlyIHRpbWUgaW4gY29sbGVnZS4NCg0KSSB0aGluayBpdCB3b3VsZCBiZSBpbnRlcmVzaW5nIHRvIHNlZSBpZiB0aGVzZSBwYXJ0aWN1bGFyIGZhY3RvcnMgd2l0aCBzdHJvbmdlciBpbmZsdWVuY2Ugb24gYSBzdHVkZW50J3Mgc2F0aXNmYWN0aW9uIGhhdmUgc3Ryb25nZXIgcmVsaWFiaWxpdHkuIEl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIGNvbXBhcmUgdGhlIHJlbGlhYmlsaXR5IHJlc3VsdHMgb2YgdGhlc2UgcGFydGljdWxhciBmYWN0b3JzIHRvIHNlZSBpZiB0aGVpciBhcHBlYXJzIHN0cm9uZ2VyIG9yIHdlYWtlciB0aGFuIHRoZSBhdmVyYWdlLiBUaGlzIHdvdWxkIGhlbHAgdG8gc2VlIGlmIHRoZXNlIGZpbmRpbmdzIHRydWx5IGFyZSByZWxpYWJsZSBvciBub3QuIA0K