Pengenalan

Operasi Aritmatika

# Penjumlahan
5+2
[1] 7
# Pengurangan
5-2
[1] 3
# Perkalian
5*2
[1] 10
# Pembagian
5/2
[1] 2.5
# Division / Hasil Bagi
5%/%2
[1] 2
# Modulus / Sisa Bagi
5%%2
[1] 1
# Perpangkatan
5^2
[1] 25

Fungsi Aritmatika

# Logaritma
log2(8)
[1] 3
log10(10)
[1] 1
logb(8,2)
[1] 3
# Eksponensial
exp(8)
[1] 2980.958
# Absolut/Mutlak
abs(-8)
[1] 8
# Akar Kuadrat
sqrt(4)
[1] 2
# Trigonometri (Satuan Radian)
sin(pi)
[1] 1.224647e-16
cos(pi)
[1] -1
tan(pi)
[1] -1.224647e-16

Variabel / Objek

R memiliki berbagai fleksibilitas dalam memberikan nama variabel, namun demikian beberapa aturan penamaan variabel yang perlu diketahui adalah sebagai berikut:

  1. Menggunakan huruf besar (kapital ) yaitu huruf A-Z juga menggunakan huruf kecil yaitu huruf (a-z)
  2. Menggunakan karakter numerik (0-9), juga titik (.) atau garisbawah (**_**)
  3. Tidak dapat menggunakan spasi, misalnya penulisan variabel:“harga buku”adalah contoh yang salah dalam penamaan variabel, bisa diganti dengan variabel seperti ini: “harga.buku”
  4. Variabel yang dibuat adalah case sensitive artinya pengetikkannya harus persis sama dan membedakan antara huruf besar dan huruf kecil. Misalnya Hargabuku dan hargabuku adalah dua variabel yang berbeda.
  5. Penamaan variabel sebaiknya mulai dengan huruf, meski Anda bisa memberikan nama variabel dengan _hargabuku atau .hargabuku hanya saja penamaan itu tidak disarankan
  6. Sebaiknya hindari menggunakan kata-kata yang sama dengan perintah-perintah yang dikenal R seperti: if, else, repeat, while, function, for,in, next, break, TRUE, FALSE, NULL, NA, NA_integer dan sebagainya.
A <- 1
B <- 2
print(A)
[1] 1
print(B)
[1] 2

Operator Assignment

x <- 5
5 -> y
z = 5
x <<- 5
5 ->> y
print(x)
[1] 5
print(y)
[1] 5
print(z)
[1] 5

Operator Relasi

A <- 1
B <- 2
A == B
[1] FALSE
A > B
[1] FALSE
A < B
[1] TRUE
A >= B
[1] FALSE
A <= B
[1] TRUE
A != B
[1] TRUE

Operator Logika

TRUE&&FALSE
[1] FALSE
TRUE||FALSE
[1] TRUE
!TRUE
[1] FALSE

Tipe Data

  1. Logical > Nilai Boolean
  2. Numeric > Segala jenis angka
  3. Integer > Bilangan integer (bilangan bulat)
  4. Character > Karakter dan string
  5. Complex > Bilangan kompleks
  6. Raw > Segala jenis data yang disimpan sebagai raw bytes
# Logical
my_logical <- TRUE
my_logical1 <- T
my_logical2 <- FALSE
my_logical3 <- F
class(my_logical)
[1] "logical"
logical
class(my_logical1)
[1] "logical"
logical
class(my_logical2)
[1] "logical"
logical
class(my_logical3)
[1] "logical"
logical
# Numeric
my_numeric <- 10
my_numeric1 <- 10.5
class(my_numeric)
[1] "numeric"
numeric
class(my_numeric1)
[1] "numeric"
numeric
# Integer
my_integer <- 20L
my_integer1 <- 15L 
class(my_integer)
[1] "integer"
integer
class(my_integer)
[1] "integer"
integer
# Character
my_character <- "Haloo"
my_character1 <- "A"
my_character2 <- 'Hehe'
class(my_character)
[1] "character"
character
class(my_character1)
[1] "character"
character
class(my_character2)
[1] "character"
character
# Complex
my_complex <- 5i
my_complex1 <- 10i + 5
class(my_complex)
[1] "complex"
complex
class(my_complex1)
[1] "complex"
complex
# Raw
my_raw <- charToRaw("Hello World")
class(my_raw)
[1] "raw"
raw

