Summary

  1. 3 Models were used: xgboost, logistic regression and k-nearest neighbors (knn).

  2. The xgboost model had the best performance with a roc auc of 0.8918.

  3. The most important variable in predicting whether a household is living in poverty is the price of the rent in the neighborhood where the families reside.

  4. Work-related variables are crucial. Specifically, the number of gainfully and not gainfully employed people in the household.

  5. Certain characteristics of the head of the household such as: age, years of schooling, whether they work in the formal or informal sector and medical condition in the last 12 months are a significant factor.

  6. The tenure status of the home is important, especially, if the family owns, rents or occupies the house illegally.

  7. The composition of the household is fundamental: the number of people living in the house and the presence of people over 60 or underaged.

Intro

It is often difficult to know the real income of people when surveys are conducted, even more so when there are complex circumstances such as the health crisis experienced in 2020. Without good income data it is very difficult to know what the real poverty level is in a community. This is why I made use of the CASEN 2020 survey. The National Socioeconomic Characterization Survey, CASEN, is carried out by the Ministry of Social Development of Chile. One of its objectives is to have information that makes it possible to periodically know the situation of households and the population, especially those living in poverty and the groups defined as priorities by social policy. It is important to mention that the poverty line varies depending on the number of people that make up a household. If the monthly income of a family is below this value, it is considered poor. Here is a table with the values of the poverty line according to the number of household members.

Number Of People by Household Poverty Line (US Dollars)
1 218
2 355
3 475
4 578
5 675
6 767
7 855
8 939
9 1020
10 1097

My goal was to predict, through classification models, whether a family suffers from poverty without looking at income data. With this goal in mind, I deleted from the database all the questions related to income and I tried, with the rest of the variables (health, housing, work, education, etc.), to predict through various methods (xgboost, logistic regression, knn) when a family is poor. The objective was to try and establish the most important variables to consider when predicting the level of poverty of a household without having their income data.

Description of the data

The CASEN survey has 7 topics. The first one is called “resident registration” and it records the demographic information of people, such as: gender, age, marital status, etc. The second one is about education, it includes indicators such as the level of education of the population and the proportion of people that are not a part of the educational system. A third topicis related to work and it consists of questions that allow estimating indicators on the occupational situation of the population (unemployment and employment rates) and characterizing the employment situation of the employed labor force: economic sector in which they work, what type of employment contract they have, type of occupation, etc.

The fourth one is about income, it includes questions that allow to collect information about the different streams of income that individuals and households receive. The fifth one deals with health, it consists of a set of questions such as the coverage of the health care systems; effective access to health care and the health status of the respondents. The sixth one is about identities, it includes questions about belonging to any indigenous group and international migration. In addition, it incorporates a set of questions to measure food insecurity, according to the international scale recommended by the Food and Agriculture Organization.

The last topic has to do with housing, it is composed of questions that allow estimating indicators on some of the basic characteristics of homes in the country as well as the habitability conditions, such as: sanitation of the house, freeloading and overcrowdedness. The complete list of variables can be reviewed here

Treatment of variables

In the first place, all the income variables and those categorical variables that had more than 30 levels were eliminated. Then, only the observations that belonged to heads of households were kept (to have one variable per household and because the database, being so large, caused the data to take a long time to train). For categorical variables with NA’s, an unknown category was created. In addition, all categorical variables were transformed into dummies variables. The NA’s observations of the numerical variables were imputed using the median. Furthermore, these variables were logarithm transformed and then normalized.

Exploratory Analysis

The first thing I did was to analyze demographic variables of the heads of households in order to detect any relationship with poverty. If one looks at the plot, it is clear that there are certain groups in which it seems that poverty is more recurrent. Families where the head of the household is young, immigrant, indigenous or female tend to be poorer than their counterparts. Furthermore, households in rural sectors have a higher proportion of poverty than those in urban sectors. It is striking that more than 20% of the households in which the head of the household is an immigrant are in a state of poverty. The data was collected during the pandemic and it must be borne in mind that much of the aid that the goverment gave to families to alleviate the burden of the pandemic was not received by immigrants, therefore, it is not possible to know if under normal conditions this group is also the one with the highest proportion of poor households.

It seems that the younger the head of the household, the greater the probability the people in the household is living below the poverty line. It is a bit difficult to find a clear reason, it may be that the pandemic affected the employment of young people the most. In our database there are very few numerical variables, we will explore some of them below.

It is possible to note significant differences in 3 out of the 4 variables of the graph. It seems that the age (as we noticed previously) and the years of schooling of the household head together with the number of people working in a household, have an effect on poverty. The same cannot be said for the number of people living in a household.

Let’s now look at other variables that might be interesting.

Looking at poverty by the type of household tenure, it is evident that people who are renting and those who occupy a home illegally tend to have a higher proportion of poor people. In the case of those who rent, a portion of their income is used to pay the rent and, therefore, cannot be spent on basic necessities. In the case of people who illegally occupy a property the situation is the same, they are probably even in a more dire economic situation than the people who rent.

Another important variable is medical treatment, in particular when the head of the household responds that they do not know or do not remember whether they received medical treatment during the last 12 months. It is likely that people who suffer from some type of disease with a high social stigma prefer to give this type of response. The other alternative is that responding that they do not know or do not remember is, in itself, a sign of some health condition that somehow affects a person’s ability to earn an income.

Another interesting variable is the rent price paid in the neighborhoods the families reside in. This value is obtained by asking people directly: how much do you pay for rent in this sector? Here is a graph of the distributions OF poor and non-poor people. It is clear that non-poor people live in neighborhoods where rent is more expensive than neighborhoods where poor families live.

Results

I tested different models: xgboost, logistic regression, and k-nearest neighbors (knn). The one with the best performance was the xgboost model with a roc auc of 0.8918. This model was validated with a k-fold cross validation process, with k = 5. I used 1000 trees as default. The hyperparameters that gave me the best results were the following:

mtry min_n tree_depth learn_rate loss_reduction sample_size
67 14 6 0.0140818 1.906337e-10 0.6928669

These are the most important variables of the model

In general terms, there is a group of variables related to the type of residency of the families: the house is owned, rented or illegaly occupied. In this group are the variables V13 and ten_viv. A second group is related to the labor aspect of the home, examples of this are the variables n_ocupados (number of employed people) and n_inactivos (number of not gainfully employed people). Another variable related to the workplace is ocup_inf, which specifies whether the head of the household is working legally or illegally.

A third group is linked to characteristics of the head of the household, here we have the years of schooling, represented by esc2 and esc, age, edad and if the head of household received medical treatment in the last 12 months s28. A fourth group of variables is linked to the composition of the household: the presence of minors men18c, of people over 60 years old may60c and the number of people living in the household: numviv, tot_per, numper and p6. Finally, without being clearly related to the previous groups, it seems that the most important variable is v19, which corresponds to the value that people report when they are asked: How much is the rent in this neighborhood?

Final Thoughts

First of all, it is important to understand that this data was collected during the pandemic, therefore, our conclusions may not be valid under “normal” conditions. Having clarified this, I think it should be noted that we find it surprising that contrary to what we initially believed, many of the demographic variables, such as race or gender, were not as important as we thought.

