Methods 1 Final Project | December 2023
Zoe Moskowitz
Purpose:
This research hopes to identify discrepancies in temperature between
Manhattan County and Bronx County utilizing Hyperlocal Temperature Data
collected from the summer of 2019.
Introduction & Background:
Temperatures in New York City are rising every year. As greenhouse
gas emissions continue to warm our planet, dense urban cities are
experiencing more frequent heatwaves and longer periods of extreme heat.
According to the Mayor’s Office of Climate & Environmental Justice,
the average number of days above 90℉ will likely triple by the 2050s and
quadruple by the 2080s.
Due to a multitude of factors, extreme heat is not felt evenly
throughout New York City. Marginalized populations and low-income
neighborhoods experience higher temperatures as a result of the urban
heat island effect and pervasive inequalities. In areas like the South
Bronx, which is considered an urban heat island, temperatures can report
anywhere from 1℉ to 7℉ warmer in the daytime and 2℉ to 5℉ warmer in the
evening (compared to Manhattan).
An urban heat island is defined by Resources for the Future as “the
increase in temperature caused by the built environment.” In the South
Bronx there is a major lack of parks, shade coverage and green spaces, a
large amount of industrial/polluting facilities (12+ in total), and the
presence of the Cross Bronx Expressway - which exposes the population to
air pollution and increases asthma rates.
Another reason that low-income neighborhoods and populations suffer
from a disproportionate rate of extreme heat is due to decades of
redlining and disinvestment. These areas lack adequate housing and
typically have poor maintenance, making it difficult to avoid heat and
properly cool ones home. Residents are often left with the choice to
independently put in expensive cooling measures such as air conditioning
or rely on external resources.
Data Source:
The dataset I will be utilizing for this report is available on NYC
Open Data and is titled “Hyperlocal Temperature Monitoring.” This
dataset was created as a part of the Cool Neighborhoods Initiative and
facilitated by the NYC Parks Department, Office of Resilience and NYC
Department of Health and Mental Hygiene.
The purpose of this data was to monitor street level temperature on a
subset of city blocks in certain neighborhoods with the highest heat
mortality risk during the summers of 2018 and 2019. For the purpose of
my analysis, I decided to use only the most recent data collected from
the year 2019 and narrow the data collection period to 06/15 -
09/21.
Research Questions:
What are the differences in maximum air temperature during the
summer months of June, July, August and September? Specifically between
New York County and South Bronx County?
Where are the monitors located that collect this
information?
What is the green space coverage in each of these
counties?
Results
The scatterplots below (Fig. 1-4) show the maximum hyperlocal air
temperature by date. The blue colored points represent data taken from
Bronx County and the red colored points represent data taken from New
York County. When I was done filtering my data, there were 99 data
points for each county that I wanted to work with. Due to this, I
thought it best to split the scatterplots up by month.
In order to create these visuals, I filtered the NYC Open Data by
“borough” and “year”. Due to each date having multiple temperature
readings, I then used the group_by and summarise
functions to find the maximum hyperlocal temperature per day.
Fig. 1
Figure 1 represents data collected from June, 2019. Out of the 16
datapoints shown, nine show higher max temperature in the Bronx, while
seven show higher max temperature in Manhattan.

Fig. 2
Figure 2 represents data collected from July, 2019. Out of the 30
datapoints shown, sixteen show higher max temperature in the Bronx,
while fifteen show higher max temperature in Manhattan.

Fig. 3
Figure 3 represents data collected from August, 2019. Out of the 30
datapoints shown, ten show higher max temperature in the Bronx, while
twenty show higher max temperature in Manhattan.

Fig. 4
Figure 4 represents data collected from August, 2019. Out of the 21
datapoints shown, seven show higher max temperature in the Bronx, while
thirteen show higher max temperature in Manhattan.

