DESKRIPSI

Segemtasi Pelanggan adalah praktik membagi basis pelanggan menjadi kelompok individu yang serupa dengan cara tertentu yang relevan dengan startegi pemasaran, seperti usia, jenis kelamin, minat, kebiasaan belanja dan lain-lain.
Perusahaan yang menggunakan Segmentasi Pelanggan beroperasi dibawah fakta bahwa setiap pelanggan berbeda dan bahwa upaya pemasaran barang atau jasa, mereka akan lebih baik dilayani. jika perusahaan menargetkan pelanggan tertentu yang lebih kecil dengan pesanan menurut perusahaan dan mengarahkan pelanggan untuk membeli barang atau jasa.
perusahaan dapat mengetahui pelanggan mana yang selalu membeli produk dan jasa mereka. Segmentasi Pelanggan bergantung pada indentifikasi pembeda utama yang membagi pelanggan menjadi kelompok yang dapat di targetkan informasi pelanggan dari segi demogragi (usia, ras, agama, jenis kelamin, ukuran keluarga, etnis, pendapatan, tingkat pendidikan dan lain-lain), dari segi geografi dimana pelanggan tinggal dan bekerja, dari segi psikografis (kelas sosial, gaya hidup dan karekteristik pelanggan), dan segi dari Kencendrungan Perilaku Pelanggan (pengeluaran, kunsumsi, penggunaan dan manfaat yang diinginkan pelanggan). dapat diperhitungkan ketika menentukan segmentasi pelanggan
MANFAAT SEGMENTASI PELANGGAN MELIPUTI :

Personalisasi Personalisasi memastikan bahwa perusahaan memberikan pengalaman pelanggan yang luar biasa.
Retensi Pelanggan 16 kali lebih mahal untuk membangun hubungan bisnis jangka panjang dengan pelanggan baru dari pada hanya untuk membutuhkan loyalitas pelanggan.
ROI yang lebih baik untuk pemasaran produk atau jasa Afrimasi bahwa pesanan yang tepat dikirim ke orang yang tepat berdasarkan tahap siklus hidup mereka.
Menciptakan peluang baru Segementasi pelanggan dapat menciptakan tren baru tentang produk atau jasa bahkan dapat memberi keuntungan bagi perusahaan.
PENDEKATAN PEMBELAJARAN MESIN

Unsupersived Learning adalah kelas teknik Machine Learning untuk menemukan pola dalam data, Data yang diberikan kepada Algoritma Pembelajaran Tanpa Pengawasan tidak diberi label, yang berarti hanya variabel input (X) yang diberikan tanpa variabel output yang sesuai. dan dalam Pembelajaran Tanpa Pengawasan Algoritma diserahkan kepada diri mereka senderi untuk menemukan stuktur yang menarik dalam data.
Ada beberapa Teknik Analysis yang dapat membantu perusahaan untuk menemukan segmentasi pelanggan, ini berguna ketika perusahaan memiliki sejumlah besar pelanggan dan sulit untuk menemukan pola dalam data pelanggan hanya dengan melihat transaksi. terdapat dua yang paling umum yaitu :
- Clustering
Clustering adalah teknik eksplorasi untuk dataset dimana hubungan antara pengamatan yang berbeda mungkin selalu sulit dikenali.
- Analysis Komponen Utama (PCA)
PCA adalah prosedur statistik yang menggunakan informasi ortogonal untuk mengubah satu set pengamatan variabel yang mungkin berkorelasi (identitas masing-masing mengambil berbagai nilai numerik) menjadi satu set nilai variabel lineir yang berkorelasi yang disebut komponen utama.
Dalam kasus ini saya menggunakan pembelajaran tanpa pengawasan clustering K-means data pada kasus ini Data Segmetasi Pelanggan Mall untuk menunjukkan kemampuan algoritma clustering K-means untuk mengidentifikasi segmen pelanggan.
VISUALISASION
GENDER

Dapat dilihat denga visualisasion Pelanggan Mall secara Individu, dimana Mayoritas berkaitan dengan Perempuan

Dari perspektif bisnis, sebagian besar perusahaan yang tampaknya memiliki kisah sukses sangat fokus pada kelompok sasaran tertentu sehingga memberikan pengalaman terbaik bagi mereka. Oleh karena itu, bisnis secara primarly berfokus pada kegiatan yang relevan tersebut. Selain itu, kadang-kadang, bisnis dapat memilih lebih dari satu segmen sebagai fokus kegiatannya, dalam hal ini, biasanya akan mengidentifikasi target utama dan target sekunder. Target pasar utama adalah segmen pasar tersebut.
Di mana upaya pemasaran terutama diarahkan dan di mana lebih banyak sumber daya bisnis dialokasikan, sementara pasar sekunder seringkali merupakan segmen yang lebih kecil atau kurang penting bagi kesuksesan produk.
Variabel Usia

