By: Maria Isabel Olivera

I. Introduction: Sustainability and Urban Communities

Communities throughout the world are currently attempting to prepare for the challenges and uncertainties posed by climate change. However, not all communities can or will respond to these threats in the same manner or to the same degree. The nature of their response may ultimately be effected by the resources available to them. Wealthier communities are able to invest in innovative technologies that less affluent communities cannot afford. How wealthy a community is may ultimately depend on its size, with urban areas being at an advantage compared to rural areas. As growing portions of the world’s population flock to cities, the threats posed to rural communities by climate change may be largely ignored leaving them increasingly vulnerable. This, however, would be a grave mistake, since despite their wealth and size the long term survival of cities may depend on the strength of neighboring rural communities, which are an invaluable source of sustainable resources. Their futures are therefore intertwined, making it paramount that investments are made in both urban and rural communities to promote sustainability. This paper aims to compare levels of investment in sustainability by urban and rural communities in New York State and the resulting outcomes.

II. Background and History

Currently over half of the global population lives in cities (UN). This number is projected to grow to two-third of the global population by 2050 (UN). As cities grow in size, rural areas are projected to decline as portions of the rural population migrate into urban communities. The continued growth of cities are assured by the fact that these communities offer more employment and educational opportunities as well as access to highly valued amenities, such as public transportation (Kite-Powell).

Along with greater wealth and opportunities, however, urban areas also have greater needs. Due to their wealth, per capita consumption is higher in cities than rural communities (UN). As a result “cities consume more than 2/3 of the world’s energy” (UN). Sustainability measures are therefore essential for the long term security and survival of these growing communities (Patterson).Along with having a powerful incentive and the financial resources to pursue energy efficiency and sustainability, urban communities are also more likely to have the engineers and technicians necessary to plan and implement such projects (Kite-Powell). For these reasons urban areas have the ability to serve as centers of innovation and testing grounds for sustainability measures.

For smaller more rural communities, however, there can be many hurdles which prevent them from pursuing greater energy efficiency and sustainability. In the past, some rural communities eager to promote sustainability have found that their size undermines their ability to implement such projects. An example of this can be seen in the community of Windham, New Hampshire. With a population of 12,000 the local government attempted to move towards 100 percent renewable energy, but unfortunately because they do not have their own municipal-owned utility system all they could afford to do was purchase renewable energy for some of their public building (Patterson).

The beliefs and biases of residents also plays an important role in influencing a community’s ability pursuit sustainability measures. A 2012 study of rural Nevada ranchers and farmers found that those who identified themselves as conservative were less likely to either attribute climate change to human activity or to see it as a risk to themselves, therefore making them less inclined to support policies which emphasized sustainability (Safi). Yet another example of this connection can be seen in Georgetown, Texas where local residents were weary of a solar and wind energy installation project because they did not trust that these new technologies could meet their energy needs. In this case it was necessary for city officials to educate the residents and explain to them the nature of these technologies and how they work (Patterson).

Though there are big costs associated with sustainability projects there are also financial benefits. Policies which promote sustainability have the ability to reduce energy consumption and lower healthcare costs. These savings can them be reinvested back into communities (Karlsson). If smaller communities lose out on such benefits, climate change will inevitable increase the economic and social divide between urban and rural communities.

The fate of rural communities in the face of climate change is vital considering the important role they play as the cornerstones of a sustainable food system which can serve large, hungry urban neighbors in the future. Currently, 50% of the global agriculture output comes from small family farms (Altieri). Of these small farms, 50% use sustainable farming practices (Altieri). These smaller farms not only use resources in a more efficient manner, they also have a greater degree of crop and livestock diversity (Altieri). Additionally, these farmers are able to use their knowledge of local crop varieties in order to minimize the likelihood of crop failure due to a changing climate (Altieri). This provides small local farms an advantage over large industrial farms when responding to the threats to agriculture and food security posed by climate change.

Local rural communities are therefore a vital asset to growing cities and measures must be taken to insure that both communities are able to meet the challenges that will inevitably result from climate change. With regards to sustainability initiatives, rural communities should not be allowed to fall behind their more resourceful urban neighbors. The first step in doing this is to determine the degree to which urban communities outspend rural communities on energy efficiency projects.

III. Data and Methodology

For my analysis, I have utilized a dataset from Open Data NY, which tracks energy efficiency projects completed in New York State since 1987. These projects are funded by a New York Power Authority program which provides financing to public schools and government facilities to assist them in implementing energy efficiency improvements with no upfront costs.

Along with the data provided by Open Data NY dataset, I also included educational data from the United States Department of Agriculture Economic Research Service, which provided county level college completion rates. In addition to this, I included per capita income and population statistics from the U.S. 2010 census.

For my analysis, I will be looking at the following variables:

  1. Edu (numerical) - Percentage of county residents with a bachelor’s degree or higher

  2. EEReduction (Numerical) - Predicted Reduction in energy consumption in kilowatts

  3. FYSavings (continuous) - Predicted amount saved within the first year of the project’s completion in dollars

  4. Income (numerical) - Average weekly wage by county

  5. Population (numerical) - Population by county

  6. TPCost (numerical) - Amount spent on an energy efficiency projects in dollars

  7. Unemploy (numerical) - Unemployment rate

IV. Analysis and Results

A. The Urban Advantage

To compare the differences in levels of social capital between rural and urban counties it is necessary to identify the different population densities amongst the 62 counties in New York State. Below is a map of New York State which highlights the various county population densities. As the map clearly shows, the vast majority of New York State is rural. An overwhelming portion of the State’s population reside in the counties that make up New York City, Long Island, and Westchester. The top ten and bottom ten populous counties in New York State are listed below the map.

NYS 10 Most Populous Counties
County Population by 1000
KINGS 2505
QUEENS 2231
NEW YORK 1586
SUFFOLK 1493
BRONX 1385
NASSAU 1340
WESTCHESTER 949
ERIE 919
MONROE 744
RICHMOND 469
NYS 10 Least Populous Counties
County Population by 1000
HAMILTON 5
SCHUYLER 18
YATES 25
LEWIS 27
SCHOHARIE 33
SENECA 35
ESSEX 39
WYOMING 42
ORLEANS 43
DELAWARE 48

For this study, the 3 measures of social capital which I will be looking at are per capita income (Income), unemployment rates (Unemploy), and college graduate rates (Edu).

1. Population and Income

My first regression looks at the link between income and population density. The summary and graph below show a clear positive correlation between population density and income. An increase in population by 1000 residents results in an increase in per capita income of $1,800 dollars.

Statistical models
Model 1
(Intercept) 828.76***
(23.53)
Pop2 0.18***
(0.04)
R2 0.26
Adj. R2 0.25
Num. obs. 62
RMSE 159.48
p < 0.001, p < 0.01, p < 0.05

2. Population and Unemployment

With regards to population and unemployment rates, the following simulation clearly describes the difference in unemployment levels between rural and urban areas. In counties with over 2.5 million residents, the unemployment rate was on average, over a quarter of a percentage point lower than those counties with less than 100,000 residents.

3. Population and Education

The next simulation looks at the relationship between population density and the percentage of college graduates in a county. The simulation shows a difference of 20 percentage points between counties with over 2.5 million residents and those with less than 100,000 with regards to the rate of college graduates.

Statistical models
Model 1
(Intercept) 22.80***
(1.42)
Pop3 2.18***
(0.53)
AIC 440.41
BIC 446.79
Log Likelihood -217.20
Deviance 4007.17
Num. obs. 62
p < 0.001, p < 0.01, p < 0.05
   V1        

Min. : 5.645
1st Qu.:16.444
Median :19.714
Mean :19.616
3rd Qu.:22.577
Max. :33.492

These three figures clearly show the degree in which urban communities far surpass rural communities with regards to social capital. The next portion of this paper will look at how urban communities invest in energy efficiency compared to rural communities and the financial benefits of these investments.

B. The Rewards of Investing in Energy Efficiency

To determine the concentration of energy efficiency project across the counties of New York State, I’ve grouped these projects by county. The following table shows the top five counties and bottom five NYS counties for completed energy efficiency projects. The tables also include the corresponding socioeconomic measures for these counties.

Top 5 NYS Counties for Energy Efficiency Projects
County Population by 1000 Income Education Total Investment # of Projects
New York 1586 1907 60 $640,959,041 509
Kings 2505 850 34 $541,560,955 420
Bronx 1385 978 19 $296,864,069 304
Queens 2231 965 31 $392,850,248 273
Westchester 949 1327 47 $195,966,863 194
Bottom 5 NYS Counties for Energy Efficiency Projects
County Population by 1000 Income Education Total Investment # of Projects
Yates 25 653 23 $141,697 1
Sullivan 78 789 22 $2,746,875 1
Wayne 94 806 21 $144,780 1
Fulton 56 774 17 $720,009 2
Genesee 60 757 21 $56,197 2
Washington 63 822 20 $2,524,284 2
Cayuga 80 817 22 $4,544,231 2
Tompkins 102 1109 52 $145,188 2
Schenectady 155 747 31 $914,257 2

