Sebutkan 3 bahasa pemrograman yang paling banyak digunakan dalam Sains Data, berikan penjelasan kelebihan, kekurangan, dan hubungan bahasa pemrograman yang satu dengan yang lainnya.
Jawaban :
*a.Python
Adalah bahasa yang sangat populer, dinamis, dan merupakan bahasa yang digunakan secara luas dalam komunitas sains data. Bahasa ini adalah
bahasa yang sangat cocok untuk pemula karena sintaksnya yang mudah dan
simple.
**a) Kelebihan
*Mudah dipelajari
Dibanding bahasa pemrograman lain, Phyton relatif lebih mudah dipelajari. Bahasa ini memiliki sintaks-sintaks yang cukup
sederhana dan gampang dimengerti. Bahasa ini sangat dinamis dan
dibangun berdasarkan tingkat keterbacaan kode yang tinggi.
*Mudah diaplikasikan
Kelebihan lainnya dari bahasa pemrograman Python adalah
kemudahannya dalam diaplikasikan dalam mengembangkan sebuah produk,
baik itu situs,software, aplikasi situs, maupun video game
*Dukung loT
Bahasa pemrograman Python mendukung ekosistem Internet of Things
(IoT) dengan sangat baik. IoT sedang marak dibicarakan atau bahkan
dikembangkan di kalangan maker. Internet of Things merupakan sebuah
teknologi yang menghubungkan benda-benda di sekitar kita ke dalam
sebuah jaring-jaring yang saling terhubung.
*Fleksibel
Program yang ditulis menggunakan Python dapat dijalankan di hampir
semua sistem operasi (Unix, Windows, Mac OS X, dll.), termasuk untuk
perangkat-perangkat selular.
*Meningkatkan produktivitas
Karena memiliki library yang luas dan desain berorientasi objek
yang bersih, penggunaan bahasa pemrograman Python dapat menunjang
produktivitas programer dibanding saat menggunakan bahasa pemrograman
lain seperti Java dan C++.
*Free dan open source
Tidak hanya dapat diunduh secara gratis, bahasa Python juga
dikembangkan di bawah lisensi open source yang disetujui OSI, yang
berarti bahasa pemrograman ini bebas untuk digunakan, dikembangkan dan
didistribusikan, termasuk untuk tujuan komersial.
b) Kekurangan
*Kurangnya dukungan multiprosesor
Multiprocessing adalah bagian penting dalam penulisan aplikasi.
Python memang mendukung multiprocessing, namun mungkin tidak
sefleksibel atau senyaman bahasa lain. Itu sebabnya mungkin ini dapat
sedikit membatasi kamu saat menulis kode.
*Lebih sedikit developers yang berpengalaman
Saat kamu membuat aplikasi, kamu pasti ingin para developer paling
berpengalaman yang melakukan pekerjaan itu. Namun, tidak sesederhana
itu dengan Python karena tidak banyak ahli programmer yang menggunakan
bahasa ini terutama jika dibandingkan dengan Java.
*Tidak ideal untuk memory intensive task
Python adalah bahasa yang dikenal dengan fleksibilitas tipe datanya.
Hal ini membuatnya menghasilkan konsumsi memori yang cukup tinggi dan
menjadi tidak nyaman digunakan untuk memory intensive task.
*Kurang populer untuk mobile app development
Python bukan bahasa pemrograman yang populer untuk mobile
development. Hanya sedikit perusahaan yang menggunakan bahasa
pemrograman ini untuk tujuan tersebut. Karena itu kamu juga akan sulit
menemukan developer yang berpengalaman dalam mobile development yang
menggunakan Python.
*Batasan desain
Python diketik secara dinamis sehingga memiliki banyak batasan
desain. Python bahkan terlihat membutuhkan lebih banyak waktu pengujian
dan kesalahan yang muncul ketika aplikasi akhirnya dijalankan.
*Batasan kecepatan
Python sering dikritik karena kecepatannya yang lebih lambat
dibanding bahasa pemrograman yang dikompilasi seperti C atau C++ karena
metode berbeda yang digunakannya untuk menerjemahkan kode.
Meski begitu, beberapa benchmark Python bekerja lebih cepat daripada C
dan C++. Beberapa masalah terkait kecepatan bahasa pemrograman ini juga
telah diatasi dan dioptimalkan sehingga Python bisa dibilang tetap
menjadi salah satu pilihan teratus untuk pengembangan perangkat lunak.
b.R Adalah salah satu alat yang paling sering digunakan. R adalah bahasa open source dan lingkungan perangkat lunak untuk komputasi statistik dan grafis, yang didukung oleh R Yayasan Komputasi Statistika. keahlian ini memiliki permintaan tinggi di semua perekrut dalam mesin pembelajaran dan ilmu pengetahuan data.
a)Kelebihan
*Gratis
Kita sebagai pengguna dapat memanfaatkan R dengan bebas dan gratis.
Kita dapat dengan bebas menginstal, menggunakan, memperbarui,
mengkloning, memodifikasi, mendistribusikan ulang, bahkan menjualnya
kembali.
*Populer
Popularitas R dapat dilihat dari banyaknya penggunanya. Setelah
sempat mengalami penurunan pada tahun 2018-2019, R kembali menanjak
popularitasnya tahun 2020, dimungkinkan dengan adanya Covid-19. Menurut
Tiobe Index per Januari 2021, R menempati urutan ke-8, naik dari urutan
ke-18 pada bulan Januari 2020.
*Powerful Kemampuan yang datang dari packages
R memiliki banyak package yang lengkap dengan fungsi yang sangat
powerful. Misal package “caret” yang digunakan oleh para data scientist
untuk menjalankan machine learning.
*Kemampuan meng-handle berbagai macam data
R memiliki kemampuan untuk membaca berbagai macam data mulai dari
data, txt dan, csv,data excel, gambar, hingga data spasial baik format
vektor maupun raster. Selain itu, R juga banyak digunakan untuk
pemrosesa Big Data, yang semakin cepat karena R memiliki kemampuan
untuk memanfaatkan banyak core dari processor dan full penggunaan RAM
pada komputer.
b)Kekurangan
Jika bisa dibilang kelemahan, satu kelemahan dari R adalah sulit
dipelajari.Terutama, jika dibandingkan dengan software serupa yang
memiliki user interface berbasis mouse klik yang jauh lebih mudah
dioperasikan. Setiap perintah dijalankan dengan menulis kode, meskipun
dengan bantuan beberapa package, analisis dengan user interface yang
lebih friendly dapat dilakukan. Meskipun demikian, sekarang telah banyak
platform yang menyediakan kursus dan pelatihan R sehingga kita dapat
mempelajarinya dengan mudah. Ditambah dengan dukungan komunitas yang
dimiliki, proses belajar R menjadi semakin dan semakin mudah.
c.SQL (Structured Query Language)
Adalah salah satu yang paling populer di kalangan bidang data data
science. Hal ini digunakan baik untuk memberikan perintah dan mengedit
informasi yang tersimpan dalam database relasional. Dan juga, SQL
digunakan untuk menyimpan dan mengambil data selama beberapa dekade. Hal
ini digunakan untuk mengelola DataBase yang sangat besar, mempercepat
waktu koneksi ke server dalam hal pengambilan data. keterampilan SQL dapat
menjadi aset untuk ilmu pembelajaran mesin dan data, karena SQL adalah
keterampilan yang paling disukai untuk semua industri.
**a)Kelebihan
Memiliki kemampuan untuk management user dan tiap user bisa diatur hak
akses terhadap suatu database oleh database administrator.
Memiliki tingkat pengamanan/security data yang baik.
Memiliki kemampuan untuk back-up data, restore data dan recovery data.
Memiliki kemampuan untuk membuat database mirroring dan clustering.
Cocok untuk diterapkan pada pembangunan suatu program aplikasi, akan
mudah dalam melakukan koneksi dengan komputer klien yang pembangunan
aplikasinya menggunakan software yang sama platform dengan MSSQL,
misalnya Microsoft Visual Basic
**b)Kekurangan
Merupakan software berlisensi dan berharga mahal
Hanya bisa berjalan pada satu platform system operasi yaitu Microsoft
Windows.
Bahasa pemograman yang terbatas.
Tidak cocok untuk database skala besar.
Python, R, dan SQL Merupakan Bahasa Pemrograman yang Populer Untuk visualisasi data, R merupakan bahasa pemrograman yang tepat untuk digunakan. Sebab R punya cukup banyak packages yang sangat mendukung untuk membangun sebuah visualisasi yang cukup menarik. Misalnya saja, adanya ggplot2 yang digunakan untuk membuat grafik, lattice untuk menunjukkan hubungan dari variabel, dan rCharts untuk memunculkan visualisasi dari java script dengan menggunakan R.
Berbeda dengan Python, bahasa pemrograman ini membuat pekerjaan lebih mudah karena adanya IPython Notebook, yang dapat membagikan catatan kepada siapa saja tanpa meminta mereka mengunduh program. Python juga merupakan bahasa general yang mudah dipelajari dan dimengerti oleh banyak developer dan siap untuk digunakan ke dunia kerja.
Tidak seperti bahasa pemrograman lainnya yang membutuhkan pemahaman konseptual tingkat tinggi dan menghafal langkah-langkah yang diperlukan, SQL dipuji karena kesederhanaannya dengan menggunakan
```r
div.main-container {
max-width: 1280px;
}
.main-container {
max-width: 1280px;
}
div.tocify {
width: 20%;
max-width: 280px;
max-height: 85%;
}
.tocify {
border: 1px solid #50719447;
}
body {
text-align: justify
}
a {
color: #2f4b7c;
text-decoration: none;
}
p {
margin: 0 0 13px;
font-size: 1.1em;
font-family: "calibri", Garamond, 'Comic Sans MS';
}
.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
z-index: 2;
color: #ffffff;
background-color: #003f5c;
border-color: #2f4b7c;
}
.nav>li>a:hover, .nav>li>a:focus {
text-decoration: none;
background-color: #1a242f;
color: white;
}
.nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus {
color: #2c3e50;
background-color: #ffffff;
border: 1px solid #1a242f;
border-bottom-color: transparent;
cursor: default;
}
.nav-tabs {
border-bottom: 1px solid #1a242f;
}
.nav-pills li>a {
border: 2px solid #f47c3c40;
}
.nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus {
color: #ffffff;
background-color: #006b21c4;
}
.nav>li>a:hover, .nav>li>a:focus {
text-decoration: none;
background-color: #bbc1c78a;
color: #6f6f6f;
}
.tocify {
border: 1px solid #1a242f;
}
.tocify-extend-page {
height: 24px !important;
}
h1 {
font-size: 1.4em;
font-weight: bolder;
}
h2, h3 {
font-size: 1.2em;
font-weight: bolder;
}
h3 {
font-size: 1.1em;
font-weight: bolder;
}
h1.title {
font-size: 1.8em;
}
em {
color: #ff7c43;
margin-left: .5%;
margin-right: .5%;
font-weight: bold;
}
.date > em {
font-size: 0.8em;
}
h4.author > em {
color: white;
text-decoration: initial;
background: black;
border-radius: 6px;
padding: 6px 8px;
margin: 5% 0;
font-size: 0.8em;
}
code > span.kw {
color:#54b4eb;
}
p > code {
background-color: #ecf0f1!important;
padding: 0.2%;
margin: 0.2%;
font-weight: 500;
}
pre {
font-size: 16px;
background-color: #6f6f6f;
border: 1px solid #d2d2d2;
}
pre > code {
color: #656565;
}
code.sourceCode.r {
color: white;
}
code > span.ot {
color: #ef6d5f;
}
code > span.st {
color: #37982c;
}
code > span.dt {
color: #2f4b7c;
}
code > span.dv {
color: #2f4b7c;
}
code > span.fl {
color: #18bc9c;
}
#header:after {
content: " ";
display: block;
margin-top: 2%;
margin-bottom: 2%;
}
code span.kw {
color: #ff7c43;
}
img {
color: white;
font-style: italic;
padding: 2px;
text-align: center;
margin: 5px;
}
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3RydWt0dXIgRGF0YSINCnN1YnRpdGxlOiAiVHVnYXMgMSINCmF1dGhvcjogIk5vdmlhIEFuaXRhICgyMDIxNDUyMDAwOCkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KICAgIGNzczogc3R5bGUxLmNzcw0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KLS0tDQoNCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyNSUiIHNyYz0ibm92aWEuSlBHIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nb3VuaXYucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBub3ZpYWFsYmwwMkBnbWFpbC5jb20gPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20vbm92aWFhbml0YS8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiAgIFtGaXNpa2EgTWVkaXNdKGh0dHBzOi8vbWF0YW5hdW5pdmVyc2l0eS5hYy5pZC8/bHk9YWNhZGVtaWMmYz1zYikgPGJyPg0KQWRkcmVzcyAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgSmwuIENCRCBCYXJhdCBLYXYsIFJULjEsIEN1cnVnIFNhbmdlcmVuZywgS2VsYXBhIER1YSwgVGFuZ2VyYW5nLCBCYW50ZW4gMTU4MTAuDQoNCioqKioNCg0KIyBDYXJpbGFoIGRlZmluaXNpIEFsZ29yaXRtYSBkYW4gU3RydWt0dXIgRGF0YSBkYWxhbSBiZXJiYWdhaSBiaWRhbmcgaWxtdS4gDQoNCiAgKipKYXdhYmFuIDogKiogDQoNCiogYS5EZWZpbmlzaSBBbGdvcml0bWEgZGFuIFN0cnVrdHVyIERhdGEgYmVyZGFzYXJrYW4gYmlkYW5nIGlsbXUgU2FpbnMgRGF0YSANCiAgICAgIEFsZ29yaXRtYSBTdXBlcnZpc2VkIExlYXJuaW5nIGF0YXUgYWxnb3JpdG1hIHBlbWJlbGFqYXJhbiB0ZXJwYWR1DQogICAgbWVydXBha2FuIHN1YXR1IGFsZ29yaXRtYSBkaW1hbmEgZGF0YSB5YW5nIGRpZ3VuYWthbiBkYWxhbSBhbGdvcml0bWEgaW5pDQogICAgYWRhbGFoIGRhdGEgeWFuZyBtZW1pbGlraSBsYWJlbCBhdGF1IGtlbGFzLCBhcnRpbnlhIGFsZ29yaXRtYSBpbmkNCiAgICBtZW5naWRlbnRpZmlrYXNpIGZpdHVyIHNlY2FyYSBla3NwbGlzaXQgZGFuIG1lbXByZWRpa3NpIGF0YXUga2xhc2lmaWthc2kNCiAgICB5YW5nIHNlc3VhaS4gDQoNCiogYi5EZWZpbmlzaSBBbGdvcml0bWEgZGFuIFN0cnVrdHVyIERhdGEgYmVyZGFzYXJrYW4gYmlkYW5nIGlsbXUgRmlzaWthIA0KICAgICAgTWFtcHUgZGVuZ2FuIGplbGFzIG1lbmdnYW1iYXJrYW4gZGF0YS1kYXRhIHlhbmcgYWRhIGRhbiBodWJ1bmdhbm55YQ0KICAgIGRlbmdhbiBkYXRhLWRhdGEgeWFuZyBsYWluIGRlbmdhbiBpbnN0cnVrc2kgeWFuZyB0ZXBhdC4gDQoNCiogYy5EZWZpbmlzaSBBbGdvcml0bWEgZGFuIFN0cnVrdHVyIERhdGEgYmVyZGFzYXJrYW4gYmlkYW5nIGlsbXUgVGVrbmlrDQogICAgSW5mb3JtYXRpa2ENCiAgICAgIEFkYWxhaCBzdWF0dSBkYWZ0YXIgbGFuZ2thaCBkZW1pIGxhbmdrYWggeWFuZyB0ZXJoaW5nZ2EgZGFyaQ0KICAgIGludHJ1a3NpLWludHJ1a3NpIHlhbmcgdGVyZGVmaW5pc2lrYW4gZGVuZ2FuIGplbGFzIHlhbmcgZGlndW5ha2FuIHVudHVrDQogICAgbWVtZWNhaGthbiBwZXJtYXNhbGFoYW4gdGVydGVudHUuIA0KDQoqIGQuRGVmaW5pc2kgQWxnb3JpdG1hIGRhbiBTdHJ1a3R1ciBEYXRhIGJlcmRhc2Fya2FuIGJpZGFuZyBpbG11IFNpc3RlbQ0KICAgIEluZm9ybWFzaSANCiAgICAgIE1lcnVwYWthbiBsYW5na2FoIHBlbnllbGVzYWlhbiBzdWF0dSBtYXNhbGFoIHlhbmcgbWVuZ2hhc2lsa2FuIHNvbHVzaQ0KICAgIGRhbGFtIGJlbnR1ayBwcm9ncmFtIGtvbXB1dGVyLiANCg0KIyBTZWJhZ2FpIG1haGFzaXN3YSBidWF0bGFoIGFsZ29yaXRtYSBkYW4gZmxvd2NoYXJ0IHlhbmcgYW5kYSBsYWt1a2FuIHVudHVrIG1lbmNhcGFpIGtlbHVsdXNhbiBzYXJqYW5hIGRlbmdhbiBJUEsgbWluaW1hbCAzLjUgZGFyaSBVbml2ZXJzaXRhcyBNYXRhbmEgDQoNCiAgKipKYXdhYmFuIDoqKg0KDQogICAgKiphLkFsZ29yaXRtYSANCiAgICAgIO+DmCBNYWhhc2lzd2EgbWVuZ2lrdXRpIHBlcmt1bGlhaGFuIA0KICAgICAg74OYIE1lbmNhcmkgZGFzYXItZGFzYXIgbWF0ZXJpIHBlcmt1bGlhaGFuIA0KICAgICAg74OYIE1lbWJhY2EgbWF0ZXJpIHNlYmVsdW0gcGVya3VsaWFoYW4gZGltdWxhaSANCiAgICAgIO+DmCBBa3RpZiBiZXJ0YW55YSANCiAgICAgIO+DmCBNZW5ndWxhbmcgbWF0ZXJpIHNhYXQgc2FtcGFpIGRpcnVtYWggDQogICAgICDvg5ggTWVuZ2VyamFrYW4gdHVnYXMgeWFuZyBkaWJlcmlrYW4NCiAgICAgIO+DmCBNZW5ndW1wdWxrYW4gdHVnYXMgDQogICAgICDvg5ggTWVuZ2lrdXRpIG9yZ2FuaXNhc2kgdW50dWsgbWVuYW1iYWggbmlsYWkNCiAgICAgIO+DmCBNZW5naWt1dGkgb2xpbXBpYWRlIGFudGFyIGthbXB1cyANCiAgICAgIO+DmCBNZW5naWt1dGkgcHJha3Rpa3VtDQogICAgICDvg5ggQmVsYWphciBkZW5nYW4gZ2lhdCBzZWJlbHVtIHVqaWFuIHNlbWVzdGVyDQogICAgICDvg5ggTWVuamF3YWIgc29hbCB1amlhbiBzZW1lc3RlciBkZW5nYW4gdGVsaXRpDQogICAgICDvg5ggTWVsYWt1a2FuIHByYWt0aWsgcGVuZ2FsYW1hbiBsYXBhbmdhbi9wcGwNCiAgICAgIO+DmCBNZW5naWt1dGkgb2xpbXBpYWRlIGFudGFyIGthbXB1cw0KICAgICAg74OYIE1lbnl1c3VuIHNrcmlwc2kNCiAgICAgIO+DmCBNZWxha3VrYW4gdWppYW4gc2VtaW5hciBwcm9wb3NhbCANCiAgICAgIO+DmCBNZWxha3VrYW4gdWppYW4gc2VtaW5hciBoYXNpbA0KICAgICAg74OYIE1lbGFrdWthbiBzaWRhbmcgc2tyaXBzaQ0KICAgICAg74OYIFdpc3VkYSANCiAgIA0KICAgKipiLkZsb3djaGFydA0KIA0KYGBge3IgaW1hZ2UxLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJHYW1iYXIgMTogZmxvd2NoYXJ0IG1haGFzaXN3YSIsZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAnMTAwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyAoIkZsb3djaGFydC5KUEciKQ0KYGBgDQoNCiMgTWVuZ2FwYSBhbmRhIGhhcnVzIGJlbGFqYXIgQWxnb3JpdG1hIGRhbiBTdHJ1a3R1ciBEYXRhID8NCg0KICAgKipKYXdhYmFuIDoqKiANCiAgDQogIE1lbnVydXQgc2F5YSBiZWxhamFyIGFsZ29yaXRtYSBkYXBhdCBtZW5nYXNhaCBsb2dpa2Egc2F5YSBrYXJlbmEgYmFoYXNhDQpwZW1yb2dyYW1hbiBzYW5nYXQgbWVtYnV0dWhrYW4gbG9naWthLiBTZWRhbmdrYW4gdW50dWsgc3RydWt0dXIgZGF0YSBhZ2FyIHNheWENCm1hbXB1IG1lbWFoYW1pIHNpc3RlbSBwZW5nb3JnYW5pc2FzaWFuIGRhdGEgcGFkYSBtZW1vcmkgZGFuIGZpbGUgcGFkYSBtZWRpYQ0KcGVueWltcGFuYW4gZGF0YS4gDQogICAgIA0KIyBTZWJ1dGthbiAzIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIHBhbGluZyBiYW55YWsgZGlndW5ha2FuIGRhbGFtIFNhaW5zIERhdGEsIGJlcmlrYW4gcGVuamVsYXNhbiBrZWxlYmloYW4sIGtla3VyYW5nYW4sIGRhbiBodWJ1bmdhbiBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBzYXR1IGRlbmdhbiB5YW5nIGxhaW5ueWEuIA0KDQogICoqSmF3YWJhbiA6KiogDQogIA0KICAgICphLlB5dGhvbiANCiAgICAgICAgICBBZGFsYWggYmFoYXNhIHlhbmcgc2FuZ2F0IHBvcHVsZXIsIGRpbmFtaXMsIGRhbiBtZXJ1cGFrYW4gYmFoYXNhIHlhbmcgICAgICAgIGRpZ3VuYWthbiBzZWNhcmEgbHVhcyBkYWxhbSBrb211bml0YXMgc2FpbnMgZGF0YS4gQmFoYXNhIGluaSBhZGFsYWgNCiAgICAgICBiYWhhc2EgeWFuZyBzYW5nYXQgY29jb2sgdW50dWsgcGVtdWxhIGthcmVuYSBzaW50YWtzbnlhIHlhbmcgbXVkYWggZGFuDQogICAgICAgc2ltcGxlLiANCiAgICAqKmEpIEtlbGViaWhhbiANCiAgICAgICAgKk11ZGFoIGRpcGVsYWphcmkNCiAgICAgICAgICAgICAgRGliYW5kaW5nIGJhaGFzYSBwZW1yb2dyYW1hbiBsYWluLCBQaHl0b24gcmVsYXRpZiBsZWJpaCBtdWRhaCAgICAgICAgICAgICBkaXBlbGFqYXJpLiBCYWhhc2EgaW5pIG1lbWlsaWtpIHNpbnRha3Mtc2ludGFrcyB5YW5nIGN1a3VwDQogICAgICAgICBzZWRlcmhhbmEgZGFuIGdhbXBhbmcgZGltZW5nZXJ0aS4gQmFoYXNhIGluaSBzYW5nYXQgZGluYW1pcyBkYW4NCiAgICAgICAgIGRpYmFuZ3VuIGJlcmRhc2Fya2FuIHRpbmdrYXQga2V0ZXJiYWNhYW4ga29kZSB5YW5nIHRpbmdnaS4gDQogICAgICAgKk11ZGFoIGRpYXBsaWthc2lrYW4NCiAgICAgICAgICAgICAgS2VsZWJpaGFuIGxhaW5ueWEgZGFyaSBiYWhhc2EgcGVtcm9ncmFtYW4gUHl0aG9uIGFkYWxhaA0KICAgICAgICBrZW11ZGFoYW5ueWEgZGFsYW0gZGlhcGxpa2FzaWthbiBkYWxhbSBtZW5nZW1iYW5na2FuIHNlYnVhaCBwcm9kdWssDQogICAgICAgIGJhaWsgaXR1IHNpdHVzLHNvZnR3YXJlLCBhcGxpa2FzaSBzaXR1cywgbWF1cHVuIHZpZGVvIGdhbWUNCiAgICAgICAqRHVrdW5nIGxvVA0KICAgICAgICAgICAgICBCYWhhc2EgcGVtcm9ncmFtYW4gUHl0aG9uIG1lbmR1a3VuZyBla29zaXN0ZW0gSW50ZXJuZXQgb2YgVGhpbmdzDQogICAgICAgIChJb1QpIGRlbmdhbiBzYW5nYXQgYmFpay4gSW9UIHNlZGFuZyBtYXJhayBkaWJpY2FyYWthbiBhdGF1IGJhaGthbg0KICAgICAgICBkaWtlbWJhbmdrYW4gZGkga2FsYW5nYW4gbWFrZXIuIEludGVybmV0IG9mIFRoaW5ncyBtZXJ1cGFrYW4gc2VidWFoDQogICAgICAgIHRla25vbG9naSB5YW5nIG1lbmdodWJ1bmdrYW4gYmVuZGEtYmVuZGEgZGkgc2VraXRhciBraXRhIGtlIGRhbGFtDQogICAgICAgIHNlYnVhaCBqYXJpbmctamFyaW5nIHlhbmcgc2FsaW5nIHRlcmh1YnVuZy4gDQogICAgICAgKkZsZWtzaWJlbA0KICAgICAgICAgICAgIFByb2dyYW0geWFuZyBkaXR1bGlzIG1lbmdndW5ha2FuIFB5dGhvbiBkYXBhdCBkaWphbGFua2FuIGRpIGhhbXBpcg0KICAgICAgICBzZW11YSBzaXN0ZW0gb3BlcmFzaSAoVW5peCwgV2luZG93cywgTWFjIE9TIFgsIGRsbC4pLCB0ZXJtYXN1ayB1bnR1aw0KICAgICAgICBwZXJhbmdrYXQtcGVyYW5na2F0IHNlbHVsYXIuIA0KICAgICAgICpNZW5pbmdrYXRrYW4gcHJvZHVrdGl2aXRhcw0KICAgICAgICAgICAgS2FyZW5hIG1lbWlsaWtpIGxpYnJhcnkgeWFuZyBsdWFzIGRhbiBkZXNhaW4gYmVyb3JpZW50YXNpIG9iamVrDQogICAgICAgIHlhbmcgYmVyc2loLCBwZW5nZ3VuYWFuIGJhaGFzYSBwZW1yb2dyYW1hbiBQeXRob24gZGFwYXQgbWVudW5qYW5nIA0KICAgICAgICBwcm9kdWt0aXZpdGFzIHByb2dyYW1lciBkaWJhbmRpbmcgc2FhdCBtZW5nZ3VuYWthbiBiYWhhc2EgcGVtcm9ncmFtYW4NCiAgICAgICAgbGFpbiBzZXBlcnRpIEphdmEgZGFuIEMrKy4NCiAgICAgICAqRnJlZSBkYW4gb3BlbiBzb3VyY2UgDQogICAgICAgICAgICBUaWRhayBoYW55YSBkYXBhdCBkaXVuZHVoIHNlY2FyYSBncmF0aXMsIGJhaGFzYSBQeXRob24ganVnYQ0KICAgICAgICBkaWtlbWJhbmdrYW4gZGkgYmF3YWggbGlzZW5zaSBvcGVuIHNvdXJjZSB5YW5nIGRpc2V0dWp1aSBPU0ksIHlhbmcNCiAgICAgICAgYmVyYXJ0aSBiYWhhc2EgcGVtcm9ncmFtYW4gaW5pIGJlYmFzIHVudHVrIGRpZ3VuYWthbiwgZGlrZW1iYW5na2FuIGRhbg0KICAgICAgICBkaWRpc3RyaWJ1c2lrYW4sIHRlcm1hc3VrIHVudHVrIHR1anVhbiBrb21lcnNpYWwuIA0KICAgICAgICANCiAgICoqYikgS2VrdXJhbmdhbiAqKg0KICAgDQogICAgICAgKkt1cmFuZ255YSBkdWt1bmdhbiBtdWx0aXByb3Nlc29yDQogICAgICAgICAgIE11bHRpcHJvY2Vzc2luZyBhZGFsYWggYmFnaWFuIHBlbnRpbmcgZGFsYW0gcGVudWxpc2FuIGFwbGlrYXNpLiANCiAgICAgICAgUHl0aG9uIG1lbWFuZyBtZW5kdWt1bmcgbXVsdGlwcm9jZXNzaW5nLCBuYW11biBtdW5na2luIHRpZGFrDQogICAgICAgIHNlZmxla3NpYmVsIGF0YXUgc2VueWFtYW4gYmFoYXNhIGxhaW4uIEl0dSBzZWJhYm55YSBtdW5na2luIGluaSBkYXBhdA0KICAgICAgICBzZWRpa2l0IG1lbWJhdGFzaSBrYW11IHNhYXQgbWVudWxpcyBrb2RlLiANCiAgICAgICAqTGViaWggc2VkaWtpdCBkZXZlbG9wZXJzIHlhbmcgYmVycGVuZ2FsYW1hbg0KICAgICAgICAgICBTYWF0IGthbXUgbWVtYnVhdCBhcGxpa2FzaSwga2FtdSBwYXN0aSBpbmdpbiBwYXJhIGRldmVsb3BlciBwYWxpbmcNCiAgICAgICAgYmVycGVuZ2FsYW1hbiB5YW5nIG1lbGFrdWthbiBwZWtlcmphYW4gaXR1LiBOYW11biwgdGlkYWsgc2VzZWRlcmhhbmENCiAgICAgICAgaXR1IGRlbmdhbiBQeXRob24ga2FyZW5hIHRpZGFrIGJhbnlhayBhaGxpIHByb2dyYW1tZXIgeWFuZyBtZW5nZ3VuYWthbg0KICAgICAgICBiYWhhc2EgaW5pIHRlcnV0YW1hICBqaWthIGRpYmFuZGluZ2thbiBkZW5nYW4gSmF2YS4NCiAgICAgICAqVGlkYWsgaWRlYWwgdW50dWsgbWVtb3J5IGludGVuc2l2ZSB0YXNrDQogICAgICAgICAgIFB5dGhvbiBhZGFsYWggYmFoYXNhIHlhbmcgZGlrZW5hbCBkZW5nYW4gZmxla3NpYmlsaXRhcyB0aXBlIGRhdGFueWEuDQogICAgICAgIEhhbCBpbmkgbWVtYnVhdG55YSBtZW5naGFzaWxrYW4ga29uc3Vtc2kgbWVtb3JpIHlhbmcgY3VrdXAgdGluZ2dpIGRhbiANCiAgICAgICAgbWVuamFkaSB0aWRhayBueWFtYW4gZGlndW5ha2FuIHVudHVrIG1lbW9yeSBpbnRlbnNpdmUgdGFzay4gDQogICAgICAgKkt1cmFuZyBwb3B1bGVyIHVudHVrIG1vYmlsZSBhcHAgZGV2ZWxvcG1lbnQgDQogICAgICAgICAgIFB5dGhvbiBidWthbiBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBwb3B1bGVyIHVudHVrIG1vYmlsZQ0KICAgICAgICBkZXZlbG9wbWVudC4gSGFueWEgc2VkaWtpdCBwZXJ1c2FoYWFuIHlhbmcgbWVuZ2d1bmFrYW4gYmFoYXNhDQogICAgICAgIHBlbXJvZ3JhbWFuIGluaSB1bnR1ayB0dWp1YW4gdGVyc2VidXQuIEthcmVuYSBpdHUga2FtdSBqdWdhIGFrYW4gc3VsaXQNCiAgICAgICAgbWVuZW11a2FuICBkZXZlbG9wZXIgeWFuZyBiZXJwZW5nYWxhbWFuIGRhbGFtIG1vYmlsZSBkZXZlbG9wbWVudCB5YW5nDQogICAgICAgIG1lbmdndW5ha2FuIFB5dGhvbi4gDQogICAgICAgKkJhdGFzYW4gZGVzYWluIA0KICAgICAgICAgICBQeXRob24gZGlrZXRpayBzZWNhcmEgZGluYW1pcyBzZWhpbmdnYSBtZW1pbGlraSBiYW55YWsgYmF0YXNhbg0KICAgICAgICBkZXNhaW4uIFB5dGhvbiBiYWhrYW4gdGVybGloYXQgbWVtYnV0dWhrYW4gbGViaWggYmFueWFrIHdha3R1IHBlbmd1amlhbg0KICAgICAgICBkYW4gIGtlc2FsYWhhbiB5YW5nIG11bmN1bCBrZXRpa2EgYXBsaWthc2kgYWtoaXJueWEgZGlqYWxhbmthbi4gDQogICAgICAgKkJhdGFzYW4ga2VjZXBhdGFuDQogICAgICAgICAgIFB5dGhvbiBzZXJpbmcgZGlrcml0aWsga2FyZW5hIGtlY2VwYXRhbm55YSB5YW5nIGxlYmloIGxhbWJhdA0KICAgICAgICBkaWJhbmRpbmcgYmFoYXNhIHBlbXJvZ3JhbWFuIHlhbmcgZGlrb21waWxhc2kgc2VwZXJ0aSBDIGF0YXUgQysrIGthcmVuYQ0KICAgICAgICBtZXRvZGUgYmVyYmVkYSB5YW5nIGRpZ3VuYWthbm55YSB1bnR1ayBtZW5lcmplbWFoa2FuIGtvZGUuDQogICAgICAgIE1lc2tpIGJlZ2l0dSwgYmViZXJhcGEgYmVuY2htYXJrIFB5dGhvbiBiZWtlcmphIGxlYmloIGNlcGF0IGRhcmlwYWRhIEMNCiAgICAgICAgZGFuIEMrKy4gQmViZXJhcGEgbWFzYWxhaCB0ZXJrYWl0IGtlY2VwYXRhbiBiYWhhc2EgcGVtcm9ncmFtYW4gaW5pIGp1Z2ENCiAgICAgICAgdGVsYWggZGlhdGFzaSBkYW4gZGlvcHRpbWFsa2FuIHNlaGluZ2dhIFB5dGhvbiBiaXNhIGRpYmlsYW5nIHRldGFwDQogICAgICAgIG1lbmphZGkgc2FsYWggc2F0dSBwaWxpaGFuIHRlcmF0dXMgdW50dWsgcGVuZ2VtYmFuZ2FuIHBlcmFuZ2thdCBsdW5hay4gDQoNCiAgKmIuUiogDQogICAgICBBZGFsYWggc2FsYWggc2F0dSBhbGF0IHlhbmcgcGFsaW5nIHNlcmluZyBkaWd1bmFrYW4uIFIgYWRhbGFoIGJhaGFzYSBvcGVuDQogICBzb3VyY2UgZGFuIGxpbmdrdW5nYW4gcGVyYW5na2F0IGx1bmFrIHVudHVrIGtvbXB1dGFzaSBzdGF0aXN0aWsgZGFuIGdyYWZpcywNCiAgIHlhbmcgZGlkdWt1bmcgb2xlaCBSIFlheWFzYW4gS29tcHV0YXNpIFN0YXRpc3Rpa2EuIGtlYWhsaWFuIGluaSBtZW1pbGlraQ0KICAgcGVybWludGFhbiB0aW5nZ2kgZGkgc2VtdWEgcGVyZWtydXQgZGFsYW0gbWVzaW4gcGVtYmVsYWphcmFuIGRhbiBpbG11DQogICBwZW5nZXRhaHVhbiBkYXRhLg0KICAgDQogICAqKmEpS2VsZWJpaGFuKioNCiAgIA0KICAgICAgICpHcmF0aXMNCiAgICAgICAgICBLaXRhIHNlYmFnYWkgcGVuZ2d1bmEgZGFwYXQgbWVtYW5mYWF0a2FuIFIgZGVuZ2FuIGJlYmFzIGRhbiBncmF0aXMuDQogICAgICAgIEtpdGEgZGFwYXQgZGVuZ2FuIGJlYmFzIG1lbmdpbnN0YWwsIG1lbmdndW5ha2FuLCBtZW1wZXJiYXJ1aSwNCiAgICAgICAgbWVuZ2tsb25pbmcsIG1lbW9kaWZpa2FzaSwgbWVuZGlzdHJpYnVzaWthbiB1bGFuZywgYmFoa2FuIG1lbmp1YWxueWENCiAgICAgICAga2VtYmFsaS4gDQogICAgICAgKlBvcHVsZXIgDQogICAgICAgICAgUG9wdWxhcml0YXMgUiBkYXBhdCBkaWxpaGF0IGRhcmkgYmFueWFrbnlhIHBlbmdndW5hbnlhLiBTZXRlbGFoDQogICAgICAgIHNlbXBhdCBtZW5nYWxhbWkgcGVudXJ1bmFuIHBhZGEgdGFodW4gMjAxOC0yMDE5LCBSIGtlbWJhbGkgbWVuYW5qYWsNCiAgICAgICAgcG9wdWxhcml0YXNueWEgdGFodW4gMjAyMCwgZGltdW5na2lua2FuIGRlbmdhbiBhZGFueWEgQ292aWQtMTkuIE1lbnVydXQNCiAgICAgICAgVGlvYmUgSW5kZXggcGVyIEphbnVhcmkgMjAyMSwgUiBtZW5lbXBhdGkgdXJ1dGFuIGtlLTgsIG5haWsgZGFyaSB1cnV0YW4NCiAgICAgICAga2UtMTggcGFkYSBidWxhbiBKYW51YXJpIDIwMjAuDQogICAgICAgKlBvd2VyZnVsIEtlbWFtcHVhbiB5YW5nIGRhdGFuZyBkYXJpIHBhY2thZ2VzDQogICAgICAgICAgUiBtZW1pbGlraSBiYW55YWsgcGFja2FnZSB5YW5nIGxlbmdrYXAgZGVuZ2FuIGZ1bmdzaSB5YW5nIHNhbmdhdA0KICAgICAgICBwb3dlcmZ1bC4gTWlzYWwgcGFja2FnZSDigJxjYXJldOKAnSB5YW5nIGRpZ3VuYWthbiBvbGVoIHBhcmEgZGF0YSBzY2llbnRpc3QNCiAgICAgICAgdW50dWsgbWVuamFsYW5rYW4gbWFjaGluZSBsZWFybmluZy4NCiAgICAgICAqS2VtYW1wdWFuIG1lbmctaGFuZGxlIGJlcmJhZ2FpIG1hY2FtIGRhdGENCiAgICAgICAgICBSIG1lbWlsaWtpIGtlbWFtcHVhbiB1bnR1ayBtZW1iYWNhIGJlcmJhZ2FpIG1hY2FtIGRhdGEgbXVsYWkgZGFyaSANCiAgICAgICAgZGF0YSwgdHh0IGRhbiwgY3N2LGRhdGEgZXhjZWwsIGdhbWJhciwgaGluZ2dhIGRhdGEgc3Bhc2lhbCBiYWlrIGZvcm1hdA0KICAgICAgICB2ZWt0b3IgbWF1cHVuIHJhc3Rlci4gU2VsYWluIGl0dSwgUiBqdWdhIGJhbnlhayBkaWd1bmFrYW4gdW50dWsNCiAgICAgICAgcGVtcm9zZXNhIEJpZyBEYXRhLCB5YW5nIHNlbWFraW4gY2VwYXQga2FyZW5hIFIgbWVtaWxpa2kga2VtYW1wdWFuDQogICAgICAgIHVudHVrIG1lbWFuZmFhdGthbiBiYW55YWsgY29yZSBkYXJpIHByb2Nlc3NvciBkYW4gZnVsbCBwZW5nZ3VuYWFuIFJBTQ0KICAgICAgICBwYWRhIGtvbXB1dGVyLiANCg0KICAgKipiKUtla3VyYW5nYW4qKg0KICAgDQogICAgICAgICBKaWthIGJpc2EgZGliaWxhbmcga2VsZW1haGFuLCBzYXR1IGtlbGVtYWhhbiBkYXJpIFIgYWRhbGFoIHN1bGl0IA0KICAgICAgZGlwZWxhamFyaS5UZXJ1dGFtYSwgamlrYSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHNvZnR3YXJlIHNlcnVwYSB5YW5nDQogICAgICBtZW1pbGlraSB1c2VyIGludGVyZmFjZSBiZXJiYXNpcyBtb3VzZSBrbGlrIHlhbmcgamF1aCBsZWJpaCBtdWRhaA0KICAgICAgZGlvcGVyYXNpa2FuLiBTZXRpYXAgcGVyaW50YWggZGlqYWxhbmthbiBkZW5nYW4gbWVudWxpcyBrb2RlLCBtZXNraXB1bg0KICAgICAgZGVuZ2FuIGJhbnR1YW4gYmViZXJhcGEgcGFja2FnZSwgYW5hbGlzaXMgZGVuZ2FuIHVzZXIgaW50ZXJmYWNlIHlhbmcNCiAgICAgIGxlYmloIGZyaWVuZGx5IGRhcGF0IGRpbGFrdWthbi4gTWVza2lwdW4gZGVtaWtpYW4sIHNla2FyYW5nIHRlbGFoIGJhbnlhaw0KICAgICAgcGxhdGZvcm0geWFuZyBtZW55ZWRpYWthbiBrdXJzdXMgZGFuIHBlbGF0aWhhbiBSIHNlaGluZ2dhIGtpdGEgZGFwYXQNCiAgICAgIG1lbXBlbGFqYXJpbnlhIGRlbmdhbiBtdWRhaC4gRGl0YW1iYWggZGVuZ2FuIGR1a3VuZ2FuIGtvbXVuaXRhcyB5YW5nDQogICAgICBkaW1pbGlraSwgcHJvc2VzIGJlbGFqYXIgUiBtZW5qYWRpIHNlbWFraW4gZGFuIHNlbWFraW4gbXVkYWguIA0KDQogICpjLlNRTCAoU3RydWN0dXJlZCBRdWVyeSBMYW5ndWFnZSkqDQogIA0KICAgICAgICAgICAgQWRhbGFoIHNhbGFoIHNhdHUgeWFuZyBwYWxpbmcgcG9wdWxlciBkaSBrYWxhbmdhbiBiaWRhbmcgZGF0YSBkYXRhDQogICAgIHNjaWVuY2UuIEhhbCBpbmkgZGlndW5ha2FuIGJhaWsgdW50dWsgbWVtYmVyaWthbiBwZXJpbnRhaCBkYW4gbWVuZ2VkaXQNCiAgICAgaW5mb3JtYXNpIHlhbmcgdGVyc2ltcGFuIGRhbGFtIGRhdGFiYXNlIHJlbGFzaW9uYWwuIERhbiBqdWdhLCBTUUwNCiAgICAgZGlndW5ha2FuIHVudHVrIG1lbnlpbXBhbiBkYW4gbWVuZ2FtYmlsIGRhdGEgc2VsYW1hIGJlYmVyYXBhIGRla2FkZS4gSGFsDQogICAgIGluaSBkaWd1bmFrYW4gdW50dWsgbWVuZ2Vsb2xhIERhdGFCYXNlIHlhbmcgc2FuZ2F0IGJlc2FyLCBtZW1wZXJjZXBhdA0KICAgICB3YWt0dSBrb25la3NpIGtlIHNlcnZlciBkYWxhbSBoYWwgcGVuZ2FtYmlsYW4gZGF0YS4ga2V0ZXJhbXBpbGFuIFNRTCBkYXBhdA0KICAgICBtZW5qYWRpIGFzZXQgdW50dWsgaWxtdSBwZW1iZWxhamFyYW4gbWVzaW4gZGFuIGRhdGEsIGthcmVuYSBTUUwgYWRhbGFoDQogICAgIGtldGVyYW1waWxhbiB5YW5nIHBhbGluZyBkaXN1a2FpIHVudHVrIHNlbXVhIGluZHVzdHJpLg0KICAgICANCiAgICAgKiphKUtlbGViaWhhbiANCiAgICAgICAg74O8IE1lbWlsaWtpIGtlbWFtcHVhbiB1bnR1ayBtYW5hZ2VtZW50IHVzZXIgZGFuIHRpYXAgdXNlciBiaXNhIGRpYXR1ciBoYWsNCiAgICAgICAgICBha3NlcyB0ZXJoYWRhcCBzdWF0dSBkYXRhYmFzZSBvbGVoIGRhdGFiYXNlIGFkbWluaXN0cmF0b3IuDQogICAgICAgIO+DvCBNZW1pbGlraSB0aW5na2F0IHBlbmdhbWFuYW4vc2VjdXJpdHkgZGF0YSB5YW5nIGJhaWsuDQogICAgICAgIO+DvCBNZW1pbGlraSBrZW1hbXB1YW4gdW50dWsgYmFjay11cCBkYXRhLCByZXN0b3JlIGRhdGEgZGFuIHJlY292ZXJ5IGRhdGEuDQogICAgICAgIO+DvCBNZW1pbGlraSBrZW1hbXB1YW4gdW50dWsgbWVtYnVhdCBkYXRhYmFzZSBtaXJyb3JpbmcgZGFuIGNsdXN0ZXJpbmcuDQogICAgICAgIO+DvCBDb2NvayB1bnR1ayBkaXRlcmFwa2FuIHBhZGEgcGVtYmFuZ3VuYW4gc3VhdHUgcHJvZ3JhbSBhcGxpa2FzaSwgYWthbg0KICAgICAgICAgIG11ZGFoIGRhbGFtIG1lbGFrdWthbiBrb25la3NpIGRlbmdhbiBrb21wdXRlciBrbGllbiB5YW5nIHBlbWJhbmd1bmFuDQogICAgICAgICAgYXBsaWthc2lueWEgbWVuZ2d1bmFrYW4gc29mdHdhcmUgeWFuZyBzYW1hIHBsYXRmb3JtIGRlbmdhbiBNU1NRTCwNCiAgICAgICAgICBtaXNhbG55YSBNaWNyb3NvZnQgVmlzdWFsIEJhc2ljIA0KDQogICAgICAqKmIpS2VrdXJhbmdhbiANCiAgICAgICAgIO+DvCBNZXJ1cGFrYW4gc29mdHdhcmUgYmVybGlzZW5zaSBkYW4gYmVyaGFyZ2EgbWFoYWwNCiAgICAgICAgIO+DvCBIYW55YSBiaXNhIGJlcmphbGFuIHBhZGEgc2F0dSBwbGF0Zm9ybSBzeXN0ZW0gb3BlcmFzaSB5YWl0dSBNaWNyb3NvZnQNCiAgICAgICAgICAgV2luZG93cy4NCiAgICAgICAgIO+DvCBCYWhhc2EgcGVtb2dyYW1hbiB5YW5nIHRlcmJhdGFzLg0KICAgICAgICAg74O8IFRpZGFrIGNvY29rIHVudHVrIGRhdGFiYXNlIHNrYWxhIGJlc2FyLiANCg0KICBQeXRob24sIFIsIGRhbiBTUUwgTWVydXBha2FuIEJhaGFzYSBQZW1yb2dyYW1hbiB5YW5nIFBvcHVsZXINClVudHVrIHZpc3VhbGlzYXNpIGRhdGEsIFIgbWVydXBha2FuIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIHRlcGF0IHVudHVrIGRpZ3VuYWthbi4gU2ViYWIgUiBwdW55YSBjdWt1cCBiYW55YWsgcGFja2FnZXMgeWFuZyBzYW5nYXQgbWVuZHVrdW5nIHVudHVrIG1lbWJhbmd1biBzZWJ1YWggdmlzdWFsaXNhc2kgeWFuZyBjdWt1cCBtZW5hcmlrLiBNaXNhbG55YSBzYWphLCBhZGFueWEgZ2dwbG90MiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW1idWF0IGdyYWZpaywgbGF0dGljZSB1bnR1ayBtZW51bmp1a2thbiBodWJ1bmdhbiBkYXJpIHZhcmlhYmVsLCBkYW4gckNoYXJ0cyB1bnR1ayBtZW11bmN1bGthbiB2aXN1YWxpc2FzaSBkYXJpIGphdmEgc2NyaXB0IGRlbmdhbiBtZW5nZ3VuYWthbiBSLg0KDQpCZXJiZWRhIGRlbmdhbiBQeXRob24sIGJhaGFzYSBwZW1yb2dyYW1hbiBpbmkgbWVtYnVhdCBwZWtlcmphYW4gbGViaWggbXVkYWgga2FyZW5hIGFkYW55YSBJUHl0aG9uIE5vdGVib29rLCB5YW5nIGRhcGF0IG1lbWJhZ2lrYW4gY2F0YXRhbiBrZXBhZGEgc2lhcGEgc2FqYSB0YW5wYSBtZW1pbnRhIG1lcmVrYSBtZW5ndW5kdWggcHJvZ3JhbS4gUHl0aG9uIGp1Z2EgbWVydXBha2FuIGJhaGFzYSBnZW5lcmFsIHlhbmcgbXVkYWggZGlwZWxhamFyaSBkYW4gZGltZW5nZXJ0aSBvbGVoIGJhbnlhayBkZXZlbG9wZXIgZGFuIHNpYXAgdW50dWsgZGlndW5ha2FuIGtlIGR1bmlhIGtlcmphLg0KDQpUaWRhayBzZXBlcnRpIGJhaGFzYSBwZW1yb2dyYW1hbiBsYWlubnlhIHlhbmcgbWVtYnV0dWhrYW4gcGVtYWhhbWFuIGtvbnNlcHR1YWwgdGluZ2thdCB0aW5nZ2kgZGFuIG1lbmdoYWZhbCBsYW5na2FoLWxhbmdrYWggeWFuZyBkaXBlcmx1a2FuLCBTUUwgZGlwdWppIGthcmVuYSBrZXNlZGVyaGFuYWFubnlhIGRlbmdhbiBtZW5nZ3VuYWthbiANCmBgYA0KDQoNCmBgYHtyIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0NCmRpdi5tYWluLWNvbnRhaW5lciB7DQogIG1heC13aWR0aDogMTI4MHB4Ow0KfQ0KDQoubWFpbi1jb250YWluZXIgew0KICBtYXgtd2lkdGg6IDEyODBweDsNCn0NCg0KZGl2LnRvY2lmeSB7DQogIHdpZHRoOiAyMCU7DQogIG1heC13aWR0aDogMjgwcHg7DQogIG1heC1oZWlnaHQ6IDg1JTsNCn0NCg0KLnRvY2lmeSB7DQogIGJvcmRlcjogMXB4IHNvbGlkICM1MDcxOTQ0NzsNCn0NCg0KYm9keSB7DQogIHRleHQtYWxpZ246IGp1c3RpZnkNCiAgDQp9DQoNCmEgew0KICBjb2xvcjogIzJmNGI3YzsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCnAgew0KICBtYXJnaW46IDAgMCAxM3B4Ow0KICBmb250LXNpemU6IDEuMWVtOw0KICBmb250LWZhbWlseTogImNhbGlicmkiLCBHYXJhbW9uZCwgJ0NvbWljIFNhbnMgTVMnOw0KfQ0KDQoubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIHsNCiAgei1pbmRleDogMjsNCiAgY29sb3I6ICNmZmZmZmY7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwM2Y1YzsNCiAgICBib3JkZXItY29sb3I6ICMyZjRiN2M7DQp9DQoNCi5uYXY+bGk+YTpob3ZlciwgLm5hdj5saT5hOmZvY3VzIHsNCiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWEyNDJmOw0KICAgIGNvbG9yOiB3aGl0ZTsNCn0NCg0KLm5hdi10YWJzPmxpLmFjdGl2ZT5hLCAubmF2LXRhYnM+bGkuYWN0aXZlPmE6aG92ZXIsIC5uYXYtdGFicz5saS5hY3RpdmU+YTpmb2N1cyB7DQogIGNvbG9yOiAjMmMzZTUwOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgYm9yZGVyOiAxcHggc29saWQgIzFhMjQyZjsNCiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7DQogIGN1cnNvcjogZGVmYXVsdDsNCn0NCg0KLm5hdi10YWJzIHsNCiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxYTI0MmY7DQp9DQoNCi5uYXYtcGlsbHMgbGk+YSB7DQogIA0KICBib3JkZXI6IDJweCBzb2xpZCAjZjQ3YzNjNDA7DQp9DQoNCi5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6aG92ZXIsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6Zm9jdXMgew0KICBjb2xvcjogI2ZmZmZmZjsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2YjIxYzQ7DQp9DQoNCi5uYXY+bGk+YTpob3ZlciwgLm5hdj5saT5hOmZvY3VzIHsNCiAgDQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2JiYzFjNzhhOw0KICAgIGNvbG9yOiAjNmY2ZjZmOw0KfQ0KDQoudG9jaWZ5IHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzFhMjQyZjsNCn0NCg0KLnRvY2lmeS1leHRlbmQtcGFnZSB7DQogIGhlaWdodDogMjRweCAhaW1wb3J0YW50Ow0KfQ0KDQpoMSB7DQogIGZvbnQtc2l6ZTogMS40ZW07DQogIGZvbnQtd2VpZ2h0OiBib2xkZXI7DQp9DQoNCmgyLCBoMyB7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGZvbnQtd2VpZ2h0OiBib2xkZXI7DQp9DQoNCmgzIHsNCiAgZm9udC1zaXplOiAxLjFlbTsNCiAgZm9udC13ZWlnaHQ6IGJvbGRlcjsNCn0NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDEuOGVtOw0KfQ0KDQoNCmVtIHsNCiAgY29sb3I6ICNmZjdjNDM7DQogICAgbWFyZ2luLWxlZnQ6IC41JTsNCiAgbWFyZ2luLXJpZ2h0OiAuNSU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQouZGF0ZSA+IGVtIHsNCiAgZm9udC1zaXplOiAwLjhlbTsNCn0NCg0KaDQuYXV0aG9yID4gZW0gew0KICBjb2xvcjogd2hpdGU7DQogIHRleHQtZGVjb3JhdGlvbjogaW5pdGlhbDsNCiAgYmFja2dyb3VuZDogYmxhY2s7DQogIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgcGFkZGluZzogNnB4IDhweDsNCiAgbWFyZ2luOiA1JSAwOw0KICBmb250LXNpemU6IDAuOGVtOw0KfQ0KDQpjb2RlID4gc3Bhbi5rdyB7DQogIGNvbG9yOiM1NGI0ZWI7DQp9DQoNCg0KcCA+IGNvZGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmMGYxIWltcG9ydGFudDsNCiAgICBwYWRkaW5nOiAwLjIlOw0KICBtYXJnaW46IDAuMiU7DQogIGZvbnQtd2VpZ2h0OiA1MDA7DQp9DQoNCnByZSB7DQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGJhY2tncm91bmQtY29sb3I6ICM2ZjZmNmY7DQogICAgYm9yZGVyOiAxcHggc29saWQgI2QyZDJkMjsNCn0NCg0KcHJlID4gY29kZSB7DQogIGNvbG9yOiAjNjU2NTY1Ow0KfQ0KDQpjb2RlLnNvdXJjZUNvZGUuciB7DQogIGNvbG9yOiB3aGl0ZTsNCn0NCg0KY29kZSA+IHNwYW4ub3Qgew0KICBjb2xvcjogI2VmNmQ1ZjsNCn0NCg0KY29kZSA+IHNwYW4uc3Qgew0KICBjb2xvcjogIzM3OTgyYzsNCn0NCg0KY29kZSA+IHNwYW4uZHQgew0KICBjb2xvcjogIzJmNGI3YzsNCn0NCg0KY29kZSA+IHNwYW4uZHYgew0KICBjb2xvcjogIzJmNGI3YzsNCn0NCg0KY29kZSA+IHNwYW4uZmwgew0KICBjb2xvcjogIzE4YmM5YzsNCn0NCg0KI2hlYWRlcjphZnRlciB7DQpjb250ZW50OiAiICI7DQpkaXNwbGF5OiBibG9jazsNCm1hcmdpbi10b3A6IDIlOw0KbWFyZ2luLWJvdHRvbTogMiU7DQp9DQoNCg0KY29kZSBzcGFuLmt3IHsNCiAgY29sb3I6ICNmZjdjNDM7DQp9DQoNCmltZyB7DQogIGNvbG9yOiB3aGl0ZTsNCiAgZm9udC1zdHlsZTogaXRhbGljOw0KICBwYWRkaW5nOiAycHg7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgbWFyZ2luOiA1cHg7DQp9DQoNCmBgYA0KDQoNCg0KDQojIFJlZmVyZW5zaQ0KDQoqIFtSZWZlcmVuc2kgMV0oaHR0cHM6Ly93d3cuZHFsYWIuaWQva2VuYWxpLTMtYWxnb3JpdG1hLWRhbGFtLWRhdGEtc2NpZW5jZWh0dHBzOi8vd3d3LmRxbGFiLmlkL2tlbmFsaS0zLWFsZ29yaXRtYS1kYWxhbS1kYXRhLXNjaWVuY2UpDQoqIFtSZWZlcmVuc2kgMl0oaHR0cHM6Ly93d3cuZHFsYWIuaWQvbWVuZ2VuYWwtcGVyYmVkYWFuLXItcHl0aG9uLWRhbi1zcWwpDQoqIFtSZWZlcmVuc2kgM10oaHR0cHM6Ly93d3cucm9iYnlqdW5nanVuYW4uY29tLzIwMjAvMDMvYmFoYXNhLXBlbW9ncmFtYW4tdW50dWstZGF0YS1zY2llbmNlLmh0bWw/bT0xKQ0KKiBbUmVmZXJlbnNpIDRdKGh0dHBzOi8vd3d3LmVrcnV0LmNvbS9tZWRpYS80LWtlbGViaWhhbi1iYWhhc2EtcGVtcm9ncmFtYW4tcHl0aG9uKQ0KKiBbUmVmZXJlbnNpIDVdKGh0dHBzOi8vZ2Vvc3Bhc2lhbGlzLmNvbS9rZWxlYmloYW4ta2VrdXJhbmdhbi1yLykNCg0KDQoNCg==