Introduction
In this project we are going to fit the quasi-Poisson regression
model on the counts of cyclists who entered and left the Williamsburg
Bridge. We will report the value of the estimated dispersion parameter
and based on the value determine whether the regular Poisson model or
the quasi-Poisson should be used as the final model. Lastly, we will
make a visualization to show the relationship between the number of
cyclists who entered and left the bridge and the related predictor
variables.
Data
Here are all the variables in this project:
- Date- observation ID
- AvgTemp-(HighTemp + LowTemp)/2.
- NewPrecip-if Precipitation = 0, then NewPrecip = 0; if Precipitation
> 0, then NewPrecip = 1.
- WilliamsburgBridge- bike count on the Williamsburg Bridge.
- Total-Bike count of all bridges
Poisson Regression on
Rates
The following model assesses the potential relationship between biker
count rates on the Williamsburg bridge and Date, AvgTemp, and
NewPrecip,. This is the primary interest of the model.
Poisson regression on the rate of the the bike rate of people
coming in and out of the bridge.
| (Intercept) |
5.036 |
14.68 |
0.343 |
0.7316 |
| Date |
-0.0001417 |
0.0003429 |
-0.4132 |
0.6795 |
| AvgTemp |
-0.001413 |
0.0003525 |
-4.009 |
6.095e-05 |
| NewPrecip |
0.01941 |
0.005767 |
3.366 |
0.0007623 |
The above table indicates that Date is not a good fit for this model
due to its p-value. The coefficients represent the log change in
expected count for a one unit increase in our predictor value. The log
rates of NewPrecip were higher than any other variable since its
absolute value is the highest out of all predictor variables.
Quasi-Poisson Rate
Model
The quasi-Poisson returns the dispersion coefficient.
Quasi-Poisson regression on the rate of the bike rate of people
coming in and out of the bridge.
| (Intercept) |
5.036 |
30.44 |
0.1654 |
0.8699 |
| Date |
-0.0001417 |
0.000711 |
-0.1993 |
0.8436 |
| AvgTemp |
-0.001413 |
0.0007308 |
-1.934 |
0.06412 |
| NewPrecip |
0.01941 |
0.01196 |
1.624 |
0.1165 |
Looking at this table we can see that Date still is not a good
predictor variable and we will have to take the variable out of the
final model. In this model, Date still is the lowest estimate and
NewPrecip is the highest of the predictor variables. AvgTemp is the most
significant value based on p-value.
The dispersion index can be extracted from the quasi-Poisson object
with the following code
The dispersion index is 7.451. This is a high number so there is over
dispersion. This means that we stay with the Quasi-Poisson rate
model.
Visuals
These visuals below are to show the relationship between the number
of cyclists who entered and left the bridge and their relation to
AvgTemp, Date, and Precipitation.


