1. For each of parts (a) through (d), indicate whether we would generally expect the performance of a flexible statistical learning method to be better or worse than an inflexible method. Justify your answer

a. The sample size n is extremely large, and the number of predictors p is small.

Los métodos flexibles requieren más predictores, entonces se usaría uno inflexible

b. The number of predictors p is extremely large, and the number of observations n is small.

Un método flexible, se adapta mejor a tener pocos datos.

c. The relationship between the predictors and response is highly non-linear.

Un método flexible, permitirá adaptarse mejor a la forma de los datos.

#####. The variance of the error terms, i.e. sigma^2 = Var(err), is extremely high.

Los datos dispersos van a requerir un modelo flexible para poder adaptarse mejor.

2. Explain whether each scenario is a classification or regression problem, and indicate whether we are most interested in inference or prediction. Finally, provide n and p.

a. We collect a set of data on the top 500 firms in the US. For each firm we record profit, number of employees, industry and the CEO salary. We are interested in understanding which factors affect CEO salary.

Regresion, inferencia, porque queremos entender que factores afectan. n = 500 firmas p = 3 factores

b. We are considering launching a new product and wish to know whether it will be a success or a failure. We collect data on 20 similar products that were previously launched. For each product we have recorded whether it was a success or failure, price charged for the product, marketing budget, competition price, and ten other variables.

Si exito o fracaso son dos categorias, se haria una clasificacion. n = 20 productos p = 13 variables

c. We are interesting in predicting the % change in the US dollar in relation to the weekly changes in the world stock markets. Hence we collect weekly data for all of 2012. For each week we record the % change in the dollar, the % change in the US market, the % change in the British market, and the % change in the German market.

Regresion, prediccion, queremos ver como cambiara pero no los factores. n = 52 semanas p = 3 mercados

3. We now revisit the bias-variance decomposition.

PENDIENTE

4. ou will now think of some real-life applications for statistical learning.

a. Describe three real-life applications in which classification might be useful. Describe the response, as well as the predictors. Is the goal of each application inference or prediction? Explain your answer.
  • Clasificar que alumnos estan en riesgo, quienes van bien, y quienes pueden optar a extras. Predictores: notas, asistencia, asistencia a refuerzo. Inferencia, pues se quiere saber en qué aspecto pueden mejorar.

  • A qué grupo de personas vender un producto. Predictores: sueldo de los compradores, tiendas/lugares que frecuenta. Prediccion, quienes comprarian el producto.

  • Que artista va a ver la gente en un concierto multiple. Predictores: donde compro su entrada, adquirio alguna promocion. Prediccion, a quien van a ver.

b. Describe three real-life applications in which regression might be useful. Describe the response, as well as the predictors. Is the goal of each application inference or prediction? Explain your answer.
  • Dinero que alguien gastara en sus vacaciones. Predictores: cuanto tiempo desde sus ultimas vacaciones, lugar al que ira, acompanantes. Prediccion, cantidad de dinero a gastar.

  • Prestamo que alguien va a pedir. Predictores: banco que usa, dinero ahorrado, que planea comprar/invertir. Prediccion: cantidad de dinero a pedir.

  • Ganancias de una empresa. Predictores: costo de produccion, cantidad de clientes, publicidad. Inferencia: Como afectan los factores, para poder aumentar la ganancia.

c. Describe three real-life applications in which cluster analysis might be useful.
  • Marca de vehiculo que alguien tiene

  • Lugar de vivienda de una persona

  • Centro comercial o supermercado donde alguien hace sus compras habituales

5. What are the advantages and disadvantages of a very flexible (versus a less flexible) approach for regression or classification? Under what circumstances might a more flexible approach be preferred to a less flexible approach? When might a less flexible approach be preferred?

Dependera de la forma que tomen los datos. Entre mas cercano sea a algo lineal, sera mejor un modelo no flexible. Si la forma no esta clara, un modelo flexible ayuda.

Hay casos, como clasificacion, donde no se quiere quedar tan cerca de las observaciones, sino hacer una distincion clara, se usaria un modelo no flexible.

6. Describe the differences between a parametric and a non-parametric statistical learning approach. What are the advantages of a parametric approach to regression or classification (as opposed to a nonparametric approach)? What are its disadvantages?

En el parametrico se busca ajustar los datos a una forma lo mas simple posible, para unicamente usar este ajuste para hacer predicciones. El no parametrico usara todos los datos para sacar predicciones.

Las ventajas que se tienen es la simplificacion que permite, la desventaja es que dependeremos del ajuste que le dimos, si lo ajustamos a un modelo que no era el apropiado se tendra problema con los resultados.

7. The table below provides a training data set containing six observations, three predictors, and one qualitative response variable.

PENDIENTE

8. This exercise relates to the College data set, which can be found in the file College.csv. It contains a number of variables for 777 different universities and colleges in the US.

