Modelo de regresión lineal
El modelo de regresión lineal se usa para estudiar la relación entre una variable dependiente y una o más variables independientes.
La forma genérica de un modelo de regresión lineal es:
\[
\begin{equation}
y=f(x_1+x_2+\ldots+ x_k)+ \varepsilon
\end{equation}
\]
\[
=\beta_1x_1+\beta_2x_2+\ldots+ \beta_kx_k+\varepsilon
\]
donde:
\(y\) es la variable dependiente o explicada
\(\begin{equation} x_1+x_2+\ldots+ x_k \end{equation}\) son las variables independientes o explicativas
\(\beta_1+ \beta_2, \ldots, \beta_k\) son los parámetros
\(\begin{equation} f(x_1+x_2+\ldots+ x_k) \end{equation}\) es una funcion especificada por una teoria y es conocida como la ecuación de regresión poblacional de \(y\) sobre \(\begin{equation} x_1+x_2+\ldots+ x_k \end{equation}\). En este contexto
\(\varepsilon\) es el término perturbación aleatoria, llamado asi porque “perturba” una relación estable. La perturbacion surge por las siguientes razones:
La teoría especificará a las variables dependientes e independientes en el model; sin embargo, no siempre será obvio cúal será definida.
En un modelo teórico, no se puede captar toda la influencia en una variable económica dentro de un modelo, sin importar cuán elaborado sea. El factor neto, ya sea positivo o negativo, de estos factores omitidos se captura en la perturbación.
En un modelo empírico el factor contribuyente a la perturbación es el error de medición. Es fácil teorizar sobre las relaciones entre variables definidas con precisión. Otra muy distinta es obtener medidas precisasde estas variables
Ejemplo de modelo económico
LA FUNCIÓN DE CONSUMO DE KEYNES
- La teoría que plantea Keynes sugiere que existe una relación entre consumo (C) y el ingreso (Y) de una persona \[
C=f(X)
\] cuya forma funcional más básica es \[
C=\alpha+\beta X
\] A continuación, se muestra un tutorial tomado de YouTube que muestra la funcion de Keynes
Ejemplo de modelo econométrico
CAPACIDAD LABORAL Y PRODUCTIVIDAD DE LOS TRABAJADORES
- Analiza el efecto sobre la productividad de los trabajadores considerando los factores como la educacion, experiencia y la capacitación laboral.
Modelo econométrico \[
salario=\beta_0+\beta_1educ+\beta_2exper+\beta_3capacitación+\mu
\] donde:
salario: salario por hora
educ: años de escolaridad formal
exper: años de experiencia laboral
capacitación: semanas de capacitación laboral
Observación
El término de perturbación \(\mu\) comprende factores como habilidades innatas, calidad de la educación, antecedentes familiares y otros factores que influyen en el salario de una persona.
Representación del modelo econométrico
\[
Y_i = \beta_0 + \beta_1 x_{i1}+ \cdots+\beta_kx_{ik}+\varepsilon_i, \hspace{3mm} i=1,2, \dots , n
\] Para las \(n\) ecuaciones queda de la siguiente manera:
\[
Y_1= \beta_0+ \beta_1 x_{11} + \cdots + \beta_k x_{1k} +\varepsilon_1
\]
\[
Y_2= \beta_0+ \beta_1 x_{21} + \cdots + \beta_k x_{2k} +\varepsilon_2
\] \[
\vdots
\]
\[
Y_n= \beta_0+ \beta_1 x_{n1} + \cdots + \beta_k x_{nk} +\varepsilon_n
\]
Matricialmente queda asi: \[
\begin{bmatrix}
Y_1\\ Y_2\\ \vdots \\ Y_n
\end{bmatrix}
=
\begin{bmatrix}
1 & x_{11} & \cdots & x_{1k} \\
1 & x_{21} & \cdots & x_{2k} \\
\vdots & \vdots & \vdots & \vdots \\
1 & x_{n1} & \cdots & x_{nk} \\
\end{bmatrix}
\begin{bmatrix}
\beta_0 \\
\beta_1 \\
\vdots \\
\beta_k
\end{bmatrix}
+
\begin{bmatrix}
\varepsilon_1 \\
\varepsilon_2 \\
\vdots \\
\varepsilon_n
\end{bmatrix}
\]
Supuestos del modelo de regresión lineal
Los supuestos que describen la forma del modeloy las relaciones entre sus partes e implican procedimientos apropiados de estimación e inferencia son los siguientes:
1)Linealidad del modelo de regresión
- El modelo especifica una relación lineal entre la variable \(y\) (regresando) y \(\begin{equation} x_1+x_2+\ldots+ x_k \end{equation}\) (regresores) \[
y=\beta_1x_1+\beta_2x_2+\beta_3x_3+\ldots+\beta_kx_k+\mu
\] Puede representarse vectorialmente como \[
y_i={x}'_i\pmb{\beta}+\varepsilon
\]
2)Exogeneidad de las variables independientes
Esto indica que el valor esperado de la perturbación en la i-ésima observación en la muestra no es una función de las K variables independeintes observables en ninguna j-ésima observación, incluida la i-ésima \[
E[\varepsilon_i|X_j]=E[\varepsilon_i|x_{j1},x_{j2},\ldots,x_{jk}]=0\hspace{10mm} i,j=1,2,\ldots, n
\] Esto significa que las variables independientes no guardan información útil para la predicción de \(\varepsilon_i\)
En otras palabras, se asume que la perturbación tiene valor esperado condicionado cero en cada observación.
\[
E[\varepsilon_i|X]=0
\]
3)Perturbaciones esféricas (Homocedasticidad y no Autocorrelación
- Una perturbación \(\varepsilon_i\) se denomina esférica cuando:
- Es Homocedástica, esto es, tiene la misma varianza finita \(\sigma^2\).
\[
var[\varepsilon_i|X]=\sigma^2,\hspace{10mm} para \quad i=1,2,\ldots, n
\]
- Y no está correlacionada con cualquier otra perturbación \(\varepsilon_j\)
\[
cov=[\varepsilon_i,\varepsilon_j|X]=0 \hspace{10mm} para \quad i\neq j
\]
4)Distribución normal
-Las perturbaciones estan normalmente distribuidas con media cero \[
E[\varepsilon|X]=0
\]
y varianza diagonal constante (perturbación esférica) \[
var[\varepsilon|X]=\sigma^2I~
\]
esto es \[
\varepsilon[X \sim N|0,\sigma^2]
\]
El supuesto de normalidad no es necesario para obtener muchos de los resultados que se utilizan en el análisis de regresión múltiple; sin embargo, permitirá obtener varios resultados estadísticos exactos, construir intervalos de confianza y estadísticos de pruebas.
Aplicacion
Se quiere encontrar la relacion entre el pbiper (PBI per capita) y lexp (espereanza de vida) a nivel mundial
setwd("E:/RMARKDOWN/clase4")
ejemplo=read_dta("lifeexp.dta")
theme_set(theme_bw())
ggplot(ejemplo, aes(x=pbiper, y=lexp)) + geom_point() + theme_light() + ggtitle ("Diagrama de dispersión: PBI per capita vs. Esperanza de vida nivel mundial")
## Warning: Removed 5 rows containing missing values (geom_point).

