1 Inferensi dalam Regresi Linier

Setelah membaca bagian ini, Anda akan dapat:

  • Memahami distribusi perkiraan regresi.
  • Membuat perkiraan interval untuk parameter regresi, respons rata-rata, dan prediksi.
  • Uji signifikansi regresi.

Bagian terakhir kita mendefinisikan model regresi linier sederhana, \[Y_i = \beta_0 + \beta_1 x_i + \epsilon_i\] dimana \(\epsilon_i \sim N(0, \sigma^2)\). Kita kemudian menggunakan observasi \((x_i, y_i)\) untuk \(i = 1, 2, \ldots n\) untuk mencari nilai \(\beta_0\) dan \(\beta_1\) yang diminimalkan \[f(\beta_0, \beta_1) = \sum_{i = 1}^{n}(y_i - (\beta_0 + \beta_1 x_i))^2.\] Kita menyebut nilai-nilai ini \(\hat {β}_0\) dan \(\hat {β}_1\), yang kita temukan \[\begin{aligned} \hat{\beta}_1 &= \frac{S_{xy}}{S_{xx}} = \frac{\sum_{i = 1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i = 1}^{n}(x_i - \bar{x})^2}\\ \hat{\beta}_0 &= \bar{y} - \hat{\beta}_1 \bar{x}. \end{aligned}\] Kita juga memperkirakan \(\sigma^2\) menggunakan \(s_e^2\). Dengan kata lain, kita menemukan bahwa \(s_e\) adalah perkiraan dari \(\sigma\), dimana; \[s_e = \text{RSE} = \sqrt{\frac{1}{n - 2}\sum_{i = 1}^n e_i^2}\] yang juga kita sebut RSE (Residual Standard Error). Saat diterapkan ke data car, kita memperoleh hasil sebagai berikut:

## 
## Call:
## lm(formula = dist ~ speed, data = cars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.069  -9.525  -2.272   9.215  43.201 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -17.5791     6.7584  -2.601   0.0123 *  
## speed         3.9324     0.4155   9.464 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 
## F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

Bagian terakhir, kita hanya membahas Estimate, Residual standard error, dan Multiple R-squared values. Pada bagian ini, kita akan membahas semua informasi di bawah Koefisien dan juga F-statistik.

Untuk memulai, kita akan mencatat bahwa ada ekspresi lain yang setara untuk \(S_xy\) yang tidak kita lihat di bagian terakhir, \[S_{xy}= \sum_{i = 1}^{n}(x_i - \bar{x})(y_i - \bar{y}) = \sum_{i = 1}^{n}(x_i - \bar{x}) y_i.\] Ini mungkin kesetaraan yang mengejutkan. (Mungkin coba untuk membuktikannya.) Namun, ini akan berguna untuk mengilustrasikan konsep di bagian ini. Perhatikan bahwa, \(\hat {\beta}_1\) adalah statistik sampel ketika dihitung dengan data observasi seperti yang tertulis di atas, seperti juga \(\hat {\beta}_0\). Namun, di bagian ini akan lebih mudah untuk menggunakan keduanya \(\hat {\beta}_1\) dan \(\hat {\beta}_0\) sebagai variabel acak, itu adalah, kita belum mengamati nilai untuk setiap \(Y_i\). Jika demikian, kita akan menggunakan notasi yang sedikit berbeda, menggantikan huruf besar \(Y_i\) ke huruf kecil \(y_i\). \[\begin{aligned} \hat{\beta}_1 &= \frac{\sum_{i = 1}^{n}(x_i - \bar{x}) Y_i}{\sum_{i = 1}^{n}(x_i - \bar{x})^2} \\ \hat{\beta}_0 &= \bar{Y} - \hat{\beta}_1 \bar{x} \end{aligned}\]

Bagian terakhir, kita berpendapat bahwa perkiraan parameter model yang tidak diketahui ini \(\beta_0\) dan \(\beta_1\) bagus karena kita mendapatkannya dengan meminimalkan kesalahan. Sekarang kita akan membahas teorema Gauss-Markov yang membawa gagasan ini lebih jauh, menunjukkan bahwa perkiraan ini sebenarnya adalah perkiraan “terbaik”, dari sudut pandang tertentu.

1.1 Teorema Gauss–Markov

Teorema Gauss-Markov memberitahu kita bahwa ketika mengestimasi parameter model regresi linier sederhana \(\beta_0\) dan \(\beta_1\), \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) yang kita peroleh adalah perkiraan tidak bias linier terbaik, atau BLUE singkatannya. (Kondisi aktual untuk teorema Gauss – Markov lebih santai daripada model SLR.) Sekarang kita akan membahas linier, tidak bias, dan terbaik yang berkaitan dengan perkiraan ini.

1.1.1 Linier

Dalam pengaturan SLR bahwa nilai \(x_i\) dianggap jumlah tetap dan diketahui. Kemudian perkiraan linier adalah salah satu yang dapat ditulis sebagai kombinasi linier dari \(Y_i\). Dalam kasus \(\hat {\beta}_1\) kita lihat \[\hat{\beta}_1 = \frac{\sum_{i = 1}^{n}(x_i - \bar{x}) Y_i}{\sum_{i = 1}^{n}(x_i - \bar{x})^2} = \sum_{i = 1}^n k_i Y_i = k_1 Y_1 + k_2 Y_2 + \cdots k_n Y_n\] dimana \(k_i = \displaystyle\frac{(x_i - \bar{x})}{\sum_{i = 1}^{n}(x_i - \bar{x})^2}\) Dengan cara yang sama, kita dapat menunjukkan bahwa \(\hat {\beta}_0\) dapat ditulis sebagai kombinasi linear dari \(Y_i\). Jadi baik \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) adalah estimator linier.

1.1.2 Tidak Bias

Sekarang kita tahu bahwa perkiraan kita linier, seberapa baik perkiraan ini? Salah satu ukuran “kebaikan” dari suatu perkiraan adalah biasnya. Secara khusus, kita lebih suka perkiraan yang tidak bias, artinya nilai yang diharapkan adalah parameter yang sedang diperkirakan. Dalam kasus estimasi regresi, kita memiliki, \[\begin{aligned} \text{E}[\hat{\beta}_0] &= \beta_0 \\ \text{E}[\hat{\beta}_1] &= \beta_1. \end{aligned}\]

Ini memberi tahu kita bahwa, ketika kondisi model SLR terpenuhi, rata-rata perkiraan kita akan benar. Namun, seperti yang kita lihat pada bagian terakhir saat melakukan simulasi dari model SLR, itu tidak berarti bahwa setiap perkiraan individu akan benar. Hanya saja, jika kita mengulangi proses tersebut beberapa kali, rata-rata perkiraannya akan benar.

1.1.3 Terbaik

Sekarang, jika kita membatasi diri pada estimasi linier dan tidak bias, bagaimana kita mendefinisikan estimasi terbaik? Estimasi dengan varians minimum. Catatan pertama bahwa sangat mudah untuk membuat estimasi untuk \(\beta_1\) yang memiliki varians sangat rendah, tetapi tidak bias. Misalnya, tentukan: \[\hat{\theta}_{BAD} = 5.\] Kemudian, karena \(\hat {\theta}_BAD\) adalah nilai konstan, \(\text{Var}[\hat{\theta}_{BAD}] = 0.\) Namun sejak itu, \[\text{E}[\hat{\theta}_{BAD}] = 5\] kita mengatakan bahwa \(\hat {\theta}_BAD\) adalah penduga bias kecuali \(\beta_1=5\), yang tidak akan kita ketahui sebelumnya. Untuk alasan ini, ini adalah perkiraan yang buruk (kecuali kebetulan \(\beta_1=5\)) meskipun memiliki kemungkinan varian terkecil. Ini adalah bagian dari alasan kita membatasi diri pada perkiraan yang tidak bias. Apa gunanya perkiraan, jika memperkirakan kuantitas yang salah? Jadi sekarang, pertanyaan aslinya adalah, apa varians dari \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) Mereka, \[\begin{aligned} \text{Var}[\hat{\beta}_0] &= \sigma^2 \left(\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}\right) \\ \text{Var}[\hat{\beta}_1] &= \frac{\sigma^2}{S_{xx}}. \end{aligned}\] Ini mengukur variabilitas perkiraan karena peluang acak selama pengambilan sampel. Apakah ini “yang terbaik”? Apakah varians ini sekecil kemungkinan yang bisa kita dapatkan? Anda hanya perlu mempercayai apa yang kita katakan karena menunjukkan bahwa ini benar berada di luar cakupan kursus ini.

1.2 Distribusi Sampling

Sekarang kita telah “mendefinisikan ulang” perkiraan untuk \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) sebagai variabel acak, kita dapat mendiskusikan distribusi samplingnya, yang merupakan distribusi ketika statistik dianggap sebagai variabel acak. Karena \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) adalah kombinasi linear dari \(Y_i\) dan setiap \(Y_i\) terdistribusi normal, maka \(\hat {\beta}_0\) dan \(\hat {\beta}_1\) juga mengikuti distribusi normal. Untuk \(\hat {\beta}_1\) kita katakan, \[\hat{\beta}_1 = \frac{S_{xy}}{S_{xx}} = \frac{\sum_{i = 1}^{n}(x_i - \bar{x}) Y_i}{\sum_{i = 1}^{n}(x_i - \bar{x})^2} \sim N\left( \beta_1, \ \frac{\sigma^2}{\sum_{i = 1}^{n}(x_i - \bar{x})^2} \right).\]

Atau lebih singkatnya, \[\hat{\beta}_1 \sim N\left( \beta_1, \frac{\sigma^2}{S_{xx}} \right).\]

Dan untuk \(\hat {\beta}_0\) \[\hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{x} \sim N\left( \beta_0, \ \frac{\sigma^2 \sum_{i = 1}^{n}x_i^2}{n \sum_{i = 1}^{n}(x_i - \bar{x})^2} \right).\]

Atau lebih singkatnya, \(\hat{\beta}_0 \sim N\left( \beta_0, \sigma^2 \left(\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}\right) \right)\)

Pada titik ini kita telah lalai untuk membuktikan sejumlah hasil ini. Alih-alih bekerja melalui turunan yang membosankan dari distribusi sampling ini, kita akan membenarkan hasil ini untuk diri kita sendiri menggunakan simulasi. Catatan untuk pembaca saat ini: Derivasi dan bukti ini dapat ditambahkan ke lampiran di lain waktu. Anda juga dapat menemukan hasil ini di hampir semua buku teks regresi linier standar. Di UIUC, hasil ini kemungkinan besar akan disajikan di STAT 424 dan STAT 425. Namun, karena Anda tidak akan diminta untuk melakukan penurunan jenis ini dalam kursus ini, hasil tersebut untuk saat ini dihilangkan.

1.2.1 Simulasi Distribusi Sampling

Untuk memverifikasi hasil di atas, kita akan mensimulasikan sampel dengan ukuran \(n = 100\) dari model \[Y_i = \beta_0 + \beta_1 x_i + \epsilon_i\] dimana \(\epsilon_i \sim N(0, \sigma^2).\) Dalam hal ini, parameternya adalah:

  • \(\beta_0 = 3\)
  • \(\beta_1 = 6\)
  • \(\sigma^2 = 4\)

Kemudian, berdasarkan hal di atas, kita harus menemukan itu \[\hat{\beta}_1 \sim N\left( \beta_1, \frac{\sigma^2}{S_{xx}} \right)\] dan \[\hat{\beta}_0 \sim N\left( \beta_0, \sigma^2 \left(\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}\right) \right).\]

Pertama kita perlu memutuskan sebelumnya berapa nilai \(x\) kita untuk simulasi ini, karena nilai \(x\) dalam SLR juga dianggap kuantitas yang diketahui. Pilihan nilai \(x\) berubah-ubah. Di sini kita juga menetapkan bilangan untuk pengacakan, dan menghitung \(S_xx\) yang akan kita perlukan untuk selanjutnya.

Kita juga memperbaiki nilai parameter yang sudah kita tentukan.

Dengan informasi ini, kita tahu distribusi sampling seharusnya:

## [1] 0.1176238
## [1] 0.04

\[\hat{\beta}_1 \sim N( 6, 0.1176238)\] dan \[\hat{\beta}_0 \sim N( 3, 0.04).\] Itu adalah, \[\begin{aligned} \text{E}[\hat{\beta}_1] &= 6 \\ \text{Var}[\hat{\beta}_1] &= 0.1176238 \end{aligned}\] dan \[\begin{aligned} \text{E}[\hat{\beta}_0] &= 3 \\ \text{Var}[\hat{\beta}_0] &= 0.04. \end{aligned}\]

Artinya, Kita sekarang mensimulasikan data dari model ini sebanyak 10.000 kali. Perhatikan bahwa ini mungkin bukan cara yang terbaik dalam R dalam melakukan simulasi. Kita melakukan simulasi dengan cara ini dalam upaya untuk mendapatkan kejelasan. Misalnya, kita bisa menggunakan fungsi sim_slr () dari bagian sebelumnya. Kita juga hanya menyimpan variabel di lingkungan global alih-alih membuat bingkai data untuk setiap kumpulan data simulasi baru.

Setiap kali kita mensimulasikan data, kami memperoleh nilai koefisien yang diperkirakan. Variabel \(\hat{\beta}_0\) dan \(\hat{\beta}_1\) sekarang menyimpan 10.000 nilai simulasi \(\hat{\beta}_0\) dan \(\hat{\beta}_1\) masing-masing.

Pertama-tama, kita memverifikasi distribusi

## [1] 6.001998
## [1] 6
## [1] 0.11899
## [1] 0.1176238

Kita melihat bahwa cara empiris dan cara yang benar dan varians sangat mirip. Kita juga memverifikasi bahwa distribusi empiris itu normal. Untuk melakukannya, kita memplot histogram dari \(\hat{\beta}_1\), dan menambahkan kurva untuk distribusi sebenarnya dari \(\hat{\beta}_1\). Kami menggunakan prob = TRUE untuk meletakkan histogram pada skala yang sama dengan kurva normal.

Kemudian kita mengulangi proses yang sama untuk \(\hat{\beta}_0\)

## [1] 3.001147
## [1] 3
## [1] 0.04017924
## [1] 0.04

Dalam simulasi ini, kita hanya mensimulasikan sejumlah sampel yang terbatas. Untuk benar-benar memverifikasi hasil distribusi, kita perlu mengamati jumlah sampel yang tak terbatas. Namun, plot berikut harus menjelaskan bahwa jika kita terus melakukan simulasi, hasil empirisnya akan semakin mendekati apa yang diharapkan.

1.3 Kesalahan Standar (Standard Errors)

Jadi sekarang kita percaya pada dua hasil distribusi, yaitu \[\begin{aligned} \hat{\beta}_0 &\sim N\left( \beta_0, \sigma^2 \left(\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}\right) \right) \\ \hat{\beta}_1 &\sim N\left( \beta_1, \frac{\sigma^2}{S_{xx}} \right). \end{aligned}\]

Kemudian dengan membakukan hasil ini, kita menemukan itu \[\frac{\hat{\beta}_0 - \beta_0}{\text{SD}[\hat{\beta}_0]} \sim N(0, 1)\] dan \[\frac{\hat{\beta}_1 - \beta_1}{\text{SD}[\hat{\beta}_1]} \sim N(0, 1)\] dimana, \[\text{SD}[\hat{\beta}_0] = \sigma\sqrt{\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}}\] dan \[\text{SD}[\hat{\beta}_1] = \frac{\sigma}{\sqrt{S_{xx}}}.\]

Karena kita tidak tahu \(\sigma\) dalam praktiknya, maka kita harus memperkirakannya menggunakan \(s_e\), yang kita masukkan ke ekspresi yang ada untuk standar deviasi dari perkiraan kita.

Kedua ekspresi baru ini disebut kesalahan standar yang merupakan perkiraan standar deviasi dari distribusi sampling. \[\text{SE}[\hat{\beta}_0] = s_e\sqrt{\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}}\]

\[\text{SE}[\hat{\beta}_1] = \frac{s_e}{\sqrt{S_{xx}}}\]

Sekarang jika kita membagi dengan kesalahan standar, dari pada standar deviasi, kita memperoleh hasil berikut yang memungkinkan kita membuat interval kepercayaan dan melakukan pengujian hipotesis. \[\frac{\hat{\beta}_0 - \beta_0}{\text{SE}[\hat{\beta}_0]} \sim t_{n-2}\]

\[\frac{\hat{\beta}_1 - \beta_1}{\text{SE}[\hat{\beta}_1]} \sim t_{n-2}\]

Untuk melihat ini, hal yang pertama diperhatikan yaitu bahwa, \[\frac{\text{RSS}}{\sigma^2} = \frac{(n-2)s_e^2}{\sigma^2} \sim \chi_{n-2}^2.\]

Juga ingat bahwa variabel acak \(T\) didefinisikan sebagai, \[T = \frac{Z}{\sqrt{\frac{\chi_{d}^2}{d}}}\]

mengikuti distribusi \(t\) dengan derajat kebebasan \(d\), di mana \(\chi_{d}^2\) adalah variabel acak \(\chi^2\) dengan derajat kebebasan \(d\).

Kita menulis, \[T \sim t_d\]

untuk mengatakan bahwa variabel acak \(T\) mengikuti distribusi \(t\) dengan derajat kebebasan \(d\).

Kemudian kita menggunakan trik klasik “kalikan dengan 1” dan beberapa penyusunan ulang untuk sampai pada \[\begin{aligned} \frac{\hat{\beta}_1 - \beta_1}{\text{SE}[\hat{\beta}_1]} &= \frac{\hat{\beta}_1 - \beta_1}{s_e / \sqrt{S_{xx}}} \\ &= \frac{\hat{\beta}_1 - \beta_1}{s_e / \sqrt{S_{xx}}} \cdot \frac{\sigma / \sqrt{S_{xx}}}{\sigma / \sqrt{S_{xx}}} \\ &= \frac{\hat{\beta}_1 - \beta_1}{\sigma / \sqrt{S_{xx}}} \cdot \frac{\sigma / \sqrt{S_{xx}}}{s_e / \sqrt{S_{xx}}} \\ &= \frac{\hat{\beta}_1 - \beta_1}{\sigma / \sqrt{S_{xx}}} \bigg/ \sqrt{\frac{s_e^2}{\sigma^2}} \\ &= \frac{\hat{\beta}_1 - \beta_1}{\text{SD}[\hat{\beta}_1]} \bigg/ \sqrt{\frac{\frac{(n - 2)s_e^2}{\sigma^2}}{n - 2}} \sim \frac{Z}{\sqrt{\frac{\chi_{n-2}^2}{n-2}}} \sim t_{n-2} \end{aligned}\] dimana \(Z \sim N(0,1)\).

Ingatlah bahwa distribusi \(t\) mirip dengan standar normal, tetapi dengan ekor yang lebih berat. Ketika derajat kebebasan meningkat, distribusi \(t\) menjadi lebih seperti standar normal. Di bawah ini, kita akan memplot distribusi standar normal serta dua contoh distribusi \(t\) dengan derajat kebebasan berbeda. Perhatikan bagaimana distribusi \(t\) dengan derajat kebebasan yang lebih besar lebih mirip dengan kurva normal standar.