a. Use the read.csv() function to read the data into R. Call the loaded data college. Make sure that you have the directory set to the correct location for the data
b. Look at the data using the fix() function. You should notice that the first column is just the name of each university. We don’t really want R to treat this as data. However, it may be handy to have these names for later
c. i. Use the summary() function to produce a numerical summary of the variables in the data set.
summary(college)
                            X       Private  
 Abilene Christian University:  1   No :212  
 Adelphi University          :  1   Yes:565  
 Adrian College              :  1            
 Agnes Scott College         :  1            
 Alaska Pacific University   :  1            
 Albertson College           :  1            
 (Other)                     :771            
      Apps           Accept          Enroll    
 Min.   :   81   Min.   :   72   Min.   :  35  
 1st Qu.:  776   1st Qu.:  604   1st Qu.: 242  
 Median : 1558   Median : 1110   Median : 434  
 Mean   : 3002   Mean   : 2019   Mean   : 780  
 3rd Qu.: 3624   3rd Qu.: 2424   3rd Qu.: 902  
 Max.   :48094   Max.   :26330   Max.   :6392  
                                               
   Top10perc       Top25perc      F.Undergrad   
 Min.   : 1.00   Min.   :  9.0   Min.   :  139  
 1st Qu.:15.00   1st Qu.: 41.0   1st Qu.:  992  
 Median :23.00   Median : 54.0   Median : 1707  
 Mean   :27.56   Mean   : 55.8   Mean   : 3700  
 3rd Qu.:35.00   3rd Qu.: 69.0   3rd Qu.: 4005  
 Max.   :96.00   Max.   :100.0   Max.   :31643  
                                                
  P.Undergrad         Outstate       Room.Board  
 Min.   :    1.0   Min.   : 2340   Min.   :1780  
 1st Qu.:   95.0   1st Qu.: 7320   1st Qu.:3597  
 Median :  353.0   Median : 9990   Median :4200  
 Mean   :  855.3   Mean   :10441   Mean   :4358  
 3rd Qu.:  967.0   3rd Qu.:12925   3rd Qu.:5050  
 Max.   :21836.0   Max.   :21700   Max.   :8124  
                                                 
     Books           Personal         PhD        
 Min.   :  96.0   Min.   : 250   Min.   :  8.00  
 1st Qu.: 470.0   1st Qu.: 850   1st Qu.: 62.00  
 Median : 500.0   Median :1200   Median : 75.00  
 Mean   : 549.4   Mean   :1341   Mean   : 72.66  
 3rd Qu.: 600.0   3rd Qu.:1700   3rd Qu.: 85.00  
 Max.   :2340.0   Max.   :6800   Max.   :103.00  
                                                 
    Terminal       S.F.Ratio      perc.alumni   
 Min.   : 24.0   Min.   : 2.50   Min.   : 0.00  
 1st Qu.: 71.0   1st Qu.:11.50   1st Qu.:13.00  
 Median : 82.0   Median :13.60   Median :21.00  
 Mean   : 79.7   Mean   :14.09   Mean   :22.74  
 3rd Qu.: 92.0   3rd Qu.:16.50   3rd Qu.:31.00  
 Max.   :100.0   Max.   :39.80   Max.   :64.00  
                                                
     Expend        Grad.Rate     
 Min.   : 3186   Min.   : 10.00  
 1st Qu.: 6751   1st Qu.: 53.00  
 Median : 8377   Median : 65.00  
 Mean   : 9660   Mean   : 65.46  
 3rd Qu.:10830   3rd Qu.: 78.00  
 Max.   :56233   Max.   :118.00  
                                 
c. ii. Use the pairs() function to produce a scatterplot matrix of the first ten columns or variables of the data. Recall that you can reference the first ten columns of a matrix A using A[,1:10].
pairs(college[,1:10])
c. iii. Use the plot() function to produce side-by-side boxplots of Outstate versus Private.

c. iv. Create a new qualitative variable, called Elite, by binning the Top10perc variable. We are going to divide universities into two groups based on whether or not the proportion of students coming from the top 10% of their high school classes exceeds 50%.

c. v. Use the hist() function to produce some histograms with differing numbers of bins for a few of the quantitative variables.
par(mfrow = c(2,2))
hist(college$Accept)
hist(college$Enroll)
hist(college$Personal)
hist(college$PhD)

9. This exercise involves the Auto data set studied in the lab. Make sure that the missing values have been removed from the data.

a. Which of the predictors are quantitative, and which are qualitative?

Cuantitativos: mpg, cylinders, displacement, horsepower, weight, acceleration, year

Cualitativos: origin, name

b. What is the range of each quantitative predictor? You can answer this using the range() function. range()
c. What is the mean and standard deviation of each quantitative predictor?
summary(auto[,1:7])
      mpg          cylinders      displacement     horsepower        weight      acceleration  
 Min.   : 9.00   Min.   :3.000   Min.   : 68.0   Min.   : 46.0   Min.   :1613   Min.   : 8.00  
 1st Qu.:17.00   1st Qu.:4.000   1st Qu.:105.0   1st Qu.: 75.0   1st Qu.:2225   1st Qu.:13.78  
 Median :22.75   Median :4.000   Median :151.0   Median : 93.5   Median :2804   Median :15.50  
 Mean   :23.45   Mean   :5.472   Mean   :194.4   Mean   :104.5   Mean   :2978   Mean   :15.54  
 3rd Qu.:29.00   3rd Qu.:8.000   3rd Qu.:275.8   3rd Qu.:126.0   3rd Qu.:3615   3rd Qu.:17.02  
 Max.   :46.60   Max.   :8.000   Max.   :455.0   Max.   :230.0   Max.   :5140   Max.   :24.80  
      year      
 Min.   :70.00  
 1st Qu.:73.00  
 Median :76.00  
 Mean   :75.98  
 3rd Qu.:79.00  
 Max.   :82.00  

summary nos resume cada columna y nos muestra el minimo y maximo (para el rango) y la media de cada una.

sapply(auto[,1:8], range)
      mpg cylinders displacement
[1,]  9.0         3           68
[2,] 46.6         8          455
     horsepower weight acceleration year
[1,]         46   1613          8.0   70
[2,]        230   5140         24.8   82
     origin
[1,]      1
[2,]      3
sapply(auto[,1:8], mean)
         mpg    cylinders displacement 
   23.445918     5.471939   194.411990 
  horsepower       weight acceleration 
  104.469388  2977.584184    15.541327 
        year       origin 
   75.979592     1.576531 
sapply(auto[,1:8], sd)
         mpg    cylinders displacement 
   7.8050075    1.7057832  104.6440039 
  horsepower       weight acceleration 
  38.4911599  849.4025600    2.7588641 
        year       origin 
   3.6837365    0.8055182 

apply nos permite aplicar sd (standard deviation) a las columnas cuantitativas

d. Now remove the 10th through 85th observations. What is the range, mean, and standard deviation of each predictor in the subset of the data that remains?
Using the full data set, investigate the predictors graphically, using scatterplots or other tools of your choice. Create some plots highlighting the relationships among the predictors. Comment on your findings.

f. Suppose that we wish to predict gas mileage (mpg) on the basis of the other variables. Do your plots suggest that any of the other variables might be useful in predicting mpg? Justify your answer.

mpg vs displacement, mpg vs horsepower, mpg vs weight, y en menor medida mpg vs acceleration

par(mfrow = c(2,2))
plot(auto$displacement, auto$mpg)
plot(auto$horsepower, auto$mpg)
plot(auto$weight, auto$mpg)
plot(auto$acceleration, auto$mpg)

10. This exercise involves the Boston housing data set.

a. To begin, load in the Boston data set. The Boston data set is part of the MASS library in R.
library(MASS)
nrow(Boston)
[1] 506
ncol(Boston)
[1] 14
colnames(Boston)
 [1] "crim"    "zn"      "indus"  
 [4] "chas"    "nox"     "rm"     
 [7] "age"     "dis"     "rad"    
[10] "tax"     "ptratio" "black"  
[13] "lstat"   "medv"   
?Boston
b. Make some pairwise scatterplots of the predictors (columns) in this data set. Describe your findings.

Entre mas industria hay, mas produccion de oxidos de nitrogeno

Entre mas cerca de los centros de empleo, mas alta la concentracion de oxidos de nitrogeno