It is possible to think that public policy can play an important role in reducing poverty. Elements such as health, education and housing have a strong predictive power on poverty. If public policies that facilitate access to these 3 elements are strengthened, I believe that there is a possibility to further reducing poverty.

This project was extremely complex to carry out, in large part due to the large size of the database, it took a long time to tune the hyperparameters of the models, which made the workflow very hard. Therefore, I think there is a lot of room to improve the models if one has access to servers that allow us to speed up the process. Finally, I would like to point out again that one has to be very careful about making generalizations with the results of this project, since the data was collected in the midst of such an unusual situation as the 2020 health crisis.

LS0tDQp0aXRsZTogIlByZWRpY3RpbmcgUG92ZXJ0eSB3aXRoIE1hY2hpbmUgTGVhcm5pbmciDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICB0b2M6IHllcw0KLS0tDQo8c3R5bGU+DQoNCmJvZHl7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCn0NCg0KPC9zdHlsZT4NCg0KDQoNCg0KIyMjIFN1bW1hcnkNCg0KMSkgMyBNb2RlbHMgd2VyZSB1c2VkOiB4Z2Jvb3N0LCBsb2dpc3RpYyByZWdyZXNzaW9uIGFuZCBrLW5lYXJlc3QgbmVpZ2hib3JzICgqa25uKikuIA0KDQoyKSBUaGUgeGdib29zdCBtb2RlbCBoYWQgdGhlIGJlc3QgcGVyZm9ybWFuY2Ugd2l0aCBhICoqcm9jIGF1YyoqIG9mIDAuODkxOC4NCg0KMykgVGhlIG1vc3QgaW1wb3J0YW50IHZhcmlhYmxlIGluIHByZWRpY3Rpbmcgd2hldGhlciBhIGhvdXNlaG9sZCBpcyBsaXZpbmcgaW4gcG92ZXJ0eSBpcyB0aGUgcHJpY2Ugb2YgdGhlIHJlbnQgaW4gdGhlIG5laWdoYm9yaG9vZCB3aGVyZSB0aGUgZmFtaWxpZXMgcmVzaWRlLg0KDQo0KSBXb3JrLXJlbGF0ZWQgdmFyaWFibGVzIGFyZSBjcnVjaWFsLiBTcGVjaWZpY2FsbHksIHRoZSBudW1iZXIgb2YgZ2FpbmZ1bGx5IGFuZCBub3QgZ2FpbmZ1bGx5IGVtcGxveWVkICBwZW9wbGUgaW4gdGhlIGhvdXNlaG9sZC4NCg0KNSkgQ2VydGFpbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGhlYWQgb2YgdGhlIGhvdXNlaG9sZCBzdWNoIGFzOiBhZ2UsIHllYXJzIG9mIHNjaG9vbGluZywgd2hldGhlciB0aGV5IHdvcmsgaW4gdGhlIGZvcm1hbCBvciBpbmZvcm1hbCBzZWN0b3IgYW5kIG1lZGljYWwgY29uZGl0aW9uIGluIHRoZSBsYXN0IDEyIG1vbnRocyBhcmUgYSBzaWduaWZpY2FudCBmYWN0b3IuDQoNCjYpIFRoZSB0ZW51cmUgc3RhdHVzIG9mIHRoZSBob21lIGlzIGltcG9ydGFudCwgZXNwZWNpYWxseSwgaWYgdGhlIGZhbWlseSBvd25zLCByZW50cyBvciBvY2N1cGllcyB0aGUgaG91c2UgaWxsZWdhbGx5Lg0KDQo3KSBUaGUgY29tcG9zaXRpb24gb2YgdGhlIGhvdXNlaG9sZCBpcyBmdW5kYW1lbnRhbDogdGhlIG51bWJlciBvZiBwZW9wbGUgbGl2aW5nIGluIHRoZSBob3VzZSBhbmQgdGhlIHByZXNlbmNlIG9mIHBlb3BsZSBvdmVyIDYwIG9yIHVuZGVyYWdlZC4NCg0KDQojIyMgSW50cm8NCg0KIVtdKGh0dHA6Ly9vYnNlcnZhdG9yaW8ubWluaXN0ZXJpb2Rlc2Fycm9sbG9zb2NpYWwuZ29iLmNsL2ltYWdlcy9jYXNlbl8yMDIwLnN2ZykNCg0KDQpJdCBpcyBvZnRlbiBkaWZmaWN1bHQgdG8ga25vdyB0aGUgcmVhbCBpbmNvbWUgb2YgcGVvcGxlIHdoZW4gc3VydmV5cyBhcmUgY29uZHVjdGVkLCBldmVuIG1vcmUgc28gd2hlbiB0aGVyZSBhcmUgY29tcGxleCBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgdGhlIGhlYWx0aCBjcmlzaXMgZXhwZXJpZW5jZWQgaW4gMjAyMC4gV2l0aG91dCBnb29kIGluY29tZSBkYXRhIGl0IGlzIHZlcnkgZGlmZmljdWx0IHRvIGtub3cgd2hhdCB0aGUgcmVhbCBwb3ZlcnR5IGxldmVsIGlzIGluIGEgY29tbXVuaXR5LiBUaGlzIGlzIHdoeSBJIG1hZGUgdXNlIG9mIHRoZSBDQVNFTiAyMDIwIHN1cnZleS4gVGhlIE5hdGlvbmFsIFNvY2lvZWNvbm9taWMgQ2hhcmFjdGVyaXphdGlvbiBTdXJ2ZXksIENBU0VOLCBpcyBjYXJyaWVkIG91dCBieSB0aGUgTWluaXN0cnkgb2YgU29jaWFsIERldmVsb3BtZW50IG9mIENoaWxlLiBPbmUgb2YgaXRzIG9iamVjdGl2ZXMgaXMgdG8gaGF2ZSBpbmZvcm1hdGlvbiB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHBlcmlvZGljYWxseSBrbm93IHRoZSBzaXR1YXRpb24gb2YgaG91c2Vob2xkcyBhbmQgdGhlIHBvcHVsYXRpb24sIGVzcGVjaWFsbHkgdGhvc2UgbGl2aW5nIGluIHBvdmVydHkgYW5kIHRoZSBncm91cHMgZGVmaW5lZCBhcyBwcmlvcml0aWVzIGJ5IHNvY2lhbCBwb2xpY3kuIEl0IGlzIGltcG9ydGFudCB0byBtZW50aW9uIHRoYXQgdGhlIHBvdmVydHkgbGluZSB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcGVvcGxlIHRoYXQgbWFrZSB1cCBhIGhvdXNlaG9sZC4gSWYgdGhlIG1vbnRobHkgaW5jb21lIG9mIGEgZmFtaWx5IGlzIGJlbG93IHRoaXMgdmFsdWUsIGl0IGlzIGNvbnNpZGVyZWQgcG9vci4gSGVyZSBpcyBhIHRhYmxlIHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgcG92ZXJ0eSBsaW5lIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGhvdXNlaG9sZCBtZW1iZXJzLg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KDQp4PC10aWJibGUoDQogICJOdW1iZXIgT2YgUGVvcGxlIGJ5IEhvdXNlaG9sZCIgPSAxOjEwLCANCiAgIlBvdmVydHkgTGluZSAoVVMgRG9sbGFycykiID0gYygyMTgsMzU1LDQ3NSw1NzgsNjc1LDc2Nyw4NTUsOTM5LDEwMjAsMTA5NykNCikNCg0KeCAlPiUga2JsKGFsaWduPSJjYyIpICU+JQ0KICBrYWJsZV9wYXBlcigiaG92ZXIiLCBmdWxsX3dpZHRoID0gRikNCg0KYGBgDQoNCk15IGdvYWwgd2FzIHRvIHByZWRpY3QsIHRocm91Z2ggY2xhc3NpZmljYXRpb24gbW9kZWxzLCB3aGV0aGVyIGEgZmFtaWx5IHN1ZmZlcnMgZnJvbSBwb3ZlcnR5IHdpdGhvdXQgbG9va2luZyBhdCBpbmNvbWUgZGF0YS4gV2l0aCB0aGlzIGdvYWwgaW4gbWluZCwgSSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlIGFsbCB0aGUgcXVlc3Rpb25zIHJlbGF0ZWQgdG8gaW5jb21lIGFuZCBJIHRyaWVkLCB3aXRoIHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMgKGhlYWx0aCwgaG91c2luZywgd29yaywgZWR1Y2F0aW9uLCBldGMuKSwgdG8gcHJlZGljdCB0aHJvdWdoIHZhcmlvdXMgbWV0aG9kcyAoeGdib29zdCwgbG9naXN0aWMgcmVncmVzc2lvbiwga25uKSB3aGVuIGEgZmFtaWx5IGlzIHBvb3IuIFRoZSBvYmplY3RpdmUgd2FzIHRvIHRyeSBhbmQgZXN0YWJsaXNoIHRoZSBtb3N0IGltcG9ydGFudCB2YXJpYWJsZXMgdG8gY29uc2lkZXIgd2hlbiBwcmVkaWN0aW5nIHRoZSBsZXZlbCBvZiBwb3ZlcnR5IG9mIGEgaG91c2Vob2xkIHdpdGhvdXQgaGF2aW5nIHRoZWlyIGluY29tZSBkYXRhLg0KDQojIyMgRGVzY3JpcHRpb24gb2YgdGhlIGRhdGENCg0KVGhlIENBU0VOIHN1cnZleSBoYXMgNyB0b3BpY3MuIFRoZSBmaXJzdCBvbmUgaXMgY2FsbGVkICJyZXNpZGVudCByZWdpc3RyYXRpb24iIGFuZCBpdCByZWNvcmRzIHRoZSBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbiBvZiBwZW9wbGUsIHN1Y2ggYXM6IGdlbmRlciwgYWdlLCBtYXJpdGFsIHN0YXR1cywgZXRjLiBUaGUgc2Vjb25kIG9uZSBpcyBhYm91dCBlZHVjYXRpb24sIGl0IGluY2x1ZGVzIGluZGljYXRvcnMgc3VjaCBhcyB0aGUgbGV2ZWwgb2YgZWR1Y2F0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIGFuZCB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgdGhhdCBhcmUgbm90IGEgcGFydCBvZiB0aGUgZWR1Y2F0aW9uYWwgc3lzdGVtLiBBIHRoaXJkIHRvcGljaXMgcmVsYXRlZCB0byB3b3JrIGFuZCBpdCBjb25zaXN0cyBvZiBxdWVzdGlvbnMgdGhhdCBhbGxvdyBlc3RpbWF0aW5nIGluZGljYXRvcnMgb24gdGhlIG9jY3VwYXRpb25hbCBzaXR1YXRpb24gb2YgdGhlIHBvcHVsYXRpb24gKHVuZW1wbG95bWVudCBhbmQgZW1wbG95bWVudCByYXRlcykgYW5kIGNoYXJhY3Rlcml6aW5nIHRoZSBlbXBsb3ltZW50IHNpdHVhdGlvbiBvZiB0aGUgZW1wbG95ZWQgbGFib3IgZm9yY2U6IGVjb25vbWljIHNlY3RvciBpbiB3aGljaCB0aGV5IHdvcmssIHdoYXQgdHlwZSBvZiBlbXBsb3ltZW50IGNvbnRyYWN0IHRoZXkgaGF2ZSwgdHlwZSBvZiBvY2N1cGF0aW9uLCBldGMuDQoNCg0KVGhlIGZvdXJ0aCBvbmUgaXMgYWJvdXQgaW5jb21lLCBpdCBpbmNsdWRlcyBxdWVzdGlvbnMgdGhhdCBhbGxvdyB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWZmZXJlbnQgc3RyZWFtcyBvZiBpbmNvbWUgdGhhdCBpbmRpdmlkdWFscyBhbmQgaG91c2Vob2xkcyByZWNlaXZlLiBUaGUgZmlmdGggb25lIGRlYWxzIHdpdGggaGVhbHRoLCBpdCBjb25zaXN0cyBvZiBhIHNldCBvZiBxdWVzdGlvbnMgc3VjaCBhcyB0aGUgY292ZXJhZ2Ugb2YgdGhlIGhlYWx0aCBjYXJlIHN5c3RlbXM7IGVmZmVjdGl2ZSBhY2Nlc3MgdG8gaGVhbHRoIGNhcmUgYW5kIHRoZSBoZWFsdGggc3RhdHVzIG9mIHRoZSByZXNwb25kZW50cy4gVGhlIHNpeHRoIG9uZSBpcyBhYm91dCAqaWRlbnRpdGllcyosIGl0IGluY2x1ZGVzIHF1ZXN0aW9ucyBhYm91dCBiZWxvbmdpbmcgdG8gYW55IGluZGlnZW5vdXMgZ3JvdXAgYW5kIGludGVybmF0aW9uYWwgbWlncmF0aW9uLiBJbiBhZGRpdGlvbiwgaXQgaW5jb3Jwb3JhdGVzIGEgc2V0IG9mIHF1ZXN0aW9ucyB0byBtZWFzdXJlIGZvb2QgaW5zZWN1cml0eSwgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hdGlvbmFsIHNjYWxlIHJlY29tbWVuZGVkIGJ5IHRoZSBGb29kIGFuZCBBZ3JpY3VsdHVyZSBPcmdhbml6YXRpb24uDQoNCg0KVGhlIGxhc3QgdG9waWMgaGFzIHRvIGRvIHdpdGggaG91c2luZywgaXQgaXMgY29tcG9zZWQgb2YgcXVlc3Rpb25zIHRoYXQgYWxsb3cgZXN0aW1hdGluZyBpbmRpY2F0b3JzIG9uIHNvbWUgb2YgdGhlIGJhc2ljIGNoYXJhY3RlcmlzdGljcyBvZiBob21lcyBpbiB0aGUgY291bnRyeSBhcyB3ZWxsIGFzIHRoZSBoYWJpdGFiaWxpdHkgY29uZGl0aW9ucywgc3VjaCBhczogc2FuaXRhdGlvbiBvZiB0aGUgaG91c2UsIGZyZWVsb2FkaW5nIGFuZCBvdmVyY3Jvd2RlZG5lc3MuIFRoZSBjb21wbGV0ZSBsaXN0IG9mIHZhcmlhYmxlcyBjYW4gYmUgcmV2aWV3ZWQgW2hlcmVdKGh0dHA6Ly9vYnNlcnZhdG9yaW8ubWluaXN0ZXJpb2Rlc2Fycm9sbG9zb2NpYWwuZ29iLmNsL3N0b3JhZ2UvZG9jcy9jYXNlbi8yMDIwL0xpYnJvX2RlX2NvZGlnb3NfQmFzZV9kZV9EYXRvc19DYXNlbl9lbl9QYW5kZW1pYV8yMDIwLnBkZikNCg0KDQoNCiMjIyBUcmVhdG1lbnQgb2YgdmFyaWFibGVzDQoNCkluIHRoZSBmaXJzdCBwbGFjZSwgYWxsIHRoZSBpbmNvbWUgdmFyaWFibGVzIGFuZCB0aG9zZSBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdGhhdCBoYWQgbW9yZSB0aGFuIDMwIGxldmVscyB3ZXJlIGVsaW1pbmF0ZWQuIFRoZW4sIG9ubHkgdGhlIG9ic2VydmF0aW9ucyB0aGF0IGJlbG9uZ2VkIHRvIGhlYWRzIG9mIGhvdXNlaG9sZHMgd2VyZSBrZXB0ICh0byBoYXZlIG9uZSB2YXJpYWJsZSBwZXIgaG91c2Vob2xkIGFuZCBiZWNhdXNlIHRoZSBkYXRhYmFzZSwgYmVpbmcgc28gbGFyZ2UsIGNhdXNlZCB0aGUgZGF0YSB0byB0YWtlIGEgbG9uZyB0aW1lIHRvIHRyYWluKS4gRm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyB3aXRoIE5BJ3MsIGFuICp1bmtub3duKiBjYXRlZ29yeSB3YXMgY3JlYXRlZC4gSW4gYWRkaXRpb24sIGFsbCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgd2VyZSB0cmFuc2Zvcm1lZCBpbnRvICpkdW1taWVzKiB2YXJpYWJsZXMuIFRoZSBOQSdzIG9ic2VydmF0aW9ucyBvZiB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlcyB3ZXJlIGltcHV0ZWQgdXNpbmcgdGhlIG1lZGlhbi4gRnVydGhlcm1vcmUsIHRoZXNlIHZhcmlhYmxlcyB3ZXJlIGxvZ2FyaXRobSB0cmFuc2Zvcm1lZCBhbmQgdGhlbiBub3JtYWxpemVkLg0KDQojIyMgRXhwbG9yYXRvcnkgQW5hbHlzaXMNCg0KDQpgYGB7cixlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCnNleG88LXRyYWluICU+JQ0KICBtdXRhdGUocG9icmV6YSA9IHBvYnJlemEgPT0gIjEiKSAlPiUNCiAgZ3JvdXBfYnkoc2V4bykgJT4lIA0KICAgIHN1bW1hcmlzZShwb2JyZXphID0gbWVhbihwb2JyZXphKSkgJT4lIA0KICByZW5hbWUoVmFyaWFibGUgPSBzZXhvKSAlPiUgDQogIG11dGF0ZShWYXJpYWJsZT0gY2FzZV93aGVuKCBWYXJpYWJsZSA9PSAiSG9tYnJlIiB+ICJNYW4iLA0KICBWYXJpYWJsZSA9PSAiTXVqZXIiIH4gIldvbWFuIikpDQoNCmVkYWQ8LXRyYWluJT4lIG11dGF0ZShlZGFkPWN1dChlZGFkLCBicmVha3M9YygxOCwgMzAsIDQ1LDYwLCBJbmYpLCBsYWJlbHM9YygiQWdlIDE4LTI5IiwgIkFnZSAzMC00NCIsIkFnZSA0NS01OSIsIkFnZSArNjAiKSkpJT4lDQogIG11dGF0ZShwb2JyZXphID0gcG9icmV6YSA9PSAiMSIpICU+JQ0KICBncm91cF9ieShlZGFkKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGVkYWQpDQoNCmV0bmlhPC10cmFpbiAlPiUNCiAgbXV0YXRlKHBvYnJlemEgPSBwb2JyZXphID09ICIxIikgJT4lDQogIGdyb3VwX2J5KGV0bmlhKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGV0bmlhKSU+JSANCiAgbXV0YXRlKFZhcmlhYmxlPSBjYXNlX3doZW4oIFZhcmlhYmxlID09ICJObyBwZXJ0ZW5lY2UgYSBuaW5ndW5vIHB1ZWJsbyBpbmTDrWdlbmEiIH4gIk5vbi1OYXRpdmUgQW1lcmljYW4iLA0KICBWYXJpYWJsZSA9PSAiUGVydGVuZWNlIGEgcHVlYmxvcyBpbmTDrWdlbmFzIiB+ICJOYXRpdmUgQW1lcmljYW4iKSkNCg0KDQp6b25hPC10cmFpbiAlPiUNCiAgbXV0YXRlKHBvYnJlemEgPSBwb2JyZXphID09ICIxIikgJT4lDQogIGdyb3VwX2J5KHpvbmEpICU+JSANCiAgICBzdW1tYXJpc2UocG9icmV6YSA9IG1lYW4ocG9icmV6YSkpICU+JSANCiAgcmVuYW1lKFZhcmlhYmxlID0gem9uYSklPiUgDQogIG11dGF0ZShWYXJpYWJsZT0gY2FzZV93aGVuKCBWYXJpYWJsZSA9PSAiUnVyYWwiIH4gIlJ1cmFsIiwNCiAgVmFyaWFibGUgPT0gIlVyYmFubyIgfiAiVXJiYW4iKSkNCg0KaW5taWdyYW50ZTwtdHJhaW4gJT4lDQogIG11dGF0ZShwb2JyZXphID0gcG9icmV6YSA9PSAiMSIpICU+JQ0KICBncm91cF9ieShpbm1pZ3JhbnRlKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGlubWlncmFudGUpJT4lIA0KICBtdXRhdGUoVmFyaWFibGU9IGNhc2Vfd2hlbiggVmFyaWFibGUgPT0gIk5vIGlubWlncmFudGUiIH4gIk5vbi1Jbm1pZ3JhbnQiLA0KICBWYXJpYWJsZSA9PSAiSW5taWdyYW50ZSIgfiAiSW5taWdyYW50IikpDQoNCg0KanVudGFzPC1yYmluZChzZXhvLGVkYWQsZXRuaWEsem9uYSxpbm1pZ3JhbnRlKQ0KDQoNCg0KDQoNCiNzdSByYmluZA0KDQpgYGANCg0KYGBge3IsZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpqdW50YXNbLWMoNywgMTQpLCBdICU+JQ0KICBtdXRhdGUoVmFyaWFibGUgPSBmY3RfcmVvcmRlcihWYXJpYWJsZSwgcG9icmV6YSkpICU+JSANCmdncGxvdCggYWVzKHBvYnJlemEsIGZjdF9yZW9yZGVyKFZhcmlhYmxlLHBvYnJlemEpKSkgKw0KICAgICAgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB5ID0gVmFyaWFibGUsIHhlbmQgPSBwb2JyZXphLCB5ZW5kID0gVmFyaWFibGUpLCBjb2xvciA9ICJncmV5NTAiKSArDQogICAgICAgIGdlb21fcG9pbnQoKSArZ2d0aXRsZSgiUG92ZXJ0eSBSYXRlIGJ5IEhlYWQgb2YgSG91c2Vob2xkIERlbW9ncmFwaGljIENoYXJhY3RlcmlzdGljcyIpKw0KICBsYWJzKHggPSAiUHJvcG9ydGlvbiBvZiBQb29yIEhvdXNlaG9sZHMiLHk9TlVMTCkrIHRoZW1lX2xpZ2h0KCkNCg0KYGBgDQoNCg0KVGhlIGZpcnN0IHRoaW5nIEkgZGlkIHdhcyB0byBhbmFseXplIGRlbW9ncmFwaGljIHZhcmlhYmxlcyBvZiB0aGUgaGVhZHMgb2YgaG91c2Vob2xkcyBpbiBvcmRlciB0byBkZXRlY3QgYW55IHJlbGF0aW9uc2hpcCB3aXRoIHBvdmVydHkuIElmIG9uZSBsb29rcyBhdCB0aGUgcGxvdCwgaXQgaXMgY2xlYXIgdGhhdCB0aGVyZSBhcmUgY2VydGFpbiBncm91cHMgaW4gd2hpY2ggaXQgc2VlbXMgdGhhdCBwb3ZlcnR5IGlzIG1vcmUgcmVjdXJyZW50LiBGYW1pbGllcyB3aGVyZSB0aGUgaGVhZCBvZiB0aGUgaG91c2Vob2xkIGlzIHlvdW5nLCBpbW1pZ3JhbnQsIGluZGlnZW5vdXMgb3IgZmVtYWxlIHRlbmQgdG8gYmUgcG9vcmVyIHRoYW4gdGhlaXIgY291bnRlcnBhcnRzLiBGdXJ0aGVybW9yZSwgaG91c2Vob2xkcyBpbiBydXJhbCBzZWN0b3JzIGhhdmUgYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBwb3ZlcnR5IHRoYW4gdGhvc2UgaW4gdXJiYW4gc2VjdG9ycy4gSXQgaXMgc3RyaWtpbmcgdGhhdCBtb3JlIHRoYW4gMjAlIG9mIHRoZSBob3VzZWhvbGRzIGluIHdoaWNoIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQgaXMgYW4gaW1taWdyYW50IGFyZSBpbiBhIHN0YXRlIG9mIHBvdmVydHkuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBwYW5kZW1pYyBhbmQgaXQgbXVzdCBiZSBib3JuZSBpbiBtaW5kIHRoYXQgbXVjaCBvZiB0aGUgYWlkIHRoYXQgdGhlIGdvdmVybWVudCBnYXZlIHRvIGZhbWlsaWVzIHRvIGFsbGV2aWF0ZSB0aGUgYnVyZGVuIG9mIHRoZSBwYW5kZW1pYyB3YXMgbm90IHJlY2VpdmVkIGJ5IGltbWlncmFudHMsIHRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGtub3cgaWYgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMgdGhpcyBncm91cCBpcyBhbHNvIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIHBvb3IgaG91c2Vob2xkcy4NCg0KDQpJdCBzZWVtcyB0aGF0IHRoZSB5b3VuZ2VyIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQsIHRoZSBncmVhdGVyIHRoZSBwcm9iYWJpbGl0eSB0aGUgcGVvcGxlIGluIHRoZSBob3VzZWhvbGQgaXMgbGl2aW5nIGJlbG93IHRoZSBwb3ZlcnR5IGxpbmUuIEl0IGlzIGEgYml0IGRpZmZpY3VsdCB0byBmaW5kIGEgY2xlYXIgcmVhc29uLCBpdCBtYXkgYmUgdGhhdCB0aGUgcGFuZGVtaWMgYWZmZWN0ZWQgdGhlIGVtcGxveW1lbnQgb2YgeW91bmcgcGVvcGxlIHRoZSBtb3N0LiBJbiBvdXIgZGF0YWJhc2UgdGhlcmUgYXJlIHZlcnkgZmV3IG51bWVyaWNhbCB2YXJpYWJsZXMsIHdlIHdpbGwgZXhwbG9yZSBzb21lIG9mIHRoZW0gYmVsb3cuDQoNCg0KDQpgYGB7cixlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQp0cmFpbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKGMoZWRhZCxlc2Msbl9vY3VwYWRvcyxudW1wZXIpLCBuYW1lc190byA9ICJzdGF0IiwgdmFsdWVzX3RvID0gInZhbHVlIiklPiUgDQogIG11dGF0ZShzdGF0PSBjYXNlX3doZW4oc3RhdCA9PSAiZWRhZCIgfiAiSGVhZCBvZiBIb3VzZSBBZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ID09ICJlc2MiIH4gIkhlYWQgb2YgSG91c2UgU2Nob29saW5nIFllYXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdCA9PSAibl9vY3VwYWRvcyIgfiAiTnVtYmVyIG9mIEVtcGxveWVkIFBlb3BsZSBieSBIb3VzZWhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ID09ICJudW1wZXIiIH4gIk51bWJlciBvZiBQZW9wbGUgYnkgSG91c2Vob2xkIiksDQogICAgICAgICBwb2JyZXphPWlmZWxzZShwb2JyZXphPT0iMSIsIlBvb3IiLCJOb3QgUG9vciIpKSAlPiUNCiAgZ2dwbG90KGFlcyhwb2JyZXphLCB2YWx1ZSwgZmlsbCA9IHBvYnJlemEsIGNvbG9yID0gcG9icmV6YSkpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC40KSArDQogIGZhY2V0X3dyYXAofnN0YXQsIHNjYWxlcyA9ICJmcmVlX3kiLCBucm93ID0gMikgKw0KICBsYWJzKHkgPSBOVUxMLHg9IlBvdmVydHkiLCBjb2xvciA9IE5VTEwsIGZpbGwgPSBOVUxMKSt0aGVtZV9saWdodCgpDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KSXQgaXMgcG9zc2libGUgdG8gbm90ZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiAzIG91dCBvZiB0aGUgNCB2YXJpYWJsZXMgb2YgdGhlIGdyYXBoLiBJdCBzZWVtcyB0aGF0IHRoZSBhZ2UgKGFzIHdlIG5vdGljZWQgcHJldmlvdXNseSkgYW5kIHRoZSB5ZWFycyBvZiBzY2hvb2xpbmcgb2YgdGhlIGhvdXNlaG9sZCBoZWFkIHRvZ2V0aGVyIHdpdGggdGhlIG51bWJlciBvZiBwZW9wbGUgd29ya2luZyBpbiBhIGhvdXNlaG9sZCwgaGF2ZSBhbiBlZmZlY3Qgb24gcG92ZXJ0eS4gVGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgZm9yIHRoZSBudW1iZXIgb2YgcGVvcGxlIGxpdmluZyBpbiBhIGhvdXNlaG9sZC4NCg0KTGV0J3Mgbm93IGxvb2sgYXQgb3RoZXIgdmFyaWFibGVzIHRoYXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcuDQoNCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjIsIHdhcm5pbmc9RkFMU0V9DQoNCnRyYWluICU+JSAgDQogIG11dGF0ZSh2MTM9IGNhc2Vfd2hlbih2MTMgPT0gIlByb3BpYSIgfiAiT3duZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2MTMgPT0gIkFycmVuZGFkYSIgfiAiUmVudGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHYxMyA9PSAiQ2VkaWRhIiB+ICIgR3JhbnRlZCBGcmVlIG9mIENoYXJnZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHYxMyA9PSAiVXN1ZnJ1Y3RvIChzw7NsbyB1c28geSBnb2NlKSIgfiAiT3RoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2MTMgPT0gIk9jdXBhY2nDs24gaXJyZWd1bGFyIChkZSBoZWNobykifCB2MTMgPT0gIlBvc2VlZG9yIGlycmVndWxhciIgIH4gIklsbGVnYWwgT2NjdXBhdGlvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICBwb2JyZXphPWlmZWxzZShwb2JyZXphPT0iMSIsIlBvb3IiLCJOb3QgUG9vciIpKSAlPiUgY291bnQocG9icmV6YSwgdjEzKSAlPiUgDQogIGdyb3VwX2J5KHYxMykgJT4lICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpICU+JSANCiAgcGxvdF9seSh4ID1+cHJvcCwgeSA9IH52MTMsIGNvbG9yID0gfnBvYnJlemEpICU+JSANCiAgYWRkX2JhcnMoKSAlPiUgDQogIGxheW91dChiYXJtb2RlID0gInN0YWNrIix0aXRsZSA9ICJQb3ZlcnR5IGJ5IFRlbnVyZSBTdGF0dXMgb2YgSG91c2Vob2xkcyIsDQogICAgICAgICB5YXhpcz1saXN0KHRpdGxlID0iIikpDQoNCmBgYA0KDQoNCkxvb2tpbmcgYXQgcG92ZXJ0eSBieSB0aGUgdHlwZSBvZiBob3VzZWhvbGQgdGVudXJlLCBpdCBpcyBldmlkZW50IHRoYXQgcGVvcGxlIHdobyBhcmUgcmVudGluZyBhbmQgdGhvc2Ugd2hvIG9jY3VweSBhIGhvbWUgaWxsZWdhbGx5IHRlbmQgdG8gaGF2ZSBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIHBvb3IgcGVvcGxlLiBJbiB0aGUgY2FzZSBvZiB0aG9zZSB3aG8gcmVudCwgYSBwb3J0aW9uIG9mIHRoZWlyIGluY29tZSBpcyB1c2VkIHRvIHBheSB0aGUgcmVudCBhbmQsIHRoZXJlZm9yZSwgY2Fubm90IGJlIHNwZW50IG9uIGJhc2ljIG5lY2Vzc2l0aWVzLiBJbiB0aGUgY2FzZSBvZiBwZW9wbGUgd2hvIGlsbGVnYWxseSBvY2N1cHkgYSBwcm9wZXJ0eSB0aGUgc2l0dWF0aW9uIGlzIHRoZSBzYW1lLCB0aGV5IGFyZSBwcm9iYWJseSBldmVuIGluIGEgbW9yZSBkaXJlIGVjb25vbWljIHNpdHVhdGlvbiB0aGFuIHRoZSBwZW9wbGUgd2hvIHJlbnQuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQ9NC4yfQ0KdHJhaW4gJT4lICANCiAgbXV0YXRlKHMyOD0gY2FzZV93aGVuKHMyOCA9PSAiTm8gaGEgZXN0YWRvIGVuIHRyYXRhbWllbnRvIHBvciBuaW5ndW5hIGNvbmRpY2nDs24gZGUgc2FsdWQgYW50ZXJpb3IiIH4gIk5vIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgczI4ID09ICJObyBzYWJlL05vIHJlY3VlcmRhIiB+ICJEb24ndCBLbm93L0Rvbid0IFJlbWVtYmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgczI4ICE9ICJObyBoYSBlc3RhZG8gZW4gdHJhdGFtaWVudG8gcG9yIG5pbmd1bmEgY29uZGljacOzbiBkZSBzYWx1ZCBhbnRlcmlvciIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgczI4ICE9ICJObyBzYWJlL05vIHJlY3VlcmRhIiB+ICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgcG9icmV6YT1pZmVsc2UocG9icmV6YT09IjEiLCJQb29yIiwiTm90IFBvb3IiKSklPiUgY291bnQocG9icmV6YSwgczI4KSAlPiUgDQogIGdyb3VwX2J5KHMyOCkgJT4lICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpICU+JSANCiAgcGxvdF9seSh4ID1+cHJvcCwgeSA9IH5zMjgsIGNvbG9yID0gfnBvYnJlemEpICU+JSANCiAgYWRkX2JhcnMoKSAlPiUgDQogIGxheW91dChiYXJtb2RlID0gInN0YWNrIix0aXRsZSA9ICJEdXJpbmcgdGhlIHBhc3QgMTIgbW9udGhzLCBoYXZlIHlvdSBiZWVuIGluIG1lZGljYWwgdHJlYXRtZW50PyIsDQogICAgICAgICB5YXhpcz1saXN0KHRpdGxlID0iIikpDQpgYGANCg0KQW5vdGhlciBpbXBvcnRhbnQgdmFyaWFibGUgaXMgbWVkaWNhbCB0cmVhdG1lbnQsIGluIHBhcnRpY3VsYXIgd2hlbiB0aGUgaGVhZCBvZiB0aGUgaG91c2Vob2xkIHJlc3BvbmRzIHRoYXQgdGhleSBkbyBub3Qga25vdyBvciBkbyBub3QgcmVtZW1iZXIgd2hldGhlciB0aGV5IHJlY2VpdmVkIG1lZGljYWwgdHJlYXRtZW50IGR1cmluZyB0aGUgbGFzdCAxMiBtb250aHMuIEl0IGlzIGxpa2VseSB0aGF0IHBlb3BsZSB3aG8gc3VmZmVyIGZyb20gc29tZSB0eXBlIG9mIGRpc2Vhc2Ugd2l0aCBhIGhpZ2ggc29jaWFsIHN0aWdtYSBwcmVmZXIgdG8gZ2l2ZSB0aGlzIHR5cGUgb2YgcmVzcG9uc2UuIFRoZSBvdGhlciBhbHRlcm5hdGl2ZSBpcyB0aGF0IHJlc3BvbmRpbmcgdGhhdCB0aGV5IGRvIG5vdCBrbm93IG9yIGRvIG5vdCByZW1lbWJlciBpcywgaW4gaXRzZWxmLCBhIHNpZ24gb2Ygc29tZSBoZWFsdGggY29uZGl0aW9uIHRoYXQgc29tZWhvdyBhZmZlY3RzIGEgcGVyc29uJ3MgYWJpbGl0eSB0byBlYXJuIGFuIGluY29tZS4NCg0KQW5vdGhlciBpbnRlcmVzdGluZyB2YXJpYWJsZSBpcyB0aGUgcmVudCBwcmljZSBwYWlkIGluIHRoZSBuZWlnaGJvcmhvb2RzIHRoZSBmYW1pbGllcyByZXNpZGUgaW4uIFRoaXMgdmFsdWUgaXMgb2J0YWluZWQgYnkgYXNraW5nIHBlb3BsZSBkaXJlY3RseTogaG93IG11Y2ggZG8geW91IHBheSBmb3IgcmVudCBpbiB0aGlzIHNlY3Rvcj8gSGVyZSBpcyBhIGdyYXBoIG9mIHRoZSBkaXN0cmlidXRpb25zIE9GIHBvb3IgYW5kIG5vbi1wb29yIHBlb3BsZS4gSXQgaXMgY2xlYXIgdGhhdCBub24tcG9vciBwZW9wbGUgbGl2ZSBpbiBuZWlnaGJvcmhvb2RzIHdoZXJlIHJlbnQgaXMgbW9yZSBleHBlbnNpdmUgdGhhbiBuZWlnaGJvcmhvb2RzIHdoZXJlIHBvb3IgZmFtaWxpZXMgbGl2ZS4NCg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQ9NC4yfQ0KZDEgPC0gZmlsdGVyKHRyYWluLCBwb2JyZXphID09ICIxIiZpcy5uYSh2MTkpPT1GQUxTRSkNCmQyIDwtIGZpbHRlcih0cmFpbiwgcG9icmV6YSA9PSAiMCImaXMubmEodjE5KT09RkFMU0UpDQoNCmRlbnNpdHkxIDwtIGRlbnNpdHkoZDEkdjE5KQ0KZGVuc2l0eTIgPC0gZGVuc2l0eShkMiR2MTkpDQoNCnBsb3RfbHkob3BhY2l0eSA9IDAuOCkgJT4lICBhZGRfbGluZXMoeCA9IH5sb2coZGVuc2l0eTEkeCsxKSwgeSA9IH5sb2coZGVuc2l0eTEkeSsxKSwgbmFtZSA9ICJwb29yIikgJT4lIA0KICBhZGRfbGluZXMoeCA9IH5sb2coZGVuc2l0eTIkeCsxKSwgeSA9IH5sb2coZGVuc2l0eTIkeSsxKSwgbmFtZSA9ICJub3QgcG9vciIpICU+JSANCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdMb2coUmVudCBQcmljZSknKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JyksDQogICAgICAgICB0aXRsZSA9ICJOZWlnaGJvcmhvb2QgUmVudCBQcmljZSBEaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KDQoNCiMjIFJlc3VsdHMNCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCmNvbGxlY3RfbWV0cmljcyhmaW5hbF9yZXMpIA0KDQpgYGANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KZmluYWxfeGdiICU+JQ0KICAgIGZpdChkYXRhID0gdHJhaW4pICU+JQ0KICAgIHB1bGxfd29ya2Zsb3dfZml0KCkgJT4lDQogICAgdmlwKGdlb20gPSAicG9pbnQiLCBudW1fZmVhdHVyZXMgPSAyMCkrDQogIHRoZW1lX2xpZ2h0KCkNCmBgYA0KDQpJIHRlc3RlZCBkaWZmZXJlbnQgbW9kZWxzOiB4Z2Jvb3N0LCBsb2dpc3RpYyByZWdyZXNzaW9uLCBhbmQgay1uZWFyZXN0IG5laWdoYm9ycyAoKmtubiopLiBUaGUgb25lIHdpdGggdGhlIGJlc3QgcGVyZm9ybWFuY2Ugd2FzIHRoZSB4Z2Jvb3N0IG1vZGVsIHdpdGggYSAqKnJvYyBhdWMqKiBvZiAwLjg5MTguIFRoaXMgbW9kZWwgd2FzIHZhbGlkYXRlZCB3aXRoIGEgKmstZm9sZCBjcm9zcyB2YWxpZGF0aW9uKiBwcm9jZXNzLCB3aXRoIGsgPSA1LiBJIHVzZWQgMTAwMCB0cmVlcyBhcyBkZWZhdWx0LiBUaGUgaHlwZXJwYXJhbWV0ZXJzIHRoYXQgZ2F2ZSBtZSB0aGUgYmVzdCByZXN1bHRzIHdlcmUgdGhlIGZvbGxvd2luZzoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmxpYnJhcnkoa25pdHIpDQoNCng8LXRpYmJsZSgNCiAgIm10cnkiID0gNjcsIA0KICAibWluX24iID0gMTQsDQogICJ0cmVlX2RlcHRoIiA9IDYsDQogICJsZWFybl9yYXRlIiA9IDAuMDE0MDgxNzksDQogICJsb3NzX3JlZHVjdGlvbiIgPSAiMS45MDYzMzdlLTEwIiwNCiAgInNhbXBsZV9zaXplIiA9IDAuNjkyODY2OQ0KKQ0KDQp4ICU+JSBrYmwoYWxpZ249ImNjIikgJT4lDQogIGthYmxlX3BhcGVyKCJob3ZlciIsIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KVGhlc2UgYXJlIHRoZSBtb3N0IGltcG9ydGFudCB2YXJpYWJsZXMgb2YgdGhlIG1vZGVsDQoNCiFbXShDOi9Vc2Vycy9DYXlveW8vRGVza3RvcC9SL3hnLmJvb3N0LlBORykNCg0KSW4gZ2VuZXJhbCB0ZXJtcywgdGhlcmUgaXMgYSBncm91cCBvZiB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGUgdHlwZSBvZiByZXNpZGVuY3kgb2YgdGhlIGZhbWlsaWVzOiB0aGUgaG91c2UgaXMgb3duZWQsIHJlbnRlZCBvciBpbGxlZ2FseSBvY2N1cGllZC4gSW4gdGhpcyBncm91cCBhcmUgdGhlIHZhcmlhYmxlcyAqKlYxMyoqIGFuZCAqKnRlbl92aXYqKi4gQSBzZWNvbmQgZ3JvdXAgaXMgcmVsYXRlZCB0byB0aGUgbGFib3IgYXNwZWN0IG9mIHRoZSBob21lLCBleGFtcGxlcyBvZiB0aGlzIGFyZSB0aGUgdmFyaWFibGVzICoqbl9vY3VwYWRvcyoqIChudW1iZXIgb2YgZW1wbG95ZWQgcGVvcGxlKSBhbmQgKipuX2luYWN0aXZvcyoqIChudW1iZXIgb2Ygbm90IGdhaW5mdWxseSBlbXBsb3llZCBwZW9wbGUpLiBBbm90aGVyIHZhcmlhYmxlIHJlbGF0ZWQgdG8gdGhlIHdvcmtwbGFjZSBpcyAqKm9jdXBfaW5mKiosIHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQgaXMgd29ya2luZyBsZWdhbGx5IG9yIGlsbGVnYWxseS4NCg0KQSB0aGlyZCBncm91cCBpcyBsaW5rZWQgdG8gY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQsIGhlcmUgd2UgaGF2ZSB0aGUgeWVhcnMgb2Ygc2Nob29saW5nLCByZXByZXNlbnRlZCBieSAqKmVzYzIqKiBhbmQgKiplc2MqKiwgYWdlLCAqKmVkYWQqKiBhbmQgaWYgdGhlIGhlYWQgb2YgaG91c2Vob2xkIHJlY2VpdmVkIG1lZGljYWwgdHJlYXRtZW50IGluIHRoZSBsYXN0IDEyIG1vbnRocyAqKnMyOCoqLiBBIGZvdXJ0aCBncm91cCBvZiB2YXJpYWJsZXMgaXMgbGlua2VkIHRvIHRoZSBjb21wb3NpdGlvbiBvZiB0aGUgaG91c2Vob2xkOiB0aGUgcHJlc2VuY2Ugb2YgbWlub3JzICoqbWVuMThjKiosIG9mIHBlb3BsZSBvdmVyIDYwIHllYXJzIG9sZCAqKm1heTYwYyoqIGFuZCB0aGUgbnVtYmVyIG9mIHBlb3BsZSBsaXZpbmcgaW4gdGhlIGhvdXNlaG9sZDogKipudW12aXYqKiwgKip0b3RfcGVyKiosICoqbnVtcGVyKiogYW5kICoqcDYqKi4gRmluYWxseSwgd2l0aG91dCBiZWluZyBjbGVhcmx5IHJlbGF0ZWQgdG8gdGhlIHByZXZpb3VzIGdyb3VwcywgaXQgc2VlbXMgdGhhdCB0aGUgbW9zdCBpbXBvcnRhbnQgdmFyaWFibGUgaXMgKip2MTkqKiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIHRoYXQgcGVvcGxlIHJlcG9ydCB3aGVuIHRoZXkgYXJlIGFza2VkOiBIb3cgbXVjaCBpcyB0aGUgcmVudCBpbiB0aGlzIG5laWdoYm9yaG9vZD8NCg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KeGdfY29uZiA8LSBmaW5hbF9yZXMgJT4lDQogIHVubmVzdCgucHJlZGljdGlvbnMpICU+JQ0KICBjb25mX21hdChwb2JyZXphLCAucHJlZF9jbGFzcykNCg0KeGdfY29uZg0KDQoNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmZpbmFsX2xyICU+JQ0KICBmaXQoZGF0YSA9IHRyYWluKSAlPiUNCiAgcHVsbF93b3JrZmxvd19maXQoKSAlPiUNCiAgdmlwKGdlb20gPSAicG9pbnQiLCBudW1fZmVhdHVyZXMgPSAyMCkrDQogIHRoZW1lX2xpZ2h0KCkNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpmaW5hbF9yZXMubG4gPC0gbGFzdF9maXQoZmluYWxfbHIsIHNwbCkNCg0KY29sbGVjdF9tZXRyaWNzKGZpbmFsX3Jlcy5sbikNCmBgYA0KDQoNCiMjIEZpbmFsIFRob3VnaHRzDQoNCkZpcnN0IG9mIGFsbCwgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCB0aGlzIGRhdGEgd2FzIGNvbGxlY3RlZCBkdXJpbmcgdGhlIHBhbmRlbWljLCB0aGVyZWZvcmUsIG91ciBjb25jbHVzaW9ucyBtYXkgbm90IGJlIHZhbGlkIHVuZGVyICJub3JtYWwiIGNvbmRpdGlvbnMuIEhhdmluZyBjbGFyaWZpZWQgdGhpcywgSSB0aGluayBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB3ZSBmaW5kIGl0IHN1cnByaXNpbmcgdGhhdCBjb250cmFyeSB0byB3aGF0IHdlIGluaXRpYWxseSBiZWxpZXZlZCwgbWFueSBvZiB0aGUgZGVtb2dyYXBoaWMgdmFyaWFibGVzLCBzdWNoIGFzIHJhY2Ugb3IgZ2VuZGVyLCB3ZXJlIG5vdCBhcyBpbXBvcnRhbnQgYXMgd2UgdGhvdWdodC4NCg0KSXQgaXMgcG9zc2libGUgdG8gdGhpbmsgdGhhdCBwdWJsaWMgcG9saWN5IGNhbiBwbGF5IGFuIGltcG9ydGFudCByb2xlIGluIHJlZHVjaW5nIHBvdmVydHkuIEVsZW1lbnRzIHN1Y2ggYXMgaGVhbHRoLCBlZHVjYXRpb24gYW5kIGhvdXNpbmcgaGF2ZSBhIHN0cm9uZyBwcmVkaWN0aXZlIHBvd2VyIG9uIHBvdmVydHkuIElmIHB1YmxpYyBwb2xpY2llcyB0aGF0IGZhY2lsaXRhdGUgYWNjZXNzIHRvIHRoZXNlIDMgZWxlbWVudHMgYXJlIHN0cmVuZ3RoZW5lZCwgSSBiZWxpZXZlIHRoYXQgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0byBmdXJ0aGVyIHJlZHVjaW5nIHBvdmVydHkuDQoNClRoaXMgcHJvamVjdCB3YXMgZXh0cmVtZWx5IGNvbXBsZXggdG8gY2Fycnkgb3V0LCBpbiBsYXJnZSBwYXJ0IGR1ZSB0byB0aGUgbGFyZ2Ugc2l6ZSBvZiB0aGUgZGF0YWJhc2UsIGl0IHRvb2sgYSBsb25nIHRpbWUgdG8gdHVuZSB0aGUgaHlwZXJwYXJhbWV0ZXJzIG9mIHRoZSBtb2RlbHMsIHdoaWNoIG1hZGUgdGhlIHdvcmtmbG93IHZlcnkgaGFyZC4gVGhlcmVmb3JlLCBJIHRoaW5rIHRoZXJlIGlzIGEgbG90IG9mIHJvb20gdG8gaW1wcm92ZSB0aGUgbW9kZWxzIGlmIG9uZSBoYXMgYWNjZXNzIHRvIHNlcnZlcnMgdGhhdCBhbGxvdyB1cyB0byBzcGVlZCB1cCB0aGUgcHJvY2Vzcy4gRmluYWxseSwgSSB3b3VsZCBsaWtlIHRvIHBvaW50IG91dCBhZ2FpbiB0aGF0IG9uZSBoYXMgdG8gYmUgdmVyeSBjYXJlZnVsIGFib3V0IG1ha2luZyBnZW5lcmFsaXphdGlvbnMgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGlzIHByb2plY3QsIHNpbmNlIHRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgaW4gdGhlIG1pZHN0IG9mIHN1Y2ggYW4gdW51c3VhbCBzaXR1YXRpb24gYXMgdGhlIDIwMjAgaGVhbHRoIGNyaXNpcy4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==