Email             :
RPubs            : https://rpubs.com/valensiusjimy/
Jurusan          : Statistika
Address         : Jalan Promoter 41, Lengkong Gudang Timur,
                         Tanggerang Selatan, BANTEN. 15321


R

  R adalah bahasa yang digunakan dalam komputasi statistik yang pertama kali dikembangakan oleh Ross Ihaka dan Robert Gentlement di University of Auckland, New Zealand.

  Saat ini R menjadi salah satu software yang bersifat gratis dan memiliki banyak paket didalamnya yang memudahkan dalam penggunaannya. Hal ini membuat R menjadi sangat populer dan eksis dikalangan orang banyak, terutama di Indonesia.

  Bahasa R banyak digunakan oleh para analisa data dikarenakan memiliki paket lengkap untuk mendukung penglolahan data, membuatnya menjadi sangat cocok dan mendukung untuk bidang statistika atau analisis data.

 Di dalam menggunakan bahasa R banyak sekali hal yang dapat kita lakukan, terutama dalam bidang mengolah angka dan data. Berbagai operator aritmatika dan sintaks dasar lainnya dapat kita lakukan juga dengan bahasa R ini. Maka dari itu, bahasa R sangat diminati oleh orang banyak. Namun, dibalik kelebihan tersebut ada pula kekurangan di dalam bahasa R. sebagai berikut saya akan berikan contoh kelebihan dan kekurangan bahasa R

Kelebihan dan Kekurangan R

Sebagai berikut saya akan berikan contoh kelebihan dan kekurangan bahasa R :

Kelebihan

  • Memiliki banyak library
  • Kualitas visualisasi grafik yang tinggi
  • Gratis dan memiliki kualitas baik

Kekurangan

  • Menjadi tergantung pada library
  • Bahasa tingkat tinggi, jadi harus
      dipelajari dengan serius dan teliti
  • Kurang cocok untuk pengembangan
      aplikasi

Sintaks Dasar

  Dalam penggunaan bahasa R, kita harus pahami bahwa ada 3 hal dasar yang harus kita cermati dalam penggunaannya, yaitu Variabel, Operan, dan Komentar.

Variabel

  Kita membutuhkan suatu variabel yang dicadangkan untuk dapat merekam berbagai jenis data sesuai nama yang diberikan ke tempat penyimpanan. Dalam menjalankan perintah atau intrupsi variabel ini, terdapat 3 cara untuk menotasikannya :

  • =   :   untuk penugasan sederhana
  • <-   :   untuk penugasan dari sisi kiri
  • ->   :   untuk penugasan dari sisi kanan
p = 4
q <- 6
9 -> r
print(c(p,q,r))
## [1] 4 6 9

Komentar

  Dalam membuat skrip atau koding R kita dapat menambahkan komentar dengan tujuan untuk memudahkan dalam mengartikan suatu penggunaan perintah atau code. Komentar yang ditulis bersifat penjelasan tentang apa yang dilakukan sebuah skrip atau koding. Pada umumnya, komentar dituliskan pada satu baris yang tersedia di R, dengan menggunakan # di awal maupun akhir suatu statement.

p = 10      # Mengganti nilai P yang sudah direkam (komentar diakhir pernyataan)
# Mengganti nilai r yang sudah direkam (komentar di awal pernyataan)
p + q -> r 

Operator

  Operator melakukan berbagai operasi matematika, logika, dan keputusan yang dilakukan pada sekumpulan bilangan Komplek, Integer, ataupun Numerik sebagai suatu perintah. Dalam menjalankan operator ini, kita menggunakan suatu simbol untuk melakukan suatu perintah. Sebagai contoh kita akan membuat suatu perintah untuk menjalankan aritmatika, logika, dan lainnya. Sebagai berikut.

Aritmatika

  Kita semua pasti sudah tahu dan mengenal perihal operasi matematika, seperti halnya penjumlahan, pengurangan, perkalian, pembagian, dan juga modulo atau sisa bagi. Berikut akan saya berikan operator matematika dan simbol yang digunakan di dalam R :

Operator Simbol
Penjumlahan +
Pengurangan -
Perkalian *
Pembagian /
Modulo %%

  untuk penggunaan simbol di atas, kita dapat gunakan seperti berikut ini, mohon di simak baik-baik yaa :)

p <- c(1,3,5) # memuat vektor p
q <- c(2,4,6) # memuat vektor q


Penjumlahan di R

print (p+q)    # hasil penjumlahan p + q
## [1]  3  7 11


Pengurangan di R

print (p-q)    # hasil pengurangan p - q
## [1] -1 -1 -1


Perkalian di R

print (p*q)    # hasil perkalian p dan q
## [1]  2 12 30


Pembagian di R

print (p/q)    # hasil pembagian p dan q
## [1] 0.5000000 0.7500000 0.8333333


Modulo di R