1.4 Interval Kepercayaan untuk Kemiringan dan Perpotongan/Intersep

Ingatlah bahwa interval kepercayaan untuk sarana sering kali berbentuk:

\[\text{EST} \pm \text{CRIT} \cdot \text{SE}\] atau \[\text{EST} \pm \text{MARGIN}\]

dimana \(\text{EST}\) adalah perkiraan untuk parameter yang diminati, \(\text{SE}\) adalah kesalahan standar dari perkiraan tersebut, dan \(\text{MARGIN} = \text{CRIT} \cdot \text{SE}\)

Kemudian, untuk \(\beta_0\) dan $_1) kita dapat membuat interval kepercayaan menggunakan \[\hat{\beta}_0 \pm t_{\alpha/2, n - 2} \cdot \text{SE}[\hat{\beta}_0] \quad \quad \quad \hat{\beta}_0 \pm t_{\alpha/2, n - 2} \cdot s_e\sqrt{\frac{1}{n}+\frac{\bar{x}^2}{S_{xx}}}\] dan \[\hat{\beta}_1 \pm t_{\alpha/2, n - 2} \cdot \text{SE}[\hat{\beta}_1] \quad \quad \quad \hat{\beta}_1 \pm t_{\alpha/2, n - 2} \cdot \frac{s_e}{\sqrt{S_{xx}}}\] dimana \(t_{\alpha/2, n - 2}\) adalah nilai kritisnya seperti \(P(t_{n-2} > t_{\alpha/2, n - 2}) = \alpha/2\)

1.5 Uji Hipotesis

“We may speak of this hypothesis as the ‘null hypothesis’, and it should be noted that the null hypothesis is never proved or established, but is possibly disproved, in the course of experimentation.” -Ronald Aylmer Fisher

Ingatlah bahwa uji statistik \(\text{TS}\) untuk sarana pengujian sering kali berbentuk: \[\text{TS} = \frac{\text{EST} - \text{HYP}}{\text{SE}}\] dimana \(\text{EST}\) adalah perkiraan untuk parameter yang diminati, \(\text{HYP}\) adalah nilai hipotesis dari parameter, dan \(\text{SE}\) adalah perkiraan kesalahan standar.

Jadi, untuk mengujinya \[H_0: \beta_0 = \beta_{00} \quad \text{vs} \quad H_1: \beta_0 \neq \beta_{00}\] kita menggunakan uji statistik \[t = \frac{\hat{\beta}_0 - \beta_{00}}{\text{SE}[\hat{\beta}_0]} = \frac{\hat{\beta}_0-\beta_{00}}{s_e\sqrt{\frac{1}{n} + \frac{\bar{x}^2}{S_{xx}}}}\] yang mana di bawah hipotesis nol, mengikuti distribusi \(t\) dengan \(n-2\) derajat kebebasan. Kita sekarang menggunakan \(\beta_10\) untuk menunjukkan nilai hipotesis \(\beta_1\).

1.6 Contoh cars

Sekarang kita kembali ke contoh data cars dari bagian terakhir untuk mengilustrasikan konsep ini. Pertama-tama, kita menyesuaikan model menggunakan lm() kemudian menggunakan summary() untuk melihat hasil secara lebih detail.

## 
## Call:
## lm(formula = dist ~ speed, data = cars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.069  -9.525  -2.272   9.215  43.201 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -17.5791     6.7584  -2.601   0.0123 *  
## speed         3.9324     0.4155   9.464 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 
## F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

1.6.1 Pengujian di R

Sekarang kita akan membahas hasil yang ditampilkan yang disebut Koefisien. Pertama, ingatlah bahwa kita dapat mengekstrak informasi ini secara langsung.

##  [1] "call"          "terms"         "residuals"     "coefficients" 
##  [5] "aliased"       "sigma"         "df"            "r.squared"    
##  [9] "adj.r.squared" "fstatistic"    "cov.unscaled"
##               Estimate Std. Error   t value     Pr(>|t|)
## (Intercept) -17.579095  6.7584402 -2.601058 1.231882e-02
## speed         3.932409  0.4155128  9.463990 1.489836e-12

Fungsi names() memberitahu kita informasi apa yang tersedia, dan kemudian kita menggunakan $ operator dan coefficients untuk mengekstrak informasi yang kita minati. Dua nilai di sini harus segera kita kenal. \[\hat{\beta}_0 = -17.5790949\] dan \[\hat{\beta}_1 = 3.9324088\] yang merupakan perkiraan kami untuk parameter model \(\beta_0\) dan \(\beta_1\).

Sekarang kita fokus pada baris kedua dari keluaran, yang relevan dengan \(\beta_1\).

##     Estimate   Std. Error      t value     Pr(>|t|) 
## 3.932409e+00 4.155128e-01 9.463990e+00 1.489836e-12

Sekali lagi, nilai pertama, Estimate adalah \[\hat{\beta}_1 = 3.9324088.\] Nilai kedua, Std. Errpr, adalah kesalahan standar dari \(\hat{\beta}_1\), \[\text{SE}[\hat{\beta}_1] = \frac{s_e}{\sqrt{S_{xx}}} = 0.4155128.\] Nilai ketiga, t value, merupakan nilai uji statistik untuk pengujian \(H_0: \beta_1 = 0\) dengan \(H_1: \beta_1 \neq 0\), \[t = \frac{\hat{\beta}_1-0}{\text{SE}[\hat{\beta}_1]} = \frac{\hat{\beta}_1-0}{s_e / \sqrt{S_{xx}}} = 9.46399.\] Terakhir, Pr(>|t|), memberi kita nilai p dari pengujian itu. \[\text{p-value} = 1.4898365\times 10^{-12}\] Perhatikan di sini, kita secara khusus menguji apakah benar atau tidak bahwa \(\beta_1=0\) Baris pertama keluaran melaporkan nilai yang sama, tetapi untuk \(\beta_0\)

##     Estimate   Std. Error      t value     Pr(>|t|) 
## -17.57909489   6.75844017  -2.60105800   0.01231882

Singkatnya, kode berikut menyimpan informasi dari summary(stop_dist_model)$coefficients dalam variabel baru stop_dist_model_test_info, kemudian mengekstrak setiap elemen menjadi variabel baru yang mendeskripsikan informasi yang didalamnya.

Kemudian kita dapat memverifikasi beberapa ekspresi yang setara: statistik uji \(t\) untuk \(\hat{\beta}_1\) dan nilai \(p\) dua sisi yang terkait dengan uji statistik tersebut.

## [1] 9.46399
## [1] 9.46399
## [1] 1.489836e-12
## [1] 1.489836e-12

1.6.2 Signifikansi Regresi, Uji-t

Kita berhenti sejenak untuk membahas pentingnya uji regresi. Pertama, perhatikan bahwa berdasarkan hasil distribusi di atas, kita dapat menguji \(\beta_0\) dan \(\beta_1\) terhadap nilai tertentu, dan melakukan pengujian satu dan dua sisi. Namun, satu tes yang sangat spesifik, \[H_0: \beta_1 = 0 \quad \text{vs} \quad H_1: \beta_1 \neq 0\] paling sering digunakan. Mari pikirkan tentang pengujian ini dalam kaitannya dengan model regresi linier sederhana, \[Y_i = \beta_0 + \beta_1 x_i + \epsilon_i.\] Jika kami mengasumsikan hipotesis nol benar, maka \(\beta_1=0\) dan kami memiliki model, \[Y_i = \beta_0 + \epsilon_i.\]

Dalam model ini, respon tidak bergantung pada prediktor. Jadi kita bisa memikirkan tes ini dengan cara berikut,

  • Dibawah \(H_0\) tidak ada hubungan linier yang signifikan antara \(x\) dan \(y\).
  • Dibawah \(H_1\) ada hubungan linier yang signifikan antara \(x\) dan \(y\).

Untuk contoh cars,

  • Dibawah \(H_0\) tidak ada hubungan linier yang signifikan antara kecepatan dan jarak berhenti.
  • Dibawah \(H_1\) ada hubungan linier yang signifikan antara kecepatan dan jarak berhenti.

Sekali lagi, pengujian itu terlihat pada keluaran dari summary(), \[\text{p-value} = 1.4898365\times 10^{-12}.\]

Dengan nilai-p yang sangat rendah ini, kita akan menolak hipotesis nol pada tingkat \(\alpha\) yang masuk akal, misalnya \(\alpha = 0,01\). Jadi kita katakan ada hubungan linier yang signifikan antara kecepatan dan jarak berhenti. Perhatikan bahwa kita menekankan linier.

Dalam plot data simulasi ini, kita melihat hubungan yang jelas antara \(x\) dan \(y\), namun ini bukan hubungan linier. Jika kita memasukkan garis ke data ini, itu sangat datar. Hasil pengujian untuk \(H_0: \beta_1 = 0\) vs \(H_1: \beta_1 ≠ 0\) memberikan p-value yang besar, dalam hal ini \(0,7564548\), jadi kita gagal untuk menolak dan mengatakan bahwa tidak ada hubungan linier yang signifikan antara \(x\) dan \(y\). Kita akan melihat nanti bagaimana menyesuaikan kurva ke data ini menggunakan model “linier”, tetapi untuk saat ini, sadari bahwa pengujian \(H_0: \beta1 = 0\) vs \(H_1: \beta_1 ≠ 0\) hanya dapat mendeteksi hubungan garis lurus.

1.6.3 Interval Kepercayaan di R

Dengan menggunakan R, kita dapat dengan mudah memperoleh interval kepercayaan untuk \(\beta_0\) dan \(\beta_1\).

##                  0.5 %    99.5 %
## (Intercept) -35.706610 0.5484205
## speed         2.817919 5.0468988

Ini secara otomatis menghitung interval kepercayaan 99% untuk keduanya \(\beta_0\) dan \(\beta_1\), baris pertama untuk \(\beta_0\), dan baris kedua untuk \(\beta_1\).

Untuk contoh mobil saat menginterpretasikan interval ini, kami katakan 99% yakin bahwa untuk peningkatan kecepatan 1 mil per jam, peningkatan rata-rata jarak berhenti adalah antara \(2.8179187\) dan \(5.0468988\) kaki, yang merupakan interval untuk \(\beta_1\).

Perhatikan bahwa interval kepercayaan 99% ini tidak mengandung nilai hipotesis 0. Karena tidak mengandung 0, ini setara dengan menolak pengujian \(H_0: \beta_1 = 0\) dengan \(H_1: \beta_1 \neq 0\) pada \(\alpha = 0.01\), yang telah kita lihat sebelumnya.

Kalian harus agak curiga terhadap interval kepercayaan untuk \(\beta_0\), karena mencakup nilai negatif, yang sesuai dengan jarak henti negatif. Secara teknis interpretasinya adalah bahwa kami 99% yakin bahwa jarak berhenti rata-rata sebuah mobil yang menempuh jarak 0 mil per jam adalah antara \(-35.7066103\) dan \(0.5484205\) kaki, tetapi kami tidak begitu percaya itu, karena kami benar-benar yakin bahwa itu akan terjadi. non-negatif.

Catatan, kita dapat mengekstrak nilai tertentu dari keluaran ini dengan beberapa cara. Kode ini tidak berjalan, dan sebagai gantinya, Anda harus memeriksa hubungannya dengan keluaran kode di atas.

##       0.5 %      99.5 % 
## -35.7066103   0.5484205
## [1] -35.70661
## [1] 0.5484205
##                 0.5 %    99.5 %
## (Intercept) -35.70661 0.5484205
##    0.5 %   99.5 % 
## 2.817919 5.046899
## [1] 2.817919
## [1] 5.046899
##          0.5 %   99.5 %
## speed 2.817919 5.046899

Kita juga dapat memverifikasi bahwa kalkulasi yang dijalankan R untuk interval \(\beta_1\).

##    speed    speed 
## 2.817919 5.046899

1.7 Interval Kepercayaan untuk Respon Rata-rata

Selain interval kepercayaan untuk \(\beta_0\) dan \(\beta_1\), ada dua perkiraan interval umum lainnya yang digunakan dengan regresi. Yang pertama disebut interval kepercayaan untuk respons rata-rata. Seringkali, kami menginginkan perkiraan interval untuk rata-rata, \(E[Y \mid X = x]\) untuk nilai x tertentu.

Dalam situasi ini kita menggunakan \(\hat{y}(x)\) sebagai perkiraan kita \(E[Y \mid X = x]\). Kita mengubah sedikit notasi kami untuk memperjelas bahwa nilai prediksi adalah fungsi dari nilai \(x\). \[\hat{y}(x) = \hat{\beta}_0 + \hat{\beta}_1 x\] Ingatlah bahwa, \[\text{E}[Y \mid X = x] = \beta_0 + \beta_1 x.\] Jadi, \(\hat{y}(x)\) adalah perkiraan yang bagus karena tidak bias: \[\text{E}[\hat{y}(x)] = \beta_0 + \beta_1 x.\] Kita kemudian bisa mendapatkan, \[\text{Var}[\hat{y}(x)] = \sigma^2 \left(\frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}\right).\]

Seperti perkiraan lain yang telah kita lihat, \(\hat{y}(x)\) juga mengikuti distribusi normal. Sejak \(\hat{\beta}_0\) dan \(\hat{\beta}_1\) adalah kombinasi linier dari variabel acak normal, \(\hat{y}(x)\) juga. \[\hat{y}(x) \sim N \left(\beta_0 + \beta_1 x, \sigma^2 \left(\frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}\right) \right)\]

Dan terakhir, karena kita perlu memperkirakan varians ini, kita sampai pada kesalahan standar dari perkiraan kita, \[\text{SE}[\hat{y}(x)] = s_e \sqrt{\frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}}.\] Kita kemudian dapat menggunakan ini untuk menemukan interval kepercayaan untuk respons rata-rata, \[\hat{y}(x) \pm t_{\alpha/2, n - 2} \cdot s_e\sqrt{\frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}}\]

Untuk menemukan interval kepercayaan untuk respons rata-rata menggunakan R, kita menggunakan fungsi predict(). Kita memberikan fungsi model pas kami serta data baru, disimpan sebagai bingkai data. (Ini penting, agar R mengetahui nama variabel prediktor.) Di sini, kita menemukan interval kepercayaan untuk jarak berhenti rata-rata saat mobil berjalan 5 mil per jam dan saat mobil berjalan 21 mil per jam.

##         fit       lwr      upr
## 1  2.082949 -10.89309 15.05898
## 2 65.001489  56.45836 73.54462

1.8 Interval Prediksi untuk Pengamatan Baru

Terkadang kita menginginkan perkiraan interval untuk pengamatan baru, \(Y\), untuk nilai \(x\) tertentu. Ini sangat mirip dengan interval untuk respons rata-rata \(\text{E}[Y \mid X = x]\) tetapi berbeda dalam satu hal yang sangat penting.

Tebakan terbaik kita untuk observasi baru masih \(\hat{y}(x)\). Perkiraan rata-rata masih merupakan prediksi terbaik yang bisa kita buat. Perbedaannya adalah terletak pada jumlah variabilitas. Kita tahu bahwa pengamatan akan bervariasi tentang garis regresi yang sebenarnya menurut distribusi \(N(0, \sigma^2)\). Karena itu kita menambahkan faktor tambahan \(\sigma^2\) ke variabilitas perkiraan kami untuk menjelaskan variabilitas pengamatan tentang garis regresi. \[\begin{aligned} \text{Var}[\hat{y}(x) + \epsilon] &= \text{Var}[\hat{y}(x)] + \text{Var}[\epsilon] \\[2ex] &= \sigma^2 \left(\frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}\right) + \sigma^2 \\[2ex] &= \sigma^2 \left(1 + \frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}\right) \end{aligned}\]

Kita kemudian dapat menemukan interval prediksi menggunakan, \[\hat{y}(x) \pm t_{\alpha/2, n - 2} \cdot s_e\sqrt{1 + \frac{1}{n}+\frac{(x-\bar{x})^2}{S_{xx}}}.\]

Untuk menghitung ini untuk satu set poin dalam pemberitahuan R hanya ada sedikit perubahan dalam sintaks dari menemukan interval kepercayaan untuk respons rata-rata.

##         fit       lwr       upr
## 1  2.082949 -41.16099  45.32689
## 2 65.001489  22.87494 107.12803

Perhatikan juga bahwa kedua interval ini lebih lebar daripada interval kepercayaan yang sesuai untuk respons rata-rata.

1.9 Pita Kepercayaan dan Prediksi

Seringkali kit ingin memplot kedua interval kepercayaan untuk respons rata-rata dan interval prediksi untuk semua kemungkinan nilai \(X\). Kita menyebutnya pita kepercayaan dan prediksi.

Beberapa hal yang perlu diperhatikan:

  • Kita menggunakan argumen ylim untuk meregangkan sumbu-\(y\) dari plot, karena pita lebih panjang daripada titik.

  • Kita menambahkan titik pada titik (\((\bar{x}, \bar{y})\)) tersebut.
    • Ini adalah titik yang akan selalu dilewati garis regresi. (Pikirkan alasannya)
    • Ini adalah titik dimana pita kepercayaan dan prediksi menjadi yang tersempit. Lihatlah kesalahan standar keduanya untuk memahami mengapa.
  • Pita prediksi (titik-titik biru) kurang melengkung dibandingkan dengan pita kepercayaan (biru putus-putus). Ini adalah hasil dari faktor \(\sigma^2\) tambahan yang ditambahkan ke varians pada nilai \(x\) berapapun.

1.10 Signifikansi Regresi, Uji-F

Dalam kasus regresi linier sederhana, uji \(t\) untuk signifikansi regresi setara dengan uji lain, yaitu uji \(F\) untuk signifikansi regresi. Kesetaraan ini hanya akan berlaku benar untuk regresi linier sederhana, dan di bagian selanjutnya kita hanya akan menggunakan \(F\) untuk menguji signifikansi regresi.

Ingat dari bagian terakhir dekomposisi varians yang kita lihat sebelumnya menghitung \(R^2\), \[\sum_{i=1}^{n}(y_i - \bar{y})^2 = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 + \sum_{i=1}^{n}(\hat{y}_i - \bar{y})^2\]

atau singkatnya, \[\text{SST} = \text{SSE} + \text{SSReg}.\]

Untuk mengembangkan \(F\) test, kita akan mengatur informasi ini dalam tabel ANOVA

Sumber Jumlah Kuadrat Derajat Kebebasan Rata-rata Kuadrat F
Regresi \(\sum^n_{i=1}(\hat{y}_i-y)^2\) \(1\) \(\frac{SSReg}{1}\) \(\frac{MSReg}{MSE}\)
Eror \(\sum^n_{i=1}(y_i-\hat{y}_i)^2\) \(n-2\) \(\frac{SSReg}{n-2}\)
Total \(\sum^n_{i=1}(y_i-y)^2\) \(n-1\)