The following Zelig simulation looks at the relationship between population density and the amount of money invested in energy efficiency projects. The simulation shows that every increase if 1,000 residents lead to an increase in investment of $204,767.

Argument model is only valid for the Zelig wrapper, but not the Zelig method, and will be ignored. (Intercept) Pop3 -19563224.9 204766.8

The following regressions look at the monetary and energy savings associated with investments in energy efficiency.

1. Investments and Financial Savings

To better understand how investments in energy efficiency can provide longterm savings for counties, the following regression looks at the relationship between investment in energy efficiency and projected first year savings in dollars. The regression results show that every $100 dollars invested in energy efficiency resulted in a projected first year utility cost reduction of 7 dollars. Energy efficiency projects can therefore pay for themselves in less than 15 years.

Statistical models
Model 1
(Intercept) 206088.86
(164971.86)
PCost2 0.07***
(0.00)
R2 0.98
Adj. R2 0.98
Num. obs. 46
RMSE 1043566.73
p < 0.001, p < 0.01, p < 0.05

2. Investments and Energy Savings

This last regression and plot explores the relationship between the amount spent on energy efficiency projects and projected first year savings in kilowatts. In this case, the regression results show that every 100 dollars spent on energy efficiency resulted in a projected first year energy savings of 44 kilowatts. Considering how volatile energy prices have been in the past and will continue to be in the future, investments in energy efficiency today will likely result in significant energy cost savings in the future for those counties who are able to make such an investment.

Statistical models
Model 1
(Intercept) 3387518.08
(1925888.10)
PCost2 0.44***
(0.02)
R2 0.94
Adj. R2 0.94
Num. obs. 46
RMSE 12182639.47
p < 0.001, p < 0.01, p < 0.05

V. Conclusion

Urban communities significantly surpass rural areas with regards to socioeconomic resources. As a result they are clearly at a considerable advantage when it comes to their ability to make investments towards sustainability. These investments come with clear economic benefits which add up with time.

Unable to make the same kinds of investments, climate change will only add to the economic burdens already being felt by rural areas. Efforts should therefore be made to assist rural communities in funding and implementing sustainability measures in order to ensure their long-term survival.

Bibliography

  1. Altieri, Miguel; Nicholls, Clara. “The Adaption and Mitigation Potential of Traditional Agriculture in a Changing Climate”. Climate Change. September 13, 2013.

  2. Bureau of Labor Stastitics. Web. https://www.bls.gov/regions/new-york-new-jersey/news-release/2018/countyemploymentandwages_newyork_20180111.htm

  3. Kite-Powell, Jennifer. “See How These Urban Cities Are Investing In Smart And Green Infrastructure”. Forbes. February 28, 2018. Web. https://www.forbes.com/sites/jenniferhicks/2018/02/28/see-how-these-urban-cities-are-investing-in-smart-and-green-infrastructure/

  4. New York Department of Health. “Table 1: Population. Land Area, and Population Density by County, New York - 2010”. November 11, 2011. Web. https://www.health.ny.gov/statistics/vital_statistics/2010/table02.htm

  5. New York Department of Labor. “NYS Unemployment Rate by County”. Web. https://www.labor.ny.gov/stats/PressReleases/county_rates.pdf

  6. Patterson, Brittany. “Cities and Towns Choose Renewables to Save Money”. Web. Scientific America. March 26, 2015. Web. https://www.scientificamerican.com/article/cities-and-towns-choose-renewables-to-save-money/

  7. Safi, Ahmad Saleh; Smith, Willam James Jr.; Lui, Zhnongwei. “Rural Nevada and Climate Change: Vulnerability, Belief, and Risk Assessment”. Risk Analysis. Vol. 32, No. 6. 2012.

  8. UN. “World Urbanization Prospect; the 2014 Revision”. 2015

  9. United States Department of Agriculture. County Level Data Sets - Education. Web. https://data.ers.usda.gov/reports.aspx?ID=17829