print (p%%q)   # sisa bagi p dan q
## [1] 1 3 5


  Kita juga dapat melakukannya seperti berikut.

cat("Penjumlahan p dan q :", p + q, "\n")
## Penjumlahan p dan q : 3 7 11
cat("Pengurangan p dan q :", p - q, "\n")
## Pengurangan p dan q : -1 -1 -1
cat("Perkalian p dan q :", p * q, "\n")
## Perkalian p dan q : 2 12 30
cat("Pembagian p dan q :", p / q, "\n")
## Pembagian p dan q : 0.5 0.75 0.8333333
cat("Modulo p dan q :", p %% q, "\n")
## Modulo p dan q : 1 3 5

Relasional

  Kita dapat melakukan operasi perbandingan antara elemen yang bersangkutan pada setiap nilai dengan menggunakan Operator Relasional ini. Pada operator ini akan membuktikan suatu pernyataan melalui intrupsi true atau false. Adapun operator atau simbol yang kita gunakan untuk mengoperasikan Relasional ini, yaitu sebagai berikut :

Operator Simbol di R
kurang dari <
kurang dari sama dengan <=
lebih dari >
lebih dari sama dengan >=
sama dengan ==
tidak sama dengan !=

  Kita dapat aplikasin operator relasional tersebut menjadi sebagai berikut.


cat("p kurang dari q:", p < q, "\n")
## p kurang dari q: TRUE TRUE TRUE
cat("p kurang dari sama dengan q:", p <= q, "\n")
## p kurang dari sama dengan q: TRUE TRUE TRUE
cat("p lebih dari q:", p > q, "\n")
## p lebih dari q: FALSE FALSE FALSE
cat("p lebih dari sama dengan q:", p >= q, "\n")
## p lebih dari sama dengan q: FALSE FALSE FALSE
cat("p sama dengan q:", p == q, "\n")
## p sama dengan q: FALSE FALSE FALSE
cat("p tidak sama dengan q:", p != q, "\n")
## p tidak sama dengan q: TRUE TRUE TRUE

Logika

  Dalam kita mengalisa data pastinya kita harus menentukan mana yang Benar dan Salah. Maka dari itu, kita juga membutuhkan operasi logika yang memiliki fungsi untuk menyelesaikan suatu operasi bernilai sebuah keputusan. Operasi ini dapat bekerja dengan tentuin dari nilai, lalu dievaluasi ke nilai Boolean. Berikut saya berikan contoh Operator yang digunakan dalam operasi logika di bahasa R :

Operator Simbol di R
NOT !
AND &
OR
XOR ^

  Berikut contoh pengaplikasiannya :


p <- c(TRUE,0.3,2i+3)
q <- c(0,TRUE,FALSE)
cat("logika NOT untuk p:", !p, "\n")
## logika NOT untuk p: FALSE FALSE FALSE
cat("logika NOT untuk q:", !q, "\n")
## logika NOT untuk q: TRUE FALSE TRUE
cat("logika AND untuk  :", p & q, "\n")
## logika AND untuk  : FALSE TRUE FALSE
cat("logika OR  untuk  :", p | q, "\n")
## logika OR  untuk  : TRUE TRUE TRUE
cat("logika XOR untuk  :", xor(p,q), "\n")
## logika XOR untuk  : TRUE FALSE TRUE

Lain - lain

  Selain banyaknya operator di atas yang sudah saya coba praktikan, dalam bahasa R juga ada beberapa operator lain yang kita harus ketahui. Karena operator ini sering kita temui dalam analisa numerik maupun statistika, yaitu pengakaran, logaritma, eksponen, dan sifat komutatif. Maka dari itu, saya mencoba mempraktikannya, sebagai berikut :


p <- c(1,3,5)
q <- c(2,4,6)
cat("Nilai Akar :", sqrt(p*q),"\n")
## Nilai Akar : 1.414214 3.464102 5.477226
cat("Nilai Logaritma :", log(p), "\n")
## Nilai Logaritma : 0 1.098612 1.609438
cat("Nilai Eksponen  :", exp(q), "\n")
## Nilai Eksponen  : 7.389056 54.59815 403.4288
cat("Sifat Komutatif :", (p/q) + p, "\n")
## Sifat Komutatif : 1.5 3.75 5.833333

Tipe Data

  Mungkin diantara kita pernah mendengar kata String ataupun Boolean ketika sedang belajar tentang bahasa pemrograman atau html dasar di mata pelajaran sekolah. Nah, String ataupun Boolean itu ternyata merupakan suatu yang disebut TIPE DATA. Tipe Data sangat penting untuk kita pahami dan gunakan, karena dengan tipe data kita dapat menggunakan sebuah variabel tertentu untuk menyimpan tipe yang berbeda. Berikut ini saya berikan contoh Tipe Data yang umum harus kita pahami dan kenali dan contohnya :

