

Email : naftali.gunawan@student.matanauniversity.ac.id
RPubs : https://rpubs.com/naftalibrigitta/
Jurusan : Statistika Bisnis
Address : Perumahan Ciater Permai
Jl Anggrek III, Blok A5 No. 10, RT 001, RW 004, Serpong, Tangerang Selatan, Banten 15310.
Sintaks Dasar
Suatu program di R dan Phyton terdiri dari 3 hal mendasar: Variabel, operan (nilai), dan komentar. Variabel digunakan untuk menyimpan suatu nilai, sedangkan komentar digunakan untuk meningkatkan pemahaman pengguna mengenai skrip atau coding.
Penugasan Variabel
Dalam R, penugasan suatu program biasanya menggunakan sebuah variabel yang dicadangkan untuk dapat merekam berbagai jenis data sesuai nama yang diberikan ke lokasi penyimpanan/memory. Perintah penugasan variabel ini, dapat di notasikan dengan tiga cara:
* =, digunakan untuk penugasan sederhana
* <-, digunakan untuk penugasan dari sisi kiri
* ->, digunakan untuk penugasan dari sisi kanan
x=11
y <- 21
2000 -> z
print(c(x,y,z))
## [1] 11 21 2000
Menambahkan Komentar
Menambahkan/Memberikan Komentar dalam skrip/koding R dan Phyton adalah untuk memudahkan anda memahami arti/makna penggunaan suatu perintah/program. Koemntar yang di tulis dalam program tersebut hanya bersifat penjelasan tentang apa yang dilakukannya atau apa yang seharusnya dilakukan oleh sebuah skrip/koding. Perlu dicatat bahwa komentar yang bersifat informasi tidak ada hubungannya dengan logika pemrograman yang sedang anda lakukan Mereka benar-benar diabaikan oleh kompiler dan dengan demikian tidak pernah tercermin dalam input. Biasanya komentar dituliskan pada satu baris yang tersedia pada di R dan Phyton, dengan menggunakan # diawal maupun diakhir pernyataan
# Mengganti Nilai x yang sudah di rekam (komentar diawal pernyataan)
x = 10
z <- x + y # Mengganti Nilai Z yang sudah di rekam (komentar diakhir pernyataan)
x + y -> z # Sama Dengan Diatas
Operator
Operator adalah simbol yang mengarahkan compiler untuk melakukan berbagai macam operasi terhadap beberapa penugasan. Operator mensimulasikan berbagai operasi matematis, logika, dan keputusan yang dilakukan pada sekumpulan Bilangan Kompleks, Integer, dan Numerik sebagai penugasan masukan (input). R dan Python mendukung sebagian besar empat jenis operator biner antara satu set penugasan. Dalam ini, kita akan melihat berbagai jenis operator yang tersedia di R dan Python dan penggunaannya.
Aritmatika
Penggunaan operator aritmatika dalam program R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, perkalian, pembagian, dan modulo. Operator aritmatika yang dilakukan bisa saja berupa nilai skalar, bilangan kompleks, atau vektor.
| OPERATOR |
R |
| Penjumlahan |
+ |
| Pengurangan |
- |
| Perkalian |
* |
| Divisi/Pembagian |
/ |
| Pemangkatan |
^ |
| Modulo |
%% |
Dibawah ini merupakan contoh penggunaan Operator Aritmatika di R:
## [1] 104
## [1] 50
## [1] 2079
## [1] 2.851852
## [1] 1.640627e+110
## [1] 27
Relasional
Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Mengembalikan nilai Boolean TRUE jika operan pertama memenuhi relasi dibandingkan dengan operan kedua. Nilai TRUE selalu dianggap lebih besar dari FALSE.
| Operator |
R |
Keterangan |
| Kurang Dari |
< |
Mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih kecil operan kedua. Selain itu akan mengembalikan FALSE. |
| Kurang Dari Sama Dengan |
<= |
Mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama kurang dari atau sama dengan operan kedua. Selain itu akan mengembalikan FALSE. |
| Lebih Besar Dari |
> |
Mengembalikan TRUE jika elemen yang bersesuaian pada operan pertama lebih besar dari operan kedua. Selain itu akan mengembalikan FALSE. |
| Lebih Besar Dari Sama Dengan |
>= |
Mengembalikan BENAR jika elemen yang bersesuaian pada operan pertama lebih besar atau sama dengan dari operan kedua. Selain itu akan mengembalikan FALSE. |
| Sama Dengan |
== |
Mengembalikan BENAR jika dan hanya kedua sisi bernilai sama. |
| Tidak Sama Dengan |
!= |
Mengembalikan BENAR jika elemen yang bersesuaian pada operan pertama tidak sama dengan dari operan kedua. |
Dibawah ini merupakan contoh penggunaan Operator Relasional di R:
x <- c(3,6,9) #Memuat vektor x
y <- c(4,8,2) #Memuat vektor y
cat("Vektor x kurang dari vektor y:" , x < y , "\n")
## Vektor x kurang dari vektor y: TRUE TRUE FALSE
cat("Vektor y kurang dari sama dengan vektor x:" , y <= x , "\n")
## Vektor y kurang dari sama dengan vektor x: FALSE FALSE TRUE
cat("Vektor x lebih besar dari vektor y:" , x > y , "\n")
## Vektor x lebih besar dari vektor y: FALSE FALSE TRUE
cat("Vektor y lebih besar sama dengan dari vektor x:" , y >= x , "\n")
## Vektor y lebih besar sama dengan dari vektor x: TRUE TRUE FALSE
cat("Vektor x sama dengan dari vektor y:" , x == y , "\n")
## Vektor x sama dengan dari vektor y: FALSE FALSE FALSE
cat("Vektor x tidak sama dengan dari vektor y:" , x != y , "\n")
## Vektor x tidak sama dengan dari vektor y: TRUE TRUE TRUE
Logika
Operator logis mensimulasikan operasi keputusan, berdasarkan operator yang ditentukan antara operan, yang kemudian dievaluasi ke nilai Boolean Benar atau Salah. Nilai bilangan bulat bukan nol dianggap sebagai nilai BENAR, baik itu bilangan kompleks atau bilangan real.
| Operator |
R |
Keterangan |
| NOT |
! |
Operasi negasi/kebalikan pada status elemen operan. |
| AND |
& |
Mengembalikan TRUE jika kedua operan bernilai BENAR. |
| OR |
|
|
| XOR |
^ |
Mengembalikan TRUE jika salah satu dari kedua elemen pertama operan bernilai BENAR. |
Dibawah ini merupakan contoh penggunaan Operator Logika di R:
x <- c(7, FALSE, TRUE)
y <- c(FALSE, 1.1, 7+5i)
#Melakukan Operasi Logika Pada Operan
cat("Logika Negasi (~) untuk vektor x:", !x, "\n")
## Logika Negasi (~) untuk vektor x: FALSE TRUE FALSE
cat("Logika Negasi (~) untuk vektor y:", !y, "\n")
## Logika Negasi (~) untuk vektor y: TRUE FALSE FALSE
cat("Logika Konjungsi (Dan):", x & y , "\n")
## Logika Konjungsi (Dan): FALSE FALSE TRUE
cat("Logika Disjungsi (Atau):", x | y , "\n")
## Logika Disjungsi (Atau): TRUE TRUE TRUE
cat("Logika Disjungsi Parsial:", x || y , "\n")
## Logika Disjungsi Parsial: TRUE
Lain-lain
Berikut ini juga ada beberapa operator yang kemungkinan besar juga akan anda perlukan pada saat akan menggunakan R:
x <- c(7,8,9) #Memuat vektor x
y <- c(4,5,6) #Memuat vektor y
## [1] 5.291503 6.324555 7.348469
## [1] 1.386294 1.609438 1.791759
## [1] 1096.633 2980.958 8103.084
## [1] 2.285714 3.125000 4.000000
Tipe Data
Dalam pemrograman seperti R dan Phyton, tipe data merupakan konsep penting. Keduanya dapat menggunakan variabel untuk menyimpan tipe yang berbeda-beda, berikut adalah tipe data paling mendasar yang harus diketahui:
| Tipe Data |
R |
Penjelasan |
| Double/Float |
5.6 |
Bilangan yang mempunyai koma |
| Integer |
5 |
Bilangan Bulat (contoh : 1,2,…,n) |
| Bloean/Logical |
TRUE/FALSE |
Benar bernilai 1, dan Salah bernilai 0 |
| String/Character |
‘naftalibrigitta’ |
karakter/kalimat yang dapat berupa huruf, angka, dll (Diapit tanda ’ atau tanda ") |
| Complex |
1+5i |
Pasangan angka real dan imajiner |
Berikut ini adalah koding R yang dapat digunakan untuk menetapkan kelima tipe data diatas:
d1 = 5.6 # Tetapkan nilai desimal
d2 = as.integer(5) # Tetapkan nilai integer
d2 = 5L # Cara lain untuk memuat nilai integer di R
d3 = c(TRUE, FALSE) # Bolean/Logical
d3 = as.logical(c(0,1)) # Cara lain untuk memuat Bolean/Logical
d4 = c ("a", 'b', '123') # String/Character
d5 = 1+5i # complex
Untuk memeriksa tipe data dalam R:
## [1] "character"
## [1] "integer"
Bantuan
# help.start() # Menu dimana Anda dapat menavigasi bantuan lokal berbasis web
# ?help # Menu dimana Anda dapat menavigasi bantuan lokal berbasis web
# ?class # Mendapatkan Bantuan untuk fungsi 'class'
# help(class) # Mendapatkan Bantuan untuk fungsi 'class'
# ??class # Jika Anda tidak tahu nama fungsi yang anda cari
# help.search('class') # Jika Anda tidak tahu nama fungsi yang anda cari
LS0tCnRpdGxlOiAiVHVnYXMgMiIKc3VidGl0bGU6ICJEYXNhci1kYXNhciBSIGRhbiBQaHl0b24iCmF1dGhvcjogIk5hZnRhbGkgQnJpZ2l0dGEgR3VuYXdhbiAoMjAyMTQ5MjAwMDIpIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDogCiAgICBodG1sX2RvY3VtZW50OiBudWxsCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0aGVtZTogc2FuZHN0b25lCiAgICBjc3M6IHN0eWxlMS5jc3MKICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQotLS0KCgoKPGltZyBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjI1JSIgc3JjPSJmb3Rvc2F5YS5qcGVnIi8+CgpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJsb2dvbWF0YW5hLnBuZyIpCmBgYAoKCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIG5hZnRhbGkuZ3VuYXdhbkBzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWQgPGJyPgpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS9uYWZ0YWxpYnJpZ2l0dGEvIDxicj4KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYSBCaXNuaXNdKGh0dHBzOi8vbWF0YW5hdW5pdmVyc2l0eS5hYy5pZC8/bHk9YWNhZGVtaWMmYz1zYikgPGJyPgpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBQZXJ1bWFoYW4gQ2lhdGVyIFBlcm1haSA8YnI+CiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsIEFuZ2dyZWsgSUlJLCBCbG9rIEE1IE5vLiAxMCwgUlQgMDAxLCBSVyAwMDQsIFNlcnBvbmcsIFRhbmdlcmFuZyBTZWxhdGFuLCBCYW50ZW4gMTUzMTAuCgoqKioqCiMgU2ludGFrcyBEYXNhcgpTdWF0dSBwcm9ncmFtIGRpIFIgZGFuIFBoeXRvbiB0ZXJkaXJpIGRhcmkgMyBoYWwgbWVuZGFzYXI6IFZhcmlhYmVsLCBvcGVyYW4gKG5pbGFpKSwgZGFuIGtvbWVudGFyLiBWYXJpYWJlbCBkaWd1bmFrYW4gdW50dWsgbWVueWltcGFuIHN1YXR1IG5pbGFpLCBzZWRhbmdrYW4ga29tZW50YXIgZGlndW5ha2FuIHVudHVrIG1lbmluZ2thdGthbiBwZW1haGFtYW4gcGVuZ2d1bmEgbWVuZ2VuYWkgc2tyaXAgYXRhdSBjb2RpbmcuIDxicj4KCiMjIFBlbnVnYXNhbiBWYXJpYWJlbApEYWxhbSBSLCBwZW51Z2FzYW4gc3VhdHUgcHJvZ3JhbSBiaWFzYW55YSBtZW5nZ3VuYWthbiBzZWJ1YWggdmFyaWFiZWwgeWFuZyBkaWNhZGFuZ2thbiB1bnR1ayBkYXBhdCBtZXJla2FtIGJlcmJhZ2FpIGplbmlzIGRhdGEgc2VzdWFpIG5hbWEgeWFuZyBkaWJlcmlrYW4ga2UgbG9rYXNpIHBlbnlpbXBhbmFuL21lbW9yeS4gClBlcmludGFoIHBlbnVnYXNhbiB2YXJpYWJlbCBpbmksIGRhcGF0IGRpIG5vdGFzaWthbiBkZW5nYW4gdGlnYSBjYXJhOiA8YnI+CiogYD1gLCBkaWd1bmFrYW4gdW50dWsgcGVudWdhc2FuIHNlZGVyaGFuYSA8YnI+IAoqIGA8LWAsIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIGtpcmkgPGJyPgoqIGAtPmAsIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIGthbmFuIDxicj4KCmBgYHtyfQp4PTExCnkgPC0gMjEKMjAwMCAtPiB6CnByaW50KGMoeCx5LHopKQpgYGAKCgoKIyMgTWVuYW1iYWhrYW4gS29tZW50YXIKTWVuYW1iYWhrYW4vTWVtYmVyaWthbiBLb21lbnRhciBkYWxhbSBza3JpcC9rb2RpbmcgUiBkYW4gUGh5dG9uIGFkYWxhaCB1bnR1ayBtZW11ZGFoa2FuIGFuZGEgbWVtYWhhbWkgYXJ0aS9tYWtuYSBwZW5nZ3VuYWFuIHN1YXR1IHBlcmludGFoL3Byb2dyYW0uIEtvZW1udGFyIHlhbmcgZGkgdHVsaXMgZGFsYW0gcHJvZ3JhbSB0ZXJzZWJ1dCBoYW55YSBiZXJzaWZhdCBwZW5qZWxhc2FuIHRlbnRhbmcgYXBhIHlhbmcgZGlsYWt1a2FubnlhIGF0YXUgYXBhIHlhbmcgc2VoYXJ1c255YSBkaWxha3VrYW4gb2xlaCBzZWJ1YWggc2tyaXAva29kaW5nLiBQZXJsdSBkaWNhdGF0IGJhaHdhIGtvbWVudGFyIHlhbmcgYmVyc2lmYXQgaW5mb3JtYXNpIHRpZGFrIGFkYSBodWJ1bmdhbm55YSBkZW5nYW4gbG9naWthIHBlbXJvZ3JhbWFuIHlhbmcgc2VkYW5nIGFuZGEgbGFrdWthbiBNZXJla2EgYmVuYXItYmVuYXIgZGlhYmFpa2FuIG9sZWgga29tcGlsZXIgZGFuIGRlbmdhbiBkZW1pa2lhbiB0aWRhayBwZXJuYWggdGVyY2VybWluIGRhbGFtIGlucHV0LiBCaWFzYW55YSBrb21lbnRhciBkaXR1bGlza2FuIHBhZGEgc2F0dSBiYXJpcyAgeWFuZyB0ZXJzZWRpYSBwYWRhIGRpIFIgZGFuIFBoeXRvbiwgZGVuZ2FuIG1lbmdndW5ha2FuIGAjYCBkaWF3YWwgbWF1cHVuIGRpYWtoaXIgcGVybnlhdGFhbiA8YnI+CgpgYGB7cn0KIyBNZW5nZ2FudGkgTmlsYWkgeCB5YW5nIHN1ZGFoIGRpIHJla2FtIChrb21lbnRhciBkaWF3YWwgcGVybnlhdGFhbikKeCA9IDEwCnogPC0geCArIHkgICMgTWVuZ2dhbnRpIE5pbGFpIFogeWFuZyBzdWRhaCBkaSByZWthbSAoa29tZW50YXIgZGlha2hpciBwZXJueWF0YWFuKQp4ICsgeSAtPiB6ICAjIFNhbWEgRGVuZ2FuIERpYXRhcwpgYGAKCgoKIAojIE9wZXJhdG9yCk9wZXJhdG9yIGFkYWxhaCBzaW1ib2wgeWFuZyBtZW5nYXJhaGthbiBjb21waWxlciB1bnR1ayBtZWxha3VrYW4gYmVyYmFnYWkgbWFjYW0gb3BlcmFzaQp0ZXJoYWRhcCBiZWJlcmFwYSBwZW51Z2FzYW4uIE9wZXJhdG9yIG1lbnNpbXVsYXNpa2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlzLCBsb2dpa2EsIGRhbgprZXB1dHVzYW4geWFuZyBkaWxha3VrYW4gcGFkYSBzZWt1bXB1bGFuIEJpbGFuZ2FuIEtvbXBsZWtzLCBJbnRlZ2VyLCBkYW4gTnVtZXJpayBzZWJhZ2FpCnBlbnVnYXNhbiBtYXN1a2FuIChpbnB1dCkuIFIgZGFuIFB5dGhvbiBtZW5kdWt1bmcgc2ViYWdpYW4gYmVzYXIgZW1wYXQgamVuaXMgb3BlcmF0b3IgYmluZXIKYW50YXJhIHNhdHUgc2V0IHBlbnVnYXNhbi4gRGFsYW0gaW5pLCBraXRhIGFrYW4gbWVsaWhhdCBiZXJiYWdhaSBqZW5pcyBvcGVyYXRvciB5YW5nIHRlcnNlZGlhIGRpIFIKZGFuIFB5dGhvbiBkYW4gcGVuZ2d1bmFhbm55YS4KCiMjIEFyaXRtYXRpa2EKUGVuZ2d1bmFhbiBvcGVyYXRvciBhcml0bWF0aWthIGRhbGFtIHByb2dyYW0gUiBkYW4gUHl0aG9uIGFkYWxhaCB1bnR1ayBtZW5zaW11bGFzaWthbiAKYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aWthLCBzZXBlcnRpIHBlbmFtYmFoYW4sIHBlbmd1cmFuZ2FuLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIG1vZHVsby4KT3BlcmF0b3IgYXJpdG1hdGlrYSB5YW5nIGRpbGFrdWthbiBiaXNhIHNhamEgYmVydXBhIG5pbGFpIHNrYWxhciwgYmlsYW5nYW4ga29tcGxla3MsIGF0YXUgdmVrdG9yLiAgPGJyPgoKfHwKfDotOnw6LTp8IAp8ICBPUEVSQVRPUiAgICAgICAgfCBSICB8CnwgUGVuanVtbGFoYW4gICAgICB8ICsgIHwKfCBQZW5ndXJhbmdhbiAgICAgIHwgLSAgfAp8IFBlcmthbGlhbiAgICAgICAgfCAqICB8CnwgRGl2aXNpL1BlbWJhZ2lhbiB8IC8gIHwKfCBQZW1hbmdrYXRhbiAgICAgIHwgXiAgfAp8IE1vZHVsbyAgICAgICAgICAgfCAlJSB8IDxicj4KCkRpYmF3YWggaW5pIG1lcnVwYWthbiBjb250b2ggcGVuZ2d1bmFhbiBPcGVyYXRvciBBcml0bWF0aWthIGRpIFI6IDxicj4KCmBgYHtyfQp4PTI3Cnk9NzcKYGBgCgpgYGB7cn0KeCt5CmBgYAoKYGBge3J9CnkteApgYGAKCmBgYHtyfQp4KnkKYGBgCgpgYGB7cn0KeS94CmBgYAoKYGBge3J9CnheeQpgYGAKCmBgYHtyfQp4JSV5CmBgYAoKCiMjIFJlbGFzaW9uYWwKT3BlcmF0b3IgcmVsYXNpb25hbCBtZWxha3VrYW4gb3BlcmFzaSBwZXJiYW5kaW5nYW4gYW50YXJhIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgc2V0aWFwCm9wZXJhbi4gTWVuZ2VtYmFsaWthbiBuaWxhaSBCb29sZWFuIFRSVUUgamlrYSBvcGVyYW4gcGVydGFtYSBtZW1lbnVoaSByZWxhc2kgZGliYW5kaW5na2FuCmRlbmdhbiBvcGVyYW4ga2VkdWEuIE5pbGFpIFRSVUUgc2VsYWx1IGRpYW5nZ2FwIGxlYmloIGJlc2FyIGRhcmkgRkFMU0UuIDxicj4KCgp8fHwKfDotOnw6LTp8Oi06fAp8ICBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgIHwgUiAgfCBLZXRlcmFuZ2FuIHwKfCBLdXJhbmcgRGFyaSAgICAgICAgICAgICAgICAgICB8IDwgIHxNZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJ0YW1hIGxlYmloIGtlY2lsIG9wZXJhbiBrZWR1YS4gU2VsYWluIGl0dSBha2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW5nZW1iYWxpa2FuIEZBTFNFLgp8IEt1cmFuZyBEYXJpIFNhbWEgRGVuZ2FuICAgICAgIHwgPD0gfE1lbmdlbWJhbGlrYW4gVFJVRSBqaWthIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgb3BlcmFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnRhbWEga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiBvcGVyYW4ga2VkdWEuIFNlbGFpbiBpdHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2FuIG1lbmdlbWJhbGlrYW4gRkFMU0UuCnwgTGViaWggQmVzYXIgRGFyaSAgICAgICAgICAgICAgfCA+ICB8TWVuZ2VtYmFsaWthbiBUUlVFIGppa2EgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBvcGVyYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVydGFtYSBsZWJpaCBiZXNhciBkYXJpIG9wZXJhbiBrZWR1YS4gU2VsYWluIGl0dSBha2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVuZ2VtYmFsaWthbiBGQUxTRS4KfCBMZWJpaCBCZXNhciBEYXJpIFNhbWEgRGVuZ2FuICB8ID49IHwgTWVuZ2VtYmFsaWthbiBCRU5BUiBqaWthIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgb3BlcmFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnRhbWEgbGViaWggYmVzYXIgYXRhdSBzYW1hIGRlbmdhbiBkYXJpIG9wZXJhbiBrZWR1YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGFpbiBpdHUgYWthbiBtZW5nZW1iYWxpa2FuIEZBTFNFLiAKfCBTYW1hIERlbmdhbiAgICAgICAgICAgICAgICAgICB8ID09IHwgTWVuZ2VtYmFsaWthbiBCRU5BUiBqaWthIGRhbiBoYW55YSBrZWR1YSBzaXNpIGJlcm5pbGFpIHNhbWEuCnwgVGlkYWsgU2FtYSBEZW5nYW4gICAgICAgICAgICAgfCAhPSB8IE1lbmdlbWJhbGlrYW4gQkVOQVIgamlrYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIG9wZXJhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJ0YW1hIHRpZGFrIHNhbWEgZGVuZ2FuIGRhcmkgb3BlcmFuIGtlZHVhLiAKIDxicj4KCkRpYmF3YWggaW5pIG1lcnVwYWthbiBjb250b2ggcGVuZ2d1bmFhbiBPcGVyYXRvciBSZWxhc2lvbmFsIGRpIFI6IDxicj4KCgpgYGB7cn0KeCA8LSBjKDMsNiw5KSAjTWVtdWF0IHZla3RvciB4CnkgPC0gYyg0LDgsMikgI01lbXVhdCB2ZWt0b3IgeQpgYGAKCmBgYHtyfQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIHZla3RvciB5OiIgLCB4IDwgeSAsICJcbiIpCmBgYAoKYGBge3J9CmNhdCgiVmVrdG9yIHkga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHg6IiAsIHkgPD0geCAsICJcbiIpCmBgYAoKYGBge3J9CmNhdCgiVmVrdG9yIHggbGViaWggYmVzYXIgZGFyaSB2ZWt0b3IgeToiICwgeCA+IHkgLCAiXG4iKQpgYGAKCmBgYHtyfQpjYXQoIlZla3RvciB5IGxlYmloIGJlc2FyIHNhbWEgZGVuZ2FuIGRhcmkgdmVrdG9yIHg6IiAsIHkgPj0geCAsICJcbiIpCmBgYAoKYGBge3J9CmNhdCgiVmVrdG9yIHggc2FtYSBkZW5nYW4gZGFyaSB2ZWt0b3IgeToiICwgeCA9PSB5ICwgIlxuIikKYGBgCgpgYGB7cn0KY2F0KCJWZWt0b3IgeCB0aWRhayBzYW1hIGRlbmdhbiBkYXJpIHZla3RvciB5OiIgLCB4ICE9IHkgLCAiXG4iKQpgYGAKCgoKIyMgTG9naWthCk9wZXJhdG9yIGxvZ2lzIG1lbnNpbXVsYXNpa2FuIG9wZXJhc2kga2VwdXR1c2FuLCBiZXJkYXNhcmthbiBvcGVyYXRvciB5YW5nIGRpdGVudHVrYW4gYW50YXJhCm9wZXJhbiwgeWFuZyBrZW11ZGlhbiBkaWV2YWx1YXNpIGtlIG5pbGFpIEJvb2xlYW4gQmVuYXIgYXRhdSBTYWxhaC4gTmlsYWkgYmlsYW5nYW4gYnVsYXQgYnVrYW4gbm9sCmRpYW5nZ2FwIHNlYmFnYWkgbmlsYWkgQkVOQVIsIGJhaWsgaXR1IGJpbGFuZ2FuIGtvbXBsZWtzIGF0YXUgYmlsYW5nYW4gcmVhbC4gPGJyPgoKCnx8fAp8Oi06fDotOnw6LTp8CnwgIE9wZXJhdG9yIHwgUiAgfCBLZXRlcmFuZ2FuIHwKfCBOT1QgICAgICAgfCAhICB8IE9wZXJhc2kgbmVnYXNpL2tlYmFsaWthbiBwYWRhIHN0YXR1cyBlbGVtZW4gb3BlcmFuLiAKfCBBTkQgICAgICAgfCAmICB8IE1lbmdlbWJhbGlrYW4gVFJVRSBqaWthIGtlZHVhIG9wZXJhbiBiZXJuaWxhaSBCRU5BUi4gCnwgT1IgICAgICAgIHwgfCAgfCBNZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBzYWxhaCBzYXR1IG9wZXJhbiBiZXJuaWxhaSBCRU5BUi4gCnwgWE9SICAgICAgIHwgXiAgfCBNZW5nZW1iYWxpa2FuIFRSVUUgamlrYSBzYWxhaCBzYXR1IGRhcmkga2VkdWEgZWxlbWVuIHBlcnRhbWEgb3BlcmFuIGJlcm5pbGFpICAgICAgICAgICAgICAgICAgICAgICBCRU5BUi4gCiA8YnI+CiAKRGliYXdhaCBpbmkgbWVydXBha2FuIGNvbnRvaCBwZW5nZ3VuYWFuIE9wZXJhdG9yIExvZ2lrYSBkaSBSOiA8YnI+CgpgYGB7cn0KeCA8LSBjKDcsIEZBTFNFLCBUUlVFKQp5IDwtIGMoRkFMU0UsIDEuMSwgNys1aSkKCiNNZWxha3VrYW4gT3BlcmFzaSBMb2dpa2EgUGFkYSBPcGVyYW4KYGBgCgpgYGB7cn0KY2F0KCJMb2dpa2EgTmVnYXNpICh+KSB1bnR1ayB2ZWt0b3IgeDoiLCAheCwgIlxuIikKYGBgCgpgYGB7cn0KY2F0KCJMb2dpa2EgTmVnYXNpICh+KSB1bnR1ayB2ZWt0b3IgeToiLCAheSwgIlxuIikKYGBgCgpgYGB7cn0KY2F0KCJMb2dpa2EgS29uanVuZ3NpIChEYW4pOiIsIHggJiB5ICwgIlxuIikKYGBgCgpgYGB7cn0KY2F0KCJMb2dpa2EgRGlzanVuZ3NpIChBdGF1KToiLCB4IHwgeSAsICJcbiIpCmBgYAoKYGBge3J9CmNhdCgiTG9naWthIERpc2p1bmdzaSBQYXJzaWFsOiIsIHggfHwgIHkgLCAiXG4iKQpgYGAKCgoKIyMgTGFpbi1sYWluCkJlcmlrdXQgaW5pIGp1Z2EgYWRhIGJlYmVyYXBhIG9wZXJhdG9yIHlhbmcga2VtdW5na2luYW4gYmVzYXIganVnYSBha2FuIGFuZGEgcGVybHVrYW4gcGFkYSBzYWF0CmFrYW4gbWVuZ2d1bmFrYW4gUjogIDxicj4KYGBge3J9CnggPC0gYyg3LDgsOSkgI01lbXVhdCB2ZWt0b3IgeAp5IDwtIGMoNCw1LDYpICNNZW11YXQgdmVrdG9yIHkKYGBgCgpgYGB7cn0Kc3FydCAoeCp5KQpgYGAKCmBgYHtyfQpsb2cgKHkpICNMb2dhcml0bWEKYGBgCgpgYGB7cn0KZXhwKHgpICNFa3Nwb25lbgpgYGAKCmBgYHtyfQooeS94KSp5CmBgYAoKCgojIFRpcGUgRGF0YQpEYWxhbSBwZW1yb2dyYW1hbiBzZXBlcnRpIFIgZGFuIFBoeXRvbiwgdGlwZSBkYXRhIG1lcnVwYWthbiBrb25zZXAgcGVudGluZy4gS2VkdWFueWEgZGFwYXQgbWVuZ2d1bmFrYW4gdmFyaWFiZWwgdW50dWsgbWVueWltcGFuIHRpcGUgeWFuZyBiZXJiZWRhLWJlZGEsIGJlcmlrdXQgYWRhbGFoIHRpcGUgZGF0YSBwYWxpbmcgbWVuZGFzYXIgeWFuZyBoYXJ1cyBkaWtldGFodWk6IDxicj4KCnx8fAp8Oi06fDotOnw6LTp8CnwgIFRpcGUgRGF0YSAgICAgICAgIHwgUiAgICAgICAgICAgICAgICAgICAgfCBQZW5qZWxhc2FuIHwKfCBEb3VibGUvRmxvYXQgICAgICAgfCA1LjYgICAgICAgICAgICAgICAgICB8IEJpbGFuZ2FuIHlhbmcgbWVtcHVueWFpIGtvbWEKfCBJbnRlZ2VyICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICB8IEJpbGFuZ2FuIEJ1bGF0IChjb250b2ggOiAxLDIsLi4uLG4pCnwgQmxvZWFuL0xvZ2ljYWwgICAgIHwgVFJVRS9GQUxTRSAgICAgICAgICAgfCBCZW5hciBiZXJuaWxhaSAxLCBkYW4gU2FsYWggYmVybmlsYWkgMAp8IFN0cmluZy9DaGFyYWN0ZXIgICB8ICduYWZ0YWxpYnJpZ2l0dGEnICAgIHwga2FyYWt0ZXIva2FsaW1hdCB5YW5nIGRhcGF0IGJlcnVwYSBodXJ1ZiwgYW5na2EsIGRsbCAoRGlhcGl0IHRhbmRhICcgYXRhdSB0YW5kYSAiKQp8IENvbXBsZXggICAgICAgICAgICB8IDErNWkgICAgICAgICAgICAgICAgIHwgUGFzYW5nYW4gYW5na2EgcmVhbCBkYW4gaW1hamluZXIKPGJyPgoKCkJlcmlrdXQgaW5pIGFkYWxhaCBrb2RpbmcgUiB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5ldGFwa2FuIGtlbGltYSB0aXBlIGRhdGEgZGlhdGFzOiA8YnI+CgpgYGB7cn0KZDEgPSA1LjYgICAgICAgICAgICAgICAgICAgIyBUZXRhcGthbiBuaWxhaSBkZXNpbWFsCmQyID0gYXMuaW50ZWdlcig1KSAgICAgICAgICMgVGV0YXBrYW4gbmlsYWkgaW50ZWdlcgpkMiA9IDVMICAgICAgICAgICAgICAgICAgICAjIENhcmEgbGFpbiB1bnR1ayBtZW11YXQgbmlsYWkgaW50ZWdlciBkaSBSCmQzID0gYyhUUlVFLCBGQUxTRSkgICAgICAgICMgQm9sZWFuL0xvZ2ljYWwKZDMgPSBhcy5sb2dpY2FsKGMoMCwxKSkgICAgIyBDYXJhIGxhaW4gdW50dWsgbWVtdWF0IEJvbGVhbi9Mb2dpY2FsCmQ0ID0gYyAoImEiLCAnYicsICcxMjMnKSAgICMgU3RyaW5nL0NoYXJhY3RlcgpkNSA9IDErNWkgICAgICAgICAgICAgICAgICAjIGNvbXBsZXgKYGBgCgpVbnR1ayBtZW1lcmlrc2EgdGlwZSBkYXRhIGRhbGFtIFI6IApgYGB7cn0KY2xhc3MoZDQpCmBgYAoKYGBge3J9CnR5cGVvZihkMikKYGBgCgoKCiMgQmFudHVhbiAKYGBge3J9IAojIGhlbHAuc3RhcnQoKSAgICAgICAgICMgTWVudSBkaW1hbmEgQW5kYSBkYXBhdCBtZW5hdmlnYXNpIGJhbnR1YW4gbG9rYWwgYmVyYmFzaXMgd2ViCiMgP2hlbHAgICAgICAgICAgICAgICAgIyBNZW51IGRpbWFuYSBBbmRhIGRhcGF0IG1lbmF2aWdhc2kgYmFudHVhbiBsb2thbCBiZXJiYXNpcyB3ZWIKIyA/Y2xhc3MgICAgICAgICAgICAgICAjIE1lbmRhcGF0a2FuIEJhbnR1YW4gdW50dWsgZnVuZ3NpICdjbGFzcycKIyBoZWxwKGNsYXNzKSAgICAgICAgICAjIE1lbmRhcGF0a2FuIEJhbnR1YW4gdW50dWsgZnVuZ3NpICdjbGFzcycKIyA/P2NsYXNzICAgICAgICAgICAgICAjIEppa2EgQW5kYSB0aWRhayB0YWh1IG5hbWEgZnVuZ3NpIHlhbmcgYW5kYSBjYXJpCiMgaGVscC5zZWFyY2goJ2NsYXNzJykgIyBKaWthIEFuZGEgdGlkYWsgdGFodSBuYW1hIGZ1bmdzaSB5YW5nIGFuZGEgY2FyaQpgYGAKCgoKCgoKCgoKCgoKCgo=