Deskripsi proyek
Konteks Masalah
Seorang manajer bank tidak nyaman dengan semakin banyak pelanggan meninggalkan layanan kartu kredit mereka. Mereka akan sangat menghargainya jika seseorang dapat memprediksi siapa yang akan terpengaruh sehingga mereka dapat secara proaktif pergi ke pelanggan untuk memberi mereka layanan yang lebih baik dan mengubah keputusan pelanggan ke arah yang berlawanan.
Tujuan
Proyek ini dilakukan dalam urutan langkah, yang pertama terdiri dari analisis eksplorasi, di mana tujuannya adalah untuk mengetahui perilaku variabel dan untuk menganalisis atribut yang menunjukkan hubungan yang kuat dengan pembatalan pelanggan layanan kartu kredit. Setelah bagian kedua, yang terdiri dari menerapkan teknik rekayasa sumber daya, tindakan ketiga terdiri dari menerapkan algoritma pembelajaran mesin untuk menemukan sumber daya terbaik untuk membangun model. Pada akhir proyek, setelah selesainya semua langkah, model pembelajaran mesin akan dikembangkan, mampu memprediksi, berdasarkan data sistem, apakah pelanggan akan meninggalkan layanan kartu kredit atau tidak.
Data set
Kumpulan data ini terdiri dari 10.000 pelanggan yang menyebutkan usia, gaji, status perkawinan, batas kartu kredit, kategori kartu kredit, dll.
Kami hanya memiliki 16,07% pelanggan yang telah membatalkan. Oleh karena itu, agak sulit untuk melatih model kami untuk memprediksi omset pelanggan.
Error in lapply(X = X, FUN = FUN, ...) : object 'dados_cor' not found
Eksplorasi Data Analysis (EDA)
Sebagaimana dinyatakan dalam ‘Deskripsi Proyek’, langkah ini bertujuan untuk menemukan elemen utama yang bertanggung jawab atas pembatalan atau non-pembatalan pelanggan layanan kartu kredit. Agar sesi pertama ini berhasil dilakukan, saya akan menerapkan beberapa teknik statistik (Analisis Deskriptif) dan visualisasi, yang akan memberikan wawasan penting dan memuaskan untuk melanjutkan sisa analisis.
Analisis Korelasi - Spearman
Agar analisis ini tidak terlalu luas, saya akan menerapkan tes statistik non-parametrik spearman, sehingga memperoleh koefisien korelasi, yang mengukur ketergantungan statistik antara dua variabel. Dengan cara ini, kita dapat memverifikasi dari awal variabel mana yang harus menerima perhatian paling banyak, menghemat waktu dalam menganalisis variabel yang tidak memiliki pengaruh kuat pada tingkat pelanggan yang meninggalkan layanan kartu kredit.
Cara menghitung koefisien korelasi Spearman