c. Are any of the predictors associated with per capita crime rate? If so, explain the relationship.

El crimen es mas alto en lugares donde las viviendas valen menos.

Da la impresion que el crimen es cometido por gente de mayor edad. Hay criminales de 80 a 100 anios en Boston?

plot(Boston$age, Boston$crim)
d. Do any of the suburbs of Boston appear to have particularly high crime rates? Tax rates? Pupil-teacher ratios? Comment on the range of each predictor.

Los impuestos no parecen influir. Hay una tasa de impuestos que es la mas comun, y hay toda cantidad de crimen en este lugar.

La cantidad de alumnos por maestro tampoco parece influir.

En el inciso anterior se vio que los lugares con menor valor de vivienda tienen mas crimen.

e. How many of the suburbs in this data set bound the Charles river?
sum(Boston$chas == 1)
[1] 35
f. What is the median pupil-teacher ratio among the towns in this data set?
median(Boston$ptratio)
[1] 19.05
g. Which suburb of Boston has lowest median value of owneroccupied homes? What are the values of the other predictors for that suburb, and how do those values compare to the overall ranges for those predictors? Comment on your findings.
minmedian = min(Boston$medv)
Boston[Boston$medv == minmedian,]
sapply(Boston, mean)
        crim           zn        indus         chas          nox           rm          age 
  3.61352356  11.36363636  11.13677866   0.06916996   0.55469506   6.28463439  68.57490119 
         dis          rad          tax      ptratio        black        lstat         medv 
  3.79504269   9.54940711 408.23715415  18.45553360 356.67403162  12.65306324  22.53280632 

Hay dos suburbios con medv de 5. No parecen buenos lugares para vivir, el crimen y la contaminacion son mas altos que el promedio.

g. In this data set, how many of the suburbs average more than seven rooms per dwelling? More than eight rooms per dwelling? Comment on the suburbs that average more than eight rooms per dwelling.
nrow(Boston[Boston$rm>8,])
[1] 13

64 suburbios con mas de 7 habitaciones en promedio; 13 con mas de 8 habitaciones.