Variabel Usia akan menjadi indikator yang baik dari kelompok Usia yang ditargetkan.
summary(Age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
18.00 28.75 36.00 38.85 49.00 70.00


Sangat menarik bahwa ada perbedaan antara kedua jenis kelamin. Tampaknya pada kedua kelompok (yaitu Laki-laki &Perempuan) ada aktivitas yang kuat pada usia 25-35, sementara data menunjukkan kelompok lain yang sering dari bagian perempuan pada usia sekitar 45 tahun. Sebaliknya, kelompok kurva pria menurun seiring bertambahnya usia mencapai usia maksimum 70 tahun.
Varibel Pendapatan dan Variabel Skor Pengeluaran

Variabel pendapatan dan variabel skor pengeluaran adalah yang paling menarik minat kita karena kita akan menyimpan variabel ini untuk melakukan pengelompokan kita. Menyelidiki sedikit lebih banyak pada variabel ini kita dapat melihat bahwa mereka berperilaku normal dan tidak ada anomali yang terdeteksi (1 titik data pada variabel Pendapatan dianggap sebagai nilai yang benar).

NILAI NA

Secara FInally, dataset tidak mengandung nilai N / A sehingga tidak ada teknik nilai yang hilang perlu diterapkan karena alasan itu. Model kami benar-benar sensitif dalam nilai N / A seperti yang akan dibahas selanjutnya.
cat("There are", sum(is.na(pelanggan)), "N/A values.")
There are 0 N/A values.
K-MEANS
K-means clustering

Algoritma pembelajaran mesin tanpa pengawasan untuk mengelompokkan pengamatan ‘n’ ke dalam cluster ‘k’ di mana k telah ditentukan atau konstanta yang ditentukan pengguna. Ide utamanya adalah mendefinisikan k centroids, satu untuk setiap cluster.
Algoritma K-Means melibatkan:
Memilih jumlah cluster “k”.
Secara acak menetapkan setiap titik ke cluster
Sampai kluster berhenti berubah, ulangi hal berikut
Untuk setiap cluster, hitung sentroid cluster dengan mengambil vektor rata-rata titik dalam cluster. Untuk setiap cluster, hitung sentroid cluster dengan mengambil vektor rata-rata titik dalam cluster.
Tetapkan setiap titik data ke cluster yang centroid adalah yang paling dekat.
Dua hal yang sangat penting dalam cara K, yang pertama adalah untuk skala variabel sebelum clustering data *, dan kedua adalah untuk melihat plot scatter atau tabel data untuk memperkirakan jumlah pusat cluster untuk mengatur parameter k dalam model.
Catatan: Penskalaan diperlukan ketika jarak antara atribut tidak masuk akal (yaitu jarak antara Usia dan Tinggi; metrik yang berbeda juga penting!). Di sisi lain, jika Anda memiliki atribut dengan makna yang terdefinisi dengan baik (misalnya lintang dan bujur) maka Anda tidak boleh menskalakan data Anda, karena ini akan menyebabkan distorsi.
Hipotesis kami dan jawaban yang kami coba berikan menggunakan k-means adalah bahwa ada intuisi bahwa pelanggan dapat dikelompokkan (berkerumun) sesuai dengan skor pengeluaran mereka mengingat pendapatan mereka. Hipotesis nol saya (yang saya coba bantah) adalah bahwa tidak ada kelompok (cluster) pelanggan berdasarkan ini.
MENENTUKAN JUMLAN CLUSTER MENGGUNAKAN PENDEKATAN ELBOW


Hal ini dapat dilihat dari grafik di atas bahwa pilihan yang wajar untuk nilai K akan menjadi k = 5. Oleh karena itu, kami akan membuat 5 cluster untuk menghasilkan segmen kami.
customerClusters
K-means clustering with 5 clusters of sizes 39, 81, 35, 23, 22
Cluster means:
Annual.Income..k.. Spending.Score..1.100.
1 86.53846 82.12821
2 55.29630 49.51852
3 88.20000 17.11429
4 26.30435 20.91304
5 25.72727 79.36364
Clustering vector:
[1] 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4
[44] 2 4 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[87] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 3 1 2 1 3
[130] 1 3 1 2 1 3 1 3 1 3 1 3 1 2 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1
[173] 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1
Within cluster sum of squares by cluster:
[1] 13444.051 9875.111 12511.143 5098.696 3519.455
(between_SS / total_SS = 83.5 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss"
[6] "betweenss" "size" "iter" "ifault"
VISULIASE THE CLUSTERS


Plot “Cluster of Customers” yang dihasilkan menunjukkan distribusi 5 cluster. Interpretasi yang masuk akal untuk segmentasi pelanggan mall dapat dihasilkan yaitu:
Cluster 1 Pelanggan dengan pendapatan tahunan menengah dan pengeluaran tahunan menengah
Cluster 2 Pelanggan dengan pendapatan tahunan yang tinggi dan pengeluaran tahunan yang tinggi
Cluster 3 Pelanggan dengan pendapatan tahunan rendah dan pengeluaran tahunan yang rendah
Cluster 4 Pelanggan dengan pendapatan tahunan yang tinggi tetapi pengeluaran tahunan rendah
Cluster 5 Pelanggan berpenghasilan tahunan rendah tetapi pengeluaran tahunan yang tinggi
Memiliki pemahaman yang lebih baik tentang segmen pelanggan, perusahaan dapat membuat keputusan yang lebih baik dan lebih tepat. Contohnya, ada pelanggan dengan pendapatan tahunan yang tinggi tetapi skor pengeluaran rendah. Pendekatan pemasaran yang lebih strategis dan bertarget dapat mengangkat minat mereka dan membuat mereka menjadi pemboros yang lebih tinggi. Fokusnya juga harus pada pelanggan “setia” dan menjaga kepuasan mereka.
KESIMPULAN

Dengan demikian kita telah melihat, bagaimana kita bisa sampai pada wawasan dan rekomendasi yang berarti dengan menggunakan algoritma pengelompokan untuk menghasilkan segmen pelanggan. Demi kesederhanaan, dataset hanya menggunakan 2 variabel - pendapatan dan pengeluaran. Dalam skenario bisnis yang khas, mungkin ada beberapa variabel yang dapat menghasilkan wawasan yang lebih realistis dan spesifik bisnis.
LS0tDQp0aXRsZTogIlNFR01FTlRBU0kgUEVMQU5HR0FOIC0gUEVNQkVMQUpBUkFOIFRBTlBBIFBFTkdBV0FTQU4iDQphdXRob3I6ICJcVTAwMDFGNUUzIEphbWFsbHVkaW4iDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgZmlnX3dpZHRoOiA3DQogICAgZmlnX2hlaWdodDogNC41DQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNCjxjZW50ZXI+PGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmNvbS9pc2hhcmFuZXJhbmphbmEva2FnZ2xlX2dpZi9ibG9iL21haW4va21lYW4uZ2lmP3Jhdz10cnVlICJzdHlsZT0iYm9yZGVyLXJhZGl1czogMjBweDsiPjwvY2VudGVyPg0KDQotLS0NCg0KDQojIERFU0tSSVBTSSANCg0KIVtdKHBlcnNpcGFuIGRhdGEucG5nKQ0KDQoqKlNlZ2VtdGFzaSBQZWxhbmdnYW4qKiBhZGFsYWggcHJha3RpayBtZW1iYWdpIGJhc2lzIHBlbGFuZ2dhbiBtZW5qYWRpIGtlbG9tcG9rIGluZGl2aWR1IHlhbmcgc2VydXBhIGRlbmdhbiBjYXJhIHRlcnRlbnR1IHlhbmcgcmVsZXZhbiBkZW5nYW4gc3RhcnRlZ2kgcGVtYXNhcmFuLCBzZXBlcnRpIHVzaWEsIGplbmlzIGtlbGFtaW4sIG1pbmF0LCBrZWJpYXNhYW4gYmVsYW5qYSBkYW4gbGFpbi1sYWluLg0KDQpQZXJ1c2FoYWFuIHlhbmcgbWVuZ2d1bmFrYW4gKipTZWdtZW50YXNpIFBlbGFuZ2dhbioqIGJlcm9wZXJhc2kgZGliYXdhaCBmYWt0YSBiYWh3YSBzZXRpYXAgcGVsYW5nZ2FuIGJlcmJlZGEgZGFuIGJhaHdhIHVwYXlhIHBlbWFzYXJhbiBiYXJhbmcgYXRhdSBqYXNhLCBtZXJla2EgYWthbiBsZWJpaCBiYWlrIGRpbGF5YW5pLiBqaWthIHBlcnVzYWhhYW4gbWVuYXJnZXRrYW4gcGVsYW5nZ2FuIHRlcnRlbnR1IHlhbmcgbGViaWgga2VjaWwgZGVuZ2FuIHBlc2FuYW4gbWVudXJ1dCBwZXJ1c2FoYWFuIGRhbiBtZW5nYXJhaGthbiBwZWxhbmdnYW4gdW50dWsgbWVtYmVsaSBiYXJhbmcgYXRhdSBqYXNhLg0KDQpwZXJ1c2FoYWFuIGRhcGF0IG1lbmdldGFodWkgcGVsYW5nZ2FuIG1hbmEgeWFuZyBzZWxhbHUgbWVtYmVsaSBwcm9kdWsgZGFuIGphc2EgbWVyZWthLiAqKlNlZ21lbnRhc2kgUGVsYW5nZ2FuKiogYmVyZ2FudHVuZyBwYWRhIGluZGVudGlmaWthc2kgcGVtYmVkYSB1dGFtYSB5YW5nIG1lbWJhZ2kgcGVsYW5nZ2FuIG1lbmphZGkga2Vsb21wb2sgeWFuZyBkYXBhdCBkaSB0YXJnZXRrYW4gaW5mb3JtYXNpIHBlbGFuZ2dhbiBkYXJpIHNlZ2kgKipkZW1vZ3JhZ2kqKiAodXNpYSwgcmFzLCBhZ2FtYSwgamVuaXMga2VsYW1pbiwgdWt1cmFuIGtlbHVhcmdhLCBldG5pcywgcGVuZGFwYXRhbiwgdGluZ2thdCBwZW5kaWRpa2FuIGRhbiBsYWluLWxhaW4pLCBkYXJpIHNlZ2kgKipnZW9ncmFmaSoqIGRpbWFuYSBwZWxhbmdnYW4gdGluZ2dhbCBkYW4gYmVrZXJqYSwgZGFyaSBzZWdpICoqcHNpa29ncmFmaXMqKiAoa2VsYXMgc29zaWFsLCBnYXlhIGhpZHVwIGRhbiBrYXJla3RlcmlzdGlrIHBlbGFuZ2dhbiksIGRhbiBzZWdpIGRhcmkgKipLZW5jZW5kcnVuZ2FuIFBlcmlsYWt1IFBlbGFuZ2dhbioqIChwZW5nZWx1YXJhbiwga3Vuc3Vtc2ksIHBlbmdndW5hYW4gZGFuIG1hbmZhYXQgeWFuZyBkaWluZ2lua2FuIHBlbGFuZ2dhbikuIGRhcGF0IGRpcGVyaGl0dW5na2FuIGtldGlrYSBtZW5lbnR1a2FuICoqc2VnbWVudGFzaSBwZWxhbmdnYW4qKg0KDQojIyBNQU5GQUFUIFNFR01FTlRBU0kgUEVMQU5HR0FOIE1FTElQVVRJIDogDQoNCiFbXShmdW5nc2kgay1tZW5hcy5wbmcpDQoNCmEuICoqUGVyc29uYWxpc2FzaSoqDQpQZXJzb25hbGlzYXNpICBtZW1hc3Rpa2FuIGJhaHdhIHBlcnVzYWhhYW4gbWVtYmVyaWthbiBwZW5nYWxhbWFuIHBlbGFuZ2dhbiB5YW5nIGx1YXIgYmlhc2EuDQoNCmIuICoqUmV0ZW5zaSBQZWxhbmdnYW4qKg0KMTYga2FsaSBsZWJpaCBtYWhhbCB1bnR1ayBtZW1iYW5ndW4gaHVidW5nYW4gYmlzbmlzIGphbmdrYSBwYW5qYW5nIGRlbmdhbiBwZWxhbmdnYW4gYmFydSBkYXJpIHBhZGEgaGFueWEgdW50dWsgbWVtYnV0dWhrYW4gbG95YWxpdGFzIHBlbGFuZ2dhbi4NCg0KYy4gKipST0kgeWFuZyBsZWJpaCBiYWlrIHVudHVrIHBlbWFzYXJhbiBwcm9kdWsgYXRhdSBqYXNhKioNCkFmcmltYXNpIGJhaHdhIHBlc2FuYW4geWFuZyB0ZXBhdCBkaWtpcmltIGtlIG9yYW5nIHlhbmcgdGVwYXQgYmVyZGFzYXJrYW4gdGFoYXAgc2lrbHVzIGhpZHVwIG1lcmVrYS4NCg0KZC4gKipNZW5jaXB0YWthbiBwZWx1YW5nIGJhcnUqKg0KU2VnZW1lbnRhc2kgcGVsYW5nZ2FuIGRhcGF0IG1lbmNpcHRha2FuIHRyZW4gYmFydSB0ZW50YW5nIHByb2R1ayBhdGF1IGphc2EgYmFoa2FuIGRhcGF0IG1lbWJlcmkga2V1bnR1bmdhbiBiYWdpIHBlcnVzYWhhYW4uDQoNCg0KIyBQRU5ERUtBVEFOIFBFTUJFTEFKQVJBTiBNRVNJTg0KDQohW10obWVuZXR1a2FuIHRlcmJhaWsucG5nKQ0KDQoqKlVuc3VwZXJzaXZlZCBMZWFybmluZyoqIGFkYWxhaCBrZWxhcyB0ZWtuaWsgTWFjaGluZSBMZWFybmluZyB1bnR1ayBtZW5lbXVrYW4gcG9sYSBkYWxhbSBkYXRhLCBEYXRhIHlhbmcgZGliZXJpa2FuIGtlcGFkYSBBbGdvcml0bWEgUGVtYmVsYWphcmFuIFRhbnBhIFBlbmdhd2FzYW4gdGlkYWsgZGliZXJpIGxhYmVsLCB5YW5nIGJlcmFydGkgaGFueWEgdmFyaWFiZWwgaW5wdXQgKiooWCkqKiB5YW5nIGRpYmVyaWthbiB0YW5wYSB2YXJpYWJlbCBvdXRwdXQgeWFuZyBzZXN1YWkuIGRhbiBkYWxhbSBQZW1iZWxhamFyYW4gVGFucGEgUGVuZ2F3YXNhbiBBbGdvcml0bWEgZGlzZXJhaGthbiBrZXBhZGEgZGlyaSBtZXJla2Egc2VuZGVyaSB1bnR1ayBtZW5lbXVrYW4gc3R1a3R1ciB5YW5nIG1lbmFyaWsgZGFsYW0gZGF0YS4NCg0KQWRhIGJlYmVyYXBhIFRla25payBBbmFseXNpcyB5YW5nIGRhcGF0IG1lbWJhbnR1IHBlcnVzYWhhYW4gdW50dWsgbWVuZW11a2FuIHNlZ21lbnRhc2kgcGVsYW5nZ2FuLCBpbmkgYmVyZ3VuYSBrZXRpa2EgcGVydXNhaGFhbiBtZW1pbGlraSBzZWp1bWxhaCBiZXNhciBwZWxhbmdnYW4gZGFuIHN1bGl0IHVudHVrIG1lbmVtdWthbiBwb2xhIGRhbGFtIGRhdGEgcGVsYW5nZ2FuIGhhbnlhIGRlbmdhbiBtZWxpaGF0IHRyYW5zYWtzaS4gdGVyZGFwYXQgZHVhIHlhbmcgcGFsaW5nIHVtdW0geWFpdHUgOiANCg0KYS4gKipDbHVzdGVyaW5nKioNCg0KQ2x1c3RlcmluZyBhZGFsYWggdGVrbmlrIGVrc3Bsb3Jhc2kgdW50dWsgZGF0YXNldCBkaW1hbmEgaHVidW5nYW4gYW50YXJhIHBlbmdhbWF0YW4geWFuZyBiZXJiZWRhIG11bmdraW4gc2VsYWx1IHN1bGl0IGRpa2VuYWxpLg0KDQpiLiAqKkFuYWx5c2lzIEtvbXBvbmVuIFV0YW1hIChQQ0EpKioNCg0KUENBIGFkYWxhaCBwcm9zZWR1ciBzdGF0aXN0aWsgeWFuZyBtZW5nZ3VuYWthbiBpbmZvcm1hc2kgb3J0b2dvbmFsIHVudHVrIG1lbmd1YmFoIHNhdHUgc2V0IHBlbmdhbWF0YW4gdmFyaWFiZWwgeWFuZyBtdW5na2luIGJlcmtvcmVsYXNpIChpZGVudGl0YXMgbWFzaW5nLW1hc2luZyBtZW5nYW1iaWwgYmVyYmFnYWkgbmlsYWkgbnVtZXJpaykgbWVuamFkaSBzYXR1IHNldCBuaWxhaSB2YXJpYWJlbCBsaW5laXIgeWFuZyBiZXJrb3JlbGFzaSB5YW5nIGRpc2VidXQga29tcG9uZW4gdXRhbWEuDQoNCkRhbGFtIGthc3VzIGluaSBzYXlhIG1lbmdndW5ha2FuIHBlbWJlbGFqYXJhbiB0YW5wYSBwZW5nYXdhc2FuICoqY2x1c3RlcmluZyBLLW1lYW5zKiogDQpkYXRhIHBhZGEga2FzdXMgaW5pIERhdGEgU2VnbWV0YXNpIFBlbGFuZ2dhbiBNYWxsIHVudHVrIG1lbnVuanVra2FuIGtlbWFtcHVhbiBhbGdvcml0bWEgY2x1c3RlcmluZyBLLW1lYW5zIHVudHVrIG1lbmdpZGVudGlmaWthc2kgc2VnbWVuIHBlbGFuZ2dhbi4NCg0KDQojIyBJTlBVVCBEQVRBIFBFTEFOR0dBTiBNQUxMIA0KDQohW10ocGVsYW5nZ2FuLnBuZykNCg0KYGBge3J9DQoNCiMgUGFja3BhZ2UgeWFuZyBkaWd1bmFrYW4gDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoZ2dwbG90Mik7IHRoZW1lX3NldCh0aGVtZV9idygpKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc2ttZWFucykNCg0KDQojIElucHV0IGRhdGEgDQoNCnBlbGFuZ2dhbiA8LSByZWFkLmNzdigiUGVsYW5nZ2FuX01hbGwuY3N2IikgDQphdHRhY2gocGVsYW5nZ2FuKQ0KYGBgDQoNClNlbGFuanV0bnlhIHNheWEgaGFydXMgbWVtc2F0aWthbiBiYWh3YSBkYXRhIGRhbGFtIGZvcm1hdCB5YW5nIGJlbmFyIHNlaGluZ2dhIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBwZW1vZGVsYW4uDQoNCmBgYHtyfQ0KZGltKHBlbGFuZ2dhbikNCnN0cihwZWxhbmdnYW4pDQpgYGANCg0KRGF0YSBoYW55YWxhaCBzYW1wZWwgZGFyaSBzZWp1bWxhaCBiZXNhciBkYXRhIHBlbGFuZ2dhbi4gTmFtdW4gdHVqdWFuIGRhcmkgc3R1ZGkga2FzdXMgaW5pIGFkYWxhaCAgZmFtaWxpcmlzYXRpb24gSy1NZWFucyBkYW4gUGVtYmVsYWphcmFuIHRhbnBhIFBlbmdhd2FzYW4uDQoNCnNheWEgaW5naW4gbWVsaWhhdCA2IGRhdGEgcGVsYW5nZ2FuIHBlcnRhbWENCg0KYGBge3J9DQoNCmhlYWQocGVsYW5nZ2FuKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmNvbG5hbWVzKHBlbGFuZ2dhbikNCmBgYA0KDQpEYXRhIHRlcnNlYnV0IHRlcmRlcmkgZGFyaSANCg0KYGBge3J9DQoNCm5fZGlzdGluY3QoQ3VzdG9tZXJJRCkNCmBgYA0KDQoNCiMgVklTVUFMSVNBU0lPTg0KDQojIyBHRU5ERVIgDQoNCiFbXShtZWxpaGF0IGRhdGEgY2x1c3RlcmluZy5wbmcpDQoNCkRhcGF0IGRpbGloYXQgZGVuZ2EgdmlzdWFsaXNhc2lvbiBQZWxhbmdnYW4gTWFsbCBzZWNhcmEgSW5kaXZpZHUsIGRpbWFuYSBNYXlvcml0YXMgYmVya2FpdGFuIGRlbmdhbiAqKlBlcmVtcHVhbioqDQoNCmBgYHtyfQ0KDQphcy5kYXRhLmZyYW1lKHRhYmxlKEdlbmRlcikpICAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gR2VuZGVyLCB5ID0gRnJlcSkpICArDQogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiI0Y4NzY2RCIpICsNCiAgICBnZW9tX3RleHQoeSA9IGFzLnZlY3Rvcih0YWJsZShHZW5kZXIpKSwgbGFiZWwgPSBwYXN0ZTAoKGFzLnZlY3Rvcih0YWJsZShHZW5kZXIpKS9zdW0oYXMudmVjdG9yKHRhYmxlKEdlbmRlcikpKSkqMTAwLCAiJSIpKQ0KYGBgDQoNCkRhcmkgcGVyc3Bla3RpZiBiaXNuaXMsIHNlYmFnaWFuIGJlc2FyIHBlcnVzYWhhYW4geWFuZyB0YW1wYWtueWEgbWVtaWxpa2kga2lzYWggc3Vrc2VzIHNhbmdhdCBmb2t1cyBwYWRhIGtlbG9tcG9rIHNhc2FyYW4gdGVydGVudHUgc2VoaW5nZ2EgbWVtYmVyaWthbiBwZW5nYWxhbWFuIHRlcmJhaWsgYmFnaSBtZXJla2EuIE9sZWgga2FyZW5hIGl0dSwgYmlzbmlzIHNlY2FyYSBwcmltYXJseSBiZXJmb2t1cyBwYWRhIGtlZ2lhdGFuIHlhbmcgcmVsZXZhbiB0ZXJzZWJ1dC4gU2VsYWluIGl0dSwga2FkYW5nLWthZGFuZywgYmlzbmlzIGRhcGF0IG1lbWlsaWggbGViaWggZGFyaSBzYXR1IHNlZ21lbiBzZWJhZ2FpIGZva3VzIGtlZ2lhdGFubnlhLCBkYWxhbSBoYWwgaW5pLCBiaWFzYW55YSBha2FuIG1lbmdpZGVudGlmaWthc2kgdGFyZ2V0IHV0YW1hIGRhbiB0YXJnZXQgc2VrdW5kZXIuIFRhcmdldCBwYXNhciB1dGFtYSBhZGFsYWggc2VnbWVuIHBhc2FyIHRlcnNlYnV0LiANCg0KRGkgbWFuYSB1cGF5YSBwZW1hc2FyYW4gdGVydXRhbWEgZGlhcmFoa2FuIGRhbiBkaSBtYW5hIGxlYmloIGJhbnlhayBzdW1iZXIgZGF5YSBiaXNuaXMgZGlhbG9rYXNpa2FuLCBzZW1lbnRhcmEgcGFzYXIgc2VrdW5kZXIgc2VyaW5na2FsaSBtZXJ1cGFrYW4gc2VnbWVuIHlhbmcgbGViaWgga2VjaWwgYXRhdSBrdXJhbmcgcGVudGluZyBiYWdpIGtlc3Vrc2VzYW4gcHJvZHVrLg0KDQojIyBWYXJpYWJlbCBVc2lhIA0KDQohW10obWVsaWhhdCBkYXRhIGNsdXN0ZXJpbmcucG5nKQ0KDQoNClZhcmlhYmVsIFVzaWEgYWthbiBtZW5qYWRpIGluZGlrYXRvciB5YW5nIGJhaWsgZGFyaSBrZWxvbXBvayBVc2lhIHlhbmcgZGl0YXJnZXRrYW4uDQoNCmBgYHtyfQ0Kc3VtbWFyeShBZ2UpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYXMuZGF0YS5mcmFtZShBZ2UpLCBhZXMoeSA9IEFnZSkpICsgZ2VvbV9ib3hwbG90KGZpbGw9JyNGODc2NkQnKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QocGVsYW5nZ2FuLCBhZXMoIHggPSBBZ2UsIGZpbGwgPSBHZW5kZXIpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNCkNCmBgYA0KDQoNClNhbmdhdCBtZW5hcmlrIGJhaHdhIGFkYSBwZXJiZWRhYW4gYW50YXJhIGtlZHVhIGplbmlzIGtlbGFtaW4uIFRhbXBha255YSBwYWRhIGtlZHVhIGtlbG9tcG9rICh5YWl0dSBMYWtpLWxha2kgJlBlcmVtcHVhbikgYWRhIGFrdGl2aXRhcyB5YW5nIGt1YXQgcGFkYSB1c2lhIDI1LTM1LCBzZW1lbnRhcmEgZGF0YSBtZW51bmp1a2thbiBrZWxvbXBvayBsYWluIHlhbmcgc2VyaW5nIGRhcmkgYmFnaWFuIHBlcmVtcHVhbiBwYWRhIHVzaWEgc2VraXRhciA0NSB0YWh1bi4gU2ViYWxpa255YSwga2Vsb21wb2sga3VydmEgcHJpYSBtZW51cnVuIHNlaXJpbmcgYmVydGFtYmFobnlhIHVzaWEgbWVuY2FwYWkgdXNpYSBtYWtzaW11bSA3MCB0YWh1bi4NCg0KDQojIyBWYXJpYmVsIFBlbmRhcGF0YW4gZGFuIFZhcmlhYmVsIFNrb3IgUGVuZ2VsdWFyYW4NCg0KIVtdKG1lbGloYXQgZGF0YSBjbHVzdGVyaW5nLnBuZykNCg0KVmFyaWFiZWwgcGVuZGFwYXRhbiBkYW4gdmFyaWFiZWwgc2tvciBwZW5nZWx1YXJhbiBhZGFsYWggeWFuZyBwYWxpbmcgbWVuYXJpayBtaW5hdCBraXRhIGthcmVuYSBraXRhIGFrYW4gbWVueWltcGFuIHZhcmlhYmVsIGluaSB1bnR1ayBtZWxha3VrYW4gcGVuZ2Vsb21wb2thbiBraXRhLiBNZW55ZWxpZGlraSBzZWRpa2l0IGxlYmloIGJhbnlhayBwYWRhIHZhcmlhYmVsIGluaSBraXRhIGRhcGF0IG1lbGloYXQgYmFod2EgbWVyZWthIGJlcnBlcmlsYWt1IG5vcm1hbCBkYW4gdGlkYWsgYWRhIGFub21hbGkgeWFuZyB0ZXJkZXRla3NpICgxIHRpdGlrIGRhdGEgcGFkYSB2YXJpYWJlbCBQZW5kYXBhdGFuIGRpYW5nZ2FwIHNlYmFnYWkgbmlsYWkgeWFuZyBiZW5hcikuDQoNCg0KYGBge3J9DQoNCnAxIDwtIGdncGxvdChhcy5kYXRhLmZyYW1lKEFubnVhbC5JbmNvbWUuLmsuLiksIGFlcyh5ID0gQW5udWFsLkluY29tZS4uay4uKSkgKyBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4NzY2RCcpICsgeWxpbShjKDEsMTUwKSkNCnAyIDwtIGdncGxvdChhcy5kYXRhLmZyYW1lKFNwZW5kaW5nLlNjb3JlLi4xLjEwMC4pLCBhZXMoeSA9IFNwZW5kaW5nLlNjb3JlLi4xLjEwMC4pKSArIGdlb21fYm94cGxvdChmaWxsPScjMDBCRkM0JykgKyB5bGltKGMoMSwxNTApKQ0KZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbmNvbCA9IDIpDQpgYGANCg0KDQojIyBOSUxBSSBOQQ0KDQohW10oYW5hbGlzYS5wbmcpDQoNClNlY2FyYSBGSW5hbGx5LCBkYXRhc2V0IHRpZGFrIG1lbmdhbmR1bmcgbmlsYWkgTiAvIEEgc2VoaW5nZ2EgdGlkYWsgYWRhIHRla25payBuaWxhaSB5YW5nIGhpbGFuZyBwZXJsdSBkaXRlcmFwa2FuIGthcmVuYSBhbGFzYW4gaXR1LiBNb2RlbCBrYW1pIGJlbmFyLWJlbmFyIHNlbnNpdGlmIGRhbGFtIG5pbGFpIE4gLyBBIHNlcGVydGkgeWFuZyBha2FuIGRpYmFoYXMgc2VsYW5qdXRueWEuDQoNCmBgYHtyfQ0KY2F0KCJUaGVyZSBhcmUiLCBzdW0oaXMubmEocGVsYW5nZ2FuKSksICJOL0EgdmFsdWVzLiIpDQpgYGANCg0KDQojIEstTUVBTlMNCg0KIyMgSy1tZWFucyBjbHVzdGVyaW5nDQoNCiFbXShjbHVzdGVyaW5nLnBuZykNCg0KQWxnb3JpdG1hIHBlbWJlbGFqYXJhbiBtZXNpbiB0YW5wYSBwZW5nYXdhc2FuIHVudHVrIG1lbmdlbG9tcG9ra2FuIHBlbmdhbWF0YW4gJ24nIGtlIGRhbGFtIGNsdXN0ZXIgJ2snIGRpIG1hbmEgayB0ZWxhaCBkaXRlbnR1a2FuIGF0YXUga29uc3RhbnRhIHlhbmcgZGl0ZW50dWthbiBwZW5nZ3VuYS4gSWRlIHV0YW1hbnlhIGFkYWxhaCBtZW5kZWZpbmlzaWthbiBrIGNlbnRyb2lkcywgc2F0dSB1bnR1ayBzZXRpYXAgY2x1c3Rlci4NCg0KQWxnb3JpdG1hIEstTWVhbnMgbWVsaWJhdGthbjoNCg0KYS4gTWVtaWxpaCBqdW1sYWggY2x1c3RlciAiayIuDQoNCmIuIFNlY2FyYSBhY2FrIG1lbmV0YXBrYW4gc2V0aWFwIHRpdGlrIGtlIGNsdXN0ZXINCg0KYy4gU2FtcGFpIGtsdXN0ZXIgYmVyaGVudGkgYmVydWJhaCwgdWxhbmdpIGhhbCBiZXJpa3V0DQoNCjEuIFVudHVrIHNldGlhcCBjbHVzdGVyLCBoaXR1bmcgc2VudHJvaWQgY2x1c3RlciBkZW5nYW4gbWVuZ2FtYmlsIHZla3RvciByYXRhLXJhdGEgdGl0aWsgZGFsYW0gY2x1c3Rlci4gVW50dWsgc2V0aWFwIGNsdXN0ZXIsIGhpdHVuZyBzZW50cm9pZCBjbHVzdGVyIGRlbmdhbiBtZW5nYW1iaWwgdmVrdG9yIHJhdGEtcmF0YSB0aXRpayBkYWxhbSBjbHVzdGVyLg0KDQoyLiBUZXRhcGthbiBzZXRpYXAgdGl0aWsgZGF0YSBrZSBjbHVzdGVyIHlhbmcgY2VudHJvaWQgYWRhbGFoIHlhbmcgcGFsaW5nIGRla2F0Lg0KDQpEdWEgaGFsIHlhbmcgc2FuZ2F0IHBlbnRpbmcgZGFsYW0gY2FyYSBLLCB5YW5nIHBlcnRhbWEgYWRhbGFoIHVudHVrIHNrYWxhIHZhcmlhYmVsIHNlYmVsdW0gY2x1c3RlcmluZyBkYXRhICosIGRhbiBrZWR1YSBhZGFsYWggdW50dWsgbWVsaWhhdCBwbG90IHNjYXR0ZXIgYXRhdSB0YWJlbCBkYXRhIHVudHVrIG1lbXBlcmtpcmFrYW4ganVtbGFoIHB1c2F0IGNsdXN0ZXIgdW50dWsgbWVuZ2F0dXIgcGFyYW1ldGVyIGsgZGFsYW0gbW9kZWwuDQoNCkNhdGF0YW46IFBlbnNrYWxhYW4gZGlwZXJsdWthbiBrZXRpa2EgamFyYWsgYW50YXJhIGF0cmlidXQgdGlkYWsgbWFzdWsgYWthbCAoeWFpdHUgamFyYWsgYW50YXJhIFVzaWEgZGFuIFRpbmdnaTsgbWV0cmlrIHlhbmcgYmVyYmVkYSBqdWdhIHBlbnRpbmchKS4gRGkgc2lzaSBsYWluLCBqaWthIEFuZGEgbWVtaWxpa2kgYXRyaWJ1dCBkZW5nYW4gbWFrbmEgeWFuZyB0ZXJkZWZpbmlzaSBkZW5nYW4gYmFpayAobWlzYWxueWEgbGludGFuZyBkYW4gYnVqdXIpIG1ha2EgQW5kYSB0aWRhayBib2xlaCBtZW5za2FsYWthbiBkYXRhIEFuZGEsIGthcmVuYSBpbmkgYWthbiBtZW55ZWJhYmthbiBkaXN0b3JzaS4NCg0KSGlwb3Rlc2lzIGthbWkgZGFuIGphd2FiYW4geWFuZyBrYW1pIGNvYmEgYmVyaWthbiBtZW5nZ3VuYWthbiBrLW1lYW5zIGFkYWxhaCBiYWh3YSBhZGEgaW50dWlzaSBiYWh3YSBwZWxhbmdnYW4gZGFwYXQgZGlrZWxvbXBva2thbiAoYmVya2VydW11bikgc2VzdWFpIGRlbmdhbiBza29yIHBlbmdlbHVhcmFuIG1lcmVrYSBtZW5naW5nYXQgcGVuZGFwYXRhbiBtZXJla2EuIEhpcG90ZXNpcyBub2wgc2F5YSAoeWFuZyBzYXlhIGNvYmEgYmFudGFoKSBhZGFsYWggYmFod2EgdGlkYWsgYWRhIGtlbG9tcG9rIChjbHVzdGVyKSBwZWxhbmdnYW4gYmVyZGFzYXJrYW4gaW5pLg0KDQoNCmBgYHtyfQ0KS2RhdGEgPC0gcGVsYW5nZ2FuWyxjKDQsNSldDQpoZWFkKHBlbGFuZ2dhbikNCmBgYA0KDQojIyBNRU5FTlRVS0FOIEpVTUxBTiBDTFVTVEVSIE1FTkdHVU5BS0FOIFBFTkRFS0FUQU4gRUxCT1cNCg0KIVtdKGRhdGEgbWFzdGVyLnBuZykNCg0KYGBge3J9DQp0b3Qud2l0aGluc3MgPC0gdmVjdG9yKCJudW1lcmljIiwgbGVuZ3RoID0gMTApDQpmb3IgKGkgaW4gMToxMCl7DQogICAga0RldCA8LSBrbWVhbnMoS2RhdGEsIGkpDQogICAgdG90LndpdGhpbnNzW2ldIDwtIGtEZXQkdG90LndpdGhpbnNzDQp9DQoNCmdncGxvdChhcy5kYXRhLmZyYW1lKHRvdC53aXRoaW5zcyksIGFlcyh4ID0gc2VxKDEsMTApLCB5ID0gdG90LndpdGhpbnNzKSkgKyANCiAgICBnZW9tX3BvaW50KGNvbCA9ICIjRjg3NjZEIikgKyAgICANCiAgICBnZW9tX2xpbmUoY29sID0gIiNGODc2NkQiKSArIA0KICAgIHRoZW1lKGF4aXMudGl0bGUueC5ib3R0b20gPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgICB5bGFiKCJXaXRoaW4tY2x1c3RlciBTdW0gb2YgU3F1YXJlcyIpICsNCiAgICB4bGFiKCJOdW1iZXIgb2YgQ2x1c3RlcnMiKSArDQogICAgZ2d0aXRsZSgiRWxib3cgSyBFc3RpbWF0aW9uIikNCmBgYA0KDQoNCkhhbCBpbmkgZGFwYXQgZGlsaWhhdCBkYXJpIGdyYWZpayBkaSBhdGFzIGJhaHdhIHBpbGloYW4geWFuZyB3YWphciB1bnR1ayBuaWxhaSBLIGFrYW4gbWVuamFkaSBrID0gNS4gT2xlaCBrYXJlbmEgaXR1LCBrYW1pIGFrYW4gbWVtYnVhdCA1IGNsdXN0ZXIgdW50dWsgbWVuZ2hhc2lsa2FuIHNlZ21lbiBrYW1pLg0KDQpgYGB7cn0NCg0KY3VzdG9tZXJDbHVzdGVycyA8LSBrbWVhbnMoS2RhdGEsIDUpDQpjdXN0b21lckNsdXN0ZXJzDQpgYGANCg0KDQojIyBWSVNVTElBU0UgVEhFIENMVVNURVJTDQoNCiFbXShkYXRhYmFydS5wbmcpDQoNCmBgYHtyfQ0KZ2dwbG90KEtkYXRhLCBhZXMoeCA9IEFubnVhbC5JbmNvbWUuLmsuLiwgeSA9IFNwZW5kaW5nLlNjb3JlLi4xLjEwMC4pKSArIA0KICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIGFlcyhjb2xvciA9IGFzLmZhY3RvcihjdXN0b21lckNsdXN0ZXJzJGNsdXN0ZXIpKSkgKw0KICAgIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWU9IiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQ2x1c3RlciAxIiwgIkNsdXN0ZXIgMiIsICJDbHVzdGVyIDMiLCAiQ2x1c3RlciA0IiwgIkNsdXN0ZXIgNSIpKSArDQogICAgZ2d0aXRsZSgiU2VnbWVudGFzaSBQZWxhbmdnYW4gTWFsbCIsIHN1YnRpdGxlID0gIkstbWVhbnMgQ2x1c3RlcmluZyIpDQpgYGANCg0KDQpQbG90ICJDbHVzdGVyIG9mIEN1c3RvbWVycyIgeWFuZyBkaWhhc2lsa2FuIG1lbnVuanVra2FuIGRpc3RyaWJ1c2kgNSBjbHVzdGVyLiBJbnRlcnByZXRhc2kgeWFuZyBtYXN1ayBha2FsIHVudHVrIHNlZ21lbnRhc2kgcGVsYW5nZ2FuIG1hbGwgZGFwYXQgZGloYXNpbGthbiB5YWl0dToNCg0KKipDbHVzdGVyIDEqKiBQZWxhbmdnYW4gZGVuZ2FuIHBlbmRhcGF0YW4gdGFodW5hbiBtZW5lbmdhaCBkYW4gcGVuZ2VsdWFyYW4gdGFodW5hbiBtZW5lbmdhaA0KDQoqKkNsdXN0ZXIgMioqIFBlbGFuZ2dhbiBkZW5nYW4gcGVuZGFwYXRhbiB0YWh1bmFuIHlhbmcgdGluZ2dpIGRhbiBwZW5nZWx1YXJhbiB0YWh1bmFuIHlhbmcgdGluZ2dpDQoNCioqQ2x1c3RlciAzKiogUGVsYW5nZ2FuIGRlbmdhbiBwZW5kYXBhdGFuIHRhaHVuYW4gcmVuZGFoIGRhbiBwZW5nZWx1YXJhbiB0YWh1bmFuIHlhbmcgcmVuZGFoDQoNCioqQ2x1c3RlciA0KiogUGVsYW5nZ2FuIGRlbmdhbiBwZW5kYXBhdGFuIHRhaHVuYW4geWFuZyB0aW5nZ2kgdGV0YXBpIHBlbmdlbHVhcmFuIHRhaHVuYW4gcmVuZGFoDQoNCioqQ2x1c3RlciA1KiogUGVsYW5nZ2FuIGJlcnBlbmdoYXNpbGFuIHRhaHVuYW4gcmVuZGFoIHRldGFwaSBwZW5nZWx1YXJhbiB0YWh1bmFuIHlhbmcgdGluZ2dpDQoNCk1lbWlsaWtpIHBlbWFoYW1hbiB5YW5nIGxlYmloIGJhaWsgdGVudGFuZyBzZWdtZW4gcGVsYW5nZ2FuLCBwZXJ1c2FoYWFuIGRhcGF0IG1lbWJ1YXQga2VwdXR1c2FuIHlhbmcgbGViaWggYmFpayBkYW4gbGViaWggdGVwYXQuIENvbnRvaG55YSwgYWRhIHBlbGFuZ2dhbiBkZW5nYW4gcGVuZGFwYXRhbiB0YWh1bmFuIHlhbmcgdGluZ2dpIHRldGFwaSBza29yIHBlbmdlbHVhcmFuIHJlbmRhaC4gUGVuZGVrYXRhbiBwZW1hc2FyYW4geWFuZyBsZWJpaCBzdHJhdGVnaXMgZGFuIGJlcnRhcmdldCBkYXBhdCBtZW5nYW5na2F0IG1pbmF0IG1lcmVrYSBkYW4gbWVtYnVhdCBtZXJla2EgbWVuamFkaSBwZW1ib3JvcyB5YW5nIGxlYmloIHRpbmdnaS4gRm9rdXNueWEganVnYSBoYXJ1cyBwYWRhIHBlbGFuZ2dhbiAic2V0aWEiIGRhbiBtZW5qYWdhIGtlcHVhc2FuIG1lcmVrYS4NCg0KDQojIyBLRVNJTVBVTEFODQoNCiFbXShrZXNpbXB1bGFuLnBuZykNCg0KRGVuZ2FuIGRlbWlraWFuIGtpdGEgdGVsYWggbWVsaWhhdCwgYmFnYWltYW5hIGtpdGEgYmlzYSBzYW1wYWkgcGFkYSB3YXdhc2FuIGRhbiByZWtvbWVuZGFzaSB5YW5nIGJlcmFydGkgZGVuZ2FuIG1lbmdndW5ha2FuIGFsZ29yaXRtYSBwZW5nZWxvbXBva2FuIHVudHVrIG1lbmdoYXNpbGthbiBzZWdtZW4gcGVsYW5nZ2FuLiBEZW1pIGtlc2VkZXJoYW5hYW4sIGRhdGFzZXQgaGFueWEgbWVuZ2d1bmFrYW4gMiB2YXJpYWJlbCAtIHBlbmRhcGF0YW4gZGFuIHBlbmdlbHVhcmFuLiBEYWxhbSBza2VuYXJpbyBiaXNuaXMgeWFuZyBraGFzLCBtdW5na2luIGFkYSBiZWJlcmFwYSB2YXJpYWJlbCB5YW5nIGRhcGF0IG1lbmdoYXNpbGthbiB3YXdhc2FuIHlhbmcgbGViaWggcmVhbGlzdGlzIGRhbiBzcGVzaWZpayBiaXNuaXMu