Assumptions and Definitions

Assume that the relationship between \(X\) and \(Y\) is determined by a hypothetical model of the form:

\[Y = \beta_0 + \beta_1 X + \varepsilon\]

We collect a sample of paired observations \((x_i, y_i)\) to use as a training set. We used the training set to create a fitted model. The fitted model is an approximation of the hypothetical model, and can be written in either of the following (equivalent) forms:

\[\hat Y = \hat \beta_0 + \hat \beta_1 X\] \[Y = \hat \beta_0 + \hat \beta_1 X + \hat \varepsilon\]

Given a paired observation \(\left(x_i, y_i \right)\), the fitted value of y given \(x_i\) is given by:

\[\hat y_i = \hat\beta_0 + \hat\beta_1 x_i\]

The residual associated with the observation is given by:

\[\hat \varepsilon_i = y_i - \hat y_i\]

Least Squares Regression

we will select our fitted model \(\hat Y = \hat \beta_0 + \hat \beta_1 X\) by choosing parameter estimates \(\hat\beta_0\) and \(\hat\beta_1\) so that the following quantities are minimized on the training set:

\[SSE = \sum\limits_{i=1}^n \hat \varepsilon_i^2 \hspace{2 em} MSE = \frac{1}{n}\sum\limits_{i=1}^n \hat \varepsilon_i^2\]

At present, we will work with \(SSE\). To emphasize that \(SSE\) is a function of the proposed parameter estimates \(\hat\beta_0\) and \(\hat\beta_1\), we sometimes write:

\[SSE\left ( \hat\beta_0, \hat\beta_1 \right) = \sum\limits_{i=1}^n \hat \varepsilon_i^2 = \sum\limits_{i=1}^n \left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right) ^2\] ### Preliminary Derivations

Before we derive the optimal values for our parameter estimates, we need to establish two preliminary results. These results now will make our derivation of \(\hat\beta_0\) and \(\hat\beta_1\) go a bit smoother. Assume that we have a sample of \(n\) paired observations \((x_i, y_i)\). We define the quantities \(S_{XX}\) and \(S_{XY}\) as follows:

\[S_{XX} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)^2\] \[S_{XY} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)\left(y_i - \bar y \right)\] Notice that we can rewrite the expression for \(SXY\) as follows:

\[S_{XY} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)\left(y_i - \bar y \right) = \sum\limits_{i=1}^n \left(x_i y_i - \bar x y_i - \bar y x_i + \bar x \bar y \right) \] \[= \sum\limits_{i=1}^n x_i y_i - \bar x \sum\limits_{i=1}^n y_i - \bar y \sum\limits_{i=1}^n x_i + \sum\limits_{i=1}^n\bar x \bar y\] \[ = \sum\limits_{i=1}^n x_i y_i - n\bar x \bar y - n\bar y \bar x + n\bar x \bar y = \sum\limits_{i=1}^n x_i y_i - n\bar x \bar y \]

In summary, we have shown that: \[S_{XY} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)\left(y_i - \bar y \right) = \sum\limits_{i=1}^n x_i y_i - n\bar x \bar y\] A very similar argument shows that: \[S_{XX} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)^2 = \sum\limits_{i=1}^n x_i^2 - n\bar x^2\] We will need both of these expressions in the near future.

Derivation of Parameter Estimates

We will now derive formulas for \(\hat\beta_0\) and \(\hat\beta_1\) that will minimize \(SSE\left ( \hat\beta_0, \hat\beta_1 \right)\). To do this, we will need to differentiate this function with respect to both \(\hat\beta_0\) and \(\hat\beta_1\), and then set the resulting expressions to 0.

\[\frac{\partial}{\partial\hat\beta_0} SSE\left ( \hat\beta_0, \hat\beta_1 \right) = -2 \sum\limits_{i=1}^n \left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right)\] \[\frac{\partial}{\partial\hat\beta_1} SSE\left ( \hat\beta_0, \hat\beta_1 \right) = -2 \sum\limits_{i=1}^n x_i\left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right)\]

Setting these two expressions to zero and dividing both sides by -2, we get:

\[\sum\limits_{i=1}^n \left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right) = 0\] \[\sum\limits_{i=1}^n x_i\left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right) = 0\]

The two equations above are referred to as the normal equations. We need to solve these equations for \(\hat\beta_0\) and \(\hat\beta_1\).

Notice that we can rewrite the first normal equation as follows:

\[\sum\limits_{i=1}^n y_i - \sum\limits_{i=1}^n\hat\beta_0 - \sum\limits_{i=1}^n\hat\beta_1 x_i = 0\]

\[n \bar y - n\hat\beta_0 -n \hat\beta_1 \bar x = 0\] \[\hat\beta_0 = \bar y - \hat\beta_1 \bar x\]

We will now work on the second normal equation:

\[\sum\limits_{i=1}^n \left(x_i y_i - \hat\beta_0 x_i - \hat\beta_1 x_i^2 \right) = 0\] \[ \sum\limits_{i=1}^n x_i y_i - \sum\limits_{i=1}^n \hat\beta_0 x_i - \sum\limits_{i=1}^n \hat\beta_1 x_i^2 = 0\] \[ \sum\limits_{i=1}^n x_i y_i - n\bar x \hat\beta_0 - \hat\beta_1\sum\limits_{i=1}^n x_i^2 = 0\] \[ n \bar x \hat\beta_0 + \hat\beta_1\sum\limits_{i=1}^n x_i^2 = \sum\limits_{i=1}^n x_i y_i\]

When working with the first normal equation above, we showed that \(\hat\beta_0 = \bar y - \hat\beta_1 \bar x\). We use this expression to substitute out \(\hat\beta_0\) in the last expression we derived from the second normal equation.

\[ n \bar x \left(\bar y - \hat\beta_1 \bar x \right) + \hat\beta_1\sum\limits_{i=1}^n x_i^2 = \sum\limits_{i=1}^n x_i y_i\] \[ n \bar x \bar y - n \hat\beta_1 \bar x^2 + \hat\beta_1\sum\limits_{i=1}^n x_i^2 = \sum\limits_{i=1}^n x_i y_i\]

Collecting the \(\hat\beta_1\) terms together gives:

\[ \hat\beta_1 \left( \sum\limits_{i=1}^n x_i^2 - n \bar x^2 \right) = \sum\limits_{i=1}^n x_i y_i - n \bar x \bar y\] Solving for \(\hat\beta_1\) yields:

\[ \hat\beta_1 = \frac{\sum\limits_{i=1}^n x_i y_i - n \bar x \bar y}{\sum\limits_{i=1}^n x_i^2 - n \bar x^2}\] Applying the results from our “preliminaries” section above, we conclude that:

\[\hat\beta_1= \frac{S_{XY}}{S_{XX}} \hspace{20px} \mathrm{and} \hspace{20px}\hat\beta_0 = \bar y - \hat\beta_1 \bar x\]

This provides us with formulas for the parameter estimates that will result in \(SSE\) being minimized.

Additional Comments

Alternate form for \(\hat\beta_1\)

There are many different ways to write the formula for \(\hat\beta_1\). One commonly encountered formula is \(\hat\beta_1 = \frac{\mathrm{cov}[X,Y]}{s_X^2}\). This formula can be derived from our previous formula for \(\hat\beta_1\) by multiplying the top and bottom of the expression by \(1/n\).

Normal Equations

Notice that the the normal equations:

\[\sum\limits_{i=1}^n \left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right) = 0 \hspace{10px} \mathrm{and} \hspace{10px}\sum\limits_{i=1}^n x_i\left( y_i - \hat\beta_0 - \hat\beta_1 x_i \right) = 0\]

can be written as:

\[\sum\limits_{i=1}^n \hat \varepsilon_i = 0\hspace{10px} \mathrm{and} \hspace{10px}\sum\limits_{i=1}^n x_i \hat \varepsilon_i = 0\]

These versions of the normal equations will be useful to use in deriving certain results in the future.

Sample Means

Recall that our formula for the estimate of the intercept was given by \(\hat\beta_0 = \bar y - \hat\beta_1 \bar x\). We can rewrite this equation as \(\bar y = \hat\beta_0 - \hat\beta_1 \bar x\). This demonstrates that the point \((\bar x, \bar y)\) lies on the least squares regression line.

