Tugas 1 Analysis & Predictive Modelling

Multinomial Logistics Regression

Foto Isnaini

1 Multinomial Logistics Regression

Multinomial Logistic Regression adalah perluasan dari binary logistic regression yang digunakan ketika variabel dependen (\(Y\)) memiliki lebih dari dua kategori yang bersifat nominal (tidak berurutan).

Contoh kasus: tingkat keberhasilan proyek (Low, Medium, High), jenis produk yang dipilih (A, B, C), atau keputusan pelanggan (beli A, beli B, tidak beli).

Tujuannya adalah untuk memodelkan probabilitas setiap kategori dari variabel dependen berdasarkan satu atau lebih variabel independen (\(X₁, X₂, X₃, …\)).Model ini memperkirakan peluang suatu observasi termasuk ke dalam masing-masing kategori.

Jika terdapat ( \(K\) ) kategori pada variabel dependen ( \(Y\) ), maka model memilih satu kategori sebagai kategori referensi (baseline) biasanya kategori terakhir. Kemudian, untuk setiap kategori ( \(k = 1, 2, ..., K-1\) ), model menghitung log odds dibandingkan dengan kategori referensi:

\[ \log\left(\frac{P(Y = k)}{P(Y = K)}\right) = \beta_{0k} + \beta_{1k}X_1 + \beta_{2k}X_2 + \cdots + \beta_{pk}X_p \]

Keterangan:

  • ( \(P(Y = k)\) ): probabilitas bahwa observasi termasuk kategori ke-( \(k\) )
  • ( \(P(Y = K)\) ): probabilitas kategori referensi
  • ( \(\beta_{0k}\) ): intercept untuk kategori ke-( \(k\) )
  • ( \(\beta_{ik}\)): koefisien variabel independen ( \(X_i\) ) terhadap kategori ke-( \(k\) )
  • ( \(X_i\) ): variabel prediktor (misalnya Budget, Satisfaction, Salespeople)

Probabilitas Setiap Kategori

Untuk setiap kategori ( \(k\) ), probabilitasnya dihitung menggunakan fungsi softmax:

\[ P(Y = k) = \frac{e^{\beta_{0k} + \beta_{1k}X_1 + \cdots + \beta_{pk}X_p}}{1 + \sum_{j=1}^{K-1} e^{\beta_{0j} + \beta_{1j}X_1 + \cdots + \beta_{pj}X_p}} \]

dan untuk kategori referensi ( \(K\) ):

\[ P(Y = K) = \frac{1}{1 + \sum_{j=1}^{K-1} e^{\beta_{0j} + \beta_{1j}X_1 + \cdots + \beta_{pj}X_p}} \]

  • Koefisien ( \(\beta_{ik}\) ) menunjukkan perubahan log odds kategori ( \(k\) ) relatif terhadap kategori referensi akibat perubahan satu unit pada ( \(X_i\) ).
  • Jika ( \(\beta_{ik} > 0\) ), maka peningkatan ( \(X_i\) ) meningkatkan peluang observasi termasuk ke kategori ( \(k\) ) dibandingkan dengan referensi.
  • Jika ( \(\beta_{ik} < 0\) ), maka efeknya sebaliknya.

2 Dataset

3 Membuat Model Multinomial Logistic Regression

## # weights:  18 (10 variable)
## initial  value 219.722458 
## iter  10 value 143.933108
## iter  20 value 9.020186
## iter  30 value 4.214189
## iter  40 value 3.504247
## iter  50 value 2.820396
## iter  60 value 2.303166
## iter  70 value 2.132932
## iter  80 value 1.624341
## iter  90 value 1.472079
## iter 100 value 1.195536
## final  value 1.195536 
## stopped after 100 iterations
## Call:
## multinom(formula = Success_Level ~ Advertising + Salespeople + 
##     Satisfaction + Competition, data = data)
## 
## Coefficients:
##        (Intercept) Advertising Salespeople Satisfaction Competition
## Medium   -226.9013    9.584952    5.806227     13.27848   -11.83763
## High     -478.6406   15.206729    9.860392     22.28077   -18.48662
## 
## Std. Errors:
##        (Intercept) Advertising Salespeople Satisfaction Competition
## Medium    114.0896    4.752920    2.913936     6.611718    5.784428
## High      201.4697    5.948203    4.036557     8.875431    7.155263
## 
## Residual Deviance: 2.391072 
## AIC: 22.39107

Hasil multinomial logistic regression menunjukkan bahwa faktor-faktor pemasaran seperti anggaran iklan (Advertising), jumlah tenaga penjual (Salespeople), kepuasan pelanggan (Satisfaction), dan tingkat kompetisi (Competition) secara bersama-sama berpengaruh terhadap tingkat keberhasilan kampanye pemasaran. Model menggunakan kategori Low sebagai pembanding, dan memperkirakan peluang suatu kampanye berada pada kategori Medium atau High dibanding Low.

Koefisien bertanda positif pada variabel Advertising, Salespeople, dan Satisfaction menunjukkan bahwa semakin besar anggaran iklan, semakin banyak tenaga penjual yang terlibat, dan semakin tinggi kepuasan pelanggan, maka kemungkinan kampanye mencapai keberhasilan Medium atau High meningkat secara signifikan dibandingkan Low. Sebaliknya, koefisien Competition yang negatif menandakan bahwa semakin tinggi tingkat persaingan pasar, semakin kecil peluang kampanye mencapai tingkat keberhasilan yang tinggi.

4 Melihat Nilai Statistik (Std. Error, z value, p value)