Looking at these graphs you can see that both of their predicted
bikers go down as the date passes. If you look at the other graph you
will see that “no precipitation” has a higher average of predicted
bikers than “precipitation”. Precipitation effects both graphs in a big
way.
Discussions and
Conclusions
The quasi-poisson rate model based on the bike count is not
appropriate since the information on the total biker count is a key
variable in the study of WilliamsburgBridge distribution. Including the
total biker count in the quasi-poisson rate model will reduce the
statistical significance of AvgTemp and NewPrecip. See the following
output of the fitted quasi-poisson rate model of Williamsburg Bridge
bike count adjusted by total bike count.
The Poisson regression model for the counts of bikers versus
the average temp, precipitation, and the total biker count.
| (Intercept) |
-0.5851487 |
0.1735099 |
-3.3724224 |
0.0023420 |
| AvgTemp |
-0.0000765 |
0.0008017 |
-0.0954342 |
0.9247017 |
| NewPrecip |
0.0053194 |
0.0117947 |
0.4509952 |
0.6557320 |
| log(Total) |
0.9458853 |
0.0206076 |
45.8998833 |
0.0000000 |
The log(Total) in bike rate is significantly higher than the other
predictor variables . There should be more investigation in why the
log(Total) is distributing the data.
There is a negative linear relationship between AvgTemp and Date. The
AvgTemp decreases as Date increase.
The last statistical observation is that there is no interaction
effect between the precip groups and nonprecip. The rate curves are
“parallel”.
This is only a small data set with limited information. All
conclusions in this report are only based on the given data set.
LS0tCnRpdGxlOiAiV2lsbGlhbXNidXJnIEJyaWRnZSBQb2lzc29uIFJlZ3Jlc3Npb24iCmF1dGhvcjogIlJ5YW4gTGVibyIKZGF0ZTogIjIwMjQtMTEtMTIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCiAgICBmaWdfd2lkdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBsdW1lbgogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgZmlnX3dpZHRoOiAzCiAgICBmaWdfaGVpZ2h0OiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKc2x3YXlzX2FsbG93X2h0bWw6IHRydWUKLS0tCgpgYGB7PWh0bWx9Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovCgpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9Cmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAyMnB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0KCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9Cgo8L3N0eWxlPgpgYGAKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuCmlmICghcmVxdWlyZSgia25pdHIiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpCiAgIGxpYnJhcnkoa25pdHIpCn0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpCiAgIGxpYnJhcnkobGVhZmxldCkKfQppZiAoIXJlcXVpcmUoIkVudlN0YXRzIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQogICBsaWJyYXJ5KEVudlN0YXRzKQp9CmlmICghcmVxdWlyZSgiTUFTUyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQogICBsaWJyYXJ5KE1BU1MpCn0KaWYgKCFyZXF1aXJlKCJwaHl0b29scyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBoeXRvb2xzIikKICAgbGlicmFyeShwaHl0b29scykKfQppZiAoIXJlcXVpcmUoIm1sYmVuY2giKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikKICAgbGlicmFyeShtbGJlbmNoKQp9CmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikKICAgbGlicmFyeShwYW5kZXIpCn0KaWYgKCFyZXF1aXJlKCJJU3dSIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiSVN3UiIpCiAgIGxpYnJhcnkoSVN3UikKfQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKICAgbGlicmFyeShnZ3Bsb3QyKQp9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gRkFMU0UgICAKICAgICAgICAgICAgICAgICAgICAgICkgICAKYGBgCgoKYGBge3J9CmJpa2VzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUnlhbkxlYm8vU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vRGF0YSUyMGZpbGVXaWxsaWFtc2J1cmdCcmlkZ2UuY3N2IiwgaGVhZGVyID0gVFJVRSkKYGBgCgoKYGBge3J9CmJpa2VzJEF2Z1RlbXAgPC0gKGJpa2VzJEhpZ2hUZW1wICsgYmlrZXMkTG93VGVtcCkgLyAyCgpiaWtlcyROZXdQcmVjaXAgPC0gaWZlbHNlKGJpa2VzJFByZWNpcGl0YXRpb24gPiAwLCAxLCAwKQoKYGBgCgojIEludHJvZHVjdGlvbgpJbiB0aGlzIHByb2plY3Qgd2UgYXJlIGdvaW5nIHRvIGZpdCB0aGUgcXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBjb3VudHMgb2YgY3ljbGlzdHMgd2hvIGVudGVyZWQgYW5kIGxlZnQgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFdlIHdpbGwgcmVwb3J0IHRoZSB2YWx1ZSBvZiB0aGUgZXN0aW1hdGVkIGRpc3BlcnNpb24gcGFyYW1ldGVyIGFuZCBiYXNlZCBvbiB0aGUgdmFsdWUgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlZ3VsYXIgUG9pc3NvbiBtb2RlbCBvciB0aGUgcXVhc2ktUG9pc3NvbiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZmluYWwgbW9kZWwuIExhc3RseSwgd2Ugd2lsbCBtYWtlIGEgdmlzdWFsaXphdGlvbiB0byBzaG93IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIHdobyBlbnRlcmVkIGFuZCBsZWZ0IHRoZSBicmlkZ2UgYW5kIHRoZSByZWxhdGVkIHByZWRpY3RvciB2YXJpYWJsZXMuCgojIyBEYXRhCkhlcmUgYXJlIGFsbCB0aGUgdmFyaWFibGVzIGluIHRoaXMgcHJvamVjdDoKCiogRGF0ZS0gb2JzZXJ2YXRpb24gSUQKKiBBdmdUZW1wLShIaWdoVGVtcCArIExvd1RlbXApLzIuCiogTmV3UHJlY2lwLWlmIFByZWNpcGl0YXRpb24gPSAwLCB0aGVuIE5ld1ByZWNpcCA9IDA7IGlmIFByZWNpcGl0YXRpb24gPiAwLCB0aGVuIE5ld1ByZWNpcCA9IDEuCiogV2lsbGlhbXNidXJnQnJpZGdlLSBiaWtlIGNvdW50IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLgoqIFRvdGFsLUJpa2UgY291bnQgb2YgYWxsIGJyaWRnZXMKCgoKCiMgUG9pc3NvbiBSZWdyZXNzaW9uIG9uIFJhdGVzCgpUaGUgZm9sbG93aW5nIG1vZGVsIGFzc2Vzc2VzIHRoZSBwb3RlbnRpYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gYmlrZXIgY291bnQgcmF0ZXMgb24gdGhlIFdpbGxpYW1zYnVyZyBicmlkZ2UgYW5kIERhdGUsIEF2Z1RlbXAsIGFuZCBOZXdQcmVjaXAsLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGludGVyZXN0IG9mIHRoZSBtb2RlbC4gCgpgYGB7cn0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERhdGUgKyBBdmdUZW1wKyBOZXdQcmVjaXAsIG9mZnNldCA9IGxvZyhUb3RhbCksIAogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gYmlrZXMpCnBhbmRlcihzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiB0aGUgCiAgICAgIHRoZSBiaWtlIHJhdGUgb2YgcGVvcGxlIGNvbWluZyBpbiBhbmQgb3V0IG9mIHRoZSBicmlkZ2UuIikKYGBgCgpUaGUgYWJvdmUgdGFibGUgaW5kaWNhdGVzIHRoYXQgRGF0ZSBpcyBub3QgYSBnb29kIGZpdCBmb3IgdGhpcyBtb2RlbCBkdWUgdG8gaXRzIHAtdmFsdWUuIFRoZSBjb2VmZmljaWVudHMgcmVwcmVzZW50IHRoZSBsb2cgY2hhbmdlIGluIGV4cGVjdGVkIGNvdW50IGZvciBhIG9uZSB1bml0IGluY3JlYXNlIGluIG91ciBwcmVkaWN0b3IgdmFsdWUuIFRoZSBsb2cgcmF0ZXMgb2YgTmV3UHJlY2lwIHdlcmUgaGlnaGVyIHRoYW4gYW55IG90aGVyIHZhcmlhYmxlIHNpbmNlIGl0cyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgaGlnaGVzdCBvdXQgb2YgYWxsIHByZWRpY3RvciB2YXJpYWJsZXMuIAoKCiMjIFF1YXNpLVBvaXNzb24gUmF0ZSBNb2RlbAoKIFRoZSBxdWFzaS1Qb2lzc29uIHJldHVybnMgdGhlIGRpc3BlcnNpb24gY29lZmZpY2llbnQuCgpgYGB7cn0KcXVhc2ltb2RlbC5yYXRlcyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF0ZSsgQXZnVGVtcCsgTmV3UHJlY2lwLCBvZmZzZXQgPSBsb2coVG90YWwpLCAKICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGJpa2VzKQpwYW5kZXIoc3VtbWFyeShxdWFzaW1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiB0aGUgYmlrZSByYXRlIG9mIHBlb3BsZSBjb21pbmcgaW4gYW5kIG91dCBvZiB0aGUgYnJpZGdlLiIpCgpgYGAKCkxvb2tpbmcgYXQgdGhpcyB0YWJsZSB3ZSBjYW4gc2VlIHRoYXQgRGF0ZSBzdGlsbCBpcyBub3QgYSBnb29kIHByZWRpY3RvciB2YXJpYWJsZSBhbmQgd2Ugd2lsbCBoYXZlIHRvIHRha2UgdGhlIHZhcmlhYmxlIG91dCBvZiB0aGUgZmluYWwgbW9kZWwuIEluIHRoaXMgbW9kZWwsIERhdGUgc3RpbGwgaXMgdGhlIGxvd2VzdCBlc3RpbWF0ZSBhbmQgTmV3UHJlY2lwIGlzIHRoZSBoaWdoZXN0IG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzLiBBdmdUZW1wIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IHZhbHVlIGJhc2VkIG9uIHAtdmFsdWUuCgpUaGUgZGlzcGVyc2lvbiBpbmRleCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHF1YXNpLVBvaXNzb24gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBjb2RlCgpgYGB7cn0KeWRpZj1iaWtlcyRXaWxsaWFtc2J1cmdCcmlkZ2UtZXhwKG1vZGVsLnJhdGVzJGxpbmVhci5wcmVkaWN0b3JzKSAgCnByc2QgPSB5ZGlmL3NxcnQoZXhwKG1vZGVsLnJhdGVzJGxpbmVhci5wcmVkaWN0b3JzKSkgICAKcGhpID0gc3VtKHByc2ReMikvMTUgICAgICAgICAgIApwYW5kZXIoY2JpbmQoRGlzcGVyc2lvbiA9IHBoaSkpCmBgYAoKVGhlIGRpc3BlcnNpb24gaW5kZXggaXMgNy40NTEuIFRoaXMgaXMgYSBoaWdoIG51bWJlciBzbyB0aGVyZSBpcyBvdmVyIGRpc3BlcnNpb24uIFRoaXMgbWVhbnMgdGhhdCB3ZSBzdGF5IHdpdGggdGhlIFF1YXNpLVBvaXNzb24gcmF0ZSBtb2RlbC4KCiMjIFZpc3VhbHMKClRoZXNlIHZpc3VhbHMgYmVsb3cgYXJlIHRvIHNob3cgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgd2hvIGVudGVyZWQgYW5kIGxlZnQgdGhlIGJyaWRnZSBhbmQgdGhlaXIgcmVsYXRpb24gdG8gQXZnVGVtcCwgRGF0ZSwgYW5kIFByZWNpcGl0YXRpb24uCgpgYGB7cn0KCmJpa2VzJHByZWRpY3RfYjwtIGV4cCg1LjAzNiAtIDAuMDAwMTQqYmlrZXMkRGF0ZSAtIDAuMDAxNCpiaWtlcyRBdmdUZW1wIC0gMC4wMTk0KmJpa2VzJE5ld1ByZWNpcCApCmdncGxvdChiaWtlcywgYWVzKHg9QXZnVGVtcCwgeT1wcmVkaWN0X2IsIGNvbG9yPSBmYWN0b3IoTmV3UHJlY2lwKSkpKyBnZW9tX2xpbmUoKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicmVkIiwgImJsdWUiKSwgbGFiZWxzPSBjKCJObyBQcmVjaXAiLCJQcmVjaXAiKSkgKyBsYWJzKHRpdGxlPSAiRGF0ZSBlZmZlY3Qgb24gV2lsbGlhbXNidXJnIEJyaWRnZSBiaWtlcnMiLCB4PSJEYXRlIiwgeT0gIlByZWRpY3RlZCBiaWtlcnMiLCBjb2xvcj0gIk5ld1ByZWNpcCIpKwogIHRoZW1lX21pbmltYWwoKQoKYmlrZXMkcHJlZGljdF9iPC0gZXhwKDUuMDM2IC0gMC4wMDAxNCpiaWtlcyREYXRlIC0gMC4wMDE0KmJpa2VzJEF2Z1RlbXAgLSAwLjAxOTQqYmlrZXMkTmV3UHJlY2lwICkKZ2dwbG90KGJpa2VzLCBhZXMoeD1EYXRlLCB5PXByZWRpY3RfYiwgY29sb3I9IGZhY3RvcihOZXdQcmVjaXApKSkrIGdlb21fbGluZSgpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmx1ZSIpLCBsYWJlbHM9IGMoIk5vIFByZWNpcCIsIlByZWNpcCIpKSArIGxhYnModGl0bGU9ICJBdmdUZW1wIGVmZmVjdCBvbiBXaWxsaWFtc2J1cmcgQnJpZGdlIGJpa2VycyIsIHg9IkF2Z1RlbXAiLCB5PSAiUHJlZGljdGVkIGJpa2VycyIsIGNvbG9yPSAiTmV3UHJlY2lwIikrCiAgdGhlbWVfbWluaW1hbCgpCgoKYGBgCgpMb29raW5nIGF0IHRoZXNlIGdyYXBocyB5b3UgY2FuIHNlZSB0aGF0IGJvdGggb2YgdGhlaXIgcHJlZGljdGVkIGJpa2VycyBnbyBkb3duIGFzIHRoZSBkYXRlIHBhc3Nlcy4gSWYgeW91IGxvb2sgYXQgdGhlIG90aGVyIGdyYXBoIHlvdSB3aWxsIHNlZSB0aGF0ICJubyBwcmVjaXBpdGF0aW9uIiBoYXMgYSBoaWdoZXIgYXZlcmFnZSBvZiBwcmVkaWN0ZWQgYmlrZXJzIHRoYW4gInByZWNpcGl0YXRpb24iLiBQcmVjaXBpdGF0aW9uIGVmZmVjdHMgYm90aCBncmFwaHMgaW4gYSBiaWcgd2F5LiAKCgojIERpc2N1c3Npb25zIGFuZCBDb25jbHVzaW9ucwoKVGhlIHF1YXNpLXBvaXNzb24gcmF0ZSBtb2RlbCBiYXNlZCBvbiB0aGUgYmlrZSBjb3VudCBpcyBub3QgYXBwcm9wcmlhdGUgc2luY2UgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSB0b3RhbCBiaWtlciBjb3VudCBpcyBhIGtleSB2YXJpYWJsZSBpbiB0aGUgc3R1ZHkgb2YgV2lsbGlhbXNidXJnQnJpZGdlIGRpc3RyaWJ1dGlvbi4gSW5jbHVkaW5nIHRoZSB0b3RhbCBiaWtlciBjb3VudCBpbiB0aGUgcXVhc2ktcG9pc3NvbiByYXRlIG1vZGVsIHdpbGwgcmVkdWNlIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgQXZnVGVtcCBhbmQgTmV3UHJlY2lwLiBTZWUgdGhlIGZvbGxvd2luZyBvdXRwdXQgb2YgdGhlIGZpdHRlZCBxdWFzaS1wb2lzc29uIHJhdGUgbW9kZWwgb2YgV2lsbGlhbXNidXJnIEJyaWRnZSBiaWtlIGNvdW50IGFkanVzdGVkIGJ5IHRvdGFsIGJpa2UgY291bnQuCgpgYGB7cn0KbW9kZWwuZnJlcS5wb3AgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IEF2Z1RlbXArIE5ld1ByZWNpcCsgbG9nKFRvdGFsKSwgCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBiaWtlcykKCnBvaXMuY291bnQuY29lZi5wb3AgPSBzdW1tYXJ5KG1vZGVsLmZyZXEucG9wKSRjb2VmCmthYmxlKHBvaXMuY291bnQuY29lZi5wb3AsIGNhcHRpb24gPSAiVGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgCiAgICAgICAgIHRoZSBjb3VudHMgb2YgYmlrZXJzIHZlcnN1cyB0aGUgYXZlcmFnZSB0ZW1wLCAKICAgICAgICAgcHJlY2lwaXRhdGlvbiwgYW5kIHRoZSB0b3RhbCBiaWtlciBjb3VudC4iKQpgYGAKCgpUaGUgbG9nKFRvdGFsKSBpbiBiaWtlIHJhdGUgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aGUgb3RoZXIgcHJlZGljdG9yIHZhcmlhYmxlcyAuIFRoZXJlIHNob3VsZCBiZSBtb3JlIGludmVzdGlnYXRpb24gaW4gd2h5IHRoZSBsb2coVG90YWwpIGlzIGRpc3RyaWJ1dGluZyB0aGUgZGF0YS4KClRoZXJlIGlzIGEgbmVnYXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEF2Z1RlbXAgYW5kIERhdGUuIFRoZSBBdmdUZW1wIGRlY3JlYXNlcyBhcyBEYXRlIGluY3JlYXNlLgoKVGhlIGxhc3Qgc3RhdGlzdGljYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBlZmZlY3QgYmV0d2VlbiB0aGUgcHJlY2lwIGdyb3VwcyBhbmQgbm9ucHJlY2lwLiBUaGUgcmF0ZSBjdXJ2ZXMgYXJlICJwYXJhbGxlbCIuCgpUaGlzIGlzIG9ubHkgYSBzbWFsbCBkYXRhIHNldCB3aXRoIGxpbWl0ZWQgaW5mb3JtYXRpb24uIEFsbCBjb25jbHVzaW9ucyBpbiB0aGlzIHJlcG9ydCBhcmUgb25seSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0YSBzZXQuCgoKCgoK