Struktur/Objek Data

  1. Vector > Vector adalah objek data paling sederhana yang ada di dalam R. Secara umum jenis vector terbagi 2, yaitu numeric dan character. Ada banyak sekali cara untuk membuat sebuah vector di R.
  2. Matrix > Matriks adalah objek di R yang memiliki 2 dimensi, baris (row/m) dan kolom (column/n), dan tipe nilainya sama. Jika ketika membuat sebuah matriks elemennya memiliki minimal 1 elemen bertipe character maka seluruh matriks tersebut akan bertipe character. Membuat matriks di R menggunakan vector yang dikonversi dimensinya. Karena seperti yang sudah diketahui bahwa sebuah vector di R tidak mempunyai dimensi, tetapi dapat dibayangkan seperti matriks berukuran m baris dan 1 (satu) kolom.
  3. Array >Array merupakan objek seperti matriks dengan dimensi lebih banyak. Jika matriks hanya mempunyai 2 dimensi, maka array dapat memiliki lebih dari 2 dimensi.
  4. Lists > Objek list pada dasarnya mirip seperti vector, hanya saja tipe elemennya bisa berbeda. Jika pada vector numeric semua elemennya harus berupa numerik. Pada vector character semuanya harus karakter. Pada objek list elemennya dapat berupa vector, factor, matriks, array, dataframe, bahkan list di dalam list atau objek lain seperti model prediktif yang dibuat di R.
  5. Factor > Factor merupakan bentuk lebih luas dari vector. Biasanya factor lebih sering digunakan untuk menyimpan data nominal atau ordinal. Misalnya vector character yang berisi “male” dan “female”. Pada vector character, nilainya adalah “male” dan “female” seperti terlihat apa adanya. Namun pada factor, tampilan dari isi datanya mungkin “male” dan “female” tetapi isi dari factor adalah pengkodean numerik. Misal untuk “female” nilai sebenarnya adalah 1, sedangkan “male” berniali 2.
  6. Data Frame > Dataframe layaknya sebuah tabel di Ms Excel, terdiri dari baris dan kolom dengan nama masing-masing kolom berbeda. Apa bedanya dengan matriks? Matriks hanya bisa menyimpan tipe data yang sama, numeric atau character seluruhnya. Pada dataframe, masing-masing kolom boleh memiliki tipe data yang berbeda. Dataframe seperti umumnya bentuk tabel yang sering kita gunakan.
# Vector
my_vector <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
my_vector1 <- 1:20
my_vector2 <- seq(1,20)
print(my_vector)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
print(my_vector1)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
print(my_vector2)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
is.vector(my_vector)
[1] TRUE
is.vector(my_vector1)
[1] TRUE
is.vector(my_vector2)
[1] TRUE
# Matrix
my_matrix <- matrix(1:20,4,5,byrow = T)
print(my_matrix)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20
is.matrix(my_matrix)
[1] TRUE
# Array
my_array <- array(LETTERS,dim=c(4,2,3))
print(my_array)
, , 1

     [,1] [,2]
[1,] "A"  "E" 
[2,] "B"  "F" 
[3,] "C"  "G" 
[4,] "D"  "H" 

, , 2

     [,1] [,2]
[1,] "I"  "M" 
[2,] "J"  "N" 
[3,] "K"  "O" 
[4,] "L"  "P" 

, , 3

     [,1] [,2]
[1,] "Q"  "U" 
[2,] "R"  "V" 
[3,] "S"  "W" 
[4,] "T"  "X" 
is.array(my_array)
[1] TRUE
#List
my_list <- list(TRUE,FALSE,c(1,2,3,4,5),1:20,"Ayam")
print(my_list)
[[1]]
[1] TRUE

[[2]]
[1] FALSE

[[3]]
[1] 1 2 3 4 5