ANOVA, atau Analisis Varians akan menjadi konsep yang sering kita bahas dalam bagian ini. Untuk saat ini, kita akan fokus pada hasil tabel, yaitu \(F\) statistik. \[F = \frac{\sum_{i=1}^{n}(\hat{y}_i - \bar{y})^2 / 1}{\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 / (n - 2)} \sim F_{1, n - 2}\]

yang mengikuti distribusi \(F\) dengan derajat kebebasan \(1\) dan \(n-2\) dibawah hipotesis nol. Sebuah distribusi \(F\) adalah distribusi kontinu yang hanya mengambil nilai positif dan memiliki dua parameter, yaitu dua derajat kebebasan.

Ingatlah, pentingnya uji regresi, \(Y\) tidak tergantung pada \(x\) dalam hipotesis nol. \[H_0: \beta_1 = 0 \quad \quad Y_i = \beta_0 + \epsilon_i\] Sedangkan pada hipotesis alternatif \(Y\) mungkin bergantung pada \(x\) \[H_1: \beta_1 \neq 0 \quad \quad Y_i = \beta_0 + \beta_1 x_i + \epsilon_i\] Kita bisa menggunakan \(F\) statistik untuk melakukan tes ini. \[F = \frac{\sum_{i=1}^{n}(\hat{y}_i - \bar{y})^2 / 1}{\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 / (n - 2)}\]

Secara khusus, kita akan menolak null saat \(F\) statistiknya benar, yaitu, ketika ada kemungkinan rendah bahwa pengamatan bisa datang dari model nol secara kebetulan. Kita akan menghitung nilai p untuk kita dengan R.

Untuk melakukan uji \(F\) di R kalian dapat melihat baris terakhir dari output yang dalam fungsi summary() disebut F-statistics yang memberikan nilai uji statistik, derajat kebebasan yang relevan, serta \(p-value\) dari pengujian.

## 
## Call:
## lm(formula = dist ~ speed, data = cars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.069  -9.525  -2.272   9.215  43.201 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -17.5791     6.7584  -2.601   0.0123 *  
## speed         3.9324     0.4155   9.464 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 
## F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

Selain itu, kalian dapat menggunakan fungsi anova() dalam menampilkan informasi dalam tabel ANOVA.

## Analysis of Variance Table
## 
## Response: dist
##           Df Sum Sq Mean Sq F value   Pr(>F)    
## speed      1  21186 21185.5  89.567 1.49e-12 ***
## Residuals 48  11354   236.5                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ini juga memberikan nilai-p untuk pengujian. Kalian harus memperhatikan bahwa nilai-p dari distribusi \(t\) adalah sama. Kalian mungkin juga memperhatikan bahwa nilai statistik pengujian untuk uji \(t\), \(9.46399\), dapat dikuadratkan untuk mendapatkan nilai \(F\) statistik, \(89.5671065\).

Perhatikan bahwa ada cara lain yang setara untuk melakukan ini dalam R, dimana kita akan sering sekali untuk membandingkan dua model.

## Analysis of Variance Table
## 
## Model 1: dist ~ 1
## Model 2: dist ~ speed
##   Res.Df   RSS Df Sum of Sq      F   Pr(>F)    
## 1     49 32539                                 
## 2     48 11354  1     21186 89.567 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pernyataan model lm(dist ~ 1, data = cars) menerapkan model \(Y_i = \beta_0 + \epsilon_i\) ke data mobil (data cars). Catat \(\hat{y} = \bar{y}\) itu ketika \(Y_i = \beta_0 + \epsilon_i\)

Pernyataan model lm(dist ~ speed, data = cars) menerapkan model \(Y_i = \beta_0 + \beta_1 x_i + \epsilon_i\). Kita kemudian dapat menganggap penggunaan anova() ini sebagai perbandingan langsung kedua model (Perhatikan bahwa kita mendapatkan nilai-p yang sama lagi).

