Introduction
The data set for this study was collected from the Traffic
Information Management System. It keeps track of the number of cyclists
entering and leaving the Queensboro Bridge from the dates July 1st to
July 31st. This data set includes a total of 31 observations and seven
variables. The response variable is the total number of cyclist that
pass through the Queensboro bridge on each given day. The explanatory
variables for this data set involve the specific conditions of each day,
such as the weather.
Variable
Description
Here are what the seven variables in the data set represent:
Date (x1) - note this represents the observation ID
Day (x2) - The day of the week
HighTemp (x3) - the temperature high for the day in degrees
Fahrenheit
LowTemp (x4) - the temperature high for the day in degrees
Fahrenheit
Precipitation (x5) - the total precipitation for the day in
inches
Queensboro Bridge (Y) - The number of cyclists on the Queensboro
bridge.
Total (x6) - the total number of cyclists who enter and leave the
bridges in NYC each day
Practical
Question
Do the conditions surrounding the day the cyclists are recorded
affect the number of them enter and leave the QueensboroBridge?
Data Download and
Cleaning
First, we are going to download the data. Since it is a small data
set, we can look at the data and conclude there are no missing values.
We are also going to remove to commas from the variables “Total” and
“QueensboroBridge” so R Studio classifies them as numeric.
cycle <- read.csv("https://raw.githubusercontent.com/AvaDeSt/STA-321/refs/heads/main/Assignment%205%20data(Sheet1).csv", header = TRUE)
cycle$Total <- as.numeric(gsub(",", "", cycle$Total))
cycle$QueensboroBridge <- as.numeric(gsub(",", "", cycle$QueensboroBridge))
data(cycle)
## Warning in data(cycle): data set 'cycle' not found
kable(head(cycle), caption = "First few records in the data set")
First few records in the data set
1-Jul |
Saturday |
84.9 |
72.0 |
0.23 |
3216 |
11867 |
2-Jul |
Sunday |
87.1 |
73.0 |
0.00 |
3579 |
13995 |
3-Jul |
Monday |
87.1 |
71.1 |
0.45 |
4230 |
16067 |
4-Jul |
Tuesday |
82.9 |
70.0 |
0.00 |
3861 |
13925 |
5-Jul |
Wednesday |
84.9 |
71.1 |
0.00 |
5862 |
23110 |
6-Jul |
Thursday |
75.0 |
71.1 |
0.00 |
5251 |
21861 |
Model Building
For this study, a poisson regression model will be used. The poisson
regression model has four basic assumptions that are as follows:
The response variable is a count per unit of time or space. ( In
our case it is the count of cyclists per day).
The observations are independent of one another.
The mean of the poisson random variable is equal to the
variance.
The log of the mean rate, log(λ), is a linear function of
x
Poisson Regression on
Queensboro Bridge Cyclists Only
Here we are building a poisson frequancy regression model for our
data set. The variable “Date” was left out of this model since it is
only an observation ID. The variable “Total” was left of because we can
assume that the total amount of bikers that pass the Queensboro Bridge
and the total amount of bikers overall are proportional to each
other.
model.freq <- glm(QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation, family = poisson(link = "log"), data = cycle)
pois.count.coef = summary(model.freq)$coef
kable(pois.count.coef, caption = "The Poisson regression model for the counts of cyclist entering and leaving the Queensboro Bridge.")
The Poisson regression model for the counts of cyclist entering
and leaving the Queensboro Bridge.
(Intercept) |
8.5517234 |
0.0479068 |
178.507570 |
0e+00 |
DayMonday |
0.0541753 |
0.0108546 |
4.991021 |
6e-07 |
DaySaturday |
-0.1953380 |
0.0111460 |
-17.525400 |
0e+00 |
DaySunday |
-0.2226164 |
0.0115879 |
-19.211108 |
0e+00 |
DayThursday |
0.1157122 |
0.0113093 |
10.231628 |
0e+00 |
DayTuesday |
0.0965569 |
0.0113512 |
8.506349 |
0e+00 |
DayWednesday |
0.1836698 |
0.0110677 |
16.595046 |
0e+00 |
HighTemp |
0.0158199 |
0.0008034 |
19.691515 |
0e+00 |
LowTemp |
-0.0197465 |
0.0011701 |
-16.876092 |
0e+00 |
Precipitation |
-0.3221763 |
0.0105342 |
-30.583731 |
0e+00 |
The table indicates that the day of the week, the daily high and low
temperatures, and the precipitation levels are all highly significant.
This means that the weather and day of the week ar4e good indicators of
how many bikers will pass through the Queensboro bridge on a given day.
However, it is important to keep in mind that this does not necessarily
mean the model is important. For example, the sample size for this study
is small and may not represent the entire population. Another way to
interpret this is that the cyclist counts on the Queensboro bridge are
not dependent on the total number of cyclists on all the New York
bridges. Because all these variables are highly significant, they will
be included in the following models. We can see that the coefficient for
the temperature high is about 0.158. This means that for every one
degree increase in the temperature high, the log of the expected count
of cyclists increases by 0.158. Since exp(0.158) = 1.173, for each
one-unit increase in the predictor variable, the expected count of the
outcome variable increases by about 17.3%, holding other variables
constant.
Poisson Regression on
Rates with the Total Count
This model looks at the relationship between the rate of cyclists and
the day of the week as well as temperature. Here we will also look at
the total number of cyclists that cross all the bridges in New York.
model.rates <- glm(QueensboroBridge ~ Day + HighTemp +LowTemp + Precipitation, offset = log(Total),
family = poisson(link = "log"), data = cycle)
kable(summary(model.rates)$coef, caption = "Poisson regression on the rate of cyclists.")
Poisson regression on the rate of cyclists.
(Intercept) |
-1.2497959 |
0.0481655 |
-25.947936 |
0.0000000 |
DayMonday |
-0.0673728 |
0.0109257 |
-6.166450 |
0.0000000 |
DaySaturday |
-0.0264248 |
0.0112172 |
-2.355741 |
0.0184858 |
DaySunday |
-0.0771257 |
0.0117421 |
-6.568307 |
0.0000000 |
DayThursday |
-0.0166461 |
0.0114600 |
-1.452543 |
0.1463505 |
DayTuesday |
-0.0410056 |
0.0115661 |
-3.545335 |
0.0003921 |
DayWednesday |
-0.0420583 |
0.0111611 |
-3.768289 |
0.0001644 |
HighTemp |
0.0020227 |
0.0008231 |
2.457506 |
0.0139906 |
LowTemp |
-0.0042179 |
0.0011624 |
-3.628492 |
0.0002851 |
Precipitation |
0.0451435 |
0.0097403 |
4.634702 |
0.0000036 |
The table shows that the log of bikers crossing the bridge is not the
same across all days of the week. The log rates for the day Friday are
higher than the rest of the days of the week. The intercept represents
the log base cyclist rate for the baseline day Friday. The rest of the
coefficients are the difference of log rates between the baseline day
Friday and the rest of the days of the week. We can see from the table
that -0.067 is the coefficient for Monday so:
log(RMonday / RFriday) = -0.067 ⇒ RMonday / RFriday = e^−0.067 ≈
0.935
This means that the rate of bikers on Monday is about 6.5% lower on
Monday than on Friday.
Next, we are building a quasi poison model. This is generally a
better model to use when the mean and the variance of the data are not
the same.
model.rates <- glm(QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation, offset = log(Total),
family = quasipoisson, data = cycle)
summary(model.rates)
##
## Call:
## glm(formula = QueensboroBridge ~ Day + HighTemp + LowTemp + Precipitation,
## family = quasipoisson, data = cycle, offset = log(Total))
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.249796 0.195999 -6.377 2.54e-06 ***
## DayMonday -0.067373 0.044460 -1.515 0.145
## DaySaturday -0.026425 0.045646 -0.579 0.569
## DaySunday -0.077126 0.047782 -1.614 0.121
## DayThursday -0.016646 0.046634 -0.357 0.725
## DayTuesday -0.041006 0.047066 -0.871 0.393
## DayWednesday -0.042058 0.045418 -0.926 0.365
## HighTemp 0.002023 0.003349 0.604 0.552
## LowTemp -0.004218 0.004730 -0.892 0.383
## Precipitation 0.045143 0.039636 1.139 0.268
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for quasipoisson family taken to be 16.559)
##
## Null deviance: 467.32 on 30 degrees of freedom
## Residual deviance: 343.68 on 21 degrees of freedom
## AIC: NA
##
## Number of Fisher Scoring iterations: 3
We can see from this model that none of the variables are no longer
significant. This suggests that the mean and the variance of the data
set are equal, and a quasi poisson model is not needed.
Final Model
Given the data that we have, the best model to use is the first
poisson frequency regression model that does not take into account the
total number of cyclists that cross every bridge. While this variable
can help predict the number of cyclists on the Queensboro bridge, it is
not needed for a successful model, and the response variable is not
reliant on it. The poisson frequency regression model can be written
as
QueensboroBridge = 8.552 - 0.227 * DaySunday + 0.054 * DayMonday +
0.097 * DayTuesday + 0.184 * DayWednesday + 0.116 * DayThursday - 0.193
* DaySaturday + 0.016 * HighTemp - 0.020 * LowTemp - 0.322 *
Precipitation
Summary and
Conclusion
To summarize, we looked at a data set that looks at how many bikers
cross over the Queensboro Bridge in NYC every day for the month of July,
leaving us with 31 observations. The 4 explanatory variables look at the
day of the week and the weather conditions on each day. Our goal was to
see what the relationship was between these variables and the number of
cyclists. We also wanted to see if taking into account the total number
of cyclists that cross several major bridges in NYC. To figure this out,
we built a Poisson frequency regression model, a Poisson Model on rates,
and a quasi poisson model. Based on our small sample, we found that the
poisson frequency regression model performed the best. This would
indicate that the total number of cyclists in Queensboroo is not reliant
on the total number of cyclists on the other bridges although including
still makes a good model.
LS0tDQp0aXRsZTogJ1BvaXNzb24gTW9kZWxzIEZvciBDeWNsaXN0IERhdGEnDQphdXRob3I6ICdBdmEgRGVTdGVmYW5vJw0KZGF0ZTogIjEwLTI5LTI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX3dpZHRoOiA2DQogICAgZmlnX2hlaWdodDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgRGV0ZWN0LCBpbnN0YWxsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiAgIGxpYnJhcnkoTUFTUykNCn0NCmlmICghcmVxdWlyZSgicFJPQyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwUk9DIikNCiAgIGxpYnJhcnkocFJPQykNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJJU3dSIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIklTd1IiKQ0KICAgbGlicmFyeShJU3dSKQ0KfQ0KDQojIHNwZWNpZmljYXRpb25zIG9mIG91dHB1dHMgb2YgY29kZSBpbiBjb2RlIGNodW5rcw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFICAgICANCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24gDQoNClRoZSBkYXRhIHNldCBmb3IgdGhpcyBzdHVkeSB3YXMgY29sbGVjdGVkIGZyb20gdGhlIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBTeXN0ZW0uIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlIGZyb20gdGhlIGRhdGVzIEp1bHkgMXN0IHRvIEp1bHkgMzFzdC4gVGhpcyBkYXRhIHNldCBpbmNsdWRlcyBhIHRvdGFsIG9mIDMxIG9ic2VydmF0aW9ucyBhbmQgc2V2ZW4gdmFyaWFibGVzLiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0IHRoYXQgcGFzcyB0aHJvdWdoIHRoZSAgUXVlZW5zYm9ybyBicmlkZ2Ugb24gZWFjaCBnaXZlbiBkYXkuIFRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgZm9yIHRoaXMgZGF0YSBzZXQgaW52b2x2ZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBvZiBlYWNoIGRheSwgc3VjaCBhcyB0aGUgd2VhdGhlci4NCg0KIyMgVmFyaWFibGUgRGVzY3JpcHRpb24NCg0KSGVyZSBhcmUgd2hhdCB0aGUgc2V2ZW4gdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldCByZXByZXNlbnQ6DQoNCiogRGF0ZSAoeDEpIC0gbm90ZSB0aGlzIHJlcHJlc2VudHMgdGhlIG9ic2VydmF0aW9uIElEDQoNCiogRGF5ICh4MikgLSBUaGUgZGF5IG9mIHRoZSB3ZWVrDQoNCiogSGlnaFRlbXAgKHgzKSAtIHRoZSB0ZW1wZXJhdHVyZSBoaWdoIGZvciB0aGUgZGF5IGluIGRlZ3JlZXMgRmFocmVuaGVpdA0KDQoqIExvd1RlbXAgKHg0KSAtIHRoZSB0ZW1wZXJhdHVyZSBoaWdoIGZvciB0aGUgZGF5IGluIGRlZ3JlZXMgRmFocmVuaGVpdA0KDQoqIFByZWNpcGl0YXRpb24gKHg1KSAtIHRoZSB0b3RhbCBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZGF5IGluIGluY2hlcw0KDQoqIFF1ZWVuc2Jvcm8gQnJpZGdlIChZKSAtIFRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFF1ZWVuc2Jvcm8gYnJpZGdlLg0KDQoqIFRvdGFsICh4NikgLSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIHdobyBlbnRlciBhbmQgbGVhdmUgdGhlIGJyaWRnZXMgaW4gTllDIGVhY2ggZGF5DQoNCiMjIFByYWN0aWNhbCBRdWVzdGlvbiANCg0KRG8gdGhlIGNvbmRpdGlvbnMgc3Vycm91bmRpbmcgdGhlIGRheSB0aGUgY3ljbGlzdHMgYXJlIHJlY29yZGVkIGFmZmVjdCB0aGUgbnVtYmVyIG9mIHRoZW0gZW50ZXIgYW5kIGxlYXZlIHRoZSBRdWVlbnNib3JvQnJpZGdlPw0KDQojIyBEYXRhIERvd25sb2FkIGFuZCBDbGVhbmluZw0KDQpGaXJzdCwgd2UgYXJlIGdvaW5nIHRvIGRvd25sb2FkIHRoZSBkYXRhLiBTaW5jZSBpdCBpcyBhIHNtYWxsIGRhdGEgc2V0LCB3ZSBjYW4gbG9vayBhdCB0aGUgZGF0YSBhbmQgY29uY2x1ZGUgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzLiBXZSBhcmUgYWxzbyBnb2luZyB0byByZW1vdmUgdG8gY29tbWFzIGZyb20gdGhlIHZhcmlhYmxlcyAiVG90YWwiIGFuZCAiUXVlZW5zYm9yb0JyaWRnZSIgc28gUiBTdHVkaW8gY2xhc3NpZmllcyB0aGVtIGFzIG51bWVyaWMuDQoNCmBgYHtyfQ0KY3ljbGUgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9BdmFEZVN0L1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL0Fzc2lnbm1lbnQlMjA1JTIwZGF0YShTaGVldDEpLmNzdiIsIGhlYWRlciA9IFRSVUUpDQogICAgICAgICAgDQpjeWNsZSRUb3RhbCA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgY3ljbGUkVG90YWwpKQ0KY3ljbGUkUXVlZW5zYm9yb0JyaWRnZSA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgY3ljbGUkUXVlZW5zYm9yb0JyaWRnZSkpDQoNCg0KZGF0YShjeWNsZSkNCmthYmxlKGhlYWQoY3ljbGUpLCBjYXB0aW9uID0gIkZpcnN0IGZldyByZWNvcmRzIGluIHRoZSBkYXRhIHNldCIpDQoNCmBgYA0KDQoNCiMgTW9kZWwgQnVpbGRpbmcgDQoNCkZvciB0aGlzIHN0dWR5LCBhIHBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aWxsIGJlIHVzZWQuIFRoZSBwb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIGZvdXIgYmFzaWMgYXNzdW1wdGlvbnMgdGhhdCBhcmUgYXMgZm9sbG93czoNCg0KLSBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgYSBjb3VudCBwZXIgdW5pdCBvZiB0aW1lIG9yIHNwYWNlLiAoIEluIG91ciBjYXNlIGl0IGlzIHRoZSBjb3VudCBvZiBjeWNsaXN0cyBwZXIgZGF5KS4NCg0KLSBUaGUgb2JzZXJ2YXRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBvbmUgYW5vdGhlci4NCg0KLSBUaGUgbWVhbiBvZiB0aGUgcG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlLg0KDQotIFRoZSBsb2cgb2YgdGhlIG1lYW4gcmF0ZSwgbG9nKM67KSwgaXMgYSBsaW5lYXIgZnVuY3Rpb24gb2YgeA0KDQoNCiMjIFBvaXNzb24gUmVncmVzc2lvbiBvbiBRdWVlbnNib3JvIEJyaWRnZSBDeWNsaXN0cyBPbmx5DQoNCkhlcmUgd2UgYXJlIGJ1aWxkaW5nIGEgcG9pc3NvbiBmcmVxdWFuY3kgcmVncmVzc2lvbiBtb2RlbCBmb3Igb3VyIGRhdGEgc2V0LiBUaGUgdmFyaWFibGUgIkRhdGUiIHdhcyBsZWZ0IG91dCBvZiB0aGlzIG1vZGVsIHNpbmNlIGl0IGlzIG9ubHkgYW4gb2JzZXJ2YXRpb24gSUQuIFRoZSB2YXJpYWJsZSAiVG90YWwiIHdhcyBsZWZ0IG9mIGJlY2F1c2Ugd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0b3RhbCBhbW91bnQgb2YgYmlrZXJzIHRoYXQgcGFzcyB0aGUgUXVlZW5zYm9ybyBCcmlkZ2UgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgYmlrZXJzIG92ZXJhbGwgYXJlIHByb3BvcnRpb25hbCB0byBlYWNoIG90aGVyLiANCmBgYHtyfQ0KbW9kZWwuZnJlcSA8LSBnbG0oUXVlZW5zYm9yb0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICsgTG93VGVtcCArIFByZWNpcGl0YXRpb24sIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSwgZGF0YSA9IGN5Y2xlKQ0KDQoNCg0KcG9pcy5jb3VudC5jb2VmID0gc3VtbWFyeShtb2RlbC5mcmVxKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiVGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIGNvdW50cyBvZiBjeWNsaXN0IGVudGVyaW5nIGFuZCBsZWF2aW5nIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4iKQ0KDQpgYGANClRoZSB0YWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCB0aGUgZGFpbHkgaGlnaCBhbmQgbG93IHRlbXBlcmF0dXJlcywgYW5kIHRoZSBwcmVjaXBpdGF0aW9uIGxldmVscyBhcmUgYWxsIGhpZ2hseSBzaWduaWZpY2FudC4gVGhpcyBtZWFucyB0aGF0IHRoZSB3ZWF0aGVyIGFuZCBkYXkgb2YgdGhlIHdlZWsgYXI0ZSBnb29kIGluZGljYXRvcnMgb2YgaG93IG1hbnkgYmlrZXJzIHdpbGwgcGFzcyB0aHJvdWdoIHRoZSBRdWVlbnNib3JvIGJyaWRnZSBvbiBhIGdpdmVuIGRheS4gSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgbW9kZWwgaXMgaW1wb3J0YW50LiBGb3IgZXhhbXBsZSwgdGhlIHNhbXBsZSBzaXplIGZvciB0aGlzIHN0dWR5IGlzIHNtYWxsIGFuZCBtYXkgbm90IHJlcHJlc2VudCB0aGUgZW50aXJlIHBvcHVsYXRpb24uIEFub3RoZXIgd2F5IHRvIGludGVycHJldCB0aGlzIGlzIHRoYXQgdGhlIGN5Y2xpc3QgY291bnRzIG9uIHRoZSBRdWVlbnNib3JvIGJyaWRnZSBhcmUgbm90IGRlcGVuZGVudCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCB0aGUgTmV3IFlvcmsgYnJpZGdlcy4gQmVjYXVzZSBhbGwgdGhlc2UgdmFyaWFibGVzIGFyZSBoaWdobHkgc2lnbmlmaWNhbnQsIHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIHRlbXBlcmF0dXJlIGhpZ2ggaXMgYWJvdXQgMC4xNTguIFRoaXMgbWVhbnMgdGhhdCBmb3IgZXZlcnkgb25lIGRlZ3JlZSBpbmNyZWFzZSBpbiB0aGUgdGVtcGVyYXR1cmUgaGlnaCwgdGhlIGxvZyBvZiB0aGUgZXhwZWN0ZWQgY291bnQgb2YgY3ljbGlzdHMgaW5jcmVhc2VzIGJ5IDAuMTU4LiBTaW5jZSBleHAoMC4xNTgpID0gMS4xNzMsIGZvciBlYWNoIG9uZS11bml0IGluY3JlYXNlIGluIHRoZSBwcmVkaWN0b3IgdmFyaWFibGUsIHRoZSBleHBlY3RlZCBjb3VudCBvZiB0aGUgb3V0Y29tZSB2YXJpYWJsZSBpbmNyZWFzZXMgYnkgYWJvdXQgMTcuMyUsIGhvbGRpbmcgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoNCg0KIyMgUG9pc3NvbiBSZWdyZXNzaW9uIG9uIFJhdGVzIHdpdGggdGhlIFRvdGFsIENvdW50DQoNClRoaXMgbW9kZWwgbG9va3MgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByYXRlIG9mIGN5Y2xpc3RzIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFzIHdlbGwgYXMgdGVtcGVyYXR1cmUuIEhlcmUgd2Ugd2lsbCBhbHNvIGxvb2sgYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIGFsbCB0aGUgYnJpZGdlcyBpbiBOZXcgWW9yay4NCg0KYGBge3J9DQptb2RlbC5yYXRlcyA8LSBnbG0oUXVlZW5zYm9yb0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICtMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgb2Zmc2V0ID0gbG9nKFRvdGFsKSwgDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGUpDQprYWJsZShzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiBjeWNsaXN0cy4iKQ0KYGBgDQoNClRoZSB0YWJsZSBzaG93cyB0aGF0IHRoZSBsb2cgb2YgYmlrZXJzIGNyb3NzaW5nIHRoZSBicmlkZ2UgaXMgbm90IHRoZSBzYW1lIGFjcm9zcyBhbGwgZGF5cyBvZiB0aGUgd2Vlay4gVGhlIGxvZyByYXRlcyBmb3IgdGhlIGRheSBGcmlkYXkgYXJlIGhpZ2hlciB0aGFuIHRoZSByZXN0IG9mIHRoZSBkYXlzIG9mIHRoZSB3ZWVrLiBUaGUgaW50ZXJjZXB0IHJlcHJlc2VudHMgdGhlIGxvZyBiYXNlIGN5Y2xpc3QgcmF0ZSBmb3IgdGhlIGJhc2VsaW5lIGRheSBGcmlkYXkuIFRoZSByZXN0IG9mIHRoZSBjb2VmZmljaWVudHMgYXJlIHRoZSBkaWZmZXJlbmNlIG9mIGxvZyByYXRlcyBiZXR3ZWVuIHRoZSBiYXNlbGluZSBkYXkgRnJpZGF5IGFuZCB0aGUgcmVzdCBvZiB0aGUgZGF5cyBvZiB0aGUgd2Vlay4gV2UgY2FuIHNlZSBmcm9tIHRoZSB0YWJsZSB0aGF0IC0wLjA2NyBpcyB0aGUgY29lZmZpY2llbnQgZm9yIE1vbmRheSBzbzoNCg0KbG9nKFJNb25kYXkgLyBSRnJpZGF5KSA9IC0wLjA2NyDih5IgICBSTW9uZGF5IC8gUkZyaWRheSA9IGVe4oiSMC4wNjcg4omIIDAuOTM1DQoNClRoaXMgbWVhbnMgdGhhdCB0aGUgcmF0ZSBvZiBiaWtlcnMgb24gTW9uZGF5IGlzIGFib3V0IDYuNSUgbG93ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5Lg0KDQpOZXh0LCB3ZSBhcmUgYnVpbGRpbmcgYSBxdWFzaSBwb2lzb24gbW9kZWwuIFRoaXMgaXMgZ2VuZXJhbGx5IGEgYmV0dGVyIG1vZGVsIHRvIHVzZSB3aGVuIHRoZSBtZWFuIGFuZCB0aGUgdmFyaWFuY2Ugb2YgdGhlIGRhdGEgYXJlIG5vdCB0aGUgc2FtZS4gDQoNCmBgYHtyfQ0KbW9kZWwucmF0ZXMgPC0gZ2xtKFF1ZWVuc2Jvcm9CcmlkZ2UgfiBEYXkgKyBIaWdoVGVtcCArIExvd1RlbXAgKyBQcmVjaXBpdGF0aW9uLCBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBjeWNsZSkNCnN1bW1hcnkobW9kZWwucmF0ZXMpDQpgYGANCldlIGNhbiBzZWUgZnJvbSB0aGlzIG1vZGVsIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFibGVzIGFyZSBubyBsb25nZXIgc2lnbmlmaWNhbnQuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgbWVhbiBhbmQgdGhlIHZhcmlhbmNlIG9mIHRoZSBkYXRhIHNldCBhcmUgZXF1YWwsIGFuZCBhIHF1YXNpIHBvaXNzb24gbW9kZWwgaXMgbm90IG5lZWRlZC4gDQoNCg0KIyMgRmluYWwgTW9kZWwgDQoNCkdpdmVuIHRoZSBkYXRhIHRoYXQgd2UgaGF2ZSwgdGhlIGJlc3QgbW9kZWwgdG8gdXNlIGlzIHRoZSBmaXJzdCBwb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsIHRoYXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIGV2ZXJ5IGJyaWRnZS4gV2hpbGUgdGhpcyB2YXJpYWJsZSBjYW4gaGVscCBwcmVkaWN0IHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFF1ZWVuc2Jvcm8gYnJpZGdlLCBpdCBpcyBub3QgbmVlZGVkIGZvciBhIHN1Y2Nlc3NmdWwgbW9kZWwsIGFuZCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgbm90IHJlbGlhbnQgb24gaXQuIFRoZSBwb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsIGNhbiBiZSB3cml0dGVuIGFzIA0KDQpRdWVlbnNib3JvQnJpZGdlID0gOC41NTIgLSAwLjIyNyAqIERheVN1bmRheSArIDAuMDU0ICogRGF5TW9uZGF5ICsgMC4wOTcgKiBEYXlUdWVzZGF5ICsgMC4xODQgKiBEYXlXZWRuZXNkYXkgKyAwLjExNiAqIERheVRodXJzZGF5IC0gMC4xOTMgKiBEYXlTYXR1cmRheSArIDAuMDE2ICogSGlnaFRlbXAgLSAwLjAyMCAqIExvd1RlbXAgLSAwLjMyMiAqIFByZWNpcGl0YXRpb24NCg0KIyBTdW1tYXJ5IGFuZCBDb25jbHVzaW9uDQoNClRvIHN1bW1hcml6ZSwgd2UgbG9va2VkIGF0IGEgZGF0YSBzZXQgdGhhdCBsb29rcyBhdCBob3cgbWFueSBiaWtlcnMgY3Jvc3Mgb3ZlciB0aGUgUXVlZW5zYm9ybyBCcmlkZ2UgaW4gTllDIGV2ZXJ5IGRheSBmb3IgdGhlIG1vbnRoIG9mIEp1bHksIGxlYXZpbmcgdXMgd2l0aCAzMSBvYnNlcnZhdGlvbnMuIFRoZSA0IGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBsb29rIGF0IHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSB3ZWF0aGVyIGNvbmRpdGlvbnMgb24gZWFjaCBkYXkuIE91ciBnb2FsIHdhcyB0byBzZWUgd2hhdCB0aGUgcmVsYXRpb25zaGlwIHdhcyBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcyBhbmQgdGhlIG51bWJlciBvZiBjeWNsaXN0cy4gV2UgYWxzbyB3YW50ZWQgdG8gc2VlIGlmIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyB0aGF0IGNyb3NzIHNldmVyYWwgbWFqb3IgYnJpZGdlcyBpbiBOWUMuIFRvIGZpZ3VyZSB0aGlzIG91dCwgd2UgYnVpbHQgYSBQb2lzc29uIGZyZXF1ZW5jeSByZWdyZXNzaW9uIG1vZGVsLCBhIFBvaXNzb24gTW9kZWwgb24gcmF0ZXMsIGFuZCBhIHF1YXNpIHBvaXNzb24gbW9kZWwuIEJhc2VkIG9uIG91ciBzbWFsbCBzYW1wbGUsIHdlIGZvdW5kIHRoYXQgdGhlIHBvaXNzb24gZnJlcXVlbmN5IHJlZ3Jlc3Npb24gbW9kZWwgcGVyZm9ybWVkIHRoZSBiZXN0LiBUaGlzIHdvdWxkIGluZGljYXRlIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBpbiBRdWVlbnNib3JvbyBpcyBub3QgcmVsaWFudCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBvdGhlciBicmlkZ2VzIGFsdGhvdWdoIGluY2x1ZGluZyBzdGlsbCBtYWtlcyBhIGdvb2QgbW9kZWwuDQo=