LS0tDQp0aXRsZTogIkxhYiAxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJMdWlzIEppbWVuZXoiDQotLS0NCg0KIyMjIyAxLiBGb3IgZWFjaCBvZiBwYXJ0cyAoYSkgdGhyb3VnaCAoZCksIGluZGljYXRlIHdoZXRoZXIgd2Ugd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgYSBmbGV4aWJsZSBzdGF0aXN0aWNhbCBsZWFybmluZyBtZXRob2QgdG8gYmUgYmV0dGVyIG9yIHdvcnNlIHRoYW4gYW4gaW5mbGV4aWJsZSBtZXRob2QuIEp1c3RpZnkgeW91ciBhbnN3ZXINCg0KIyMjIyMgYS4gVGhlIHNhbXBsZSBzaXplIG4gaXMgZXh0cmVtZWx5IGxhcmdlLCBhbmQgdGhlIG51bWJlciBvZiBwcmVkaWN0b3JzIHAgaXMgc21hbGwuDQoNCkxvcyBt6XRvZG9zIGZsZXhpYmxlcyByZXF1aWVyZW4gbeFzIHByZWRpY3RvcmVzLCBlbnRvbmNlcyBzZSB1c2Fy7WEgdW5vIGluZmxleGlibGUNCg0KIyMjIyMgYi4gVGhlIG51bWJlciBvZiBwcmVkaWN0b3JzIHAgaXMgZXh0cmVtZWx5IGxhcmdlLCBhbmQgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgbiBpcyBzbWFsbC4NCg0KVW4gbel0b2RvIGZsZXhpYmxlLCBzZSBhZGFwdGEgbWVqb3IgYSB0ZW5lciBwb2NvcyBkYXRvcy4NCg0KIyMjIyMgYy4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmVkaWN0b3JzIGFuZCByZXNwb25zZSBpcyBoaWdobHkgbm9uLWxpbmVhci4NCg0KVW4gbel0b2RvIGZsZXhpYmxlLCBwZXJtaXRpcuEgYWRhcHRhcnNlIG1lam9yIGEgbGEgZm9ybWEgZGUgbG9zIGRhdG9zLg0KDQojIyMjIy4gVGhlIHZhcmlhbmNlIG9mIHRoZSBlcnJvciB0ZXJtcywgaS5lLiBzaWdtYV4yID0gVmFyKGVyciksIGlzIGV4dHJlbWVseSBoaWdoLg0KDQpMb3MgZGF0b3MgZGlzcGVyc29zIHZhbiBhIHJlcXVlcmlyIHVuIG1vZGVsbyBmbGV4aWJsZSBwYXJhIHBvZGVyIGFkYXB0YXJzZSBtZWpvci4NCg0KDQoNCiMjIyMgMi4gRXhwbGFpbiB3aGV0aGVyIGVhY2ggc2NlbmFyaW8gaXMgYSBjbGFzc2lmaWNhdGlvbiBvciByZWdyZXNzaW9uIHByb2JsZW0sIGFuZCBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBtb3N0IGludGVyZXN0ZWQgaW4gaW5mZXJlbmNlIG9yIHByZWRpY3Rpb24uIEZpbmFsbHksIHByb3ZpZGUgbiBhbmQgcC4NCg0KIyMjIyMgYS4gV2UgY29sbGVjdCBhIHNldCBvZiBkYXRhIG9uIHRoZSB0b3AgNTAwIGZpcm1zIGluIHRoZSBVUy4gRm9yIGVhY2ggZmlybSB3ZSByZWNvcmQgcHJvZml0LCBudW1iZXIgb2YgZW1wbG95ZWVzLCBpbmR1c3RyeSBhbmQgdGhlIENFTyBzYWxhcnkuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgd2hpY2ggZmFjdG9ycyBhZmZlY3QgQ0VPIHNhbGFyeS4NClJlZ3Jlc2lvbiwgaW5mZXJlbmNpYSwgcG9ycXVlIHF1ZXJlbW9zIGVudGVuZGVyIHF1ZSBmYWN0b3JlcyBhZmVjdGFuLg0KbiA9IDUwMCBmaXJtYXMNCnAgPSAzIGZhY3RvcmVzDQoNCiMjIyMjIGIuIFdlIGFyZSBjb25zaWRlcmluZyBsYXVuY2hpbmcgYSBuZXcgcHJvZHVjdCBhbmQgd2lzaCB0byBrbm93IHdoZXRoZXIgaXQgd2lsbCBiZSBhIHN1Y2Nlc3Mgb3IgYSBmYWlsdXJlLiBXZSBjb2xsZWN0IGRhdGEgb24gMjAgc2ltaWxhciBwcm9kdWN0cyB0aGF0IHdlcmUgcHJldmlvdXNseSBsYXVuY2hlZC4gRm9yIGVhY2ggcHJvZHVjdCB3ZSBoYXZlIHJlY29yZGVkIHdoZXRoZXIgaXQgd2FzIGEgc3VjY2VzcyBvciBmYWlsdXJlLCBwcmljZSBjaGFyZ2VkIGZvciB0aGUgcHJvZHVjdCwgbWFya2V0aW5nIGJ1ZGdldCwgY29tcGV0aXRpb24gcHJpY2UsIGFuZCB0ZW4gb3RoZXIgdmFyaWFibGVzLg0KU2kgZXhpdG8gbyBmcmFjYXNvIHNvbiBkb3MgY2F0ZWdvcmlhcywgc2UgaGFyaWEgdW5hIGNsYXNpZmljYWNpb24uDQpuID0gMjAgcHJvZHVjdG9zDQpwID0gMTMgdmFyaWFibGVzDQoNCiMjIyMjIGMuIFdlIGFyZSBpbnRlcmVzdGluZyBpbiBwcmVkaWN0aW5nIHRoZSAlIGNoYW5nZSBpbiB0aGUgVVMgZG9sbGFyIGluIHJlbGF0aW9uIHRvIHRoZSB3ZWVrbHkgY2hhbmdlcyBpbiB0aGUgd29ybGQgc3RvY2sgbWFya2V0cy4gSGVuY2Ugd2UgY29sbGVjdCB3ZWVrbHkgZGF0YSBmb3IgYWxsIG9mIDIwMTIuIEZvciBlYWNoIHdlZWsgd2UgcmVjb3JkIHRoZSAlIGNoYW5nZSBpbiB0aGUgZG9sbGFyLCB0aGUgJSBjaGFuZ2UgaW4gdGhlIFVTIG1hcmtldCwgdGhlICUgY2hhbmdlIGluIHRoZSBCcml0aXNoIG1hcmtldCwgYW5kIHRoZSAlIGNoYW5nZSBpbiB0aGUgR2VybWFuIG1hcmtldC4NClJlZ3Jlc2lvbiwgcHJlZGljY2lvbiwgcXVlcmVtb3MgdmVyIGNvbW8gY2FtYmlhcmEgcGVybyBubyBsb3MgZmFjdG9yZXMuDQpuID0gNTIgc2VtYW5hcw0KcCA9IDMgbWVyY2Fkb3MNCg0KDQoNCiMjIyMgMy4gV2Ugbm93IHJldmlzaXQgdGhlIGJpYXMtdmFyaWFuY2UgZGVjb21wb3NpdGlvbi4NCg0KUEVORElFTlRFDQoNCg0KDQojIyMjIDQuIG91IHdpbGwgbm93IHRoaW5rIG9mIHNvbWUgcmVhbC1saWZlIGFwcGxpY2F0aW9ucyBmb3Igc3RhdGlzdGljYWwgbGVhcm5pbmcuDQoNCiMjIyMjIGEuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggY2xhc3NpZmljYXRpb24gbWlnaHQgYmUgdXNlZnVsLiBEZXNjcmliZSB0aGUgcmVzcG9uc2UsIGFzIHdlbGwgYXMgdGhlIHByZWRpY3RvcnMuIElzIHRoZSBnb2FsIG9mIGVhY2ggYXBwbGljYXRpb24gaW5mZXJlbmNlIG9yIHByZWRpY3Rpb24/IEV4cGxhaW4geW91ciBhbnN3ZXIuDQotIENsYXNpZmljYXIgcXVlIGFsdW1ub3MgZXN0YW4gZW4gcmllc2dvLCBxdWllbmVzIHZhbiBiaWVuLCB5IHF1aWVuZXMgcHVlZGVuIG9wdGFyIGEgZXh0cmFzLiBQcmVkaWN0b3Jlczogbm90YXMsIGFzaXN0ZW5jaWEsIGFzaXN0ZW5jaWEgYSByZWZ1ZXJ6by4gSW5mZXJlbmNpYSwgcHVlcyBzZSBxdWllcmUgc2FiZXIgZW4gcXXpIGFzcGVjdG8gcHVlZGVuIG1lam9yYXIuDQoNCi0gQSBxdekgZ3J1cG8gZGUgcGVyc29uYXMgdmVuZGVyIHVuIHByb2R1Y3RvLiBQcmVkaWN0b3Jlczogc3VlbGRvIGRlIGxvcyBjb21wcmFkb3JlcywgdGllbmRhcy9sdWdhcmVzIHF1ZSBmcmVjdWVudGEuIFByZWRpY2Npb24sIHF1aWVuZXMgY29tcHJhcmlhbiBlbCBwcm9kdWN0by4NCg0KLSBRdWUgYXJ0aXN0YSB2YSBhIHZlciBsYSBnZW50ZSBlbiB1biBjb25jaWVydG8gbXVsdGlwbGUuIFByZWRpY3RvcmVzOiBkb25kZSBjb21wcm8gc3UgZW50cmFkYSwgYWRxdWlyaW8gYWxndW5hIHByb21vY2lvbi4gUHJlZGljY2lvbiwgYSBxdWllbiB2YW4gYSB2ZXIuDQoNCiMjIyMjIGIuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggcmVncmVzc2lvbiBtaWdodCBiZSB1c2VmdWwuIERlc2NyaWJlIHRoZSByZXNwb25zZSwgYXMgd2VsbCBhcyB0aGUgcHJlZGljdG9ycy4gSXMgdGhlIGdvYWwgb2YgZWFjaCBhcHBsaWNhdGlvbiBpbmZlcmVuY2Ugb3IgcHJlZGljdGlvbj8gRXhwbGFpbiB5b3VyIGFuc3dlci4NCi0gRGluZXJvIHF1ZSBhbGd1aWVuIGdhc3RhcmEgZW4gc3VzIHZhY2FjaW9uZXMuIFByZWRpY3RvcmVzOiBjdWFudG8gdGllbXBvIGRlc2RlIHN1cyB1bHRpbWFzIHZhY2FjaW9uZXMsIGx1Z2FyIGFsIHF1ZSBpcmEsIGFjb21wYW5hbnRlcy4gUHJlZGljY2lvbiwgY2FudGlkYWQgZGUgZGluZXJvIGEgZ2FzdGFyLg0KDQotIFByZXN0YW1vIHF1ZSBhbGd1aWVuIHZhIGEgcGVkaXIuIFByZWRpY3RvcmVzOiBiYW5jbyBxdWUgdXNhLCBkaW5lcm8gYWhvcnJhZG8sIHF1ZSBwbGFuZWEgY29tcHJhci9pbnZlcnRpci4gUHJlZGljY2lvbjogY2FudGlkYWQgZGUgZGluZXJvIGEgcGVkaXIuDQoNCi0gR2FuYW5jaWFzIGRlIHVuYSBlbXByZXNhLiBQcmVkaWN0b3JlczogY29zdG8gZGUgcHJvZHVjY2lvbiwgY2FudGlkYWQgZGUgY2xpZW50ZXMsIHB1YmxpY2lkYWQuIEluZmVyZW5jaWE6IENvbW8gYWZlY3RhbiBsb3MgZmFjdG9yZXMsIHBhcmEgcG9kZXIgYXVtZW50YXIgbGEgZ2FuYW5jaWEuDQoNCiMjIyMjIGMuIERlc2NyaWJlIHRocmVlIHJlYWwtbGlmZSBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggY2x1c3RlciBhbmFseXNpcyBtaWdodCBiZSB1c2VmdWwuDQotIE1hcmNhIGRlIHZlaGljdWxvIHF1ZSBhbGd1aWVuIHRpZW5lDQoNCi0gTHVnYXIgZGUgdml2aWVuZGEgZGUgdW5hIHBlcnNvbmENCg0KLSBDZW50cm8gY29tZXJjaWFsIG8gc3VwZXJtZXJjYWRvIGRvbmRlIGFsZ3VpZW4gaGFjZSBzdXMgY29tcHJhcyBoYWJpdHVhbGVzDQoNCg0KDQojIyMjIDUuIFdoYXQgYXJlIHRoZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzIG9mIGEgdmVyeSBmbGV4aWJsZSAodmVyc3VzIGEgbGVzcyBmbGV4aWJsZSkgYXBwcm9hY2ggZm9yIHJlZ3Jlc3Npb24gb3IgY2xhc3NpZmljYXRpb24/IFVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBtaWdodCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggYmUgcHJlZmVycmVkIHRvIGEgbGVzcyBmbGV4aWJsZSBhcHByb2FjaD8gV2hlbiBtaWdodCBhIGxlc3MgZmxleGlibGUgYXBwcm9hY2ggYmUgcHJlZmVycmVkPw0KRGVwZW5kZXJhIGRlIGxhIGZvcm1hIHF1ZSB0b21lbiBsb3MgZGF0b3MuIEVudHJlIG1hcyBjZXJjYW5vIHNlYSBhIGFsZ28gbGluZWFsLCBzZXJhIG1lam9yIHVuIG1vZGVsbyBubyBmbGV4aWJsZS4gU2kgbGEgZm9ybWEgbm8gZXN0YSBjbGFyYSwgdW4gbW9kZWxvIGZsZXhpYmxlIGF5dWRhLg0KDQpIYXkgY2Fzb3MsIGNvbW8gY2xhc2lmaWNhY2lvbiwgZG9uZGUgbm8gc2UgcXVpZXJlIHF1ZWRhciB0YW4gY2VyY2EgZGUgbGFzIG9ic2VydmFjaW9uZXMsIHNpbm8gaGFjZXIgdW5hIGRpc3RpbmNpb24gY2xhcmEsIHNlIHVzYXJpYSB1biBtb2RlbG8gbm8gZmxleGlibGUuDQoNCg0KDQojIyMjIDYuICBEZXNjcmliZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHBhcmFtZXRyaWMgYW5kIGEgbm9uLXBhcmFtZXRyaWMgc3RhdGlzdGljYWwgbGVhcm5pbmcgYXBwcm9hY2guIFdoYXQgYXJlIHRoZSBhZHZhbnRhZ2VzIG9mIGEgcGFyYW1ldHJpYyBhcHByb2FjaCB0byByZWdyZXNzaW9uIG9yIGNsYXNzaWZpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGEgbm9ucGFyYW1ldHJpYyBhcHByb2FjaCk/IFdoYXQgYXJlIGl0cyBkaXNhZHZhbnRhZ2VzPw0KRW4gZWwgcGFyYW1ldHJpY28gc2UgYnVzY2EgYWp1c3RhciBsb3MgZGF0b3MgYSB1bmEgZm9ybWEgbG8gbWFzIHNpbXBsZSBwb3NpYmxlLCBwYXJhIHVuaWNhbWVudGUgdXNhciBlc3RlIGFqdXN0ZSBwYXJhIGhhY2VyIHByZWRpY2Npb25lcy4gRWwgbm8gcGFyYW1ldHJpY28gdXNhcmEgdG9kb3MgbG9zIGRhdG9zIHBhcmEgc2FjYXIgcHJlZGljY2lvbmVzLg0KDQpMYXMgdmVudGFqYXMgcXVlIHNlIHRpZW5lbiBlcyBsYSBzaW1wbGlmaWNhY2lvbiBxdWUgcGVybWl0ZSwgbGEgZGVzdmVudGFqYSBlcyBxdWUgZGVwZW5kZXJlbW9zIGRlbCBhanVzdGUgcXVlIGxlIGRpbW9zLCBzaSBsbyBhanVzdGFtb3MgYSB1biBtb2RlbG8gcXVlIG5vIGVyYSBlbCBhcHJvcGlhZG8gc2UgdGVuZHJhIHByb2JsZW1hIGNvbiBsb3MgcmVzdWx0YWRvcy4NCg0KDQoNCiMjIyMgNy4gVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgdHJhaW5pbmcgZGF0YSBzZXQgY29udGFpbmluZyBzaXggb2JzZXJ2YXRpb25zLCB0aHJlZSBwcmVkaWN0b3JzLCBhbmQgb25lIHF1YWxpdGF0aXZlIHJlc3BvbnNlIHZhcmlhYmxlLg0KDQpQRU5ESUVOVEUNCg0KDQoNCiMjIyMgOC4gVGhpcyBleGVyY2lzZSByZWxhdGVzIHRvIHRoZSBDb2xsZWdlIGRhdGEgc2V0LCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ29sbGVnZS5jc3YuIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyBmb3IgNzc3IGRpZmZlcmVudCB1bml2ZXJzaXRpZXMgYW5kIGNvbGxlZ2VzIGluIHRoZSBVUy4NCg0KIyMjIyMgYS4gVXNlIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIGRhdGEgaW50byBSLiBDYWxsIHRoZSBsb2FkZWQgZGF0YSBjb2xsZWdlLiBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZGlyZWN0b3J5IHNldCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIGRhdGENCmBgYHtyfQ0KY29sbGVnZSA8LSByZWFkLmNzdigiQ29sbGVnZS5jc3YiKQ0KYGBgDQoNCiMjIyMjIGIuIExvb2sgYXQgdGhlIGRhdGEgdXNpbmcgdGhlIGZpeCgpIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIG5vdGljZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaXMganVzdCB0aGUgbmFtZSBvZiBlYWNoIHVuaXZlcnNpdHkuIFdlIGRvbid0IHJlYWxseSB3YW50IFIgdG8gdHJlYXQgdGhpcyBhcyBkYXRhLiBIb3dldmVyLCBpdCBtYXkgYmUgaGFuZHkgdG8gaGF2ZSB0aGVzZSBuYW1lcyBmb3IgbGF0ZXINCmBgYHtyfQ0KZml4KGNvbGxlZ2UpDQpgYGANCg0KIyMjIyMgYy4gaS4gVXNlIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdG8gcHJvZHVjZSBhIG51bWVyaWNhbCBzdW1tYXJ5IG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGEgc2V0Lg0KYGBge3J9DQpzdW1tYXJ5KGNvbGxlZ2UpDQpgYGANCg0KIyMjIyMgYy4gaWkuIFVzZSB0aGUgcGFpcnMoKSBmdW5jdGlvbiB0byBwcm9kdWNlIGEgc2NhdHRlcnBsb3QgbWF0cml4IG9mIHRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvciB2YXJpYWJsZXMgb2YgdGhlIGRhdGEuIFJlY2FsbCB0aGF0IHlvdSBjYW4gcmVmZXJlbmNlIHRoZSBmaXJzdCB0ZW4gY29sdW1ucyBvZiBhIG1hdHJpeCBBIHVzaW5nIEFbLDE6MTBdLg0KYGBge3J9DQpwYWlycyhjb2xsZWdlWywxOjEwXSkNCmBgYA0KDQojIyMjIyBjLiBpaWkuIFVzZSB0aGUgcGxvdCgpIGZ1bmN0aW9uIHRvIHByb2R1Y2Ugc2lkZS1ieS1zaWRlIGJveHBsb3RzIG9mIE91dHN0YXRlIHZlcnN1cyBQcml2YXRlLg0KYGBge3J9DQpib3hwbG90KGNvbGxlZ2UkT3V0c3RhdGUsIGNvbGxlZ2UkUHJpdmF0ZSkNCmBgYA0KDQojIyMjIyBjLiBpdi4gQ3JlYXRlIGEgbmV3IHF1YWxpdGF0aXZlIHZhcmlhYmxlLCBjYWxsZWQgRWxpdGUsIGJ5IGJpbm5pbmcgdGhlIFRvcDEwcGVyYyB2YXJpYWJsZS4gV2UgYXJlIGdvaW5nIHRvIGRpdmlkZSB1bml2ZXJzaXRpZXMgaW50byB0d28gZ3JvdXBzIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wb3J0aW9uIG9mIHN0dWRlbnRzIGNvbWluZyBmcm9tIHRoZSB0b3AgMTAlIG9mIHRoZWlyIGhpZ2ggc2Nob29sIGNsYXNzZXMgZXhjZWVkcyA1MCUuDQpgYGB7cn0NCkVsaXRlIDwtIHJlcCgiTm8iLG5yb3coY29sbGVnZSkpDQpFbGl0ZVtjb2xsZWdlJFRvcDEwcGVyYz41MF0gPSAiWWVzIg0KRWxpdGUgPSBhcy5mYWN0b3IoRWxpdGUpDQpjb2xsZWdlID0gZGF0YS5mcmFtZShjb2xsZWdlLCBFbGl0ZSkNCg0Kc3VtbWFyeShFbGl0ZSkNCg0KcGxvdChjb2xsZWdlJEVsaXRlLCBjb2xsZWdlJE91dHN0YXRlKQ0KYGBgDQoNCiMjIyMjIGMuIHYuIFVzZSB0aGUgaGlzdCgpIGZ1bmN0aW9uIHRvIHByb2R1Y2Ugc29tZSBoaXN0b2dyYW1zIHdpdGggZGlmZmVyaW5nIG51bWJlcnMgb2YgYmlucyBmb3IgYSBmZXcgb2YgdGhlIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMuDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCg0KaGlzdChjb2xsZWdlJEFjY2VwdCkNCmhpc3QoY29sbGVnZSRFbnJvbGwpDQpoaXN0KGNvbGxlZ2UkUGVyc29uYWwpDQpoaXN0KGNvbGxlZ2UkUGhEKQ0KYGBgDQoNCg0KDQojIyMjIDkuIFRoaXMgZXhlcmNpc2UgaW52b2x2ZXMgdGhlIEF1dG8gZGF0YSBzZXQgc3R1ZGllZCBpbiB0aGUgbGFiLiBNYWtlIHN1cmUgdGhhdCB0aGUgbWlzc2luZyB2YWx1ZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZGF0YS4NCg0KIyMjIyMgYS4gV2hpY2ggb2YgdGhlIHByZWRpY3RvcnMgYXJlIHF1YW50aXRhdGl2ZSwgYW5kIHdoaWNoIGFyZSBxdWFsaXRhdGl2ZT8NCmBgYHtyfQ0KYXV0byA8LSByZWFkLmNzdigiQXV0by5jc3YiLCBuYS5zdHJpbmdzID0gIj8iKQ0KYXV0byA8LSBuYS5vbWl0KGF1dG8pDQoNCmhlYWQoYXV0bykNCmBgYA0KDQpDdWFudGl0YXRpdm9zOg0KbXBnLCBjeWxpbmRlcnMsIGRpc3BsYWNlbWVudCwgaG9yc2Vwb3dlciwgd2VpZ2h0LCBhY2NlbGVyYXRpb24sIHllYXINCg0KQ3VhbGl0YXRpdm9zOg0Kb3JpZ2luLCBuYW1lDQoNCiMjIyMjIGIuIFdoYXQgaXMgdGhlIHJhbmdlIG9mIGVhY2ggcXVhbnRpdGF0aXZlIHByZWRpY3Rvcj8gWW91IGNhbiBhbnN3ZXIgdGhpcyB1c2luZyB0aGUgcmFuZ2UoKSBmdW5jdGlvbi4gcmFuZ2UoKQ0KDQojIyMjIyBjLiBXaGF0IGlzIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZWFjaCBxdWFudGl0YXRpdmUgcHJlZGljdG9yPw0KYGBge3J9DQpzdW1tYXJ5KGF1dG9bLDE6N10pDQpgYGANCg0Kc3VtbWFyeSBub3MgcmVzdW1lIGNhZGEgY29sdW1uYSB5IG5vcyBtdWVzdHJhIGVsIG1pbmltbyB5IG1heGltbyAocGFyYSBlbCByYW5nbykgeSBsYSBtZWRpYSBkZSBjYWRhIHVuYS4NCg0KYGBge3J9DQpzYXBwbHkoYXV0b1ssMTo3XSwgcmFuZ2UpDQpzYXBwbHkoYXV0b1ssMTo3XSwgbWVhbikNCnNhcHBseShhdXRvWywxOjddLCBzZCkNCmBgYA0KDQphcHBseSBub3MgcGVybWl0ZSBhcGxpY2FyIHNkIChzdGFuZGFyZCBkZXZpYXRpb24pIGEgbGFzIGNvbHVtbmFzIGN1YW50aXRhdGl2YXMNCg0KIyMjIyMgZC4gTm93IHJlbW92ZSB0aGUgMTB0aCB0aHJvdWdoIDg1dGggb2JzZXJ2YXRpb25zLiBXaGF0IGlzIHRoZSByYW5nZSwgbWVhbiwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlYWNoIHByZWRpY3RvciBpbiB0aGUgc3Vic2V0IG9mIHRoZSBkYXRhIHRoYXQgcmVtYWlucz8NCmBgYHtyfQ0KcmVtb3ZlIDwtIGF1dG9bLWMoMTA6ODUpLF0NCg0Kc2FwcGx5KHJlbW92ZVssMTo3XSwgcmFuZ2UpDQpzYXBwbHkocmVtb3ZlWywxOjddLCBtZWFuKQ0Kc2FwcGx5KHJlbW92ZVssMTo3XSwgc2QpDQpgYGANCg0KIyMjIyMgVXNpbmcgdGhlIGZ1bGwgZGF0YSBzZXQsIGludmVzdGlnYXRlIHRoZSBwcmVkaWN0b3JzIGdyYXBoaWNhbGx5LCB1c2luZyBzY2F0dGVycGxvdHMgb3Igb3RoZXIgdG9vbHMgb2YgeW91ciBjaG9pY2UuIENyZWF0ZSBzb21lIHBsb3RzIGhpZ2hsaWdodGluZyB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgcHJlZGljdG9ycy4gQ29tbWVudCBvbiB5b3VyIGZpbmRpbmdzLg0KYGBge3J9DQpwYWlycyhhdXRvWywxOjddKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChhdXRvJHdlaWdodCwgYXV0byRtcGcpDQojIEVudHJhIG1hcyBhbHRvIGVsIHBlc28sIG1lbm9yZXMgbGFzIG1pbGxhcyBwb3IgZ2Fsb24NCg0KcGxvdChhdXRvJHllYXIsIGF1dG8kaG9yc2Vwb3dlcikNCiMgRWwgY2FiYWxsYWplIHR1dm8gdGVuZGVuY2lhIGEgYmFqYXIgY29uIGxvcyBhbmlvcw0KIyBQYXNhcm9uIGRlIG1vZGEgbG9zICdtdXNjbGUgY2FyJw0KYGBgDQoNCiMjIyMjIGYuIFN1cHBvc2UgdGhhdCB3ZSB3aXNoIHRvIHByZWRpY3QgZ2FzIG1pbGVhZ2UgKG1wZykgb24gdGhlIGJhc2lzIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMuIERvIHlvdXIgcGxvdHMgc3VnZ2VzdCB0aGF0IGFueSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVkaWN0aW5nIG1wZz8gSnVzdGlmeSB5b3VyIGFuc3dlci4NCmBgYHtyfQ0KcGFpcnMoYXV0b1ssMTo3XSkNCmBgYA0KDQptcGcgdnMgZGlzcGxhY2VtZW50LCBtcGcgdnMgaG9yc2Vwb3dlciwgbXBnIHZzIHdlaWdodCwgeSBlbiBtZW5vciBtZWRpZGEgbXBnIHZzIGFjY2VsZXJhdGlvbg0KDQpgYGB7cn0NCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QoYXV0byRkaXNwbGFjZW1lbnQsIGF1dG8kbXBnKQ0KcGxvdChhdXRvJGhvcnNlcG93ZXIsIGF1dG8kbXBnKQ0KcGxvdChhdXRvJHdlaWdodCwgYXV0byRtcGcpDQpwbG90KGF1dG8kYWNjZWxlcmF0aW9uLCBhdXRvJG1wZykNCmBgYA0KDQoNCg0KIyMjIyAxMC4gVGhpcyBleGVyY2lzZSBpbnZvbHZlcyB0aGUgQm9zdG9uIGhvdXNpbmcgZGF0YSBzZXQuDQoNCiMjIyMjIGEuIFRvIGJlZ2luLCBsb2FkIGluIHRoZSBCb3N0b24gZGF0YSBzZXQuIFRoZSBCb3N0b24gZGF0YSBzZXQgaXMgcGFydCBvZiB0aGUgTUFTUyBsaWJyYXJ5IGluIFIuDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCm5yb3coQm9zdG9uKQ0KbmNvbChCb3N0b24pDQpjb2xuYW1lcyhCb3N0b24pDQojIExhIGF5dWRhIGRlIEJvc3RvbiAocGFydGUgZGUgTUFTUykgY29udGllbmUgbGFzIGRlc2NyaXBjaW9uZXMNCj9Cb3N0b24NCmBgYA0KDQojIyMjIyBiLiBNYWtlIHNvbWUgcGFpcndpc2Ugc2NhdHRlcnBsb3RzIG9mIHRoZSBwcmVkaWN0b3JzIChjb2x1bW5zKSBpbiB0aGlzIGRhdGEgc2V0LiBEZXNjcmliZSB5b3VyIGZpbmRpbmdzLg0KYGBge3J9DQpwYWlycyhCb3N0b25bLC1jKDQpXSkNCmBgYA0KDQpFbnRyZSBtYXMgaW5kdXN0cmlhIGhheSwgbWFzIHByb2R1Y2Npb24gZGUgb3hpZG9zIGRlIG5pdHJvZ2Vubw0KYGBge3J9DQpwbG90KEJvc3RvbiRpbmR1cywgQm9zdG9uJG5veCkNCmBgYA0KDQpFbnRyZSBtYXMgY2VyY2EgZGUgbG9zIGNlbnRyb3MgZGUgZW1wbGVvLCBtYXMgYWx0YSBsYSBjb25jZW50cmFjaW9uIGRlIG94aWRvcyBkZSBuaXRyb2dlbm8NCmBgYHtyfQ0KcGxvdChCb3N0b24kZGlzLCBCb3N0b24kbm94KQ0KYGBgDQoNCiMjIyMjIGMuIEFyZSBhbnkgb2YgdGhlIHByZWRpY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHBlciBjYXBpdGEgY3JpbWUgcmF0ZT8gSWYgc28sIGV4cGxhaW4gdGhlIHJlbGF0aW9uc2hpcC4NCkVsIGNyaW1lbiBlcyBtYXMgYWx0byBlbiBsdWdhcmVzIGRvbmRlIGxhcyB2aXZpZW5kYXMgdmFsZW4gbWVub3MuDQpgYGB7cn0NCnBsb3QoQm9zdG9uJG1lZHYsIEJvc3RvbiRjcmltKQ0KYGBgDQoNCkRhIGxhIGltcHJlc2lvbiBxdWUgZWwgY3JpbWVuIGVzIGNvbWV0aWRvIHBvciBnZW50ZSBkZSBtYXlvciBlZGFkLiBIYXkgY3JpbWluYWxlcyBkZSA4MCBhIDEwMCBhbmlvcyBlbiBCb3N0b24/DQpgYGB7cn0NCnBsb3QoQm9zdG9uJGFnZSwgQm9zdG9uJGNyaW0pDQpgYGANCg0KIyMjIyMgZC4gRG8gYW55IG9mIHRoZSBzdWJ1cmJzIG9mIEJvc3RvbiBhcHBlYXIgdG8gaGF2ZSBwYXJ0aWN1bGFybHkgaGlnaCBjcmltZSByYXRlcz8gVGF4IHJhdGVzPyBQdXBpbC10ZWFjaGVyIHJhdGlvcz8gQ29tbWVudCBvbiB0aGUgcmFuZ2Ugb2YgZWFjaCBwcmVkaWN0b3IuDQoNCkxvcyBpbXB1ZXN0b3Mgbm8gcGFyZWNlbiBpbmZsdWlyLiBIYXkgdW5hIHRhc2EgZGUgaW1wdWVzdG9zIHF1ZSBlcyBsYSBtYXMgY29tdW4sIHkgaGF5IHRvZGEgY2FudGlkYWQgZGUgY3JpbWVuIGVuIGVzdGUgbHVnYXIuDQpgYGB7cn0NCnBsb3QoQm9zdG9uJHRheCwgQm9zdG9uJGNyaW0pDQpgYGANCg0KTGEgY2FudGlkYWQgZGUgYWx1bW5vcyBwb3IgbWFlc3RybyB0YW1wb2NvIHBhcmVjZSBpbmZsdWlyLg0KYGBge3J9DQpwbG90KEJvc3RvbiRwdHJhdGlvLCBCb3N0b24kY3JpbSkNCmBgYA0KDQpFbiBlbCBpbmNpc28gYW50ZXJpb3Igc2UgdmlvIHF1ZSBsb3MgbHVnYXJlcyBjb24gbWVub3IgdmFsb3IgZGUgdml2aWVuZGEgdGllbmVuIG1hcyBjcmltZW4uDQoNCg0KDQojIyMjIyBlLiBIb3cgbWFueSBvZiB0aGUgc3VidXJicyBpbiB0aGlzIGRhdGEgc2V0IGJvdW5kIHRoZSBDaGFybGVzIHJpdmVyPw0KYGBge3J9DQpzdW0oQm9zdG9uJGNoYXMgPT0gMSkNCmBgYA0KDQojIyMjIyBmLiBXaGF0IGlzIHRoZSBtZWRpYW4gcHVwaWwtdGVhY2hlciByYXRpbyBhbW9uZyB0aGUgdG93bnMgaW4gdGhpcyBkYXRhIHNldD8NCmBgYHtyfQ0KbWVkaWFuKEJvc3RvbiRwdHJhdGlvKQ0KYGBgDQoNCiMjIyMjIGcuIFdoaWNoIHN1YnVyYiBvZiBCb3N0b24gaGFzIGxvd2VzdCBtZWRpYW4gdmFsdWUgb2Ygb3duZXJvY2N1cGllZCBob21lcz8gV2hhdCBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgb3RoZXIgcHJlZGljdG9ycyBmb3IgdGhhdCBzdWJ1cmIsIGFuZCBob3cgZG8gdGhvc2UgdmFsdWVzIGNvbXBhcmUgdG8gdGhlIG92ZXJhbGwgcmFuZ2VzIGZvciB0aG9zZSBwcmVkaWN0b3JzPyBDb21tZW50IG9uIHlvdXIgZmluZGluZ3MuDQoNCmBgYHtyfQ0KbWlubWVkaWFuID0gbWluKEJvc3RvbiRtZWR2KQ0KQm9zdG9uW0Jvc3RvbiRtZWR2ID09IG1pbm1lZGlhbixdDQpzYXBwbHkoQm9zdG9uLCBtZWFuKQ0KYGBgDQpIYXkgZG9zIHN1YnVyYmlvcyBjb24gbWVkdiBkZSA1LiBObyBwYXJlY2VuIGJ1ZW5vcyBsdWdhcmVzIHBhcmEgdml2aXIsIGVsIGNyaW1lbiB5IGxhIGNvbnRhbWluYWNpb24gc29uIG1hcyBhbHRvcyBxdWUgZWwgcHJvbWVkaW8uDQoNCiMjIyMjIGcuIEluIHRoaXMgZGF0YSBzZXQsIGhvdyBtYW55IG9mIHRoZSBzdWJ1cmJzIGF2ZXJhZ2UgbW9yZSB0aGFuIHNldmVuIHJvb21zIHBlciBkd2VsbGluZz8gTW9yZSB0aGFuIGVpZ2h0IHJvb21zIHBlciBkd2VsbGluZz8gQ29tbWVudCBvbiB0aGUgc3VidXJicyB0aGF0IGF2ZXJhZ2UgbW9yZSB0aGFuIGVpZ2h0IHJvb21zIHBlciBkd2VsbGluZy4NCg0KYGBge3J9DQpucm93KEJvc3RvbltCb3N0b24kcm0+NyxdKQ0KbnJvdyhCb3N0b25bQm9zdG9uJHJtPjgsXSkNCmBgYA0KNjQgc3VidXJiaW9zIGNvbiBtYXMgZGUgNyBoYWJpdGFjaW9uZXMgZW4gcHJvbWVkaW87IDEzIGNvbiBtYXMgZGUgOCBoYWJpdGFjaW9uZXMuDQo=