LS0tDQp0aXRsZTogIkluZmVyZW5zaSBkYWxhbSBSZWdyZXNpIExpbmllciAoVVRTKSINCmF1dGhvcjogIkVsdnJpYW5hIEVsdmFuaSgyMDE4NDkyMDAxMikiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQpgYGB7ciBMb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzQwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9naXRodWIuY29tL0Jha3RpLVNpcmVnYXIvaW1hZ2VzL2Jsb2IvbWFzdGVyL2xvZ28ucG5nP3Jhdz10cnVlIikNCmBgYA0KDQojICoqSW5mZXJlbnNpIGRhbGFtIFJlZ3Jlc2kgTGluaWVyKioNClNldGVsYWggbWVtYmFjYSBiYWdpYW4gaW5pLCBBbmRhIGFrYW4gZGFwYXQ6DQoNCiogTWVtYWhhbWkgZGlzdHJpYnVzaSBwZXJraXJhYW4gcmVncmVzaS4NCiogTWVtYnVhdCBwZXJraXJhYW4gaW50ZXJ2YWwgdW50dWsgcGFyYW1ldGVyIHJlZ3Jlc2ksIHJlc3BvbnMgcmF0YS1yYXRhLCBkYW4gcHJlZGlrc2kuDQoqIFVqaSBzaWduaWZpa2Fuc2kgcmVncmVzaS4NCg0KQmFnaWFuIHRlcmFraGlyIGtpdGEgbWVuZGVmaW5pc2lrYW4gbW9kZWwgcmVncmVzaSBsaW5pZXIgc2VkZXJoYW5hLCAkJFlfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfaSArIFxlcHNpbG9uX2kkJA0KZGltYW5hICRcZXBzaWxvbl9pIFxzaW0gTigwLCBcc2lnbWFeMikkLiBLaXRhIGtlbXVkaWFuIG1lbmdndW5ha2FuIG9ic2VydmFzaSAkKHhfaSwgeV9pKSQgdW50dWsgJGkgPSAxLCAyLCBcbGRvdHMgbiQgdW50dWsgbWVuY2FyaSBuaWxhaSAkXGJldGFfMCQgZGFuICRcYmV0YV8xJCB5YW5nIGRpbWluaW1hbGthbiAkJGYoXGJldGFfMCwgXGJldGFfMSkgPSBcc3VtX3tpID0gMX1ee259KHlfaSAtIChcYmV0YV8wICsgXGJldGFfMSB4X2kpKV4yLiQkDQpLaXRhIG1lbnllYnV0IG5pbGFpLW5pbGFpIGluaSAkXGhhdCB7zrJ9XzAkIGRhbiAkXGhhdCB7zrJ9XzEkLCB5YW5nIGtpdGEgdGVtdWthbiANCiQkXGJlZ2lue2FsaWduZWR9DQpcaGF0e1xiZXRhfV8xICY9IFxmcmFje1Nfe3h5fX17U197eHh9fSA9IFxmcmFje1xzdW1fe2kgPSAxfV57bn0oeF9pIC0gXGJhcnt4fSkoeV9pIC0gXGJhcnt5fSl9e1xzdW1fe2kgPSAxfV57bn0oeF9pIC0gXGJhcnt4fSleMn1cXA0KXGhhdHtcYmV0YX1fMCAmPSBcYmFye3l9IC0gXGhhdHtcYmV0YX1fMSBcYmFye3h9Lg0KXGVuZHthbGlnbmVkfSQkDQpLaXRhIGp1Z2EgbWVtcGVya2lyYWthbiAkXHNpZ21hXjIkIG1lbmdndW5ha2FuICRzX2VeMiQuIERlbmdhbiBrYXRhIGxhaW4sIGtpdGEgbWVuZW11a2FuIGJhaHdhICRzX2UkIGFkYWxhaCBwZXJraXJhYW4gZGFyaSAkXHNpZ21hJCwgZGltYW5hOw0KJCRzX2UgPSBcdGV4dHtSU0V9ID0gXHNxcnR7XGZyYWN7MX17biAtIDJ9XHN1bV97aSA9IDF9Xm4gZV9pXjJ9JCQNCnlhbmcganVnYSBraXRhIHNlYnV0ICoqUlNFKiogKFJlc2lkdWFsIFN0YW5kYXJkIEVycm9yKS4NClNhYXQgZGl0ZXJhcGthbiBrZSBkYXRhIGBjYXJgLCBraXRhIG1lbXBlcm9sZWggaGFzaWwgc2ViYWdhaSBiZXJpa3V0Og0KYGBge3J9DQpzdG9wX2Rpc3RfbW9kZWwgPSBsbShkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzKQ0Kc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpDQpgYGANCg0KQmFnaWFuIHRlcmFraGlyLCBraXRhIGhhbnlhIG1lbWJhaGFzIGBFc3RpbWF0ZSwgUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IsYCBkYW4gYE11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZXNgLiBQYWRhIGJhZ2lhbiBpbmksIGtpdGEgYWthbiBtZW1iYWhhcyBzZW11YSBpbmZvcm1hc2kgZGkgYmF3YWggYEtvZWZpc2llbmAgZGFuIGp1Z2EgYEYtc3RhdGlzdGlrYC4NCmBgYHtyfQ0KcGxvdChkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzLA0KICAgICB4bGFiID0gIlNwZWVkIChpbiBNaWxlcyBQZXIgSG91cikiLA0KICAgICB5bGFiID0gIlN0b3BwaW5nIERpc3RhbmNlIChpbiBGZWV0KSIsDQogICAgIG1haW4gPSAiU3RvcHBpbmcgRGlzdGFuY2UgdnMgU3BlZWQiLA0KICAgICBwY2ggID0gMjAsDQogICAgIGNleCAgPSAyLA0KICAgICBjb2wgID0gImdyZXkiKQ0KYWJsaW5lKHN0b3BfZGlzdF9tb2RlbCwgbHdkID0gNSwgY29sID0gImRhcmtvcmFuZ2UiKQ0KYGBgDQoNClVudHVrIG1lbXVsYWksIGtpdGEgYWthbiBtZW5jYXRhdCBiYWh3YSBhZGEgZWtzcHJlc2kgbGFpbiB5YW5nIHNldGFyYSB1bnR1ayAkU194eSQgeWFuZyB0aWRhayBraXRhIGxpaGF0IGRpIGJhZ2lhbiB0ZXJha2hpciwNCiQkU197eHl9PSBcc3VtX3tpID0gMX1ee259KHhfaSAtIFxiYXJ7eH0pKHlfaSAtIFxiYXJ7eX0pID0gXHN1bV97aSA9IDF9XntufSh4X2kgLSBcYmFye3h9KSB5X2kuJCQNCkluaSBtdW5na2luIGtlc2V0YXJhYW4geWFuZyBtZW5nZWp1dGthbi4gKE11bmdraW4gY29iYSB1bnR1ayBtZW1idWt0aWthbm55YS4pIE5hbXVuLCBpbmkgYWthbiBiZXJndW5hIHVudHVrIG1lbmdpbHVzdHJhc2lrYW4ga29uc2VwIGRpIGJhZ2lhbiBpbmkuDQpQZXJoYXRpa2FuIGJhaHdhLCAkXGhhdCB7XGJldGF9XzEkIGFkYWxhaCAqKnN0YXRpc3RpayBzYW1wZWwqKiBrZXRpa2EgZGloaXR1bmcgZGVuZ2FuIGRhdGEgb2JzZXJ2YXNpIHNlcGVydGkgeWFuZyB0ZXJ0dWxpcyBkaSBhdGFzLCBzZXBlcnRpIGp1Z2EgJFxoYXQge1xiZXRhfV8wJC4NCk5hbXVuLCBkaSBiYWdpYW4gaW5pIGFrYW4gbGViaWggbXVkYWggdW50dWsgbWVuZ2d1bmFrYW4ga2VkdWFueWEgJFxoYXQge1xiZXRhfV8xJCBkYW4gJFxoYXQge1xiZXRhfV8wJCBzZWJhZ2FpICoqdmFyaWFiZWwgYWNhayoqLCBpdHUgYWRhbGFoLCBraXRhIGJlbHVtIG1lbmdhbWF0aSBuaWxhaSB1bnR1ayBzZXRpYXAgJFlfaSQuIEppa2EgZGVtaWtpYW4sIGtpdGEgYWthbiBtZW5nZ3VuYWthbiBub3Rhc2kgeWFuZyBzZWRpa2l0IGJlcmJlZGEsIG1lbmdnYW50aWthbiBodXJ1ZiBiZXNhciAkWV9pJCBrZSBodXJ1ZiBrZWNpbCAkeV9pJC4NCiQkXGJlZ2lue2FsaWduZWR9DQpcaGF0e1xiZXRhfV8xICY9IFxmcmFje1xzdW1fe2kgPSAxfV57bn0oeF9pIC0gXGJhcnt4fSkgWV9pfXtcc3VtX3tpID0gMX1ee259KHhfaSAtIFxiYXJ7eH0pXjJ9IFxcDQpcaGF0e1xiZXRhfV8wICY9IFxiYXJ7WX0gLSBcaGF0e1xiZXRhfV8xIFxiYXJ7eH0NClxlbmR7YWxpZ25lZH0kJA0KDQpCYWdpYW4gdGVyYWtoaXIsIGtpdGEgYmVycGVuZGFwYXQgYmFod2EgcGVya2lyYWFuIHBhcmFtZXRlciBtb2RlbCB5YW5nIHRpZGFrIGRpa2V0YWh1aSBpbmkgJFxiZXRhXzAkIGRhbiAkXGJldGFfMSQgYmFndXMga2FyZW5hIGtpdGEgbWVuZGFwYXRrYW5ueWEgZGVuZ2FuIG1lbWluaW1hbGthbiBrZXNhbGFoYW4uIFNla2FyYW5nIGtpdGEgYWthbiBtZW1iYWhhcyB0ZW9yZW1hIEdhdXNzLU1hcmtvdiB5YW5nIG1lbWJhd2EgZ2FnYXNhbiBpbmkgbGViaWggamF1aCwgbWVudW5qdWtrYW4gYmFod2EgcGVya2lyYWFuIGluaSBzZWJlbmFybnlhIGFkYWxhaCBwZXJraXJhYW4gInRlcmJhaWsiLCBkYXJpIHN1ZHV0IHBhbmRhbmcgdGVydGVudHUuDQoNCiMjIFRlb3JlbWEgR2F1c3PigJNNYXJrb3YNCg0KKipUZW9yZW1hIEdhdXNzLU1hcmtvdioqIG1lbWJlcml0YWh1IGtpdGEgYmFod2Ega2V0aWthIG1lbmdlc3RpbWFzaSBwYXJhbWV0ZXIgbW9kZWwgcmVncmVzaSAqKmxpbmllcioqIHNlZGVyaGFuYSAkXGJldGFfMCQgZGFuICRcYmV0YV8xJCwgJFxoYXQge1xiZXRhfV8wJCBkYW4gJFxoYXQge1xiZXRhfV8xJCB5YW5nIGtpdGEgcGVyb2xlaCBhZGFsYWggKipwZXJraXJhYW4gdGlkYWsgYmlhcyBsaW5pZXIgdGVyYmFpayoqLCBhdGF1IEJMVUUgc2luZ2thdGFubnlhLiAoS29uZGlzaSBha3R1YWwgdW50dWsgdGVvcmVtYSBHYXVzcyDigJMgTWFya292IGxlYmloIHNhbnRhaSBkYXJpcGFkYSBtb2RlbCBTTFIuKSANClNla2FyYW5nIGtpdGEgYWthbiBtZW1iYWhhcyAqbGluaWVyLCB0aWRhayBiaWFzLCogZGFuICp0ZXJiYWlrKiB5YW5nIGJlcmthaXRhbiBkZW5nYW4gcGVya2lyYWFuIGluaS4NCg0KIyMjIExpbmllcg0KDQpEYWxhbSBwZW5nYXR1cmFuIFNMUiBiYWh3YSBuaWxhaSAkeF9pJCBkaWFuZ2dhcCBqdW1sYWggdGV0YXAgZGFuIGRpa2V0YWh1aS4gS2VtdWRpYW4gcGVya2lyYWFuIGxpbmllciBhZGFsYWggc2FsYWggc2F0dSB5YW5nIGRhcGF0IGRpdHVsaXMgc2ViYWdhaSBrb21iaW5hc2kgbGluaWVyIGRhcmkgJFlfaSQuIERhbGFtIGthc3VzICRcaGF0IHtcYmV0YX1fMSQga2l0YSBsaWhhdA0KJCRcaGF0e1xiZXRhfV8xID0gXGZyYWN7XHN1bV97aSA9IDF9XntufSh4X2kgLSBcYmFye3h9KSBZX2l9e1xzdW1fe2kgPSAxfV57bn0oeF9pIC0gXGJhcnt4fSleMn0gPSBcc3VtX3tpID0gMX1ebiBrX2kgWV9pID0ga18xIFlfMSArIGtfMiBZXzIgKyBcY2RvdHMga19uIFlfbiQkDQpkaW1hbmEgJGtfaSA9IFxkaXNwbGF5c3R5bGVcZnJhY3soeF9pIC0gXGJhcnt4fSl9e1xzdW1fe2kgPSAxfV57bn0oeF9pIC0gXGJhcnt4fSleMn0kDQpEZW5nYW4gY2FyYSB5YW5nIHNhbWEsIGtpdGEgZGFwYXQgbWVudW5qdWtrYW4gYmFod2EgJFxoYXQge1xiZXRhfV8wJCBkYXBhdCBkaXR1bGlzIHNlYmFnYWkga29tYmluYXNpIGxpbmVhciBkYXJpICRZX2kkLiBKYWRpIGJhaWsgJFxoYXQge1xiZXRhfV8wJCBkYW4gJFxoYXQge1xiZXRhfV8xJCBhZGFsYWggZXN0aW1hdG9yIGxpbmllci4NCg0KIyMjIFRpZGFrIEJpYXMNCg0KU2VrYXJhbmcga2l0YSB0YWh1IGJhaHdhIHBlcmtpcmFhbiBraXRhIGxpbmllciwgc2ViZXJhcGEgYmFpayBwZXJraXJhYW4gaW5pPyBTYWxhaCBzYXR1IHVrdXJhbiAia2ViYWlrYW4iIGRhcmkgc3VhdHUgcGVya2lyYWFuIGFkYWxhaCAqKmJpYXNueWEqKi4gU2VjYXJhIGtodXN1cywga2l0YSBsZWJpaCBzdWthIHBlcmtpcmFhbiB5YW5nICoqdGlkYWsgYmlhcyoqLCBhcnRpbnlhIG5pbGFpIHlhbmcgZGloYXJhcGthbiBhZGFsYWggcGFyYW1ldGVyIHlhbmcgc2VkYW5nIGRpcGVya2lyYWthbi4NCkRhbGFtIGthc3VzIGVzdGltYXNpIHJlZ3Jlc2ksIGtpdGEgbWVtaWxpa2ksDQokJFxiZWdpbnthbGlnbmVkfQ0KXHRleHR7RX1bXGhhdHtcYmV0YX1fMF0gJj0gXGJldGFfMCBcXA0KXHRleHR7RX1bXGhhdHtcYmV0YX1fMV0gJj0gXGJldGFfMS4NClxlbmR7YWxpZ25lZH0kJA0KDQpJbmkgbWVtYmVyaSB0YWh1IGtpdGEgYmFod2EsIGtldGlrYSBrb25kaXNpIG1vZGVsIFNMUiB0ZXJwZW51aGksIHJhdGEtcmF0YSBwZXJraXJhYW4ga2l0YSBha2FuIGJlbmFyLiBOYW11biwgc2VwZXJ0aSB5YW5nIGtpdGEgbGloYXQgcGFkYSBiYWdpYW4gdGVyYWtoaXIgc2FhdCBtZWxha3VrYW4gc2ltdWxhc2kgZGFyaSBtb2RlbCBTTFIsIGl0dSB0aWRhayBiZXJhcnRpIGJhaHdhIHNldGlhcCBwZXJraXJhYW4gaW5kaXZpZHUgYWthbiBiZW5hci4gSGFueWEgc2FqYSwgamlrYSBraXRhIG1lbmd1bGFuZ2kgcHJvc2VzIHRlcnNlYnV0IGJlYmVyYXBhIGthbGksIHJhdGEtcmF0YSBwZXJraXJhYW5ueWEgYWthbiBiZW5hci4NCg0KIyMjIFRlcmJhaWsNCg0KU2VrYXJhbmcsIGppa2Ega2l0YSBtZW1iYXRhc2kgZGlyaSBwYWRhIGVzdGltYXNpICpsaW5pZXIqIGRhbiAqdGlkYWsgYmlhcyosIGJhZ2FpbWFuYSBraXRhIG1lbmRlZmluaXNpa2FuIGVzdGltYXNpIHRlcmJhaWs/IEVzdGltYXNpIGRlbmdhbiAqKnZhcmlhbnMgbWluaW11bSoqLg0KQ2F0YXRhbiBwZXJ0YW1hIGJhaHdhIHNhbmdhdCBtdWRhaCB1bnR1ayBtZW1idWF0IGVzdGltYXNpIHVudHVrICRcYmV0YV8xJCB5YW5nIG1lbWlsaWtpIHZhcmlhbnMgc2FuZ2F0IHJlbmRhaCwgdGV0YXBpIHRpZGFrIGJpYXMuIE1pc2FsbnlhLCB0ZW50dWthbjoNCiQkXGhhdHtcdGhldGF9X3tCQUR9ID0gNS4kJA0KS2VtdWRpYW4sIGthcmVuYSAkXGhhdCB7XHRoZXRhfV9CQUQkIGFkYWxhaCBuaWxhaSBrb25zdGFuLCAkXHRleHR7VmFyfVtcaGF0e1x0aGV0YX1fe0JBRH1dID0gMC4kDQpOYW11biBzZWphayBpdHUsICQkXHRleHR7RX1bXGhhdHtcdGhldGF9X3tCQUR9XSA9IDUkJA0Ka2l0YSBtZW5nYXRha2FuIGJhaHdhICRcaGF0IHtcdGhldGF9X0JBRCQgYWRhbGFoIHBlbmR1Z2EgYmlhcyBrZWN1YWxpICRcYmV0YV8xPTUkLCB5YW5nIHRpZGFrIGFrYW4ga2l0YSBrZXRhaHVpIHNlYmVsdW1ueWEuIFVudHVrIGFsYXNhbiBpbmksIGluaSBhZGFsYWggcGVya2lyYWFuIHlhbmcgYnVydWsgKGtlY3VhbGkga2ViZXR1bGFuICRcYmV0YV8xPTUkKSBtZXNraXB1biBtZW1pbGlraSBrZW11bmdraW5hbiB2YXJpYW4gdGVya2VjaWwuIEluaSBhZGFsYWggYmFnaWFuIGRhcmkgYWxhc2FuIGtpdGEgbWVtYmF0YXNpIGRpcmkgcGFkYSBwZXJraXJhYW4geWFuZyB0aWRhayBiaWFzLiBBcGEgZ3VuYW55YSBwZXJraXJhYW4sIGppa2EgbWVtcGVya2lyYWthbiBrdWFudGl0YXMgeWFuZyBzYWxhaD8NCkphZGkgc2VrYXJhbmcsIHBlcnRhbnlhYW4gYXNsaW55YSBhZGFsYWgsIGFwYSB2YXJpYW5zIGRhcmkgJFxoYXQge1xiZXRhfV8wJCBkYW4gJFxoYXQge1xiZXRhfV8xJCBNZXJla2EsDQokJFxiZWdpbnthbGlnbmVkfQ0KXHRleHR7VmFyfVtcaGF0e1xiZXRhfV8wXSAmPSBcc2lnbWFeMiBcbGVmdChcZnJhY3sxfXtufSArIFxmcmFje1xiYXJ7eH1eMn17U197eHh9fVxyaWdodCkgXFwNClx0ZXh0e1Zhcn1bXGhhdHtcYmV0YX1fMV0gJj0gXGZyYWN7XHNpZ21hXjJ9e1Nfe3h4fX0uDQpcZW5ke2FsaWduZWR9JCQNCkluaSBtZW5ndWt1ciB2YXJpYWJpbGl0YXMgcGVya2lyYWFuIGthcmVuYSBwZWx1YW5nIGFjYWsgc2VsYW1hIHBlbmdhbWJpbGFuIHNhbXBlbC4gQXBha2FoIGluaSAieWFuZyB0ZXJiYWlrIj8gQXBha2FoIHZhcmlhbnMgaW5pIHNla2VjaWwga2VtdW5na2luYW4geWFuZyBiaXNhIGtpdGEgZGFwYXRrYW4/IEFuZGEgaGFueWEgcGVybHUgbWVtcGVyY2F5YWkgYXBhIHlhbmcga2l0YSBrYXRha2FuIGthcmVuYSBtZW51bmp1a2thbiBiYWh3YSBpbmkgYmVuYXIgYmVyYWRhIGRpIGx1YXIgY2FrdXBhbiBrdXJzdXMgaW5pLg0KDQojIyBEaXN0cmlidXNpIFNhbXBsaW5nDQoNClNla2FyYW5nIGtpdGEgdGVsYWgg4oCcbWVuZGVmaW5pc2lrYW4gdWxhbmfigJ0gcGVya2lyYWFuIHVudHVrICRcaGF0IHtcYmV0YX1fMCQgZGFuICRcaGF0IHtcYmV0YX1fMSQgc2ViYWdhaSB2YXJpYWJlbCBhY2FrLCBraXRhIGRhcGF0IG1lbmRpc2t1c2lrYW4gKipkaXN0cmlidXNpIHNhbXBsaW5nbnlhKiosIHlhbmcgbWVydXBha2FuIGRpc3RyaWJ1c2kga2V0aWthIHN0YXRpc3RpayBkaWFuZ2dhcCBzZWJhZ2FpIHZhcmlhYmVsIGFjYWsuDQpLYXJlbmEgJFxoYXQge1xiZXRhfV8wJCBkYW4gJFxoYXQge1xiZXRhfV8xJCBhZGFsYWgga29tYmluYXNpIGxpbmVhciBkYXJpICRZX2kkIGRhbiBzZXRpYXAgJFlfaSQgdGVyZGlzdHJpYnVzaSBub3JtYWwsIG1ha2EgJFxoYXQge1xiZXRhfV8wJCBkYW4gJFxoYXQge1xiZXRhfV8xJCBqdWdhIG1lbmdpa3V0aSBkaXN0cmlidXNpIG5vcm1hbC4NClVudHVrICRcaGF0IHtcYmV0YX1fMSQga2l0YSBrYXRha2FuLA0KJCRcaGF0e1xiZXRhfV8xID0gXGZyYWN7U197eHl9fXtTX3t4eH19IA0KPSBcZnJhY3tcc3VtX3tpID0gMX1ee259KHhfaSAtIFxiYXJ7eH0pIFlfaX17XHN1bV97aSA9IDF9XntufSh4X2kgLSBcYmFye3h9KV4yfQ0KXHNpbSBOXGxlZnQoICBcYmV0YV8xLCBcIFxmcmFje1xzaWdtYV4yfXtcc3VtX3tpID0gMX1ee259KHhfaSAtIFxiYXJ7eH0pXjJ9IFxyaWdodCkuJCQNCg0KQXRhdSBsZWJpaCBzaW5na2F0bnlhLA0KJCRcaGF0e1xiZXRhfV8xIFxzaW0gTlxsZWZ0KCAgXGJldGFfMSwgXGZyYWN7XHNpZ21hXjJ9e1Nfe3h4fX0gXHJpZ2h0KS4kJA0KDQpEYW4gdW50dWsgJFxoYXQge1xiZXRhfV8wJA0KJCRcaGF0e1xiZXRhfV8wID0gXGJhcntZfSAtIFxoYXR7XGJldGF9XzEgXGJhcnt4fSANClxzaW0gTlxsZWZ0KCAgXGJldGFfMCwgXCBcZnJhY3tcc2lnbWFeMiBcc3VtX3tpID0gMX1ee259eF9pXjJ9e24gXHN1bV97aSA9IDF9XntufSh4X2kgLSBcYmFye3h9KV4yfSBccmlnaHQpLiQkDQoNCkF0YXUgbGViaWggc2luZ2thdG55YSwNCiRcaGF0e1xiZXRhfV8wIFxzaW0gTlxsZWZ0KCAgXGJldGFfMCwgXHNpZ21hXjIgXGxlZnQoXGZyYWN7MX17bn0gKyBcZnJhY3tcYmFye3h9XjJ9e1Nfe3h4fX1ccmlnaHQpIFxyaWdodCkkDQoNClBhZGEgdGl0aWsgaW5pIGtpdGEgdGVsYWggbGFsYWkgdW50dWsgbWVtYnVrdGlrYW4gc2VqdW1sYWggaGFzaWwgaW5pLiBBbGloLWFsaWggYmVrZXJqYSBtZWxhbHVpIHR1cnVuYW4geWFuZyBtZW1ib3NhbmthbiBkYXJpIGRpc3RyaWJ1c2kgc2FtcGxpbmcgaW5pLCBraXRhIGFrYW4gbWVtYmVuYXJrYW4gaGFzaWwgaW5pIHVudHVrIGRpcmkga2l0YSBzZW5kaXJpIG1lbmdndW5ha2FuIHNpbXVsYXNpLg0KQ2F0YXRhbiB1bnR1ayBwZW1iYWNhIHNhYXQgaW5pOiBEZXJpdmFzaSBkYW4gYnVrdGkgaW5pIGRhcGF0IGRpdGFtYmFoa2FuIGtlIGxhbXBpcmFuIGRpIGxhaW4gd2FrdHUuIEFuZGEganVnYSBkYXBhdCBtZW5lbXVrYW4gaGFzaWwgaW5pIGRpIGhhbXBpciBzZW11YSBidWt1IHRla3MgcmVncmVzaSBsaW5pZXIgc3RhbmRhci4gRGkgVUlVQywgaGFzaWwgaW5pIGtlbXVuZ2tpbmFuIGJlc2FyIGFrYW4gZGlzYWppa2FuIGRpIFNUQVQgNDI0IGRhbiBTVEFUIDQyNS4gTmFtdW4sIGthcmVuYSBBbmRhIHRpZGFrIGFrYW4gZGltaW50YSB1bnR1ayBtZWxha3VrYW4gcGVudXJ1bmFuIGplbmlzIGluaSBkYWxhbSBrdXJzdXMgaW5pLCBoYXNpbCB0ZXJzZWJ1dCB1bnR1ayBzYWF0IGluaSBkaWhpbGFuZ2thbi4NCg0KIyMjIFNpbXVsYXNpIERpc3RyaWJ1c2kgU2FtcGxpbmcNCg0KVW50dWsgbWVtdmVyaWZpa2FzaSBoYXNpbCBkaSBhdGFzLCBraXRhIGFrYW4gbWVuc2ltdWxhc2lrYW4gc2FtcGVsIGRlbmdhbiB1a3VyYW4gJG4gPSAxMDAkIGRhcmkgbW9kZWwNCiQkWV9pID0gXGJldGFfMCArIFxiZXRhXzEgeF9pICsgXGVwc2lsb25faSQkDQpkaW1hbmEgJFxlcHNpbG9uX2kgXHNpbSBOKDAsIFxzaWdtYV4yKS4kIERhbGFtIGhhbCBpbmksIHBhcmFtZXRlcm55YSBhZGFsYWg6DQoNCiogJFxiZXRhXzAgPSAzJA0KKiAkXGJldGFfMSA9IDYkDQoqICRcc2lnbWFeMiA9IDQkDQoNCktlbXVkaWFuLCBiZXJkYXNhcmthbiBoYWwgZGkgYXRhcywga2l0YSBoYXJ1cyBtZW5lbXVrYW4gaXR1IA0KJCRcaGF0e1xiZXRhfV8xIFxzaW0gTlxsZWZ0KCAgXGJldGFfMSwgXGZyYWN7XHNpZ21hXjJ9e1Nfe3h4fX0gXHJpZ2h0KSQkDQpkYW4NCiQkXGhhdHtcYmV0YX1fMCBcc2ltIE5cbGVmdCggIFxiZXRhXzAsIFxzaWdtYV4yIFxsZWZ0KFxmcmFjezF9e259ICsgXGZyYWN7XGJhcnt4fV4yfXtTX3t4eH19XHJpZ2h0KSBccmlnaHQpLiQkDQoNClBlcnRhbWEga2l0YSBwZXJsdSBtZW11dHVza2FuIHNlYmVsdW1ueWEgYmVyYXBhIG5pbGFpICR4JCBraXRhIHVudHVrIHNpbXVsYXNpIGluaSwga2FyZW5hIG5pbGFpICR4JCBkYWxhbSBTTFIganVnYSBkaWFuZ2dhcCBrdWFudGl0YXMgeWFuZyBkaWtldGFodWkuIFBpbGloYW4gbmlsYWkgJHgkIGJlcnViYWgtdWJhaC4gRGkgc2luaSBraXRhIGp1Z2EgbWVuZXRhcGthbiBiaWxhbmdhbiB1bnR1ayBwZW5nYWNha2FuLCBkYW4gbWVuZ2hpdHVuZyAkU194eCQgeWFuZyBha2FuIGtpdGEgcGVybHVrYW4gdW50dWsgc2VsYW5qdXRueWEuDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoNDIpDQpzYW1wbGVfc2l6ZSA9IDEwMCAjIHRoaXMgaXMgbg0KeCAgID0gc2VxKC0xLCAxLCBsZW5ndGggPSBzYW1wbGVfc2l6ZSkNClN4eCA9IHN1bSgoeCAtIG1lYW4oeCkpIF4gMikNCmBgYA0KDQpLaXRhIGp1Z2EgbWVtcGVyYmFpa2kgbmlsYWkgcGFyYW1ldGVyIHlhbmcgc3VkYWgga2l0YSB0ZW50dWthbi4NCg0KYGBge3J9DQpiZXRhXzAgPSAzDQpiZXRhXzEgPSA2DQpzaWdtYSAgPSAyDQpgYGANCg0KRGVuZ2FuIGluZm9ybWFzaSBpbmksIGtpdGEgdGFodSBkaXN0cmlidXNpIHNhbXBsaW5nIHNlaGFydXNueWE6DQoNCmBgYHtyfQ0KKHZhcl9iZXRhXzFfaGF0ID0gc2lnbWEgXiAyIC8gU3h4KQ0KYGBgDQpgYGB7cn0NCih2YXJfYmV0YV8wX2hhdCA9IHNpZ21hIF4gMiAqICgxIC8gc2FtcGxlX3NpemUgKyBtZWFuKHgpIF4gMiAvIFN4eCkpDQpgYGANCg0KJCRcaGF0e1xiZXRhfV8xIFxzaW0gTiggIDYsIDAuMTE3NjIzOCkkJA0KZGFuDQokJFxoYXR7XGJldGF9XzAgXHNpbSBOKCAgMywgMC4wNCkuJCQNCkl0dSBhZGFsYWgsDQokJFxiZWdpbnthbGlnbmVkfQ0KXHRleHR7RX1bXGhhdHtcYmV0YX1fMV0gJj0gNiBcXA0KXHRleHR7VmFyfVtcaGF0e1xiZXRhfV8xXSAmPSAwLjExNzYyMzgNClxlbmR7YWxpZ25lZH0kJA0KZGFuDQokJFxiZWdpbnthbGlnbmVkfQ0KXHRleHR7RX1bXGhhdHtcYmV0YX1fMF0gJj0gMyBcXA0KXHRleHR7VmFyfVtcaGF0e1xiZXRhfV8wXSAmPSAwLjA0Lg0KXGVuZHthbGlnbmVkfSQkDQoNCkFydGlueWEsIEtpdGEgc2VrYXJhbmcgbWVuc2ltdWxhc2lrYW4gZGF0YSBkYXJpIG1vZGVsIGluaSBzZWJhbnlhayAxMC4wMDAga2FsaS4gUGVyaGF0aWthbiBiYWh3YSBpbmkgbXVuZ2tpbiBidWthbiBjYXJhIHlhbmcgdGVyYmFpayBkYWxhbSBgUmAgZGFsYW0gbWVsYWt1a2FuIHNpbXVsYXNpLiBLaXRhIG1lbGFrdWthbiBzaW11bGFzaSBkZW5nYW4gY2FyYSBpbmkgZGFsYW0gdXBheWEgdW50dWsgbWVuZGFwYXRrYW4ga2VqZWxhc2FuLiBNaXNhbG55YSwga2l0YSBiaXNhIG1lbmdndW5ha2FuIGZ1bmdzaSBgc2ltX3NsciAoKWAgZGFyaSBiYWdpYW4gc2ViZWx1bW55YS4gS2l0YSBqdWdhIGhhbnlhIG1lbnlpbXBhbiB2YXJpYWJlbCBkaSBsaW5na3VuZ2FuIGdsb2JhbCBhbGloLWFsaWggbWVtYnVhdCBiaW5na2FpIGRhdGEgdW50dWsgc2V0aWFwIGt1bXB1bGFuIGRhdGEgc2ltdWxhc2kgYmFydS4NCmBgYHtyfQ0KbnVtX3NhbXBsZXMgPSAxMDAwMA0KYmV0YV8wX2hhdHMgPSByZXAoMCwgbnVtX3NhbXBsZXMpDQpiZXRhXzFfaGF0cyA9IHJlcCgwLCBudW1fc2FtcGxlcykNCg0KZm9yIChpIGluIDE6bnVtX3NhbXBsZXMpIHsNCiAgZXBzID0gcm5vcm0oc2FtcGxlX3NpemUsIG1lYW4gPSAwLCBzZCA9IHNpZ21hKQ0KICB5ICAgPSBiZXRhXzAgKyBiZXRhXzEgKiB4ICsgZXBzDQogIA0KICBzaW1fbW9kZWwgPSBsbSh5IH4geCkNCiAgDQogIGJldGFfMF9oYXRzW2ldID0gY29lZihzaW1fbW9kZWwpWzFdDQogIGJldGFfMV9oYXRzW2ldID0gY29lZihzaW1fbW9kZWwpWzJdDQp9DQpgYGANCg0KU2V0aWFwIGthbGkga2l0YSBtZW5zaW11bGFzaWthbiBkYXRhLCBrYW1pIG1lbXBlcm9sZWggbmlsYWkga29lZmlzaWVuIHlhbmcgZGlwZXJraXJha2FuLiBWYXJpYWJlbCAkXGhhdHtcYmV0YX1fMCQgZGFuICRcaGF0e1xiZXRhfV8xJCBzZWthcmFuZyBtZW55aW1wYW4gMTAuMDAwIG5pbGFpIHNpbXVsYXNpICRcaGF0e1xiZXRhfV8wJCBkYW4gJFxoYXR7XGJldGF9XzEkIG1hc2luZy1tYXNpbmcuDQoNClBlcnRhbWEtdGFtYSwga2l0YSBtZW12ZXJpZmlrYXNpIGRpc3RyaWJ1c2kNCmBgYHtyfQ0KbWVhbihiZXRhXzFfaGF0cykgIyBlbXBpcmljYWwgbWVhbg0KYmV0YV8xICAgICAgICAgICAgIyB0cnVlIG1lYW4NCnZhcihiZXRhXzFfaGF0cykgICMgZW1waXJpY2FsIHZhcmlhbmNlDQp2YXJfYmV0YV8xX2hhdCAgICAjIHRydWUgdmFyaWFuY2UNCmBgYA0KDQpLaXRhIG1lbGloYXQgYmFod2EgY2FyYSBlbXBpcmlzIGRhbiBjYXJhIHlhbmcgYmVuYXIgZGFuIHZhcmlhbnMgKnNhbmdhdCogbWlyaXAuIEtpdGEganVnYSBtZW12ZXJpZmlrYXNpIGJhaHdhIGRpc3RyaWJ1c2kgZW1waXJpcyBpdHUgbm9ybWFsLiBVbnR1ayBtZWxha3VrYW5ueWEsIGtpdGEgbWVtcGxvdCBoaXN0b2dyYW0gZGFyaSAkXGhhdHtcYmV0YX1fMSQsIGRhbiBtZW5hbWJhaGthbiBrdXJ2YSB1bnR1ayBkaXN0cmlidXNpIHNlYmVuYXJueWEgZGFyaSAkXGhhdHtcYmV0YX1fMSQuIEthbWkgbWVuZ2d1bmFrYW4gYHByb2IgPSBUUlVFYCB1bnR1ayBtZWxldGFra2FuIGhpc3RvZ3JhbSBwYWRhIHNrYWxhIHlhbmcgc2FtYSBkZW5nYW4ga3VydmEgbm9ybWFsLg0KYGBge3J9DQojIG5vdGUgbmVlZCB0byB1c2UgcHJvYiA9IFRSVUUNCmhpc3QoYmV0YV8xX2hhdHMsIHByb2IgPSBUUlVFLCBicmVha3MgPSAyMCwgDQogICAgIHhsYWIgPSBleHByZXNzaW9uKGhhdChiZXRhKVsxXSksIG1haW4gPSAiIiwgYm9yZGVyID0gImRvZGdlcmJsdWUiKQ0KY3VydmUoZG5vcm0oeCwgbWVhbiA9IGJldGFfMSwgc2QgPSBzcXJ0KHZhcl9iZXRhXzFfaGF0KSksIA0KICAgICAgY29sID0gImRhcmtvcmFuZ2UiLCBhZGQgPSBUUlVFLCBsd2QgPSAzKQ0KYGBgDQoNCktlbXVkaWFuIGtpdGEgbWVuZ3VsYW5naSBwcm9zZXMgeWFuZyBzYW1hIHVudHVrICRcaGF0e1xiZXRhfV8wJA0KYGBge3J9DQptZWFuKGJldGFfMF9oYXRzKSAjIGVtcGlyaWNhbCBtZWFuDQpiZXRhXzAgICAgICAgICAgICAjIHRydWUgbWVhbg0KdmFyKGJldGFfMF9oYXRzKSAgIyBlbXBpcmljYWwgdmFyaWFuY2UNCnZhcl9iZXRhXzBfaGF0ICAgICMgdHJ1ZSB2YXJpYW5jZQ0KYGBgDQpgYGB7cn0NCmhpc3QoYmV0YV8wX2hhdHMsIHByb2IgPSBUUlVFLCBicmVha3MgPSAyNSwgDQogICAgIHhsYWIgPSBleHByZXNzaW9uKGhhdChiZXRhKVswXSksIG1haW4gPSAiIiwgYm9yZGVyID0gImRvZGdlcmJsdWUiKQ0KY3VydmUoZG5vcm0oeCwgbWVhbiA9IGJldGFfMCwgc2QgPSBzcXJ0KHZhcl9iZXRhXzBfaGF0KSksDQogICAgICBjb2wgPSAiZGFya29yYW5nZSIsIGFkZCA9IFRSVUUsIGx3ZCA9IDMpDQpgYGANCg0KRGFsYW0gc2ltdWxhc2kgaW5pLCBraXRhIGhhbnlhIG1lbnNpbXVsYXNpa2FuIHNlanVtbGFoIHNhbXBlbCB5YW5nIHRlcmJhdGFzLiBVbnR1ayBiZW5hci1iZW5hciBtZW12ZXJpZmlrYXNpIGhhc2lsIGRpc3RyaWJ1c2ksIGtpdGEgcGVybHUgbWVuZ2FtYXRpIGp1bWxhaCBzYW1wZWwgeWFuZyB0YWsgdGVyYmF0YXMuIE5hbXVuLCBwbG90IGJlcmlrdXQgaGFydXMgbWVuamVsYXNrYW4gYmFod2EgamlrYSBraXRhIHRlcnVzIG1lbGFrdWthbiBzaW11bGFzaSwgaGFzaWwgZW1waXJpc255YSBha2FuIHNlbWFraW4gbWVuZGVrYXRpIGFwYSB5YW5nIGRpaGFyYXBrYW4uDQpgYGB7cn0NCnBhcihtYXIgPSBjKDUsIDUsIDEsIDEpKSAjIGFkanVzdGVkIHBsb3QgbWFyZ2lucywgb3RoZXJ3aXNlIHRoZSAiaGF0IiBkb2VzIG5vdCBkaXNwbGF5DQpwbG90KGN1bXN1bShiZXRhXzFfaGF0cykgLyAoMTpsZW5ndGgoYmV0YV8xX2hhdHMpKSwgdHlwZSA9ICJsIiwgeWxpbSA9IGMoNS45NSwgNi4wNSksDQogICAgIHhsYWIgPSAiTnVtYmVyIG9mIFNpbXVsYXRpb25zIiwNCiAgICAgeWxhYiA9IGV4cHJlc3Npb24oIkVtcGlyaWNhbCBNZWFuIG9mICIgfiBoYXQoYmV0YSlbMV0pLA0KICAgICBjb2wgID0gImRvZGdlcmJsdWUiKQ0KYWJsaW5lKGggPSA2LCBjb2wgPSAiZGFya29yYW5nZSIsIGx3ZCA9IDIpDQpgYGANCmBgYHtyfQ0KcGFyKG1hciA9IGMoNSwgNSwgMSwgMSkpICMgYWRqdXN0ZWQgcGxvdCBtYXJnaW5zLCBvdGhlcndpc2UgdGhlICJoYXQiIGRvZXMgbm90IGRpc3BsYXkNCnBsb3QoY3Vtc3VtKGJldGFfMF9oYXRzKSAvICgxOmxlbmd0aChiZXRhXzBfaGF0cykpLCB0eXBlID0gImwiLCB5bGltID0gYygyLjk1LCAzLjA1KSwNCiAgICAgeGxhYiA9ICJOdW1iZXIgb2YgU2ltdWxhdGlvbnMiLA0KICAgICB5bGFiID0gZXhwcmVzc2lvbigiRW1waXJpY2FsIE1lYW4gb2YgIiB+IGhhdChiZXRhKVswXSksDQogICAgIGNvbCAgPSAiZG9kZ2VyYmx1ZSIpDQphYmxpbmUoaCA9IDMsIGNvbCA9ICJkYXJrb3JhbmdlIiwgbHdkID0gMikNCmBgYA0KDQoNCiMjIEtlc2FsYWhhbiBTdGFuZGFyIChTdGFuZGFyZCBFcnJvcnMpDQoNCkphZGkgc2VrYXJhbmcga2l0YSBwZXJjYXlhIHBhZGEgZHVhIGhhc2lsIGRpc3RyaWJ1c2ksIHlhaXR1DQokJFxiZWdpbnthbGlnbmVkfQ0KXGhhdHtcYmV0YX1fMCAmXHNpbSBOXGxlZnQoICBcYmV0YV8wLCBcc2lnbWFeMiBcbGVmdChcZnJhY3sxfXtufSArIFxmcmFje1xiYXJ7eH1eMn17U197eHh9fVxyaWdodCkgXHJpZ2h0KSBcXA0KXGhhdHtcYmV0YX1fMSAmXHNpbSBOXGxlZnQoICBcYmV0YV8xLCBcZnJhY3tcc2lnbWFeMn17U197eHh9fSBccmlnaHQpLg0KXGVuZHthbGlnbmVkfSQkDQoNCktlbXVkaWFuIGRlbmdhbiBtZW1iYWt1a2FuIGhhc2lsIGluaSwga2l0YSBtZW5lbXVrYW4gaXR1DQokJFxmcmFje1xoYXR7XGJldGF9XzAgLSBcYmV0YV8wfXtcdGV4dHtTRH1bXGhhdHtcYmV0YX1fMF19IFxzaW0gTigwLCAxKSQkDQpkYW4NCiQkXGZyYWN7XGhhdHtcYmV0YX1fMSAtIFxiZXRhXzF9e1x0ZXh0e1NEfVtcaGF0e1xiZXRhfV8xXX0gXHNpbSBOKDAsIDEpJCQNCmRpbWFuYSwNCiQkXHRleHR7U0R9W1xoYXR7XGJldGF9XzBdID0gXHNpZ21hXHNxcnR7XGZyYWN7MX17bn0gKyBcZnJhY3tcYmFye3h9XjJ9e1Nfe3h4fX19JCQNCmRhbg0KJCRcdGV4dHtTRH1bXGhhdHtcYmV0YX1fMV0gPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e1Nfe3h4fX19LiQkDQoNCkthcmVuYSBraXRhIHRpZGFrIHRhaHUgJFxzaWdtYSQgZGFsYW0gcHJha3Rpa255YSwgbWFrYSBraXRhIGhhcnVzIG1lbXBlcmtpcmFrYW5ueWEgbWVuZ2d1bmFrYW4gJHNfZSQsIHlhbmcga2l0YSBtYXN1a2thbiBrZSBla3NwcmVzaSB5YW5nIGFkYSB1bnR1ayBzdGFuZGFyIGRldmlhc2kgZGFyaSBwZXJraXJhYW4ga2l0YS4NCg0KS2VkdWEgZWtzcHJlc2kgYmFydSBpbmkgZGlzZWJ1dCAqKmtlc2FsYWhhbiBzdGFuZGFyKiogeWFuZyBtZXJ1cGFrYW4gKnBlcmtpcmFhbiogc3RhbmRhciBkZXZpYXNpIGRhcmkgZGlzdHJpYnVzaSBzYW1wbGluZy4NCiQkXHRleHR7U0V9W1xoYXR7XGJldGF9XzBdID0gc19lXHNxcnR7XGZyYWN7MX17bn0gKyBcZnJhY3tcYmFye3h9XjJ9e1Nfe3h4fX19JCQNCg0KJCRcdGV4dHtTRX1bXGhhdHtcYmV0YX1fMV0gPSBcZnJhY3tzX2V9e1xzcXJ0e1Nfe3h4fX19JCQNCg0KU2VrYXJhbmcgamlrYSBraXRhIG1lbWJhZ2kgZGVuZ2FuIGtlc2FsYWhhbiBzdGFuZGFyLCBkYXJpIHBhZGEgc3RhbmRhciBkZXZpYXNpLCBraXRhIG1lbXBlcm9sZWggaGFzaWwgYmVyaWt1dCB5YW5nIG1lbXVuZ2tpbmthbiBraXRhIG1lbWJ1YXQgaW50ZXJ2YWwga2VwZXJjYXlhYW4gZGFuIG1lbGFrdWthbiBwZW5ndWppYW4gaGlwb3Rlc2lzLg0KJCRcZnJhY3tcaGF0e1xiZXRhfV8wIC0gXGJldGFfMH17XHRleHR7U0V9W1xoYXR7XGJldGF9XzBdfSBcc2ltIHRfe24tMn0kJA0KDQokJFxmcmFje1xoYXR7XGJldGF9XzEgLSBcYmV0YV8xfXtcdGV4dHtTRX1bXGhhdHtcYmV0YX1fMV19IFxzaW0gdF97bi0yfSQkDQoNClVudHVrIG1lbGloYXQgaW5pLCBoYWwgeWFuZyBwZXJ0YW1hIGRpcGVyaGF0aWthbiB5YWl0dSBiYWh3YSwNCiQkXGZyYWN7XHRleHR7UlNTfX17XHNpZ21hXjJ9ID0gXGZyYWN7KG4tMilzX2VeMn17XHNpZ21hXjJ9IFxzaW0gXGNoaV97bi0yfV4yLiQkDQoNCkp1Z2EgaW5nYXQgYmFod2EgdmFyaWFiZWwgYWNhayAkVCQgZGlkZWZpbmlzaWthbiBzZWJhZ2FpLA0KJCRUID0gXGZyYWN7Wn17XHNxcnR7XGZyYWN7XGNoaV97ZH1eMn17ZH19fSQkDQoNCm1lbmdpa3V0aSBkaXN0cmlidXNpICR0JCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4gJGQkLCBkaSBtYW5hICRcY2hpX3tkfV4yJCBhZGFsYWggdmFyaWFiZWwgYWNhayAkXGNoaV4yJCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4gJGQkLg0KDQpLaXRhIG1lbnVsaXMsIA0KJCRUIFxzaW0gdF9kJCQNCg0KdW50dWsgbWVuZ2F0YWthbiBiYWh3YSB2YXJpYWJlbCBhY2FrICRUJCBtZW5naWt1dGkgZGlzdHJpYnVzaSAkdCQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuICRkJC4NCg0KS2VtdWRpYW4ga2l0YSBtZW5nZ3VuYWthbiB0cmlrIGtsYXNpayAia2FsaWthbiBkZW5nYW4gMSIgZGFuIGJlYmVyYXBhIHBlbnl1c3VuYW4gdWxhbmcgdW50dWsgc2FtcGFpIHBhZGENCiQkXGJlZ2lue2FsaWduZWR9DQpcZnJhY3tcaGF0e1xiZXRhfV8xIC0gXGJldGFfMX17XHRleHR7U0V9W1xoYXR7XGJldGF9XzFdfSANCiY9IFxmcmFje1xoYXR7XGJldGF9XzEgLSBcYmV0YV8xfXtzX2UgLyBcc3FydHtTX3t4eH19fSBcXA0KJj0gXGZyYWN7XGhhdHtcYmV0YX1fMSAtIFxiZXRhXzF9e3NfZSAvIFxzcXJ0e1Nfe3h4fX19IFxjZG90IFxmcmFje1xzaWdtYSAvIFxzcXJ0e1Nfe3h4fX19e1xzaWdtYSAvIFxzcXJ0e1Nfe3h4fX19IFxcDQomPSBcZnJhY3tcaGF0e1xiZXRhfV8xIC0gXGJldGFfMX17XHNpZ21hIC8gXHNxcnR7U197eHh9fX0gXGNkb3QgXGZyYWN7XHNpZ21hIC8gXHNxcnR7U197eHh9fX17c19lIC8gXHNxcnR7U197eHh9fX0gXFwNCiY9IFxmcmFje1xoYXR7XGJldGF9XzEgLSBcYmV0YV8xfXtcc2lnbWEgLyBcc3FydHtTX3t4eH19fSBcYmlnZy8gXHNxcnR7XGZyYWN7c19lXjJ9e1xzaWdtYV4yfX0gXFwNCiY9IFxmcmFje1xoYXR7XGJldGF9XzEgLSBcYmV0YV8xfXtcdGV4dHtTRH1bXGhhdHtcYmV0YX1fMV19IFxiaWdnLyBcc3FydHtcZnJhY3tcZnJhY3sobiAtIDIpc19lXjJ9e1xzaWdtYV4yfX17biAtIDJ9fQ0KXHNpbSBcZnJhY3tafXtcc3FydHtcZnJhY3tcY2hpX3tuLTJ9XjJ9e24tMn19fQ0KXHNpbSB0X3tuLTJ9DQpcZW5ke2FsaWduZWR9JCQNCmRpbWFuYSAkWiBcc2ltIE4oMCwxKSQuDQoNCkluZ2F0bGFoIGJhaHdhIGRpc3RyaWJ1c2kgJHQkIG1pcmlwIGRlbmdhbiBzdGFuZGFyIG5vcm1hbCwgdGV0YXBpIGRlbmdhbiBla29yIHlhbmcgbGViaWggYmVyYXQuIEtldGlrYSBkZXJhamF0IGtlYmViYXNhbiBtZW5pbmdrYXQsIGRpc3RyaWJ1c2kgJHQkIG1lbmphZGkgbGViaWggc2VwZXJ0aSBzdGFuZGFyIG5vcm1hbC4gRGkgYmF3YWggaW5pLCBraXRhIGFrYW4gbWVtcGxvdCBkaXN0cmlidXNpIHN0YW5kYXIgbm9ybWFsIHNlcnRhIGR1YSBjb250b2ggZGlzdHJpYnVzaSAkdCQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuIGJlcmJlZGEuIFBlcmhhdGlrYW4gYmFnYWltYW5hIGRpc3RyaWJ1c2kgJHQkIGRlbmdhbiBkZXJhamF0IGtlYmViYXNhbiB5YW5nIGxlYmloIGJlc2FyIGxlYmloIG1pcmlwIGRlbmdhbiBrdXJ2YSBub3JtYWwgc3RhbmRhci4NCmBgYHtyfQ0KIyBkZWZpbmUgZ3JpZCBvZiB4IHZhbHVlcw0KeCA9IHNlcSgtNCwgNCwgbGVuZ3RoID0gMTAwKQ0KDQojIHBsb3QgY3VydmUgZm9yIHN0YW5kYXJkIG5vcm1hbA0KcGxvdCh4LCBkbm9ybSh4KSwgdHlwZSA9ICJsIiwgbHR5ID0gMSwgbHdkID0gMiwNCiAgICAgeGxhYiA9ICJ4IiwgeWxhYiA9ICJEZW5zaXR5IiwgbWFpbiA9ICJOb3JtYWwgdnMgdCBEaXN0cmlidXRpb25zIikNCiMgYWRkIGN1cnZlcyBmb3IgdCBkaXN0cmlidXRpb25zDQpsaW5lcyh4LCBkdCh4LCBkZiA9IDEpLCBsdHkgPSAzLCBsd2QgPSAyLCBjb2wgPSAiZGFya29yYW5nZSIpDQpsaW5lcyh4LCBkdCh4LCBkZiA9IDEwKSwgbHR5ID0gMiwgbHdkID0gMiwgY29sID0gImRvZGdlcmJsdWUiKQ0KDQojIGFkZCBsZWdlbmQNCmxlZ2VuZCgidG9wcmlnaHQiLCB0aXRsZSA9ICJEaXN0cmlidXRpb25zIiwNCiAgICAgICBsZWdlbmQgPSBjKCJ0LCBkZiA9IDEiLCAidCwgZGYgPSAxMCIsICJTdGFuZGFyZCBOb3JtYWwiKSwgDQogICAgICAgbHdkID0gMiwgbHR5ID0gYygzLCAyLCAxKSwgY29sID0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImJsYWNrIikpDQpgYGANCg0KIyMgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgS2VtaXJpbmdhbiBkYW4gUGVycG90b25nYW4vSW50ZXJzZXANCg0KSW5nYXRsYWggYmFod2EgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgc2FyYW5hIHNlcmluZyBrYWxpIGJlcmJlbnR1azoNCg0KJCRcdGV4dHtFU1R9IFxwbSBcdGV4dHtDUklUfSBcY2RvdCBcdGV4dHtTRX0kJA0KYXRhdQ0KJCRcdGV4dHtFU1R9IFxwbSBcdGV4dHtNQVJHSU59JCQNCg0KZGltYW5hICRcdGV4dHtFU1R9JCBhZGFsYWggcGVya2lyYWFuIHVudHVrIHBhcmFtZXRlciB5YW5nIGRpbWluYXRpLCAkXHRleHR7U0V9JCBhZGFsYWgga2VzYWxhaGFuIHN0YW5kYXIgZGFyaSBwZXJraXJhYW4gdGVyc2VidXQsIGRhbiAkXHRleHR7TUFSR0lOfSA9IFx0ZXh0e0NSSVR9IFxjZG90IFx0ZXh0e1NFfSQNCg0KS2VtdWRpYW4sIHVudHVrICRcYmV0YV8wJCBkYW4gJFxiZXRhXzEpIGtpdGEgZGFwYXQgbWVtYnVhdCBpbnRlcnZhbCBrZXBlcmNheWFhbiBtZW5nZ3VuYWthbiANCiQkXGhhdHtcYmV0YX1fMCBccG0gdF97XGFscGhhLzIsIG4gLSAyfSBcY2RvdCBcdGV4dHtTRX1bXGhhdHtcYmV0YX1fMF0gXHF1YWQgXHF1YWQgXHF1YWQgXGhhdHtcYmV0YX1fMCBccG0gdF97XGFscGhhLzIsIG4gLSAyfSBcY2RvdCBzX2Vcc3FydHtcZnJhY3sxfXtufStcZnJhY3tcYmFye3h9XjJ9e1Nfe3h4fX19JCQNCmRhbg0KJCRcaGF0e1xiZXRhfV8xIFxwbSB0X3tcYWxwaGEvMiwgbiAtIDJ9IFxjZG90IFx0ZXh0e1NFfVtcaGF0e1xiZXRhfV8xXSAgXHF1YWQgXHF1YWQgXHF1YWQgXGhhdHtcYmV0YX1fMSBccG0gdF97XGFscGhhLzIsIG4gLSAyfSBcY2RvdCBcZnJhY3tzX2V9e1xzcXJ0e1Nfe3h4fX19JCQNCmRpbWFuYSAkdF97XGFscGhhLzIsIG4gLSAyfSQgYWRhbGFoIG5pbGFpIGtyaXRpc255YSBzZXBlcnRpICRQKHRfe24tMn0gPiB0X3tcYWxwaGEvMiwgbiAtIDJ9KSA9IFxhbHBoYS8yJA0KDQoNCiMjIFVqaSBIaXBvdGVzaXMNCg0K4oCcV2UgbWF5IHNwZWFrIG9mIHRoaXMgaHlwb3RoZXNpcyBhcyB0aGUg4oCYbnVsbCBoeXBvdGhlc2lz4oCZLCBhbmQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyBuZXZlciBwcm92ZWQgb3IgZXN0YWJsaXNoZWQsIGJ1dCBpcyBwb3NzaWJseSBkaXNwcm92ZWQsIGluIHRoZSBjb3Vyc2Ugb2YgZXhwZXJpbWVudGF0aW9uLuKAnSAqKi1Sb25hbGQgQXlsbWVyIEZpc2hlcioqDQoNCkluZ2F0bGFoIGJhaHdhIHVqaSBzdGF0aXN0aWsgJFx0ZXh0e1RTfSQgdW50dWsgc2FyYW5hIHBlbmd1amlhbiBzZXJpbmcga2FsaSBiZXJiZW50dWs6DQokJFx0ZXh0e1RTfSA9IFxmcmFje1x0ZXh0e0VTVH0gLSBcdGV4dHtIWVB9fXtcdGV4dHtTRX19JCQNCmRpbWFuYSAkXHRleHR7RVNUfSQgYWRhbGFoIHBlcmtpcmFhbiB1bnR1ayBwYXJhbWV0ZXIgeWFuZyBkaW1pbmF0aSwgJFx0ZXh0e0hZUH0kIGFkYWxhaCBuaWxhaSBoaXBvdGVzaXMgZGFyaSBwYXJhbWV0ZXIsIGRhbiAkXHRleHR7U0V9JCBhZGFsYWggcGVya2lyYWFuIGtlc2FsYWhhbiBzdGFuZGFyLg0KDQpKYWRpLCB1bnR1ayBtZW5ndWppbnlhDQokJEhfMDogXGJldGFfMCA9IFxiZXRhX3swMH0gXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfMTogXGJldGFfMCBcbmVxIFxiZXRhX3swMH0kJA0Ka2l0YSBtZW5nZ3VuYWthbiB1amkgc3RhdGlzdGlrDQokJHQgPSBcZnJhY3tcaGF0e1xiZXRhfV8wIC0gXGJldGFfezAwfX17XHRleHR7U0V9W1xoYXR7XGJldGF9XzBdfSA9IFxmcmFje1xoYXR7XGJldGF9XzAtXGJldGFfezAwfX17c19lXHNxcnR7XGZyYWN7MX17bn0gKyBcZnJhY3tcYmFye3h9XjJ9e1Nfe3h4fX19fSQkDQp5YW5nIG1hbmEgZGkgYmF3YWggaGlwb3Rlc2lzIG5vbCwgbWVuZ2lrdXRpIGRpc3RyaWJ1c2kgJHQkIGRlbmdhbiAkbi0yJCBkZXJhamF0IGtlYmViYXNhbi4gS2l0YSBzZWthcmFuZyBtZW5nZ3VuYWthbiAkXGJldGFfMTAkIHVudHVrIG1lbnVuanVra2FuIG5pbGFpIGhpcG90ZXNpcyAkXGJldGFfMSQuDQoNCg0KIyMgQ29udG9oIGBjYXJzYA0KDQpTZWthcmFuZyBraXRhIGtlbWJhbGkga2UgY29udG9oIGRhdGEgYGNhcnNgIGRhcmkgYmFnaWFuIHRlcmFraGlyIHVudHVrIG1lbmdpbHVzdHJhc2lrYW4ga29uc2VwIGluaS4gUGVydGFtYS10YW1hLCBraXRhIG1lbnllc3VhaWthbiBtb2RlbCBtZW5nZ3VuYWthbiBgbG0oKWAga2VtdWRpYW4gbWVuZ2d1bmFrYW4gYHN1bW1hcnkoKWAgdW50dWsgbWVsaWhhdCBoYXNpbCBzZWNhcmEgbGViaWggZGV0YWlsLg0KYGBge3J9DQpzdG9wX2Rpc3RfbW9kZWwgPSBsbShkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzKQ0Kc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpDQpgYGANCg0KIyMjIFBlbmd1amlhbiBkaSBSDQoNClNla2FyYW5nIGtpdGEgYWthbiBtZW1iYWhhcyBoYXNpbCB5YW5nIGRpdGFtcGlsa2FuIHlhbmcgZGlzZWJ1dCBLb2VmaXNpZW4uIFBlcnRhbWEsIGluZ2F0bGFoIGJhaHdhIGtpdGEgZGFwYXQgbWVuZ2Vrc3RyYWsgaW5mb3JtYXNpIGluaSBzZWNhcmEgbGFuZ3N1bmcuDQpgYGB7cn0NCm5hbWVzKHN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSkNCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHMNCmBgYA0KRnVuZ3NpIGBuYW1lcygpYCBtZW1iZXJpdGFodSBraXRhIGluZm9ybWFzaSBhcGEgeWFuZyB0ZXJzZWRpYSwgZGFuIGtlbXVkaWFuIGtpdGEgbWVuZ2d1bmFrYW4gYCRgIG9wZXJhdG9yIGRhbiBgY29lZmZpY2llbnRzYCB1bnR1ayBtZW5nZWtzdHJhayBpbmZvcm1hc2kgeWFuZyBraXRhIG1pbmF0aS4gRHVhIG5pbGFpIGRpIHNpbmkgaGFydXMgc2VnZXJhIGtpdGEga2VuYWwuDQokJFxoYXR7XGJldGF9XzAgPSAtMTcuNTc5MDk0OSQkDQpkYW4NCiQkXGhhdHtcYmV0YX1fMSA9IDMuOTMyNDA4OCQkDQp5YW5nIG1lcnVwYWthbiBwZXJraXJhYW4ga2FtaSB1bnR1ayBwYXJhbWV0ZXIgbW9kZWwgJFxiZXRhXzAkIGRhbiAkXGJldGFfMSQuDQoNClNla2FyYW5nIGtpdGEgZm9rdXMgcGFkYSBiYXJpcyBrZWR1YSBkYXJpIGtlbHVhcmFuLCB5YW5nIHJlbGV2YW4gZGVuZ2FuICRcYmV0YV8xJC4NCmBgYHtyfQ0Kc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpJGNvZWZmaWNpZW50c1syLF0NCmBgYA0KU2VrYWxpIGxhZ2ksIG5pbGFpIHBlcnRhbWEsIGBFc3RpbWF0ZWAgYWRhbGFoDQokJFxoYXR7XGJldGF9XzEgPSAzLjkzMjQwODguJCQNCk5pbGFpIGtlZHVhLCBgU3RkLiBFcnJwcmAsIGFkYWxhaCBrZXNhbGFoYW4gc3RhbmRhciBkYXJpICRcaGF0e1xiZXRhfV8xJCwNCiQkXHRleHR7U0V9W1xoYXR7XGJldGF9XzFdID0gXGZyYWN7c19lfXtcc3FydHtTX3t4eH19fSA9IDAuNDE1NTEyOC4kJA0KTmlsYWkga2V0aWdhLCBgdCB2YWx1ZWAsIG1lcnVwYWthbiBuaWxhaSB1amkgc3RhdGlzdGlrIHVudHVrIHBlbmd1amlhbiAkSF8wOiBcYmV0YV8xID0gMCQgZGVuZ2FuICRIXzE6IFxiZXRhXzEgXG5lcSAwJCwNCiQkdCA9IFxmcmFje1xoYXR7XGJldGF9XzEtMH17XHRleHR7U0V9W1xoYXR7XGJldGF9XzFdfSA9IFxmcmFje1xoYXR7XGJldGF9XzEtMH17c19lIC8gXHNxcnR7U197eHh9fX0gPSA5LjQ2Mzk5LiQkDQpUZXJha2hpciwgYFByKD58dHwpYCwgbWVtYmVyaSBraXRhIG5pbGFpIHAgZGFyaSBwZW5ndWppYW4gaXR1Lg0KJCRcdGV4dHtwLXZhbHVlfSA9IDEuNDg5ODM2NVx0aW1lcyAxMF57LTEyfSQkDQpQZXJoYXRpa2FuIGRpIHNpbmksIGtpdGEgc2VjYXJhIGtodXN1cyBtZW5ndWppIGFwYWthaCBiZW5hciBhdGF1IHRpZGFrIGJhaHdhICRcYmV0YV8xPTAkDQpCYXJpcyBwZXJ0YW1hIGtlbHVhcmFuIG1lbGFwb3JrYW4gbmlsYWkgeWFuZyBzYW1hLCB0ZXRhcGkgdW50dWsgJFxiZXRhXzAkDQpgYGB7cn0NCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHNbMSxdDQpgYGANClNpbmdrYXRueWEsIGtvZGUgYmVyaWt1dCBtZW55aW1wYW4gaW5mb3JtYXNpIGRhcmkgYHN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHNgIGRhbGFtIHZhcmlhYmVsIGJhcnUgYHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9gLCBrZW11ZGlhbiBtZW5nZWtzdHJhayBzZXRpYXAgZWxlbWVuIG1lbmphZGkgdmFyaWFiZWwgYmFydSB5YW5nIG1lbmRlc2tyaXBzaWthbiBpbmZvcm1hc2kgeWFuZyBkaWRhbGFtbnlhLg0KYGBge3J9DQpzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvID0gc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpJGNvZWZmaWNpZW50cw0KDQpiZXRhXzBfaGF0ICAgICAgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzEsIDFdICMgRXN0aW1hdGUNCmJldGFfMF9oYXRfc2UgICA9IHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9bMSwgMl0gIyBTdGQuIEVycm9yDQpiZXRhXzBfaGF0X3QgICAgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzEsIDNdICMgdCB2YWx1ZQ0KYmV0YV8wX2hhdF9wdmFsID0gc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb1sxLCA0XSAjIFByKD58dHwpDQoNCmJldGFfMV9oYXQgICAgICA9IHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9bMiwgMV0gIyBFc3RpbWF0ZQ0KYmV0YV8xX2hhdF9zZSAgID0gc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb1syLCAyXSAjIFN0ZC4gRXJyb3INCmJldGFfMV9oYXRfdCAgICA9IHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9bMiwgM10gIyB0IHZhbHVlDQpiZXRhXzFfaGF0X3B2YWwgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzIsIDRdICMgUHIoPnx0fCkNCmBgYA0KDQpLZW11ZGlhbiBraXRhIGRhcGF0IG1lbXZlcmlmaWthc2kgYmViZXJhcGEgZWtzcHJlc2kgeWFuZyBzZXRhcmE6IHN0YXRpc3RpayB1amkgJHQkIHVudHVrICRcaGF0e1xiZXRhfV8xJCBkYW4gbmlsYWkgJHAkIGR1YSBzaXNpIHlhbmcgdGVya2FpdCBkZW5nYW4gdWppIHN0YXRpc3RpayB0ZXJzZWJ1dC4NCmBgYHtyfQ0KKGJldGFfMV9oYXQgLSAwKSAvIGJldGFfMV9oYXRfc2UNCmJldGFfMV9oYXRfdA0KMiAqIHB0KGFicyhiZXRhXzFfaGF0X3QpLCBkZiA9IGxlbmd0aChyZXNpZChzdG9wX2Rpc3RfbW9kZWwpKSAtIDIsIGxvd2VyLnRhaWwgPSBGQUxTRSkNCmJldGFfMV9oYXRfcHZhbA0KYGBgDQoNCiMjIyBTaWduaWZpa2Fuc2kgUmVncmVzaSwgVWppLXQNCg0KS2l0YSBiZXJoZW50aSBzZWplbmFrIHVudHVrIG1lbWJhaGFzICoqcGVudGluZ255YSB1amkgcmVncmVzaSoqLiBQZXJ0YW1hLCBwZXJoYXRpa2FuIGJhaHdhIGJlcmRhc2Fya2FuIGhhc2lsIGRpc3RyaWJ1c2kgZGkgYXRhcywga2l0YSBkYXBhdCBtZW5ndWppICRcYmV0YV8wJCBkYW4gJFxiZXRhXzEkIHRlcmhhZGFwIG5pbGFpIHRlcnRlbnR1LCBkYW4gbWVsYWt1a2FuIHBlbmd1amlhbiBzYXR1IGRhbiBkdWEgc2lzaS4NCk5hbXVuLCBzYXR1IHRlcyB5YW5nIHNhbmdhdCBzcGVzaWZpaywNCiQkSF8wOiBcYmV0YV8xID0gMCBccXVhZCBcdGV4dHt2c30gXHF1YWQgSF8xOiBcYmV0YV8xIFxuZXEgMCQkDQpwYWxpbmcgc2VyaW5nIGRpZ3VuYWthbi4gTWFyaSBwaWtpcmthbiB0ZW50YW5nIHBlbmd1amlhbiBpbmkgZGFsYW0ga2FpdGFubnlhIGRlbmdhbiBtb2RlbCByZWdyZXNpIGxpbmllciBzZWRlcmhhbmEsDQokJFlfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfaSArIFxlcHNpbG9uX2kuJCQNCkppa2Ega2FtaSBtZW5nYXN1bXNpa2FuIGhpcG90ZXNpcyBub2wgYmVuYXIsIG1ha2EgJFxiZXRhXzE9MCQgZGFuIGthbWkgbWVtaWxpa2kgbW9kZWwsDQokJFlfaSA9IFxiZXRhXzAgKyBcZXBzaWxvbl9pLiQkDQoNCkRhbGFtIG1vZGVsIGluaSwgcmVzcG9uIHRpZGFrIGJlcmdhbnR1bmcgcGFkYSBwcmVkaWt0b3IuIEphZGkga2l0YSBiaXNhIG1lbWlraXJrYW4gdGVzIGluaSBkZW5nYW4gY2FyYSBiZXJpa3V0LA0KDQoqIERpYmF3YWggJEhfMCQgdGlkYWsgYWRhIGh1YnVuZ2FuIGxpbmllciB5YW5nIHNpZ25pZmlrYW4gYW50YXJhICR4JCBkYW4gJHkkLg0KKiBEaWJhd2FoICRIXzEkIGFkYSBodWJ1bmdhbiAqKmxpbmllcioqIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgJHgkIGRhbiAkeSQuDQoNClVudHVrIGNvbnRvaCBgY2Fyc2AsDQoNCiogRGliYXdhaCAkSF8wJCB0aWRhayBhZGEgaHVidW5nYW4gbGluaWVyIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEga2VjZXBhdGFuIGRhbiBqYXJhayBiZXJoZW50aS4NCiogRGliYXdhaCAkSF8xJCBhZGEgaHVidW5nYW4gKipsaW5pZXIqKiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlY2VwYXRhbiBkYW4gamFyYWsgYmVyaGVudGkuDQoNClNla2FsaSBsYWdpLCBwZW5ndWppYW4gaXR1IHRlcmxpaGF0IHBhZGEga2VsdWFyYW4gZGFyaSBgc3VtbWFyeSgpYCwNCiQkXHRleHR7cC12YWx1ZX0gPSAxLjQ4OTgzNjVcdGltZXMgMTBeey0xMn0uJCQNCg0KRGVuZ2FuIG5pbGFpLXAgeWFuZyBzYW5nYXQgcmVuZGFoIGluaSwga2l0YSBha2FuIG1lbm9sYWsgaGlwb3Rlc2lzIG5vbCBwYWRhIHRpbmdrYXQgJFxhbHBoYSQgeWFuZyBtYXN1ayBha2FsLCBtaXNhbG55YSAkXGFscGhhID0gMCwwMSQuIEphZGkga2l0YSBrYXRha2FuIGFkYSBodWJ1bmdhbiAqKmxpbmllcioqIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEga2VjZXBhdGFuIGRhbiBqYXJhayBiZXJoZW50aS4gUGVyaGF0aWthbiBiYWh3YSBraXRhIG1lbmVrYW5rYW4gKipsaW5pZXIqKi4NCiFbXShDOi9Vc2Vycy9ocC9Eb3dubG9hZHMvY3MxLnBuZykNCg0KRGFsYW0gcGxvdCBkYXRhIHNpbXVsYXNpIGluaSwga2l0YSBtZWxpaGF0IGh1YnVuZ2FuIHlhbmcgamVsYXMgYW50YXJhICR4JCBkYW4gJHkkLCBuYW11biBpbmkgYnVrYW4gaHVidW5nYW4gbGluaWVyLiBKaWthIGtpdGEgbWVtYXN1a2thbiBnYXJpcyBrZSBkYXRhIGluaSwgaXR1IHNhbmdhdCBkYXRhci4gSGFzaWwgcGVuZ3VqaWFuIHVudHVrICRIXzA6IFxiZXRhXzEgPSAwJCB2cyAkSF8xOiBcYmV0YV8xIOKJoCAwJCBtZW1iZXJpa2FuIHAtdmFsdWUgeWFuZyBiZXNhciwgZGFsYW0gaGFsIGluaSAkMCw3NTY0NTQ4JCwgamFkaSBraXRhIGdhZ2FsIHVudHVrIG1lbm9sYWsgZGFuIG1lbmdhdGFrYW4gYmFod2EgdGlkYWsgYWRhIGh1YnVuZ2FuIGxpbmllciB5YW5nIHNpZ25pZmlrYW4gYW50YXJhICR4JCBkYW4gJHkkLiBLaXRhIGFrYW4gbWVsaWhhdCBuYW50aSBiYWdhaW1hbmEgbWVueWVzdWFpa2FuIGt1cnZhIGtlIGRhdGEgaW5pIG1lbmdndW5ha2FuIG1vZGVsICJsaW5pZXIiLCB0ZXRhcGkgdW50dWsgc2FhdCBpbmksIHNhZGFyaSBiYWh3YSBwZW5ndWppYW4gJEhfMDogXGJldGExID0gMCQgdnMgJEhfMTogXGJldGFfMSDiiaAgMCQgaGFueWEgZGFwYXQgbWVuZGV0ZWtzaSBodWJ1bmdhbiBnYXJpcyBsdXJ1cy4NCg0KIyMjIEludGVydmFsIEtlcGVyY2F5YWFuIGRpIFINCg0KRGVuZ2FuIG1lbmdndW5ha2FuIGBSYCwga2l0YSBkYXBhdCBkZW5nYW4gbXVkYWggbWVtcGVyb2xlaCBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayAkXGJldGFfMCQgZGFuICRcYmV0YV8xJC4NCmBgYHtyfQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSkNCmBgYA0KSW5pIHNlY2FyYSBvdG9tYXRpcyBtZW5naGl0dW5nIGludGVydmFsIGtlcGVyY2F5YWFuIDk5JSB1bnR1ayBrZWR1YW55YSAkXGJldGFfMCQgZGFuICRcYmV0YV8xJCwgYmFyaXMgcGVydGFtYSB1bnR1ayAkXGJldGFfMCQsIGRhbiBiYXJpcyBrZWR1YSB1bnR1ayAkXGJldGFfMSQuDQoNClVudHVrIGNvbnRvaCBtb2JpbCBzYWF0IG1lbmdpbnRlcnByZXRhc2lrYW4gaW50ZXJ2YWwgaW5pLCBrYW1pIGthdGFrYW4gOTklIHlha2luIGJhaHdhIHVudHVrIHBlbmluZ2thdGFuIGtlY2VwYXRhbiAxIG1pbCBwZXIgamFtLCBwZW5pbmdrYXRhbiByYXRhLXJhdGEgamFyYWsgYmVyaGVudGkgYWRhbGFoIGFudGFyYSAkMi44MTc5MTg3JCBkYW4gJDUuMDQ2ODk4OCQga2FraSwgeWFuZyBtZXJ1cGFrYW4gaW50ZXJ2YWwgdW50dWsgJFxiZXRhXzEkLg0KDQpQZXJoYXRpa2FuIGJhaHdhIGludGVydmFsIGtlcGVyY2F5YWFuIDk5JSBpbmkgdGlkYWsgbWVuZ2FuZHVuZyBuaWxhaSBoaXBvdGVzaXMgMC4gS2FyZW5hIHRpZGFrIG1lbmdhbmR1bmcgMCwgaW5pIHNldGFyYSBkZW5nYW4gbWVub2xhayBwZW5ndWppYW4gJEhfMDogXGJldGFfMSA9IDAkIGRlbmdhbiAkSF8xOiBcYmV0YV8xIFxuZXEgMCQgcGFkYSAkXGFscGhhID0gMC4wMSQsIHlhbmcgdGVsYWgga2l0YSBsaWhhdCBzZWJlbHVtbnlhLg0KDQpLYWxpYW4gaGFydXMgYWdhayBjdXJpZ2EgdGVyaGFkYXAgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgJFxiZXRhXzAkLCBrYXJlbmEgbWVuY2FrdXAgbmlsYWkgbmVnYXRpZiwgeWFuZyBzZXN1YWkgZGVuZ2FuIGphcmFrIGhlbnRpIG5lZ2F0aWYuIFNlY2FyYSB0ZWtuaXMgaW50ZXJwcmV0YXNpbnlhIGFkYWxhaCBiYWh3YSBrYW1pIDk5JSB5YWtpbiBiYWh3YSBqYXJhayBiZXJoZW50aSByYXRhLXJhdGEgc2VidWFoIG1vYmlsIHlhbmcgbWVuZW1wdWggamFyYWsgMCBtaWwgcGVyIGphbSBhZGFsYWggYW50YXJhICQtMzUuNzA2NjEwMyQgZGFuICQwLjU0ODQyMDUkIGtha2ksIHRldGFwaSBrYW1pIHRpZGFrIGJlZ2l0dSBwZXJjYXlhIGl0dSwga2FyZW5hIGthbWkgYmVuYXItYmVuYXIgeWFraW4gYmFod2EgaXR1IGFrYW4gdGVyamFkaS4gbm9uLW5lZ2F0aWYuDQoNCkNhdGF0YW4sIGtpdGEgZGFwYXQgbWVuZ2Vrc3RyYWsgbmlsYWkgdGVydGVudHUgZGFyaSBrZWx1YXJhbiBpbmkgZGVuZ2FuIGJlYmVyYXBhIGNhcmEuIEtvZGUgaW5pIHRpZGFrIGJlcmphbGFuLCBkYW4gc2ViYWdhaSBnYW50aW55YSwgQW5kYSBoYXJ1cyBtZW1lcmlrc2EgaHVidW5nYW5ueWEgZGVuZ2FuIGtlbHVhcmFuIGtvZGUgZGkgYXRhcy4NCmBgYHtyfQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMSxdDQpjb25maW50KHN0b3BfZGlzdF9tb2RlbCwgbGV2ZWwgPSAwLjk5KVsxLCAxXQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMSwgMl0NCmNvbmZpbnQoc3RvcF9kaXN0X21vZGVsLCBwYXJtID0gIihJbnRlcmNlcHQpIiwgbGV2ZWwgPSAwLjk5KQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMixdDQpjb25maW50KHN0b3BfZGlzdF9tb2RlbCwgbGV2ZWwgPSAwLjk5KVsyLCAxXQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMiwgMl0NCmNvbmZpbnQoc3RvcF9kaXN0X21vZGVsLCBwYXJtID0gInNwZWVkIiwgbGV2ZWwgPSAwLjk5KQ0KYGBgDQoNCktpdGEganVnYSBkYXBhdCBtZW12ZXJpZmlrYXNpIGJhaHdhIGthbGt1bGFzaSB5YW5nIGRpamFsYW5rYW4gYFJgIHVudHVrIGludGVydmFsICRcYmV0YV8xJC4NCmBgYHtyfQ0KIyBzdG9yZSBlc3RpbWF0ZQ0KYmV0YV8xX2hhdCA9IGNvZWYoc3RvcF9kaXN0X21vZGVsKVsyXQ0KDQojIHN0b3JlIHN0YW5kYXJkIGVycm9yDQpiZXRhXzFfaGF0X3NlID0gc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpJGNvZWZmaWNpZW50c1syLCAyXQ0KDQojIGNhbGN1bGF0ZSBjcml0aWNhbCB2YWx1ZSBmb3IgdHdvLXNpZGVkIDk5JSBDSQ0KY3JpdCA9IHF0KDAuOTk1LCBkZiA9IGxlbmd0aChyZXNpZChzdG9wX2Rpc3RfbW9kZWwpKSAtIDIpDQoNCiMgZXN0IC0gbWFyZ2luLCBlc3QgKyBtYXJnaW4NCmMoYmV0YV8xX2hhdCAtIGNyaXQgKiBiZXRhXzFfaGF0X3NlLCBiZXRhXzFfaGF0ICsgY3JpdCAqIGJldGFfMV9oYXRfc2UpDQpgYGANCg0KDQojIyBJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSZXNwb24gUmF0YS1yYXRhDQoNClNlbGFpbiBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayAkXGJldGFfMCQgZGFuICRcYmV0YV8xJCwgYWRhIGR1YSBwZXJraXJhYW4gaW50ZXJ2YWwgdW11bSBsYWlubnlhIHlhbmcgZGlndW5ha2FuIGRlbmdhbiByZWdyZXNpLiBZYW5nIHBlcnRhbWEgZGlzZWJ1dCAqKmludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIHJlc3BvbnMgcmF0YS1yYXRhKiouIFNlcmluZ2thbGksIGthbWkgbWVuZ2luZ2lua2FuIHBlcmtpcmFhbiBpbnRlcnZhbCB1bnR1ayByYXRhLXJhdGEsICRFW1kgXG1pZCBYID0geF0kIHVudHVrIG5pbGFpIHggdGVydGVudHUuDQoNCkRhbGFtIHNpdHVhc2kgaW5pIGtpdGEgbWVuZ2d1bmFrYW4gJFxoYXR7eX0oeCkkIHNlYmFnYWkgcGVya2lyYWFuIGtpdGEgJEVbWSBcbWlkIFggPSB4XSQuIEtpdGEgbWVuZ3ViYWggc2VkaWtpdCBub3Rhc2kga2FtaSB1bnR1ayBtZW1wZXJqZWxhcyBiYWh3YSBuaWxhaSBwcmVkaWtzaSBhZGFsYWggZnVuZ3NpIGRhcmkgbmlsYWkgJHgkLg0KJCRcaGF0e3l9KHgpID0gXGhhdHtcYmV0YX1fMCArIFxoYXR7XGJldGF9XzEgeCQkDQpJbmdhdGxhaCBiYWh3YSwgDQokJFx0ZXh0e0V9W1kgXG1pZCBYID0geF0gPSBcYmV0YV8wICsgXGJldGFfMSB4LiQkDQpKYWRpLCAkXGhhdHt5fSh4KSQgYWRhbGFoIHBlcmtpcmFhbiB5YW5nIGJhZ3VzIGthcmVuYSB0aWRhayBiaWFzOg0KJCRcdGV4dHtFfVtcaGF0e3l9KHgpXSA9IFxiZXRhXzAgKyBcYmV0YV8xIHguJCQNCktpdGEga2VtdWRpYW4gYmlzYSBtZW5kYXBhdGthbiwNCiQkXHRleHR7VmFyfVtcaGF0e3l9KHgpXSA9IFxzaWdtYV4yIFxsZWZ0KFxmcmFjezF9e259K1xmcmFjeyh4LVxiYXJ7eH0pXjJ9e1Nfe3h4fX1ccmlnaHQpLiQkDQoNClNlcGVydGkgcGVya2lyYWFuIGxhaW4geWFuZyB0ZWxhaCBraXRhIGxpaGF0LCAkXGhhdHt5fSh4KSQganVnYSBtZW5naWt1dGkgZGlzdHJpYnVzaSBub3JtYWwuIFNlamFrICRcaGF0e1xiZXRhfV8wJCBkYW4gJFxoYXR7XGJldGF9XzEkIGFkYWxhaCBrb21iaW5hc2kgbGluaWVyIGRhcmkgdmFyaWFiZWwgYWNhayBub3JtYWwsICRcaGF0e3l9KHgpJCBqdWdhLg0KJCRcaGF0e3l9KHgpIFxzaW0gTiBcbGVmdChcYmV0YV8wICsgXGJldGFfMSB4LCBcc2lnbWFeMiBcbGVmdChcZnJhY3sxfXtufStcZnJhY3soeC1cYmFye3h9KV4yfXtTX3t4eH19XHJpZ2h0KSBccmlnaHQpJCQNCg0KRGFuIHRlcmFraGlyLCBrYXJlbmEga2l0YSBwZXJsdSBtZW1wZXJraXJha2FuIHZhcmlhbnMgaW5pLCBraXRhIHNhbXBhaSBwYWRhIGtlc2FsYWhhbiBzdGFuZGFyIGRhcmkgcGVya2lyYWFuIGtpdGEsDQokJFx0ZXh0e1NFfVtcaGF0e3l9KHgpXSA9IHNfZSBcc3FydHtcZnJhY3sxfXtufStcZnJhY3soeC1cYmFye3h9KV4yfXtTX3t4eH19fS4kJA0KS2l0YSBrZW11ZGlhbiBkYXBhdCBtZW5nZ3VuYWthbiBpbmkgdW50dWsgbWVuZW11a2FuIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIHJlc3BvbnMgcmF0YS1yYXRhLA0KJCRcaGF0e3l9KHgpIFxwbSB0X3tcYWxwaGEvMiwgbiAtIDJ9IFxjZG90IHNfZVxzcXJ0e1xmcmFjezF9e259K1xmcmFjeyh4LVxiYXJ7eH0pXjJ9e1Nfe3h4fX19JCQNCg0KVW50dWsgbWVuZW11a2FuIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIHJlc3BvbnMgcmF0YS1yYXRhIG1lbmdndW5ha2FuIGBSYCwga2l0YSBtZW5nZ3VuYWthbiBmdW5nc2kgYHByZWRpY3QoKWAuIEtpdGEgbWVtYmVyaWthbiBmdW5nc2kgbW9kZWwgcGFzIGthbWkgc2VydGEgZGF0YSBiYXJ1LCBkaXNpbXBhbiBzZWJhZ2FpIGJpbmdrYWkgZGF0YS4gKEluaSBwZW50aW5nLCBhZ2FyIGBSYCBtZW5nZXRhaHVpIG5hbWEgdmFyaWFiZWwgcHJlZGlrdG9yLikgRGkgc2luaSwga2l0YSBtZW5lbXVrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgamFyYWsgYmVyaGVudGkgcmF0YS1yYXRhIHNhYXQgbW9iaWwgYmVyamFsYW4gNSBtaWwgcGVyIGphbSBkYW4gc2FhdCBtb2JpbCBiZXJqYWxhbiAyMSBtaWwgcGVyIGphbS4NCmBgYHtyfQ0KbmV3X3NwZWVkcyA9IGRhdGEuZnJhbWUoc3BlZWQgPSBjKDUsIDIxKSkNCnByZWRpY3Qoc3RvcF9kaXN0X21vZGVsLCBuZXdkYXRhID0gbmV3X3NwZWVkcywgDQogICAgICAgIGludGVydmFsID0gYygiY29uZmlkZW5jZSIpLCBsZXZlbCA9IDAuOTkpDQpgYGANCg0KIyMgSW50ZXJ2YWwgUHJlZGlrc2kgdW50dWsgUGVuZ2FtYXRhbiBCYXJ1DQoNClRlcmthZGFuZyBraXRhIG1lbmdpbmdpbmthbiBwZXJraXJhYW4gaW50ZXJ2YWwgdW50dWsgcGVuZ2FtYXRhbiBiYXJ1LCAkWSQsIHVudHVrIG5pbGFpICR4JCB0ZXJ0ZW50dS4gSW5pIHNhbmdhdCBtaXJpcCBkZW5nYW4gaW50ZXJ2YWwgdW50dWsgcmVzcG9ucyByYXRhLXJhdGEgJFx0ZXh0e0V9W1kgXG1pZCBYID0geF0kIHRldGFwaSBiZXJiZWRhIGRhbGFtIHNhdHUgaGFsIHlhbmcgc2FuZ2F0IHBlbnRpbmcuDQoNClRlYmFrYW4gdGVyYmFpayBraXRhIHVudHVrIG9ic2VydmFzaSBiYXJ1IG1hc2loICRcaGF0e3l9KHgpJC4gUGVya2lyYWFuIHJhdGEtcmF0YSBtYXNpaCBtZXJ1cGFrYW4gcHJlZGlrc2kgdGVyYmFpayB5YW5nIGJpc2Ega2l0YSBidWF0LiBQZXJiZWRhYW5ueWEgYWRhbGFoIHRlcmxldGFrIHBhZGEganVtbGFoIHZhcmlhYmlsaXRhcy4gS2l0YSB0YWh1IGJhaHdhIHBlbmdhbWF0YW4gYWthbiBiZXJ2YXJpYXNpIHRlbnRhbmcgZ2FyaXMgcmVncmVzaSB5YW5nIHNlYmVuYXJueWEgbWVudXJ1dCBkaXN0cmlidXNpICROKDAsIFxzaWdtYV4yKSQuIEthcmVuYSBpdHUga2l0YSBtZW5hbWJhaGthbiBmYWt0b3IgdGFtYmFoYW4gJFxzaWdtYV4yJCBrZSB2YXJpYWJpbGl0YXMgcGVya2lyYWFuIGthbWkgdW50dWsgbWVuamVsYXNrYW4gdmFyaWFiaWxpdGFzIHBlbmdhbWF0YW4gdGVudGFuZyBnYXJpcyByZWdyZXNpLg0KJCRcYmVnaW57YWxpZ25lZH0NClx0ZXh0e1Zhcn1bXGhhdHt5fSh4KSArIFxlcHNpbG9uXSAmPSBcdGV4dHtWYXJ9W1xoYXR7eX0oeCldICsgXHRleHR7VmFyfVtcZXBzaWxvbl0gXFxbMmV4XQ0KJj0gXHNpZ21hXjIgXGxlZnQoXGZyYWN7MX17bn0rXGZyYWN7KHgtXGJhcnt4fSleMn17U197eHh9fVxyaWdodCkgKyBcc2lnbWFeMiBcXFsyZXhdDQomPSBcc2lnbWFeMiBcbGVmdCgxICsgXGZyYWN7MX17bn0rXGZyYWN7KHgtXGJhcnt4fSleMn17U197eHh9fVxyaWdodCkNClxlbmR7YWxpZ25lZH0kJA0KDQpLaXRhIGtlbXVkaWFuIGRhcGF0IG1lbmVtdWthbiAqKmludGVydmFsIHByZWRpa3NpKiogbWVuZ2d1bmFrYW4sDQokJFxoYXR7eX0oeCkgXHBtIHRfe1xhbHBoYS8yLCBuIC0gMn0gXGNkb3Qgc19lXHNxcnR7MSArIFxmcmFjezF9e259K1xmcmFjeyh4LVxiYXJ7eH0pXjJ9e1Nfe3h4fX19LiQkDQoNClVudHVrIG1lbmdoaXR1bmcgaW5pIHVudHVrIHNhdHUgc2V0IHBvaW4gZGFsYW0gcGVtYmVyaXRhaHVhbiBgUmAgaGFueWEgYWRhIHNlZGlraXQgcGVydWJhaGFuIGRhbGFtIHNpbnRha3MgZGFyaSBtZW5lbXVrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgcmVzcG9ucyByYXRhLXJhdGEuDQpgYGB7cn0NCnByZWRpY3Qoc3RvcF9kaXN0X21vZGVsLCBuZXdkYXRhID0gbmV3X3NwZWVkcywgDQogICAgICAgIGludGVydmFsID0gYygicHJlZGljdGlvbiIpLCBsZXZlbCA9IDAuOTkpDQpgYGANClBlcmhhdGlrYW4ganVnYSBiYWh3YSBrZWR1YSBpbnRlcnZhbCBpbmkgbGViaWggbGViYXIgZGFyaXBhZGEgaW50ZXJ2YWwga2VwZXJjYXlhYW4geWFuZyBzZXN1YWkgdW50dWsgcmVzcG9ucyByYXRhLXJhdGEuDQoNCg0KIyMgUGl0YSBLZXBlcmNheWFhbiBkYW4gUHJlZGlrc2kNCg0KU2VyaW5na2FsaSBraXQgaW5naW4gbWVtcGxvdCBrZWR1YSBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayByZXNwb25zIHJhdGEtcmF0YSBkYW4gaW50ZXJ2YWwgcHJlZGlrc2kgdW50dWsgc2VtdWEga2VtdW5na2luYW4gbmlsYWkgJFgkLiBLaXRhIG1lbnllYnV0bnlhIHBpdGEga2VwZXJjYXlhYW4gZGFuIHByZWRpa3NpLg0KYGBge3J9DQpzcGVlZF9ncmlkID0gc2VxKG1pbihjYXJzJHNwZWVkKSwgbWF4KGNhcnMkc3BlZWQpLCBieSA9IDAuMDEpDQpkaXN0X2NpX2JhbmQgPSBwcmVkaWN0KHN0b3BfZGlzdF9tb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBkYXRhLmZyYW1lKHNwZWVkID0gc3BlZWRfZ3JpZCksIA0KICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAwLjk5KQ0KZGlzdF9waV9iYW5kID0gcHJlZGljdChzdG9wX2Rpc3RfbW9kZWwsIA0KICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhID0gZGF0YS5mcmFtZShzcGVlZCA9IHNwZWVkX2dyaWQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAicHJlZGljdGlvbiIsIGxldmVsID0gMC45OSkgDQoNCnBsb3QoZGlzdCB+IHNwZWVkLCBkYXRhID0gY2FycywNCiAgICAgeGxhYiA9ICJTcGVlZCAoaW4gTWlsZXMgUGVyIEhvdXIpIiwNCiAgICAgeWxhYiA9ICJTdG9wcGluZyBEaXN0YW5jZSAoaW4gRmVldCkiLA0KICAgICBtYWluID0gIlN0b3BwaW5nIERpc3RhbmNlIHZzIFNwZWVkIiwNCiAgICAgcGNoICA9IDIwLA0KICAgICBjZXggID0gMiwNCiAgICAgY29sICA9ICJncmV5IiwNCiAgICAgeWxpbSA9IGMobWluKGRpc3RfcGlfYmFuZCksIG1heChkaXN0X3BpX2JhbmQpKSkNCmFibGluZShzdG9wX2Rpc3RfbW9kZWwsIGx3ZCA9IDUsIGNvbCA9ICJkYXJrb3JhbmdlIikNCg0KbGluZXMoc3BlZWRfZ3JpZCwgZGlzdF9jaV9iYW5kWywibHdyIl0sIGNvbCA9ICJkb2RnZXJibHVlIiwgbHdkID0gMywgbHR5ID0gMikNCmxpbmVzKHNwZWVkX2dyaWQsIGRpc3RfY2lfYmFuZFssInVwciJdLCBjb2wgPSAiZG9kZ2VyYmx1ZSIsIGx3ZCA9IDMsIGx0eSA9IDIpDQpsaW5lcyhzcGVlZF9ncmlkLCBkaXN0X3BpX2JhbmRbLCJsd3IiXSwgY29sID0gImRvZGdlcmJsdWUiLCBsd2QgPSAzLCBsdHkgPSAzKQ0KbGluZXMoc3BlZWRfZ3JpZCwgZGlzdF9waV9iYW5kWywidXByIl0sIGNvbCA9ICJkb2RnZXJibHVlIiwgbHdkID0gMywgbHR5ID0gMykNCnBvaW50cyhtZWFuKGNhcnMkc3BlZWQpLCBtZWFuKGNhcnMkZGlzdCksIHBjaCA9ICIrIiwgY2V4ID0gMykNCmBgYA0KDQpCZWJlcmFwYSBoYWwgeWFuZyBwZXJsdSBkaXBlcmhhdGlrYW46DQoNCiogS2l0YSBtZW5nZ3VuYWthbiBhcmd1bWVuIGB5bGltYCB1bnR1ayBtZXJlZ2FuZ2thbiBzdW1idS0keSQgZGFyaSBwbG90LCBrYXJlbmEgcGl0YSBsZWJpaCBwYW5qYW5nIGRhcmlwYWRhIHRpdGlrLiANCg0KKiBLaXRhIG1lbmFtYmFoa2FuIHRpdGlrIHBhZGEgdGl0aWsgKCQoXGJhcnt4fSwgXGJhcnt5fSkkKSB0ZXJzZWJ1dC4gDQogICsgSW5pIGFkYWxhaCB0aXRpayB5YW5nIGFrYW4gKipzZWxhbHUqKiBkaWxld2F0aSBnYXJpcyByZWdyZXNpLiAoUGlraXJrYW4gYWxhc2FubnlhKQ0KICArIEluaSBhZGFsYWggdGl0aWsgZGltYW5hIHBpdGEga2VwZXJjYXlhYW4gZGFuIHByZWRpa3NpIG1lbmphZGkgeWFuZyB0ZXJzZW1waXQuIExpaGF0bGFoIGtlc2FsYWhhbiBzdGFuZGFyIGtlZHVhbnlhIHVudHVrIG1lbWFoYW1pIG1lbmdhcGEuDQogICAgDQoqIFBpdGEgcHJlZGlrc2kgKHRpdGlrLXRpdGlrIGJpcnUpIGt1cmFuZyBtZWxlbmdrdW5nIGRpYmFuZGluZ2thbiBkZW5nYW4gcGl0YSBrZXBlcmNheWFhbiAoYmlydSBwdXR1cy1wdXR1cykuIEluaSBhZGFsYWggaGFzaWwgZGFyaSBmYWt0b3IgJFxzaWdtYV4yJCB0YW1iYWhhbiB5YW5nIGRpdGFtYmFoa2FuIGtlIHZhcmlhbnMgcGFkYSBuaWxhaSAkeCQgYmVyYXBhcHVuLg0KDQoNCiMjIFNpZ25pZmlrYW5zaSBSZWdyZXNpLCBVamktRg0KDQpEYWxhbSBrYXN1cyByZWdyZXNpIGxpbmllciBzZWRlcmhhbmEsIHVqaSAkdCQgdW50dWsgc2lnbmlmaWthbnNpIHJlZ3Jlc2kgc2V0YXJhIGRlbmdhbiB1amkgbGFpbiwgeWFpdHUgdWppICRGJCB1bnR1ayBzaWduaWZpa2Fuc2kgcmVncmVzaS4gS2VzZXRhcmFhbiBpbmkgaGFueWEgYWthbiBiZXJsYWt1IGJlbmFyIHVudHVrIHJlZ3Jlc2kgbGluaWVyIHNlZGVyaGFuYSwgZGFuIGRpIGJhZ2lhbiBzZWxhbmp1dG55YSBraXRhIGhhbnlhIGFrYW4gbWVuZ2d1bmFrYW4gJEYkIHVudHVrIG1lbmd1amkgc2lnbmlmaWthbnNpIHJlZ3Jlc2kuDQoNCkluZ2F0IGRhcmkgYmFnaWFuIHRlcmFraGlyIGRla29tcG9zaXNpIHZhcmlhbnMgeWFuZyBraXRhIGxpaGF0IHNlYmVsdW1ueWEgbWVuZ2hpdHVuZyAkUl4yJCwNCiQkXHN1bV97aT0xfV57bn0oeV9pIC0gXGJhcnt5fSleMiA9IFxzdW1fe2k9MX1ee259KHlfaSAtIFxoYXR7eX1faSleMiArIFxzdW1fe2k9MX1ee259KFxoYXR7eX1faSAtIFxiYXJ7eX0pXjIkJA0KDQphdGF1IHNpbmdrYXRueWEsDQokJFx0ZXh0e1NTVH0gPSBcdGV4dHtTU0V9ICsgXHRleHR7U1NSZWd9LiQkDQoNClVudHVrIG1lbmdlbWJhbmdrYW4gJEYkIHRlc3QsIGtpdGEgYWthbiBtZW5nYXR1ciBpbmZvcm1hc2kgaW5pIGRhbGFtIHRhYmVsICoqQU5PVkEqKg0KDQpTdW1iZXIgICB8ICAgICAgICAgICBKdW1sYWggS3VhZHJhdCAgICAgICAgIHwgIERlcmFqYXQgS2ViZWJhc2FuIHwgICBSYXRhLXJhdGEgS3VhZHJhdCAgfCAgICAgICAgICAgIEYNCi0tLS0tLS0gIHwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAgLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICAtLS0tLS0tLS0tLS0tLS0tLS0tDQpSZWdyZXNpICB8ICRcc3VtXm5fe2k9MX0oXGhhdHt5fV9pLXkpXjIkICAgIHwgICQxJCAgICAgICAgICAgICAgIHwgICRcZnJhY3tTU1JlZ317MX0kICAgfCAkXGZyYWN7TVNSZWd9e01TRX0kDQpFcm9yICAgICB8ICRcc3VtXm5fe2k9MX0oeV9pLVxoYXR7eX1faSleMiQgIHwgICRuLTIkICAgICAgICAgICAgIHwgICRcZnJhY3tTU1JlZ317bi0yfSQgfCAgDQpUb3RhbCAgICB8ICRcc3VtXm5fe2k9MX0oeV9pLXkpXjIkICAgICAgICAgIHwgICRuLTEkICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfA0KDQoNCkFOT1ZBLCBhdGF1IEFuYWxpc2lzIFZhcmlhbnMgYWthbiBtZW5qYWRpIGtvbnNlcCB5YW5nIHNlcmluZyBraXRhIGJhaGFzIGRhbGFtIGJhZ2lhbiBpbmkuIFVudHVrIHNhYXQgaW5pLCBraXRhIGFrYW4gZm9rdXMgcGFkYSBoYXNpbCB0YWJlbCwgeWFpdHUgJEYkIHN0YXRpc3Rpay4gDQokJEYgPSBcZnJhY3tcc3VtX3tpPTF9XntufShcaGF0e3l9X2kgLSBcYmFye3l9KV4yIC8gMX17XHN1bV97aT0xfV57bn0oeV9pIC0gXGhhdHt5fV9pKV4yIC8gKG4gLSAyKX0gXHNpbSBGX3sxLCBuIC0gMn0kJA0KDQp5YW5nIG1lbmdpa3V0aSBkaXN0cmlidXNpICRGJCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4gJDEkIGRhbiAkbi0yJCBkaWJhd2FoIGhpcG90ZXNpcyBub2wuIFNlYnVhaCBkaXN0cmlidXNpICRGJCBhZGFsYWggZGlzdHJpYnVzaSBrb250aW51IHlhbmcgaGFueWEgbWVuZ2FtYmlsIG5pbGFpIHBvc2l0aWYgZGFuIG1lbWlsaWtpIGR1YSBwYXJhbWV0ZXIsIHlhaXR1IGR1YSBkZXJhamF0IGtlYmViYXNhbi4NCg0KSW5nYXRsYWgsIHBlbnRpbmdueWEgdWppIHJlZ3Jlc2ksICRZJCAqKnRpZGFrKiogdGVyZ2FudHVuZyBwYWRhICR4JCBkYWxhbSBoaXBvdGVzaXMgbm9sLg0KJCRIXzA6IFxiZXRhXzEgPSAwIFxxdWFkIFxxdWFkIFlfaSA9IFxiZXRhXzAgKyBcZXBzaWxvbl9pJCQNClNlZGFuZ2thbiBwYWRhIGhpcG90ZXNpcyBhbHRlcm5hdGlmICRZJCBtdW5na2luIGJlcmdhbnR1bmcgcGFkYSAkeCQNCiQkSF8xOiBcYmV0YV8xIFxuZXEgMCBccXVhZCBccXVhZCBZX2kgPSBcYmV0YV8wICsgXGJldGFfMSB4X2kgKyBcZXBzaWxvbl9pJCQNCktpdGEgYmlzYSBtZW5nZ3VuYWthbiAkRiQgc3RhdGlzdGlrIHVudHVrIG1lbGFrdWthbiB0ZXMgaW5pLg0KJCRGID0gXGZyYWN7XHN1bV97aT0xfV57bn0oXGhhdHt5fV9pIC0gXGJhcnt5fSleMiAvIDF9e1xzdW1fe2k9MX1ee259KHlfaSAtIFxoYXR7eX1faSleMiAvIChuIC0gMil9JCQNCg0KU2VjYXJhIGtodXN1cywga2l0YSBha2FuIG1lbm9sYWsgbnVsbCBzYWF0ICRGJCBzdGF0aXN0aWtueWEgYmVuYXIsIHlhaXR1LCBrZXRpa2EgYWRhIGtlbXVuZ2tpbmFuIHJlbmRhaCBiYWh3YSBwZW5nYW1hdGFuIGJpc2EgZGF0YW5nIGRhcmkgbW9kZWwgbm9sIHNlY2FyYSBrZWJldHVsYW4uIEtpdGEgYWthbiBtZW5naGl0dW5nIG5pbGFpIHAgdW50dWsga2l0YSBkZW5nYW4gYFJgLg0KDQpVbnR1ayBtZWxha3VrYW4gdWppICRGJCAgZGkgYFJgIGthbGlhbiBkYXBhdCBtZWxpaGF0IGJhcmlzIHRlcmFraGlyIGRhcmkgb3V0cHV0IHlhbmcgZGFsYW0gZnVuZ3NpIGBzdW1tYXJ5KClgIGRpc2VidXQgYEYtc3RhdGlzdGljc2AgeWFuZyBtZW1iZXJpa2FuIG5pbGFpIHVqaSBzdGF0aXN0aWssIGRlcmFqYXQga2ViZWJhc2FuIHlhbmcgcmVsZXZhbiwgc2VydGEgJHAtdmFsdWUkIGRhcmkgcGVuZ3VqaWFuLg0KDQpgYGB7cn0NCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKQ0KYGBgDQoNClNlbGFpbiBpdHUsIGthbGlhbiBkYXBhdCBtZW5nZ3VuYWthbiBmdW5nc2kgYGFub3ZhKClgIGRhbGFtIG1lbmFtcGlsa2FuIGluZm9ybWFzaSBkYWxhbSB0YWJlbCBBTk9WQS4NCg0KYGBge3J9DQphbm92YShzdG9wX2Rpc3RfbW9kZWwpDQpgYGANCg0KSW5pIGp1Z2EgbWVtYmVyaWthbiBuaWxhaS1wIHVudHVrIHBlbmd1amlhbi4gS2FsaWFuIGhhcnVzIG1lbXBlcmhhdGlrYW4gYmFod2EgbmlsYWktcCBkYXJpIGRpc3RyaWJ1c2kgJHQkIGFkYWxhaCBzYW1hLiBLYWxpYW4gbXVuZ2tpbiBqdWdhIG1lbXBlcmhhdGlrYW4gYmFod2EgbmlsYWkgc3RhdGlzdGlrIHBlbmd1amlhbiB1bnR1ayB1amkgJHQkLCAkOS40NjM5OSQsIGRhcGF0IGRpa3VhZHJhdGthbiB1bnR1ayBtZW5kYXBhdGthbiBuaWxhaSAkRiQgc3RhdGlzdGlrLCAkODkuNTY3MTA2NSQuDQoNClBlcmhhdGlrYW4gYmFod2EgYWRhIGNhcmEgbGFpbiB5YW5nIHNldGFyYSB1bnR1ayBtZWxha3VrYW4gaW5pIGRhbGFtIGBSYCwgZGltYW5hIGtpdGEgYWthbiBzZXJpbmcgc2VrYWxpIHVudHVrIG1lbWJhbmRpbmdrYW4gZHVhIG1vZGVsLg0KDQpgYGB7cn0NCmFub3ZhKGxtKGRpc3QgfiAxLCBkYXRhID0gY2FycyksIGxtKGRpc3QgfiBzcGVlZCwgZGF0YSA9IGNhcnMpKQ0KYGBgDQoNClBlcm55YXRhYW4gbW9kZWwgYGxtKGRpc3QgfiAxLCBkYXRhID0gY2FycylgIG1lbmVyYXBrYW4gbW9kZWwgJFlfaSA9IFxiZXRhXzAgKyBcZXBzaWxvbl9pJCBrZSBkYXRhIG1vYmlsIChkYXRhIGNhcnMpLiBDYXRhdCAkXGhhdHt5fSA9IFxiYXJ7eX0kIGl0dSBrZXRpa2EgJFlfaSA9IFxiZXRhXzAgKyBcZXBzaWxvbl9pJA0KDQpQZXJueWF0YWFuIG1vZGVsIGBsbShkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzKWAgbWVuZXJhcGthbiBtb2RlbCAkWV9pID0gXGJldGFfMCArIFxiZXRhXzEgeF9pICsgXGVwc2lsb25faSQuIEtpdGEga2VtdWRpYW4gZGFwYXQgbWVuZ2FuZ2dhcCBwZW5nZ3VuYWFuIGBhbm92YSgpYCBpbmkgc2ViYWdhaSBwZXJiYW5kaW5nYW4gbGFuZ3N1bmcga2VkdWEgbW9kZWwgKFBlcmhhdGlrYW4gYmFod2Ega2l0YSBtZW5kYXBhdGthbiBuaWxhaS1wIHlhbmcgc2FtYSBsYWdpKS4gDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==