Email             :
RPubs            : https://rpubs.com/Calvinriswandy/
Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 Sintaks Dasar

suatu program di R dan Phyton terdiri dari 3 hal dasar, yaitu: Variabel, Operan(Nilai), dan Komentar. Variabel digunakan untuk menyimpan suatu nilai, sedangkan komentar digunakan untuk meningkatkan pemahaman penggunaan mengenai skrip atau coding.

1.1 Penugasan Variabel

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 = 20
y <- 10
100 -> z
print(c(x,y,z))
## [1]  20  10 100

1.2 Menambah 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 dan y yang sudah di rekam (komentar yang di gunakan di awal)
x = 20
y = 10
z <- x + y # mengganti nilai z yang sudah di rekam (Komentar yang di gunakan di akhir )
x + y -> z # mengganti nilai z yang sudah di rekam

2 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.

2.1 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.

Contohnya :

X=9
y=15
x+y
## [1] 35
x-y
## [1] 5
x*y
## [1] 300
x^y
## [1] 3.2768e+19
x%%y
## [1] 5

2.2 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.

Contohnya :

x <- c(2,7,3) #Memuat vektor x
y <- c(9,1,3) #Memuat vektor y
cat("Vektor x kurang dari vektor y:" , x < y , "\n")
## Vektor x kurang dari vektor y: TRUE FALSE FALSE
cat("Vektor y kurang dari sama dengan vektor x:" , y <= x , "\n")
## Vektor y kurang dari sama dengan vektor x: FALSE TRUE TRUE
cat("Vektor y lebih besar dari vektor x:" , y <= x , "\n")
## Vektor y lebih besar dari vektor x: FALSE TRUE TRUE
cat("Vektor y lebih besar sama dengan dari vektor x:" , y >= x , "\n")
## Vektor y lebih besar sama dengan dari vektor x: TRUE FALSE TRUE
cat("Vektor x sama dengan dari vektor y:" , x == y , "\n")
## Vektor x sama dengan dari vektor y: FALSE FALSE TRUE
cat("Vektor x tidak sama dengan dari vektor y:" , x != y , "\n")
## Vektor x tidak sama dengan dari vektor y: TRUE TRUE FALSE

2.3 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.

x <- c(6, FALSE, TRUE)
y <- c(FALSE, 1.2, 5+4i)

#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

2.4 Lain-Lain

Berikut ini juga ada beberapa operator yang kemungkinan besar juga akan anda perlukan pada saat akan menggunakan R.

x <- c(5,6,7) #Memuat vektor x
y <- c(1,3,5) #Memuat vektor y
sqrt (x*y)
## [1] 2.236068 4.242641 5.916080
log (y) #Logaritma
## [1] 0.000000 1.098612 1.609438
exp(x) #Eksponen
## [1]  148.4132  403.4288 1096.6332
(y/x)*y
## [1] 0.200000 1.500000 3.571429

3 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:

Berikut ini adalah koding R yang dapat digunakan untuk menetapkan kelima tipe data diatas:

d1 = 5.5                   # 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,5))    # Cara lain untuk memuat Bolean/Logical
d4 = c ("a", 'b', '135')   # String/Character
d5 = 1+4i                  # complex
class(d4)
## [1] "character"
typeof(d2)
## [1] "integer"

4 Bantuan