##        (Intercept) Advertising Salespeople Satisfaction Competition (Intercept)
## Medium   -226.9013    9.584952    5.806227     13.27848   -11.83763    114.0896
## High     -478.6406   15.206729    9.860392     22.28077   -18.48662    201.4697
##        Advertising Salespeople Satisfaction Competition (Intercept) Advertising
## Medium    4.752920    2.913936     6.611718    5.784428   -1.988799    2.016645
## High      5.948203    4.036557     8.875431    7.155263   -2.375745    2.556525
##        Salespeople Satisfaction Competition (Intercept) Advertising Salespeople
## Medium    1.992572     2.008326   -2.046466  0.04672342  0.04373261  0.04630833
## High      2.442773     2.510387   -2.583639  0.01751358  0.01057234  0.01457491
##        Satisfaction Competition
## Medium   0.04460871 0.040710564
## High     0.01205989 0.009776393

Kategori Medium vs Low

  • Advertising (β = 9.58, p ≈ 0.04) → Anggaran iklan berpengaruh positif dan signifikan, artinya peningkatan investasi iklan meningkatkan kemungkinan kampanye naik dari Low ke Medium.

  • Salespeople (β = 5.80, p ≈ 0.04) → Lebih banyak tenaga penjual secara nyata meningkatkan peluang keberhasilan tingkat menengah.

  • Satisfaction (β = 13.28, p ≈ 0.04) → Kepuasan pelanggan yang tinggi sangat mendorong peningkatan keberhasilan.

  • Competition (β = -11.84, p ≈ 0.04) → Persaingan pasar yang tinggi menurunkan peluang keberhasilan.

Kategori High vs Low

  • Advertising (β = 15.21, p ≈ 0.02) → Pengaruh positif dan signifikan. Semakin besar anggaran iklan, semakin tinggi peluang kampanye mencapai keberhasilan tinggi (High).

  • Salespeople (β = 9.86, p ≈ 0.01) → Jumlah tenaga penjual yang lebih banyak meningkatkan kemungkinan sukses penuh.

  • Satisfaction (β = 22.28, p ≈ 0.01) → Kepuasan pelanggan menjadi faktor paling kuat dalam menentukan keberhasilan tertinggi.

  • Competition (β = -18.49, p ≈ 0.01) → Kompetisi tinggi secara signifikan menurunkan peluang mencapai tingkat keberhasilan tertinggi.

Secara keseluruhan, hasil analisis Multinomial Logistic Regression menunjukkan bahwa faktor Satisfaction (kepuasan pelanggan) merupakan determinan paling kuat terhadap peningkatan Success Level, diikuti oleh Advertising dan Salespeople yang berpengaruh positif. Sebaliknya, Competition memiliki dampak negatif yang signifikan terhadap keberhasilan.

5 Evaluasi Akurasi Model

##          Actual
## Predicted Low Medium High
##    Low     42      0    0
##    Medium   0    122    0
##    High     0      0   36
## [1] 1

Hasil evaluasi model Multinomial Logistic Regression menunjukkan bahwa model mampu memprediksi tingkat keberhasilan kampanye pemasaran (Success Level) dengan akurasi sempurna sebesar 100%, di mana seluruh kategori aktual—Low, Medium, dan High—berhasil diprediksi dengan tepat tanpa kesalahan klasifikasi. Hal ini mengindikasikan bahwa kombinasi faktor Advertising, Salespeople, Satisfaction, dan Competition memiliki kemampuan yang sangat kuat dalam membedakan setiap tingkat keberhasilan. Dengan kata lain, peningkatan investasi iklan, jumlah tenaga penjual, serta kepuasan pelanggan yang tinggi secara konsisten berkontribusi terhadap keberhasilan yang lebih besar, sementara tingginya tingkat persaingan menjadi faktor yang menurunkan peluang sukses.

6 Visualisasi

## # weights:  18 (10 variable)
## initial  value 219.722458 
## iter  10 value 151.864225
## iter  20 value 127.803719
## iter  20 value 127.803718
## iter  20 value 127.803718
## final  value 127.803718 
## converged

7 Perbedaan Binary Logistic Regression dengan Multinomial Logistic Regression