LS0tDQp0aXRsZTogIkNsaW1hdGUgQ2hhbmdlIGFuZCB0aGUgVXJiYW4gQWR2YW50YWdlIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KDQojIyMgQnk6IE1hcmlhIElzYWJlbCBPbGl2ZXJhDQoNCg0KIyMgSS4gSW50cm9kdWN0aW9uOiBTdXN0YWluYWJpbGl0eSBhbmQgVXJiYW4gQ29tbXVuaXRpZXMNCiANCiAgQ29tbXVuaXRpZXMgdGhyb3VnaG91dCB0aGUgd29ybGQgYXJlIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHByZXBhcmUgZm9yIHRoZSBjaGFsbGVuZ2VzIGFuZCB1bmNlcnRhaW50aWVzIHBvc2VkIGJ5IGNsaW1hdGUgY2hhbmdlLiBIb3dldmVyLCBub3QgYWxsIGNvbW11bml0aWVzIGNhbiBvciB3aWxsIHJlc3BvbmQgdG8gdGhlc2UgdGhyZWF0cyBpbiB0aGUgc2FtZSBtYW5uZXIgb3IgdG8gdGhlIHNhbWUgZGVncmVlLiBUaGUgbmF0dXJlIG9mIHRoZWlyIHJlc3BvbnNlIG1heSB1bHRpbWF0ZWx5IGJlIGVmZmVjdGVkIGJ5IHRoZSByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIHRoZW0uIFdlYWx0aGllciBjb21tdW5pdGllcyBhcmUgYWJsZSB0byBpbnZlc3QgaW4gaW5ub3ZhdGl2ZSB0ZWNobm9sb2dpZXMgdGhhdCBsZXNzIGFmZmx1ZW50IGNvbW11bml0aWVzIGNhbm5vdCBhZmZvcmQuIEhvdyB3ZWFsdGh5IGEgY29tbXVuaXR5IGlzIG1heSB1bHRpbWF0ZWx5IGRlcGVuZCBvbiBpdHMgc2l6ZSwgd2l0aCB1cmJhbiBhcmVhcyBiZWluZyBhdCBhbiBhZHZhbnRhZ2UgY29tcGFyZWQgdG8gcnVyYWwgYXJlYXMuIEFzIGdyb3dpbmcgcG9ydGlvbnMgb2YgdGhlIHdvcmxkJ3MgcG9wdWxhdGlvbiBmbG9jayB0byBjaXRpZXMsIHRoZSB0aHJlYXRzIHBvc2VkIHRvIHJ1cmFsIGNvbW11bml0aWVzIGJ5IGNsaW1hdGUgY2hhbmdlIG1heSBiZSBsYXJnZWx5IGlnbm9yZWQgbGVhdmluZyB0aGVtIGluY3JlYXNpbmdseSB2dWxuZXJhYmxlLiBUaGlzLCBob3dldmVyLCB3b3VsZCBiZSBhIGdyYXZlIG1pc3Rha2UsIHNpbmNlIGRlc3BpdGUgdGhlaXIgd2VhbHRoIGFuZCBzaXplIHRoZSBsb25nIHRlcm0gc3Vydml2YWwgb2YgY2l0aWVzIG1heSBkZXBlbmQgb24gdGhlIHN0cmVuZ3RoIG9mIG5laWdoYm9yaW5nIHJ1cmFsIGNvbW11bml0aWVzLCB3aGljaCBhcmUgYW4gaW52YWx1YWJsZSBzb3VyY2Ugb2Ygc3VzdGFpbmFibGUgcmVzb3VyY2VzLiBUaGVpciBmdXR1cmVzIGFyZSB0aGVyZWZvcmUgaW50ZXJ0d2luZWQsIG1ha2luZyBpdCBwYXJhbW91bnQgdGhhdCBpbnZlc3RtZW50cyBhcmUgbWFkZSBpbiBib3RoIHVyYmFuIGFuZCBydXJhbCBjb21tdW5pdGllcyB0byBwcm9tb3RlIHN1c3RhaW5hYmlsaXR5LiBUaGlzIHBhcGVyIGFpbXMgdG8gY29tcGFyZSBsZXZlbHMgb2YgaW52ZXN0bWVudCBpbiBzdXN0YWluYWJpbGl0eSBieSB1cmJhbiBhbmQgcnVyYWwgY29tbXVuaXRpZXMgaW4gTmV3IFlvcmsgU3RhdGUgYW5kIHRoZSByZXN1bHRpbmcgb3V0Y29tZXMuDQogIA0KIyMgSUkuIEJhY2tncm91bmQgYW5kIEhpc3RvcnkNCg0KICBDdXJyZW50bHkgb3ZlciBoYWxmIG9mIHRoZSBnbG9iYWwgcG9wdWxhdGlvbiBsaXZlcyBpbiBjaXRpZXMgKFVOKS4gVGhpcyBudW1iZXIgaXMgcHJvamVjdGVkIHRvIGdyb3cgdG8gdHdvLXRoaXJkIG9mIHRoZSBnbG9iYWwgcG9wdWxhdGlvbiBieSAyMDUwIChVTikuIEFzIGNpdGllcyBncm93IGluIHNpemUsIHJ1cmFsIGFyZWFzIGFyZSBwcm9qZWN0ZWQgdG8gZGVjbGluZSBhcyBwb3J0aW9ucyBvZiB0aGUgcnVyYWwgcG9wdWxhdGlvbiBtaWdyYXRlIGludG8gdXJiYW4gY29tbXVuaXRpZXMuIFRoZSBjb250aW51ZWQgZ3Jvd3RoIG9mIGNpdGllcyBhcmUgYXNzdXJlZCBieSB0aGUgZmFjdCB0aGF0IHRoZXNlIGNvbW11bml0aWVzIG9mZmVyIG1vcmUgZW1wbG95bWVudCBhbmQgZWR1Y2F0aW9uYWwgb3Bwb3J0dW5pdGllcyBhcyB3ZWxsIGFzIGFjY2VzcyB0byBoaWdobHkgdmFsdWVkIGFtZW5pdGllcywgc3VjaCBhcyBwdWJsaWMgdHJhbnNwb3J0YXRpb24gKEtpdGUtUG93ZWxsKS4NCg0KICBBbG9uZyB3aXRoIGdyZWF0ZXIgd2VhbHRoIGFuZCBvcHBvcnR1bml0aWVzLCBob3dldmVyLCB1cmJhbiBhcmVhcyBhbHNvIGhhdmUgZ3JlYXRlciBuZWVkcy4gRHVlIHRvIHRoZWlyIHdlYWx0aCwgcGVyIGNhcGl0YSBjb25zdW1wdGlvbiBpcyBoaWdoZXIgaW4gY2l0aWVzIHRoYW4gcnVyYWwgY29tbXVuaXRpZXMgKFVOKS4gIEFzIGEgcmVzdWx0ICJjaXRpZXMgY29uc3VtZSBtb3JlIHRoYW4gMi8zIG9mIHRoZSB3b3JsZCdzIGVuZXJneSIgKFVOKS4gU3VzdGFpbmFiaWxpdHkgbWVhc3VyZXMgYXJlIHRoZXJlZm9yZSBlc3NlbnRpYWwgZm9yIHRoZSBsb25nIHRlcm0gc2VjdXJpdHkgYW5kIHN1cnZpdmFsIG9mIHRoZXNlIGdyb3dpbmcgY29tbXVuaXRpZXMgKFBhdHRlcnNvbikuQWxvbmcgd2l0aCBoYXZpbmcgYSBwb3dlcmZ1bCBpbmNlbnRpdmUgYW5kIHRoZSBmaW5hbmNpYWwgcmVzb3VyY2VzIHRvIHB1cnN1ZSBlbmVyZ3kgZWZmaWNpZW5jeSBhbmQgc3VzdGFpbmFiaWxpdHksIHVyYmFuIGNvbW11bml0aWVzIGFyZSBhbHNvIG1vcmUgbGlrZWx5IHRvIGhhdmUgdGhlIGVuZ2luZWVycyBhbmQgdGVjaG5pY2lhbnMgbmVjZXNzYXJ5IHRvIHBsYW4gYW5kIGltcGxlbWVudCBzdWNoIHByb2plY3RzIChLaXRlLVBvd2VsbCkuIEZvciB0aGVzZSByZWFzb25zIHVyYmFuIGFyZWFzIGhhdmUgdGhlIGFiaWxpdHkgdG8gc2VydmUgYXMgY2VudGVycyBvZiBpbm5vdmF0aW9uIGFuZCB0ZXN0aW5nIGdyb3VuZHMgZm9yIHN1c3RhaW5hYmlsaXR5IG1lYXN1cmVzLg0KICANCiAgRm9yIHNtYWxsZXIgbW9yZSBydXJhbCBjb21tdW5pdGllcywgaG93ZXZlciwgdGhlcmUgY2FuIGJlIG1hbnkgaHVyZGxlcyB3aGljaCBwcmV2ZW50IHRoZW0gZnJvbSBwdXJzdWluZyBncmVhdGVyIGVuZXJneSBlZmZpY2llbmN5IGFuZCBzdXN0YWluYWJpbGl0eS4gSW4gdGhlIHBhc3QsIHNvbWUgcnVyYWwgY29tbXVuaXRpZXMgZWFnZXIgdG8gcHJvbW90ZSBzdXN0YWluYWJpbGl0eSBoYXZlIGZvdW5kIHRoYXQgdGhlaXIgc2l6ZSB1bmRlcm1pbmVzIHRoZWlyIGFiaWxpdHkgdG8gaW1wbGVtZW50IHN1Y2ggcHJvamVjdHMuIEFuIGV4YW1wbGUgb2YgdGhpcyBjYW4gYmUgc2VlbiBpbiB0aGUgY29tbXVuaXR5IG9mIFdpbmRoYW0sIE5ldyBIYW1wc2hpcmUuIFdpdGggYSBwb3B1bGF0aW9uIG9mIDEyLDAwMCB0aGUgbG9jYWwgZ292ZXJubWVudCBhdHRlbXB0ZWQgdG8gbW92ZSB0b3dhcmRzIDEwMCBwZXJjZW50IHJlbmV3YWJsZSBlbmVyZ3ksIGJ1dCB1bmZvcnR1bmF0ZWx5IGJlY2F1c2UgdGhleSBkbyBub3QgaGF2ZSB0aGVpciBvd24gbXVuaWNpcGFsLW93bmVkIHV0aWxpdHkgc3lzdGVtIGFsbCB0aGV5IGNvdWxkIGFmZm9yZCB0byBkbyB3YXMgcHVyY2hhc2UgcmVuZXdhYmxlIGVuZXJneSBmb3Igc29tZSBvZiB0aGVpciBwdWJsaWMgYnVpbGRpbmcgKFBhdHRlcnNvbikuDQogIA0KICBUaGUgYmVsaWVmcyBhbmQgYmlhc2VzIG9mIHJlc2lkZW50cyBhbHNvIHBsYXlzIGFuIGltcG9ydGFudCByb2xlIGluIGluZmx1ZW5jaW5nIGEgY29tbXVuaXR5J3MgYWJpbGl0eSBwdXJzdWl0IHN1c3RhaW5hYmlsaXR5IG1lYXN1cmVzLiBBIDIwMTIgc3R1ZHkgb2YgcnVyYWwgTmV2YWRhIHJhbmNoZXJzIGFuZCBmYXJtZXJzIGZvdW5kIHRoYXQgdGhvc2Ugd2hvIGlkZW50aWZpZWQgdGhlbXNlbHZlcyBhcyBjb25zZXJ2YXRpdmUgd2VyZSBsZXNzIGxpa2VseSB0byBlaXRoZXIgYXR0cmlidXRlIGNsaW1hdGUgY2hhbmdlIHRvIGh1bWFuIGFjdGl2aXR5IG9yIHRvIHNlZSBpdCBhcyBhIHJpc2sgdG8gdGhlbXNlbHZlcywgdGhlcmVmb3JlIG1ha2luZyB0aGVtIGxlc3MgaW5jbGluZWQgdG8gc3VwcG9ydCBwb2xpY2llcyB3aGljaCBlbXBoYXNpemVkIHN1c3RhaW5hYmlsaXR5IChTYWZpKS4gWWV0IGFub3RoZXIgZXhhbXBsZSBvZiB0aGlzIGNvbm5lY3Rpb24gY2FuIGJlIHNlZW4gaW4gR2VvcmdldG93biwgVGV4YXMgd2hlcmUgbG9jYWwgcmVzaWRlbnRzIHdlcmUgd2Vhcnkgb2YgYSBzb2xhciBhbmQgd2luZCBlbmVyZ3kgaW5zdGFsbGF0aW9uIHByb2plY3QgYmVjYXVzZSB0aGV5IGRpZCBub3QgdHJ1c3QgdGhhdCB0aGVzZSBuZXcgdGVjaG5vbG9naWVzIGNvdWxkIG1lZXQgdGhlaXIgZW5lcmd5IG5lZWRzLiBJbiB0aGlzIGNhc2UgaXQgd2FzIG5lY2Vzc2FyeSBmb3IgY2l0eSBvZmZpY2lhbHMgdG8gZWR1Y2F0ZSB0aGUgcmVzaWRlbnRzIGFuZCBleHBsYWluIHRvIHRoZW0gdGhlIG5hdHVyZSBvZiB0aGVzZSB0ZWNobm9sb2dpZXMgYW5kIGhvdyB0aGV5IHdvcmsgKFBhdHRlcnNvbikuDQogIA0KICBUaG91Z2ggdGhlcmUgYXJlIGJpZyBjb3N0cyBhc3NvY2lhdGVkIHdpdGggc3VzdGFpbmFiaWxpdHkgcHJvamVjdHMgdGhlcmUgYXJlIGFsc28gZmluYW5jaWFsIGJlbmVmaXRzLiBQb2xpY2llcyB3aGljaCBwcm9tb3RlIHN1c3RhaW5hYmlsaXR5IGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVkdWNlIGVuZXJneSBjb25zdW1wdGlvbiBhbmQgbG93ZXIgaGVhbHRoY2FyZSBjb3N0cy4gVGhlc2Ugc2F2aW5ncyBjYW4gdGhlbSBiZSByZWludmVzdGVkIGJhY2sgaW50byBjb21tdW5pdGllcyAoS2FybHNzb24pLiBJZiBzbWFsbGVyIGNvbW11bml0aWVzIGxvc2Ugb3V0IG9uIHN1Y2ggYmVuZWZpdHMsIGNsaW1hdGUgY2hhbmdlIHdpbGwgaW5ldml0YWJsZSBpbmNyZWFzZSB0aGUgZWNvbm9taWMgYW5kIHNvY2lhbCBkaXZpZGUgYmV0d2VlbiB1cmJhbiBhbmQgcnVyYWwgY29tbXVuaXRpZXMuDQogIA0KICBUaGUgZmF0ZSBvZiBydXJhbCBjb21tdW5pdGllcyBpbiB0aGUgZmFjZSBvZiBjbGltYXRlIGNoYW5nZSBpcyB2aXRhbCBjb25zaWRlcmluZyB0aGUgaW1wb3J0YW50IHJvbGUgdGhleSBwbGF5IGFzIHRoZSBjb3JuZXJzdG9uZXMgb2YgYSBzdXN0YWluYWJsZSBmb29kIHN5c3RlbSB3aGljaCBjYW4gc2VydmUgbGFyZ2UsIGh1bmdyeSB1cmJhbiBuZWlnaGJvcnMgaW4gdGhlIGZ1dHVyZS4gQ3VycmVudGx5LCA1MCUgb2YgdGhlIGdsb2JhbCBhZ3JpY3VsdHVyZSBvdXRwdXQgY29tZXMgZnJvbSBzbWFsbCBmYW1pbHkgZmFybXMgKEFsdGllcmkpLiBPZiB0aGVzZSBzbWFsbCBmYXJtcywgNTAlIHVzZSBzdXN0YWluYWJsZSBmYXJtaW5nIHByYWN0aWNlcyAoQWx0aWVyaSkuIFRoZXNlIHNtYWxsZXIgZmFybXMgbm90IG9ubHkgdXNlIHJlc291cmNlcyBpbiBhIG1vcmUgZWZmaWNpZW50IG1hbm5lciwgdGhleSBhbHNvIGhhdmUgYSBncmVhdGVyIGRlZ3JlZSBvZiBjcm9wIGFuZCBsaXZlc3RvY2sgZGl2ZXJzaXR5IChBbHRpZXJpKS4gQWRkaXRpb25hbGx5LCB0aGVzZSBmYXJtZXJzIGFyZSBhYmxlIHRvIHVzZSB0aGVpciBrbm93bGVkZ2Ugb2YgbG9jYWwgY3JvcCB2YXJpZXRpZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGxpa2VsaWhvb2Qgb2YgY3JvcCBmYWlsdXJlIGR1ZSB0byBhIGNoYW5naW5nIGNsaW1hdGUgKEFsdGllcmkpLiBUaGlzIHByb3ZpZGVzIHNtYWxsIGxvY2FsIGZhcm1zIGFuIGFkdmFudGFnZSBvdmVyIGxhcmdlIGluZHVzdHJpYWwgZmFybXMgd2hlbiByZXNwb25kaW5nIHRvIHRoZSB0aHJlYXRzIHRvIGFncmljdWx0dXJlIGFuZCBmb29kIHNlY3VyaXR5IHBvc2VkIGJ5IGNsaW1hdGUgY2hhbmdlLiANCiAgDQogIExvY2FsIHJ1cmFsIGNvbW11bml0aWVzIGFyZSB0aGVyZWZvcmUgYSB2aXRhbCBhc3NldCB0byBncm93aW5nIGNpdGllcyBhbmQgbWVhc3VyZXMgbXVzdCBiZSB0YWtlbiB0byBpbnN1cmUgdGhhdCBib3RoIGNvbW11bml0aWVzIGFyZSBhYmxlIHRvIG1lZXQgdGhlIGNoYWxsZW5nZXMgdGhhdCB3aWxsIGluZXZpdGFibHkgcmVzdWx0IGZyb20gY2xpbWF0ZSBjaGFuZ2UuIFdpdGggcmVnYXJkcyB0byBzdXN0YWluYWJpbGl0eSBpbml0aWF0aXZlcywgcnVyYWwgY29tbXVuaXRpZXMgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGZhbGwgYmVoaW5kIHRoZWlyIG1vcmUgcmVzb3VyY2VmdWwgdXJiYW4gbmVpZ2hib3JzLiBUaGUgZmlyc3Qgc3RlcCBpbiBkb2luZyB0aGlzIGlzIHRvIGRldGVybWluZSB0aGUgZGVncmVlIHRvIHdoaWNoIHVyYmFuIGNvbW11bml0aWVzIG91dHNwZW5kIHJ1cmFsIGNvbW11bml0aWVzIG9uIGVuZXJneSBlZmZpY2llbmN5IHByb2plY3RzLg0KICANCiMjIElJSS4gRGF0YSBhbmQgTWV0aG9kb2xvZ3kNCg0KICBGb3IgbXkgYW5hbHlzaXMsIEkgaGF2ZSB1dGlsaXplZCBhIGRhdGFzZXQgZnJvbSBPcGVuIERhdGEgTlksIHdoaWNoIHRyYWNrcyBlbmVyZ3kgZWZmaWNpZW5jeSBwcm9qZWN0cyBjb21wbGV0ZWQgaW4gTmV3IFlvcmsgU3RhdGUgc2luY2UgMTk4Ny4gVGhlc2UgcHJvamVjdHMgYXJlIGZ1bmRlZCBieSBhIE5ldyBZb3JrIFBvd2VyIEF1dGhvcml0eSBwcm9ncmFtIHdoaWNoIHByb3ZpZGVzIGZpbmFuY2luZyB0byBwdWJsaWMgc2Nob29scyBhbmQgZ292ZXJubWVudCBmYWNpbGl0aWVzIHRvIGFzc2lzdCB0aGVtIGluIGltcGxlbWVudGluZyBlbmVyZ3kgZWZmaWNpZW5jeSBpbXByb3ZlbWVudHMgd2l0aCBubyB1cGZyb250IGNvc3RzLg0KICANCiAgQWxvbmcgd2l0aCB0aGUgZGF0YSBwcm92aWRlZCBieSBPcGVuIERhdGEgTlkgZGF0YXNldCwgSSBhbHNvIGluY2x1ZGVkIGVkdWNhdGlvbmFsIGRhdGEgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBEZXBhcnRtZW50IG9mIEFncmljdWx0dXJlIEVjb25vbWljIFJlc2VhcmNoIFNlcnZpY2UsIHdoaWNoIHByb3ZpZGVkIGNvdW50eSBsZXZlbCBjb2xsZWdlIGNvbXBsZXRpb24gcmF0ZXMuIEluIGFkZGl0aW9uIHRvIHRoaXMsIEkgaW5jbHVkZWQgcGVyIGNhcGl0YSBpbmNvbWUgYW5kIHBvcHVsYXRpb24gc3RhdGlzdGljcyBmcm9tIHRoZSBVLlMuIDIwMTAgY2Vuc3VzLg0KDQpGb3IgbXkgYW5hbHlzaXMsIEkgd2lsbCBiZSBsb29raW5nIGF0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOg0KDQoxLglFZHUgKG51bWVyaWNhbCkgLSBQZXJjZW50YWdlIG9mIGNvdW50eSByZXNpZGVudHMgd2l0aCBhIGJhY2hlbG9yJ3MgZGVncmVlIG9yIGhpZ2hlcg0KDQoyLglFRVJlZHVjdGlvbiAoTnVtZXJpY2FsKSAtIFByZWRpY3RlZCBSZWR1Y3Rpb24gaW4gZW5lcmd5IGNvbnN1bXB0aW9uIGluIGtpbG93YXR0cw0KDQozLglGWVNhdmluZ3MgKGNvbnRpbnVvdXMpIC0gUHJlZGljdGVkIGFtb3VudCBzYXZlZCB3aXRoaW4gdGhlIGZpcnN0IHllYXIgb2YgdGhlIHByb2plY3QncyBjb21wbGV0aW9uIGluIGRvbGxhcnMNCg0KNC4JSW5jb21lIChudW1lcmljYWwpIC0gQXZlcmFnZSB3ZWVrbHkgd2FnZSBieSBjb3VudHkgDQoNCjUuCVBvcHVsYXRpb24gKG51bWVyaWNhbCkgLSBQb3B1bGF0aW9uIGJ5IGNvdW50eQ0KDQo2LglUUENvc3QgKG51bWVyaWNhbCkgLSBBbW91bnQgc3BlbnQgb24gYW4gZW5lcmd5IGVmZmljaWVuY3kgcHJvamVjdHMgaW4gZG9sbGFycw0KDQo3LglVbmVtcGxveSAobnVtZXJpY2FsKSAtIFVuZW1wbG95bWVudCByYXRlDQoNCiAgDQojIyBJVi4gQW5hbHlzaXMgYW5kIFJlc3VsdHMgDQoNCiMjIyBBLiBUaGUgVXJiYW4gQWR2YW50YWdlDQoNCiAgVG8gY29tcGFyZSB0aGUgZGlmZmVyZW5jZXMgaW4gbGV2ZWxzIG9mIHNvY2lhbCBjYXBpdGFsIGJldHdlZW4gcnVyYWwgYW5kIHVyYmFuIGNvdW50aWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgZGlmZmVyZW50IHBvcHVsYXRpb24gZGVuc2l0aWVzIGFtb25nc3QgdGhlIDYyIGNvdW50aWVzIGluIE5ldyBZb3JrIFN0YXRlLiBCZWxvdyBpcyBhIG1hcCBvZiBOZXcgWW9yayBTdGF0ZSB3aGljaCBoaWdobGlnaHRzIHRoZSB2YXJpb3VzIGNvdW50eSBwb3B1bGF0aW9uIGRlbnNpdGllcy4gQXMgdGhlIG1hcCBjbGVhcmx5IHNob3dzLCB0aGUgdmFzdCBtYWpvcml0eSBvZiBOZXcgWW9yayBTdGF0ZSBpcyBydXJhbC4gQW4gb3ZlcndoZWxtaW5nIHBvcnRpb24gb2YgdGhlIFN0YXRlJ3MgcG9wdWxhdGlvbiByZXNpZGUgaW4gdGhlIGNvdW50aWVzIHRoYXQgbWFrZSB1cCBOZXcgWW9yayBDaXR5LCBMb25nIElzbGFuZCwgYW5kIFdlc3RjaGVzdGVyLiBUaGUgdG9wIHRlbiBhbmQgYm90dG9tIHRlbiBwb3B1bG91cyBjb3VudGllcyBpbiBOZXcgWW9yayBTdGF0ZSBhcmUgbGlzdGVkIGJlbG93IHRoZSBtYXAuDQoNCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0NCg0KbGlicmFyeShzZikNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkodGlncmlzKQ0KDQpvcHRpb25zKHRpZ3Jpc19jbGFzcyA9ICJzZiIpDQoNCm55X2NvdW50eSA8LSBjb3VudGllcygiTlkiLCBjYiA9IFRSVUUpDQoNCk5ZQ291bnR5JE5BTUUgPC0gdG9sb3dlcihOWUNvdW50eSRDb3VudHkpDQpueV9jb3VudHkkTkFNRSA8LSB0b2xvd2VyKG55X2NvdW50eSROQU1FKQ0KDQpOWUNvdW50eSRQb3AyIDwtIE5ZQ291bnR5JFBvcHVsYXRpb24gLyAxMDAwDQpOWUNvdW50eSRQb3AyIDwtIHJvdW5kKE5ZQ291bnR5JFBvcDIpDQoNCg0KTlltYXAgPC0gZ2VvX2pvaW4obnlfY291bnR5LCBOWUNvdW50eSwgYnkgPSAiTkFNRSIpDQoNCnRtX3NoYXBlKE5ZbWFwKSArIHRtX3BvbHlnb25zKCJQb3AyIiwgdGl0bGUgPSAiUG9wdWxhdGlvbiBieSAxLDAwMCIsIGJyZWFrcyA9IGMoMCwgMjAwLCA0MDAsIDYwMCwgODAwLCBJbmYpLA0KcGFsZXR0ZSA9ICJHcmVlbnMiKSArIHRtX3RleHQoIk5BTUUiLCBzaXplID0gIkFSRUEiKSArDQp0bV9sYXlvdXQodGl0bGUgPSAiTllTIFBvcHVsYXRpb24iKQ0KDQpgYGANCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0NCg0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpwb3BBIDwtIE5ZQ291bnR5JT4lIA0KICBkcGx5cjo6c2VsZWN0KENvdW50eSwgUG9wMikgJT4lDQogIGFycmFuZ2UoZGVzYyhQb3AyKSwgQ291bnR5KSAlPiUNCiAgdG9wX24obiA9IDEwKQ0KDQprYWJsZShwb3BBLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiTllTIDEwIE1vc3QgUG9wdWxvdXMgQ291bnRpZXMiLCANCiAgY29sLm5hbWVzID0gYygiQ291bnR5IiwgIlBvcHVsYXRpb24gYnkgMTAwMCIpKSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgcmVzdWx0cz0nYXNpcycsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQ0KDQpsaWJyYXJ5KHBseXIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnBvcEIgPC0gTllDb3VudHklPiUgDQogIGRwbHlyOjpzZWxlY3QoQ291bnR5LCBQb3AyKSAlPiUNCiAgYXJyYW5nZSgoUG9wMiksIENvdW50eSkgJT4lDQogIHRvcF9uKG4gPSAtIDEwKQ0KDQprYWJsZShwb3BCLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiTllTIDEwIExlYXN0IFBvcHVsb3VzIENvdW50aWVzIiwgDQogIGNvbC5uYW1lcyA9IGMoIkNvdW50eSIsICJQb3B1bGF0aW9uIGJ5IDEwMDAiKSkgJT4lIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsICJjb25kZW5zZWQiLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQogIA0KICBGb3IgdGhpcyBzdHVkeSwgdGhlIDMgbWVhc3VyZXMgb2Ygc29jaWFsIGNhcGl0YWwgd2hpY2ggSSB3aWxsIGJlIGxvb2tpbmcgYXQgYXJlIHBlciBjYXBpdGEgaW5jb21lIChJbmNvbWUpLCB1bmVtcGxveW1lbnQgcmF0ZXMgKFVuZW1wbG95KSwgYW5kIGNvbGxlZ2UgZ3JhZHVhdGUgcmF0ZXMgKEVkdSkuDQoNCg0KIyMjIyAxLiBQb3B1bGF0aW9uIGFuZCBJbmNvbWUNCg0KICBNeSBmaXJzdCByZWdyZXNzaW9uIGxvb2tzIGF0IHRoZSBsaW5rIGJldHdlZW4gaW5jb21lIGFuZCBwb3B1bGF0aW9uIGRlbnNpdHkuIFRoZSBzdW1tYXJ5IGFuZCBncmFwaCBiZWxvdyBzaG93IGEgY2xlYXIgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBwb3B1bGF0aW9uIGRlbnNpdHkgYW5kIGluY29tZS4gQW4gaW5jcmVhc2UgaW4gcG9wdWxhdGlvbiBieSAxMDAwIHJlc2lkZW50cyByZXN1bHRzIGluICBhbiBpbmNyZWFzZSBpbiBwZXIgY2FwaXRhIGluY29tZSBvZiAkMSw4MDAgZG9sbGFycy4NCg0KYGBge3IgcmVzdWx0cz0nYXNpcycsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFfQ0KDQpsaWJyYXJ5KHRleHJlZykNCmxpYnJhcnkoZ2dwbG90MikNCg0KUG9waW5jIDwtIGxtKEluY29tZSB+IFBvcDIsIGRhdGEgPSBOWUNvdW50eSkNCmh0bWxyZWcoUG9waW5jKQ0KDQpnZ3Bsb3QgKE5ZQ291bnR5LCBhZXMoeD1Qb3AyLCB5PUluY29tZSkpICsNCmdlb21fcG9pbnQoKSsNCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sID0gInJlZCIpDQpgYGANCg0KIyMjIyAyLiBQb3B1bGF0aW9uIGFuZCBVbmVtcGxveW1lbnQNCg0KICBXaXRoIHJlZ2FyZHMgdG8gcG9wdWxhdGlvbiBhbmQgdW5lbXBsb3ltZW50IHJhdGVzLCB0aGUgZm9sbG93aW5nIHNpbXVsYXRpb24gY2xlYXJseSBkZXNjcmliZXMgdGhlIGRpZmZlcmVuY2UgaW4gdW5lbXBsb3ltZW50IGxldmVscyBiZXR3ZWVuIHJ1cmFsIGFuZCB1cmJhbiBhcmVhcy4gSW4gY291bnRpZXMgd2l0aCBvdmVyIDIuNSBtaWxsaW9uIHJlc2lkZW50cywgdGhlIHVuZW1wbG95bWVudCByYXRlIHdhcyBvbiBhdmVyYWdlLCBvdmVyIGEgcXVhcnRlciBvZiBhIHBlcmNlbnRhZ2UgcG9pbnQgbG93ZXIgdGhhbiB0aG9zZSBjb3VudGllcyB3aXRoIGxlc3MgdGhhbiAxMDAsMDAwIHJlc2lkZW50cy4NCg0KYGBge3IgcmVzdWx0cz0nYXNpcycsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQ0KDQpsaWJyYXJ5KG1lclRvb2xzKQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoWmVsaWcpDQpsaWJyYXJ5KFplbGlnQ2hvaWNlKQ0KDQpOWUNvdW50eSRQb3AzIDwtIGN1dChOWUNvdW50eSRQb3B1bGF0aW9uLCAxMCwgbGFiZWxzID0gRkFMU0UpDQoNCnoubnllMiA8LSB6ZWxpZyhVbmVtcGxveSB+IFBvcDMsIG1vZGVsID0gIm5vcm1hbCIsIGRhdGEgPSBOWUNvdW50eSwgY2l0ZSA9IEYpDQoNCnoubnllMiRzZXR4KFBvcDMgPSAxKQ0Kei5ueWUyJHNldHgxKFBvcDMgPSAxMCkNCnoubnllMiRzaW0oKQ0Kei5ueWUyJGdyYXBoKCkNCg0KZmQyIDwtIHoubnllMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpDQpzdW1tYXJ5KGZkMikNCg0KYGBgDQoNCg0KIyMjIyAzLiBQb3B1bGF0aW9uIGFuZCBFZHVjYXRpb24NCg0KVGhlIG5leHQgc2ltdWxhdGlvbiBsb29rcyBhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcG9wdWxhdGlvbiBkZW5zaXR5IGFuZCB0aGUgcGVyY2VudGFnZSBvZiBjb2xsZWdlIGdyYWR1YXRlcyBpbiBhIGNvdW50eS4gVGhlIHNpbXVsYXRpb24gc2hvd3MgYSBkaWZmZXJlbmNlIG9mIDIwIHBlcmNlbnRhZ2UgcG9pbnRzIGJldHdlZW4gY291bnRpZXMgd2l0aCBvdmVyIDIuNSBtaWxsaW9uIHJlc2lkZW50cyBhbmQgdGhvc2Ugd2l0aCBsZXNzIHRoYW4gMTAwLDAwMCB3aXRoIHJlZ2FyZHMgdG8gdGhlIHJhdGUgb2YgY29sbGVnZSBncmFkdWF0ZXMuDQoNCmBgYHtyIHJlc3VsdHMgPSAiYXNpcyIsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFfQ0KDQpsaWJyYXJ5KG1lclRvb2xzKQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShaZWxpZykNCmxpYnJhcnkodGV4cmVnKQ0KDQoNCnoubnllMyA8LSB6ZWxpZyhFZHUgfiBQb3AzLCBtb2RlbCA9ICJub3JtYWwiLCBkYXRhID0gTllDb3VudHksIGNpdGUgPSBGKQ0KDQp6Lm55ZTMkc2V0eChQb3AzID0gMSkNCnoubnllMyRzZXR4MShQb3AzID0gMTApDQp6Lm55ZTMkc2ltKCkNCmh0bWxyZWcoei5ueWUzLCBkb2N0eXBlID0gRkFMU0UpDQoNCmZkMyA8LSB6Lm55ZTMkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQ0Kc3VtbWFyeShmZDMpDQpgYGANCg0KVGhlc2UgdGhyZWUgZmlndXJlcyBjbGVhcmx5IHNob3cgdGhlIGRlZ3JlZSBpbiB3aGljaCB1cmJhbiBjb21tdW5pdGllcyBmYXIgc3VycGFzcyBydXJhbCBjb21tdW5pdGllcyB3aXRoIHJlZ2FyZHMgdG8gc29jaWFsIGNhcGl0YWwuIFRoZSBuZXh0IHBvcnRpb24gb2YgdGhpcyBwYXBlciB3aWxsIGxvb2sgYXQgaG93IHVyYmFuIGNvbW11bml0aWVzIGludmVzdCBpbiBlbmVyZ3kgZWZmaWNpZW5jeSBjb21wYXJlZCB0byBydXJhbCBjb21tdW5pdGllcyBhbmQgdGhlIGZpbmFuY2lhbCBiZW5lZml0cyBvZiB0aGVzZSBpbnZlc3RtZW50cy4NCg0KIyMjIEIuIFRoZSBSZXdhcmRzIG9mIEludmVzdGluZyBpbiBFbmVyZ3kgRWZmaWNpZW5jeQ0KDQpUbyBkZXRlcm1pbmUgdGhlIGNvbmNlbnRyYXRpb24gb2YgZW5lcmd5IGVmZmljaWVuY3kgcHJvamVjdCBhY3Jvc3MgdGhlIGNvdW50aWVzIG9mIE5ldyBZb3JrIFN0YXRlLCBJJ3ZlIGdyb3VwZWQgdGhlc2UgcHJvamVjdHMgYnkgY291bnR5LiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSB0b3AgZml2ZSBjb3VudGllcyBhbmQgYm90dG9tIGZpdmUgTllTIGNvdW50aWVzIGZvciBjb21wbGV0ZWQgZW5lcmd5IGVmZmljaWVuY3kgcHJvamVjdHMuIFRoZSB0YWJsZXMgYWxzbyBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIHNvY2lvZWNvbm9taWMgbWVhc3VyZXMgZm9yIHRoZXNlIGNvdW50aWVzLiANCg0KYGBge3IgcmVzdWx0cz0nYXNpcycsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQ0KDQpsaWJyYXJ5KHBseXIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQ0KDQpOWVNFUkRBJFRQQ29zdCA8LSBjdXJyZW5jeShOWVNFUkRBJFRQQ29zdCwgZGlnaXRzID0gMEwpDQoNClRhYmxlMiA8LSBOWVNFUkRBICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoQ291bnR5LngpJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoUG9wbSA9IG1lYW4oUG9wMiksIEluY29tZW0gPSBtZWFuKEluY29tZSksIEVkdW0gPSBtZWFuKEVkdSksQ29zdCA9IHN1bShUUENvc3QpLCBwcm9qZWN0cyA9IG4oKSklPiUNCiAgIGFycmFuZ2UoZGVzYyhwcm9qZWN0cyksIFBvcG0sIEluY29tZW0sIEVkdW0pICU+JSANCiAgdG9wX24obiA9IDUpDQoNCmthYmxlKFRhYmxlMiwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIlRvcCA1IE5ZUyBDb3VudGllcyBmb3IgRW5lcmd5IEVmZmljaWVuY3kgUHJvamVjdHMiLCANCiAgY29sLm5hbWVzID0gYygiQ291bnR5IiwgIlBvcHVsYXRpb24gYnkgMTAwMCIsICJJbmNvbWUiLCAiRWR1Y2F0aW9uIiwgIlRvdGFsIEludmVzdG1lbnQiLCAiIyBvZiBQcm9qZWN0cyIpKSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KDQoNCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0NCg0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShmb3JtYXR0YWJsZSkNCg0KTllTRVJEQSRUUENvc3QgPC0gY3VycmVuY3koTllTRVJEQSRUUENvc3QsIGRpZ2l0cyA9IDBMKQ0KDQpUYWJsZTMgPC0gTllTRVJEQSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KENvdW50eS54KSU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKFBvcG0gPSBtZWFuKFBvcDIpLCBJbmNvbWVtID0gbWVhbihJbmNvbWUpLCBFZHVtID0gbWVhbihFZHUpLCBDb3N0ID0gc3VtKFRQQ29zdCksIHByb2plY3RzID0gbigpKSU+JQ0KICAgYXJyYW5nZSgocHJvamVjdHMpLCBQb3BtLCBJbmNvbWVtLCBFZHVtLCBDb3N0KSAlPiUgDQogIHRvcF9uKG4gPSAtNCkNCg0Ka2FibGUoVGFibGUzLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQm90dG9tIDUgTllTIENvdW50aWVzIGZvciBFbmVyZ3kgRWZmaWNpZW5jeSBQcm9qZWN0cyIsIA0KICBjb2wubmFtZXMgPSBjKCJDb3VudHkiLCAiUG9wdWxhdGlvbiBieSAxMDAwIiwgIkluY29tZSIsICJFZHVjYXRpb24iLCAiVG90YWwgSW52ZXN0bWVudCIsICIjIG9mIFByb2plY3RzIikpICU+JSBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgZnVsbF93aWR0aCA9IEYpDQoNCmBgYA0KICANCiAgDQogIFRoZSBmb2xsb3dpbmcgWmVsaWcgc2ltdWxhdGlvbiBsb29rcyBhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcG9wdWxhdGlvbiBkZW5zaXR5IGFuZCB0aGUgYW1vdW50IG9mIG1vbmV5IGludmVzdGVkIGluIGVuZXJneSBlZmZpY2llbmN5IHByb2plY3RzLiBUaGUgc2ltdWxhdGlvbiBzaG93cyB0aGF0IGV2ZXJ5IGluY3JlYXNlIGlmIDEsMDAwIHJlc2lkZW50cyBsZWFkIHRvIGFuIGluY3JlYXNlIGluIGludmVzdG1lbnQgb2YgJDIwNCw3NjcuDQoNCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0NCg0KbGlicmFyeShtZXJUb29scykNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoWmVsaWcpDQoNCk5ZU0VSREEkVFBDb3N0IDwtIGFzLm51bWVyaWMoZ3N1YignWyQsXScsICcnLCBOWVNFUkRBJFRQQ29zdCkpDQoNCk5ZUzEgIDwtIE5ZU0VSREEgJT4lDQogIGRwbHlyOjpncm91cF9ieShDb3VudHkueCklPiUNCiAgZHBseXI6OnN1bW1hcml6ZShQb3AzID0gbWVhbihQb3AyKSwgSW52ZXN0bWVudCA9IHN1bShUUENvc3QpKQ0KDQp6X255czEgPC0gem5vcm1hbCRuZXcoKQ0Kel9ueXMxJHplbGlnKEludmVzdG1lbnQgfiBQb3AzLCBtb2RlbCA9ICJub3JtYWwuc3VydmV5IiwgZGF0YSA9IE5ZUzEpDQpjb2VmKHpfbnlzMSkNCg0KYS5yYW5nZSA9IG1pbihOWVMxJFBvcDMpOm1heChOWVMxJFBvcDMpDQp6X255czEkc2V0cmFuZ2UoUG9wMyA9IGEucmFuZ2UpDQp6X255czEkc2ltKCkNCnpfbnlzMSRncmFwaCgpDQoNCg0KYGBgDQogIFRoZSBmb2xsb3dpbmcgcmVncmVzc2lvbnMgICBsb29rIGF0IHRoZSBtb25ldGFyeSBhbmQgZW5lcmd5IHNhdmluZ3MgYXNzb2NpYXRlZCB3aXRoIGludmVzdG1lbnRzIGluIGVuZXJneSBlZmZpY2llbmN5Lg0KDQoNCiMjIyMgMS4gSW52ZXN0bWVudHMgYW5kIEZpbmFuY2lhbCBTYXZpbmdzDQoNClRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyBpbnZlc3RtZW50cyBpbiBlbmVyZ3kgZWZmaWNpZW5jeSBjYW4gcHJvdmlkZSBsb25ndGVybSBzYXZpbmdzIGZvciBjb3VudGllcywgdGhlIGZvbGxvd2luZyByZWdyZXNzaW9uIGxvb2tzIGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbnZlc3RtZW50IGluIGVuZXJneSBlZmZpY2llbmN5IGFuZCBwcm9qZWN0ZWQgZmlyc3QgeWVhciBzYXZpbmdzIGluIGRvbGxhcnMuIFRoZSByZWdyZXNzaW9uIHJlc3VsdHMgc2hvdyB0aGF0IGV2ZXJ5ICQxMDAgZG9sbGFycyBpbnZlc3RlZCBpbiBlbmVyZ3kgZWZmaWNpZW5jeSByZXN1bHRlZCBpbiBhIHByb2plY3RlZCBmaXJzdCB5ZWFyIHV0aWxpdHkgY29zdCByZWR1Y3Rpb24gb2YgNyBkb2xsYXJzLiBFbmVyZ3kgZWZmaWNpZW5jeSBwcm9qZWN0cyBjYW4gdGhlcmVmb3JlIHBheSBmb3IgdGhlbXNlbHZlcyBpbiBsZXNzIHRoYW4gMTUgeWVhcnMuDQoNCmBgYHtyIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NX0NCg0KbGlicmFyeShtZXJUb29scykNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeShkcGx5cikNCg0KDQoNCk5ZU0VSREEkVFBDb3N0IDwtIGFzLm51bWVyaWMoZ3N1YignWyQsXScsICcnLCBOWVNFUkRBJFRQQ29zdCkpDQoNCk5ZU0VSREEkRllTYXZpbmdzIDwtIGFzLm51bWVyaWMoZ3N1YignWyQsXScsICcnLCBOWVNFUkRBJEZZU2F2aW5ncykpDQoNClNhdmluZ3NfYnlfQ291bnR5IDwtIE5ZU0VSREEgJT4lIA0KICBkcGx5cjo6Z3JvdXBfYnkoQ291bnR5LngpJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoUENvc3QyID0gc3VtKFRQQ29zdCksIEZZU2F2aW5nczIgPSBzdW0oRllTYXZpbmdzKSkNCg0KQ29zdF9TYXZpbmdzIDwtIGxtKEZZU2F2aW5nczIgfiBQQ29zdDIsIGRhdGEgPSBTYXZpbmdzX2J5X0NvdW50eSkNCmh0bWxyZWcoQ29zdF9TYXZpbmdzKQ0KICAgICAgICAgICAgDQpnZ3Bsb3QgKFNhdmluZ3NfYnlfQ291bnR5LCBhZXMoeD1QQ29zdDIsIHk9RllTYXZpbmdzMikpICsNCmdlb21fcG9pbnQoKSsgIA0KICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBjb2wgPSAiZ3JlZW4iKSArDQogIGxhYnMoeD0iSW52ZXN0bWVudCIpICsgbGFicyh5PSJQcm9qZWN0ZWQgRmlyc3QgWWVhciBTYXZpbmdzIikNCg0KYGBgDQoNCg0KIyMjIyAyLiBJbnZlc3RtZW50cyBhbmQgRW5lcmd5IFNhdmluZ3MNCg0KVGhpcyBsYXN0IHJlZ3Jlc3Npb24gYW5kIHBsb3QgZXhwbG9yZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBhbW91bnQgc3BlbnQgb24gZW5lcmd5IGVmZmljaWVuY3kgcHJvamVjdHMgYW5kIHByb2plY3RlZCBmaXJzdCB5ZWFyIHNhdmluZ3MgaW4ga2lsb3dhdHRzLiBJbiB0aGlzIGNhc2UsIHRoZSByZWdyZXNzaW9uIHJlc3VsdHMgc2hvdyB0aGF0IGV2ZXJ5IDEwMCBkb2xsYXJzIHNwZW50IG9uIGVuZXJneSBlZmZpY2llbmN5IHJlc3VsdGVkIGluIGEgcHJvamVjdGVkIGZpcnN0IHllYXIgZW5lcmd5IHNhdmluZ3Mgb2YgNDQga2lsb3dhdHRzLiBDb25zaWRlcmluZyBob3cgdm9sYXRpbGUgZW5lcmd5IHByaWNlcyBoYXZlIGJlZW4gaW4gdGhlIHBhc3QgYW5kIHdpbGwgY29udGludWUgdG8gYmUgaW4gdGhlIGZ1dHVyZSwgaW52ZXN0bWVudHMgaW4gZW5lcmd5IGVmZmljaWVuY3kgdG9kYXkgd2lsbCBsaWtlbHkgcmVzdWx0IGluIHNpZ25pZmljYW50IGVuZXJneSBjb3N0IHNhdmluZ3MgaW4gdGhlIGZ1dHVyZSBmb3IgdGhvc2UgY291bnRpZXMgd2hvIGFyZSBhYmxlIHRvIG1ha2Ugc3VjaCBhbiBpbnZlc3RtZW50LiANCg0KYGBge3IgcmVzdWx0cz0nYXNpcycsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQ0KDQpsaWJyYXJ5KG1lclRvb2xzKQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0ZXhyZWcpDQpsaWJyYXJ5KGRwbHlyKQ0KDQpOWVNFUkRBJFRQQ29zdCA8LSBhcy5udW1lcmljKGdzdWIoJ1skLF0nLCAnJywgTllTRVJEQSRUUENvc3QpKQ0KDQoNCkVuZXJneV9ieV9Db3VudHkgPC0gTllTRVJEQSAlPiUgDQogIGRwbHlyOjpncm91cF9ieShDb3VudHkueCklPiUNCiAgZHBseXI6OnN1bW1hcml6ZShQQ29zdDIgPSBzdW0oVFBDb3N0KSwgRUVSZWR1Y3Rpb24yID0gc3VtKEVFUmVkdWN0aW9uKSkNCg0KRW5lcmd5X1NhdmluZ3MgPC0gbG0oRUVSZWR1Y3Rpb24yIH4gUENvc3QyLCBkYXRhID0gRW5lcmd5X2J5X0NvdW50eSkNCmh0bWxyZWcoRW5lcmd5X1NhdmluZ3MpDQogICAgICAgICAgICANCmdncGxvdCAoRW5lcmd5X2J5X0NvdW50eSwgYWVzKHg9UENvc3QyLCB5PUVFUmVkdWN0aW9uMikpICsNCmdlb21fcG9pbnQoKSsgIA0KICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBjb2wgPSAicmVkIikgKw0KICBsYWJzKHg9IkludmVzdG1lbnQiKSArIGxhYnMoeT0iUHJvamVjdGVkIEZpcnN0IFllYXIgRW5lcmd5IFNhdmluZ3MiKQ0KDQpgYGANCg0KIyMjIFYuIENvbmNsdXNpb24NCg0KICBVcmJhbiBjb21tdW5pdGllcyBzaWduaWZpY2FudGx5IHN1cnBhc3MgcnVyYWwgYXJlYXMgd2l0aCByZWdhcmRzIHRvIHNvY2lvZWNvbm9taWMgcmVzb3VyY2VzLiBBcyBhIHJlc3VsdCB0aGV5IGFyZSBjbGVhcmx5IGF0IGEgY29uc2lkZXJhYmxlIGFkdmFudGFnZSB3aGVuIGl0IGNvbWVzIHRvIHRoZWlyIGFiaWxpdHkgdG8gbWFrZSBpbnZlc3RtZW50cyB0b3dhcmRzIHN1c3RhaW5hYmlsaXR5LiBUaGVzZSBpbnZlc3RtZW50cyBjb21lIHdpdGggY2xlYXIgZWNvbm9taWMgYmVuZWZpdHMgd2hpY2ggYWRkIHVwIHdpdGggdGltZS4NCiAgDQogIFVuYWJsZSB0byBtYWtlIHRoZSBzYW1lIGtpbmRzIG9mIGludmVzdG1lbnRzLCBjbGltYXRlIGNoYW5nZSB3aWxsIG9ubHkgYWRkIHRvIHRoZSBlY29ub21pYyBidXJkZW5zIGFscmVhZHkgYmVpbmcgZmVsdCBieSBydXJhbCBhcmVhcy4gRWZmb3J0cyBzaG91bGQgdGhlcmVmb3JlIGJlIG1hZGUgdG8gYXNzaXN0IHJ1cmFsIGNvbW11bml0aWVzIGluIGZ1bmRpbmcgYW5kIGltcGxlbWVudGluZyBzdXN0YWluYWJpbGl0eSBtZWFzdXJlcyBpbiBvcmRlciB0byBlbnN1cmUgdGhlaXIgbG9uZy10ZXJtIHN1cnZpdmFsLg0KICANCiMjIyBCaWJsaW9ncmFwaHkNCg0KMS4gQWx0aWVyaSwgTWlndWVsOyBOaWNob2xscywgQ2xhcmEuICJUaGUgQWRhcHRpb24gYW5kIE1pdGlnYXRpb24gUG90ZW50aWFsIG9mIFRyYWRpdGlvbmFsIEFncmljdWx0dXJlIGluIGEgQ2hhbmdpbmcgQ2xpbWF0ZSIuIENsaW1hdGUgQ2hhbmdlLiBTZXB0ZW1iZXIgMTMsIDIwMTMuIA0KDQoyLiAgQnVyZWF1IG9mIExhYm9yIFN0YXN0aXRpY3MuIFdlYi4gaHR0cHM6Ly93d3cuYmxzLmdvdi9yZWdpb25zL25ldy15b3JrLW5ldy1qZXJzZXkvbmV3cy1yZWxlYXNlLzIwMTgvY291bnR5ZW1wbG95bWVudGFuZHdhZ2VzX25ld3lvcmtfMjAxODAxMTEuaHRtDQoNCjMuIEtpdGUtUG93ZWxsLCBKZW5uaWZlci4gIlNlZSBIb3cgVGhlc2UgVXJiYW4gQ2l0aWVzIEFyZSBJbnZlc3RpbmcgSW4gU21hcnQgQW5kIEdyZWVuIEluZnJhc3RydWN0dXJlIi4gRm9yYmVzLiBGZWJydWFyeSAyOCwgMjAxOC4gV2ViLiBodHRwczovL3d3dy5mb3JiZXMuY29tL3NpdGVzL2plbm5pZmVyaGlja3MvMjAxOC8wMi8yOC9zZWUtaG93LXRoZXNlLXVyYmFuLWNpdGllcy1hcmUtaW52ZXN0aW5nLWluLXNtYXJ0LWFuZC1ncmVlbi1pbmZyYXN0cnVjdHVyZS8NCg0KNC4gTmV3IFlvcmsgRGVwYXJ0bWVudCBvZiBIZWFsdGguICJUYWJsZSAxOiBQb3B1bGF0aW9uLiBMYW5kIEFyZWEsIGFuZCBQb3B1bGF0aW9uIERlbnNpdHkgYnkgQ291bnR5LCBOZXcgWW9yayAtIDIwMTAiLiBOb3ZlbWJlciAxMSwgMjAxMS4gV2ViLg0KaHR0cHM6Ly93d3cuaGVhbHRoLm55Lmdvdi9zdGF0aXN0aWNzL3ZpdGFsX3N0YXRpc3RpY3MvMjAxMC90YWJsZTAyLmh0bQ0KDQo1LiBOZXcgWW9yayBEZXBhcnRtZW50IG9mIExhYm9yLiAiTllTIFVuZW1wbG95bWVudCBSYXRlIGJ5IENvdW50eSIuIFdlYi4gaHR0cHM6Ly93d3cubGFib3IubnkuZ292L3N0YXRzL1ByZXNzUmVsZWFzZXMvY291bnR5X3JhdGVzLnBkZg0KDQo2LiBQYXR0ZXJzb24sIEJyaXR0YW55LiAiQ2l0aWVzIGFuZCBUb3ducyBDaG9vc2UgUmVuZXdhYmxlcyB0byBTYXZlIE1vbmV5Ii4gIFdlYi4gIFNjaWVudGlmaWMgQW1lcmljYS4gTWFyY2ggMjYsIDIwMTUuICBXZWIuDQpodHRwczovL3d3dy5zY2llbnRpZmljYW1lcmljYW4uY29tL2FydGljbGUvY2l0aWVzLWFuZC10b3ducy1jaG9vc2UtcmVuZXdhYmxlcy10by1zYXZlLW1vbmV5Lw0KDQo3LiBTYWZpLCBBaG1hZCBTYWxlaDsgU21pdGgsIFdpbGxhbSBKYW1lcyBKci47IEx1aSwgWmhub25nd2VpLiAiUnVyYWwgTmV2YWRhIGFuZCBDbGltYXRlIENoYW5nZTogVnVsbmVyYWJpbGl0eSwgQmVsaWVmLCBhbmQgUmlzayBBc3Nlc3NtZW50Ii4gUmlzayBBbmFseXNpcy4gVm9sLiAzMiwgTm8uIDYuIDIwMTIuIA0KDQo4LiBVTi4gIldvcmxkIFVyYmFuaXphdGlvbiBQcm9zcGVjdDsgdGhlIDIwMTQgUmV2aXNpb24iLiAyMDE1DQoNCjkuIFVuaXRlZCBTdGF0ZXMgRGVwYXJ0bWVudCBvZiBBZ3JpY3VsdHVyZS4gQ291bnR5IExldmVsIERhdGEgU2V0cyAtIEVkdWNhdGlvbi4gV2ViLg0KaHR0cHM6Ly9kYXRhLmVycy51c2RhLmdvdi9yZXBvcnRzLmFzcHg/SUQ9MTc4MjkNCg==