help.start()         # Menu dimana Anda dapat menavigasi bantuan lokal berbasis web
## starting httpd help server ... done
## If nothing happens, you should open
## 'http://127.0.0.1:13566/doc/html/index.html' yourself
LS0tDQp0aXRsZTogIlR1Z2FzMiINCnN1YnRpdGxlOiAiRGFzYXItRGFzYXIgUiBkYW4gUGh5dG9uIg0KYXV0aG9yOiAiQ2FsdmluIFJpc3dhbmRpICgyMDIxNDkyMDAwMykiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KICAgIGNzczogc3R5bGUxLmNzcw0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KLS0tDQoNCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyNSUiIHNyYz0iZm90by5wbmciLz4gDQoNCmBgYHtyIGxvZ28sIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAnMzAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJMb2dvLnBuZyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgY2FsdmluLnJpc3dhbmRpQHN0dWRlbnQubWF0YW5hdW5pdmVyc2l0eS5hYy5pZCA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS9DYWx2aW5yaXN3YW5keS8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYV0oaHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiKSA8YnI+DQpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBBUkEgQ2VudGVyLCBNYXRhbmEgVW5pdmVyc2l0eSBUb3dlciA8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4NCg0KKioqKg0KIyBTaW50YWtzIERhc2FyDQoNCnN1YXR1IHByb2dyYW0gZGkgUiBkYW4gUGh5dG9uIHRlcmRpcmkgZGFyaSAzIGhhbCBkYXNhciwgeWFpdHU6IFZhcmlhYmVsLCBPcGVyYW4oTmlsYWkpLCBkYW4gS29tZW50YXIuIFZhcmlhYmVsIGRpZ3VuYWthbiB1bnR1ayBtZW55aW1wYW4gc3VhdHUgbmlsYWksIHNlZGFuZ2thbiBrb21lbnRhciBkaWd1bmFrYW4gdW50dWsgbWVuaW5na2F0a2FuIHBlbWFoYW1hbiBwZW5nZ3VuYWFuIG1lbmdlbmFpIHNrcmlwIGF0YXUgY29kaW5nLg0KDQojIyBQZW51Z2FzYW4gVmFyaWFiZWwNCg0KUGVudWdhc2FuIHN1YXR1IHByb2dyYW0gYmlhc2FueWEgbWVuZ2d1bmFrYW4gc2VidWFoIHZhcmlhYmVsIHlhbmcgZGljYWRhbmdrYW4gdW50dWsgZGFwYXQgbWVyZWthbSBiZXJiYWdhaSBqZW5pcyBkYXRhIHNlc3VhaSBuYW1hIHlhbmcgZGliZXJpa2FuIGtlIGxva2FzaSBwZW55aW1wYW5hbi9tZW1vcnkuIFBlcmludGFoIHBlbnVnYXNhbiB2YXJpYWJlbCBpbmksIGRhcGF0IGRpIG5vdGFzaWthbiBkZW5nYW4gdGlnYSBjYXJhOg0KKiBbPV0sIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gc2VkZXJoYW5hLg0KKiBbPC1dLCBkaWd1bmFrYW4gdW50dWsgcGVudWdhc2FuIGRhcmkgc2lzaSBraXJpLg0KKiBbLT5dLCBkaWd1bmFrYW4gdW50dWsgcGVudWdhc2FuIGRhcmkgc2lzaSBrYW5hbi4NCg0KYGBge3J9DQoNCnggPSAyMA0KeSA8LSAxMA0KMTAwIC0+IHoNCnByaW50KGMoeCx5LHopKQ0KDQpgYGANCg0KIyMgTWVuYW1iYWggS29tZW50YXINCg0KTWVuYW1iYWhrYW4vTWVtYmVyaWthbiBLb21lbnRhciBkYWxhbSBza3JpcC9rb2RpbmcgUiBkYW4gUGh5dG9uIGFkYWxhaCB1bnR1ayBtZW11ZGFoa2FuIGFuZGEgbWVtYWhhbWkgYXJ0aS9tYWtuYSBwZW5nZ3VuYWFuIHN1YXR1IHBlcmludGFoL3Byb2dyYW0uIEtvZW1udGFyIHlhbmcgZGkgdHVsaXMgZGFsYW0gcHJvZ3JhbSB0ZXJzZWJ1dCBoYW55YSBiZXJzaWZhdCBwZW5qZWxhc2FuIHRlbnRhbmcgYXBhIHlhbmcgZGlsYWt1a2FubnlhIGF0YXUgYXBhIHlhbmcgc2VoYXJ1c255YSBkaWxha3VrYW4gb2xlaCBzZWJ1YWggc2tyaXAva29kaW5nLiBQZXJsdSBkaWNhdGF0IGJhaHdhIGtvbWVudGFyIHlhbmcgYmVyc2lmYXQgaW5mb3JtYXNpIHRpZGFrIGFkYSBodWJ1bmdhbm55YSBkZW5nYW4gbG9naWthIHBlbXJvZ3JhbWFuIHlhbmcgc2VkYW5nIGFuZGEgbGFrdWthbiBNZXJla2EgYmVuYXItYmVuYXIgZGlhYmFpa2FuIG9sZWgga29tcGlsZXIgZGFuIGRlbmdhbiBkZW1pa2lhbiB0aWRhayBwZXJuYWggdGVyY2VybWluIGRhbGFtIGlucHV0LiBCaWFzYW55YSBrb21lbnRhciBkaXR1bGlza2FuIHBhZGEgc2F0dSBiYXJpcyB5YW5nIHRlcnNlZGlhIHBhZGEgZGkgUiBkYW4gUGh5dG9uLCBkZW5nYW4gbWVuZ2d1bmFrYW4gWyNdIGRpYXdhbCBtYXVwdW4gZGlha2hpciBwZXJueWF0YWFuLg0KDQoNCmBgYHtyfQ0KDQojIE1lbmdnYW50aSBuaWxhaSB4IGRhbiB5IHlhbmcgc3VkYWggZGkgcmVrYW0gKGtvbWVudGFyIHlhbmcgZGkgZ3VuYWthbiBkaSBhd2FsKQ0KeCA9IDIwDQp5ID0gMTANCnogPC0geCArIHkgIyBtZW5nZ2FudGkgbmlsYWkgeiB5YW5nIHN1ZGFoIGRpIHJla2FtIChLb21lbnRhciB5YW5nIGRpIGd1bmFrYW4gZGkgYWtoaXIgKQ0KeCArIHkgLT4geiAjIG1lbmdnYW50aSBuaWxhaSB6IHlhbmcgc3VkYWggZGkgcmVrYW0NCg0KYGBgDQoNCiMgT3BlcmF0b3INCg0KT3BlcmF0b3IgYWRhbGFoIHNpbWJvbCB5YW5nIG1lbmdhcmFoa2FuIGNvbXBpbGVyIHVudHVrIG1lbGFrdWthbiBiZXJiYWdhaSBtYWNhbSBvcGVyYXNpIHRlcmhhZGFwIGJlYmVyYXBhIHBlbnVnYXNhbi4gT3BlcmF0b3IgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aXMsIGxvZ2lrYSwgZGFuIGtlcHV0dXNhbiB5YW5nIGRpbGFrdWthbiBwYWRhIHNla3VtcHVsYW4gQmlsYW5nYW4gS29tcGxla3MsIEludGVnZXIsIGRhbiBOdW1lcmlrIHNlYmFnYWkgcGVudWdhc2FuIG1hc3VrYW4gKGlucHV0KS4gUiBkYW4gUHl0aG9uIG1lbmR1a3VuZyBzZWJhZ2lhbiBiZXNhciBlbXBhdCBqZW5pcyBvcGVyYXRvciBiaW5lciBhbnRhcmEgc2F0dSBzZXQgcGVudWdhc2FuLiBEYWxhbSBpbmksIGtpdGEgYWthbiBtZWxpaGF0IGJlcmJhZ2FpIGplbmlzIG9wZXJhdG9yIHlhbmcgdGVyc2VkaWEgZGkgUiBkYW4gUHl0aG9uIGRhbiBwZW5nZ3VuYWFubnlhLg0KDQojIyBBcml0bWF0aWthDQoNClBlbmdndW5hYW4gb3BlcmF0b3IgYXJpdG1hdGlrYSBkYWxhbSBwcm9ncmFtIFIgZGFuIFB5dGhvbiBhZGFsYWggdW50dWsgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aWthLCBzZXBlcnRpIHBlbmFtYmFoYW4sIHBlbmd1cmFuZ2FuLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIG1vZHVsby4gT3BlcmF0b3IgYXJpdG1hdGlrYSB5YW5nIGRpbGFrdWthbiBiaXNhIHNhamEgYmVydXBhIG5pbGFpIHNrYWxhciwgYmlsYW5nYW4ga29tcGxla3MsIGF0YXUgdmVrdG9yLg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogY2VudGVyOyB3aWR0aDozMCUiIHNyYz0iYXJpdG1hdGlrYS5wbmciLz4NCg0KQ29udG9obnlhIDoNCg0KDQpgYGB7cn0NCg0KWD05DQp5PTE1DQoNCmBgYA0KDQpgYGB7cn0NCngreQ0KDQpgYGANCg0KYGBge3J9DQp4LXkNCg0KYGBgDQoNCg0KYGBge3J9DQp4KnkNCg0KYGBgDQoNCmBgYHtyfQ0KeF55DQoNCmBgYA0KDQoNCmBgYHtyfQ0KeCUleQ0KDQpgYGANCg0KIyMgUmVsYXNpb25hbA0KDQpPcGVyYXRvciByZWxhc2lvbmFsIG1lbGFrdWthbiBvcGVyYXNpIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3BlcmFuLiBNZW5nZW1iYWxpa2FuIG5pbGFpIEJvb2xlYW4gVFJVRSBqaWthIG9wZXJhbiBwZXJ0YW1hIG1lbWVudWhpIHJlbGFzaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIG9wZXJhbiBrZWR1YS4gTmlsYWkgVFJVRSBzZWxhbHUgZGlhbmdnYXAgbGViaWggYmVzYXIgZGFyaSBGQUxTRS4NCg0KQ29udG9obnlhIDoNCg0KYGBge3J9DQp4IDwtIGMoMiw3LDMpICNNZW11YXQgdmVrdG9yIHgNCnkgPC0gYyg5LDEsMykgI01lbXVhdCB2ZWt0b3IgeQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIHZla3RvciB5OiIgLCB4IDwgeSAsICJcbiIpDQoNCmBgYA0KDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHkga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHg6IiAsIHkgPD0geCAsICJcbiIpDQoNCmBgYA0KDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHkgbGViaWggYmVzYXIgZGFyaSB2ZWt0b3IgeDoiICwgeSA8PSB4ICwgIlxuIikNCg0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJWZWt0b3IgeSBsZWJpaCBiZXNhciBzYW1hIGRlbmdhbiBkYXJpIHZla3RvciB4OiIgLCB5ID49IHggLCAiXG4iKQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IHNhbWEgZGVuZ2FuIGRhcmkgdmVrdG9yIHk6IiAsIHggPT0geSAsICJcbiIpDQoNCmBgYA0KDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHggdGlkYWsgc2FtYSBkZW5nYW4gZGFyaSB2ZWt0b3IgeToiICwgeCAhPSB5ICwgIlxuIikNCg0KYGBgDQoNCiMjIExvZ2lrYQ0KDQpPcGVyYXRvciBsb2dpcyBtZW5zaW11bGFzaWthbiBvcGVyYXNpIGtlcHV0dXNhbiwgYmVyZGFzYXJrYW4gb3BlcmF0b3IgeWFuZyBkaXRlbnR1a2FuIGFudGFyYSBvcGVyYW4sIHlhbmcga2VtdWRpYW4gZGlldmFsdWFzaSBrZSBuaWxhaSBCb29sZWFuIEJlbmFyIGF0YXUgU2FsYWguIE5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbCBkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpIEJFTkFSLCBiYWlrIGl0dSBiaWxhbmdhbiBrb21wbGVrcyBhdGF1IGJpbGFuZ2FuIHJlYWwuDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiBjZW50ZXI7IHdpZHRoOjUwJSIgc3JjPSJsb2dpa2EucG5nIi8+DQoNCmBgYHtyfQ0KeCA8LSBjKDYsIEZBTFNFLCBUUlVFKQ0KeSA8LSBjKEZBTFNFLCAxLjIsIDUrNGkpDQoNCiNNZWxha3VrYW4gT3BlcmFzaSBMb2dpa2EgUGFkYSBPcGVyYW4NCg0KYGBgDQoNCg0KYGBge3J9DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB4OiIsICF4LCAiXG4iKQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB5OiIsICF5LCAiXG4iKQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoIkxvZ2lrYSBLb25qdW5nc2kgKERhbik6IiwgeCAmIHkgLCAiXG4iKQ0KDQpgYGANCg0KYGBge3J9DQpjYXQoIkxvZ2lrYSBEaXNqdW5nc2kgKEF0YXUpOiIsIHggfCB5ICwgIlxuIikNCg0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJMb2dpa2EgRGlzanVuZ3NpIFBhcnNpYWw6IiwgeCB8fCAgeSAsICJcbiIpDQoNCmBgYA0KDQojIyBMYWluLUxhaW4NCg0KQmVyaWt1dCBpbmkganVnYSBhZGEgYmViZXJhcGEgb3BlcmF0b3IgeWFuZyBrZW11bmdraW5hbiBiZXNhciBqdWdhIGFrYW4gYW5kYSBwZXJsdWthbiBwYWRhIHNhYXQgYWthbiBtZW5nZ3VuYWthbiBSLg0KDQpgYGB7cn0NCnggPC0gYyg1LDYsNykgI01lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDEsMyw1KSAjTWVtdWF0IHZla3RvciB5DQoNCmBgYA0KDQpgYGB7cn0NCnNxcnQgKHgqeSkNCg0KYGBgDQoNCmBgYHtyfQ0KbG9nICh5KSAjTG9nYXJpdG1hDQoNCmBgYA0KDQpgYGB7cn0NCmV4cCh4KSAjRWtzcG9uZW4NCg0KYGBgDQoNCmBgYHtyfQ0KKHkveCkqeQ0KDQpgYGANCg0KIyBUaXBlIERhdGENCg0KRGFsYW0gcGVtcm9ncmFtYW4gc2VwZXJ0aSBSIGRhbiBQaHl0b24sIHRpcGUgZGF0YSBtZXJ1cGFrYW4ga29uc2VwIHBlbnRpbmcuIEtlZHVhbnlhIGRhcGF0IG1lbmdndW5ha2FuIHZhcmlhYmVsIHVudHVrIG1lbnlpbXBhbiB0aXBlIHlhbmcgYmVyYmVkYS1iZWRhLCBiZXJpa3V0IGFkYWxhaCB0aXBlIGRhdGEgcGFsaW5nIG1lbmRhc2FyIHlhbmcgaGFydXMgZGlrZXRhaHVpOg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogY2VudGVyOyB3aWR0aDo1MCUiIHNyYz0idGlwZWRhdGEucG5nIi8+DQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBrb2RpbmcgUiB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5ldGFwa2FuIGtlbGltYSB0aXBlIGRhdGEgZGlhdGFzOg0KDQpgYGB7cn0NCmQxID0gNS41ICAgICAgICAgICAgICAgICAgICMgVGV0YXBrYW4gbmlsYWkgZGVzaW1hbA0KZDIgPSBhcy5pbnRlZ2VyKDUpICAgICAgICAgIyBUZXRhcGthbiBuaWxhaSBpbnRlZ2VyDQpkMiA9IDVMICAgICAgICAgICAgICAgICAgICAjIENhcmEgbGFpbiB1bnR1ayBtZW11YXQgbmlsYWkgaW50ZWdlciBkaSBSDQpkMyA9IGMoVFJVRSwgRkFMU0UpICAgICAgICAjIEJvbGVhbi9Mb2dpY2FsDQpkMyA9IGFzLmxvZ2ljYWwoYygwLDUpKSAgICAjIENhcmEgbGFpbiB1bnR1ayBtZW11YXQgQm9sZWFuL0xvZ2ljYWwNCmQ0ID0gYyAoImEiLCAnYicsICcxMzUnKSAgICMgU3RyaW5nL0NoYXJhY3Rlcg0KZDUgPSAxKzRpICAgICAgICAgICAgICAgICAgIyBjb21wbGV4DQoNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKGQ0KQ0KDQpgYGANCg0KYGBge3J9DQp0eXBlb2YoZDIpDQoNCmBgYA0KDQojIEJhbnR1YW4NCg0KYGBge3J9DQpoZWxwLnN0YXJ0KCkgICAgICAgICAjIE1lbnUgZGltYW5hIEFuZGEgZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=