Aspek Binary Logistic Regression Multinomial Logistic Regression
Jumlah kategori variabel dependen 2 kategori (misalnya: Yes/No, Lulus/Gagal, Beli/Tidak Beli) Lebih dari 2 kategori (misalnya: Low, Medium, High atau A, B, C)
Jenis kategori Bersifat biner (dua kelas) Bersifat nominal (bisa tiga atau lebih, tidak berurutan)
Fungsi link Logit: \(\log \frac{p}{1-p}\) Generalized Logit: \(\log \frac{P(Y=k)}{P(Y=K)}\) untuk setiap kategori (\(k\))
Persamaan umum \(\log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1X_1 + \cdots + \beta_pX_p\) \(\log\left(\frac{P(Y=k)}{P(Y=K)}\right) = \beta_{0k} + \beta_{1k}X_1 + \cdots + \beta_{pk}X_p\), untuk \(k = 1, 2, ..., K-1\)
Metode estimasi Maximum Likelihood Estimation (MLE) Juga menggunakan MLE, tetapi menghitung parameter untuk setiap kategori relatif terhadap kategori referensi
Output model Probabilitas kejadian satu kategori (mis. sukses) Probabilitas setiap kategori (mis. Low, Medium, High) yang dijumlahkan = 1
Interpretasi koefisien Koefisien menunjukkan perubahan log odds kejadian satu kategori dibanding tidak terjadi Koefisien menunjukkan perubahan log odds kategori tertentu dibanding kategori referensi
Contoh kasus Prediksi apakah pelanggan membeli produk (Yes/No) Prediksi tingkat kepuasan pelanggan (Low–Medium–High)
Fungsi aktivasi Sigmoid Softmax
LS0tDQp0aXRsZTogIlR1Z2FzIDEgQW5hbHlzaXMgJiBQcmVkaWN0aXZlIE1vZGVsbGluZyINCnN1YnRpdGxlOiAiTXVsdGlub21pYWwgTG9naXN0aWNzIFJlZ3Jlc3Npb24iDQphdXRob3I6IA0KICAiSXNuYWluaSBOdXIgSGFzYW5haCAoNTIyNDAwMDUpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cm9ib2Jvb2s6ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZSAoMSkuY3NzIg0KICAgIHBhcmFtczoNCiAgZWNobzogZmFsc2UNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KPGltZyANCiAgaWQ9IklzbmEiIA0KICBzcmM9IkM6XFVzZXJzXEFTVVNcRGVza3RvcFxTdGF0aXN0aWthIERhc2FyXElzbmFpbmkuanBnIiANCiAgYWx0PSJGb3RvIElzbmFpbmkiIA0KICBzdHlsZT0iDQogICAgd2lkdGg6IDIwMHB4Ow0KICAgIGhlaWdodDogMjAwcHg7DQogICAgb2JqZWN0LWZpdDogY292ZXI7ICAgICAgIA0KICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgICAgICANCiAgICBkaXNwbGF5OiBibG9jazsNCiAgICBtYXJnaW46IGF1dG87DQogICAgYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjIpOyANCiAgIj4NCg0KDQojICoqTXVsdGlub21pYWwgTG9naXN0aWNzIFJlZ3Jlc3Npb24qKg0KDQoqKk11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24qKiBhZGFsYWggcGVybHVhc2FuIGRhcmkgYmluYXJ5IGxvZ2lzdGljIHJlZ3Jlc3Npb24geWFuZyBkaWd1bmFrYW4ga2V0aWthIHZhcmlhYmVsIGRlcGVuZGVuICgkWSQpIG1lbWlsaWtpIGxlYmloIGRhcmkgZHVhIGthdGVnb3JpIHlhbmcgYmVyc2lmYXQgbm9taW5hbCAodGlkYWsgYmVydXJ1dGFuKS4NCg0KQ29udG9oIGthc3VzOiB0aW5na2F0IGtlYmVyaGFzaWxhbiBwcm95ZWsgKExvdywgTWVkaXVtLCBIaWdoKSwgamVuaXMgcHJvZHVrIHlhbmcgZGlwaWxpaCAoQSwgQiwgQyksIGF0YXUga2VwdXR1c2FuIHBlbGFuZ2dhbiAoYmVsaSBBLCBiZWxpIEIsIHRpZGFrIGJlbGkpLg0KDQpUdWp1YW5ueWEgYWRhbGFoIHVudHVrIG1lbW9kZWxrYW4gcHJvYmFiaWxpdGFzIHNldGlhcCBrYXRlZ29yaSBkYXJpIHZhcmlhYmVsIGRlcGVuZGVuIGJlcmRhc2Fya2FuIHNhdHUgYXRhdSBsZWJpaCB2YXJpYWJlbCBpbmRlcGVuZGVuICgkWOKCgSwgWOKCgiwgWOKCgywg4oCmJCkuTW9kZWwgaW5pIG1lbXBlcmtpcmFrYW4gcGVsdWFuZyBzdWF0dSBvYnNlcnZhc2kgdGVybWFzdWsga2UgZGFsYW0gbWFzaW5nLW1hc2luZyBrYXRlZ29yaS4NCg0KDQpKaWthIHRlcmRhcGF0ICggJEskICkga2F0ZWdvcmkgcGFkYSB2YXJpYWJlbCBkZXBlbmRlbiAoICRZJCApLCBtYWthIG1vZGVsIG1lbWlsaWggc2F0dSBrYXRlZ29yaSBzZWJhZ2FpIGthdGVnb3JpIHJlZmVyZW5zaSAoYmFzZWxpbmUpIGJpYXNhbnlhIGthdGVnb3JpIHRlcmFraGlyLiBLZW11ZGlhbiwgdW50dWsgc2V0aWFwIGthdGVnb3JpICggJGsgPSAxLCAyLCAuLi4sIEstMSQgKSwgbW9kZWwgbWVuZ2hpdHVuZyBsb2cgb2RkcyBkaWJhbmRpbmdrYW4gZGVuZ2FuIGthdGVnb3JpIHJlZmVyZW5zaToNCg0KJCQNClxsb2dcbGVmdChcZnJhY3tQKFkgPSBrKX17UChZID0gSyl9XHJpZ2h0KSA9IFxiZXRhX3swa30gKyBcYmV0YV97MWt9WF8xICsgXGJldGFfezJrfVhfMiArIFxjZG90cyArIFxiZXRhX3twa31YX3ANCiQkDQoNCktldGVyYW5nYW46DQoNCiogKCAkUChZID0gaykkICk6IHByb2JhYmlsaXRhcyBiYWh3YSBvYnNlcnZhc2kgdGVybWFzdWsga2F0ZWdvcmkga2UtKCAkayQgKQ0KKiAoICRQKFkgPSBLKSQgKTogcHJvYmFiaWxpdGFzIGthdGVnb3JpIHJlZmVyZW5zaQ0KKiAoICRcYmV0YV97MGt9JCApOiBpbnRlcmNlcHQgdW50dWsga2F0ZWdvcmkga2UtKCAkayQgKQ0KKiAoICRcYmV0YV97aWt9JCk6IGtvZWZpc2llbiB2YXJpYWJlbCBpbmRlcGVuZGVuICggJFhfaSQgKSB0ZXJoYWRhcCBrYXRlZ29yaSBrZS0oICRrJCApDQoqICggJFhfaSQgKTogdmFyaWFiZWwgcHJlZGlrdG9yIChtaXNhbG55YSBCdWRnZXQsIFNhdGlzZmFjdGlvbiwgU2FsZXNwZW9wbGUpDQoNCioqUHJvYmFiaWxpdGFzIFNldGlhcCBLYXRlZ29yaSoqDQoNClVudHVrIHNldGlhcCBrYXRlZ29yaSAoICRrJCApLCBwcm9iYWJpbGl0YXNueWEgZGloaXR1bmcgbWVuZ2d1bmFrYW4gZnVuZ3NpIHNvZnRtYXg6DQoNCiQkDQpQKFkgPSBrKSA9IFxmcmFje2Vee1xiZXRhX3swa30gKyBcYmV0YV97MWt9WF8xICsgXGNkb3RzICsgXGJldGFfe3BrfVhfcH19ezEgKyBcc3VtX3tqPTF9XntLLTF9IGVee1xiZXRhX3swan0gKyBcYmV0YV97MWp9WF8xICsgXGNkb3RzICsgXGJldGFfe3BqfVhfcH19DQokJA0KDQpkYW4gdW50dWsga2F0ZWdvcmkgcmVmZXJlbnNpICggJEskICk6DQoNCiQkDQpQKFkgPSBLKSA9IFxmcmFjezF9ezEgKyBcc3VtX3tqPTF9XntLLTF9IGVee1xiZXRhX3swan0gKyBcYmV0YV97MWp9WF8xICsgXGNkb3RzICsgXGJldGFfe3BqfVhfcH19DQokJA0KDQoqIEtvZWZpc2llbiAoICRcYmV0YV97aWt9JCApIG1lbnVuanVra2FuIHBlcnViYWhhbiBsb2cgb2RkcyBrYXRlZ29yaSAoICRrJCApIHJlbGF0aWYgdGVyaGFkYXAga2F0ZWdvcmkgcmVmZXJlbnNpIGFraWJhdCBwZXJ1YmFoYW4gc2F0dSB1bml0IHBhZGEgKCAkWF9pJCApLg0KKiBKaWthICggJFxiZXRhX3tpa30gPiAwJCApLCBtYWthIHBlbmluZ2thdGFuICggJFhfaSQgKSBtZW5pbmdrYXRrYW4gcGVsdWFuZyBvYnNlcnZhc2kgdGVybWFzdWsga2Uga2F0ZWdvcmkgKCAkayQgKSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHJlZmVyZW5zaS4NCiogSmlrYSAoICRcYmV0YV97aWt9IDwgMCQgKSwgbWFrYSBlZmVrbnlhIHNlYmFsaWtueWEuDQoNCg0KIyBEYXRhc2V0DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyAxLiBCYWNhIGRhdGFzZXQNCmRhdGEgPC0gcmVhZC5jc3YoInJlZ3Jlc2lfZGF0YS5jc3YiKQ0KDQojIDIuIEhpdHVuZyBza29yIGxpbmVhciBzZWJhZ2FpIGtvbWJpbmFzaSBkYXJpIHZhcmlhYmVsIGluZGVwZW5kZW4NCmRhdGEkc2NvcmUgPC0gd2l0aChkYXRhLA0KICAgICAgICAgICAgICAgICAgIDAuNSAqIEFkdmVydGlzaW5nICsNCiAgICAgICAgICAgICAgICAgICAwLjMgKiBTYWxlc3Blb3BsZSArDQogICAgICAgICAgICAgICAgICAgMC43ICogU2F0aXNmYWN0aW9uIC0NCiAgICAgICAgICAgICAgICAgICAwLjYgKiBDb21wZXRpdGlvbikNCg0KIyAzLiBOb3JtYWxpc2FzaSBza29yIGFnYXIgdGVyZGlzdHJpYnVzaSBkZW5nYW4gYmFpaw0KZGF0YSRzY29yZV9ub3JtIDwtIChkYXRhJHNjb3JlIC0gbWluKGRhdGEkc2NvcmUpKSAvIChtYXgoZGF0YSRzY29yZSkgLSBtaW4oZGF0YSRzY29yZSkpDQoNCiMgNC4gQnVhdCB2YXJpYWJlbCB0YXJnZXQgYmFydSBkZW5nYW4gMyBrYXRlZ29yaSAobXVsdGlub21pYWwpDQpkYXRhJFN1Y2Nlc3NfTGV2ZWwgPC0gY3V0KGRhdGEkc2NvcmVfbm9ybSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCAwLjMzLCAwLjY2LCBJbmYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSkNCg0KIyA1LiBIYXB1cyBrb2xvbSBsYW1hICdTdWNjZXNzJyAoamlrYSBpbmdpbiBkaWdhbnRpKQ0KZGF0YSRTdWNjZXNzIDwtIE5VTEwNCg0KIyA2LiBUYW1waWxrYW4gZGVuZ2FuIERUDQpsaWJyYXJ5KERUKQ0KZGF0YXRhYmxlKGRhdGEsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSkpDQpgYGANCg0KDQojIE1lbWJ1YXQgTW9kZWwgTXVsdGlub21pYWwgTG9naXN0aWMgUmVncmVzc2lvbg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KG5uZXQpDQoNCiMgRml0IG1vZGVsIG11bHRpbm9taWFsIGxvZ2lzdGljIHJlZ3Jlc3Npb24NCm1vZGVsX211bHRpbm9tIDwtIG11bHRpbm9tKFN1Y2Nlc3NfTGV2ZWwgfiBBZHZlcnRpc2luZyArIFNhbGVzcGVvcGxlICsgU2F0aXNmYWN0aW9uICsgQ29tcGV0aXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCg0KIyBMaWhhdCByaW5na2FzYW4gaGFzaWwgbW9kZWwNCnN1bW1hcnkobW9kZWxfbXVsdGlub20pDQpgYGANCg0KSGFzaWwgbXVsdGlub21pYWwgbG9naXN0aWMgcmVncmVzc2lvbiBtZW51bmp1a2thbiBiYWh3YSBmYWt0b3ItZmFrdG9yIHBlbWFzYXJhbiBzZXBlcnRpIGFuZ2dhcmFuIGlrbGFuIChBZHZlcnRpc2luZyksIGp1bWxhaCB0ZW5hZ2EgcGVuanVhbCAoU2FsZXNwZW9wbGUpLCBrZXB1YXNhbiBwZWxhbmdnYW4gKFNhdGlzZmFjdGlvbiksIGRhbiB0aW5na2F0IGtvbXBldGlzaSAoQ29tcGV0aXRpb24pIHNlY2FyYSBiZXJzYW1hLXNhbWEgYmVycGVuZ2FydWggdGVyaGFkYXAgdGluZ2thdCBrZWJlcmhhc2lsYW4ga2FtcGFueWUgcGVtYXNhcmFuLiBNb2RlbCBtZW5nZ3VuYWthbiBrYXRlZ29yaSBMb3cgc2ViYWdhaSBwZW1iYW5kaW5nLCBkYW4gbWVtcGVya2lyYWthbiBwZWx1YW5nIHN1YXR1IGthbXBhbnllIGJlcmFkYSBwYWRhIGthdGVnb3JpIE1lZGl1bSBhdGF1IEhpZ2ggZGliYW5kaW5nIExvdy4NCg0KS29lZmlzaWVuIGJlcnRhbmRhIHBvc2l0aWYgcGFkYSB2YXJpYWJlbCBBZHZlcnRpc2luZywgU2FsZXNwZW9wbGUsIGRhbiBTYXRpc2ZhY3Rpb24gbWVudW5qdWtrYW4gYmFod2Egc2VtYWtpbiBiZXNhciBhbmdnYXJhbiBpa2xhbiwgc2VtYWtpbiBiYW55YWsgdGVuYWdhIHBlbmp1YWwgeWFuZyB0ZXJsaWJhdCwgZGFuIHNlbWFraW4gdGluZ2dpIGtlcHVhc2FuIHBlbGFuZ2dhbiwgbWFrYSBrZW11bmdraW5hbiBrYW1wYW55ZSBtZW5jYXBhaSBrZWJlcmhhc2lsYW4gTWVkaXVtIGF0YXUgSGlnaCBtZW5pbmdrYXQgc2VjYXJhIHNpZ25pZmlrYW4gZGliYW5kaW5na2FuIExvdy4gU2ViYWxpa255YSwga29lZmlzaWVuIENvbXBldGl0aW9uIHlhbmcgbmVnYXRpZiBtZW5hbmRha2FuIGJhaHdhIHNlbWFraW4gdGluZ2dpIHRpbmdrYXQgcGVyc2FpbmdhbiBwYXNhciwgc2VtYWtpbiBrZWNpbCBwZWx1YW5nIGthbXBhbnllIG1lbmNhcGFpIHRpbmdrYXQga2ViZXJoYXNpbGFuIHlhbmcgdGluZ2dpLg0KDQojIE1lbGloYXQgTmlsYWkgU3RhdGlzdGlrIChTdGQuIEVycm9yLCB6IHZhbHVlLCBwIHZhbHVlKQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIEhpdHVuZyB6LXZhbHVlIGRhbiBwLXZhbHVlDQp6IDwtIHN1bW1hcnkobW9kZWxfbXVsdGlub20pJGNvZWZmaWNpZW50cyAvIHN1bW1hcnkobW9kZWxfbXVsdGlub20pJHN0YW5kYXJkLmVycm9ycw0KcCA8LSAoMSAtIHBub3JtKGFicyh6KSwgMCwgMSkpICogMg0KDQojIEdhYnVuZ2thbiBoYXNpbG55YQ0KY2JpbmQoc3VtbWFyeShtb2RlbF9tdWx0aW5vbSkkY29lZmZpY2llbnRzLCANCiAgICAgICJTdGQuIEVycm9yIiA9IHN1bW1hcnkobW9kZWxfbXVsdGlub20pJHN0YW5kYXJkLmVycm9ycywNCiAgICAgICJ6IHZhbHVlIiA9IHosDQogICAgICAicCB2YWx1ZSIgPSBwKQ0KYGBgDQoNCioqS2F0ZWdvcmkgTWVkaXVtIHZzIExvdyoqDQoNCi0gQWR2ZXJ0aXNpbmcgKM6yID0gOS41OCwgcCDiiYggMC4wNCkg4oaSIEFuZ2dhcmFuIGlrbGFuIGJlcnBlbmdhcnVoIHBvc2l0aWYgZGFuIHNpZ25pZmlrYW4sIGFydGlueWEgcGVuaW5na2F0YW4gaW52ZXN0YXNpIGlrbGFuIG1lbmluZ2thdGthbiBrZW11bmdraW5hbiBrYW1wYW55ZSBuYWlrIGRhcmkgTG93IGtlIE1lZGl1bS4NCg0KLSBTYWxlc3Blb3BsZSAozrIgPSA1LjgwLCBwIOKJiCAwLjA0KSDihpIgTGViaWggYmFueWFrIHRlbmFnYSBwZW5qdWFsIHNlY2FyYSBueWF0YSBtZW5pbmdrYXRrYW4gcGVsdWFuZyBrZWJlcmhhc2lsYW4gdGluZ2thdCBtZW5lbmdhaC4NCg0KLSBTYXRpc2ZhY3Rpb24gKM6yID0gMTMuMjgsIHAg4omIIDAuMDQpIOKGkiBLZXB1YXNhbiBwZWxhbmdnYW4geWFuZyB0aW5nZ2kgc2FuZ2F0IG1lbmRvcm9uZyBwZW5pbmdrYXRhbiBrZWJlcmhhc2lsYW4uDQoNCi0gQ29tcGV0aXRpb24gKM6yID0gLTExLjg0LCBwIOKJiCAwLjA0KSDihpIgUGVyc2FpbmdhbiBwYXNhciB5YW5nIHRpbmdnaSBtZW51cnVua2FuIHBlbHVhbmcga2ViZXJoYXNpbGFuLg0KDQoqKkthdGVnb3JpIEhpZ2ggdnMgTG93KioNCg0KLSBBZHZlcnRpc2luZyAozrIgPSAxNS4yMSwgcCDiiYggMC4wMikg4oaSIFBlbmdhcnVoIHBvc2l0aWYgZGFuIHNpZ25pZmlrYW4uIFNlbWFraW4gYmVzYXIgYW5nZ2FyYW4gaWtsYW4sIHNlbWFraW4gdGluZ2dpIHBlbHVhbmcga2FtcGFueWUgbWVuY2FwYWkga2ViZXJoYXNpbGFuIHRpbmdnaSAoSGlnaCkuDQoNCi0gU2FsZXNwZW9wbGUgKM6yID0gOS44NiwgcCDiiYggMC4wMSkg4oaSIEp1bWxhaCB0ZW5hZ2EgcGVuanVhbCB5YW5nIGxlYmloIGJhbnlhayBtZW5pbmdrYXRrYW4ga2VtdW5na2luYW4gc3Vrc2VzIHBlbnVoLg0KDQotIFNhdGlzZmFjdGlvbiAozrIgPSAyMi4yOCwgcCDiiYggMC4wMSkg4oaSIEtlcHVhc2FuIHBlbGFuZ2dhbiBtZW5qYWRpIGZha3RvciBwYWxpbmcga3VhdCBkYWxhbSBtZW5lbnR1a2FuIGtlYmVyaGFzaWxhbiB0ZXJ0aW5nZ2kuDQoNCi0gQ29tcGV0aXRpb24gKM6yID0gLTE4LjQ5LCBwIOKJiCAwLjAxKSDihpIgS29tcGV0aXNpIHRpbmdnaSBzZWNhcmEgc2lnbmlmaWthbiBtZW51cnVua2FuIHBlbHVhbmcgbWVuY2FwYWkgdGluZ2thdCBrZWJlcmhhc2lsYW4gdGVydGluZ2dpLg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIGhhc2lsIGFuYWxpc2lzIE11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24gbWVudW5qdWtrYW4gYmFod2EgZmFrdG9yIFNhdGlzZmFjdGlvbiAoa2VwdWFzYW4gcGVsYW5nZ2FuKSBtZXJ1cGFrYW4gZGV0ZXJtaW5hbiBwYWxpbmcga3VhdCB0ZXJoYWRhcCBwZW5pbmdrYXRhbiBTdWNjZXNzIExldmVsLCBkaWlrdXRpIG9sZWggQWR2ZXJ0aXNpbmcgZGFuIFNhbGVzcGVvcGxlIHlhbmcgYmVycGVuZ2FydWggcG9zaXRpZi4gU2ViYWxpa255YSwgQ29tcGV0aXRpb24gbWVtaWxpa2kgZGFtcGFrIG5lZ2F0aWYgeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwIGtlYmVyaGFzaWxhbi4NCg0KIyBFdmFsdWFzaSBBa3VyYXNpIE1vZGVsDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgUHJlZGlrc2kga2VsYXMNCnByZWRfY2xhc3MgPC0gcHJlZGljdChtb2RlbF9tdWx0aW5vbSkNCg0KIyBDb25mdXNpb24gbWF0cml4DQpjb25mX21hdHJpeCA8LSB0YWJsZShQcmVkaWN0ZWQgPSBwcmVkX2NsYXNzLCBBY3R1YWwgPSBkYXRhJFN1Y2Nlc3NfTGV2ZWwpDQpjb25mX21hdHJpeA0KDQojIEhpdHVuZyBha3VyYXNpDQphY2N1cmFjeSA8LSBzdW0oZGlhZyhjb25mX21hdHJpeCkpIC8gc3VtKGNvbmZfbWF0cml4KQ0KYWNjdXJhY3kNCmBgYA0KDQpIYXNpbCBldmFsdWFzaSBtb2RlbCBNdWx0aW5vbWlhbCBMb2dpc3RpYyBSZWdyZXNzaW9uIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIG1hbXB1IG1lbXByZWRpa3NpIHRpbmdrYXQga2ViZXJoYXNpbGFuIGthbXBhbnllIHBlbWFzYXJhbiAoU3VjY2VzcyBMZXZlbCkgZGVuZ2FuIGFrdXJhc2kgc2VtcHVybmEgc2ViZXNhciAxMDAlLCBkaSBtYW5hIHNlbHVydWgga2F0ZWdvcmkgYWt0dWFs4oCUTG93LCBNZWRpdW0sIGRhbiBIaWdo4oCUYmVyaGFzaWwgZGlwcmVkaWtzaSBkZW5nYW4gdGVwYXQgdGFucGEga2VzYWxhaGFuIGtsYXNpZmlrYXNpLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBrb21iaW5hc2kgZmFrdG9yIEFkdmVydGlzaW5nLCBTYWxlc3Blb3BsZSwgU2F0aXNmYWN0aW9uLCBkYW4gQ29tcGV0aXRpb24gbWVtaWxpa2kga2VtYW1wdWFuIHlhbmcgc2FuZ2F0IGt1YXQgZGFsYW0gbWVtYmVkYWthbiBzZXRpYXAgdGluZ2thdCBrZWJlcmhhc2lsYW4uIERlbmdhbiBrYXRhIGxhaW4sIHBlbmluZ2thdGFuIGludmVzdGFzaSBpa2xhbiwganVtbGFoIHRlbmFnYSBwZW5qdWFsLCBzZXJ0YSBrZXB1YXNhbiBwZWxhbmdnYW4geWFuZyB0aW5nZ2kgc2VjYXJhIGtvbnNpc3RlbiBiZXJrb250cmlidXNpIHRlcmhhZGFwIGtlYmVyaGFzaWxhbiB5YW5nIGxlYmloIGJlc2FyLCBzZW1lbnRhcmEgdGluZ2dpbnlhIHRpbmdrYXQgcGVyc2FpbmdhbiBtZW5qYWRpIGZha3RvciB5YW5nIG1lbnVydW5rYW4gcGVsdWFuZyBzdWtzZXMuDQoNCiMgVmlzdWFsaXNhc2kNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShubmV0KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIC0tLSAxLiBTaW11bGFzaSBEYXRhIE11bHRpbm9taWFsIC0tLQ0Kc2V0LnNlZWQoMTIzKQ0KZGF0YV9tdWx0aW5vbSA8LSBkYXRhLmZyYW1lKA0KICBBZHZlcnRpc2luZyA9IHJ1bmlmKDIwMCwgNSwgMzApLA0KICBTYWxlc3Blb3BsZSA9IHJ1bmlmKDIwMCwgMSwgMTApLA0KICBTYXRpc2ZhY3Rpb24gPSBydW5pZigyMDAsIDEsIDEwKSwNCiAgQ29tcGV0aXRpb24gPSBydW5pZigyMDAsIDEsIDEwKQ0KKQ0KDQojIE1lbWJ1YXQga2F0ZWdvcmkgIlN1Y2Nlc3NfTGV2ZWwiIChMb3csIE1lZGl1bSwgSGlnaCkNCnNjb3JlIDwtIDAuMyAqIGRhdGFfbXVsdGlub20kQWR2ZXJ0aXNpbmcgKw0KICAgICAgICAgMC40ICogZGF0YV9tdWx0aW5vbSRTYWxlc3Blb3BsZSArDQogICAgICAgICAwLjYgKiBkYXRhX211bHRpbm9tJFNhdGlzZmFjdGlvbiAtDQogICAgICAgICAwLjUgKiBkYXRhX211bHRpbm9tJENvbXBldGl0aW9uICsgcm5vcm0oMjAwLCAwLCAyKQ0KDQpkYXRhX211bHRpbm9tJFN1Y2Nlc3NfTGV2ZWwgPC0gY3V0KA0KICBzY29yZSwNCiAgYnJlYWtzID0gcXVhbnRpbGUoc2NvcmUsIHByb2JzID0gYygwLCAxLzMsIDIvMywgMSkpLA0KICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSwNCiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFDQopDQoNCiMgLS0tIDIuIEJhbmd1biBNb2RlbCBNdWx0aW5vbWlhbCAtLS0NCm1vZGVsX211bHRpbm9tIDwtIG11bHRpbm9tKFN1Y2Nlc3NfTGV2ZWwgfiBBZHZlcnRpc2luZyArIFNhbGVzcGVvcGxlICsgU2F0aXNmYWN0aW9uICsgQ29tcGV0aXRpb24sIGRhdGEgPSBkYXRhX211bHRpbm9tKQ0KDQojIC0tLSAzLiBQcmVkaWtzaSBQcm9iYWJpbGl0YXMgLS0tDQpkYXRhX211bHRpbm9tIDwtIGRhdGFfbXVsdGlub20gJT4lDQogIG11dGF0ZShwcmVkX3Byb2JzID0gcHJlZGljdChtb2RlbF9tdWx0aW5vbSwgdHlwZSA9ICJwcm9icyIpWywxXSwNCiAgICAgICAgIFByZWRpY3RlZCA9IHByZWRpY3QobW9kZWxfbXVsdGlub20pKQ0KDQojIC0tLSA0LiBWaXN1YWxpc2FzaSAzRCBJbnRlcmFrdGlmIC0tLQ0KZmlnIDwtIHBsb3RfbHkoZGF0YV9tdWx0aW5vbSwNCiAgICAgICAgICAgICAgIHggPSB+QWR2ZXJ0aXNpbmcsDQogICAgICAgICAgICAgICB5ID0gflNhbGVzcGVvcGxlLA0KICAgICAgICAgICAgICAgeiA9IH5TYXRpc2ZhY3Rpb24sDQogICAgICAgICAgICAgICBjb2xvciA9IH5QcmVkaWN0ZWQsDQogICAgICAgICAgICAgICBjb2xvcnMgPSBjKCJza3libHVlIiwgIm9yYW5nZSIsICJyZWQiKSwNCiAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwNCiAgICAgICAgICAgICAgIG1vZGUgPSAibWFya2VycyIsDQogICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0LCBvcGFjaXR5ID0gMC44KSkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICIzRCBWaXN1YWxpemF0aW9uOiBNdWx0aW5vbWlhbCBMb2dpc3RpYyBSZWdyZXNzaW9uIChMb3figJNNZWRpdW3igJNIaWdoKSIsDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFkdmVydGlzaW5nIEJ1ZGdldCIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNhbGVzcGVvcGxlIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiU2F0aXNmYWN0aW9uIikNCiAgICApDQogICkNCg0KZmlnDQpgYGANCg0KIyBQZXJiZWRhYW4gQmluYXJ5IExvZ2lzdGljIFJlZ3Jlc3Npb24gZGVuZ2FuIE11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24NCg0KfCBBc3BlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipCaW5hcnkgTG9naXN0aWMgUmVncmVzc2lvbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKk11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgKipKdW1sYWgga2F0ZWdvcmkgdmFyaWFiZWwgZGVwZW5kZW4qKiB8IDIga2F0ZWdvcmkgKG1pc2FsbnlhOiAqWWVzL05vKiwgKkx1bHVzL0dhZ2FsKiwgKkJlbGkvVGlkYWsgQmVsaSopICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGViaWggZGFyaSAyIGthdGVnb3JpIChtaXNhbG55YTogKkxvdyosICpNZWRpdW0qLCAqSGlnaCogYXRhdSAqQSosICpCKiwgKkMqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkplbmlzIGthdGVnb3JpKiogICAgICAgICAgICAgICAgICAgIHwgQmVyc2lmYXQgKmJpbmVyKiAoZHVhIGtlbGFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCZXJzaWZhdCAqbm9taW5hbCogKGJpc2EgdGlnYSBhdGF1IGxlYmloLCB0aWRhayBiZXJ1cnV0YW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqRnVuZ3NpIGxpbmsqKiAgICAgICAgICAgICAgICAgICAgICAgfCBMb2dpdDogICRcbG9nIFxmcmFje3B9ezEtcH0kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdlbmVyYWxpemVkIExvZ2l0OiAgJFxsb2cgXGZyYWN7UChZPWspfXtQKFk9Syl9JCB1bnR1ayBzZXRpYXAga2F0ZWdvcmkgKCRrJCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlBlcnNhbWFhbiB1bXVtKiogICAgICAgICAgICAgICAgICAgIHwgJFxsb2dcbGVmdChcZnJhY3twfXsxLXB9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xWF8xICsgXGNkb3RzICsgXGJldGFfcFhfcCQgICAgICAgICAgICAgfCAkXGxvZ1xsZWZ0KFxmcmFje1AoWT1rKX17UChZPUspfVxyaWdodCkgPSBcYmV0YV97MGt9ICsgXGJldGFfezFrfVhfMSArIFxjZG90cyArIFxiZXRhX3twa31YX3AkLCB1bnR1ayAkayA9IDEsIDIsIC4uLiwgSy0xJCB8DQp8ICoqTWV0b2RlIGVzdGltYXNpKiogICAgICAgICAgICAgICAgICAgfCBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEp1Z2EgbWVuZ2d1bmFrYW4gTUxFLCB0ZXRhcGkgbWVuZ2hpdHVuZyBwYXJhbWV0ZXIgdW50dWsgc2V0aWFwIGthdGVnb3JpIHJlbGF0aWYgdGVyaGFkYXAga2F0ZWdvcmkgcmVmZXJlbnNpICAgICAgICAgICAgICAgIHwNCnwgKipPdXRwdXQgbW9kZWwqKiAgICAgICAgICAgICAgICAgICAgICB8IFByb2JhYmlsaXRhcyBrZWphZGlhbiBzYXR1IGthdGVnb3JpIChtaXMuIHN1a3NlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUHJvYmFiaWxpdGFzIHNldGlhcCBrYXRlZ29yaSAobWlzLiBMb3csIE1lZGl1bSwgSGlnaCkgeWFuZyBkaWp1bWxhaGthbiA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkludGVycHJldGFzaSBrb2VmaXNpZW4qKiAgICAgICAgICAgIHwgS29lZmlzaWVuIG1lbnVuanVra2FuIHBlcnViYWhhbiAqbG9nIG9kZHMqIGtlamFkaWFuIHNhdHUga2F0ZWdvcmkgZGliYW5kaW5nIHRpZGFrIHRlcmphZGkgfCBLb2VmaXNpZW4gbWVudW5qdWtrYW4gcGVydWJhaGFuICpsb2cgb2Rkcyoga2F0ZWdvcmkgdGVydGVudHUgZGliYW5kaW5nIGthdGVnb3JpIHJlZmVyZW5zaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQ29udG9oIGthc3VzKiogICAgICAgICAgICAgICAgICAgICAgfCBQcmVkaWtzaSBhcGFrYWggcGVsYW5nZ2FuIG1lbWJlbGkgcHJvZHVrIChZZXMvTm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFByZWRpa3NpIHRpbmdrYXQga2VwdWFzYW4gcGVsYW5nZ2FuICgqTG934oCTTWVkaXVt4oCTSGlnaCopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqRnVuZ3NpIGFrdGl2YXNpKiogICAgICAgICAgICAgICAgICAgfCBTaWdtb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvZnRtYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KDQojIFJlZmVyZW5jZQ0KDQpodHRwczovL2Jvb2tkb3duLm9yZy9jb250ZW50L2ExNDJiMTcyLTY5YjItNDM2ZC1iZGIwLTlkYTZkMDQ2YTBmOS8wMi1SZWdyZXNzaW9uX01vZGVsLmh0bWwjbXVsdGlub21pYWwtbG9naXN0aWNzDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL2NodWEvYmVyNjQyX2FkdmFuY2VkX3JlZ3Jlc3Npb24vbXVsdGlub21pYWwtbG9naXN0aWMtcmVncmVzc2lvbi5odG1sDQoNCg==