Summary

Given a sample of \(n\) paired observations \((x_i, y_i)\), we define \(S_{XX}\) and \(S_{XY}\) as follows: \[S_{XX} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)^2\] \[S_{XY} = \sum\limits_{i=1}^n \left(x_i - \bar x \right)\left(y_i - \bar y \right)\]

The least squares regression line \(\hat y = \hat\beta_0 + \hat\beta_1 x\) is obtained by using the following parameter estimates:

\[\hat\beta_1= \frac{S_{XY}}{S_{XX}} = \frac{\mathrm{cov}[X,Y]}{s_X^2} \hspace{20px} \mathrm{and} \hspace{20px}\hat\beta_0 = \bar y - \hat\beta_1 \bar x\]

The least squares regression line satisfies the following properties:

  1. \(SSE = \sum\limits_{i=1}^n \hat \varepsilon_i^2\) is minimized.

  2. \(\sum\limits_{i=1}^n \hat \varepsilon_i = 0\hspace{5px}\) and \(\hspace{5px}\sum\limits_{i=1}^n x_i \hat \varepsilon_i = 0\)

  3. The line passes through the point \((\bar x, \bar y)\).

LS0tDQp0aXRsZTogIkxlc3NvbiAzLjEuYSAtIERlcml2YXRpb24gb2YgUGFyYW1ldGVyIEVzdGltYXRlcyINCmF1dGhvcjogIlJvYmJpZSBCZWFuZSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQotLS0NCg0KDQojIyMgKipBc3N1bXB0aW9ucyBhbmQgRGVmaW5pdGlvbnMqKg0KDQpBc3N1bWUgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gJFgkIGFuZCAkWSQgaXMgZGV0ZXJtaW5lZCBieSBhICoqaHlwb3RoZXRpY2FsIG1vZGVsKiogb2YgdGhlIGZvcm06IA0KDQokJFkgPSBcYmV0YV8wICsgXGJldGFfMSBYICsgXHZhcmVwc2lsb24kJA0KDQpXZSBjb2xsZWN0IGEgc2FtcGxlIG9mIHBhaXJlZCBvYnNlcnZhdGlvbnMgJCh4X2ksIHlfaSkkIHRvIHVzZSBhcyBhICoqdHJhaW5pbmcgc2V0KiouIFdlIHVzZWQgdGhlIHRyYWluaW5nIHNldCB0byBjcmVhdGUgYSAqKmZpdHRlZCBtb2RlbCoqLiBUaGUgZml0dGVkIG1vZGVsIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGh5cG90aGV0aWNhbCBtb2RlbCwgYW5kIGNhbiBiZSB3cml0dGVuIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIChlcXVpdmFsZW50KSBmb3JtczoNCg0KDQokJFxoYXQgWSA9IFxoYXQgXGJldGFfMCArIFxoYXQgXGJldGFfMSBYJCQNCiQkWSA9IFxoYXQgXGJldGFfMCArIFxoYXQgXGJldGFfMSBYICsgXGhhdCBcdmFyZXBzaWxvbiQkDQoNCg0KR2l2ZW4gYSBwYWlyZWQgb2JzZXJ2YXRpb24gJFxsZWZ0KHhfaSwgeV9pIFxyaWdodCkkLCB0aGUgKipmaXR0ZWQgdmFsdWUgb2YgeSBnaXZlbiAkeF9pJCoqIGlzIGdpdmVuIGJ5OiANCg0KJCRcaGF0IHlfaSA9IFxoYXRcYmV0YV8wICsgXGhhdFxiZXRhXzEgeF9pJCQNCg0KDQpUaGUgKipyZXNpZHVhbCoqIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JzZXJ2YXRpb24gaXMgZ2l2ZW4gYnk6DQoNCiQkXGhhdCBcdmFyZXBzaWxvbl9pID0geV9pIC0gXGhhdCB5X2kkJA0KDQojIyMgKipMZWFzdCBTcXVhcmVzIFJlZ3Jlc3Npb24qKg0KDQp3ZSB3aWxsIHNlbGVjdCBvdXIgZml0dGVkIG1vZGVsICRcaGF0IFkgPSBcaGF0IFxiZXRhXzAgKyBcaGF0IFxiZXRhXzEgWCQgYnkgY2hvb3NpbmcgcGFyYW1ldGVyIGVzdGltYXRlcyAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBxdWFudGl0aWVzIGFyZSBtaW5pbWl6ZWQgb24gdGhlIHRyYWluaW5nIHNldDoNCg0KDQokJFNTRSA9IFxzdW1cbGltaXRzX3tpPTF9Xm4gXGhhdCBcdmFyZXBzaWxvbl9pXjIgXGhzcGFjZXsyIGVtfSBNU0UgPSBcZnJhY3sxfXtufVxzdW1cbGltaXRzX3tpPTF9Xm4gXGhhdCBcdmFyZXBzaWxvbl9pXjIkJA0KDQpBdCBwcmVzZW50LCB3ZSB3aWxsIHdvcmsgd2l0aCAkU1NFJC4gVG8gZW1waGFzaXplIHRoYXQgJFNTRSQgaXMgYSBmdW5jdGlvbiBvZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVyIGVzdGltYXRlcyAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkLCB3ZSBzb21ldGltZXMgd3JpdGU6DQoNCiQkU1NFXGxlZnQgKCBcaGF0XGJldGFfMCwgXGhhdFxiZXRhXzEgXHJpZ2h0KSA9IFxzdW1cbGltaXRzX3tpPTF9Xm4gXGhhdCBcdmFyZXBzaWxvbl9pXjIgPSBcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KCB5X2kgLSBcaGF0XGJldGFfMCAtIFxoYXRcYmV0YV8xIHhfaSBccmlnaHQpIF4yJCQNCiMjIyAqKlByZWxpbWluYXJ5IERlcml2YXRpb25zKioNCg0KQmVmb3JlIHdlIGRlcml2ZSB0aGUgb3B0aW1hbCB2YWx1ZXMgZm9yIG91ciBwYXJhbWV0ZXIgZXN0aW1hdGVzLCB3ZSBuZWVkIHRvIGVzdGFibGlzaCB0d28gcHJlbGltaW5hcnkgcmVzdWx0cy4gVGhlc2UgcmVzdWx0cyBub3cgd2lsbCBtYWtlIG91ciBkZXJpdmF0aW9uIG9mICRcaGF0XGJldGFfMCQgYW5kICRcaGF0XGJldGFfMSQgZ28gYSBiaXQgc21vb3RoZXIuIEFzc3VtZSB0aGF0IHdlIGhhdmUgYSBzYW1wbGUgb2YgJG4kIHBhaXJlZCBvYnNlcnZhdGlvbnMgJCh4X2ksIHlfaSkkLiBXZSBkZWZpbmUgdGhlIHF1YW50aXRpZXMgJFNfe1hYfSQgYW5kICRTX3tYWX0kIGFzIGZvbGxvd3M6DQoNCiQkU197WFh9ID0gXHN1bVxsaW1pdHNfe2k9MX1ebiBcbGVmdCh4X2kgLSBcYmFyIHggXHJpZ2h0KV4yJCQNCiQkU197WFl9ID0gXHN1bVxsaW1pdHNfe2k9MX1ebiBcbGVmdCh4X2kgLSBcYmFyIHggXHJpZ2h0KVxsZWZ0KHlfaSAtIFxiYXIgeSBccmlnaHQpJCQNCk5vdGljZSB0aGF0IHdlIGNhbiByZXdyaXRlIHRoZSBleHByZXNzaW9uIGZvciAkU1hZJCBhcyBmb2xsb3dzOg0KDQokJFNfe1hZfSA9IFxzdW1cbGltaXRzX3tpPTF9Xm4gXGxlZnQoeF9pIC0gXGJhciB4IFxyaWdodClcbGVmdCh5X2kgLSBcYmFyIHkgXHJpZ2h0KQ0KPSBcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KHhfaSB5X2kgLSBcYmFyIHggeV9pIC0gXGJhciB5IHhfaSArIFxiYXIgeCBcYmFyIHkgXHJpZ2h0KQ0KJCQNCiQkPSBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kgLSBcYmFyIHggXHN1bVxsaW1pdHNfe2k9MX1ebiB5X2kgLSBcYmFyIHkgXHN1bVxsaW1pdHNfe2k9MX1ebiAgeF9pICsgXHN1bVxsaW1pdHNfe2k9MX1eblxiYXIgeCBcYmFyIHkkJA0KJCQNCj0gXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2kgeV9pIC0gblxiYXIgeCBcYmFyIHkgLSBuXGJhciB5IFxiYXIgeCArIG5cYmFyIHggXGJhciB5DQo9IFxzdW1cbGltaXRzX3tpPTF9Xm4geF9pIHlfaSAtIG5cYmFyIHggXGJhciB5DQokJA0KDQpJbiBzdW1tYXJ5LCB3ZSBoYXZlIHNob3duIHRoYXQ6IA0KJCRTX3tYWX0gPSBcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KHhfaSAtIFxiYXIgeCBccmlnaHQpXGxlZnQoeV9pIC0gXGJhciB5IFxyaWdodCkgPSBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kgLSBuXGJhciB4IFxiYXIgeSQkDQpBIHZlcnkgc2ltaWxhciBhcmd1bWVudCBzaG93cyB0aGF0Og0KJCRTX3tYWH0gPSBcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KHhfaSAtIFxiYXIgeCBccmlnaHQpXjIgPSBcc3VtXGxpbWl0c197aT0xfV5uIHhfaV4yIC0gblxiYXIgeF4yJCQNCldlIHdpbGwgbmVlZCBib3RoIG9mIHRoZXNlIGV4cHJlc3Npb25zIGluIHRoZSBuZWFyIGZ1dHVyZS4NCg0KIyMjICoqRGVyaXZhdGlvbiBvZiBQYXJhbWV0ZXIgRXN0aW1hdGVzKioNCg0KV2Ugd2lsbCBub3cgZGVyaXZlIGZvcm11bGFzIGZvciAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkIHRoYXQgd2lsbCBtaW5pbWl6ZSAkU1NFXGxlZnQgKCBcaGF0XGJldGFfMCwgXGhhdFxiZXRhXzEgXHJpZ2h0KSQuIFRvIGRvIHRoaXMsIHdlIHdpbGwgbmVlZCB0byBkaWZmZXJlbnRpYXRlIHRoaXMgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIGJvdGggJFxoYXRcYmV0YV8wJCBhbmQgJFxoYXRcYmV0YV8xJCwgYW5kIHRoZW4gc2V0IHRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbnMgdG8gMC4gDQoNCg0KJCRcZnJhY3tccGFydGlhbH17XHBhcnRpYWxcaGF0XGJldGFfMH0gIFNTRVxsZWZ0ICggXGhhdFxiZXRhXzAsIFxoYXRcYmV0YV8xIFxyaWdodCkgPSAtMiBcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KCB5X2kgLSBcaGF0XGJldGFfMCAtIFxoYXRcYmV0YV8xIHhfaSBccmlnaHQpJCQNCiQkXGZyYWN7XHBhcnRpYWx9e1xwYXJ0aWFsXGhhdFxiZXRhXzF9ICBTU0VcbGVmdCAoIFxoYXRcYmV0YV8wLCBcaGF0XGJldGFfMSBccmlnaHQpID0gLTIgXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2lcbGVmdCggeV9pIC0gXGhhdFxiZXRhXzAgLSBcaGF0XGJldGFfMSB4X2kgXHJpZ2h0KSQkDQoNCg0KU2V0dGluZyB0aGVzZSB0d28gZXhwcmVzc2lvbnMgdG8gemVybyBhbmQgZGl2aWRpbmcgYm90aCBzaWRlcyBieSAtMiwgd2UgZ2V0OiANCg0KDQokJFxzdW1cbGltaXRzX3tpPTF9Xm4gXGxlZnQoIHlfaSAtIFxoYXRcYmV0YV8wIC0gXGhhdFxiZXRhXzEgeF9pIFxyaWdodCkgPSAwJCQNCiQkXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2lcbGVmdCggeV9pIC0gXGhhdFxiZXRhXzAgLSBcaGF0XGJldGFfMSB4X2kgXHJpZ2h0KSA9IDAkJA0KDQoNClRoZSB0d28gZXF1YXRpb25zIGFib3ZlIGFyZSByZWZlcnJlZCB0byBhcyB0aGUgKipub3JtYWwgZXF1YXRpb25zKiouIFdlIG5lZWQgdG8gc29sdmUgdGhlc2UgZXF1YXRpb25zIGZvciAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkLg0KDQpOb3RpY2UgdGhhdCB3ZSBjYW4gcmV3cml0ZSB0aGUgZmlyc3Qgbm9ybWFsIGVxdWF0aW9uIGFzIGZvbGxvd3M6IA0KDQoNCiQkXHN1bVxsaW1pdHNfe2k9MX1ebiB5X2kgLSBcc3VtXGxpbWl0c197aT0xfV5uXGhhdFxiZXRhXzAgLSBcc3VtXGxpbWl0c197aT0xfV5uXGhhdFxiZXRhXzEgeF9pID0gMCQkDQoNCiQkbiBcYmFyIHkgLSBuXGhhdFxiZXRhXzAgLW4gXGhhdFxiZXRhXzEgXGJhciB4ID0gMCQkDQokJFxoYXRcYmV0YV8wID0gXGJhciB5IC0gXGhhdFxiZXRhXzEgXGJhciB4JCQNCg0KDQpXZSB3aWxsIG5vdyB3b3JrIG9uIHRoZSBzZWNvbmQgbm9ybWFsIGVxdWF0aW9uOg0KDQoNCiQkXHN1bVxsaW1pdHNfe2k9MX1ebiBcbGVmdCh4X2kgeV9pIC0gXGhhdFxiZXRhXzAgeF9pIC0gXGhhdFxiZXRhXzEgeF9pXjIgXHJpZ2h0KSA9IDAkJA0KJCQgXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2kgeV9pIC0gXHN1bVxsaW1pdHNfe2k9MX1ebiBcaGF0XGJldGFfMCB4X2kgLSBcc3VtXGxpbWl0c197aT0xfV5uIFxoYXRcYmV0YV8xIHhfaV4yID0gMCQkDQokJCBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kgLSBuXGJhciB4IFxoYXRcYmV0YV8wIC0gXGhhdFxiZXRhXzFcc3VtXGxpbWl0c197aT0xfV5uIHhfaV4yID0gMCQkDQokJCBuIFxiYXIgeCBcaGF0XGJldGFfMCArIFxoYXRcYmV0YV8xXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2leMiA9ICBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kkJA0KDQoNCldoZW4gd29ya2luZyB3aXRoIHRoZSBmaXJzdCBub3JtYWwgZXF1YXRpb24gYWJvdmUsIHdlIHNob3dlZCB0aGF0ICRcaGF0XGJldGFfMCA9IFxiYXIgeSAtIFxoYXRcYmV0YV8xIFxiYXIgeCQuIFdlIHVzZSB0aGlzIGV4cHJlc3Npb24gdG8gc3Vic3RpdHV0ZSBvdXQgJFxoYXRcYmV0YV8wJCBpbiB0aGUgbGFzdCBleHByZXNzaW9uIHdlIGRlcml2ZWQgZnJvbSB0aGUgc2Vjb25kIG5vcm1hbCBlcXVhdGlvbi4gDQoNCiQkIG4gXGJhciB4IFxsZWZ0KFxiYXIgeSAtIFxoYXRcYmV0YV8xIFxiYXIgeCBccmlnaHQpICArIFxoYXRcYmV0YV8xXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2leMiA9ICBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kkJA0KJCQgbiBcYmFyIHggXGJhciB5IC0gbiBcaGF0XGJldGFfMSBcYmFyIHheMiArIFxoYXRcYmV0YV8xXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2leMiA9ICBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kkJA0KDQpDb2xsZWN0aW5nIHRoZSAkXGhhdFxiZXRhXzEkIHRlcm1zIHRvZ2V0aGVyIGdpdmVzOg0KDQokJCBcaGF0XGJldGFfMSBcbGVmdCggXHN1bVxsaW1pdHNfe2k9MX1ebiB4X2leMiAtIG4gXGJhciB4XjIgXHJpZ2h0KSA9ICBcc3VtXGxpbWl0c197aT0xfV5uIHhfaSB5X2kgLSBuIFxiYXIgeCBcYmFyIHkkJA0KU29sdmluZyBmb3IgJFxoYXRcYmV0YV8xJCB5aWVsZHM6DQoNCiQkIFxoYXRcYmV0YV8xICA9IFxmcmFje1xzdW1cbGltaXRzX3tpPTF9Xm4geF9pIHlfaSAtIG4gXGJhciB4IFxiYXIgeX17XHN1bVxsaW1pdHNfe2k9MX1ebiB4X2leMiAtIG4gXGJhciB4XjJ9JCQNCkFwcGx5aW5nIHRoZSByZXN1bHRzIGZyb20gb3VyICJwcmVsaW1pbmFyaWVzIiBzZWN0aW9uIGFib3ZlLCB3ZSBjb25jbHVkZSB0aGF0Og0KDQokJFxoYXRcYmV0YV8xPSBcZnJhY3tTX3tYWX19e1Nfe1hYfX0gXGhzcGFjZXsyMHB4fSBcbWF0aHJte2FuZH0gXGhzcGFjZXsyMHB4fVxoYXRcYmV0YV8wID0gXGJhciB5IC0gXGhhdFxiZXRhXzEgXGJhciB4JCQNCg0KVGhpcyBwcm92aWRlcyB1cyB3aXRoIGZvcm11bGFzIGZvciB0aGUgcGFyYW1ldGVyIGVzdGltYXRlcyB0aGF0IHdpbGwgcmVzdWx0IGluICRTU0UkIGJlaW5nIG1pbmltaXplZC4gDQoNCiMjIyAqKkFkZGl0aW9uYWwgQ29tbWVudHMqKg0KDQoqKkFsdGVybmF0ZSBmb3JtIGZvciAkXGhhdFxiZXRhXzEkKioNCg0KVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHdheXMgdG8gd3JpdGUgdGhlIGZvcm11bGEgZm9yICRcaGF0XGJldGFfMSQuIE9uZSBjb21tb25seSBlbmNvdW50ZXJlZCBmb3JtdWxhIGlzICRcaGF0XGJldGFfMSA9IFxmcmFje1xtYXRocm17Y292fVtYLFldfXtzX1heMn0kLiBUaGlzIGZvcm11bGEgY2FuIGJlIGRlcml2ZWQgZnJvbSBvdXIgcHJldmlvdXMgZm9ybXVsYSBmb3IgJFxoYXRcYmV0YV8xJCBieSBtdWx0aXBseWluZyB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGV4cHJlc3Npb24gYnkgJDEvbiQuDQo8L2JyPg0KPC9icj4NCg0KIyMjICoqTm9ybWFsIEVxdWF0aW9ucyoqDQoNCk5vdGljZSB0aGF0IHRoZSB0aGUgbm9ybWFsIGVxdWF0aW9uczoNCg0KJCRcc3VtXGxpbWl0c197aT0xfV5uIFxsZWZ0KCB5X2kgLSBcaGF0XGJldGFfMCAtIFxoYXRcYmV0YV8xIHhfaSBccmlnaHQpID0gMCBcaHNwYWNlezEwcHh9IFxtYXRocm17YW5kfSBcaHNwYWNlezEwcHh9XHN1bVxsaW1pdHNfe2k9MX1ebiB4X2lcbGVmdCggeV9pIC0gXGhhdFxiZXRhXzAgLSBcaGF0XGJldGFfMSB4X2kgXHJpZ2h0KSA9IDAkJA0KDQoNCmNhbiBiZSB3cml0dGVuIGFzOg0KDQokJFxzdW1cbGltaXRzX3tpPTF9Xm4gXGhhdCBcdmFyZXBzaWxvbl9pID0gMFxoc3BhY2V7MTBweH0gXG1hdGhybXthbmR9IFxoc3BhY2V7MTBweH1cc3VtXGxpbWl0c197aT0xfV5uIHhfaSBcaGF0IFx2YXJlcHNpbG9uX2kgPSAwJCQNCg0KDQpUaGVzZSB2ZXJzaW9ucyBvZiB0aGUgbm9ybWFsIGVxdWF0aW9ucyB3aWxsIGJlIHVzZWZ1bCB0byB1c2UgaW4gZGVyaXZpbmcgY2VydGFpbiByZXN1bHRzIGluIHRoZSBmdXR1cmUuIA0KPC9icj4NCjwvYnI+DQoNCiMjIyAqKlNhbXBsZSBNZWFucyoqDQoNClJlY2FsbCB0aGF0IG91ciBmb3JtdWxhIGZvciB0aGUgZXN0aW1hdGUgb2YgdGhlIGludGVyY2VwdCB3YXMgZ2l2ZW4gYnkgJFxoYXRcYmV0YV8wID0gXGJhciB5IC0gXGhhdFxiZXRhXzEgXGJhciB4JC4gV2UgY2FuIHJld3JpdGUgdGhpcyBlcXVhdGlvbiBhcyAkXGJhciB5ID0gXGhhdFxiZXRhXzAgLSBcaGF0XGJldGFfMSBcYmFyIHgkLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGF0IHRoZSBwb2ludCAkKFxiYXIgeCwgXGJhciB5KSQgbGllcyBvbiB0aGUgbGVhc3Qgc3F1YXJlcyByZWdyZXNzaW9uIGxpbmUuIA0KDQojIyMgKipTdW1tYXJ5KioNCg0KR2l2ZW4gYSBzYW1wbGUgb2YgJG4kIHBhaXJlZCBvYnNlcnZhdGlvbnMgJCh4X2ksIHlfaSkkLCB3ZSBkZWZpbmUgJFNfe1hYfSQgYW5kICRTX3tYWX0kIGFzIGZvbGxvd3M6DQokJFNfe1hYfSA9IFxzdW1cbGltaXRzX3tpPTF9Xm4gXGxlZnQoeF9pIC0gXGJhciB4IFxyaWdodCleMiQkDQokJFNfe1hZfSA9IFxzdW1cbGltaXRzX3tpPTF9Xm4gXGxlZnQoeF9pIC0gXGJhciB4IFxyaWdodClcbGVmdCh5X2kgLSBcYmFyIHkgXHJpZ2h0KSQkDQoNClRoZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24gbGluZSAkXGhhdCB5ID0gXGhhdFxiZXRhXzAgKyBcaGF0XGJldGFfMSB4JCBpcyBvYnRhaW5lZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBlc3RpbWF0ZXM6DQoNCiQkXGhhdFxiZXRhXzE9IFxmcmFje1Nfe1hZfX17U197WFh9fSA9IFxmcmFje1xtYXRocm17Y292fVtYLFldfXtzX1heMn0gXGhzcGFjZXsyMHB4fSBcbWF0aHJte2FuZH0gXGhzcGFjZXsyMHB4fVxoYXRcYmV0YV8wID0gXGJhciB5IC0gXGhhdFxiZXRhXzEgXGJhciB4JCQNCg0KVGhlIGxlYXN0IHNxdWFyZXMgcmVncmVzc2lvbiBsaW5lIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQoNCjEuICRTU0UgPSBcc3VtXGxpbWl0c197aT0xfV5uIFxoYXQgXHZhcmVwc2lsb25faV4yJCBpcyBtaW5pbWl6ZWQuIA0KDQoyLiAkXHN1bVxsaW1pdHNfe2k9MX1ebiBcaGF0IFx2YXJlcHNpbG9uX2kgPSAwXGhzcGFjZXs1cHh9JCBhbmQgJFxoc3BhY2V7NXB4fVxzdW1cbGltaXRzX3tpPTF9Xm4geF9pIFxoYXQgXHZhcmVwc2lsb25faSA9IDAkDQoNCjMuIFRoZSBsaW5lIHBhc3NlcyB0aHJvdWdoIHRoZSBwb2ludCAkKFxiYXIgeCwgXGJhciB5KSQuDQoNCg0KDQoNCg==