n = jumlah titik data untuk dua variabel
di = perbedaan dalam jangkauan elemen “n”
Interpretasi Koefisien Korelasi Spearman
Koefisien Spearman, ⍴, dapat memiliki nilai antara +1 dan -1 di mana:
$rho = +1 $ → Ini berarti asosiasi klasifikasi yang sempurna.
$rho = $ 0 → Ini berarti bahwa tidak ada asosiasi klasifikasi.
$rho = -1 $ → Ini berarti hubungan negatif yang sempurna antara interval.
Variabel yang menunjukkan hubungan negatif yang cukup besar dalam kaitannya dengan atribut dependen, dan itu adalah target penyelidikan, adalah: Total_Trans_Ct, Total_Ct_Chng_Q4_Q1, Total_Revolving_Bal dan Avg_Utilization_Ratio. Asosiasi negatif (<0) menunjukkan bahwa atribut tersebut memiliki tingkat signifikansi yang relevan dalam keabadian pelanggan.
Dengan asosiasi positif kita memiliki variabel: Contacts_Count_12_mon dan Months_inactive_112_mon.
Jumlah Pembatalan Untuk Setiap Kategori Variabel Kualitatif
Sebelum mulai menganalisis variabel kuantitatif, saya akan melalui grafik treemap (teknik visualisasi untuk mewakili data hierarkis menggunakan persegi panjang bersarang), untuk mengetahui perilaku variabel kategoris dari kumpulan data. Lebih tepatnya, saya akan menyelidiki kategori variabel kualitatif mana yang memiliki jumlah pembatalan kartu kredit tertinggi.
Dengan grafik di bawah ini kita dapat memfilter informasi berikut:
46,28% pembatalan kartu kredit berasal dari orang yang sudah menikah dan 7,38% berasal dari pelanggan yang memiliki status perkawinan sebagai perceraian.
35,16% pembatalan kartu kredit berasal dari orang-orang dengan pendapatan tahunan kurang dari 40K dan 7,17% berasal dari pelanggan yang memiliki pendapatan tahunan lebih besar dari atau sama dengan 120K.
30,88% pembatalan kartu kredit berasal dari orang-orang yang telah lulus dan jumlah pembatalan terendah ( 4,45% ) berasal dari pelanggan yang memiliki pos Doktor.
93,17% pembatalan kartu kredit berasal dari pelanggan yang memiliki jenis kartu Biru dan jumlah pembatalan terendah (0,19% ) berasal dari pelanggan yang memiliki jenis kartu Platinum.
Perilaku Total Transaksi yang Dilakukan oleh Pelanggan
Melanjutkan, tetapi sekarang menganalisis variabel kuantitatif. Seperti yang terlihat dalam tes statistik Pearson, di mana variabel ‘Total_Trans_Ct’ memiliki koefisien korelasi -0,376, ‘Total_Revolving_Bal’ dengan -0,241, ‘Avg_Utilization_Ratio’ dengan 0,24 dan ‘Total_Ct_Chng_Q4_Q1’ dengan -0,312, menunjukkan bahwa mereka semua secara positif mempengaruhi pelanggan tetap tinggal. Sesi ini yang namanya ‘Perilaku total transaksi pelanggan’ bertujuan untuk memahami perilaku variabel kuantitatif yang tercantum di atas sehubungan dengan variabel target ‘Attrition_Flag’, yang menginformasikan apakah pelanggan telah meninggalkan layanan kartu atau tidak.
Total_Trans_Ct: Jumlah total transaksi (12 bulan terakhir)
Total_Revolving_Bal: Total saldo kartu kredit bergulir
Avg_Utilization_Ratio: Biaya penggunaan kartu rata-rata
Total_Ct_Chng_Q4_Q1: Perubahan jumlah transaksi (Q4 lebih dari Q1)
Total Customer Transactions
Total revolving credit card balance
Total_Ct_Chng_Q4_Q1: Perubahan jumlah transaksi (Q4 lebih dari Q1)
Analisis Transaksi Pelanggan
Variabel Total_Trans_Ct, yang mewakili jumlah total transaksi dalam 12 bulan terakhir, menunjukkan perilaku yang menarik ketika diamati distribusinya dalam kaitannya dengan pelanggan yang pergi dan mereka yang tidak meninggalkan layanan kartu kredit. Untuk mendapatkan informasi lebih lanjut tentang variabel ini dan bagaimana kaitannya dengan atribut lain dari kumpulan data, dalam sesi ini saya akan melakukan beberapa penyelidikan.
total transaksi dalam 12 bulan terakhir dalam hal persentase.
Warning: 'hcboxplot' is deprecated.
Use 'data_to_boxplot' instead.
See help("Deprecated")
Salah satu cara untuk menafsirkan langkah-langkah pemisahan dari bagan boxplot di atas adalah:
50% nasabah yang meninggalkan layanan kartu kredit memiliki sejumlah transaksi dalam 12 bulan terakhir kurang dari atau sama dengan 43, mengingat bahwa jumlah maksimum transaksi dalam 12 bulan terakhir nasabah yang meninggalkan layanan adalah 72. Sedangkan median masyarakat yang tetap dengan layanan kartu adalah 71 kali transaksi.
75% pelanggan yang meninggalkan layanan kartu kredit memiliki sejumlah transaksi dalam 12 bulan terakhir sama dengan atau kurang dari 51. Kuartil ketiga orang yang tetap dengan layanan kartu adalah 82 transaksi.
Jumlah transaksi dalam (12 bulan terakhir) vs Total nilai transaksi (12 bulan terakhir)
|=======================================================================|100% ~0 s remaining
|=======================================================================|100% ~0 s remaining
Analisis Bersama Atribut Kualitatif Klien masing-masing Kelompok
Analisis ini bertujuan untuk menggambarkan, melalui bagan kolom, semua karakteristik kualitatif nasabah yang telah meninggalkan layanan kartu kredit atau tidak. Setiap kolom atau persegi panjang grafik mewakili persentase relatif dari karakteristik yang diberikan dalam kelompok (Pelanggan yang Ada atau Pelanggan Yang Terisi).
Jenis grafik ini dapat digunakan untuk memfilter jenis informasi berikut: “Dari kelompok pelanggan yang meninggalkan layanan kartu kredit, 41,06% lajang, sedangkan dari kelompok orang yang tinggal dengan kartu kredit, hanya 38,53% yang lajang”.
Pada grafik di atas, di mana luas setiap persegi panjang mewakili frekuensi relatif dari kategori tertentu milik variabel kualitatif. Dalam masing-masing karakteristik yang disajikan dalam sumbu x grafik, ada frekuensi relatif dari dua kelompok yang berbeda, yaitu: ‘Pelanggan yang Tertarik’ (pelanggan yang meninggalkan layanan kartu) dan ‘Pelanggan yang Ada’ (pelanggan yang tetap dengan layanan kartu kredit). Melihat grafik, dapat dilihat bahwa ketika membandingkan persentase dari setiap kategori antara kelas Attracted Client dan Existing Client, tidak ada perilaku yang menunjukkan bahwa klien dengan kualitas tertentu, seperti jenis kelamin, status perkawinan atau latar belakang pendidikan, lebih cenderung putus sekolah atau tinggal dengan layanan kartu kredit.
Untuk memperdalam analisis karakteristik atribut kualitatif pelanggan dan mencoba menemukan beberapa pola, saya akan mengelompokkan semua kekhasan pelanggan yang meninggalkan layanan kartu kredit dan mencari di antara semua kombinasi yang mungkin dalam ruang atribut kualitatif dari kumpulan data, jika ada profil dengan kualitas tertentu yang menonjol di antara yang lain, Yaitu Saya akan mencoba menemukan profil pelanggan dengan kekhasan tertentu, yang memiliki tingkat penghindaran yang sangat jauh dari yang lain.
Meskipun perlu untuk mempertimbangkan variabel lain sehingga dimungkinkan untuk membuat pernyataan konkret, dengan tabel kelompok karakteristik dan persentase relatif masing-masing, kami memiliki, berdasarkan atribut kualitatif pelanggan, dari 275 kombinasi karakteristik atribut kualitatif yang berbeda 9,78% profil yang bertanggung jawab untuk meninggalkan layanan kartu adalah:
4,92% adalah perempuan, tingkat pendidikan sarjana, status perkawinan menikah, pendapatan tahunan kurang dari $ 40K dan jenis kartu biru.
4,86% adalah perempuan, tingkat pendidikan sarjana, status perkawinan tunggal, pendapatan tahunan kurang dari $ 40K dan jenis kartu biru.
Untuk melihat profil yang cenderung tidak meninggalkan layanan kartu, cukup buka catatan terakhir dalam tabel di atas.
Mesin Fitur
Semua keputusan yang dibuat dalam proses rekayasa sumber daya adalah yang menurut saya adalah yang terbaik untuk menyiapkan data untuk proses pembelajaran mesin. Saya akan menggunakan teknik dasar, seperti pelarangan data untuk mengurangi tingginya jumlah nilai unik, pengkodean satu panas untuk variabel kualitatif nominal dan menerapkan teknik oversampling minoritas sintetis untuk menyeimbangkan kelas dalam data pelatihan.
Mengelompokkan Data ke Bins
Data binning adalah metode pra-pemrosesan data yang digunakan untuk meminimalkan efek dari kesalahan pengamatan kecil. Nilai data asli dibagi menjadi interval kecil yang dikenal sebagai tempat sampah dan kemudian digantikan oleh nilai yang dihitung secara keseluruhan untuk tempat sampah itu. Ini memiliki efek smoothing pada data input dan juga dapat mengurangi kemungkinan overfitting untuk set data kecil.
Ada 2 metode membagi data ke dalam kotak
1 Binning frekuensi yang sama: tempat sampah memiliki frekuensi yang sama.
2 Binning dengan lebar yang sama: tempat sampah memiliki lebar yang sama dengan interval setiap tempat sampah didefinisikan sebagai [min + w], [min + 2w]…. [min + nw] di mana w = (maks - min) / (jumlah kotak).
Untuk menentukan jumlah tempat sampah, saya akan menggunakan aturan Sturges yang memungkinkan kita untuk membuat kelas amplitudo tetap dari persamaan berikut:
Sturges Rule
\(k = 1 + \frac{10}{3}log_{10}n\)
LS0tDQp0aXRsZTogIkNyZWRpdCBjYXJkIGN1c3RvbWVyIGFuYWx5c2lzIg0KYXV0aG9yOiAiXFUwMDAxRjVFMyBKYW1hbGx1ZGluIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgdG9jOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDcNCiAgICBmaWdfaGVpZ2h0OiA0LjUNCiAgICB0aGVtZTogY29zbW8NCiAgICBoaWdobGlnaHQ6IHRhbmdvDQotLS0NCg0KDQotLS0NCg0KPGNlbnRlcj48aW1nIHNyYz0iaHR0cHM6Ly9zcGVjaWFscy1pbWFnZXMuZm9yYmVzaW1nLmNvbS9pbWFnZXNlcnZlLzVmMWZkNjc5YzQwNDlkN2JlYzY3NGM5Mi85NjB4MC5naWY/Zml0PXNjYWxlIiAgc3R5bGU9ImJvcmRlci1yYWRpdXM6IDIwcHg7Ij48L2NlbnRlcj4NCg0KLS0tDQoNCg0KIyBEZXNrcmlwc2kgcHJveWVrDQoNCiMjIEtvbnRla3MgTWFzYWxhaA0KDQpTZW9yYW5nIG1hbmFqZXIgYmFuayB0aWRhayBueWFtYW4gZGVuZ2FuIHNlbWFraW4gYmFueWFrIHBlbGFuZ2dhbiBtZW5pbmdnYWxrYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQgbWVyZWthLiBNZXJla2EgYWthbiBzYW5nYXQgbWVuZ2hhcmdhaW55YSBqaWthIHNlc2VvcmFuZyBkYXBhdCBtZW1wcmVkaWtzaSBzaWFwYSB5YW5nIGFrYW4gdGVycGVuZ2FydWggc2VoaW5nZ2EgbWVyZWthIGRhcGF0IHNlY2FyYSBwcm9ha3RpZiBwZXJnaSBrZSBwZWxhbmdnYW4gdW50dWsgbWVtYmVyaSBtZXJla2EgbGF5YW5hbiB5YW5nIGxlYmloIGJhaWsgZGFuIG1lbmd1YmFoIGtlcHV0dXNhbiBwZWxhbmdnYW4ga2UgYXJhaCB5YW5nIGJlcmxhd2FuYW4uDQoNCg0KIyMgVHVqdWFuDQoNClByb3llayBpbmkgZGlsYWt1a2FuIGRhbGFtIHVydXRhbiBsYW5na2FoLCB5YW5nIHBlcnRhbWEgdGVyZGlyaSBkYXJpIGFuYWxpc2lzIGVrc3Bsb3Jhc2ksIGRpIG1hbmEgdHVqdWFubnlhIGFkYWxhaCB1bnR1ayBtZW5nZXRhaHVpIHBlcmlsYWt1IHZhcmlhYmVsIGRhbiB1bnR1ayBtZW5nYW5hbGlzaXMgYXRyaWJ1dCB5YW5nIG1lbnVuanVra2FuIGh1YnVuZ2FuIHlhbmcga3VhdCBkZW5nYW4gcGVtYmF0YWxhbiBwZWxhbmdnYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQuIFNldGVsYWggYmFnaWFuIGtlZHVhLCB5YW5nIHRlcmRpcmkgZGFyaSBtZW5lcmFwa2FuIHRla25payByZWtheWFzYSBzdW1iZXIgZGF5YSwgdGluZGFrYW4ga2V0aWdhIHRlcmRpcmkgZGFyaSBtZW5lcmFwa2FuIGFsZ29yaXRtYSBwZW1iZWxhamFyYW4gbWVzaW4gdW50dWsgbWVuZW11a2FuIHN1bWJlciBkYXlhIHRlcmJhaWsgdW50dWsgbWVtYmFuZ3VuIG1vZGVsLiBQYWRhIGFraGlyIHByb3llaywgc2V0ZWxhaCBzZWxlc2FpbnlhIHNlbXVhIGxhbmdrYWgsIG1vZGVsIHBlbWJlbGFqYXJhbiBtZXNpbiBha2FuIGRpa2VtYmFuZ2thbiwgbWFtcHUgbWVtcHJlZGlrc2ksIGJlcmRhc2Fya2FuIGRhdGEgc2lzdGVtLCBhcGFrYWggcGVsYW5nZ2FuIGFrYW4gbWVuaW5nZ2Fsa2FuIGxheWFuYW4ga2FydHUga3JlZGl0IGF0YXUgdGlkYWsuDQoNCiMjIERhdGEgc2V0DQoNCkt1bXB1bGFuIGRhdGEgaW5pIHRlcmRpcmkgZGFyaSAxMC4wMDAgcGVsYW5nZ2FuIHlhbmcgbWVueWVidXRrYW4gdXNpYSwgZ2FqaSwgc3RhdHVzIHBlcmthd2luYW4sIGJhdGFzIGthcnR1IGtyZWRpdCwga2F0ZWdvcmkga2FydHUga3JlZGl0LCBkbGwuDQoNCkthbWkgaGFueWEgbWVtaWxpa2kgPHN0cm9uZz4gMTYsMDclIDwvc3Ryb25nPiBwZWxhbmdnYW4geWFuZyB0ZWxhaCBtZW1iYXRhbGthbi4gT2xlaCBrYXJlbmEgaXR1LCBhZ2FrIHN1bGl0IHVudHVrIG1lbGF0aWggbW9kZWwga2FtaSB1bnR1ayBtZW1wcmVkaWtzaSBvbXNldCBwZWxhbmdnYW4uDQoNCg0KYGBge3IgZWNobz1GfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZ9DQoNCiMgSW5zdGFsbCBwYWNrcGFnZXMNCiMgaW5zdGFsbC5wYWNrYWdlcygiUmFuZG9tRm9yZXN0IikNCiMgaW5zdGFsbC5wYWNrYWdlcygiaGlnaGNoYXJ0ZXIiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJiaWxsYm9hcmRlciIpDQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ4Z2Jvb3N0IikNCiMgaW5zdGFsbC5wYWNrYWdlcygidGltZXRrIikNCiMgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQojIGluc3RhbGwucGFja2FnZXMoIkRNd1IiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikNCiMgaW5zdGFsbC5wYWNrYWdlcygiUk9TRSIpDQojIGluc3RhbGwucGFja2FnZXMoImgybyIpDQojIGluc3RhbGwucGFja2FnZXMoIkRUIikNCg0KIyBsaWJyYXJ5IHlhbmcgZGlndW5ha2FuIA0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KbGlicmFyeShiaWxsYm9hcmRlcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoeGdib29zdCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkodGltZXRrKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShETXdSMikNCmxpYnJhcnkoUk9TRSkNCmxpYnJhcnkoZ2x1ZSkNCmxpYnJhcnkocFJPQykNCmxpYnJhcnkoRFQpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89Rn0NCg0KIyBNZW11YXQgZGF0YXNldHQNCmRhZG9zIDwtIHJlYWQuY3N2KGZpbGUgPSAiQmFua0NodXJuZXJzLmNzdiIsIHNlcCA9ICIsIiwgc3RyaW5nc0FzRmFjdG9ycyA9IFQpDQoNCiMgTWVuZ2hhcHVzIGtvbG9tIHlhbmcgdGlkYWsgYWthbiBkaWd1bmFrYW4gc2VsYW1hIGFuYWxpc2lzDQpkYWRvcyA8LSBzZWxlY3QoZGFkb3MsIC1jKCJDTElFTlROVU0iLCAiTmFpdmVfQmF5ZXNfQ2xhc3NpZmllcl9BdHRyaXRpb25fRmxhZ19DYXJkX0NhdGVnb3J5X0NvbnRhY3RzX0NvdW50XzEyX21vbl9EZXBlbmRlbnRfY291bnRfRWR1Y2F0aW9uX0xldmVsX01vbnRoc19JbmFjdGl2ZV8xMl9tb25fMSIsICJOYWl2ZV9CYXllc19DbGFzc2lmaWVyX0F0dHJpdGlvbl9GbGFnX0NhcmRfQ2F0ZWdvcnlfQ29udGFjdHNfQ291bnRfMTJfbW9uX0RlcGVuZGVudF9jb3VudF9FZHVjYXRpb25fTGV2ZWxfTW9udGhzX0luYWN0aXZlXzEyX21vbl8yIikpDQpkYWRvc19jb3IgPC0gZGFkb3MNCg0KIyBNZW5nZ2FudGkgZWxlbWVuIHZhcmlhYmVsIHRhZ2V0IEF0dHJpdGlvbl9GbGFnDQpzdWJfdGFyZ2V0IDwtIGZ1bmN0aW9uKHgpew0KICBpZih4ID09ICJFeGlzdGluZyBDdXN0b21lciIpew0KICAgIHJldHVybigwKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybigxKQ0KICB9DQp9DQpkYWRvc19jb3IkQXR0cml0aW9uX0ZsYWcgPC0gc2FwcGx5KGRhZG9zX2NvciRBdHRyaXRpb25fRmxhZywgc3ViX3RhcmdldCkNCg0KIyBNZW5nZ2FudGkgZWxlbWVuIHRhZ2V0IEF0dHJpdGlvbl9GbGFnIHZhcmlhYmVsZQ0Kc3ViX3RhcmdldDEgPC0gZnVuY3Rpb24oeCl7DQogIGlmKHggPT0gIkV4aXN0aW5nLkN1c3RvbWVyIil7DQogICAgcmV0dXJuKDApDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKDEpDQogIH0NCn0NCmBgYA0KDQojIEVrc3Bsb3Jhc2kgRGF0YSBBbmFseXNpcyAoRURBKQ0KDQpTZWJhZ2FpbWFuYSBkaW55YXRha2FuIGRhbGFtICdEZXNrcmlwc2kgUHJveWVrJywgbGFuZ2thaCBpbmkgYmVydHVqdWFuIHVudHVrIG1lbmVtdWthbiBlbGVtZW4gdXRhbWEgeWFuZyBiZXJ0YW5nZ3VuZyBqYXdhYiBhdGFzIHBlbWJhdGFsYW4gYXRhdSBub24tcGVtYmF0YWxhbiBwZWxhbmdnYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQuIEFnYXIgc2VzaSBwZXJ0YW1hIGluaSBiZXJoYXNpbCBkaWxha3VrYW4sIHNheWEgYWthbiBtZW5lcmFwa2FuIGJlYmVyYXBhIHRla25payBzdGF0aXN0aWsgKEFuYWxpc2lzIERlc2tyaXB0aWYpIGRhbiB2aXN1YWxpc2FzaSwgeWFuZyBha2FuIG1lbWJlcmlrYW4gd2F3YXNhbiBwZW50aW5nIGRhbiBtZW11YXNrYW4gdW50dWsgbWVsYW5qdXRrYW4gc2lzYSBhbmFsaXNpcy4NCg0KIyMgQW5hbGlzaXMgS29yZWxhc2kgLSBTcGVhcm1hbg0KDQpBZ2FyIGFuYWxpc2lzIGluaSB0aWRhayB0ZXJsYWx1IGx1YXMsIHNheWEgYWthbiBtZW5lcmFwa2FuIHRlcyBzdGF0aXN0aWsgbm9uLXBhcmFtZXRyaWsgc3BlYXJtYW4sIHNlaGluZ2dhIG1lbXBlcm9sZWgga29lZmlzaWVuIGtvcmVsYXNpLCB5YW5nIG1lbmd1a3VyIGtldGVyZ2FudHVuZ2FuIHN0YXRpc3RpayBhbnRhcmEgZHVhIHZhcmlhYmVsLiBEZW5nYW4gY2FyYSBpbmksIGtpdGEgZGFwYXQgbWVtdmVyaWZpa2FzaSBkYXJpIGF3YWwgdmFyaWFiZWwgbWFuYSB5YW5nIGhhcnVzIG1lbmVyaW1hIHBlcmhhdGlhbiBwYWxpbmcgYmFueWFrLCBtZW5naGVtYXQgd2FrdHUgZGFsYW0gbWVuZ2FuYWxpc2lzIHZhcmlhYmVsIHlhbmcgdGlkYWsgbWVtaWxpa2kgcGVuZ2FydWgga3VhdCBwYWRhIHRpbmdrYXQgcGVsYW5nZ2FuIHlhbmcgbWVuaW5nZ2Fsa2FuIGxheWFuYW4ga2FydHUga3JlZGl0Lg0KDQotLS0NCg0KKipDYXJhIG1lbmdoaXR1bmcga29lZmlzaWVuIGtvcmVsYXNpIFNwZWFybWFuKioNCg0KPGltZyBzcmM9Imh0dHBzOi8vd3d3LnF1ZXN0aW9ucHJvLmNvbS9ibG9nL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE5LzA1LzMucG5nIj4NCg0KbiA9IGp1bWxhaCB0aXRpayBkYXRhIHVudHVrIGR1YSB2YXJpYWJlbA0KDQpkaSA9IHBlcmJlZGFhbiBkYWxhbSBqYW5na2F1YW4gZWxlbWVuICJuIg0KDQotLS0NCg0KKipJbnRlcnByZXRhc2kgS29lZmlzaWVuIEtvcmVsYXNpIFNwZWFybWFuKioNCg0KS29lZmlzaWVuIFNwZWFybWFuLCDijbQsIGRhcGF0IG1lbWlsaWtpIG5pbGFpIGFudGFyYSArMSBkYW4gLTEgZGkgbWFuYToNCg0KKyAkcmhvID0gKzEgJCDihpIgSW5pIGJlcmFydGkgYXNvc2lhc2kga2xhc2lmaWthc2kgeWFuZyBzZW1wdXJuYS4NCg0KKyAkcmhvID0gJCAwIOKGkiBJbmkgYmVyYXJ0aSBiYWh3YSB0aWRhayBhZGEgYXNvc2lhc2kga2xhc2lmaWthc2kuDQoNCisgJHJobyA9IC0xICQg4oaSIEluaSBiZXJhcnRpIGh1YnVuZ2FuIG5lZ2F0aWYgeWFuZyBzZW1wdXJuYSBhbnRhcmEgaW50ZXJ2YWwuDQoNCi0tLQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCiMgTWVuZGFwYXRrYW4gbWF0cmlrcyBrb3JlbGFzaSBkZW5nYW4gbWV0b2RlIFNwZWFybWFuDQpjb3Jfc3BlYXJtYW4gPC0gY29yKGRhZG9zX2NvclssIHNhcHBseShkYWRvc19jb3IsIGlzLm51bWVyaWMpXSwgbWV0aG9kID0gJ3NwZWFybWFuJykNCg0KIyBNZW12aXN1YWxpc2FzaWthbiBkZW5nYW4gaGVhdG1hcCBtYXRyaWtzIGtvcmVsYXNpIGRlbmdhbiBtZXRvZGUgcGVhcnNvbg0KYXMubWF0cml4KGRhdGEuZnJhbWUoY29yX3NwZWFybWFuKSkgJT4lIA0KICByb3VuZCgzKSAlPiUgI3JvdW5kDQogIGhjaGFydCgpICU+JSANCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX3NtcGwoKSkgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiU3BlYXJtYW4ncyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMiLCBhbGlnbiA9ICJjZW50ZXIiKSAlPiUgDQogIGhjX2xlZ2VuZChhbGlnbiA9ICJjZW50ZXIiKSAlPiUgDQogIGhjX2NvbG9yQXhpcyhzdG9wcyA9IGNvbG9yX3N0b3BzKGNvbG9ycyA9IHZpcmlkaXM6OmluZmVybm8oMTApKSkgJT4lDQogIGhjX3Bsb3RPcHRpb25zKA0KICAgICAgICAgICBzZXJpZXMgPSBsaXN0KA0KICAgICAgICAgICAgIGJvZGVyV2lkdGggPSAwLA0KICAgICAgICAgICAgIGRhdGFMYWJlbHMgPSBsaXN0KGVuYWJsZWQgPSBUUlVFKSkpDQoNCmBgYA0KDQpWYXJpYWJlbCB5YW5nIG1lbnVuanVra2FuIGh1YnVuZ2FuIG5lZ2F0aWYgeWFuZyBjdWt1cCBiZXNhciBkYWxhbSBrYWl0YW5ueWEgZGVuZ2FuIGF0cmlidXQgZGVwZW5kZW4sIGRhbiBpdHUgYWRhbGFoIHRhcmdldCBwZW55ZWxpZGlrYW4sIGFkYWxhaDogVG90YWxfVHJhbnNfQ3QsIFRvdGFsX0N0X0NobmdfUTRfUTEsIFRvdGFsX1Jldm9sdmluZ19CYWwgZGFuIEF2Z19VdGlsaXphdGlvbl9SYXRpby4gQXNvc2lhc2kgbmVnYXRpZiAoPDApIG1lbnVuanVra2FuIGJhaHdhIGF0cmlidXQgdGVyc2VidXQgbWVtaWxpa2kgdGluZ2thdCBzaWduaWZpa2Fuc2kgeWFuZyByZWxldmFuIGRhbGFtIGtlYWJhZGlhbiBwZWxhbmdnYW4uDQoNCkRlbmdhbiBhc29zaWFzaSBwb3NpdGlmIGtpdGEgbWVtaWxpa2kgdmFyaWFiZWw6IENvbnRhY3RzX0NvdW50XzEyX21vbiBkYW4gTW9udGhzX2luYWN0aXZlXzExMl9tb24uDQoNCiMjIEp1bWxhaCBQZW1iYXRhbGFuIFVudHVrIFNldGlhcCBLYXRlZ29yaSBWYXJpYWJlbCBLdWFsaXRhdGlmIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpTZWJlbHVtIG11bGFpIG1lbmdhbmFsaXNpcyB2YXJpYWJlbCBrdWFudGl0YXRpZiwgc2F5YSBha2FuIG1lbGFsdWkgZ3JhZmlrIHRyZWVtYXAgKHRla25payB2aXN1YWxpc2FzaSB1bnR1ayBtZXdha2lsaSBkYXRhIGhpZXJhcmtpcyBtZW5nZ3VuYWthbiBwZXJzZWdpIHBhbmphbmcgYmVyc2FyYW5nKSwgdW50dWsgbWVuZ2V0YWh1aSBwZXJpbGFrdSB2YXJpYWJlbCBrYXRlZ29yaXMgZGFyaSBrdW1wdWxhbiBkYXRhLiBMZWJpaCB0ZXBhdG55YSwgc2F5YSBha2FuIG1lbnllbGlkaWtpIGthdGVnb3JpIHZhcmlhYmVsIGt1YWxpdGF0aWYgbWFuYSB5YW5nIG1lbWlsaWtpIGp1bWxhaCBwZW1iYXRhbGFuIGthcnR1IGtyZWRpdCB0ZXJ0aW5nZ2kuDQoNCi0tLQ0KDQoqKkRlbmdhbiBncmFmaWsgZGkgYmF3YWggaW5pIGtpdGEgZGFwYXQgbWVtZmlsdGVyIGluZm9ybWFzaSBiZXJpa3V0OioqDQoNCisgPHN0cm9uZz4gNDYsMjglIDwvc3Ryb25nPiBwZW1iYXRhbGFuIGthcnR1IGtyZWRpdCBiZXJhc2FsIGRhcmkgb3JhbmcgeWFuZyBzdWRhaCBtZW5pa2FoIGRhbiA8c3Ryb25nPiA3LDM4JSA8L3N0cm9uZz4gYmVyYXNhbCBkYXJpIHBlbGFuZ2dhbiB5YW5nIG1lbWlsaWtpIHN0YXR1cyBwZXJrYXdpbmFuIHNlYmFnYWkgcGVyY2VyYWlhbi4NCg0KKyA8c3Ryb25nPiAzNSwxNiUgPC9zdHJvbmc+IHBlbWJhdGFsYW4ga2FydHUga3JlZGl0IGJlcmFzYWwgZGFyaSBvcmFuZy1vcmFuZyBkZW5nYW4gcGVuZGFwYXRhbiB0YWh1bmFuIGt1cmFuZyBkYXJpIDQwSyBkYW4gPHN0cm9uZz4gNywxNyUgPC9zdHJvbmc+IGJlcmFzYWwgZGFyaSBwZWxhbmdnYW4geWFuZyBtZW1pbGlraSBwZW5kYXBhdGFuIHRhaHVuYW4gbGViaWggYmVzYXIgZGFyaSBhdGF1IHNhbWEgZGVuZ2FuIDEyMEsuDQoNCisgPHN0cm9uZz4gMzAsODglIDwvc3Ryb25nPiBwZW1iYXRhbGFuIGthcnR1IGtyZWRpdCBiZXJhc2FsIGRhcmkgb3Jhbmctb3JhbmcgeWFuZyB0ZWxhaCBsdWx1cyBkYW4ganVtbGFoIHBlbWJhdGFsYW4gdGVyZW5kYWggKDxzdHJvbmc+IDQsNDUlIDwvc3Ryb25nPikgYmVyYXNhbCBkYXJpIHBlbGFuZ2dhbiB5YW5nIG1lbWlsaWtpIHBvcyBEb2t0b3IuDQoNCisgPHN0cm9uZz45MywxNyUgPC9zdHJvbmc+IHBlbWJhdGFsYW4ga2FydHUga3JlZGl0IGJlcmFzYWwgZGFyaSBwZWxhbmdnYW4geWFuZyBtZW1pbGlraSBqZW5pcyBrYXJ0dSBCaXJ1IGRhbiBqdW1sYWggcGVtYmF0YWxhbiB0ZXJlbmRhaCAoPHN0cm9uZz4wLDE5JSA8L3N0cm9uZz4pIGJlcmFzYWwgZGFyaSBwZWxhbmdnYW4geWFuZyBtZW1pbGlraSBqZW5pcyBrYXJ0dSBQbGF0aW51bS4NCg0KLS0tDQoNCiMjIyBNYXJpdGFsIHN0YXR1cw0KDQpgYGB7ciBlY2hvPUZ9DQoNCmRhZG9zICU+JQ0KICBmaWx0ZXIoQXR0cml0aW9uX0ZsYWcgPT0gIkF0dHJpdGVkIEN1c3RvbWVyIikgJT4lDQogIGNvdW50KE1hcml0YWxfU3RhdHVzKSAlPiUNCiAgaGNoYXJ0KCJ0cmVlbWFwIiwgaGNhZXMoeCA9IE1hcml0YWxfU3RhdHVzLCB2YWx1ZSA9IG4sIGNvbG9yID0gbikpICU+JQ0KICBoY19jb2xvckF4aXMoc3RvcHMgPSBjb2xvcl9zdG9wcyhjb2xvcnMgPSB2aXJpZGlzOjppbmZlcm5vKDEwKSkpICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIk51bWJlciBvZiBDYW5jZWxsYXRpb25zIEJ5IE1hcml0YWwgU3RhdHVzIiwgYWxpZ24gPSAiY2VudGVyIikNCg0KYGBgDQoNCg0KIyMjIEFubnVhbCBJbmNvbWUNCg0KYGBge3IgZWNobz1GfQ0KDQpkYWRvcyAlPiUNCiAgZmlsdGVyKEF0dHJpdGlvbl9GbGFnID09ICJBdHRyaXRlZCBDdXN0b21lciIpICU+JQ0KICBjb3VudChJbmNvbWVfQ2F0ZWdvcnkpICU+JQ0KICBoY2hhcnQoInRyZWVtYXAiLCBoY2Flcyh4ID0gSW5jb21lX0NhdGVnb3J5LCB2YWx1ZSA9IG4sIGNvbG9yID0gbikpICU+JQ0KICBoY19jb2xvckF4aXMoc3RvcHMgPSBjb2xvcl9zdG9wcyhjb2xvcnMgPSB2aXJpZGlzOjppbmZlcm5vKDEwKSkpICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIk51bWJlciBvZiBDYW5jZWxsYXRpb25zIFBlciBBbm51YWwgSW5jb21lIiwgYWxpZ24gPSAiY2VudGVyIikNCg0KYGBgDQoNCg0KIyMjIEVkdWNhdGlvbmFsIGxldmVsDQoNCmBgYHtyIGVjaG89Rn0NCg0KZGFkb3MgJT4lDQogIGZpbHRlcihBdHRyaXRpb25fRmxhZyA9PSAiQXR0cml0ZWQgQ3VzdG9tZXIiKSAlPiUNCiAgY291bnQoRWR1Y2F0aW9uX0xldmVsKSAlPiUNCiAgaGNoYXJ0KCJ0cmVlbWFwIiwgaGNhZXMoeCA9IEVkdWNhdGlvbl9MZXZlbCwgdmFsdWUgPSBuLCBjb2xvciA9IG4pKSAlPiUNCiAgaGNfY29sb3JBeGlzKHN0b3BzID0gY29sb3Jfc3RvcHMoY29sb3JzID0gdmlyaWRpczo6aW5mZXJubygxMCkpKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJOdW1iZXIgb2YgQ2FuY2VsbGF0aW9ucyBCeSBFZHVjYXRpb25hbCBMZXZlbCIsIGFsaWduID0gImNlbnRlciIpDQoNCg0KYGBgDQoNCg0KIyMjIENhcmQgVHlwZQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCmRhZG9zICU+JQ0KICBmaWx0ZXIoQXR0cml0aW9uX0ZsYWcgPT0gIkF0dHJpdGVkIEN1c3RvbWVyIikgJT4lDQogIGNvdW50KENhcmRfQ2F0ZWdvcnkpICU+JQ0KICBoY2hhcnQoInRyZWVtYXAiLCBoY2Flcyh4ID0gQ2FyZF9DYXRlZ29yeSwgdmFsdWUgPSBuLCBjb2xvciA9IG4pKSAlPiUNCiAgaGNfY29sb3JBeGlzKHN0b3BzID0gY29sb3Jfc3RvcHMoY29sb3JzID0gdmlyaWRpczo6aW5mZXJubygxMCkpKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJOdW1iZXIgb2YgQ2FuY2VsbGF0aW9ucyBieSBDYXJkIFR5cGUiLCBhbGlnbiA9ICJjZW50ZXIiKQ0KDQpgYGANCg0KIyMjIHJlc3VtZQ0KDQojIyMjIE1hcml0YWwgc3RhdHVzDQoNCmBgYHtyIGVjaG89Rn0NCg0KdGFicyA8LSBmdW5jdGlvbihhdHJpYnV0byl7DQogIA0KICBkZiA8LSBmaWx0ZXIoZGFkb3MsIEF0dHJpdGlvbl9GbGFnID09ICJBdHRyaXRlZCBDdXN0b21lciIpDQogIA0KICAjIE1lbXBlcm9sZWggZnJla3VlbnNpIGRhbiBmcmVrdWVuc2kgcmVsYXRpZiAoJSkNCiAgZnJlcXVlbmNlIDwtIHRhYmxlKGRmJENhcmRfQ2F0ZWdvcnkpICogMTAwDQogIHBlcmNlbnQgICA8LSByb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJENhcmRfQ2F0ZWdvcnkpKSAqIDEwMCwgMikNCiAgDQogIGNvbWJpbmUgPC0gY2JpbmQoRnJlcXVlbmN5ID0gZnJlcXVlbmNlLCAiUmVsYXRpdmUgRnJlcXVlbmN5IiA9IHBlcmNlbnQpDQogIGRhdGEuZnJhbWUoY29tYmluZSkNCn0NCg0KdGFicyhNYXJpdGFsX1N0YXR1cykNCmBgYA0KDQojIyMjIEFubnVhbCBJbmNvbWUNCg0KYGBge3IgZWNobz1GfQ0KDQp0YWJzKEluY29tZV9DYXRlZ29yeSkNCg0KYGBgDQoNCiMjIyMgRWR1Y2F0aW9uYWwgbGV2ZWwNCg0KYGBge3IgZWNobz1GfQ0KDQp0YWJzKEVkdWNhdGlvbl9MZXZlbCkNCg0KYGBgDQoNCiMjIyMgQ2FyZCBDYXRlZ29yeQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCnRhYnMoQ2FyZF9DYXRlZ29yeSkNCg0KYGBgDQoNCg0KIyMgUGVyaWxha3UgVG90YWwgVHJhbnNha3NpIHlhbmcgRGlsYWt1a2FuIG9sZWggUGVsYW5nZ2FuIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpNZWxhbmp1dGthbiwgdGV0YXBpIHNla2FyYW5nIG1lbmdhbmFsaXNpcyB2YXJpYWJlbCBrdWFudGl0YXRpZi4gU2VwZXJ0aSB5YW5nIHRlcmxpaGF0IGRhbGFtIHRlcyBzdGF0aXN0aWsgUGVhcnNvbiwgZGkgbWFuYSB2YXJpYWJlbCAnVG90YWxfVHJhbnNfQ3QnIG1lbWlsaWtpIGtvZWZpc2llbiBrb3JlbGFzaSAtMCwzNzYsICdUb3RhbF9SZXZvbHZpbmdfQmFsJyBkZW5nYW4gLTAsMjQxLCAnQXZnX1V0aWxpemF0aW9uX1JhdGlvJyBkZW5nYW4gMCwyNCBkYW4gJ1RvdGFsX0N0X0NobmdfUTRfUTEnIGRlbmdhbiAtMCwzMTIsIG1lbnVuanVra2FuIGJhaHdhIG1lcmVrYSBzZW11YSBzZWNhcmEgcG9zaXRpZiBtZW1wZW5nYXJ1aGkgcGVsYW5nZ2FuIHRldGFwIHRpbmdnYWwuIFNlc2kgaW5pIHlhbmcgbmFtYW55YSAnUGVyaWxha3UgdG90YWwgdHJhbnNha3NpIHBlbGFuZ2dhbicgYmVydHVqdWFuIHVudHVrIG1lbWFoYW1pIHBlcmlsYWt1IHZhcmlhYmVsIGt1YW50aXRhdGlmIHlhbmcgdGVyY2FudHVtIGRpIGF0YXMgc2VodWJ1bmdhbiBkZW5nYW4gdmFyaWFiZWwgdGFyZ2V0ICdBdHRyaXRpb25fRmxhZycsIHlhbmcgbWVuZ2luZm9ybWFzaWthbiBhcGFrYWggcGVsYW5nZ2FuIHRlbGFoIG1lbmluZ2dhbGthbiBsYXlhbmFuIGthcnR1IGF0YXUgdGlkYWsuDQoNCi0tLQ0KDQoqIFRvdGFsX1RyYW5zX0N0OiBKdW1sYWggdG90YWwgdHJhbnNha3NpICgxMiBidWxhbiB0ZXJha2hpcikNCg0KKiBUb3RhbF9SZXZvbHZpbmdfQmFsOiBUb3RhbCBzYWxkbyBrYXJ0dSBrcmVkaXQgYmVyZ3VsaXINCg0KKiBBdmdfVXRpbGl6YXRpb25fUmF0aW86IEJpYXlhIHBlbmdndW5hYW4ga2FydHUgcmF0YS1yYXRhDQoNCiogVG90YWxfQ3RfQ2huZ19RNF9RMTogUGVydWJhaGFuIGp1bWxhaCB0cmFuc2Frc2kgKFE0IGxlYmloIGRhcmkgUTEpDQoNCi0tLQ0KDQojIyMgVG90YWwgQ3VzdG9tZXIgVHJhbnNhY3Rpb25zDQoNCmBgYHtyIGVjaG89Rn0NCg0KZGFkb3MgJT4lDQogIGRwbHlyOjpzZWxlY3QoVG90YWxfVHJhbnNfQ3QsIEF0dHJpdGlvbl9GbGFnKSAlPiUNCiAgZ3JvdXBfYnkoVG90YWxfVHJhbnNfQ3QsIEF0dHJpdGlvbl9GbGFnKSAlPiUNCiAgY291bnQoVG90YWxfVHJhbnNfQ3QpICU+JQ0KICBhcnJhbmdlKCkgJT4lDQogIGhjaGFydCgnYXJlYXNwbGluZScsIGhjYWVzKHggPSBUb3RhbF9UcmFuc19DdCwgeSA9IG4sIGdyb3VwID0gQXR0cml0aW9uX0ZsYWcpKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJUb3RhbCB0cmFuc2FjdGlvbnMgKGxhc3QgMTIgbW9udGhzKSIsIGFsaWduID0gImNlbnRlciIpICU+JQ0KICBoY195QXhpcyhsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9IiksIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkZyZXF1ZW5jeSIpKSAlPiUgDQogIGhjX3hBeGlzKGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0iKSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiVG90YWwgVHJhbnNhY3Rpb25zIikpICU+JQ0KICBoY19jb2xvcnMoYygiIzhCMDA4QiIsICIjRkY0NTAwIiwgIiNGQzRFMDciKSkgJT4lDQogIGhjX2FkZF90aGVtZShoY190aGVtZV9zbXBsKCkpICU+JSANCiAgaGNfbGVnZW5kKGFsaWduID0gImNlbnRlciIpICU+JQ0KICBoY190b29sdGlwKGZvcm1hdHRlciA9IEpTKCJmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJyA8YnI+IEZyZXF1ZW5jeTogJyArIHRoaXMueSArICcgPGJyPiBUb3RhbCBUcmFuc2FjdGlvbnM6ICcgKyB0aGlzLngpfSIpKQ0KDQpgYGANCg0KIyMjIFRvdGFsIHJldm9sdmluZyBjcmVkaXQgY2FyZCBiYWxhbmNlDQoNCmBgYHtyIGVjaG89Rn0NCg0KZGFkb3MgJT4lDQogIGRwbHlyOjpzZWxlY3QoVG90YWxfUmV2b2x2aW5nX0JhbCwgQXR0cml0aW9uX0ZsYWcpICU+JQ0KICBncm91cF9ieShUb3RhbF9SZXZvbHZpbmdfQmFsLCBBdHRyaXRpb25fRmxhZykgJT4lDQogIGNvdW50KFRvdGFsX1Jldm9sdmluZ19CYWwpICU+JQ0KICBhcnJhbmdlKCkgJT4lDQogIGhjaGFydCgnYXJlYXNwbGluZScsIGhjYWVzKHggPSBUb3RhbF9SZXZvbHZpbmdfQmFsLCB5ID0gbiwgZ3JvdXAgPSBBdHRyaXRpb25fRmxhZykpICU+JQ0KICBoY190aXRsZSh0ZXh0ID0gIlRvdGFsIHJldm9sdmluZyBjcmVkaXQgY2FyZCBiYWxhbmNlIiwgYWxpZ24gPSAiY2VudGVyIikgJT4lDQogIGhjX3lBeGlzKGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0iKSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiRnJlcXVlbmN5IikpICU+JSANCiAgaGNfeEF4aXMobGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlfSIpLCB0aXRsZSA9IGxpc3QodGV4dCA9ICJSZXZvbHZpbmcgYmFsYW5jZSIpKSAlPiUNCiAgaGNfY29sb3JzKGMoIiM4QjAwOEIiLCAiI0ZGNDUwMCIsICIjRkM0RTA3IikpICU+JQ0KICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfc21wbCgpKSAlPiUgDQogIGhjX2xlZ2VuZChhbGlnbiA9ICJjZW50ZXIiKSAlPiUNCiAgaGNfdG9vbHRpcChmb3JtYXR0ZXIgPSBKUygiZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCcgPGJyPiBGcmVxdWVuY3k6ICcgKyB0aGlzLnkgKyAnIDxicj4gUmV2b2x2aW5nIGJhbGFuY2U6ICcgKyB0aGlzLngpfSIpKQ0KDQpgYGANCg0KIyMjIEF2ZXJhZ2UgY2FyZCB1c2FnZSBmZWUNCg0KYGBge3IgZWNobz1GfQ0KDQpkYWRvcyAlPiUNCiAgZHBseXI6OnNlbGVjdChBdmdfVXRpbGl6YXRpb25fUmF0aW8sIEF0dHJpdGlvbl9GbGFnKSAlPiUNCiAgZ3JvdXBfYnkoQXZnX1V0aWxpemF0aW9uX1JhdGlvLCBBdHRyaXRpb25fRmxhZykgJT4lDQogIGNvdW50KEF2Z19VdGlsaXphdGlvbl9SYXRpbykgJT4lDQogIGFycmFuZ2UoKSAlPiUNCiAgaGNoYXJ0KCdhcmVhc3BsaW5lJywgaGNhZXMoeCA9IEF2Z19VdGlsaXphdGlvbl9SYXRpbywgeSA9IG4sIGdyb3VwID0gQXR0cml0aW9uX0ZsYWcpKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICJBdmVyYWdlIGNhcmQgdXNhZ2UgZmVlIiwgYWxpZ24gPSAiY2VudGVyIikgJT4lDQogIGhjX3lBeGlzKGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0iKSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiRnJlcXVlbmN5IikpICU+JSANCiAgaGNfeEF4aXMobGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlfSIpLCB0aXRsZSA9IGxpc3QodGV4dCA9ICJBdmVyYWdlIGNhcmQgdXNhZ2UgZmVlIikpICU+JQ0KICBoY19jb2xvcnMoYygiIzhCMDA4QiIsICIjRkY0NTAwIiwgIiNGQzRFMDciKSkgJT4lDQogIGhjX2FkZF90aGVtZShoY190aGVtZV9zbXBsKCkpICU+JSANCiAgaGNfbGVnZW5kKGFsaWduID0gImNlbnRlciIpICU+JQ0KICBoY190b29sdGlwKGZvcm1hdHRlciA9IEpTKCJmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJyA8YnI+IEZyZXF1ZW5jeTogJyArIHRoaXMueSArICcgPGJyPiBBdmVyYWdlIGNhcmQgdXNhZ2UgZmVlOiAnICsgdGhpcy54KX0iKSkNCg0KYGBgDQoNCiMjIyBUb3RhbF9DdF9DaG5nX1E0X1ExOiBQZXJ1YmFoYW4ganVtbGFoIHRyYW5zYWtzaSAoUTQgbGViaWggZGFyaSBRMSkNCg0KYGBge3IgZWNobz1GfQ0KDQpkYWRvcyAlPiUNCiAgZHBseXI6OnNlbGVjdChUb3RhbF9DdF9DaG5nX1E0X1ExLCBBdHRyaXRpb25fRmxhZykgJT4lDQogIGdyb3VwX2J5KFRvdGFsX0N0X0NobmdfUTRfUTEsIEF0dHJpdGlvbl9GbGFnKSAlPiUNCiAgY291bnQoVG90YWxfQ3RfQ2huZ19RNF9RMSkgJT4lDQogIGFycmFuZ2UoKSAlPiUNCiAgaGNoYXJ0KCdhcmVhc3BsaW5lJywgaGNhZXMoeCA9IFRvdGFsX0N0X0NobmdfUTRfUTEsIHkgPSBuLCBncm91cCA9IEF0dHJpdGlvbl9GbGFnKSkgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiQ2hhbmdlIGluIHRyYW5zYWN0aW9uIGNvdW50IChRNCBvdmVyIFExKSIsIGFsaWduID0gImNlbnRlciIpICU+JQ0KICBoY195QXhpcyhsYWJlbHMgPSBsaXN0KGZvcm1hdCA9ICJ7dmFsdWV9IiksIHRpdGxlID0gbGlzdCh0ZXh0ID0gIkZyZXF1ZW5jeSIpKSAlPiUgDQogIGhjX3hBeGlzKGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0iKSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiQ2hhbmdlIGluIHRyYW5zYWN0aW9uIGNvdW50IChRNCBvdmVyIFExKSIpKSAlPiUNCiAgaGNfY29sb3JzKGMoIiM4QjAwOEIiLCAiI0ZGNDUwMCIsICIjRkM0RTA3IikpICU+JQ0KICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfc21wbCgpKSAlPiUgDQogIGhjX2xlZ2VuZChhbGlnbiA9ICJjZW50ZXIiKSAlPiUNCiAgaGNfdG9vbHRpcChmb3JtYXR0ZXIgPSBKUygiZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCcgPGJyPiBGcmVxdWVuY3k6ICcgKyB0aGlzLnkgKyAnIDxicj4gQ2hhbmdlIGluIHRyYW5zYWN0aW9uIGNvdW50IChRNCBvdmVyIFExKTogJyArIHRoaXMueCl9IikpDQoNCmBgYA0KDQojIyBBbmFsaXNpcyBUcmFuc2Frc2kgUGVsYW5nZ2FuDQoNClZhcmlhYmVsIFRvdGFsX1RyYW5zX0N0LCB5YW5nIG1ld2FraWxpIGp1bWxhaCB0b3RhbCB0cmFuc2Frc2kgZGFsYW0gMTIgYnVsYW4gdGVyYWtoaXIsIG1lbnVuanVra2FuIHBlcmlsYWt1IHlhbmcgbWVuYXJpayBrZXRpa2EgZGlhbWF0aSBkaXN0cmlidXNpbnlhIGRhbGFtIGthaXRhbm55YSBkZW5nYW4gcGVsYW5nZ2FuIHlhbmcgcGVyZ2kgZGFuIG1lcmVrYSB5YW5nIHRpZGFrIG1lbmluZ2dhbGthbiBsYXlhbmFuIGthcnR1IGtyZWRpdC4gVW50dWsgbWVuZGFwYXRrYW4gaW5mb3JtYXNpIGxlYmloIGxhbmp1dCB0ZW50YW5nIHZhcmlhYmVsIGluaSBkYW4gYmFnYWltYW5hIGthaXRhbm55YSBkZW5nYW4gYXRyaWJ1dCBsYWluIGRhcmkga3VtcHVsYW4gZGF0YSwgZGFsYW0gc2VzaSBpbmkgc2F5YSBha2FuIG1lbGFrdWthbiBiZWJlcmFwYSBwZW55ZWxpZGlrYW4uDQoNCiMjIyB0b3RhbCB0cmFuc2Frc2kgZGFsYW0gMTIgYnVsYW4gdGVyYWtoaXIgZGFsYW0gaGFsIHBlcnNlbnRhc2UuDQoNCmBgYHtyIGVjaG89Rn0NCg0KaGNib3hwbG90KG91dGxpZXJzID0gVFJVRSwgeCA9IGRhZG9zJFRvdGFsX1RyYW5zX0N0LCB2YXIgPSBkYWRvcyRBdHRyaXRpb25fRmxhZywgbmFtZSA9ICJMZW5ndGgiKSAlPiUNCiAgaGNfdGl0bGUodGV4dCA9ICIiLCBhbGlnbiA9ICJjZW50ZXIiKSAlPiUNCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCAxMiBtb250aHMiKSkgJT4lDQogIGhjX2FkZF90aGVtZShoY190aGVtZV9zbXBsKCkpICU+JSANCiAgaGNfbGVnZW5kKGFsaWduID0gImNlbnRlciIpDQoNCmBgYA0KDQpTYWxhaCBzYXR1IGNhcmEgdW50dWsgbWVuYWZzaXJrYW4gbGFuZ2thaC1sYW5na2FoIHBlbWlzYWhhbiBkYXJpIGJhZ2FuIGJveHBsb3QgZGkgYXRhcyBhZGFsYWg6DQoNCisgPHN0cm9uZz4gNTAlIDwvc3Ryb25nPiBuYXNhYmFoIHlhbmcgbWVuaW5nZ2Fsa2FuIGxheWFuYW4ga2FydHUga3JlZGl0IG1lbWlsaWtpIHNlanVtbGFoIHRyYW5zYWtzaSBkYWxhbSAxMiBidWxhbiB0ZXJha2hpciBrdXJhbmcgZGFyaSBhdGF1IHNhbWEgZGVuZ2FuIDQzLCBtZW5naW5nYXQgYmFod2EganVtbGFoIG1ha3NpbXVtIHRyYW5zYWtzaSBkYWxhbSAxMiBidWxhbiB0ZXJha2hpciBuYXNhYmFoIHlhbmcgbWVuaW5nZ2Fsa2FuIGxheWFuYW4gYWRhbGFoIDcyLiBTZWRhbmdrYW4gbWVkaWFuIG1hc3lhcmFrYXQgeWFuZyB0ZXRhcCBkZW5nYW4gbGF5YW5hbiBrYXJ0dSBhZGFsYWggNzEga2FsaSB0cmFuc2Frc2kuDQoNCisgPHN0cm9uZz4gNzUlIDwvc3Ryb25nPiBwZWxhbmdnYW4geWFuZyBtZW5pbmdnYWxrYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQgbWVtaWxpa2kgc2VqdW1sYWggdHJhbnNha3NpIGRhbGFtIDEyIGJ1bGFuIHRlcmFraGlyIHNhbWEgZGVuZ2FuIGF0YXUga3VyYW5nIGRhcmkgNTEuIEt1YXJ0aWwga2V0aWdhIG9yYW5nIHlhbmcgdGV0YXAgZGVuZ2FuIGxheWFuYW4ga2FydHUgYWRhbGFoIDgyIHRyYW5zYWtzaS4NCg0KIyMjIEp1bWxhaCB0cmFuc2Frc2kgZGFsYW0gKDEyIGJ1bGFuIHRlcmFraGlyKSB2cyBUb3RhbCBuaWxhaSB0cmFuc2Frc2kgKDEyIGJ1bGFuIHRlcmFraGlyKQ0KDQoNCmBgYHtyIGVjaG89Rn0NCg0KIyBNZW1pc2Foa2FuIGRhdGENCnNldC5zZWVkKDMzMykNCmludHJhaW4gICAgICA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRhZG9zJEF0dHJpdGlvbl9GbGFnLCBwID0gMC43LCBsaXN0ID0gRikNCmltYmFsX3RyYWluICA8LSBkYWRvc1tpbnRyYWluLCBdDQoNCmhjIDwtIGltYmFsX3RyYWluICU+JSANCiAgICAgICAgaGNoYXJ0KCdzY2F0dGVyJywgaGNhZXMoeCA9IFRvdGFsX1RyYW5zX0N0LCB5ID0gVG90YWxfVHJhbnNfQW10LCBncm91cCA9IEF0dHJpdGlvbl9GbGFnKSkgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0ZDNEUwNyIpKSAlPiUNCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX3NtcGwoKSkgJT4lIA0KICBoY19sZWdlbmQoYWxpZ24gPSAiY2VudGVyIikgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiVG90YWxfVHJhbnNfQ3QgdnMgVG90YWxfVHJhbnNfQW10IiwgYWxpZ24gPSAiY2VudGVyIiklPiUNCiAgaGNfdG9vbHRpcChmb3JtYXR0ZXIgPSBKUygiZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCcgPGJyPiBUb3RhbCB0cmFuc2FjdGlvbiB2YWx1ZSAobGFzdCAxMiBtb250aHMpOiAnICsgdGhpcy55ICsgJyA8YnI+IFRvdGFsIHRyYW5zYWN0aW9uIGNvdW50IChsYXN0IDEyIG1vbnRocyk6ICcgKyB0aGlzLngpfSIpKQ0KDQpoYw0KDQpgYGANCg0KLS0tDQoNCiMjIEFuYWxpc2lzIEJlcnNhbWEgQXRyaWJ1dCBLdWFsaXRhdGlmIEtsaWVuIG1hc2luZy1tYXNpbmcgS2Vsb21wb2sNCg0KQW5hbGlzaXMgaW5pIGJlcnR1anVhbiB1bnR1ayBtZW5nZ2FtYmFya2FuLCBtZWxhbHVpIGJhZ2FuIGtvbG9tLCBzZW11YSBrYXJha3RlcmlzdGlrIGt1YWxpdGF0aWYgbmFzYWJhaCB5YW5nIHRlbGFoIG1lbmluZ2dhbGthbiBsYXlhbmFuIGthcnR1IGtyZWRpdCBhdGF1IHRpZGFrLiBTZXRpYXAga29sb20gYXRhdSBwZXJzZWdpIHBhbmphbmcgZ3JhZmlrIG1ld2FraWxpIHBlcnNlbnRhc2UgcmVsYXRpZiBkYXJpIGthcmFrdGVyaXN0aWsgeWFuZyBkaWJlcmlrYW4gZGFsYW0ga2Vsb21wb2sgKFBlbGFuZ2dhbiB5YW5nIEFkYSBhdGF1IFBlbGFuZ2dhbiBZYW5nIFRlcmlzaSkuDQoNCkplbmlzIGdyYWZpayBpbmkgZGFwYXQgZGlndW5ha2FuIHVudHVrIG1lbWZpbHRlciBqZW5pcyBpbmZvcm1hc2kgYmVyaWt1dDogIkRhcmkga2Vsb21wb2sgcGVsYW5nZ2FuIHlhbmcgbWVuaW5nZ2Fsa2FuIGxheWFuYW4ga2FydHUga3JlZGl0LCA8c3Ryb25nPiA0MSwwNiUgPC9zdHJvbmc+IGxhamFuZywgc2VkYW5na2FuIGRhcmkga2Vsb21wb2sgb3JhbmcgeWFuZyB0aW5nZ2FsIGRlbmdhbiBrYXJ0dSBrcmVkaXQsIGhhbnlhIDxzdHJvbmc+IDM4LDUzJSA8L3N0cm9uZz4geWFuZyBsYWphbmciLg0KDQoNCmBgYHtyIGVjaG89Rn0NCg0KIyBGdW5nc2kgdW50dWsgbWVuZGFwYXRrYW4gZnJla3VlbnNpIHJlbGF0aWYgZGFyaSBzZXRpYXAga2VsYXMgDQphdHJfY2F0ZWdvcmljYWwgPC0gZnVuY3Rpb24oZGYsIGF0ciwgZ3J1cG8pew0KDQogIGRmIDwtIGRhdGEuZnJhbWUocm91bmQocHJvcC50YWJsZSh0YWJsZShkZlthdHJdKSkgKiAxMDAsIDIpKQ0KICBuZXdfZGYgPC0gZGF0YS5mcmFtZShDbGFzcyA9IGRmJFZhcjEsIFBlcmNlbnQgPSBkZiRGcmVxLCBHcnVwbyA9IGdydXBvKQ0KICByZXR1cm4obmV3X2RmKQ0KfQ0KDQojIE1lbmRhcGF0a2FuIG5hbWEgdmFyaWFiZWwga3VhbGl0YXRpZiBkYXJpIGRhdGFzZXQgZGFuIG1lbWJ1YXQgZGF0YWZyYW1lDQpjb2xzIDwtIGNvbG5hbWVzKGRhZG9zWywgc2FwcGx5KGRhZG9zLCBpcy5mYWN0b3IpXSkNCmRmICAgPC0gZGF0YS5mcmFtZShDbGFzcyA9IGNoYXJhY3RlcigpLCBQZXJjZW50ID0gY2hhcmFjdGVyKCksIEdydXBvID0gY2hhcmFjdGVyKCkpDQpkZjEgICA8LSBkYXRhLmZyYW1lKENsYXNzID0gY2hhcmFjdGVyKCksIFBlcmNlbnQgPSBjaGFyYWN0ZXIoKSwgR3J1cG8gPSBjaGFyYWN0ZXIoKSkNCmRmMiAgIDwtIGRhdGEuZnJhbWUoQ2xhc3MgPSBjaGFyYWN0ZXIoKSwgUGVyY2VudCA9IGNoYXJhY3RlcigpLCBHcnVwbyA9IGNoYXJhY3RlcigpKQ0KDQojIE1lbWZpbHRlciBoYW55YSBwZW5nYW1hdGFuIGRhcmkgZ3J1cCBwZWxhbmdnYW4gdGVydGVudHUNCmRmX2F0dHJpdGVkYyA8LSBmaWx0ZXIoZGFkb3MsIEF0dHJpdGlvbl9GbGFnID09ICJBdHRyaXRlZCBDdXN0b21lciIpDQpkZl9leGlzdGluZ2MgPC0gZmlsdGVyKGRhZG9zLCBBdHRyaXRpb25fRmxhZyA9PSAiRXhpc3RpbmcgQ3VzdG9tZXIiKQ0KDQojIEF0dHJpdGVkIEN1c3RvbWVyIChQZWxhbmdnYW4geWFuZyBLZWNld2EpDQpmb3IoY29sdW5hIGluIGNvbHMpew0KICBkZiA8LSByYmluZChkZiwgZGF0YS5mcmFtZShyYmluZChhdHJfY2F0ZWdvcmljYWwoZGZfYXR0cml0ZWRjLCBjb2x1bmEsICJBdHRyaXRlZCBDdXN0b21lciIpKSkpDQogIGRmMSA8LSByYmluZChkZjEsIGRhdGEuZnJhbWUocmJpbmQoYXRyX2NhdGVnb3JpY2FsKGRmX2F0dHJpdGVkYywgY29sdW5hLCAiQXR0cml0ZWQgQ3VzdG9tZXIiKSkpKQ0KfQ0KDQojIEV4aXN0aW5nIEN1c3RvbWVyIChQZWxhbmdnYW4geWFuZyBzdWRhaCBhZGEpDQpmb3IoY29sdW5hIGluIGNvbHMpew0KICBkZiA8LSByYmluZChkZiwgZGF0YS5mcmFtZShyYmluZChhdHJfY2F0ZWdvcmljYWwoZGZfYXR0cml0ZWRjLCBjb2x1bmEsICJBdHRyaXRlZCBDdXN0b21lciIpKSkpDQogIGRmMiA8LSByYmluZChkZjIsIGRhdGEuZnJhbWUocmJpbmQoYXRyX2NhdGVnb3JpY2FsKGRmX2V4aXN0aW5nYywgY29sdW5hLCAiRXhpc3RpbmcgQ3VzdG9tZXIiKSkpKQ0KfQ0KDQpkZjEgPC0gZGYxW2RmMSRDbGFzcyAhPSAiQXR0cml0ZWQgQ3VzdG9tZXIiICYgZGYxJENsYXNzICE9ICJFeGlzdGluZyBDdXN0b21lciIsIF0NCmRmMiA8LSBkZjJbZGYyJENsYXNzICE9ICJBdHRyaXRlZCBDdXN0b21lciIgJiBkZjIkQ2xhc3MgIT0gIkV4aXN0aW5nIEN1c3RvbWVyIiwgXQ0KZGYgIDwtIGRmW2RmJENsYXNzICE9ICJBdHRyaXRlZCBDdXN0b21lciIgJiBkZiRDbGFzcyAhPSAiRXhpc3RpbmcgQ3VzdG9tZXIiLCBdDQoNCmhjIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGRmJENsYXNzKSAlPiUgDQogIGhjX2FkZF9zZXJpZXMobmFtZSA9ICJBdHRyaXRlZCBDdXN0b21lciIsIGRhdGEgPSBkZjEkUGVyY2VudCkgJT4lIA0KICBoY19hZGRfc2VyaWVzKG5hbWUgPSAiRXhpc3RpbmcgQ3VzdG9tZXIiLCBkYXRhID0gZGYyJFBlcmNlbnQpICU+JSANCiAgaGNfY2hhcnQodHlwZSA9ICJjb2x1bW4iLA0KICAgICAgICAgICBvcHRpb25zM2QgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCBiZXRhID0gMTUsIGFscGhhID0gMTUpKSAlPiUNCiAgaGNfY29sb3JzKGMoIiM4QjAwOEIiLCAiI0ZGNDUwMCIsICIjRkM0RTA3IikpICU+JQ0KICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfYmxvb20oKSkgJT4lIA0KICBoY19sZWdlbmQoYWxpZ24gPSAiY2VudGVyIikgJT4lDQogIGhjX3RpdGxlKHRleHQgPSAiRnJla3VlbnNpIFJlbGF0aWYgS2FyYWt0ZXJpc3RpayBLdWFsaXRhdGlmIE1hc2luZy1tYXNpbmcgS2Vsb21wb2sgUGVsYW5nZ2FuIiwNCiAgICBzdHlsZSA9IGxpc3QoZm9udFdlaWdodCA9ICJib2xkIiwgZm9udFNpemUgPSAiMjVweCIpLCBhbGlnbiA9ICJjZW50ZXIiKSAlPiUNCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiJSIpKQ0KDQpoYw0KDQpgYGANCg0KUGFkYSBncmFmaWsgZGkgYXRhcywgZGkgbWFuYSBsdWFzIHNldGlhcCBwZXJzZWdpIHBhbmphbmcgbWV3YWtpbGkgZnJla3VlbnNpIHJlbGF0aWYgZGFyaSBrYXRlZ29yaSB0ZXJ0ZW50dSBtaWxpayB2YXJpYWJlbCBrdWFsaXRhdGlmLiBEYWxhbSBtYXNpbmctbWFzaW5nIGthcmFrdGVyaXN0aWsgeWFuZyBkaXNhamlrYW4gZGFsYW0gc3VtYnUgeCBncmFmaWssIGFkYSBmcmVrdWVuc2kgcmVsYXRpZiBkYXJpIGR1YSBrZWxvbXBvayB5YW5nIGJlcmJlZGEsIHlhaXR1OiAnUGVsYW5nZ2FuIHlhbmcgVGVydGFyaWsnIChwZWxhbmdnYW4geWFuZyBtZW5pbmdnYWxrYW4gbGF5YW5hbiBrYXJ0dSkgZGFuICdQZWxhbmdnYW4geWFuZyBBZGEnIChwZWxhbmdnYW4geWFuZyB0ZXRhcCBkZW5nYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQpLiBNZWxpaGF0IGdyYWZpaywgZGFwYXQgZGlsaWhhdCBiYWh3YSBrZXRpa2EgbWVtYmFuZGluZ2thbiBwZXJzZW50YXNlIGRhcmkgc2V0aWFwIGthdGVnb3JpIGFudGFyYSBrZWxhcyBBdHRyYWN0ZWQgQ2xpZW50IGRhbiBFeGlzdGluZyBDbGllbnQsIHRpZGFrIGFkYSBwZXJpbGFrdSB5YW5nIG1lbnVuanVra2FuIGJhaHdhIGtsaWVuIGRlbmdhbiBrdWFsaXRhcyB0ZXJ0ZW50dSwgc2VwZXJ0aSBqZW5pcyBrZWxhbWluLCBzdGF0dXMgcGVya2F3aW5hbiBhdGF1IGxhdGFyIGJlbGFrYW5nIHBlbmRpZGlrYW4sIGxlYmloIGNlbmRlcnVuZyBwdXR1cyBzZWtvbGFoIGF0YXUgdGluZ2dhbCBkZW5nYW4gbGF5YW5hbiBrYXJ0dSBrcmVkaXQuDQoNClVudHVrIG1lbXBlcmRhbGFtIGFuYWxpc2lzIGthcmFrdGVyaXN0aWsgYXRyaWJ1dCBrdWFsaXRhdGlmIHBlbGFuZ2dhbiBkYW4gbWVuY29iYSBtZW5lbXVrYW4gYmViZXJhcGEgcG9sYSwgc2F5YSBha2FuIG1lbmdlbG9tcG9ra2FuIHNlbXVhIGtla2hhc2FuIHBlbGFuZ2dhbiB5YW5nIG1lbmluZ2dhbGthbiBsYXlhbmFuIGthcnR1IGtyZWRpdCBkYW4gbWVuY2FyaSBkaSBhbnRhcmEgc2VtdWEga29tYmluYXNpIHlhbmcgbXVuZ2tpbiBkYWxhbSBydWFuZyBhdHJpYnV0IGt1YWxpdGF0aWYgZGFyaSBrdW1wdWxhbiBkYXRhLCBqaWthIGFkYSBwcm9maWwgZGVuZ2FuIGt1YWxpdGFzIHRlcnRlbnR1IHlhbmcgbWVub25qb2wgZGkgYW50YXJhIHlhbmcgbGFpbiwgIFlhaXR1IA0KU2F5YSBha2FuIG1lbmNvYmEgbWVuZW11a2FuIHByb2ZpbCBwZWxhbmdnYW4gZGVuZ2FuIGtla2hhc2FuIHRlcnRlbnR1LCB5YW5nIG1lbWlsaWtpIHRpbmdrYXQgcGVuZ2hpbmRhcmFuIHlhbmcgc2FuZ2F0IGphdWggZGFyaSB5YW5nIGxhaW4uDQoNCi0tLQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCmdwIDwtIGRhZG9zICU+JQ0KICAgICAgICBmaWx0ZXIoQXR0cml0aW9uX0ZsYWcgPT0gIkF0dHJpdGVkIEN1c3RvbWVyIikgJT4lDQogICAgICAgIHNlbGVjdChBdHRyaXRpb25fRmxhZywgR2VuZGVyLCBFZHVjYXRpb25fTGV2ZWwsIE1hcml0YWxfU3RhdHVzLCBJbmNvbWVfQ2F0ZWdvcnksIENhcmRfQ2F0ZWdvcnkpICU+JQ0KICAgICAgICBncm91cF9ieShHZW5kZXIsIEVkdWNhdGlvbl9MZXZlbCwgTWFyaXRhbF9TdGF0dXMsIEluY29tZV9DYXRlZ29yeSwgQ2FyZF9DYXRlZ29yeSkgJT4lDQogICAgICAgIGNvdW50KEF0dHJpdGlvbl9GbGFnKSAlPiUNCiAgICAgICAgc2VsZWN0KEdlbmRlciwgRWR1Y2F0aW9uX0xldmVsLCBNYXJpdGFsX1N0YXR1cywgSW5jb21lX0NhdGVnb3J5LCBDYXJkX0NhdGVnb3J5LCBuKSAlPiUNCiAgICAgICAgYXJyYW5nZShkZXNjKG4pKQ0KDQpncCRSZWxhdGl2ZS5GcmVxdWVuY3kgPC0gcm91bmQocHJvcC50YWJsZShncCRuKSAqIDEwMCwgMikNCmdwJG4gPSBOVUxMDQoNCmRhdGF0YWJsZShncCkNCmBgYA0KDQotLS0NCg0KTWVza2lwdW4gcGVybHUgdW50dWsgbWVtcGVydGltYmFuZ2thbiB2YXJpYWJlbCBsYWluIHNlaGluZ2dhIGRpbXVuZ2tpbmthbiB1bnR1ayBtZW1idWF0IHBlcm55YXRhYW4ga29ua3JldCwgZGVuZ2FuIHRhYmVsIGtlbG9tcG9rIGthcmFrdGVyaXN0aWsgZGFuIHBlcnNlbnRhc2UgcmVsYXRpZiBtYXNpbmctbWFzaW5nLCBrYW1pIG1lbWlsaWtpLCBiZXJkYXNhcmthbiBhdHJpYnV0IGt1YWxpdGF0aWYgcGVsYW5nZ2FuLCBkYXJpIDI3NSBrb21iaW5hc2kga2FyYWt0ZXJpc3RpayBhdHJpYnV0IGt1YWxpdGF0aWYgeWFuZyBiZXJiZWRhIDxzdHJvbmc+IDksNzglIDwvc3Ryb25nPiBwcm9maWwgeWFuZyBiZXJ0YW5nZ3VuZyBqYXdhYiB1bnR1ayBtZW5pbmdnYWxrYW4gbGF5YW5hbiBrYXJ0dSBhZGFsYWg6DQoNCisgPHN0cm9uZz4gNCw5MiUgPC9zdHJvbmc+IGFkYWxhaCBwZXJlbXB1YW4sIHRpbmdrYXQgcGVuZGlkaWthbiBzYXJqYW5hLCBzdGF0dXMgcGVya2F3aW5hbiBtZW5pa2FoLCBwZW5kYXBhdGFuIHRhaHVuYW4ga3VyYW5nIGRhcmkgJCA0MEsgZGFuIGplbmlzIGthcnR1IGJpcnUuDQoNCisgPHN0cm9uZz40LDg2JSA8L3N0cm9uZz4gYWRhbGFoIHBlcmVtcHVhbiwgdGluZ2thdCBwZW5kaWRpa2FuIHNhcmphbmEsIHN0YXR1cyBwZXJrYXdpbmFuIHR1bmdnYWwsIHBlbmRhcGF0YW4gdGFodW5hbiBrdXJhbmcgZGFyaSAkIDQwSyBkYW4gamVuaXMga2FydHUgYmlydS4NCg0KVW50dWsgbWVsaWhhdCBwcm9maWwgeWFuZyBjZW5kZXJ1bmcgdGlkYWsgbWVuaW5nZ2Fsa2FuIGxheWFuYW4ga2FydHUsIGN1a3VwIGJ1a2EgY2F0YXRhbiB0ZXJha2hpciBkYWxhbSB0YWJlbCBkaSBhdGFzLg0KDQojIE1lc2luIEZpdHVyDQoNClNlbXVhIGtlcHV0dXNhbiB5YW5nIGRpYnVhdCBkYWxhbSBwcm9zZXMgcmVrYXlhc2Egc3VtYmVyIGRheWEgYWRhbGFoIHlhbmcgbWVudXJ1dCBzYXlhIGFkYWxhaCB5YW5nIHRlcmJhaWsgdW50dWsgbWVueWlhcGthbiBkYXRhIHVudHVrIHByb3NlcyBwZW1iZWxhamFyYW4gbWVzaW4uIFNheWEgYWthbiBtZW5nZ3VuYWthbiB0ZWtuaWsgZGFzYXIsIHNlcGVydGkgcGVsYXJhbmdhbiBkYXRhIHVudHVrIG1lbmd1cmFuZ2kgdGluZ2dpbnlhIGp1bWxhaCBuaWxhaSB1bmlrLCBwZW5na29kZWFuIHNhdHUgcGFuYXMgdW50dWsgdmFyaWFiZWwga3VhbGl0YXRpZiBub21pbmFsIGRhbiBtZW5lcmFwa2FuIHRla25payBvdmVyc2FtcGxpbmcgbWlub3JpdGFzIHNpbnRldGlzIHVudHVrIG1lbnllaW1iYW5na2FuIGtlbGFzIGRhbGFtIGRhdGEgcGVsYXRpaGFuLg0KDQoNCiMjIE1lbmdlbG9tcG9ra2FuIERhdGEga2UgQmlucw0KDQpEYXRhIGJpbm5pbmcgYWRhbGFoIG1ldG9kZSBwcmEtcGVtcm9zZXNhbiBkYXRhIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbWluaW1hbGthbiBlZmVrIGRhcmkga2VzYWxhaGFuIHBlbmdhbWF0YW4ga2VjaWwuIE5pbGFpIGRhdGEgYXNsaSBkaWJhZ2kgbWVuamFkaSBpbnRlcnZhbCBrZWNpbCB5YW5nIGRpa2VuYWwgc2ViYWdhaSB0ZW1wYXQgc2FtcGFoIGRhbiBrZW11ZGlhbiBkaWdhbnRpa2FuIG9sZWggbmlsYWkgeWFuZyBkaWhpdHVuZyBzZWNhcmEga2VzZWx1cnVoYW4gdW50dWsgdGVtcGF0IHNhbXBhaCBpdHUuIEluaSBtZW1pbGlraSBlZmVrIHNtb290aGluZyBwYWRhIGRhdGEgaW5wdXQgZGFuIGp1Z2EgZGFwYXQgbWVuZ3VyYW5naSBrZW11bmdraW5hbiBvdmVyZml0dGluZyB1bnR1ayBzZXQgZGF0YSBrZWNpbC4NCg0KQWRhIDIgbWV0b2RlIG1lbWJhZ2kgZGF0YSBrZSBkYWxhbSBrb3Rhaw0KDQorIDEgQmlubmluZyBmcmVrdWVuc2kgeWFuZyBzYW1hOiB0ZW1wYXQgc2FtcGFoIG1lbWlsaWtpIGZyZWt1ZW5zaSB5YW5nIHNhbWEuDQoNCisgMiBCaW5uaW5nIGRlbmdhbiBsZWJhciB5YW5nIHNhbWE6IHRlbXBhdCBzYW1wYWggbWVtaWxpa2kgbGViYXIgeWFuZyBzYW1hIGRlbmdhbiBpbnRlcnZhbCBzZXRpYXAgdGVtcGF0IHNhbXBhaCBkaWRlZmluaXNpa2FuIHNlYmFnYWkgW21pbiArIHddLCBbbWluICsgMnddLi4uLiBbbWluICsgbnddIGRpIG1hbmEgdyA9IChtYWtzIC0gbWluKSAvIChqdW1sYWgga290YWspLg0KDQpVbnR1ayBtZW5lbnR1a2FuIGp1bWxhaCB0ZW1wYXQgc2FtcGFoLCBzYXlhIGFrYW4gbWVuZ2d1bmFrYW4gYXR1cmFuIFN0dXJnZXMgeWFuZyBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZW1idWF0IGtlbGFzIGFtcGxpdHVkbyB0ZXRhcCBkYXJpIHBlcnNhbWFhbiBiZXJpa3V0Og0KDQoNCi0tLQ0KDQpTdHVyZ2VzIFJ1bGUNCg0KJGsgPSAxICsgXGZyYWN7MTB9ezN9bG9nX3sxMH1uJA0KDQotLS0NCg0KYGBge3J9DQoNCiMgTWVtYnVhdCBzYWxpbmFuIGt1bXB1bGFuIGRhdGENCg0KZGF0YSA8LSBkYWRvcw0KDQojIE1lbmVyYXBrYW4gYXR1cmFuIHN0dXJnZXMgdW50dWsgbWVuZGFwYXRrYW4ganVtbGFoIGludGVydmFsDQoNCm4gPC0gbnJvdyhkYXRhKQ0KayA8LSByb3VuZCgoMSArICgxMCAvIDMpICogbG9nMTAobikpKSAjIDE0IEdydXBvcw0KDQojIE1lbWJ1YXQga29sb20gYmFydSBkZW5nYW4gbmlsYWkgeWFuZyBkaWtlbG9tcG9ra2FuDQoNCmNvbHMgICAgIDwtIGNvbG5hbWVzKGRhdGFbLCBzYXBwbHkoZGF0YSwgaXMubnVtZXJpYyldKQ0KbmV3X2NvbHMgPC0gdW5saXN0KGxhcHBseShjb2xzLCBmdW5jdGlvbih4KSBwYXN0ZSh4LCAiX2YiLCBzZXAgPSAiIikpKQ0KDQojIE1lbWJ1YXQgZ3J1cCBkZW5nYW4gZnVuZ3NpIGRhdGFfYmlubmluZw0KDQpkYXRhX2Jpbm5pbmcgPC0gZnVuY3Rpb24oeCwgayl7DQogIA0KICBncCA8LSBjdXQoeCwgYnJlYWtzID0gaywgaW5jbHVkZS5sb3dlc3QgPSBULCBvcmRlcmVkX3Jlc3VsdCA9IFQpDQogIHJldHVybihncCkNCn0NCmRhdGFbLCBuZXdfY29sc10gPC0gTWFwKGZ1bmN0aW9uKHgsIGspIGFzLmZhY3RvcihkYXRhX2Jpbm5pbmcoZGF0YVssIHhdLCBrKSksIGNvbHMsIGspDQoNCmBgYA0KDQotLS0NCg0KIyMjIEkgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMgVG90YWxfVHJhbnNfQ3QNCg0KYGBge3IgZWNobz1GfQ0KDQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkVG90YWxfVHJhbnNfQ3QsIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdUb3RhbF9UcmFuc19DdCcpICU+JQ0KICAgICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICAgIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIiIpKQ0KDQoNCmgyIDwtIGRhdGEgJT4lDQogICAgICAgIHNlbGVjdChUb3RhbF9UcmFuc19DdF9mKSAlPiUNCiAgICAgICAgZ3JvdXBfYnkoVG90YWxfVHJhbnNfQ3RfZikgJT4lDQogICAgICAgIGNvdW50KCkgDQoNCmgyIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgICAgICAgaGNfY2hhcnQodHlwZSA9ImNvbHVtbiIsIG9wdGlvbnMzZCA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGJldGEgPSAxNSwgYWxwaGEgPSAxNSkpICU+JQ0KICAgICAgICBoY194QXhpcyhjYXRlZ29yaWVzID0gaDIkVG90YWxfVHJhbnNfQ3RfZikgJT4lIA0KICAgICAgICBoY19hZGRfc2VyaWVzKGRhdGEgPSBoMiRuLCBuYW1lID0gIlRvdGFsX1RyYW5zX0N0X2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KIyMjIyBBdmdfVXRpbGl6YXRpb25fUmF0aW8NCg0KYGBge3IgZWNobz1GfQ0KDQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkQXZnX1V0aWxpemF0aW9uX1JhdGlvLCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnQXZnX1V0aWxpemF0aW9uX1JhdGlvJykgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUNCiAgICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpDQoNCmgyIDwtIGRhdGEgJT4lDQogICAgICAgIHNlbGVjdChBdmdfVXRpbGl6YXRpb25fUmF0aW9fZikgJT4lDQogICAgICAgIGdyb3VwX2J5KEF2Z19VdGlsaXphdGlvbl9SYXRpb19mKSAlPiUNCiAgICAgICAgY291bnQoKQ0KDQpoMiA8LSBoaWdoY2hhcnQoKSAlPiUgDQogICAgICAgIGhjX2NoYXJ0KHR5cGUgPSJjb2x1bW4iLCBvcHRpb25zM2QgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCBiZXRhID0gMTUsIGFscGhhID0gMTUpKSAlPiUNCiAgICAgICAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGgyJEF2Z19VdGlsaXphdGlvbl9SYXRpb19mKSAlPiUgDQogICAgICAgIGhjX2FkZF9zZXJpZXMoZGF0YSA9IGgyJG4sIG5hbWUgPSAiQXZnX1V0aWxpemF0aW9uX1JhdGlvX2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KIyMjIyBUb3RhbF9DdF9DaG5nX1E0X1ExDQoNCmBgYHtyIGVjaG89Rn0NCg0KDQpoMSA8LSBoY2hhcnQoaGlzdChkYXRhJFRvdGFsX0N0X0NobmdfUTRfUTEsIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdUb3RhbF9DdF9DaG5nX1E0X1ExJykgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUNCiAgICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpDQoNCg0KaDIgPC0gZGF0YSAlPiUNCiAgICAgICAgc2VsZWN0KFRvdGFsX0N0X0NobmdfUTRfUTFfZikgJT4lDQogICAgICAgIGdyb3VwX2J5KFRvdGFsX0N0X0NobmdfUTRfUTFfZikgJT4lDQogICAgICAgIGNvdW50KCkNCg0KaDIgPC0gaGlnaGNoYXJ0KCkgJT4lIA0KICAgICAgICBoY19jaGFydCh0eXBlID0iY29sdW1uIiwgb3B0aW9uczNkID0gbGlzdChlbmFibGVkID0gVFJVRSwgYmV0YSA9IDE1LCBhbHBoYSA9IDE1KSkgJT4lDQogICAgICAgIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBoMiRUb3RhbF9DdF9DaG5nX1E0X1ExX2YpICU+JSANCiAgICAgICAgaGNfYWRkX3NlcmllcyhkYXRhID0gaDIkbiwgbmFtZSA9ICJUb3RhbF9DdF9DaG5nX1E0X1ExX2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KIyMjIyBUb3RhbF9UcmFuc19BbXQNCg0KYGBge3IgZWNobz1GfQ0KDQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkVG90YWxfVHJhbnNfQW10LCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnVG90YWxfVHJhbnNfQW10JykgJT4lDQogICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoVG90YWxfVHJhbnNfQW10X2YpICU+JQ0KICAgICAgICBncm91cF9ieShUb3RhbF9UcmFuc19BbXRfZikgJT4lDQogICAgICAgIGNvdW50KCkgDQoNCmgyIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgICAgICAgaGNfY2hhcnQodHlwZSA9ImNvbHVtbiIsIG9wdGlvbnMzZCA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGJldGEgPSAxNSwgYWxwaGEgPSAxNSkpICU+JQ0KICAgICAgICBoY194QXhpcyhjYXRlZ29yaWVzID0gaDIkVG90YWxfVHJhbnNfQW10X2YpICU+JSANCiAgICAgICAgaGNfYWRkX3NlcmllcyhkYXRhID0gaDIkbiwgbmFtZSA9ICJUb3RhbF9UcmFuc19BbXRfZiIpICU+JQ0KICAgICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkNCg0KDQpod19ncmlkKGgxLCBoMiwgbmNvbCA9IDIpDQoNCmBgYA0KDQoNCiMjIyBJSSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyBUb3RhbF9BbXRfQ2huZ19RNF9RMQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCg0KaDEgPC0gaGNoYXJ0KGhpc3QoZGF0YSRUb3RhbF9BbXRfQ2huZ19RNF9RMSwgYnJlYWtzID0gMzAsIHBsb3QgPSBGKSwgDQogICAgICAgICAgICAgdHlwZSA9ICdoaXN0b2dyYW0nLCBuYW1lID0gJ1RvdGFsX0FtdF9DaG5nX1E0X1ExJykgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUNCiAgICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpDQoNCg0KaDIgPC0gZGF0YSAlPiUNCiAgICAgICAgc2VsZWN0KFRvdGFsX0FtdF9DaG5nX1E0X1ExX2YpICU+JQ0KICAgICAgICBncm91cF9ieShUb3RhbF9BbXRfQ2huZ19RNF9RMV9mKSAlPiUNCiAgICAgICAgY291bnQoKQ0KDQpoMiA8LSBoaWdoY2hhcnQoKSAlPiUgDQogICAgICAgIGhjX2NoYXJ0KHR5cGUgPSJjb2x1bW4iLCBvcHRpb25zM2QgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCBiZXRhID0gMTUsIGFscGhhID0gMTUpKSAlPiUNCiAgICAgICAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGgyJFRvdGFsX0FtdF9DaG5nX1E0X1ExX2YpICU+JSANCiAgICAgICAgaGNfYWRkX3NlcmllcyhkYXRhID0gaDIkbiwgbmFtZSA9ICJUb3RhbF9BbXRfQ2huZ19RNF9RMV9mIikgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKQ0KDQoNCmh3X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCg0KYGBgDQoNCiMjIyMgQXZnX09wZW5fVG9fQnV5DQoNCmBgYHtyIGVjaG89Rn0NCg0KDQpoMSA8LSBoY2hhcnQoaGlzdChkYXRhJEF2Z19PcGVuX1RvX0J1eSwgYnJlYWtzID0gMzAsIHBsb3QgPSBGKSwgDQogICAgICAgICAgICAgdHlwZSA9ICdoaXN0b2dyYW0nLCBuYW1lID0gJ0F2Z19PcGVuX1RvX0J1eScpICU+JQ0KICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpICU+JQ0KICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpDQoNCg0KaDIgPC0gZGF0YSAlPiUNCiAgICAgICAgc2VsZWN0KEF2Z19PcGVuX1RvX0J1eV9mKSAlPiUNCiAgICAgICAgZ3JvdXBfYnkoQXZnX09wZW5fVG9fQnV5X2YpICU+JQ0KICAgICAgICBjb3VudCgpIA0KDQpoMiA8LSBoaWdoY2hhcnQoKSAlPiUgDQogICAgICAgIGhjX2NoYXJ0KHR5cGUgPSJjb2x1bW4iLCBvcHRpb25zM2QgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCBiZXRhID0gMTUsIGFscGhhID0gMTUpKSAlPiUNCiAgICAgICAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGgyJEF2Z19PcGVuX1RvX0J1eV9mKSAlPiUgDQogICAgICAgIGhjX2FkZF9zZXJpZXMoZGF0YSA9IGgyJG4sIG5hbWUgPSAiQXZnX09wZW5fVG9fQnV5X2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KIyMjIyBUb3RhbF9SZXZvbHZpbmdfQmFsDQoNCmBgYHtyIGVjaG89Rn0NCg0KDQpoMSA8LSBoY2hhcnQoaGlzdChkYXRhJFRvdGFsX1Jldm9sdmluZ19CYWwsIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdUb3RhbF9SZXZvbHZpbmdfQmFsJykgJT4lDQogICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoVG90YWxfUmV2b2x2aW5nX0JhbF9mKSAlPiUNCiAgICAgICAgZ3JvdXBfYnkoVG90YWxfUmV2b2x2aW5nX0JhbF9mKSAlPiUNCiAgICAgICAgY291bnQoKSANCg0KaDIgPC0gaGlnaGNoYXJ0KCkgJT4lIA0KICAgICAgICBoY19jaGFydCh0eXBlID0iY29sdW1uIiwgb3B0aW9uczNkID0gbGlzdChlbmFibGVkID0gVFJVRSwgYmV0YSA9IDE1LCBhbHBoYSA9IDE1KSkgJT4lDQogICAgICAgIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBoMiRUb3RhbF9SZXZvbHZpbmdfQmFsX2YpICU+JSANCiAgICAgICAgaGNfYWRkX3NlcmllcyhkYXRhID0gaDIkbiwgbmFtZSA9ICJUb3RhbF9SZXZvbHZpbmdfQmFsX2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KDQojIyMjIENyZWRpdF9MaW1pdA0KDQpgYGB7ciBlY2hvPUZ9DQoNCg0KaDEgPC0gaGNoYXJ0KGhpc3QoZGF0YSRDcmVkaXRfTGltaXQsIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdDcmVkaXRfTGltaXQnKSAlPiUNCiAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUNCiAgICAgIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIiIpKQ0KDQoNCmgyIDwtIGRhdGEgJT4lDQogICAgICAgIHNlbGVjdChDcmVkaXRfTGltaXRfZikgJT4lDQogICAgICAgIGdyb3VwX2J5KENyZWRpdF9MaW1pdF9mKSAlPiUNCiAgICAgICAgY291bnQoKSANCg0KaDIgPC0gaGlnaGNoYXJ0KCkgJT4lIA0KICAgICAgICBoY19jaGFydCh0eXBlID0iY29sdW1uIiwgb3B0aW9uczNkID0gbGlzdChlbmFibGVkID0gVFJVRSwgYmV0YSA9IDE1LCBhbHBoYSA9IDE1KSkgJT4lDQogICAgICAgIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBoMiRDcmVkaXRfTGltaXRfZikgJT4lIA0KICAgICAgICBoY19hZGRfc2VyaWVzKGRhdGEgPSBoMiRuLCBuYW1lID0gIkNyZWRpdF9MaW1pdF9mIikgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKQ0KDQoNCmh3X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCg0KYGBgDQoNCg0KIyMjIElJSSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyBDb250YWN0c19Db3VudF8xMl9tb24NCg0KYGBge3IgZWNobz1GfQ0KDQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkQ29udGFjdHNfQ291bnRfMTJfbW9uLCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnQ29udGFjdHNfQ291bnRfMTJfbW9uJykgJT4lDQogICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoQ29udGFjdHNfQ291bnRfMTJfbW9uX2YpICU+JQ0KICAgICAgICBncm91cF9ieShDb250YWN0c19Db3VudF8xMl9tb25fZikgJT4lDQogICAgICAgIGNvdW50KCkNCg0KaDIgPC0gaGlnaGNoYXJ0KCkgJT4lIA0KICAgICAgICBoY19jaGFydCh0eXBlID0iY29sdW1uIiwgb3B0aW9uczNkID0gbGlzdChlbmFibGVkID0gVFJVRSwgYmV0YSA9IDE1LCBhbHBoYSA9IDE1KSkgJT4lDQogICAgICAgIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBoMiRDb250YWN0c19Db3VudF8xMl9tb25fZikgJT4lIA0KICAgICAgICBoY19hZGRfc2VyaWVzKGRhdGEgPSBoMiRuLCBuYW1lID0gIkNvbnRhY3RzX0NvdW50XzEyX21vbl9mIikgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKQ0KDQoNCmh3X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCg0KYGBgDQoNCiMjIyMgTW9udGhzX0luYWN0aXZlXzEyX21vbg0KDQpgYGB7ciBlY2hvPUZ9DQoNCg0KaDEgPC0gaGNoYXJ0KGhpc3QoZGF0YSRNb250aHNfSW5hY3RpdmVfMTJfbW9uLCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnTW9udGhzX0luYWN0aXZlXzEyX21vbicpICU+JQ0KICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpICU+JQ0KICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpDQoNCg0KaDIgPC0gZGF0YSAlPiUNCiAgICAgICAgc2VsZWN0KE1vbnRoc19JbmFjdGl2ZV8xMl9tb25fZikgJT4lDQogICAgICAgIGdyb3VwX2J5KE1vbnRoc19JbmFjdGl2ZV8xMl9tb25fZikgJT4lDQogICAgICAgIGNvdW50KCkgDQoNCmgyIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgICAgICAgaGNfY2hhcnQodHlwZSA9ImNvbHVtbiIsIG9wdGlvbnMzZCA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGJldGEgPSAxNSwgYWxwaGEgPSAxNSkpICU+JQ0KICAgICAgICBoY194QXhpcyhjYXRlZ29yaWVzID0gaDIkTW9udGhzX0luYWN0aXZlXzEyX21vbl9mKSAlPiUgDQogICAgICAgIGhjX2FkZF9zZXJpZXMoZGF0YSA9IGgyJG4sIG5hbWUgPSAiTW9udGhzX0luYWN0aXZlXzEyX21vbl9mIikgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKQ0KDQoNCmh3X2dyaWQoaDEsIGgyLCBuY29sID0gMikNCg0KYGBgDQoNCg0KDQojIyMjIFRvdGFsX1JlbGF0aW9uc2hpcF9Db3VudA0KDQpgYGB7ciBlY2hvPUZ9DQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkVG90YWxfUmVsYXRpb25zaGlwX0NvdW50LCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnVG90YWxfUmVsYXRpb25zaGlwX0NvdW50JykgJT4lDQogICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoVG90YWxfUmVsYXRpb25zaGlwX0NvdW50X2YpICU+JQ0KICAgICAgICBncm91cF9ieShUb3RhbF9SZWxhdGlvbnNoaXBfQ291bnRfZikgJT4lDQogICAgICAgIGNvdW50KCkNCg0KaDIgPC0gaGlnaGNoYXJ0KCkgJT4lIA0KICAgICAgICBoY19jaGFydCh0eXBlID0iY29sdW1uIiwgb3B0aW9uczNkID0gbGlzdChlbmFibGVkID0gVFJVRSwgYmV0YSA9IDE1LCBhbHBoYSA9IDE1KSkgJT4lDQogICAgICAgIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBoMiRUb3RhbF9SZWxhdGlvbnNoaXBfQ291bnRfZikgJT4lIA0KICAgICAgICBoY19hZGRfc2VyaWVzKGRhdGEgPSBoMiRuLCBuYW1lID0gIlRvdGFsX1JlbGF0aW9uc2hpcF9Db3VudF9mIikgJT4lDQogICAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUgDQogICAgICAgIGhjX2FkZF90aGVtZShoY190aGVtZV9zbXBsKCkpDQoNCg0KaHdfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KDQojIyMgSVYgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMgTW9udGhzX29uX2Jvb2sNCg0KYGBge3IgZWNobz1GfQ0KDQoNCmgxIDwtIGhjaGFydChoaXN0KGRhdGEkTW9udGhzX29uX2Jvb2ssIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdNb250aHNfb25fYm9vaycpICU+JQ0KICAgICAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiIikpICU+JQ0KICAgICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoTW9udGhzX29uX2Jvb2tfZikgJT4lDQogICAgICAgIGdyb3VwX2J5KE1vbnRoc19vbl9ib29rX2YpICU+JQ0KICAgICAgICBjb3VudCgpDQoNCmgyIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgICAgICAgaGNfY2hhcnQodHlwZSA9ImNvbHVtbiIsIG9wdGlvbnMzZCA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGJldGEgPSAxNSwgYWxwaGEgPSAxNSkpICU+JQ0KICAgICAgICBoY194QXhpcyhjYXRlZ29yaWVzID0gaDIkTW9udGhzX29uX2Jvb2tfZikgJT4lIA0KICAgICAgICBoY19hZGRfc2VyaWVzKGRhdGEgPSBoMiRuLCBuYW1lID0gIk1vbnRoc19vbl9ib29rX2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpICU+JSANCiAgICAgICAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX3NtcGwoKSkNCg0KDQpod19ncmlkKGgxLCBoMiwgbmNvbCA9IDIpDQoNCmBgYA0KDQojIyMjIERlcGVuZGVudF9jb3VudA0KDQpgYGB7ciBlY2hvPUZ9DQoNCg0KaDEgPC0gaGNoYXJ0KGhpc3QoZGF0YSREZXBlbmRlbnRfY291bnQsIGJyZWFrcyA9IDMwLCBwbG90ID0gRiksIA0KICAgICAgICAgICAgIHR5cGUgPSAnaGlzdG9ncmFtJywgbmFtZSA9ICdEZXBlbmRlbnRfY291bnQnKSAlPiUNCiAgICAgIGhjX2NvbG9ycyhjKCIjRkY0NTAwIiwgIiNGRkQ3MDAiLCAiIzAwODA4MCIsICIjMDA2NDAwIiwgIiMxQzFDMUMiLCAiI0I4ODYwQiIpKSAlPiUNCiAgICAgIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIiIpKQ0KDQoNCmgyIDwtIGRhdGEgJT4lDQogICAgICAgIHNlbGVjdChEZXBlbmRlbnRfY291bnRfZikgJT4lDQogICAgICAgIGdyb3VwX2J5KERlcGVuZGVudF9jb3VudF9mKSAlPiUNCiAgICAgICAgY291bnQoKQ0KDQpoMiA8LSBoaWdoY2hhcnQoKSAlPiUgDQogICAgICAgIGhjX2NoYXJ0KHR5cGUgPSJjb2x1bW4iLCBvcHRpb25zM2QgPSBsaXN0KGVuYWJsZWQgPSBUUlVFLCBiZXRhID0gMTUsIGFscGhhID0gMTUpKSAlPiUNCiAgICAgICAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGgyJERlcGVuZGVudF9jb3VudF9mKSAlPiUgDQogICAgICAgIGhjX2FkZF9zZXJpZXMoZGF0YSA9IGgyJG4sIG5hbWUgPSAiRGVwZW5kZW50X2NvdW50X2YiKSAlPiUNCiAgICAgICAgaGNfY29sb3JzKGMoIiNGRjQ1MDAiLCAiI0ZGRDcwMCIsICIjMDA4MDgwIiwgIiMwMDY0MDAiLCAiIzFDMUMxQyIsICIjQjg4NjBCIikpICU+JSANCiAgICAgICAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX3NtcGwoKSkNCg0KDQpod19ncmlkKGgxLCBoMiwgbmNvbCA9IDIpDQoNCmBgYA0KDQojIyMjIEN1c3RvbWVyX0FnZQ0KDQpgYGB7ciBlY2hvPUZ9DQoNCg0KaDEgPC0gaGNoYXJ0KGhpc3QoZGFkb3MkQ3VzdG9tZXJfQWdlLCBicmVha3MgPSAzMCwgcGxvdCA9IEYpLCANCiAgICAgICAgICAgICB0eXBlID0gJ2hpc3RvZ3JhbScsIG5hbWUgPSAnQ3VzdG9tZXJfQWdlJykgJT4lDQogICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkgJT4lDQogICAgICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICIiKSkNCg0KDQpoMiA8LSBkYXRhICU+JQ0KICAgICAgICBzZWxlY3QoQ3VzdG9tZXJfQWdlX2YpICU+JQ0KICAgICAgICBncm91cF9ieShDdXN0b21lcl9BZ2VfZikgJT4lDQogICAgICAgIGNvdW50KCkgDQoNCmgyIDwtIGhpZ2hjaGFydCgpICU+JSANCiAgICAgICAgaGNfY2hhcnQodHlwZSA9ImNvbHVtbiIsIG9wdGlvbnMzZCA9IGxpc3QoZW5hYmxlZCA9IFRSVUUsIGJldGEgPSAxNSwgYWxwaGEgPSAxNSkpICU+JQ0KICAgICAgICBoY194QXhpcyhjYXRlZ29yaWVzID0gaDIkQ3VzdG9tZXJfQWdlX2YpICU+JSANCiAgICAgICAgaGNfYWRkX3NlcmllcyhkYXRhID0gaDIkbiwgbmFtZSA9ICJDdXN0b21lcl9BZ2VfZiIpICU+JQ0KICAgICAgICBoY19jb2xvcnMoYygiI0ZGNDUwMCIsICIjRkZENzAwIiwgIiMwMDgwODAiLCAiIzAwNjQwMCIsICIjMUMxQzFDIiwgIiNCODg2MEIiKSkNCg0KDQpod19ncmlkKGgxLCBoMiwgbmNvbCA9IDIpDQoNCmBgYA0KDQoNCg0KDQoNCmBgYA0KDQoNCiMgUmVmZXJlbmNlcw0KDQpodHRwczovL3d3dy5nZWVrc2ZvcmdlZWtzLm9yZy9iaW5uaW5nLWluLWRhdGEtbWluaW5nLw0KDQpodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9tYWNoaW5lLWxlYXJuaW5nL3N0dWRpby1tb2R1bGUtcmVmZXJlbmNlL3Ntb3RlDQoNCg0K