Tipe Data R Keterangan
Double 1,2 bilangan desimal
Integer 7 bilangan bulat
Boolean TRUE/FALSE untuk menentukan suatu keputusan benar atau salah
String “Bang Jeki” suatu karakter dengan tanda " atau ’
Kompleks 3 + 4i angka real dan imajiner

Berikut contoh pengaplikasiannya :


d1 = 1.2
d2 = 5
d3 = 9 + 7i
cat("Nama Kelas Variabel :", class(d1),"\n")
## Nama Kelas Variabel : numeric
cat("Nama Kelas Variabel :", class(d2),"\n")
## Nama Kelas Variabel : numeric
cat("Tipe Variabel       :", typeof (d1),"\n")
## Tipe Variabel       : double
cat("Tipe Variabel       :", typeof (d3),"\n")
## Tipe Variabel       : complex

Bantuan

  Dalam menggunakan bahasa R kita difasilitasi dengan yang namanya in-line untuk mencari sebuah bantuan informasi tertentu. Berikut operator yang dapat dibuat :

help.start()           # menavigasi bantuan lokal
?help                  # menavigasi bantuan lokal
?class                 # mendapat bantuan fungsi class
help(class)            # mendapat bantuan fungsi class
??class                # mencari tahu fungsi class 
help.search('class')   # mencari tahu nama fungsi
LS0tDQp0aXRsZTogIlBlbmdlbmFsYW4gRGFzYXIgUiINCnN1YnRpdGxlOiAiVHVnYXMgMiINCmF1dGhvcjogIlZhbGVuc2l1cyBKaW15ICgyMDIxNDkyMDAwNSkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogc2FuZHN0b25lDQogICAgY3NzOiBzdHlsZTEuY3NzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQotLS0NCg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjI1JSIgc3JjPSJteWZvdG8uanBnIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWF0YW5hLnBuZyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgdmFsZW5zaXVzamlteTI3QGdtYWlsLmNvbSA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS92YWxlbnNpdXNqaW15LyA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEphbGFuIFByb21vdGVyIDQxLCBMZW5na29uZyBHdWRhbmcgVGltdXIsIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IFRhbmdnZXJhbmcgU2VsYXRhbiwgQkFOVEVOLiAxNTMyMQ0KDQoqKioqDQoNCiMgUiANCg0KJm5ic3A7IFIgYWRhbGFoIGJhaGFzYSB5YW5nIGRpZ3VuYWthbiBkYWxhbSBrb21wdXRhc2kgc3RhdGlzdGlrIHlhbmcgcGVydGFtYSBrYWxpIGRpa2VtYmFuZ2FrYW4gb2xlaCBSb3NzIEloYWthIGRhbiBSb2JlcnQgR2VudGxlbWVudCBkaSBVbml2ZXJzaXR5IG9mIEF1Y2tsYW5kLCBOZXcgWmVhbGFuZC4gDQoNCiZuYnNwOyBTYWF0IGluaSBSIG1lbmphZGkgc2FsYWggc2F0dSBzb2Z0d2FyZSB5YW5nIGJlcnNpZmF0IGdyYXRpcyBkYW4gbWVtaWxpa2kgYmFueWFrIHBha2V0IGRpZGFsYW1ueWEgeWFuZyBtZW11ZGFoa2FuIGRhbGFtIHBlbmdndW5hYW5ueWEuIEhhbCBpbmkgbWVtYnVhdCBSIG1lbmphZGkgc2FuZ2F0IHBvcHVsZXIgZGFuIGVrc2lzIGRpa2FsYW5nYW4gb3JhbmcgYmFueWFrLCB0ZXJ1dGFtYSBkaSBJbmRvbmVzaWEuIA0KDQombmJzcDsgQmFoYXNhIFIgYmFueWFrIGRpZ3VuYWthbiBvbGVoIHBhcmEgYW5hbGlzYSBkYXRhIGRpa2FyZW5ha2FuIG1lbWlsaWtpIHBha2V0IGxlbmdrYXAgdW50dWsgbWVuZHVrdW5nIHBlbmdsb2xhaGFuIGRhdGEsIG1lbWJ1YXRueWEgbWVuamFkaSBzYW5nYXQgY29jb2sgZGFuIG1lbmR1a3VuZyB1bnR1ayBiaWRhbmcgc3RhdGlzdGlrYSBhdGF1IGFuYWxpc2lzIGRhdGEuDQoNCiZuYnNwO0RpIGRhbGFtIG1lbmdndW5ha2FuIGJhaGFzYSBSIGJhbnlhayBzZWthbGkgaGFsIHlhbmcgZGFwYXQga2l0YSBsYWt1a2FuLCB0ZXJ1dGFtYSBkYWxhbSBiaWRhbmcgbWVuZ29sYWggYW5na2EgZGFuIGRhdGEuIEJlcmJhZ2FpIG9wZXJhdG9yIGFyaXRtYXRpa2EgZGFuIHNpbnRha3MgZGFzYXIgbGFpbm55YSBkYXBhdCBraXRhIGxha3VrYW4ganVnYSBkZW5nYW4gYmFoYXNhIFIgaW5pLiBNYWthIGRhcmkgaXR1LCBiYWhhc2EgUiBzYW5nYXQgZGltaW5hdGkgb2xlaCBvcmFuZyBiYW55YWsuIE5hbXVuLCBkaWJhbGlrIGtlbGViaWhhbiB0ZXJzZWJ1dCBhZGEgcHVsYSBrZWt1cmFuZ2FuIGRpIGRhbGFtIGJhaGFzYSBSLiBzZWJhZ2FpIGJlcmlrdXQgc2F5YSBha2FuIGJlcmlrYW4gY29udG9oIGtlbGViaWhhbiBkYW4ga2VrdXJhbmdhbiBiYWhhc2EgUg0KDQojIyBLZWxlYmloYW4gZGFuIEtla3VyYW5nYW4gUnsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpTZWJhZ2FpIGJlcmlrdXQgc2F5YSBha2FuIGJlcmlrYW4gY29udG9oIGtlbGViaWhhbiBkYW4ga2VrdXJhbmdhbiBiYWhhc2EgUiA6DQoNCiMjIyBLZWxlYmloYW4NCg0KKiBNZW1pbGlraSBiYW55YWsgbGlicmFyeSANCiogS3VhbGl0YXMgdmlzdWFsaXNhc2kgZ3JhZmlrIHlhbmcgdGluZ2dpDQoqIEdyYXRpcyBkYW4gbWVtaWxpa2kga3VhbGl0YXMgYmFpaw0KDQojIyMgS2VrdXJhbmdhbg0KDQoqIE1lbmphZGkgdGVyZ2FudHVuZyBwYWRhIGxpYnJhcnkNCiogQmFoYXNhIHRpbmdrYXQgdGluZ2dpLCBqYWRpIGhhcnVzPGJyPiAmbmJzcDsgZGlwZWxhamFyaSBkZW5nYW4gc2VyaXVzIGRhbiB0ZWxpdGkNCiogS3VyYW5nIGNvY29rIHVudHVrIHBlbmdlbWJhbmdhbjxicj4gJm5ic3A7IGFwbGlrYXNpDQoNCg0KIyBTaW50YWtzIERhc2FyIA0KDQombmJzcDsgRGFsYW0gcGVuZ2d1bmFhbiBiYWhhc2EgUiwga2l0YSBoYXJ1cyBwYWhhbWkgYmFod2EgYWRhIDMgaGFsIGRhc2FyIHlhbmcgaGFydXMga2l0YSBjZXJtYXRpIGRhbGFtIHBlbmdndW5hYW5ueWEsIHlhaXR1IFZhcmlhYmVsLCBPcGVyYW4sIGRhbiBLb21lbnRhci4gDQoNCiMjIFZhcmlhYmVsIA0KDQombmJzcDsgS2l0YSBtZW1idXR1aGthbiBzdWF0dSB2YXJpYWJlbCB5YW5nIGRpY2FkYW5na2FuIHVudHVrIGRhcGF0IG1lcmVrYW0gYmVyYmFnYWkgamVuaXMgZGF0YSBzZXN1YWkgbmFtYSB5YW5nIGRpYmVyaWthbiBrZSB0ZW1wYXQgcGVueWltcGFuYW4uIERhbGFtIG1lbmphbGFua2FuIHBlcmludGFoIGF0YXUgaW50cnVwc2kgdmFyaWFiZWwgaW5pLCB0ZXJkYXBhdCAzIGNhcmEgdW50dWsgbWVub3Rhc2lrYW5ueWEgOiANCg0KKiBgPWAgJm5ic3A7IDogJm5ic3A7IHVudHVrIHBlbnVnYXNhbiBzZWRlcmhhbmENCiogYDwtYCAmbmJzcDsgOiAmbmJzcDsgdW50dWsgcGVudWdhc2FuIGRhcmkgc2lzaSBraXJpDQoqIGAtPmAgJm5ic3A7IDogJm5ic3A7IHVudHVrIHBlbnVnYXNhbiBkYXJpIHNpc2kga2FuYW4NCg0KYGBge3J9DQpwID0gNA0KcSA8LSA2DQo5IC0+IHINCnByaW50KGMocCxxLHIpKQ0KYGBgDQoNCg0KIyMgS29tZW50YXINCg0KJm5ic3A7IERhbGFtIG1lbWJ1YXQgc2tyaXAgYXRhdSBrb2RpbmcgUiBraXRhIGRhcGF0IG1lbmFtYmFoa2FuIGtvbWVudGFyIGRlbmdhbiB0dWp1YW4gdW50dWsgbWVtdWRhaGthbiBkYWxhbSBtZW5nYXJ0aWthbiBzdWF0dSBwZW5nZ3VuYWFuIHBlcmludGFoIGF0YXUgY29kZS4gS29tZW50YXIgeWFuZyBkaXR1bGlzIGJlcnNpZmF0IHBlbmplbGFzYW4gdGVudGFuZyBhcGEgeWFuZyBkaWxha3VrYW4gc2VidWFoIHNrcmlwIGF0YXUga29kaW5nLiBQYWRhIHVtdW1ueWEsIGtvbWVudGFyIGRpdHVsaXNrYW4gcGFkYSBzYXR1IGJhcmlzIHlhbmcgdGVyc2VkaWEgZGkgUiwgZGVuZ2FuIG1lbmdndW5ha2FuIGAjYCBkaSBhd2FsIG1hdXB1biBha2hpciBzdWF0dSBzdGF0ZW1lbnQuDQoNCmBgYHtyfQ0KcCA9IDEwICAgICAgIyBNZW5nZ2FudGkgbmlsYWkgUCB5YW5nIHN1ZGFoIGRpcmVrYW0gKGtvbWVudGFyIGRpYWtoaXIgcGVybnlhdGFhbikNCiMgTWVuZ2dhbnRpIG5pbGFpIHIgeWFuZyBzdWRhaCBkaXJla2FtIChrb21lbnRhciBkaSBhd2FsIHBlcm55YXRhYW4pDQpwICsgcSAtPiByIA0KYGBgDQoNCg0KIyBPcGVyYXRvcg0KDQombmJzcDsgT3BlcmF0b3IgbWVsYWt1a2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlrYSwgbG9naWthLCBkYW4ga2VwdXR1c2FuIHlhbmcgZGlsYWt1a2FuIHBhZGEgc2VrdW1wdWxhbiBiaWxhbmdhbiBLb21wbGVrLCBJbnRlZ2VyLCBhdGF1cHVuIE51bWVyaWsgc2ViYWdhaSBzdWF0dSBwZXJpbnRhaC4gRGFsYW0gbWVuamFsYW5rYW4gb3BlcmF0b3IgaW5pLCBraXRhIG1lbmdndW5ha2FuIHN1YXR1IHNpbWJvbCB1bnR1ayBtZWxha3VrYW4gc3VhdHUgcGVyaW50YWguIFNlYmFnYWkgY29udG9oIGtpdGEgYWthbiBtZW1idWF0IHN1YXR1IHBlcmludGFoIHVudHVrIG1lbmphbGFua2FuIGFyaXRtYXRpa2EsIGxvZ2lrYSwgZGFuIGxhaW5ueWEuIFNlYmFnYWkgYmVyaWt1dC4gDQoNCg0KIyMgQXJpdG1hdGlrYQ0KDQombmJzcDsgS2l0YSBzZW11YSBwYXN0aSBzdWRhaCB0YWh1IGRhbiBtZW5nZW5hbCBwZXJpaGFsIG9wZXJhc2kgbWF0ZW1hdGlrYSwgc2VwZXJ0aSBoYWxueWEgcGVuanVtbGFoYW4sIHBlbmd1cmFuZ2FuLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIGp1Z2EgbW9kdWxvIGF0YXUgc2lzYSBiYWdpLiBCZXJpa3V0IGFrYW4gc2F5YSBiZXJpa2FuIG9wZXJhdG9yIG1hdGVtYXRpa2EgZGFuIHNpbWJvbCB5YW5nIGRpZ3VuYWthbiBkaSBkYWxhbSBSIDoNCg0KfHx8DQp8Oi0tLTp8Oi0tLTp8DQp8KipPcGVyYXRvcioqfCoqU2ltYm9sKip8DQp8UGVuanVtbGFoYW58KyB8DQp8UGVuZ3VyYW5nYW58LSB8IA0KfFBlcmthbGlhbiAgfCogfCANCnxQZW1iYWdpYW4gIHwvIHwNCnxNb2R1bG8gICAgIHwlJXwNCg0KJm5ic3A7IHVudHVrIHBlbmdndW5hYW4gc2ltYm9sIGRpIGF0YXMsIGtpdGEgZGFwYXQgZ3VuYWthbiBzZXBlcnRpIGJlcmlrdXQgaW5pLCBtb2hvbiBkaSBzaW1hayBiYWlrLWJhaWsgeWFhIDopDQoNCmBgYHtyfQ0KcCA8LSBjKDEsMyw1KSAjIG1lbXVhdCB2ZWt0b3IgcA0KcSA8LSBjKDIsNCw2KSAjIG1lbXVhdCB2ZWt0b3IgcQ0KYGBgDQoNCjxicj4NCioqUGVuanVtbGFoYW4gZGkgUioqDQpgYGB7cn0NCnByaW50IChwK3EpICAgICMgaGFzaWwgcGVuanVtbGFoYW4gcCArIHENCmBgYA0KDQo8YnI+DQoqKlBlbmd1cmFuZ2FuIGRpIFIqKg0KYGBge3J9DQpwcmludCAocC1xKSAgICAjIGhhc2lsIHBlbmd1cmFuZ2FuIHAgLSBxDQpgYGANCg0KPGJyPg0KKipQZXJrYWxpYW4gZGkgUioqDQpgYGB7cn0NCnByaW50IChwKnEpICAgICMgaGFzaWwgcGVya2FsaWFuIHAgZGFuIHENCmBgYA0KDQo8YnI+DQoqKlBlbWJhZ2lhbiBkaSBSKioNCmBgYHtyfQ0KcHJpbnQgKHAvcSkgICAgIyBoYXNpbCBwZW1iYWdpYW4gcCBkYW4gcQ0KYGBgDQoNCjxicj4NCioqTW9kdWxvIGRpIFIqKg0KYGBge3J9DQpwcmludCAocCUlcSkgICAjIHNpc2EgYmFnaSBwIGRhbiBxDQpgYGANCg0KPGJyPg0KJm5ic3A7ICoqS2l0YSBqdWdhIGRhcGF0IG1lbGFrdWthbm55YSBzZXBlcnRpIGJlcmlrdXQuKioNCg0KYGBge3J9DQpjYXQoIlBlbmp1bWxhaGFuIHAgZGFuIHEgOiIsIHAgKyBxLCAiXG4iKQ0KY2F0KCJQZW5ndXJhbmdhbiBwIGRhbiBxIDoiLCBwIC0gcSwgIlxuIikNCmNhdCgiUGVya2FsaWFuIHAgZGFuIHEgOiIsIHAgKiBxLCAiXG4iKQ0KY2F0KCJQZW1iYWdpYW4gcCBkYW4gcSA6IiwgcCAvIHEsICJcbiIpDQpjYXQoIk1vZHVsbyBwIGRhbiBxIDoiLCBwICUlIHEsICJcbiIpDQpgYGANCg0KDQojIyBSZWxhc2lvbmFsDQoNCiZuYnNwOyBLaXRhIGRhcGF0IG1lbGFrdWthbiBvcGVyYXNpIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2FuZ2t1dGFuIHBhZGEgc2V0aWFwIG5pbGFpIGRlbmdhbiBtZW5nZ3VuYWthbiAqKk9wZXJhdG9yIFJlbGFzaW9uYWwqKiBpbmkuIFBhZGEgb3BlcmF0b3IgaW5pIGFrYW4gbWVtYnVrdGlrYW4gc3VhdHUgcGVybnlhdGFhbiBtZWxhbHVpIGludHJ1cHNpICp0cnVlKiBhdGF1ICpmYWxzZSouIEFkYXB1biBvcGVyYXRvciBhdGF1IHNpbWJvbCB5YW5nIGtpdGEgZ3VuYWthbiB1bnR1ayBtZW5nb3BlcmFzaWthbiBSZWxhc2lvbmFsIGluaSwgeWFpdHUgc2ViYWdhaSBiZXJpa3V0IDogDQoNCnx8fA0KfDotLS06fDotLS06fA0KfCoqT3BlcmF0b3IqKnwqKlNpbWJvbCBkaSBSKip8DQp8IGt1cmFuZyBkYXJpIHwgPCB8DQp8IGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuIHwgPD0gfCANCnwgbGViaWggZGFyaSB8ID4gfCANCnwgbGViaWggZGFyaSBzYW1hIGRlbmdhbiB8ID49IHwgDQp8IHNhbWEgZGVuZ2FuIHwgPT0gfCANCnwgdGlkYWsgc2FtYSBkZW5nYW4gfCAhPXwNCg0KJm5ic3A7IEtpdGEgZGFwYXQgYXBsaWthc2luIG9wZXJhdG9yIHJlbGFzaW9uYWwgdGVyc2VidXQgbWVuamFkaSBzZWJhZ2FpIGJlcmlrdXQuDQoNCjxicj4NCmBgYHtyfQ0KY2F0KCJwIGt1cmFuZyBkYXJpIHE6IiwgcCA8IHEsICJcbiIpDQpjYXQoInAga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gcToiLCBwIDw9IHEsICJcbiIpDQpjYXQoInAgbGViaWggZGFyaSBxOiIsIHAgPiBxLCAiXG4iKQ0KY2F0KCJwIGxlYmloIGRhcmkgc2FtYSBkZW5nYW4gcToiLCBwID49IHEsICJcbiIpDQpjYXQoInAgc2FtYSBkZW5nYW4gcToiLCBwID09IHEsICJcbiIpDQpjYXQoInAgdGlkYWsgc2FtYSBkZW5nYW4gcToiLCBwICE9IHEsICJcbiIpDQpgYGANCg0KDQojIyBMb2dpa2ENCg0KJm5ic3A7IERhbGFtIGtpdGEgbWVuZ2FsaXNhIGRhdGEgcGFzdGlueWEga2l0YSBoYXJ1cyBtZW5lbnR1a2FuIG1hbmEgeWFuZyBCZW5hciBkYW4gU2FsYWguIE1ha2EgZGFyaSBpdHUsIGtpdGEganVnYSBtZW1idXR1aGthbiBvcGVyYXNpIGxvZ2lrYSB5YW5nIG1lbWlsaWtpIGZ1bmdzaSB1bnR1ayBtZW55ZWxlc2Fpa2FuIHN1YXR1IG9wZXJhc2kgYmVybmlsYWkgc2VidWFoIGtlcHV0dXNhbi4gT3BlcmFzaSBpbmkgZGFwYXQgYmVrZXJqYSBkZW5nYW4gdGVudHVpbiBkYXJpIG5pbGFpLCBsYWx1IGRpZXZhbHVhc2kga2UgbmlsYWkgQm9vbGVhbi4gQmVyaWt1dCBzYXlhIGJlcmlrYW4gY29udG9oIE9wZXJhdG9yIHlhbmcgZGlndW5ha2FuIGRhbGFtIG9wZXJhc2kgbG9naWthIGRpIGJhaGFzYSBSIDogDQoNCnx8fA0KfDotLS06fDotLS06fA0KfCoqT3BlcmF0b3IqKnwqKlNpbWJvbCBkaSBSKip8DQp8IE5PVCB8ICEgfA0KfCBBTkQgfCAmIHwNCnwgT1IgIHwgfCB8IA0KfCBYT1IgfCBeIHwNCg0KJm5ic3A7IEJlcmlrdXQgY29udG9oIHBlbmdhcGxpa2FzaWFubnlhIDogDQoNCjxicj4NCmBgYHtyfQ0KcCA8LSBjKFRSVUUsMC4zLDJpKzMpDQpxIDwtIGMoMCxUUlVFLEZBTFNFKQ0KY2F0KCJsb2dpa2EgTk9UIHVudHVrIHA6IiwgIXAsICJcbiIpDQpjYXQoImxvZ2lrYSBOT1QgdW50dWsgcToiLCAhcSwgIlxuIikNCmNhdCgibG9naWthIEFORCB1bnR1ayAgOiIsIHAgJiBxLCAiXG4iKQ0KY2F0KCJsb2dpa2EgT1IgIHVudHVrICA6IiwgcCB8IHEsICJcbiIpDQpjYXQoImxvZ2lrYSBYT1IgdW50dWsgIDoiLCB4b3IocCxxKSwgIlxuIikNCmBgYA0KDQoNCiMjIExhaW4gLSBsYWluDQoNCiZuYnNwOyBTZWxhaW4gYmFueWFrbnlhIG9wZXJhdG9yIGRpIGF0YXMgeWFuZyBzdWRhaCBzYXlhIGNvYmEgcHJha3Rpa2FuLCBkYWxhbSBiYWhhc2EgUiBqdWdhIGFkYSBiZWJlcmFwYSBvcGVyYXRvciBsYWluIHlhbmcga2l0YSBoYXJ1cyBrZXRhaHVpLiBLYXJlbmEgb3BlcmF0b3IgaW5pIHNlcmluZyBraXRhIHRlbXVpIGRhbGFtIGFuYWxpc2EgbnVtZXJpayBtYXVwdW4gc3RhdGlzdGlrYSwgeWFpdHUgcGVuZ2FrYXJhbiwgbG9nYXJpdG1hLCBla3Nwb25lbiwgZGFuIHNpZmF0IGtvbXV0YXRpZi4gTWFrYSBkYXJpIGl0dSwgc2F5YSBtZW5jb2JhIG1lbXByYWt0aWthbm55YSwgc2ViYWdhaSBiZXJpa3V0IDogDQoNCjxicj4NCmBgYHtyfQ0KcCA8LSBjKDEsMyw1KQ0KcSA8LSBjKDIsNCw2KQ0KY2F0KCJOaWxhaSBBa2FyIDoiLCBzcXJ0KHAqcSksIlxuIikNCmNhdCgiTmlsYWkgTG9nYXJpdG1hIDoiLCBsb2cocCksICJcbiIpDQpjYXQoIk5pbGFpIEVrc3BvbmVuICA6IiwgZXhwKHEpLCAiXG4iKQ0KY2F0KCJTaWZhdCBLb211dGF0aWYgOiIsIChwL3EpICsgcCwgIlxuIikNCmBgYA0KDQoNCiMgVGlwZSBEYXRhDQoNCg0KJm5ic3A7IE11bmdraW4gZGlhbnRhcmEga2l0YSBwZXJuYWggbWVuZGVuZ2FyIGthdGEgKlN0cmluZyogYXRhdXB1biAqQm9vbGVhbioga2V0aWthIHNlZGFuZyBiZWxhamFyIHRlbnRhbmcgYmFoYXNhIHBlbXJvZ3JhbWFuIGF0YXUgaHRtbCBkYXNhciBkaSBtYXRhIHBlbGFqYXJhbiBzZWtvbGFoLiBOYWgsIFN0cmluZyBhdGF1cHVuIEJvb2xlYW4gaXR1IHRlcm55YXRhIG1lcnVwYWthbiBzdWF0dSB5YW5nIGRpc2VidXQgKipUSVBFIERBVEEqKi4gVGlwZSBEYXRhIHNhbmdhdCBwZW50aW5nIHVudHVrIGtpdGEgcGFoYW1pIGRhbiBndW5ha2FuLCBrYXJlbmEgZGVuZ2FuIHRpcGUgZGF0YSBraXRhIGRhcGF0IG1lbmdndW5ha2FuIHNlYnVhaCB2YXJpYWJlbCB0ZXJ0ZW50dSB1bnR1ayBtZW55aW1wYW4gdGlwZSB5YW5nIGJlcmJlZGEuIEJlcmlrdXQgaW5pIHNheWEgYmVyaWthbiBjb250b2ggVGlwZSBEYXRhIHlhbmcgdW11bSBoYXJ1cyBraXRhIHBhaGFtaSBkYW4ga2VuYWxpIGRhbiBjb250b2hueWEgOiANCg0KfHx8fA0KfDotLS06fDotLS06fDotLS06fA0KfCoqVGlwZSBEYXRhKip8KipSKip8KipLZXRlcmFuZ2FuKip8DQp8IERvdWJsZSB8IDEsMiB8IGJpbGFuZ2FuIGRlc2ltYWwgfA0KfCBJbnRlZ2VyIHwgNyB8IGJpbGFuZ2FuIGJ1bGF0IHwNCnwgQm9vbGVhbiB8IFRSVUUvRkFMU0UgfCB1bnR1ayBtZW5lbnR1a2FuIHN1YXR1IGtlcHV0dXNhbiBiZW5hciBhdGF1IHNhbGFoIHwNCnwgU3RyaW5nIHwgIkJhbmcgSmVraSIgfCBzdWF0dSBrYXJha3RlciBkZW5nYW4gdGFuZGEgIiBhdGF1ICcgfA0KfCBLb21wbGVrcyB8IDMgKyA0aSB8IGFuZ2thIHJlYWwgZGFuIGltYWppbmVyIHwNCg0KDQogQmVyaWt1dCBjb250b2ggcGVuZ2FwbGlrYXNpYW5ueWEgOg0KDQo8YnI+DQpgYGB7cn0NCmQxID0gMS4yDQpkMiA9IDUNCmQzID0gOSArIDdpDQpjYXQoIk5hbWEgS2VsYXMgVmFyaWFiZWwgOiIsIGNsYXNzKGQxKSwiXG4iKQ0KY2F0KCJOYW1hIEtlbGFzIFZhcmlhYmVsIDoiLCBjbGFzcyhkMiksIlxuIikNCmNhdCgiVGlwZSBWYXJpYWJlbCAgICAgICA6IiwgdHlwZW9mIChkMSksIlxuIikNCmNhdCgiVGlwZSBWYXJpYWJlbCAgICAgICA6IiwgdHlwZW9mIChkMyksIlxuIikNCmBgYA0KDQoNCiMgQmFudHVhbg0KDQombmJzcDsgRGFsYW0gbWVuZ2d1bmFrYW4gYmFoYXNhIFIga2l0YSBkaWZhc2lsaXRhc2kgZGVuZ2FuIHlhbmcgbmFtYW55YSBpbi1saW5lIHVudHVrIG1lbmNhcmkgc2VidWFoIGJhbnR1YW4gaW5mb3JtYXNpIHRlcnRlbnR1LiBCZXJpa3V0IG9wZXJhdG9yIHlhbmcgZGFwYXQgZGlidWF0IDogDQoNCmBgYHtyfSMNCmhlbHAuc3RhcnQoKSAgICAgICAgICAgIyBtZW5hdmlnYXNpIGJhbnR1YW4gbG9rYWwNCj9oZWxwICAgICAgICAgICAgICAgICAgIyBtZW5hdmlnYXNpIGJhbnR1YW4gbG9rYWwNCj9jbGFzcyAgICAgICAgICAgICAgICAgIyBtZW5kYXBhdCBiYW50dWFuIGZ1bmdzaSBjbGFzcw0KaGVscChjbGFzcykgICAgICAgICAgICAjIG1lbmRhcGF0IGJhbnR1YW4gZnVuZ3NpIGNsYXNzDQo/P2NsYXNzICAgICAgICAgICAgICAgICMgbWVuY2FyaSB0YWh1IGZ1bmdzaSBjbGFzcyANCmhlbHAuc2VhcmNoKCdjbGFzcycpICAgIyBtZW5jYXJpIHRhaHUgbmFtYSBmdW5nc2kNCmBgYA0KDQoNCg0K