[[4]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

[[5]]
[1] "Ayam"
is.list(my_list)
[1] TRUE
# Factor (Data Kategori Nominal)
my_factor <- factor(c("Ayam","Bebek","Sapi","Kambing","Kucing","Kambing","Ayam","Bebek","Ayam"))
print(my_factor)
[1] Ayam    Bebek   Sapi    Kambing Kucing  Kambing Ayam    Bebek   Ayam   
Levels: Ayam Bebek Kambing Kucing Sapi
is.factor(my_factor)
[1] TRUE
# Factor (Data Kategori Ordinal)
my_factor1 <- factor(c("SD","SMA","SD","SMP","SD","SMA","SMA","SD"), ordered = T, levels = c("SD","SMP","SMA"))
print(my_factor1)
[1] SD  SMA SD  SMP SD  SMA SMA SD 
Levels: SD < SMP < SMA
is.factor(my_factor1)
[1] TRUE
# Data Frame
nama <- c("Wati", "Budi", "Edi")
nilai <- c(100,90,95)
my_df <- data.frame(nama,nilai)
str(my_df)
'data.frame':   3 obs. of  2 variables:
 $ nama : Factor w/ 3 levels "Budi","Edi","Wati": 3 1 2
 $ nilai: num  100 90 95
print(my_df)
  nama nilai
1 Wati   100
2 Budi    90
3  Edi    95

Konsep pemilihan dan pengulangan

# Conditional If Else
nilai_saya <- 100
if (nilai_saya >= 85 ) {
  nilai_mutu = "A"
} else if (nilai_saya >= 80) {
  nilai_mutu = "A-"
} else if  (nilai_saya >= 75) {
  nilai_mutu = "B+"
} else if (nilai_saya >= 70) {
  nilai_mutu = "B"
} else if (nilai_saya >= 65) {
  nilai_mutu = "C+"
} else if (nilai_saya >= 60) {
  nilai_mutu = "C"
} else if (nilai_saya >= 55) {
  nilai_mutu = "D+"
} else if (nilai_saya <= 55) {
  nilai_mutu = "D+"
} else {
  print("Nilai anda salah !!")
}

print(nilai_mutu)
[1] "A"
# Switch
x <- 5
y <- 5
pilihan <- "/"
switch(pilihan,
      "+" = hasil <- x + y,
      "-" = hasil <- x - y,
      "*" = hasil <- x * y,
      "/" = hasil <- x / y
)
print(hasil)
[1] 1
# For Loop
for (i in 1:10) {
  print("Saya tidak akan mengulanginya lagi")
}
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
[1] "Saya tidak akan mengulanginya lagi"
# While Loop
j <- 1

while (j<=10){
  print(j)
  j <- j+1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
#Break Keywords
for (i in 1:10){
  if (i == 5){
    break
  }
  print(paste0("Indeks ke-",i))
}
[1] "Indeks ke-1"
[1] "Indeks ke-2"
[1] "Indeks ke-3"
[1] "Indeks ke-4"
#Next Keywords
for (i in 1:10){
  if (i == 5){
    next
  }
  print(paste0("Indeks ke-",i))
}
[1] "Indeks ke-1"
[1] "Indeks ke-2"
[1] "Indeks ke-3"
[1] "Indeks ke-4"
[1] "Indeks ke-6"
[1] "Indeks ke-7"
[1] "Indeks ke-8"
[1] "Indeks ke-9"
[1] "Indeks ke-10"
# Repeat Loop
k <-1
repeat {
  if(k>10) {
    break
  }
  print(paste0("Indeks ke-",k))
  k <- k +1

}
[1] "Indeks ke-1"
[1] "Indeks ke-2"
[1] "Indeks ke-3"
[1] "Indeks ke-4"
[1] "Indeks ke-5"
[1] "Indeks ke-6"
[1] "Indeks ke-7"
[1] "Indeks ke-8"
[1] "Indeks ke-9"
[1] "Indeks ke-10"
LS0tCnRpdGxlOiAiRGFzYXItRGFzYXIgUGVtcm9ncmFtYW4gUiBVbnR1ayBTdGF0aXN0aWthIgphdXRob3I6ICJJIFB1dHUgQWd1cyBXYWh5dSBEdXBheWFuYSIKZGF0ZTogIkZlYnJ1YXJ5IDE1LCAyMDIyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIFBlbmdlbmFsYW4KCiMjIE9wZXJhc2kgQXJpdG1hdGlrYQoKYGBgIHtyfQojIFBlbmp1bWxhaGFuCjUrMgpgYGAKCgpgYGAge3J9CiMgUGVuZ3VyYW5nYW4KNS0yCmBgYAoKCmBgYCB7cn0KIyBQZXJrYWxpYW4KNSoyCmBgYAoKCmBgYCB7cn0KIyBQZW1iYWdpYW4KNS8yCmBgYAoKCmBgYCB7cn0KIyBEaXZpc2lvbiAvIEhhc2lsIEJhZ2kKNSUvJTIKYGBgCgoKYGBgIHtyfQojIE1vZHVsdXMgLyBTaXNhIEJhZ2kKNSUlMgpgYGAKCgpgYGAge3J9CiMgUGVycGFuZ2thdGFuCjVeMgpgYGAKCiMjIEZ1bmdzaSBBcml0bWF0aWthCgpgYGAge3J9CiMgTG9nYXJpdG1hCmxvZzIoOCkKbG9nMTAoMTApCmxvZ2IoOCwyKQpgYGAKCgpgYGAge3J9CiMgRWtzcG9uZW5zaWFsCmV4cCg4KQpgYGAKCgoKYGBgIHtyfQojIEFic29sdXQvTXV0bGFrCmFicygtOCkKYGBgCgoKCmBgYCB7cn0KIyBBa2FyIEt1YWRyYXQKc3FydCg0KQpgYGAKCgoKYGBgIHtyfQojIFRyaWdvbm9tZXRyaSAoU2F0dWFuIFJhZGlhbikKc2luKHBpKQpjb3MocGkpCnRhbihwaSkKYGBgCgoKIyMgVmFyaWFiZWwgLyBPYmplawoKUiBtZW1pbGlraSBiZXJiYWdhaSBmbGVrc2liaWxpdGFzIGRhbGFtIG1lbWJlcmlrYW4gbmFtYSB2YXJpYWJlbCwgbmFtdW4KZGVtaWtpYW4gYmViZXJhcGEgYXR1cmFuIHBlbmFtYWFuIHZhcmlhYmVsIHlhbmcgcGVybHUgZGlrZXRhaHVpIGFkYWxhaApzZWJhZ2FpIGJlcmlrdXQ6CgoxLiAgTWVuZ2d1bmFrYW4gaHVydWYgYmVzYXIgKGthcGl0YWwgKSB5YWl0dSBodXJ1ZiBBLVoganVnYSBtZW5nZ3VuYWthbgogICAgaHVydWYga2VjaWwgeWFpdHUgaHVydWYgKGEteikKMi4gIE1lbmdndW5ha2FuIGthcmFrdGVyIG51bWVyaWsgKDAtOSksIGp1Z2EgdGl0aWsgKC4pIGF0YXUgZ2FyaXNiYXdhaAogICAgKFwqXCpcX1wqXCopCjMuICBUaWRhayBkYXBhdCBtZW5nZ3VuYWthbiBzcGFzaSwgbWlzYWxueWEgcGVudWxpc2FuIHZhcmlhYmVsOiJoYXJnYQogICAgYnVrdSJhZGFsYWggY29udG9oIHlhbmcgc2FsYWggZGFsYW0gcGVuYW1hYW4gdmFyaWFiZWwsIGJpc2EgZGlnYW50aQogICAgZGVuZ2FuIHZhcmlhYmVsIHNlcGVydGkgaW5pOiAiaGFyZ2EuYnVrdSIKNC4gIFZhcmlhYmVsIHlhbmcgZGlidWF0IGFkYWxhaCBjYXNlIHNlbnNpdGl2ZSBhcnRpbnlhIHBlbmdldGlra2FubnlhCiAgICBoYXJ1cyBwZXJzaXMgc2FtYSBkYW4gbWVtYmVkYWthbiBhbnRhcmEgaHVydWYgYmVzYXIgZGFuIGh1cnVmIGtlY2lsLgogICAgTWlzYWxueWEgSGFyZ2FidWt1IGRhbiBoYXJnYWJ1a3UgYWRhbGFoIGR1YSB2YXJpYWJlbCB5YW5nIGJlcmJlZGEuCjUuICBQZW5hbWFhbiB2YXJpYWJlbCBzZWJhaWtueWEgbXVsYWkgZGVuZ2FuIGh1cnVmLCBtZXNraSBBbmRhIGJpc2EKICAgIG1lbWJlcmlrYW4gbmFtYSB2YXJpYWJlbCBkZW5nYW4gXF9oYXJnYWJ1a3UgYXRhdSAuaGFyZ2FidWt1IGhhbnlhCiAgICBzYWphIHBlbmFtYWFuIGl0dSB0aWRhayBkaXNhcmFua2FuCjYuICBTZWJhaWtueWEgaGluZGFyaSBtZW5nZ3VuYWthbiBrYXRhLWthdGEgeWFuZyBzYW1hIGRlbmdhbgogICAgcGVyaW50YWgtcGVyaW50YWggeWFuZyBkaWtlbmFsIFIgc2VwZXJ0aTogaWYsIGVsc2UsIHJlcGVhdCwgd2hpbGUsCiAgICBmdW5jdGlvbiwgZm9yLGluLCBuZXh0LCBicmVhaywgVFJVRSwgRkFMU0UsIE5VTEwsIE5BLCBOQV9pbnRlZ2VyIGRhbgogICAgc2ViYWdhaW55YS4KCmBgYCB7cn0KQSA8LSAxCkIgPC0gMgpgYGAKCmBgYCB7cn0KcHJpbnQoQSkKcHJpbnQoQikKYGBgCgojIyBPcGVyYXRvciBBc3NpZ25tZW50CgpgYGAge3J9CnggPC0gNQo1IC0+IHkKeiA9IDUKeCA8PC0gNQo1IC0+PiB5CmBgYAoKYGBgIHtyfQpwcmludCh4KQpwcmludCh5KQpwcmludCh6KQpgYGAKCgojIyBPcGVyYXRvciBSZWxhc2kKCmBgYCB7cn0KQSA8LSAxCkIgPC0gMgpgYGAKCmBgYCB7cn0KQSA9PSBCCkEgPiBCCkEgPCBCCkEgPj0gQgpBIDw9IEIKQSAhPSBCCmBgYAoKIyMgT3BlcmF0b3IgTG9naWthCgpgYGAge3J9ClRSVUUmJkZBTFNFClRSVUV8fEZBTFNFCiFUUlVFCmBgYAoKCiMjIFRpcGUgRGF0YQoKMS4gIExvZ2ljYWwgXD4gTmlsYWkgQm9vbGVhbgoyLiAgTnVtZXJpYyBcPiBTZWdhbGEgamVuaXMgYW5na2EKMy4gIEludGVnZXIgXD4gQmlsYW5nYW4gaW50ZWdlciAoYmlsYW5nYW4gYnVsYXQpCjQuICBDaGFyYWN0ZXIgXD4gS2FyYWt0ZXIgZGFuIHN0cmluZwo1LiAgQ29tcGxleCBcPiBCaWxhbmdhbiBrb21wbGVrcwo2LiAgUmF3IFw+IFNlZ2FsYSBqZW5pcyBkYXRhIHlhbmcgZGlzaW1wYW4gc2ViYWdhaSByYXcgYnl0ZXMKCmBgYCB7cn0KIyBMb2dpY2FsCm15X2xvZ2ljYWwgPC0gVFJVRQpteV9sb2dpY2FsMSA8LSBUCm15X2xvZ2ljYWwyIDwtIEZBTFNFCm15X2xvZ2ljYWwzIDwtIEYKYGBgCgpgYGAge3J9CmNsYXNzKG15X2xvZ2ljYWwpCmNsYXNzKG15X2xvZ2ljYWwxKQpjbGFzcyhteV9sb2dpY2FsMikKY2xhc3MobXlfbG9naWNhbDMpCmBgYAoKCmBgYCB7cn0KIyBOdW1lcmljCm15X251bWVyaWMgPC0gMTAKbXlfbnVtZXJpYzEgPC0gMTAuNQpgYGAKCmBgYCB7cn0KY2xhc3MobXlfbnVtZXJpYykKY2xhc3MobXlfbnVtZXJpYzEpCmBgYAoKCgpgYGAge3J9CiMgSW50ZWdlcgpteV9pbnRlZ2VyIDwtIDIwTApteV9pbnRlZ2VyMSA8LSAxNUwgCmBgYAoKYGBgIHtyfQpjbGFzcyhteV9pbnRlZ2VyKQpjbGFzcyhteV9pbnRlZ2VyKQpgYGAKCmBgYCB7cn0KIyBDaGFyYWN0ZXIKbXlfY2hhcmFjdGVyIDwtICJIYWxvbyIKbXlfY2hhcmFjdGVyMSA8LSAiQSIKbXlfY2hhcmFjdGVyMiA8LSAnSGVoZScKYGBgCgpgYGAge3J9CmNsYXNzKG15X2NoYXJhY3RlcikKY2xhc3MobXlfY2hhcmFjdGVyMSkKY2xhc3MobXlfY2hhcmFjdGVyMikKYGBgCgpgYGAge3J9CiMgQ29tcGxleApteV9jb21wbGV4IDwtIDVpCm15X2NvbXBsZXgxIDwtIDEwaSArIDUKYGBgCgpgYGAge3J9CmNsYXNzKG15X2NvbXBsZXgpCmNsYXNzKG15X2NvbXBsZXgxKQpgYGAKCmBgYCB7cn0KIyBSYXcKbXlfcmF3IDwtIGNoYXJUb1JhdygiSGVsbG8gV29ybGQiKQpjbGFzcyhteV9yYXcpCmBgYAoKIyMgU3RydWt0dXIvT2JqZWsgRGF0YQoKMS4gIFZlY3RvciBcPiBWZWN0b3IgYWRhbGFoIG9iamVrIGRhdGEgcGFsaW5nIHNlZGVyaGFuYSB5YW5nIGFkYSBkaQogICAgZGFsYW0gUi4gU2VjYXJhIHVtdW0gamVuaXMgdmVjdG9yIHRlcmJhZ2kgMiwgeWFpdHUgbnVtZXJpYyBkYW4KICAgIGNoYXJhY3Rlci4gQWRhIGJhbnlhayBzZWthbGkgY2FyYSB1bnR1ayBtZW1idWF0IHNlYnVhaCB2ZWN0b3IgZGkgUi4KMi4gIE1hdHJpeCBcPiBNYXRyaWtzIGFkYWxhaCBvYmplayBkaSBSIHlhbmcgbWVtaWxpa2kgMiBkaW1lbnNpLCBiYXJpcwogICAgKHJvdy9tKSBkYW4ga29sb20gKGNvbHVtbi9uKSwgZGFuIHRpcGUgbmlsYWlueWEgc2FtYS4gSmlrYSBrZXRpa2EKICAgIG1lbWJ1YXQgc2VidWFoIG1hdHJpa3MgZWxlbWVubnlhIG1lbWlsaWtpIG1pbmltYWwgMSBlbGVtZW4gYmVydGlwZQogICAgY2hhcmFjdGVyIG1ha2Egc2VsdXJ1aCBtYXRyaWtzIHRlcnNlYnV0IGFrYW4gYmVydGlwZSBjaGFyYWN0ZXIuCiAgICBNZW1idWF0IG1hdHJpa3MgZGkgUiBtZW5nZ3VuYWthbiB2ZWN0b3IgeWFuZyBkaWtvbnZlcnNpIGRpbWVuc2lueWEuCiAgICBLYXJlbmEgc2VwZXJ0aSB5YW5nIHN1ZGFoIGRpa2V0YWh1aSBiYWh3YSBzZWJ1YWggdmVjdG9yIGRpIFIgdGlkYWsKICAgIG1lbXB1bnlhaSBkaW1lbnNpLCB0ZXRhcGkgZGFwYXQgZGliYXlhbmdrYW4gc2VwZXJ0aSBtYXRyaWtzCiAgICBiZXJ1a3VyYW4gbSBiYXJpcyBkYW4gMSAoc2F0dSkga29sb20uCjMuICBBcnJheSBcPkFycmF5IG1lcnVwYWthbiBvYmplayBzZXBlcnRpIG1hdHJpa3MgZGVuZ2FuIGRpbWVuc2kgbGViaWgKICAgIGJhbnlhay4gSmlrYSBtYXRyaWtzIGhhbnlhIG1lbXB1bnlhaSAyIGRpbWVuc2ksIG1ha2EgYXJyYXkgZGFwYXQKICAgIG1lbWlsaWtpIGxlYmloIGRhcmkgMiBkaW1lbnNpLgo0LiAgTGlzdHMgXD4gT2JqZWsgbGlzdCBwYWRhIGRhc2FybnlhIG1pcmlwIHNlcGVydGkgdmVjdG9yLCBoYW55YSBzYWphCiAgICB0aXBlIGVsZW1lbm55YSBiaXNhIGJlcmJlZGEuIEppa2EgcGFkYSB2ZWN0b3IgbnVtZXJpYyBzZW11YQogICAgZWxlbWVubnlhIGhhcnVzIGJlcnVwYSBudW1lcmlrLiBQYWRhIHZlY3RvciBjaGFyYWN0ZXIgc2VtdWFueWEgaGFydXMKICAgIGthcmFrdGVyLiBQYWRhIG9iamVrIGxpc3QgZWxlbWVubnlhIGRhcGF0IGJlcnVwYSB2ZWN0b3IsIGZhY3RvciwKICAgIG1hdHJpa3MsIGFycmF5LCBkYXRhZnJhbWUsIGJhaGthbiBsaXN0IGRpIGRhbGFtIGxpc3QgYXRhdSBvYmplayBsYWluCiAgICBzZXBlcnRpIG1vZGVsIHByZWRpa3RpZiB5YW5nIGRpYnVhdCBkaSBSLgo1LiAgRmFjdG9yIFw+IEZhY3RvciBtZXJ1cGFrYW4gYmVudHVrIGxlYmloIGx1YXMgZGFyaSB2ZWN0b3IuIEJpYXNhbnlhCiAgICBmYWN0b3IgbGViaWggc2VyaW5nIGRpZ3VuYWthbiB1bnR1ayBtZW55aW1wYW4gZGF0YSBub21pbmFsIGF0YXUKICAgIG9yZGluYWwuIE1pc2FsbnlhIHZlY3RvciBjaGFyYWN0ZXIgeWFuZyBiZXJpc2kgIm1hbGUiIGRhbiAiZmVtYWxlIi4KICAgIFBhZGEgdmVjdG9yIGNoYXJhY3RlciwgbmlsYWlueWEgYWRhbGFoICJtYWxlIiBkYW4gImZlbWFsZSIgc2VwZXJ0aQogICAgdGVybGloYXQgYXBhIGFkYW55YS4gTmFtdW4gcGFkYSBmYWN0b3IsIHRhbXBpbGFuIGRhcmkgaXNpIGRhdGFueWEKICAgIG11bmdraW4gIm1hbGUiIGRhbiAiZmVtYWxlIiB0ZXRhcGkgaXNpIGRhcmkgZmFjdG9yIGFkYWxhaCBwZW5na29kZWFuCiAgICBudW1lcmlrLiBNaXNhbCB1bnR1ayAiZmVtYWxlIiBuaWxhaSBzZWJlbmFybnlhIGFkYWxhaCAxLCBzZWRhbmdrYW4KICAgICJtYWxlIiBiZXJuaWFsaSAyLgo2LiAgRGF0YSBGcmFtZSBcPiBEYXRhZnJhbWUgbGF5YWtueWEgc2VidWFoIHRhYmVsIGRpIE1zIEV4Y2VsLCB0ZXJkaXJpCiAgICBkYXJpIGJhcmlzIGRhbiBrb2xvbSBkZW5nYW4gbmFtYSBtYXNpbmctbWFzaW5nIGtvbG9tIGJlcmJlZGEuIEFwYQogICAgYmVkYW55YSBkZW5nYW4gbWF0cmlrcz8gTWF0cmlrcyBoYW55YSBiaXNhIG1lbnlpbXBhbiB0aXBlIGRhdGEgeWFuZwogICAgc2FtYSwgbnVtZXJpYyBhdGF1IGNoYXJhY3RlciBzZWx1cnVobnlhLiBQYWRhIGRhdGFmcmFtZSwKICAgIG1hc2luZy1tYXNpbmcga29sb20gYm9sZWggbWVtaWxpa2kgdGlwZSBkYXRhIHlhbmcgYmVyYmVkYS4gRGF0YWZyYW1lCiAgICBzZXBlcnRpIHVtdW1ueWEgYmVudHVrIHRhYmVsIHlhbmcgc2VyaW5nIGtpdGEgZ3VuYWthbi4KCmBgYCB7cn0KIyBWZWN0b3IKbXlfdmVjdG9yIDwtIGMoMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjApCm15X3ZlY3RvcjEgPC0gMToyMApteV92ZWN0b3IyIDwtIHNlcSgxLDIwKQpwcmludChteV92ZWN0b3IpCnByaW50KG15X3ZlY3RvcjEpCnByaW50KG15X3ZlY3RvcjIpCmlzLnZlY3RvcihteV92ZWN0b3IpCmlzLnZlY3RvcihteV92ZWN0b3IxKQppcy52ZWN0b3IobXlfdmVjdG9yMikKYGBgCgpgYGAge3J9CiMgTWF0cml4Cm15X21hdHJpeCA8LSBtYXRyaXgoMToyMCw0LDUsYnlyb3cgPSBUKQpwcmludChteV9tYXRyaXgpCmlzLm1hdHJpeChteV9tYXRyaXgpCmBgYAoKYGBgIHtyfQojIEFycmF5Cm15X2FycmF5IDwtIGFycmF5KExFVFRFUlMsZGltPWMoNCwyLDMpKQpwcmludChteV9hcnJheSkKaXMuYXJyYXkobXlfYXJyYXkpCmBgYAoKYGBgIHtyfQojTGlzdApteV9saXN0IDwtIGxpc3QoVFJVRSxGQUxTRSxjKDEsMiwzLDQsNSksMToyMCwiQXlhbSIpCnByaW50KG15X2xpc3QpCmlzLmxpc3QobXlfbGlzdCkKYGBgCgoKYGBgIHtyfQojIEZhY3RvciAoRGF0YSBLYXRlZ29yaSBOb21pbmFsKQpteV9mYWN0b3IgPC0gZmFjdG9yKGMoIkF5YW0iLCJCZWJlayIsIlNhcGkiLCJLYW1iaW5nIiwiS3VjaW5nIiwiS2FtYmluZyIsIkF5YW0iLCJCZWJlayIsIkF5YW0iKSkKcHJpbnQobXlfZmFjdG9yKQppcy5mYWN0b3IobXlfZmFjdG9yKQpgYGAKCmBgYCB7cn0KIyBGYWN0b3IgKERhdGEgS2F0ZWdvcmkgT3JkaW5hbCkKbXlfZmFjdG9yMSA8LSBmYWN0b3IoYygiU0QiLCJTTUEiLCJTRCIsIlNNUCIsIlNEIiwiU01BIiwiU01BIiwiU0QiKSwgb3JkZXJlZCA9IFQsIGxldmVscyA9IGMoIlNEIiwiU01QIiwiU01BIikpCnByaW50KG15X2ZhY3RvcjEpCmlzLmZhY3RvcihteV9mYWN0b3IxKQpgYGAKCgpgYGAge3J9CiMgRGF0YSBGcmFtZQpuYW1hIDwtIGMoIldhdGkiLCAiQnVkaSIsICJFZGkiKQpuaWxhaSA8LSBjKDEwMCw5MCw5NSkKbXlfZGYgPC0gZGF0YS5mcmFtZShuYW1hLG5pbGFpKQpzdHIobXlfZGYpCnByaW50KG15X2RmKQpgYGAKCgojIyBLb25zZXAgcGVtaWxpaGFuIGRhbiBwZW5ndWxhbmdhbgoKYGBgIHtyfQojIENvbmRpdGlvbmFsIElmIEVsc2UKbmlsYWlfc2F5YSA8LSAxMDAKaWYgKG5pbGFpX3NheWEgPj0gODUgKSB7CiAgbmlsYWlfbXV0dSA9ICJBIgp9IGVsc2UgaWYgKG5pbGFpX3NheWEgPj0gODApIHsKICBuaWxhaV9tdXR1ID0gIkEtIgp9IGVsc2UgaWYgIChuaWxhaV9zYXlhID49IDc1KSB7CiAgbmlsYWlfbXV0dSA9ICJCKyIKfSBlbHNlIGlmIChuaWxhaV9zYXlhID49IDcwKSB7CiAgbmlsYWlfbXV0dSA9ICJCIgp9IGVsc2UgaWYgKG5pbGFpX3NheWEgPj0gNjUpIHsKICBuaWxhaV9tdXR1ID0gIkMrIgp9IGVsc2UgaWYgKG5pbGFpX3NheWEgPj0gNjApIHsKICBuaWxhaV9tdXR1ID0gIkMiCn0gZWxzZSBpZiAobmlsYWlfc2F5YSA+PSA1NSkgewogIG5pbGFpX211dHUgPSAiRCsiCn0gZWxzZSBpZiAobmlsYWlfc2F5YSA8PSA1NSkgewogIG5pbGFpX211dHUgPSAiRCsiCn0gZWxzZSB7CiAgcHJpbnQoIk5pbGFpIGFuZGEgc2FsYWggISEiKQp9CgpwcmludChuaWxhaV9tdXR1KQpgYGAKCgpgYGAge3J9CiMgU3dpdGNoCnggPC0gNQp5IDwtIDUKcGlsaWhhbiA8LSAiLyIKc3dpdGNoKHBpbGloYW4sCiAgICAgICIrIiA9IGhhc2lsIDwtIHggKyB5LAogICAgICAiLSIgPSBoYXNpbCA8LSB4IC0geSwKICAgICAgIioiID0gaGFzaWwgPC0geCAqIHksCiAgICAgICIvIiA9IGhhc2lsIDwtIHggLyB5CikKcHJpbnQoaGFzaWwpCmBgYAoKYGBgIHtyfQojIEZvciBMb29wCmZvciAoaSBpbiAxOjEwKSB7CiAgcHJpbnQoIlNheWEgdGlkYWsgYWthbiBtZW5ndWxhbmdpbnlhIGxhZ2kiKQp9CmBgYAoKYGBgIHtyfQojIFdoaWxlIExvb3AKaiA8LSAxCgp3aGlsZSAoajw9MTApewogIHByaW50KGopCiAgaiA8LSBqKzEKfQpgYGAKCmBgYCB7cn0KI0JyZWFrIEtleXdvcmRzCmZvciAoaSBpbiAxOjEwKXsKICBpZiAoaSA9PSA1KXsKICAgIGJyZWFrCiAgfQogIHByaW50KHBhc3RlMCgiSW5kZWtzIGtlLSIsaSkpCn0KYGBgCgpgYGAge3J9CiNOZXh0IEtleXdvcmRzCmZvciAoaSBpbiAxOjEwKXsKICBpZiAoaSA9PSA1KXsKICAgIG5leHQKICB9CiAgcHJpbnQocGFzdGUwKCJJbmRla3Mga2UtIixpKSkKfQpgYGAKCmBgYCB7cn0KIyBSZXBlYXQgTG9vcAprIDwtMQpyZXBlYXQgewogIGlmKGs+MTApIHsKICAgIGJyZWFrCiAgfQogIHByaW50KHBhc3RlMCgiSW5kZWtzIGtlLSIsaykpCiAgayA8LSBrICsxCgp9CmBgYA==