
1. Mengidentifikasi Tipe Data
Tentukan tipe data variabel berikut dalam R:
# R
a = 42
b = 3.14
c = "Hello"
d = FALSE
e = [1, 2, 3]
f = {"name": "Alice", "age": 25}
Pertanyaan:
a. Identifikasi tipe data setiap variabel di atas.
b. Cetak tipe data setiap variabel menggunakan class()
(R).
Jawaban:
a <- 42 #(Ini adalah integer)
b <- 3.14 #(ini adalah double)
c <- "Hello"#(ini adalah chr)
d <- FALSE#(ini adalah logical)
e <- c(1, 2, 3)#(ini adalah vektor)
f <- list(name = "Alice", age = 25)#(kalo ini adalah list)
print(class(a)) # numeric (integer)
## [1] "numeric"
print(class(b)) # numeric (double)
## [1] "numeric"
print(class(c)) # character
## [1] "character"
print(class(d)) # logical
## [1] "logical"
print(class(e)) # numeric (vector)
## [1] "numeric"
## [1] "list"
2. Variabel dan Manipulasi Data
Buat variabel berikut dalam R:
# R
x = 20
y = 5
text1 = "Data"
text2 = "Science"
Pertanyaan:
a. Perbarui nilai x
dengan menambahkan
10
.
b. Gabungkan text1
dan text2
ke dalam
“Data Science”.
c. Mengubah teks gabungan menjadi huruf besar.
Jawaban:
x <- 20
y <- 5
text1 <- "Data"
text2 <- "Science"
x <- x + 10 # Menambahkan 10 ke x
text_digabungkan <- paste(text1, text2) # Menggabungkan string
text_kapital <- toupper(text_digabungkan) # Ubah ke huruf besar
print(x)
## [1] 30
## [1] "Data Science"
## [1] "DATA SCIENCE"
3. Operasi Aritmatika
Mengingat variabel-variabel berikut:
Pertanyaan:
a. Hitunglah jumlah, selisih, perkalian, pembagian, dan
modulo dari a
dan b
.
b. Hitunglah a pangkat b.
c. Buat variabel baru c = a / b
dan ubah menjadi
integer.
Jawaban:
a <- 15
b <- 4
hasil_jumlah <- a + b # Proses penjumlahan a dan b
hasil_selisih <- a - b # Proses pengurangan a dengan b
hasil_kali <- a * b # Proses perkalian a dengan b
hasil_bagi <- a / b # Proses pembagian a dengan b
hasil_sisa <- a %% b # Proses mendapatkan sisa pembagian a oleh b
hasil_pangkat <- a^b # Proses pemangkatan a dengan b
hasil_bulat <- as.integer(a / b) # Proses pembagian a dengan b dan yg dibulatkan
print(hasil_jumlah)
## [1] 19
## [1] 11
## [1] 60
## [1] 3.75
## [1] 3
## [1] 50625
## [1] 3
4. Operasi String
Diberikan teks berikut:
# R
text = "Hello, Data Science!"
Pertanyaan:
1. Ekstrak 5 karakter pertama dari teks.
2. Hitung jumlah karakter dalam teks.
3. Mengubah teks menjadi huruf kecil.
Jawaban:
teks <- "Halo, Data Sains!"
# Mengambil lima karakter pertama dari teks
lima_karakter_pertama <- substr(teks, 1, 5)
# Menghitung jumlah karakter dalam teks
jumlah_karakter <- nchar(teks)
# Mengubah teks menjadi huruf kecil
teks_kecil <- tolower(teks)
print(lima_karakter_pertama)
## [1] "Halo,"
## [1] 17
## [1] "halo, data sains!"
5. Operator Perbandingan dan Logika
Mengingat variabel-variabel berikut:
Pertanyaan:
1. Periksa apakah x
lebih besar dari
y
.
2. Periksa apakah x
kurang dari atau sama
dengan y
.
3. Periksa apakah x
tidak sama dengan
y
.
4. Evaluasilah ekspresi (x > 5) AND (y < 20).
Jawaban:
x <- 7
y <- 10
print(x > y)
## [1] FALSE
## [1] TRUE
## [1] TRUE
print((x > 5) & (y < 20))
## [1] TRUE
6. Konversi Tipe Data
Mengingat variabel-variabel berikut:
# R
num_str = "123"
num_float = 45.67
Pertanyaan:
1. Ubah num_str
ke bilangan bulat dan
tambahkan 10
.
2. Ubah num_float
ke bilangan bulat.
3. Mengonversi num_float
kembali menjadi
string.
Jawaban:
angka_str <- "123"
angka_floating <- 45.67
# Mengonversi string menjadi integer dan menambahkannya dengan 10
angka_int <- as.integer(angka_str) + 10
# Mengonversi angka floating menjadi integer (menghilangkan angka desimal)
angka_floating_ke_int <- as.integer(angka_floating)
# Mengonversi angka floating menjadi string
angka_floating_ke_str <- as.character(angka_floating)
print(angka_int)
## [1] 133
print(angka_floating_ke_int)
## [1] 45
print(angka_floating_ke_str)
## [1] "45.67"
7. Tantangan Bonus
Buat program interaktif yang meminta pengguna untuk memasukkan:
1. Nama
2. Usia
3. Kota kelahiran
Kemudian, cetak output sebagai berikut:
"Hello [Name], you are [Age] years old and from [Hometown]."
Jawaban:
nama <- readline(prompt="Masukkan nama: ")
## Masukkan nama:
umur <- readline(prompt="Masukkan usia: ")
## Masukkan usia:
kota_asal <- readline(prompt="Masukkan kota asal: ")
## Masukkan kota asal:
cat("Halo", nama, ", Anda berusia", umur, "tahun dan berasal dari", kota_asal, ".\n")
## Halo , Anda berusia tahun dan berasal dari .
Kesimpulan
Kesimpulan Praktikum Pemrograman Dasar - Pemrograman Sains Data
Selama praktikum ini, kami mempelajari beberapa konsep dasar dalam
pemrograman menggunakan R, yang sangat penting dalam
dunia sains data. Berikut adalah kesimpulan yang kami dapatkan dari
praktikum ini:
Mengidentifikasi Tipe Data: Kami belajar cara
mengidentifikasi tipe data setiap variabel menggunakan fungsi
class()
. Dari sini, kami tahu bahwa ada banyak tipe data
seperti integer, double, string (character), logical, dan list, yang
masing-masing punya kegunaan dan cara penanganan yang berbeda dalam
pemrograman.
Variabel dan Manipulasi Data: Kami mempelajari
bagaimana mendeklarasikan variabel dan melakukan manipulasi data seperti
penambahan nilai variabel dan penggabungan string. Fungsi
paste()
untuk menggabungkan string dan
toupper()
untuk mengubah teks menjadi huruf kapital sangat
berguna dalam pemrosesan data.
Operasi Aritmatika: Kami melakukan berbagai
operasi matematika, seperti penjumlahan, pengurangan, perkalian,
pembagian, dan pemangkatan. Hal ini sangat penting karena dalam analisis
data, operasi matematis sering dilakukan untuk memahami data lebih
dalam. Kami juga belajar mengonversi hasil pembagian menjadi bilangan
bulat menggunakan as.integer()
, yang sering diperlukan
ketika kita bekerja dengan data yang memiliki angka desimal.
Operasi String: Manipulasi string sangat penting
dalam pemrograman data, apalagi saat kita perlu membersihkan data atau
mengubah format teks. Kami belajar bagaimana mengambil sebagian teks,
menghitung jumlah karakter dengan nchar()
, dan mengubah
teks menjadi huruf kecil menggunakan tolower()
.
Operator Perbandingan dan Logika: Kami
menggunakan operator perbandingan dan logika seperti >
,
<=
, !=
, dan &
untuk
memeriksa kondisi dalam data. Operator logika ini sangat membantu ketika
kami perlu memfilter atau memilih data berdasarkan kondisi tertentu,
seperti memilih data yang lebih besar atau lebih kecil dari nilai
tertentu.
Konversi Tipe Data: Kami belajar cara
mengonversi tipe data, seperti mengubah string menjadi integer, mengubah
angka desimal menjadi integer, dan mengubah angka menjadi string. Hal
ini sangat membantu saat data yang kami terima berada dalam format yang
berbeda, sehingga perlu diubah untuk analisis lebih lanjut.
Tantangan Bonus: Di bagian ini, kami membuat
program interaktif yang meminta pengguna untuk memasukkan nama, usia,
dan kota asal mereka. Kami sangat menyukai bagian ini karena kami
belajar bagaimana mengambil input dari pengguna dan memprosesnya dalam
program, yang sangat berguna saat membuat aplikasi interaktif.
Secara keseluruhan, praktikum ini memberikan kami dasar yang kuat
dalam pemrograman menggunakan R. Kami merasa lebih siap untuk
melanjutkan ke topik-topik yang lebih kompleks dalam sains data, seperti
analisis statistik dan pembuatan model prediktif, karena sudah memahami
dasar-dasar pemrograman dan manipulasi data yang penting dalam analisis
data.
LS0tDQp0aXRsZTogIlR1Z2FzIEluZGl2aWR1ICINCnN1YnRpdGxlOiAiUHJha3Rpa3VtIFBlbXJvZ3JhbWFuIERhc2FyIC0gUGVtcm9ncmFtYW4gU2FpbnMgRGF0YSINCmF1dGhvcjogIk9saXZpYSBNZWlsaW5kYSBEYXZ0aW4gUGVzaXJlcm9uIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyANCiAgICBjc3M6ICJzdHlsZS5jc3MiDQotLS0NCg0KPGltZyBzcmM9ImxpdmlrYXRhbnlhLmpwZyIgd2lkdGg9IjMwMCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87IiBhbHQ9IkZvdG8gRGlyaSI+DQoNCi0tLQ0KDQotLS0NCg0KIyMgMS4gTWVuZ2lkZW50aWZpa2FzaSBUaXBlIERhdGEgDQpUZW50dWthbiB0aXBlIGRhdGEgdmFyaWFiZWwgYmVyaWt1dCBkYWxhbSAqKlIqKjogIA0KDQpgYGByDQojIFINCmEgPSA0Mg0KYiA9IDMuMTQNCmMgPSAiSGVsbG8iDQpkID0gRkFMU0UNCmUgPSBbMSwgMiwgM10NCmYgPSB7Im5hbWUiOiAiQWxpY2UiLCAiYWdlIjogMjV9DQpgYGANCg0KKipQZXJ0YW55YWFuOioqICANCmEuIElkZW50aWZpa2FzaSB0aXBlIGRhdGEgc2V0aWFwIHZhcmlhYmVsIGRpIGF0YXMuICANCmIuIENldGFrIHRpcGUgZGF0YSBzZXRpYXAgdmFyaWFiZWwgbWVuZ2d1bmFrYW4gYGNsYXNzKClgICgqKlIqKikuICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQphIDwtIDQyICMoSW5pIGFkYWxhaCBpbnRlZ2VyKQ0KYiA8LSAzLjE0ICMoaW5pIGFkYWxhaCBkb3VibGUpDQpjIDwtICJIZWxsbyIjKGluaSBhZGFsYWggY2hyKQ0KZCA8LSBGQUxTRSMoaW5pIGFkYWxhaCBsb2dpY2FsKQ0KZSA8LSBjKDEsIDIsIDMpIyhpbmkgYWRhbGFoIHZla3RvcikNCmYgPC0gbGlzdChuYW1lID0gIkFsaWNlIiwgYWdlID0gMjUpIyhrYWxvIGluaSBhZGFsYWggbGlzdCkNCg0KcHJpbnQoY2xhc3MoYSkpICAjIG51bWVyaWMgKGludGVnZXIpDQpwcmludChjbGFzcyhiKSkgICMgbnVtZXJpYyAoZG91YmxlKQ0KcHJpbnQoY2xhc3MoYykpICAjIGNoYXJhY3Rlcg0KcHJpbnQoY2xhc3MoZCkpICAjIGxvZ2ljYWwNCnByaW50KGNsYXNzKGUpKSAgIyBudW1lcmljICh2ZWN0b3IpDQpwcmludChjbGFzcyhmKSkgICMgbGlzdA0KDQpgYGANCg0KLS0tDQoNCi0tLQ0KDQojIyAyLiBWYXJpYWJlbCBkYW4gTWFuaXB1bGFzaSBEYXRhICANCkJ1YXQgdmFyaWFiZWwgYmVyaWt1dCBkYWxhbSAqKlIqKjogIA0KDQpgYGByDQojIFINCnggPSAyMA0KeSA9IDUNCnRleHQxID0gIkRhdGEiDQp0ZXh0MiA9ICJTY2llbmNlIg0KYGBgDQoNCioqUGVydGFueWFhbjoqKiAgDQphLiBQZXJiYXJ1aSBuaWxhaSBgeGAgZGVuZ2FuIG1lbmFtYmFoa2FuIGAxMGAuICANCmIuIEdhYnVuZ2thbiBgdGV4dDFgIGRhbiBgdGV4dDJgIGtlIGRhbGFtICoqIkRhdGEgU2NpZW5jZSIqKi4gIA0KYy4gTWVuZ3ViYWggdGVrcyBnYWJ1bmdhbiBtZW5qYWRpIGh1cnVmIGJlc2FyLiANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp4IDwtIDIwDQp5IDwtIDUNCnRleHQxIDwtICJEYXRhIg0KdGV4dDIgPC0gIlNjaWVuY2UiDQoNCnggPC0geCArIDEwICAjIE1lbmFtYmFoa2FuIDEwIGtlIHgNCnRleHRfZGlnYWJ1bmdrYW4gPC0gcGFzdGUodGV4dDEsIHRleHQyKSAgIyBNZW5nZ2FidW5na2FuIHN0cmluZw0KdGV4dF9rYXBpdGFsIDwtIHRvdXBwZXIodGV4dF9kaWdhYnVuZ2thbikgICMgVWJhaCBrZSBodXJ1ZiBiZXNhcg0KDQpwcmludCh4KQ0KcHJpbnQodGV4dF9kaWdhYnVuZ2thbikNCnByaW50KHRleHRfa2FwaXRhbCkNCg0KYGBgDQoNCi0tLQ0KDQotLS0NCg0KIyMgMy4gT3BlcmFzaSBBcml0bWF0aWthDQpNZW5naW5nYXQgdmFyaWFiZWwtdmFyaWFiZWwgYmVyaWt1dDogIA0KDQpgYGByDQojIFINCmEgPSAxNQ0KYiA9IDQNCmBgYA0KDQoqKlBlcnRhbnlhYW46KiogIA0KYS4gSGl0dW5nbGFoICoqanVtbGFoLCBzZWxpc2loLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIG1vZHVsbyoqIGRhcmkgYGFgIGRhbiBgYmAuICANCmIuIEhpdHVuZ2xhaCAqKmEgcGFuZ2thdCBiKiouICANCmMuIEJ1YXQgdmFyaWFiZWwgYmFydSBgYyA9IGEgLyBiYCBkYW4gdWJhaCBtZW5qYWRpICoqaW50ZWdlcioqLiAgDQoNCkphd2FiYW46DQoNCmBgYHtyfQ0KYSA8LSAxNQ0KYiA8LSA0DQoNCmhhc2lsX2p1bWxhaCA8LSBhICsgYiAgICAgICAjIFByb3NlcyBwZW5qdW1sYWhhbiBhIGRhbiBiDQpoYXNpbF9zZWxpc2loIDwtIGEgLSBiICAgICAgIyBQcm9zZXMgcGVuZ3VyYW5nYW4gYSBkZW5nYW4gYg0KaGFzaWxfa2FsaSA8LSBhICogYiAgICAgICAgICMgUHJvc2VzIHBlcmthbGlhbiBhIGRlbmdhbiBiDQpoYXNpbF9iYWdpIDwtIGEgLyBiICAgICAgICAgIyBQcm9zZXMgcGVtYmFnaWFuIGEgZGVuZ2FuIGINCmhhc2lsX3Npc2EgPC0gYSAlJSBiICAgICAgICAjIFByb3NlcyBtZW5kYXBhdGthbiBzaXNhIHBlbWJhZ2lhbiBhIG9sZWggYg0KaGFzaWxfcGFuZ2thdCA8LSBhXmIgICAgICAgICMgUHJvc2VzIHBlbWFuZ2thdGFuIGEgZGVuZ2FuIGINCmhhc2lsX2J1bGF0IDwtIGFzLmludGVnZXIoYSAvIGIpICAjIFByb3NlcyBwZW1iYWdpYW4gYSBkZW5nYW4gYiBkYW4geWcgZGlidWxhdGthbg0KDQpwcmludChoYXNpbF9qdW1sYWgpICAgDQpwcmludChoYXNpbF9zZWxpc2loKSAgDQpwcmludChoYXNpbF9rYWxpKSAgICAgDQpwcmludChoYXNpbF9iYWdpKSAgICAgDQpwcmludChoYXNpbF9zaXNhKSAgICAgDQpwcmludChoYXNpbF9wYW5na2F0KSAgDQpwcmludChoYXNpbF9idWxhdCkgICAgDQoNCmBgYA0KDQoNCi0tLQ0KDQotLS0NCg0KIyMgNC4gT3BlcmFzaSBTdHJpbmcNCkRpYmVyaWthbiB0ZWtzIGJlcmlrdXQ6ICANCg0KYGBgcg0KIyBSDQp0ZXh0ID0gIkhlbGxvLCBEYXRhIFNjaWVuY2UhIg0KYGBgDQoNCioqUGVydGFueWFhbjoqKiAgDQoxLiBFa3N0cmFrICoqNSBrYXJha3RlciBwZXJ0YW1hKiogZGFyaSB0ZWtzLiAgDQoyLiBIaXR1bmcganVtbGFoIGthcmFrdGVyIGRhbGFtIHRla3MuICANCjMuIE1lbmd1YmFoIHRla3MgbWVuamFkaSAqKmh1cnVmIGtlY2lsKiouICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp0ZWtzIDwtICJIYWxvLCBEYXRhIFNhaW5zISINCg0KIyBNZW5nYW1iaWwgbGltYSBrYXJha3RlciBwZXJ0YW1hIGRhcmkgdGVrcw0KbGltYV9rYXJha3Rlcl9wZXJ0YW1hIDwtIHN1YnN0cih0ZWtzLCAxLCA1KQ0KDQojIE1lbmdoaXR1bmcganVtbGFoIGthcmFrdGVyIGRhbGFtIHRla3MNCmp1bWxhaF9rYXJha3RlciA8LSBuY2hhcih0ZWtzKQ0KDQojIE1lbmd1YmFoIHRla3MgbWVuamFkaSBodXJ1ZiBrZWNpbA0KdGVrc19rZWNpbCA8LSB0b2xvd2VyKHRla3MpDQoNCnByaW50KGxpbWFfa2FyYWt0ZXJfcGVydGFtYSkgIA0KcHJpbnQoanVtbGFoX2thcmFrdGVyKSAgDQpwcmludCh0ZWtzX2tlY2lsKSANCg0KYGBgDQoNCi0tLQ0KDQotLS0NCg0KIyMgIDUuIE9wZXJhdG9yIFBlcmJhbmRpbmdhbiBkYW4gTG9naWthIA0KTWVuZ2luZ2F0IHZhcmlhYmVsLXZhcmlhYmVsIGJlcmlrdXQ6ICANCg0KYGBgcg0KIyBSDQp4ID0gNw0KeSA9IDEwDQpgYGANCg0KKipQZXJ0YW55YWFuOioqICANCjEuIFBlcmlrc2EgYXBha2FoIGB4YCAqKmxlYmloIGJlc2FyIGRhcmkqKiBgeWAuICANCjIuIFBlcmlrc2EgYXBha2FoIGB4YCAqKmt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4qKiBgeWAuICANCjMuIFBlcmlrc2EgYXBha2FoIGB4YCAqKnRpZGFrIHNhbWEgZGVuZ2FuKiogYHlgLiAgDQo0LiBFdmFsdWFzaWxhaCBla3NwcmVzaSAqKih4ID4gNSkgQU5EICh5IDwgMjApKiouICANCg0KSmF3YWJhbjoNCg0KYGBge3J9DQp4IDwtIDcNCnkgPC0gMTANCg0KcHJpbnQoeCA+IHkpICANCnByaW50KHggPD0geSkgDQpwcmludCh4ICE9IHkpICANCnByaW50KCh4ID4gNSkgJiAoeSA8IDIwKSkgIA0KDQpgYGANCg0KDQotLS0NCg0KLS0tDQoNCiMjIDYuIEtvbnZlcnNpIFRpcGUgRGF0YSAgDQpNZW5naW5nYXQgdmFyaWFiZWwtdmFyaWFiZWwgYmVyaWt1dDogIA0KDQpgYGByDQojIFINCm51bV9zdHIgPSAiMTIzIg0KbnVtX2Zsb2F0ID0gNDUuNjcNCmBgYA0KDQoqKlBlcnRhbnlhYW46KiogIA0KMS4gVWJhaCBgbnVtX3N0cmAga2UgKipiaWxhbmdhbiBidWxhdCoqIGRhbiB0YW1iYWhrYW4gYDEwYC4gIA0KMi4gVWJhaCBgbnVtX2Zsb2F0YCBrZSAqKmJpbGFuZ2FuIGJ1bGF0KiouICANCjMuIE1lbmdvbnZlcnNpIGBudW1fZmxvYXRgIGtlbWJhbGkgbWVuamFkaSAqKnN0cmluZyoqLiAgDQoNCkphd2FiYW46DQoNCmBgYHtyfQ0KYW5na2Ffc3RyIDwtICIxMjMiDQphbmdrYV9mbG9hdGluZyA8LSA0NS42Nw0KDQojIE1lbmdvbnZlcnNpIHN0cmluZyBtZW5qYWRpIGludGVnZXIgZGFuIG1lbmFtYmFoa2FubnlhIGRlbmdhbiAxMA0KYW5na2FfaW50IDwtIGFzLmludGVnZXIoYW5na2Ffc3RyKSArIDEwDQoNCiMgTWVuZ29udmVyc2kgYW5na2EgZmxvYXRpbmcgbWVuamFkaSBpbnRlZ2VyIChtZW5naGlsYW5na2FuIGFuZ2thIGRlc2ltYWwpDQphbmdrYV9mbG9hdGluZ19rZV9pbnQgPC0gYXMuaW50ZWdlcihhbmdrYV9mbG9hdGluZykNCg0KIyBNZW5nb252ZXJzaSBhbmdrYSBmbG9hdGluZyBtZW5qYWRpIHN0cmluZw0KYW5na2FfZmxvYXRpbmdfa2Vfc3RyIDwtIGFzLmNoYXJhY3RlcihhbmdrYV9mbG9hdGluZykNCg0KDQpwcmludChhbmdrYV9pbnQpICANCnByaW50KGFuZ2thX2Zsb2F0aW5nX2tlX2ludCkgDQpwcmludChhbmdrYV9mbG9hdGluZ19rZV9zdHIpIA0KDQpgYGANCg0KDQotLS0NCi0tLQ0KDQojIyA3LiBUYW50YW5nYW4gQm9udXMgDQpCdWF0IHByb2dyYW0gaW50ZXJha3RpZiB5YW5nIG1lbWludGEgcGVuZ2d1bmEgdW50dWsgbWVtYXN1a2thbjogIA0KMS4gKipOYW1hKiogIA0KMi4gKipVc2lhKiogIA0KMy4gKipLb3RhIGtlbGFoaXJhbioqICANCg0KS2VtdWRpYW4sIGNldGFrIG91dHB1dCBzZWJhZ2FpIGJlcmlrdXQ6ICANCg0KYGBgdHh0DQoiSGVsbG8gW05hbWVdLCB5b3UgYXJlIFtBZ2VdIHllYXJzIG9sZCBhbmQgZnJvbSBbSG9tZXRvd25dLiINCmBgYA0KSmF3YWJhbjoNCg0KYGBge3J9DQpuYW1hIDwtIHJlYWRsaW5lKHByb21wdD0iTWFzdWtrYW4gbmFtYTogIikNCnVtdXIgPC0gcmVhZGxpbmUocHJvbXB0PSJNYXN1a2thbiB1c2lhOiAiKQ0Ka290YV9hc2FsIDwtIHJlYWRsaW5lKHByb21wdD0iTWFzdWtrYW4ga290YSBhc2FsOiAiKQ0KDQpjYXQoIkhhbG8iLCBuYW1hLCAiLCBBbmRhIGJlcnVzaWEiLCB1bXVyLCAidGFodW4gZGFuIGJlcmFzYWwgZGFyaSIsIGtvdGFfYXNhbCwgIi5cbiIpDQoNCmBgYA0KDQojIyBLZXNpbXB1bGFuIA0KDQojIyMgS2VzaW1wdWxhbiBQcmFrdGlrdW0gUGVtcm9ncmFtYW4gRGFzYXIgLSBQZW1yb2dyYW1hbiBTYWlucyBEYXRhDQoNClNlbGFtYSBwcmFrdGlrdW0gaW5pLCBrYW1pIG1lbXBlbGFqYXJpIGJlYmVyYXBhIGtvbnNlcCBkYXNhciBkYWxhbSBwZW1yb2dyYW1hbiBtZW5nZ3VuYWthbiAqKlIqKiwgeWFuZyBzYW5nYXQgcGVudGluZyBkYWxhbSBkdW5pYSBzYWlucyBkYXRhLiBCZXJpa3V0IGFkYWxhaCBrZXNpbXB1bGFuIHlhbmcga2FtaSBkYXBhdGthbiBkYXJpIHByYWt0aWt1bSBpbmk6DQoNCjEuICoqTWVuZ2lkZW50aWZpa2FzaSBUaXBlIERhdGE6KioNCiAgIEthbWkgYmVsYWphciBjYXJhIG1lbmdpZGVudGlmaWthc2kgdGlwZSBkYXRhIHNldGlhcCB2YXJpYWJlbCBtZW5nZ3VuYWthbiBmdW5nc2kgYGNsYXNzKClgLiBEYXJpIHNpbmksIGthbWkgdGFodSBiYWh3YSBhZGEgYmFueWFrIHRpcGUgZGF0YSBzZXBlcnRpIGludGVnZXIsIGRvdWJsZSwgc3RyaW5nIChjaGFyYWN0ZXIpLCBsb2dpY2FsLCBkYW4gbGlzdCwgeWFuZyBtYXNpbmctbWFzaW5nIHB1bnlhIGtlZ3VuYWFuIGRhbiBjYXJhIHBlbmFuZ2FuYW4geWFuZyBiZXJiZWRhIGRhbGFtIHBlbXJvZ3JhbWFuLg0KDQoyLiAqKlZhcmlhYmVsIGRhbiBNYW5pcHVsYXNpIERhdGE6KioNCiAgIEthbWkgbWVtcGVsYWphcmkgYmFnYWltYW5hIG1lbmRla2xhcmFzaWthbiB2YXJpYWJlbCBkYW4gbWVsYWt1a2FuIG1hbmlwdWxhc2kgZGF0YSBzZXBlcnRpIHBlbmFtYmFoYW4gbmlsYWkgdmFyaWFiZWwgZGFuIHBlbmdnYWJ1bmdhbiBzdHJpbmcuIEZ1bmdzaSBgcGFzdGUoKWAgdW50dWsgbWVuZ2dhYnVuZ2thbiBzdHJpbmcgZGFuIGB0b3VwcGVyKClgIHVudHVrIG1lbmd1YmFoIHRla3MgbWVuamFkaSBodXJ1ZiBrYXBpdGFsIHNhbmdhdCBiZXJndW5hIGRhbGFtIHBlbXJvc2VzYW4gZGF0YS4NCg0KMy4gKipPcGVyYXNpIEFyaXRtYXRpa2E6KioNCiAgIEthbWkgbWVsYWt1a2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlrYSwgc2VwZXJ0aSBwZW5qdW1sYWhhbiwgcGVuZ3VyYW5nYW4sIHBlcmthbGlhbiwgcGVtYmFnaWFuLCBkYW4gcGVtYW5na2F0YW4uIEhhbCBpbmkgc2FuZ2F0IHBlbnRpbmcga2FyZW5hIGRhbGFtIGFuYWxpc2lzIGRhdGEsIG9wZXJhc2kgbWF0ZW1hdGlzIHNlcmluZyBkaWxha3VrYW4gdW50dWsgbWVtYWhhbWkgZGF0YSBsZWJpaCBkYWxhbS4gS2FtaSBqdWdhIGJlbGFqYXIgbWVuZ29udmVyc2kgaGFzaWwgcGVtYmFnaWFuIG1lbmphZGkgYmlsYW5nYW4gYnVsYXQgbWVuZ2d1bmFrYW4gYGFzLmludGVnZXIoKWAsIHlhbmcgc2VyaW5nIGRpcGVybHVrYW4ga2V0aWthIGtpdGEgYmVrZXJqYSBkZW5nYW4gZGF0YSB5YW5nIG1lbWlsaWtpIGFuZ2thIGRlc2ltYWwuDQoNCjQuICoqT3BlcmFzaSBTdHJpbmc6KioNCiAgIE1hbmlwdWxhc2kgc3RyaW5nIHNhbmdhdCBwZW50aW5nIGRhbGFtIHBlbXJvZ3JhbWFuIGRhdGEsIGFwYWxhZ2kgc2FhdCBraXRhIHBlcmx1IG1lbWJlcnNpaGthbiBkYXRhIGF0YXUgbWVuZ3ViYWggZm9ybWF0IHRla3MuIEthbWkgYmVsYWphciBiYWdhaW1hbmEgbWVuZ2FtYmlsIHNlYmFnaWFuIHRla3MsIG1lbmdoaXR1bmcganVtbGFoIGthcmFrdGVyIGRlbmdhbiBgbmNoYXIoKWAsIGRhbiBtZW5ndWJhaCB0ZWtzIG1lbmphZGkgaHVydWYga2VjaWwgbWVuZ2d1bmFrYW4gYHRvbG93ZXIoKWAuDQoNCjUuICoqT3BlcmF0b3IgUGVyYmFuZGluZ2FuIGRhbiBMb2dpa2E6KioNCiAgIEthbWkgbWVuZ2d1bmFrYW4gb3BlcmF0b3IgcGVyYmFuZGluZ2FuIGRhbiBsb2dpa2Egc2VwZXJ0aSBgPmAsIGA8PWAsIGAhPWAsIGRhbiBgJmAgdW50dWsgbWVtZXJpa3NhIGtvbmRpc2kgZGFsYW0gZGF0YS4gT3BlcmF0b3IgbG9naWthIGluaSBzYW5nYXQgbWVtYmFudHUga2V0aWthIGthbWkgcGVybHUgbWVtZmlsdGVyIGF0YXUgbWVtaWxpaCBkYXRhIGJlcmRhc2Fya2FuIGtvbmRpc2kgdGVydGVudHUsIHNlcGVydGkgbWVtaWxpaCBkYXRhIHlhbmcgbGViaWggYmVzYXIgYXRhdSBsZWJpaCBrZWNpbCBkYXJpIG5pbGFpIHRlcnRlbnR1Lg0KDQo2LiAqKktvbnZlcnNpIFRpcGUgRGF0YToqKg0KICAgS2FtaSBiZWxhamFyIGNhcmEgbWVuZ29udmVyc2kgdGlwZSBkYXRhLCBzZXBlcnRpIG1lbmd1YmFoIHN0cmluZyBtZW5qYWRpIGludGVnZXIsIG1lbmd1YmFoIGFuZ2thIGRlc2ltYWwgbWVuamFkaSBpbnRlZ2VyLCBkYW4gbWVuZ3ViYWggYW5na2EgbWVuamFkaSBzdHJpbmcuIEhhbCBpbmkgc2FuZ2F0IG1lbWJhbnR1IHNhYXQgZGF0YSB5YW5nIGthbWkgdGVyaW1hIGJlcmFkYSBkYWxhbSBmb3JtYXQgeWFuZyBiZXJiZWRhLCBzZWhpbmdnYSBwZXJsdSBkaXViYWggdW50dWsgYW5hbGlzaXMgbGViaWggbGFuanV0Lg0KDQo3LiAqKlRhbnRhbmdhbiBCb251czoqKg0KICAgRGkgYmFnaWFuIGluaSwga2FtaSBtZW1idWF0IHByb2dyYW0gaW50ZXJha3RpZiB5YW5nIG1lbWludGEgcGVuZ2d1bmEgdW50dWsgbWVtYXN1a2thbiBuYW1hLCB1c2lhLCBkYW4ga290YSBhc2FsIG1lcmVrYS4gS2FtaSBzYW5nYXQgbWVueXVrYWkgYmFnaWFuIGluaSBrYXJlbmEga2FtaSBiZWxhamFyIGJhZ2FpbWFuYSBtZW5nYW1iaWwgaW5wdXQgZGFyaSBwZW5nZ3VuYSBkYW4gbWVtcHJvc2VzbnlhIGRhbGFtIHByb2dyYW0sIHlhbmcgc2FuZ2F0IGJlcmd1bmEgc2FhdCBtZW1idWF0IGFwbGlrYXNpIGludGVyYWt0aWYuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgcHJha3Rpa3VtIGluaSBtZW1iZXJpa2FuIGthbWkgZGFzYXIgeWFuZyBrdWF0IGRhbGFtIHBlbXJvZ3JhbWFuIG1lbmdndW5ha2FuIFIuIEthbWkgbWVyYXNhIGxlYmloIHNpYXAgdW50dWsgbWVsYW5qdXRrYW4ga2UgdG9waWstdG9waWsgeWFuZyBsZWJpaCBrb21wbGVrcyBkYWxhbSBzYWlucyBkYXRhLCBzZXBlcnRpIGFuYWxpc2lzIHN0YXRpc3RpayBkYW4gcGVtYnVhdGFuIG1vZGVsIHByZWRpa3RpZiwga2FyZW5hIHN1ZGFoIG1lbWFoYW1pIGRhc2FyLWRhc2FyIHBlbXJvZ3JhbWFuIGRhbiBtYW5pcHVsYXNpIGRhdGEgeWFuZyBwZW50aW5nIGRhbGFtIGFuYWxpc2lzIGRhdGEuDQoNCiMjIFJlZmVyZW5zaQ0KDQo+IEJha3RpIFNpcmVnYXIsIE0uU2MuLCBDRFMuICgyMDI1KS4gQmFzaWMgUHJvZ3JhbW1pbmcuIERhbGFtIERhdGEgU2NpZW5jZSBQcm9ncmFtbWluZy4gRGlha3NlcyBkYXJpIGh0dHBzOi8vYm9va2Rvd24ub3JnL2RzY2llbmNlbGFicy9kYXRhX3NjaWVuY2VfcHJvZ3JhbW1pbmcvMDEtQmFzaWMtUHJvZ3JhbW1pbmcuaHRtbCANCg0K