modelo=lm(lexp ~ pbiper, data = ejemplo)
summary(modelo)
##
## Call:
## lm(formula = lexp ~ pbiper, data = ejemplo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.5810 -1.3539 0.5005 2.1939 4.9889
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.945e+01 5.480e-01 126.735 < 2e-16 ***
## pbiper 3.234e-04 4.012e-05 8.061 3.45e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.36 on 61 degrees of freedom
## (5 observations deleted due to missingness)
## Multiple R-squared: 0.5158, Adjusted R-squared: 0.5079
## F-statistic: 64.98 on 1 and 61 DF, p-value: 3.452e-11
El modelo tiene un R2 de 0.51 y el coeficiente es significativo
Modelo estimado
\[\widehat{esperanzaVida}_i = \hat{\beta}_0 + \hat{\beta}_1 PBIpc_i= 60.94+ 0.000323 PBIpc_i\] Interpretación Si el PBIpc se incrementa el 1000 Um la esperanza de vida aumenta en 0.32 años
ggplot(ejemplo, aes(x=pbiper,y= lexp )) +
geom_point() +
geom_smooth(method='lm', formula= y ~ x, se=FALSE, col='tomato') +
theme_light()+ ggtitle ("Recta estimada")
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing missing values (geom_point).

LS0tDQp0aXRsZTogIkludHJvZHVjY2nDs24gYSBsYSBlY29ub21ldHLDrWEiDQphdXRob3I6ICJyb2RyaWdvIGNhcnJhc2NvIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCmxpYnJhcnkoZ2dwbG90MikNCg0KbGlicmFyeShsYXR0aWNlKQ0KDQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmxpYnJhcnkoaGF2ZW4pDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMgKipNb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwqKg0KRWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNlIHVzYSBwYXJhIGVzdHVkaWFyIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUgeSB1bmEgbyBtw6FzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gDQoNCkxhIGZvcm1hIGdlbsOpcmljYSBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgZXM6DQoNCiQkDQpcYmVnaW57ZXF1YXRpb259DQp5PWYoeF8xK3hfMitcbGRvdHMrIHhfaykrIFx2YXJlcHNpbG9uDQpcZW5ke2VxdWF0aW9ufQ0KJCQNCg0KJCQNCj1cYmV0YV8xeF8xK1xiZXRhXzJ4XzIrXGxkb3RzKyBcYmV0YV9reF9rK1x2YXJlcHNpbG9uDQokJA0KDQpkb25kZToNCg0KLSAgJHkkIGVzIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIG8gZXhwbGljYWRhDQoNCi0gICRcYmVnaW57ZXF1YXRpb259IHhfMSt4XzIrXGxkb3RzKyB4X2sgXGVuZHtlcXVhdGlvbn0kIHNvbiBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIG8gZXhwbGljYXRpdmFzDQoNCi0gICRcYmV0YV8xKyBcYmV0YV8yLCBcbGRvdHMsIFxiZXRhX2skIHNvbiBsb3MgcGFyw6FtZXRyb3MNCg0KLSAgJFxiZWdpbntlcXVhdGlvbn0gZih4XzEreF8yK1xsZG90cysgeF9rKSBcZW5ke2VxdWF0aW9ufSQgZXMgdW5hIGZ1bmNpb24gZXNwZWNpZmljYWRhIHBvciB1bmEgdGVvcmlhIHkgZXMgY29ub2NpZGEgY29tbyBsYSAqKmVjdWFjacOzbiBkZSByZWdyZXNpw7NuIHBvYmxhY2lvbmFsKiogZGUgJHkkIHNvYnJlICRcYmVnaW57ZXF1YXRpb259IHhfMSt4XzIrXGxkb3RzKyB4X2sgXGVuZHtlcXVhdGlvbn0kLiBFbiBlc3RlIGNvbnRleHRvDQoNCiAgIC0gICAkeSQgZXMgZWwgcmVncmVzYW5kbw0KICANCiAgIC0gICAkXGJlZ2lue2VxdWF0aW9ufSB4XzEreF8yK1xsZG90cysgeF9rIFxlbmR7ZXF1YXRpb259JCBzb24gbG9zIHJlZ3Jlc29yZXMgKG8gY292YXJpYWRvcykNCiAgIA0KLSAgJFx2YXJlcHNpbG9uJCBlcyBlbCB0w6lybWlubyAqKnBlcnR1cmJhY2nDs24qKiBhbGVhdG9yaWEsIGxsYW1hZG8gYXNpIHBvcnF1ZSAicGVydHVyYmEiIHVuYSByZWxhY2nDs24gZXN0YWJsZS4gTGEgcGVydHVyYmFjaW9uIHN1cmdlIHBvciBsYXMgc2lndWllbnRlcyByYXpvbmVzOg0KDQpMYSB0ZW9yw61hIGVzcGVjaWZpY2Fyw6EgYSBsYXMgdmFyaWFibGVzIGRlcGVuZGllbnRlcyBlIGluZGVwZW5kaWVudGVzIGVuIGVsIG1vZGVsOyBzaW4gZW1iYXJnbywgbm8gc2llbXByZSBzZXLDoSBvYnZpbyBjw7phbCBzZXLDoSBkZWZpbmlkYS4NCg0KICAgLSAgIEVuIHVuICoqbW9kZWxvIHRlw7NyaWNvKiosIG5vIHNlIHB1ZWRlIGNhcHRhciB0b2RhIGxhIGluZmx1ZW5jaWEgZW4gdW5hIHZhcmlhYmxlIGVjb27Ds21pY2EgZGVudHJvIGRlIHVuIG1vZGVsbywgc2luIGltcG9ydGFyIGN1w6FuIGVsYWJvcmFkbyBzZWEuIEVsIGZhY3RvciBuZXRvLCB5YSBzZWEgcG9zaXRpdm8gbyBuZWdhdGl2bywgZGUgZXN0b3MgZmFjdG9yZXMgb21pdGlkb3Mgc2UgY2FwdHVyYSBlbiBsYSBwZXJ0dXJiYWNpw7NuLg0KICAgDQogICAtICAgRW4gdW4gKiptb2RlbG8gZW1ww61yaWNvKiogZWwgZmFjdG9yIGNvbnRyaWJ1eWVudGUgYSBsYSBwZXJ0dXJiYWNpw7NuIGVzIGVsIGVycm9yIGRlIG1lZGljacOzbi4gRXMgZsOhY2lsIHRlb3JpemFyIHNvYnJlIGxhcyByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcyBkZWZpbmlkYXMgY29uIHByZWNpc2nDs24uIE90cmEgbXV5IGRpc3RpbnRhIGVzIG9idGVuZXIgbWVkaWRhcyBwcmVjaXNhc2RlIGVzdGFzIHZhcmlhYmxlc1teX3AwMV0NCiAgIA0KICAgDQpbXl9wMDFdOlBvciBlamVtcGxvLCBsYSBkaWZpY3VsdGFkIGRlIG9idGVuZXIgbWVkaWRhcyByYXpvbmFibGVzIGRlIGdhbmFuY2lhcywgdGFzYSBkZSBpbnRlcsOpcywgYWNjaW9uZXMgZGUgY2FwaXRhbCBvIGZsdWpvcyBkZSBzZXJ2aWNpb3MgZGUgYWNjaW9uZXMgZGUgY2FwaXRhbCANCg0KDQojIyAqKkVqZW1wbG8gZGUgbW9kZWxvIGVjb27Ds21pY28qKg0KPHU+TEEgRlVOQ0nDk04gREUgQ09OU1VNTyBERSBLRVlORVM8L3U+DQoNCi0gIExhIHRlb3LDrWEgcXVlIHBsYW50ZWEgS2V5bmVzIHN1Z2llcmUgcXVlIGV4aXN0ZSB1bmEgcmVsYWNpw7NuIGVudHJlIGNvbnN1bW8gKEMpIHkgZWwgaW5ncmVzbyAoWSkgZGUgdW5hIHBlcnNvbmENCiQkIA0KQz1mKFgpDQokJA0KY3V5YSBmb3JtYSBmdW5jaW9uYWwgbcOhcyBiw6FzaWNhIGVzDQokJA0KQz1cYWxwaGErXGJldGEgWA0KJCQNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYSB1biB0dXRvcmlhbCB0b21hZG8gZGUgIFtZb3VUdWJlXShodHRwczovL3d3dy55b3V0dWJlLmNvbSkgcXVlIG11ZXN0cmEgbGEgZnVuY2lvbiBkZSBLZXluZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQplbWJlZF91cmwoImh0dHBzOi8veW91dHUuYmUvNnlxSGkwWlZMMTQiKSAlPiUgDQogIHVzZV9hbGlnbigiY2VudGVyIikNCmBgYA0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+DQoNCg0KIyMgKipFamVtcGxvIGRlIG1vZGVsbyBlY29ub23DqXRyaWNvKiogDQo8dT5DQVBBQ0lEQUQgTEFCT1JBTCBZIFBST0RVQ1RJVklEQUQgREUgTE9TIFRSQUJBSkFET1JFUzwvdT4NCg0KLSAgQW5hbGl6YSBlbCBlZmVjdG8gc29icmUgbGEgcHJvZHVjdGl2aWRhZCBkZSBsb3MgdHJhYmFqYWRvcmVzIGNvbnNpZGVyYW5kbyBsb3MgZmFjdG9yZXMgIGNvbW8gbGEgZWR1Y2FjaW9uLCBleHBlcmllbmNpYSB5IGxhIGNhcGFjaXRhY2nDs24gbGFib3JhbC4NCg0KKipNb2RlbG8gZWNvbm9tw6l0cmljbyoqDQokJA0Kc2FsYXJpbz1cYmV0YV8wK1xiZXRhXzFlZHVjK1xiZXRhXzJleHBlcitcYmV0YV8zY2FwYWNpdGFjacOzbitcbXUNCiQkDQpkb25kZToNCg0KLSAgc2FsYXJpbzogc2FsYXJpbyBwb3IgaG9yYQ0KDQotICBlZHVjOiBhw7FvcyBkZSBlc2NvbGFyaWRhZCBmb3JtYWwNCg0KLSAgZXhwZXI6IGHDsW9zIGRlIGV4cGVyaWVuY2lhIGxhYm9yYWwNCg0KLSAgY2FwYWNpdGFjacOzbjogc2VtYW5hcyBkZSBjYXBhY2l0YWNpw7NuIGxhYm9yYWwNCg0KKipPYnNlcnZhY2nDs24qKg0KDQpFbCB0w6lybWlubyBkZSBwZXJ0dXJiYWNpw7NuICRcbXUkIGNvbXByZW5kZSBmYWN0b3JlcyBjb21vICpoYWJpbGlkYWRlcyBpbm5hdGFzKiwgY2FsaWRhZCBkZSBsYSBlZHVjYWNpw7NuLCBhbnRlY2VkZW50ZXMgZmFtaWxpYXJlcyB5IG90cm9zIGZhY3RvcmVzIHF1ZSBpbmZsdXllbiBlbiBlbCBzYWxhcmlvIGRlIHVuYSBwZXJzb25hLg0KDQojIyAqKlJlcHJlc2VudGFjacOzbiBkZWwgbW9kZWxvIGVjb25vbcOpdHJpY28qKg0KJCQNCllfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfe2kxfSsgXGNkb3RzK1xiZXRhX2t4X3tpa30rXHZhcmVwc2lsb25faSwgIFxoc3BhY2V7M21tfSAgaT0xLDIsIFxkb3RzICAsIG4NCiQkDQpQYXJhIGxhcyAkbiQgZWN1YWNpb25lcyBxdWVkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOg0KDQokJA0KWV8xPSBcYmV0YV8wKyBcYmV0YV8xIHhfezExfSArIFxjZG90cyArIFxiZXRhX2sgeF97MWt9ICtcdmFyZXBzaWxvbl8xDQokJA0KDQokJA0KWV8yPSBcYmV0YV8wKyBcYmV0YV8xIHhfezIxfSArIFxjZG90cyArIFxiZXRhX2sgeF97Mmt9ICtcdmFyZXBzaWxvbl8yDQokJA0KJCQNClx2ZG90cw0KJCQNCg0KJCQNCllfbj0gXGJldGFfMCsgXGJldGFfMSB4X3tuMX0gKyBcY2RvdHMgKyBcYmV0YV9rIHhfe25rfSArXHZhcmVwc2lsb25fbg0KJCQNCg0KTWF0cmljaWFsbWVudGUgcXVlZGEgYXNpOg0KJCQNClxiZWdpbntibWF0cml4fSANCllfMVxcIFlfMlxcIFx2ZG90cyBcXCBZX24NClxlbmR7Ym1hdHJpeH0NCj0NClxiZWdpbntibWF0cml4fSANCjEgJiB4X3sxMX0gJiBcY2RvdHMgJiB4X3sxa30gXFwNCjEgJiB4X3syMX0gJiBcY2RvdHMgJiB4X3sya30gXFwNClx2ZG90cyAmICBcdmRvdHMgICYgIFx2ZG90cyAmICBcdmRvdHMgXFwNCjEgJiB4X3tuMX0gJiBcY2RvdHMgJiB4X3tua30gXFwNClxlbmR7Ym1hdHJpeH0NClxiZWdpbntibWF0cml4fQ0KXGJldGFfMCBcXA0KXGJldGFfMSBcXA0KXHZkb3RzIFxcDQpcYmV0YV9rDQpcZW5ke2JtYXRyaXh9DQorDQpcYmVnaW57Ym1hdHJpeH0NClx2YXJlcHNpbG9uXzEgXFwNClx2YXJlcHNpbG9uXzIgXFwNClx2ZG90cyBcXA0KXHZhcmVwc2lsb25fbg0KXGVuZHtibWF0cml4fQ0KJCQNCg0KIyMgKipTdXB1ZXN0b3MgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCoqDQpMb3Mgc3VwdWVzdG9zIHF1ZSBkZXNjcmliZW4gbGEgZm9ybWEgZGVsIG1vZGVsb3kgbGFzIHJlbGFjaW9uZXMgZW50cmUgc3VzIHBhcnRlcyBlIGltcGxpY2FuIHByb2NlZGltaWVudG9zIGFwcm9waWFkb3MgZGUgZXN0aW1hY2nDs24gZSBpbmZlcmVuY2lhIHNvbiBsb3Mgc2lndWllbnRlczoNCg0KMSk8dT5MaW5lYWxpZGFkIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbjwvdT4NCg0KLSAgRWwgbW9kZWxvIGVzcGVjaWZpY2EgdW5hICoqcmVsYWNpw7NuIGxpbmVhbCoqIGVudHJlIGxhIHZhcmlhYmxlICR5JCAocmVncmVzYW5kbykgeSAkXGJlZ2lue2VxdWF0aW9ufSB4XzEreF8yK1xsZG90cysgeF9rIFxlbmR7ZXF1YXRpb259JCAocmVncmVzb3JlcykNCiQkDQp5PVxiZXRhXzF4XzErXGJldGFfMnhfMitcYmV0YV8zeF8zK1xsZG90cytcYmV0YV9reF9rK1xtdQ0KJCQNClB1ZWRlIHJlcHJlc2VudGFyc2UgdmVjdG9yaWFsbWVudGUgY29tbw0KJCQNCnlfaT17eH0nX2lccG1ie1xiZXRhfStcdmFyZXBzaWxvbg0KJCQNCg0KMik8dT5FeG9nZW5laWRhZCBkZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzPC91Pg0KDQotICBFc3RvIGluZGljYSBxdWUgZWwgdmFsb3IgZXNwZXJhZG8gZGUgbGEgcGVydHVyYmFjacOzbiBlbiBsYSBpLcOpc2ltYSBvYnNlcnZhY2nDs24gZW4gbGEgbXVlc3RyYSBubyBlcyB1bmEgZnVuY2nDs24gZGUgbGFzIEsgdmFyaWFibGVzIGluZGVwZW5kZWludGVzIG9ic2VydmFibGVzIGVuIG5pbmd1bmEgai3DqXNpbWEgb2JzZXJ2YWNpw7NuLCBpbmNsdWlkYSBsYSBpLcOpc2ltYQ0KJCQNCkVbXHZhcmVwc2lsb25faXxYX2pdPUVbXHZhcmVwc2lsb25faXx4X3tqMX0seF97ajJ9LFxsZG90cyx4X3tqa31dPTBcaHNwYWNlezEwbW19IGksaj0xLDIsXGxkb3RzLCBuDQokJA0KRXN0byBzaWduaWZpY2EgcXVlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgbm8gZ3VhcmRhbiBpbmZvcm1hY2nDs24gw7p0aWwgcGFyYSBsYSBwcmVkaWNjacOzbiBkZSAkXHZhcmVwc2lsb25faSQNCg0KLSAgRW4gb3RyYXMgcGFsYWJyYXMsIHNlIGFzdW1lIHF1ZSBsYSBwZXJ0dXJiYWNpw7NuIHRpZW5lIHZhbG9yIGVzcGVyYWRvIGNvbmRpY2lvbmFkbyBjZXJvIGVuIGNhZGEgb2JzZXJ2YWNpw7NuLg0KDQokJA0KRVtcdmFyZXBzaWxvbl9pfFhdPTANCiQkDQoNCjMpPHU+UGVydHVyYmFjaW9uZXMgZXNmw6lyaWNhcyAoSG9tb2NlZGFzdGljaWRhZCB5IG5vIEF1dG9jb3JyZWxhY2nDs248L3U+DQoNCi0gIFVuYSBwZXJ0dXJiYWNpw7NuICRcdmFyZXBzaWxvbl9pJCBzZSBkZW5vbWluYSBlc2bDqXJpY2EgY3VhbmRvOg0KDQphKSAgRXMgKipIb21vY2Vkw6FzdGljYSoqLCBlc3RvIGVzLCB0aWVuZSBsYSBtaXNtYSB2YXJpYW56YSBmaW5pdGEgJFxzaWdtYV4yJC4NCiAgDQokJA0KdmFyW1x2YXJlcHNpbG9uX2l8WF09XHNpZ21hXjIsXGhzcGFjZXsxMG1tfSBwYXJhIFxxdWFkIGk9MSwyLFxsZG90cywgbg0KJCQNCiAgIA0KYikgIFkgKipubyBlc3TDoSBjb3JyZWxhY2lvbmFkYSoqIGNvbiBjdWFscXVpZXIgb3RyYSBwZXJ0dXJiYWNpw7NuICRcdmFyZXBzaWxvbl9qJA0KICANCiAgDQokJA0KY292PVtcdmFyZXBzaWxvbl9pLFx2YXJlcHNpbG9uX2p8WF09MCBcaHNwYWNlezEwbW19IHBhcmEgXHF1YWQgaVxuZXEgIGoNCiQkDQoNCjQpPHU+RGlzdHJpYnVjacOzbiBub3JtYWw8L3U+DQoNCi1MYXMgcGVydHVyYmFjaW9uZXMgZXN0YW4gKipub3JtYWxtZW50ZSBkaXN0cmlidWlkYXMqKiBjb24gbWVkaWEgY2Vybw0KJCQNCkVbXHZhcmVwc2lsb258WF09MA0KJCQNCg0KeSB2YXJpYW56YSBkaWFnb25hbCBjb25zdGFudGUgKHBlcnR1cmJhY2nDs24gZXNmw6lyaWNhKQ0KJCQNCnZhcltcdmFyZXBzaWxvbnxYXT1cc2lnbWFeMkl+DQokJA0KDQplc3RvIGVzIA0KJCQNClx2YXJlcHNpbG9uW1ggXHNpbSBOfDAsXHNpZ21hXjJdDQokJA0KDQpFbCBzdXB1ZXN0byBkZSAqKm5vcm1hbGlkYWQqKiBubyBlcyBuZWNlc2FyaW8gcGFyYSBvYnRlbmVyIG11Y2hvcyBkZSBsb3MgcmVzdWx0YWRvcyBxdWUgc2UgdXRpbGl6YW4gZW4gZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbcO6bHRpcGxlOyBzaW4gZW1iYXJnbywgcGVybWl0aXLDoSBvYnRlbmVyIHZhcmlvcyByZXN1bHRhZG9zIGVzdGFkw61zdGljb3MgZXhhY3RvcywgY29uc3RydWlyIGludGVydmFsb3MgZGUgY29uZmlhbnphIHkgZXN0YWTDrXN0aWNvcyBkZSBwcnVlYmFzLg0KDQoNCiMjICoqQXBsaWNhY2lvbioqDQpTZSBxdWllcmUgZW5jb250cmFyIGxhIHJlbGFjaW9uIGVudHJlIGVsIHBiaXBlciAoUEJJIHBlciBjYXBpdGEpIHkgbGV4cCAgKGVzcGVyZWFuemEgZGUgdmlkYSkgYSBuaXZlbCBtdW5kaWFsDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJyxjb2xsYXBzZT1UUlVFLGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldHdkKCJFOi9STUFSS0RPV04vY2xhc2U0IikNCmVqZW1wbG89cmVhZF9kdGEoImxpZmVleHAuZHRhIikNCg0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpnZ3Bsb3QoZWplbXBsbywgYWVzKHg9cGJpcGVyLCB5PWxleHApKSArICAgZ2VvbV9wb2ludCgpICsgdGhlbWVfbGlnaHQoKSArIGdndGl0bGUgKCJEaWFncmFtYSBkZSBkaXNwZXJzacOzbjogUEJJIHBlciBjYXBpdGEgdnMuIEVzcGVyYW56YSBkZSB2aWRhIG5pdmVsIG11bmRpYWwiKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWxvPWxtKGxleHAgfiBwYmlwZXIsIGRhdGEgPSBlamVtcGxvKQ0Kc3VtbWFyeShtb2RlbG8pDQpgYGANCioqRWwgbW9kZWxvIHRpZW5lIHVuIFIyIGRlIDAuNTEgeSBlbCBjb2VmaWNpZW50ZSBlcyBzaWduaWZpY2F0aXZvICoqDQoNCjx1Pk1vZGVsbyBlc3RpbWFkbzwvdT4NCg0KJCRcd2lkZWhhdHtlc3BlcmFuemFWaWRhfV9pID0gXGhhdHtcYmV0YX1fMCArIFxoYXR7XGJldGF9XzEgUEJJcGNfaT0gICA2MC45NCsgMC4wMDAzMjMgUEJJcGNfaSQkDQoqKkludGVycHJldGFjacOzbioqDQpTaSBlbCBQQklwYyBzZSBpbmNyZW1lbnRhIGVsIDEwMDAgVW0gbGEgZXNwZXJhbnphIGRlIHZpZGEgYXVtZW50YSBlbiAwLjMyIGHDsW9zDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJyxjb2xsYXBzZT1UUlVFLGZpZy5hbGlnbj0nY2VudGVyJ30NCmdncGxvdChlamVtcGxvLCBhZXMoeD1wYmlwZXIseT0gbGV4cCApKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgZm9ybXVsYT0geSB+IHgsIHNlPUZBTFNFLCBjb2w9J3RvbWF0bycpICsNCiAgdGhlbWVfbGlnaHQoKSsgZ2d0aXRsZSAoIlJlY3RhIGVzdGltYWRhIikNCmBgYA0KDQo=