Fig. 5
Figure 5 is a map that shows two layers of data in Bronx County. The
first layer displays where the sensors that collected the Hyperlocal
Temperature data are located. The second layer shows all of the “parks”
in the county. This is labeled as “Type of Green Space”.
Fig. 6
To compare sensor location and park coverage, I made an identical map
to Figure 4 but for New York County. The first layer displays where the
sensors that collected the Hyperlocal Temperature data are located. The
second layer shows all of the “parks” in the county. This is labeled as
“Type of Green Space”.
Discussion
Going into this research project I expected Figures 1-4 to show Bronx
County having more days with a higher “Maximum Temp.” than New York
County. Although this was not the case, when we look at some of the
individual data points for the warmer days in Bronx County, temperature
difference was significant. The data shows days that were around 4-6
degrees warmer and one day in July that was 12 degrees warmer.
After creating the maps for Bronx and Manhattan County, it was
interesting to see where the sensors were placed for collecting data. In
Manhattan County, they are clustered in Central and East Harlem which
are low-income areas that suffer from extreme heat. It would be
interesting to see what the temperature difference between Bronx County
and Manhattan County would be if the sensors were placed in Lower
Manhattan or even the Upper West Side as these have a greater amount of
green space.
Next Steps
There is still a fair amount to be uncovered about Hyperlocal
Temperature in New York and Bronx County. Some ideas include:
- Deeper analysis into where the rest of the sensors are located per
county
- How this placement was decided?
- Pollution data for Manhattan County and Bronx County
- Does this have a significant effect on max. temperature?
- “Average” temperature recorded by local weather stations compared to
“Max” temperature reflected in data
Methods Appendix
NYC Open Data
The main datasource I used came from NYC Open Data. Hyperlocal
Temperature Monitoring was published on August 20th, 2021 through
the Cool Neighborhoods Initiative and was created and monitored by
multiple teams within the NYC government. These teams include: NYC Parks
Department, Mayor’s Office of Climate and Resiliency, and NYC Department
of Health and Mental Hygiene.
Within this dataset there were ten columns for each point of
data:
Sensor.ID = Unique identifier of sensor
AirTemp = Average hourly air temperature, degrees;
Fahrenheit
Hour = Hour of day, military time
Latitude = Latitude of sensor
Longitude = Longitude of sensor
Year = Year
Install.Type = Type of mounting - street tree/street
light
Borough = Borough
ntacode = Neighborhood Tabulation Area (NTA) Code
One of the pitfalls of this data is that the sensors used to collect
data are not spread across counties. When I made the map that showed
Hispanic or Latino population in Bronx county with the overlay of where
the sensors were, it was enlightening to see that the sensors lived only
in three pockets of the county. If one wanted to have a more accurate
read on hyperlocal temperature throughout the entire county, there would
be additional sensors.
The second datasource I used also came from NYC Open Data. The
Parks Properties was created January 29th, 2019 by NYC Parks
Open Data Team. The data included only represents property that is
partially or solely managed by NYC Parks.
In one part of this data that I utilized, one of the pitfalls is the
scope and scale of the “Type Category” column. NYC Parks included almost
every type of green space in this data. Some of these categories would
not be considered “parks” by all: Cemetery’s, Lot, and Undeveloped.
LS0tCnRpdGxlOiAiSHlwZXJsb2NhbCBUZW1wZXJhdHVyZSBNb25pdG9yaW5nOyBIZWF0IGluIE5ZQyBhbmQgdGhlIEJyb254IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIyMjIE1ldGhvZHMgMSBGaW5hbCBQcm9qZWN0IHwgRGVjZW1iZXIgMjAyMwojIyMjIyAqWm9lIE1vc2tvd2l0eioKCiMjIyBQdXJwb3NlOiAKIyMjIyBUaGlzIHJlc2VhcmNoIGhvcGVzIHRvIGlkZW50aWZ5IGRpc2NyZXBhbmNpZXMgaW4gdGVtcGVyYXR1cmUgYmV0d2VlbiBNYW5oYXR0YW4gQ291bnR5IGFuZCBCcm9ueCBDb3VudHkgdXRpbGl6aW5nIEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgRGF0YSBjb2xsZWN0ZWQgZnJvbSB0aGUgc3VtbWVyIG9mIDIwMTkuIAoKIyMjIEludHJvZHVjdGlvbiAmIEJhY2tncm91bmQ6IApUZW1wZXJhdHVyZXMgaW4gTmV3IFlvcmsgQ2l0eSBhcmUgcmlzaW5nIGV2ZXJ5IHllYXIuIEFzIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBjb250aW51ZSB0byB3YXJtIG91ciBwbGFuZXQsIGRlbnNlIHVyYmFuIGNpdGllcyBhcmUgZXhwZXJpZW5jaW5nIG1vcmUgZnJlcXVlbnQgaGVhdHdhdmVzIGFuZCBsb25nZXIgcGVyaW9kcyBvZiBleHRyZW1lIGhlYXQuIEFjY29yZGluZyB0byB0aGUgTWF5b3LigJlzIE9mZmljZSBvZiBDbGltYXRlICYgRW52aXJvbm1lbnRhbCBKdXN0aWNlLCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBhYm92ZSA5MOKEiSB3aWxsIGxpa2VseSB0cmlwbGUgYnkgdGhlIDIwNTBzIGFuZCBxdWFkcnVwbGUgYnkgdGhlIDIwODBzLgoKRHVlIHRvIGEgbXVsdGl0dWRlIG9mIGZhY3RvcnMsIGV4dHJlbWUgaGVhdCBpcyBub3QgZmVsdCBldmVubHkgdGhyb3VnaG91dCBOZXcgWW9yayBDaXR5LiBNYXJnaW5hbGl6ZWQgcG9wdWxhdGlvbnMgYW5kIGxvdy1pbmNvbWUgbmVpZ2hib3Job29kcyBleHBlcmllbmNlIGhpZ2hlciB0ZW1wZXJhdHVyZXMgYXMgYSByZXN1bHQgb2YgdGhlIHVyYmFuIGhlYXQgaXNsYW5kIGVmZmVjdCBhbmQgcGVydmFzaXZlIGluZXF1YWxpdGllcy4gSW4gYXJlYXMgbGlrZSB0aGUgU291dGggQnJvbngsIHdoaWNoIGlzIGNvbnNpZGVyZWQgYW4gdXJiYW4gaGVhdCBpc2xhbmQsIHRlbXBlcmF0dXJlcyBjYW4gcmVwb3J0IGFueXdoZXJlIGZyb20gMeKEiSB0byA34oSJIHdhcm1lciBpbiB0aGUgZGF5dGltZSBhbmQgMuKEiSB0byA14oSJIHdhcm1lciBpbiB0aGUgZXZlbmluZyAoY29tcGFyZWQgdG8gTWFuaGF0dGFuKS4gCgpBbiB1cmJhbiBoZWF0IGlzbGFuZCBpcyBkZWZpbmVkIGJ5IFJlc291cmNlcyBmb3IgdGhlIEZ1dHVyZSBhcyDigJx0aGUgaW5jcmVhc2UgaW4gdGVtcGVyYXR1cmUgY2F1c2VkIGJ5IHRoZSBidWlsdCBlbnZpcm9ubWVudC7igJ0gSW4gdGhlIFNvdXRoIEJyb254IHRoZXJlIGlzIGEgbWFqb3IgbGFjayBvZiBwYXJrcywgc2hhZGUgY292ZXJhZ2UgYW5kIGdyZWVuIHNwYWNlcywgYSBsYXJnZSBhbW91bnQgb2YgaW5kdXN0cmlhbC9wb2xsdXRpbmcgZmFjaWxpdGllcyAoMTIrIGluIHRvdGFsKSwgYW5kIHRoZSBwcmVzZW5jZSBvZiB0aGUgQ3Jvc3MgQnJvbnggRXhwcmVzc3dheSAtIHdoaWNoIGV4cG9zZXMgdGhlIHBvcHVsYXRpb24gdG8gYWlyIHBvbGx1dGlvbiBhbmQgaW5jcmVhc2VzIGFzdGhtYSByYXRlcy4gCgpBbm90aGVyIHJlYXNvbiB0aGF0IGxvdy1pbmNvbWUgbmVpZ2hib3Job29kcyBhbmQgcG9wdWxhdGlvbnMgc3VmZmVyIGZyb20gYSBkaXNwcm9wb3J0aW9uYXRlIHJhdGUgb2YgZXh0cmVtZSBoZWF0IGlzIGR1ZSB0byBkZWNhZGVzIG9mIHJlZGxpbmluZyBhbmQgZGlzaW52ZXN0bWVudC4gVGhlc2UgYXJlYXMgbGFjayBhZGVxdWF0ZSBob3VzaW5nIGFuZCB0eXBpY2FsbHkgaGF2ZSBwb29yIG1haW50ZW5hbmNlLCBtYWtpbmcgaXQgZGlmZmljdWx0IHRvIGF2b2lkIGhlYXQgYW5kIHByb3Blcmx5IGNvb2wgb25lcyBob21lLiBSZXNpZGVudHMgYXJlIG9mdGVuIGxlZnQgd2l0aCB0aGUgY2hvaWNlIHRvIGluZGVwZW5kZW50bHkgcHV0IGluIGV4cGVuc2l2ZSBjb29saW5nIG1lYXN1cmVzIHN1Y2ggYXMgYWlyIGNvbmRpdGlvbmluZyBvciByZWx5IG9uIGV4dGVybmFsIHJlc291cmNlcy4gCgojIyMgRGF0YSBTb3VyY2U6IApUaGUgZGF0YXNldCBJIHdpbGwgYmUgdXRpbGl6aW5nIGZvciB0aGlzIHJlcG9ydCBpcyBhdmFpbGFibGUgb24gTllDIE9wZW4gRGF0YSBhbmQgaXMgdGl0bGVkIOKAnEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgTW9uaXRvcmluZy7igJ0gVGhpcyBkYXRhc2V0IHdhcyBjcmVhdGVkIGFzIGEgcGFydCBvZiB0aGUgQ29vbCBOZWlnaGJvcmhvb2RzIEluaXRpYXRpdmUgYW5kIGZhY2lsaXRhdGVkIGJ5IHRoZSBOWUMgUGFya3MgRGVwYXJ0bWVudCwgT2ZmaWNlIG9mIFJlc2lsaWVuY2UgYW5kIE5ZQyBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgTWVudGFsIEh5Z2llbmUuIAoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBkYXRhIHdhcyB0byBtb25pdG9yIHN0cmVldCBsZXZlbCB0ZW1wZXJhdHVyZSBvbiBhIHN1YnNldCBvZiBjaXR5IGJsb2NrcyBpbiBjZXJ0YWluIG5laWdoYm9yaG9vZHMgd2l0aCB0aGUgaGlnaGVzdCBoZWF0IG1vcnRhbGl0eSByaXNrIGR1cmluZyB0aGUgc3VtbWVycyBvZiAyMDE4IGFuZCAyMDE5LiBGb3IgdGhlIHB1cnBvc2Ugb2YgbXkgYW5hbHlzaXMsIEkgZGVjaWRlZCB0byB1c2Ugb25seSB0aGUgbW9zdCByZWNlbnQgZGF0YSBjb2xsZWN0ZWQgZnJvbSB0aGUgeWVhciAyMDE5IGFuZCBuYXJyb3cgdGhlIGRhdGEgY29sbGVjdGlvbiBwZXJpb2QgdG8gMDYvMTUgLSAwOS8yMS4KCgojIyMgUmVzZWFyY2ggUXVlc3Rpb25zOiAKCiogV2hhdCBhcmUgdGhlIGRpZmZlcmVuY2VzIGluIG1heGltdW0gYWlyIHRlbXBlcmF0dXJlIGR1cmluZyB0aGUgc3VtbWVyIG1vbnRocyBvZiBKdW5lLCBKdWx5LCBBdWd1c3QgYW5kIFNlcHRlbWJlcj8gU3BlY2lmaWNhbGx5IGJldHdlZW4gTmV3IFlvcmsgQ291bnR5IGFuZCBTb3V0aCBCcm9ueCBDb3VudHk/CgoqIFdoZXJlIGFyZSB0aGUgbW9uaXRvcnMgbG9jYXRlZCB0aGF0IGNvbGxlY3QgdGhpcyBpbmZvcm1hdGlvbj8KCiogV2hhdCBpcyB0aGUgZ3JlZW4gc3BhY2UgY292ZXJhZ2UgaW4gZWFjaCBvZiB0aGVzZSBjb3VudGllcz8KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNsb2FkIGxpYnJhcmllcyBhbmQgZGF0YSAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUlNvY3JhdGEpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkocGxvdGx5KQoKaHlwZXJfbG9jYWxfdGVtcF9kYXRhIDwtIHJlYWQuY3N2KCJkYXRhL0h5cGVybG9jYWxfVGVtcGVyYXR1cmVfTW9uaXRvcmluZ18yMDIzMTIxMC5jc3YiKQoKYm9yb3MgPC0gc3RfcmVhZCgifi9EZXNrdG9wL1VFUy9NRVRIT0RTL3BhcnQyL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikKCm5hYmVzIDwtIHN0X3JlYWQgKCJ+L0Rlc2t0b3AvVUVTL01FVEhPRFMvcGFydDIvbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikKCm1hcF9vZl9wYXJrcyA8LSBzdF9yZWFkKCJ+L0Rlc2t0b3AvVUVTL01FVEhPRFMvcGFydDIvUGFya3MgUHJvcGVydGllc18yMDIzMTIxMi5nZW9qc29uIikKYGBgCgojIyMgUmVzdWx0cyAKClRoZSBzY2F0dGVycGxvdHMgYmVsb3cgKEZpZy4gMS00KSBzaG93IHRoZSBtYXhpbXVtIGh5cGVybG9jYWwgYWlyIHRlbXBlcmF0dXJlIGJ5IGRhdGUuIFRoZSBibHVlIGNvbG9yZWQgcG9pbnRzIHJlcHJlc2VudCBkYXRhIHRha2VuIGZyb20gQnJvbnggQ291bnR5IGFuZCB0aGUgcmVkIGNvbG9yZWQgcG9pbnRzIHJlcHJlc2VudCBkYXRhIHRha2VuIGZyb20gTmV3IFlvcmsgQ291bnR5LiBXaGVuIEkgd2FzIGRvbmUgZmlsdGVyaW5nIG15IGRhdGEsIHRoZXJlIHdlcmUgOTkgZGF0YSBwb2ludHMgZm9yIGVhY2ggY291bnR5IHRoYXQgSSB3YW50ZWQgdG8gd29yayB3aXRoLiBEdWUgdG8gdGhpcywgSSB0aG91Z2h0IGl0IGJlc3QgdG8gc3BsaXQgdGhlIHNjYXR0ZXJwbG90cyB1cCBieSBtb250aC4gCgpJbiBvcmRlciB0byBjcmVhdGUgdGhlc2UgdmlzdWFscywgSSBmaWx0ZXJlZCB0aGUgTllDIE9wZW4gRGF0YSBieSDigJxib3JvdWdo4oCdIGFuZCDigJx5ZWFy4oCdLiBEdWUgdG8gZWFjaCBkYXRlIGhhdmluZyBtdWx0aXBsZSB0ZW1wZXJhdHVyZSByZWFkaW5ncywgSSB0aGVuIHVzZWQgdGhlICpncm91cF9ieSogYW5kICpzdW1tYXJpc2UqIGZ1bmN0aW9ucyB0byBmaW5kIHRoZSBtYXhpbXVtIGh5cGVybG9jYWwgdGVtcGVyYXR1cmUgcGVyIGRheS4gCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojQnJvbnggZGF0YSBmb3IgMjAxOQpCcm9ueF9kYXRhIDwtIGh5cGVyX2xvY2FsX3RlbXBfZGF0YSB8PgogIGZpbHRlcihCb3JvdWdoID09ICJCcm9ueCIpIHw+CiAgZmlsdGVyKFllYXIgPT0gIjIwMTkiKSB8PgogIHNlbGVjdChTZW5zb3IuSUQsIEFpclRlbXAsIERheSwgSG91ciwgTGF0aXR1ZGUsIExvbmdpdHVkZSwgWWVhciwgSW5zdGFsbC5UeXBlLCBCb3JvdWdoLCBudGFjb2RlKQoKI01heCB0ZW1wLiBhY3Jvc3MgQnJvbnggYnkgZGF5IApEYWlseV9Ccm9ueF9kYXRhIDwtIEJyb254X2RhdGEgfD4KICBncm91cF9ieShEYXksIEJvcm91Z2gpIHw+CiAgc3VtbWFyaXNlKE1heF9UZW1wID0gbWF4KEFpclRlbXAsIG5hLnJtID0gVCkpCgojQnJpbmcgaW4gYmVzdCB0aW1lZnJhbWUgZGF0YWZyYW1lCkJlc3RfVGltZWZyYW1lX0Jyb254IDwtIERhaWx5X0Jyb254X2RhdGEgfD4KICBzbGljZSgxOjk5KQoKI0luZGl2aWR1YWwgZGF0YWZyYW1lcyBmb3IgZWFjaCBzY2F0dGVycGxvdCAtIEJyb254Ckp1bmVfQnJvbnggPC0gQmVzdF9UaW1lZnJhbWVfQnJvbnhbMToxNiwgXQpKdWx5X0Jyb254IDwtIEJlc3RfVGltZWZyYW1lX0Jyb254WzE3OjQ3LCBdCkF1Z3VzdF9Ccm9ueCA8LSBCZXN0X1RpbWVmcmFtZV9Ccm9ueFs0ODo3OCwgXQpTZXB0ZW1iZXJfQnJvbnggPC0gQmVzdF9UaW1lZnJhbWVfQnJvbnhbNzk6OTksIF0KCiNNYW5oYXR0YW4gZGF0YSBmb3IgMjAxOQpNYW5oYXR0YW5fZGF0YSA8LSBoeXBlcl9sb2NhbF90ZW1wX2RhdGEgfD4KICBmaWx0ZXIoQm9yb3VnaCA9PSAiTWFuaGF0dGFuIikgfD4KICBmaWx0ZXIoWWVhciA9PSAiMjAxOSIpIHw+CiAgc2VsZWN0KFNlbnNvci5JRCwgQWlyVGVtcCwgRGF5LCBIb3VyLCBMYXRpdHVkZSwgTG9uZ2l0dWRlLCBZZWFyLCBJbnN0YWxsLlR5cGUsIEJvcm91Z2gsIG50YWNvZGUpCgojTWF4IHRlbXAuIGFjcm9zcyBNYW5oYXR0YW4gYnkgZGF5IApEYWlseV9NYW5oYXR0YW5fZGF0YSA8LSBNYW5oYXR0YW5fZGF0YSB8PgogIGdyb3VwX2J5KERheSkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSkKCiNJbmRpdmlkdWFsIGRhdGFmcmFtZXMgZm9yIGVhY2ggc2NhdHRlcnBsb3QgLSBNYW5oYXR0YW4KSnVuZV9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzE6MTYsIF0KSnVseV9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzE3OjQ3LCBdCkF1Z3VzdF9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzQ4Ojc4LCBdClNlcHRlbWJlcl9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzc5OjEwOCwgXQoKYGBgCgojIyMjIEZpZy4gMQoKRmlndXJlIDEgcmVwcmVzZW50cyBkYXRhIGNvbGxlY3RlZCBmcm9tIEp1bmUsIDIwMTkuIE91dCBvZiB0aGUgMTYgZGF0YXBvaW50cyBzaG93biwgbmluZSBzaG93IGhpZ2hlciBtYXggdGVtcGVyYXR1cmUgaW4gdGhlIEJyb254LCB3aGlsZSBzZXZlbiBzaG93IGhpZ2hlciBtYXggdGVtcGVyYXR1cmUgaW4gTWFuaGF0dGFuLiAKCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gSnVuZV9Ccm9ueCwKICAgICAgIGFlcyh4ID0gRGF5LAogICAgICAgICAgIHkgPSBNYXhfVGVtcCkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRvZGdlcmJsdWUyIikgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBKdW5lX00sIGNvbG9yID0gInJlZDIiKSArCiAgbGFicyh4ID0gIlRpbWVmcmFtZSAoRGF0ZSkiLCB5ID0gIk1heCBBaXIgVGVtcGVyYXR1cmUgKEYpIiwKICAgICAgIHRpdGxlID0gIkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gQnJvbnggYW5kIE1hbmhhdHRhbiAoSnVuZSAyMDE5KSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IE5ZQyBPcGVuIERhdGEiKQpgYGAKCiMjIyMgRmlnLiAyCgpGaWd1cmUgMiByZXByZXNlbnRzIGRhdGEgY29sbGVjdGVkIGZyb20gSnVseSwgMjAxOS4gT3V0IG9mIHRoZSAzMCBkYXRhcG9pbnRzIHNob3duLCBzaXh0ZWVuIHNob3cgaGlnaGVyIG1heCB0ZW1wZXJhdHVyZSBpbiB0aGUgQnJvbngsIHdoaWxlIGZpZnRlZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIE1hbmhhdHRhbi4KCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gSnVseV9Ccm9ueCwgCiAgICAgICBhZXMoeCA9IERheSwgCiAgICAgICAgICAgeSA9IE1heF9UZW1wKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZG9kZ2VyYmx1ZTIiKSArIAogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBKdWx5X00sIGNvbG9yID0gInJlZDIiKSArIAogIGxhYnMoeCA9ICJUaW1lZnJhbWUgKERhdGUpIiwgeSA9ICJNYXggQWlyIFRlbXBlcmF0dXJlIChGKSIsCiAgICAgICB0aXRsZSA9ICJIeXBlcmxvY2FsIFRlbXBlcmF0dXJlIGluIEJyb254IGFuZCBNYW5oYXR0YW4gKEp1bHkgMjAxOSkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBOWUMgT3BlbiBEYXRhIikKYGBgCgojIyMjIEZpZy4gMwoKRmlndXJlIDMgcmVwcmVzZW50cyBkYXRhIGNvbGxlY3RlZCBmcm9tIEF1Z3VzdCwgMjAxOS4gT3V0IG9mIHRoZSAzMCBkYXRhcG9pbnRzIHNob3duLCB0ZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIHRoZSBCcm9ueCwgd2hpbGUgdHdlbnR5IHNob3cgaGlnaGVyIG1heCB0ZW1wZXJhdHVyZSBpbiBNYW5oYXR0YW4uCgpgYGB7ciBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IEF1Z3VzdF9Ccm9ueCwgCiAgICAgICBhZXMoeCA9IERheSwgCiAgICAgICAgICAgeSA9IE1heF9UZW1wKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZG9kZ2VyYmx1ZTIiKSArIAogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBBdWd1c3RfTSwgY29sb3IgPSAicmVkMiIpICsgCiAgbGFicyh4ID0gIlRpbWVmcmFtZSAoRGF0ZSkiLCB5ID0gIk1heCBBaXIgVGVtcGVyYXR1cmUgKEYpIiwKICAgICAgIHRpdGxlID0gIkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gQnJvbnggYW5kIE1hbmhhdHRhbiAoQXVndXN0IDIwMTkpIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogTllDIE9wZW4gRGF0YSIpCmBgYAoKIyMjIyBGaWcuIDQKCkZpZ3VyZSA0IHJlcHJlc2VudHMgZGF0YSBjb2xsZWN0ZWQgZnJvbSBBdWd1c3QsIDIwMTkuIE91dCBvZiB0aGUgMjEgZGF0YXBvaW50cyBzaG93biwgc2V2ZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIHRoZSBCcm9ueCwgd2hpbGUgdGhpcnRlZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIE1hbmhhdHRhbi4KCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gU2VwdGVtYmVyX0Jyb254LCAKICAgICAgIGFlcyh4ID0gRGF5LCAKICAgICAgICAgICB5ID0gTWF4X1RlbXApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkb2RnZXJibHVlMiIpICsgCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEsdmp1c3Q9MC41LCBzaXplID04KSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IFNlcHRlbWJlcl9NLCBjb2xvciA9ICJyZWQyIikgKyAKICBsYWJzKHggPSAiVGltZWZyYW1lIChEYXRlKSIsIHkgPSAiTWF4IEFpciBUZW1wZXJhdHVyZSAoRikiLAogICAgICAgdGl0bGUgPSAiSHlwZXJsb2NhbCBUZW1wZXJhdHVyZSBpbiBCcm9ueCBhbmQgTWFuaGF0dGFuIChTZXB0ZW1iZXIgMjAxOSkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBOWUMgT3BlbiBEYXRhIikKYGBgCgojIyMjIEZpZy4gNQoKRmlndXJlIDUgaXMgYSBtYXAgdGhhdCBzaG93cyB0d28gbGF5ZXJzIG9mIGRhdGEgaW4gQnJvbnggQ291bnR5LiBUaGUgZmlyc3QgbGF5ZXIgZGlzcGxheXMgd2hlcmUgdGhlIHNlbnNvcnMgdGhhdCBjb2xsZWN0ZWQgdGhlIEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgZGF0YSBhcmUgbG9jYXRlZC4gVGhlIHNlY29uZCBsYXllciBzaG93cyBhbGwgb2YgdGhlICJwYXJrcyIgaW4gdGhlIGNvdW50eS4gVGhpcyBpcyBsYWJlbGVkIGFzICJUeXBlIG9mIEdyZWVuIFNwYWNlIi4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojQ3JlYXRlIG5ldyBkYXRhZnJhbWUgd2l0aCBwYXJrcyBpbmZvIApwYXJrc19tYXAgPC0gbWFwX29mX3BhcmtzIHw+CiAgc2VsZWN0KGJvcm91Z2gsIGdlb21ldHJ5LCBuYW1lMzExLCB0eXBlY2F0ZWdvcnkpIHw+CiAgZmlsdGVyKGJvcm91Z2ggPT0gIlgiKQoKI01heCB0ZW1wLiBmb3IgZWFjaCBzZW5zb3IgYnkgZGF5IChCcm9ueCkKQnJvbnhfZGF0YV9ieV9zZW5zb3IgPC0gQnJvbnhfZGF0YSB8PgogIGdyb3VwX2J5KFNlbnNvci5JRCkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIGxhdCA9IGZpcnN0KExhdGl0dWRlKSwKICAgICAgICAgICAgbG9uZyA9IGZpcnN0KExvbmdpdHVkZSkpCgojYnJvbnggZGF0YSBzZW5zb3Igc3BhdGlhbCBkYXRhZnJhbWUKQnJvbnhfc3BhdGlhbCA8LSBzdF9hc19zZihCcm9ueF9kYXRhX2J5X3NlbnNvciwgY29vcmRzID0gYygibG9uZyIsICJsYXQiKSwgY3JzID0gNDMyNikKCiMjIyBNQVAgb24gbG9jYXRpb24gb2YgcGFya3MsIG1heGltdW0gdGVtcC4gb3ZlcmFsbCBmb3IgZWFjaCBzZW5zb3IsIG5hYmVzIG9mIGJyb254IApCcm9ueF9zZW5zb3JfYW5kX3BhcmtzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIkJyb254IiksIAogICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IDAuMjUpICsKICB0aGVtZV92b2lkKCkgKyAKICBnZW9tX3NmKGRhdGEgPSBCcm9ueF9zcGF0aWFsLCBhZXMoY29sb3IgPSBNYXhfVGVtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIk1heGltdW0gVGVtcGVyYXR1cmU6ICIsIE1heF9UZW1wKSwgc2l6ZSA9IDEuNSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiKSArCiAgZ2VvbV9zZihkYXRhID0gcGFya3NfbWFwLCBmaWxsID0gImZvcmVzdGdyZWVuIiwgY29sb3IgPSAiZm9yZXN0Z3JlZW4iLCAKICAgICAgICAgIGFlcyh0ZXh0ID0gcGFzdGUwKCJQYXJrOiAiLCBuYW1lMzExLCAiPGJyPlR5cGUgb2YgR3JlZW4gU3BhY2U6ICIsIHR5cGVjYXRlZ29yeSksIHNpemUgPSAxLjUpKQoKI21ha2UgaXQgaW50ZXJhY3RpdmUgCmdncGxvdGx5KEJyb254X3NlbnNvcl9hbmRfcGFya3MsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKIyMjIyBGaWcuIDYKClRvIGNvbXBhcmUgc2Vuc29yIGxvY2F0aW9uIGFuZCBwYXJrIGNvdmVyYWdlLCBJIG1hZGUgYW4gaWRlbnRpY2FsIG1hcCB0byBGaWd1cmUgNCBidXQgZm9yIE5ldyBZb3JrIENvdW50eS4gVGhlIGZpcnN0IGxheWVyIGRpc3BsYXlzIHdoZXJlIHRoZSBzZW5zb3JzIHRoYXQgY29sbGVjdGVkIHRoZSBIeXBlcmxvY2FsIFRlbXBlcmF0dXJlIGRhdGEgYXJlIGxvY2F0ZWQuIFRoZSBzZWNvbmQgbGF5ZXIgc2hvd3MgYWxsIG9mIHRoZSAicGFya3MiIGluIHRoZSBjb3VudHkuIFRoaXMgaXMgbGFiZWxlZCBhcyAiVHlwZSBvZiBHcmVlbiBTcGFjZSIuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojUGFya3MgbWFwIGZvciBNYW5oYXR0YW4gIApwYXJrc19tYXBfTWFuaGF0dGFuIDwtIG1hcF9vZl9wYXJrcyB8PgogIHNlbGVjdChib3JvdWdoLCBnZW9tZXRyeSwgbmFtZTMxMSwgdHlwZWNhdGVnb3J5KSB8PgogIGZpbHRlcihib3JvdWdoID09ICJNIikKCiNNYXggdGVtcC4gZm9yIGVhY2ggc2Vuc29yIGJ5IGRheSAoTWFuaGF0dG4pCk1hbmhhdHRhbl9kYXRhX2J5X3NlbnNvciA8LSBNYW5oYXR0YW5fZGF0YSB8PgogIGdyb3VwX2J5KFNlbnNvci5JRCkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIGxhdCA9IGZpcnN0KExhdGl0dWRlKSwKICAgICAgICAgICAgbG9uZyA9IGZpcnN0KExvbmdpdHVkZSkpCgojbWFuaGF0dGFuIGRhdGEgc2Vuc29yIHNwYXRpYWwgZGF0YWZyYW1lCk1hbmhhdHRhbl9zcGF0aWFsIDwtIHN0X2FzX3NmKE1hbmhhdHRhbl9kYXRhX2J5X3NlbnNvciwgY29vcmRzID0gYygibG9uZyIsICJsYXQiKSwgY3JzID0gNDMyNikKCiMjIyBNYW5oYXR0YW4gTUFQIG9uIGxvY2F0aW9uIG9mIHBhcmtzLCBtYXhpbXVtIHRlbXAuIG92ZXJhbGwgZm9yIGVhY2ggc2Vuc29yLCBuYWJlcyBvZiBtYW5oYXR0YW4gCk1hbmhhdHRhbl9zZW5zb3JfYW5kX3BhcmtzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIk1hbmhhdHRhbiIpLCAKICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArCiAgdGhlbWVfdm9pZCgpICsgCiAgZ2VvbV9zZihkYXRhID0gTWFuaGF0dGFuX3NwYXRpYWwsIGFlcyhjb2xvciA9IE1heF9UZW1wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiTWF4aW11bSBUZW1wZXJhdHVyZTogIiwgTWF4X1RlbXApLCBzaXplID0gMS41KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJ5ZWxsb3ciLCBoaWdoID0gInJlZCIpICsKICBnZW9tX3NmKGRhdGEgPSBwYXJrc19tYXBfTWFuaGF0dGFuLCBmaWxsID0gImZvcmVzdGdyZWVuIiwgY29sb3IgPSAiZm9yZXN0Z3JlZW4iLCAKICAgICAgICAgIGFlcyh0ZXh0ID0gcGFzdGUwKCJQYXJrOiAiLCBuYW1lMzExLCAiPGJyPlR5cGUgb2YgR3JlZW4gU3BhY2U6ICIsIHR5cGVjYXRlZ29yeSksIHNpemUgPSAxLjUpKQoKI21ha2UgaXQgaW50ZXJhY3RpdmUgCmdncGxvdGx5KE1hbmhhdHRhbl9zZW5zb3JfYW5kX3BhcmtzLCB0b29sdGlwID0gInRleHQiKQpgYGAKCgojIyMgRGlzY3Vzc2lvbgoKR29pbmcgaW50byB0aGlzIHJlc2VhcmNoIHByb2plY3QgSSBleHBlY3RlZCBGaWd1cmVzIDEtNCB0byBzaG93IEJyb254IENvdW50eSBoYXZpbmcgbW9yZSBkYXlzIHdpdGggYSBoaWdoZXIgIk1heGltdW0gVGVtcC4iIHRoYW4gTmV3IFlvcmsgQ291bnR5LiBBbHRob3VnaCB0aGlzIHdhcyBub3QgdGhlIGNhc2UsIHdoZW4gd2UgbG9vayBhdCBzb21lIG9mIHRoZSBpbmRpdmlkdWFsIGRhdGEgcG9pbnRzIGZvciB0aGUgd2FybWVyIGRheXMgaW4gQnJvbnggQ291bnR5LCB0ZW1wZXJhdHVyZSBkaWZmZXJlbmNlIHdhcyBzaWduaWZpY2FudC4gVGhlIGRhdGEgc2hvd3MgZGF5cyB0aGF0IHdlcmUgYXJvdW5kIDQtNiBkZWdyZWVzIHdhcm1lciBhbmQgb25lIGRheSBpbiBKdWx5IHRoYXQgd2FzIDEyIGRlZ3JlZXMgd2FybWVyLgoKQWZ0ZXIgY3JlYXRpbmcgdGhlIG1hcHMgZm9yIEJyb254IGFuZCBNYW5oYXR0YW4gQ291bnR5LCBpdCB3YXMgaW50ZXJlc3RpbmcgdG8gc2VlIHdoZXJlIHRoZSBzZW5zb3JzIHdlcmUgcGxhY2VkIGZvciBjb2xsZWN0aW5nIGRhdGEuIEluIE1hbmhhdHRhbiBDb3VudHksIHRoZXkgYXJlIGNsdXN0ZXJlZCBpbiBDZW50cmFsIGFuZCBFYXN0IEhhcmxlbSB3aGljaCBhcmUgbG93LWluY29tZSBhcmVhcyB0aGF0IHN1ZmZlciBmcm9tIGV4dHJlbWUgaGVhdC4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHdoYXQgdGhlIHRlbXBlcmF0dXJlIGRpZmZlcmVuY2UgYmV0d2VlbiBCcm9ueCBDb3VudHkgYW5kIE1hbmhhdHRhbiBDb3VudHkgd291bGQgYmUgaWYgdGhlIHNlbnNvcnMgd2VyZSBwbGFjZWQgaW4gTG93ZXIgTWFuaGF0dGFuIG9yIGV2ZW4gdGhlIFVwcGVyIFdlc3QgU2lkZSBhcyB0aGVzZSBoYXZlIGEgZ3JlYXRlciBhbW91bnQgb2YgZ3JlZW4gc3BhY2UuIAoKIyMjIE5leHQgU3RlcHMKClRoZXJlIGlzIHN0aWxsIGEgZmFpciBhbW91bnQgdG8gYmUgdW5jb3ZlcmVkIGFib3V0IEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gTmV3IFlvcmsgYW5kIEJyb254IENvdW50eS4gU29tZSBpZGVhcyBpbmNsdWRlOiAKCjEuIERlZXBlciBhbmFseXNpcyBpbnRvIHdoZXJlIHRoZSByZXN0IG9mIHRoZSBzZW5zb3JzIGFyZSBsb2NhdGVkIHBlciBjb3VudHkKKyBIb3cgdGhpcyBwbGFjZW1lbnQgd2FzIGRlY2lkZWQ/CgoyLiBQb2xsdXRpb24gZGF0YSBmb3IgTWFuaGF0dGFuIENvdW50eSBhbmQgQnJvbnggQ291bnR5CisgRG9lcyB0aGlzIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gbWF4LiB0ZW1wZXJhdHVyZT8gCgozLiAiQXZlcmFnZSIgdGVtcGVyYXR1cmUgcmVjb3JkZWQgYnkgbG9jYWwgd2VhdGhlciBzdGF0aW9ucyBjb21wYXJlZCB0byAiTWF4IiB0ZW1wZXJhdHVyZSByZWZsZWN0ZWQgaW4gZGF0YSAKKyBNb250aGx5IGF2ZXJhZ2UgCgojIyMgTWV0aG9kcyBBcHBlbmRpeAoKIyMjIyBOWUMgT3BlbiBEYXRhCgpUaGUgbWFpbiBkYXRhc291cmNlIEkgdXNlZCBjYW1lIGZyb20gTllDIE9wZW4gRGF0YS4gKkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgTW9uaXRvcmluZyogd2FzIHB1Ymxpc2hlZCBvbiBBdWd1c3QgMjB0aCwgMjAyMSB0aHJvdWdoIHRoZSBDb29sIE5laWdoYm9yaG9vZHMgSW5pdGlhdGl2ZSBhbmQgd2FzIGNyZWF0ZWQgYW5kIG1vbml0b3JlZCBieSBtdWx0aXBsZSB0ZWFtcyB3aXRoaW4gdGhlIE5ZQyBnb3Zlcm5tZW50LiBUaGVzZSB0ZWFtcyBpbmNsdWRlOiBOWUMgUGFya3MgRGVwYXJ0bWVudCwgTWF5b3LigJlzIE9mZmljZSBvZiBDbGltYXRlIGFuZCBSZXNpbGllbmN5LCBhbmQgTllDIERlcGFydG1lbnQgb2YgSGVhbHRoIGFuZCBNZW50YWwgSHlnaWVuZS4gCgpXaXRoaW4gdGhpcyBkYXRhc2V0IHRoZXJlIHdlcmUgdGVuIGNvbHVtbnMgZm9yIGVhY2ggcG9pbnQgb2YgZGF0YTogCgoqIFNlbnNvci5JRCA9IFVuaXF1ZSBpZGVudGlmaWVyIG9mIHNlbnNvcgoKKiBBaXJUZW1wID0gQXZlcmFnZSBob3VybHkgYWlyIHRlbXBlcmF0dXJlLCBkZWdyZWVzOyBGYWhyZW5oZWl0CgoqIEhvdXIgPSBIb3VyIG9mIGRheSwgbWlsaXRhcnkgdGltZQoKKiBMYXRpdHVkZSA9IExhdGl0dWRlIG9mIHNlbnNvcgoKKiBMb25naXR1ZGUgPSBMb25naXR1ZGUgb2Ygc2Vuc29yCgoqIFllYXIgPSBZZWFyCgoqIEluc3RhbGwuVHlwZSA9IFR5cGUgb2YgbW91bnRpbmcgLSBzdHJlZXQgdHJlZS9zdHJlZXQgbGlnaHQKCiogQm9yb3VnaCA9IEJvcm91Z2gKCiAqIG50YWNvZGUgPSBOZWlnaGJvcmhvb2QgVGFidWxhdGlvbiBBcmVhIChOVEEpIENvZGUKIApPbmUgb2YgdGhlIHBpdGZhbGxzIG9mIHRoaXMgZGF0YSBpcyB0aGF0IHRoZSBzZW5zb3JzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFyZSBub3Qgc3ByZWFkIGFjcm9zcyBjb3VudGllcy4gV2hlbiBJIG1hZGUgdGhlIG1hcCB0aGF0IHNob3dlZCBIaXNwYW5pYyBvciBMYXRpbm8gcG9wdWxhdGlvbiBpbiBCcm9ueCBjb3VudHkgd2l0aCB0aGUgb3ZlcmxheSBvZiB3aGVyZSB0aGUgc2Vuc29ycyB3ZXJlLCBpdCB3YXMgZW5saWdodGVuaW5nIHRvIHNlZSB0aGF0IHRoZSBzZW5zb3JzIGxpdmVkIG9ubHkgaW4gdGhyZWUgcG9ja2V0cyBvZiB0aGUgY291bnR5LiBJZiBvbmUgd2FudGVkIHRvIGhhdmUgYSBtb3JlIGFjY3VyYXRlIHJlYWQgb24gaHlwZXJsb2NhbCB0ZW1wZXJhdHVyZSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgY291bnR5LCB0aGVyZSB3b3VsZCBiZSBhZGRpdGlvbmFsIHNlbnNvcnMuIAoKVGhlIHNlY29uZCBkYXRhc291cmNlIEkgdXNlZCBhbHNvIGNhbWUgZnJvbSBOWUMgT3BlbiBEYXRhLiBUaGUgKlBhcmtzIFByb3BlcnRpZXMqIHdhcyBjcmVhdGVkIEphbnVhcnkgMjl0aCwgMjAxOSBieSBOWUMgUGFya3MgT3BlbiBEYXRhIFRlYW0uIFRoZSBkYXRhIGluY2x1ZGVkIG9ubHkgcmVwcmVzZW50cyBwcm9wZXJ0eSB0aGF0IGlzIHBhcnRpYWxseSBvciBzb2xlbHkgbWFuYWdlZCBieSBOWUMgUGFya3MuIAoKSW4gb25lIHBhcnQgb2YgdGhpcyBkYXRhIHRoYXQgSSB1dGlsaXplZCwgb25lIG9mIHRoZSBwaXRmYWxscyBpcyB0aGUgc2NvcGUgYW5kIHNjYWxlIG9mIHRoZSAiVHlwZSBDYXRlZ29yeSIgY29sdW1uLiBOWUMgUGFya3MgaW5jbHVkZWQgYWxtb3N0IGV2ZXJ5IHR5cGUgb2YgZ3JlZW4gc3BhY2UgaW4gdGhpcyBkYXRhLiBTb21lIG9mIHRoZXNlIGNhdGVnb3JpZXMgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgInBhcmtzIiBieSBhbGw6IENlbWV0ZXJ5J3MsIExvdCwgYW5kIFVuZGV2ZWxvcGVkLiAKCgoKCg==