SYNTAX AND CONTROL FLOW

Pratikum Conditional Statements and Loops in R

Fikaaa.jpg


1. Tujuan

A. Memahami dan menerapkan pernyataan kondisional (if, if-else, if-elif-else).

B. Terapkan loop (for loop, while loop, break, continue) untuk menganalisis himpunan data.

Gunakan dataset dummy berikut ini

PENGENAL Nama Usia Gaji Posisi Pertunjukan
1 Bagas 25 5000 Staf Bagus
2 Joan 30 7000 Pengawas Sangat bagus
3 Alya 27 6500 Staf Rata-rata
4 Dwi 35 10000 Manajer Bagus
5 Nabil 40 12000 Direktur Sangat bagus

Tentukan tingkat bonus berdasarkan kinerja karyawan

  • Sangat Baik -20% dari gaji

  • Pengumpulan Data

  • Baik 10% dari gaji

  • Pembersihan Data

  • Rata-rata 5% dari gaji

  • Transformasi Data

# Dataset Dummy
karyawan <- data.frame(
  Pengenal = c(1, 2, 3, 4, 5),# ID unik untuk setiap karyawan
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"), # Nama karyawan
  Usia = c(25, 30, 27, 35, 40),# Usia karyawan
  Gaji = c(5000, 7000, 6500, 10000, 12000),# Gaji karyawan dalam satuan tertentu
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),# Jabatan karyawan  
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")# Evaluasi kinerja
)

# Menentukan bonus berdasarkan kinerja
hitung_bonus <- function(gaji, kinerja) {
  if (kinerja == "Sangat bagus") { # Jika kinerja sangat bagus, bonus 20% dari gaji
    return(gaji * 0.2)
  } else if (kinerja == "Bagus") { # Jika kinerja bagus, bonus 10% dari gaji
    return(gaji * 0.1)
  } else if (kinerja == "Rata-rata") { # Jika kinerja rata-rata, bonus 5% dari gaji
    return(gaji * 0.05)
  } else {# Jika kinerja di bawah rata-rata, tidak ada bonus
    return(0)
  }
}

# Menghitung dan mencetak bonus untuk setiap karyawan
for (i in 1:nrow(karyawan)) {
  bonus <- hitung_bonus(karyawan$Gaji[i], karyawan$Pertunjukan[i]) # Menghitung bonus berdasarkan gaji dan kinerja
  cat("Name:", karyawan$Nama[i], ", Bonus:", as.integer(bonus), "\n")# Menampilkan hasil perhitungan bonus
}
## Name: Bagas , Bonus: 500 
## Name: Joan , Bonus: 1400 
## Name: Alya , Bonus: 325 
## Name: Dwi , Bonus: 1000 
## Name: Nabil , Bonus: 2400

1. Gunakan for loop untuk membuat daftar karyawan dengan gaji lebih dari 6000

Hasil yang Diharapkan:

Name: Joan, Salary: 7000

Name: Alya, Salary: 6500

Name: Dwi, Salary: 10000

Name: Nabil Salary 12880

# Dataset Dummy
karyawan <- data.frame(
  Pengenal = c(1, 2, 3, 4, 5),  # ID unik untuk setiap karyawan
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),  # Nama karyawan
  Usia = c(25, 30, 27, 35, 40),  # Usia karyawan
  Gaji = c(5000, 7000, 6500, 10000, 12000),  # Gaji karyawan dalam satuan tertentu
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),  # Jabatan karyawan
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")  # Evaluasi kinerja
)

# Menampilkan daftar karyawan dengan gaji lebih dari 6000
cat("\nKaryawan dengan gaji lebih dari 6000:\n")
## 
## Karyawan dengan gaji lebih dari 6000:
for (i in 1:nrow(karyawan)) {
  if (karyawan$Gaji[i] > 6000) {  # Memeriksa apakah gaji karyawan lebih dari 6000
    cat("Name:", karyawan$Nama[i], ", Salary:", karyawan$Gaji[i], "\n")  # Menampilkan nama dan gaji karyawan yang memenuhi kriteria
  }
}
## Name: Joan , Salary: 7000 
## Name: Alya , Salary: 6500 
## Name: Dwi , Salary: 10000 
## Name: Nabil , Salary: 12000

2. Gunakan while loop untuk menampilkan karyawan hingga “Manajer” ditemukan.

Hasil yang Diharapkan:

Name: Bages, Position: Staff

Name: Joan, Position: Supervisor

Name: Alya, Position: Staff

Name: Dewi, Position: Manager (Stop here)

# Dataset Dummy
karyawan <- data.frame(
  Pengenal = c(1, 2, 3, 4, 5),  # ID unik untuk setiap karyawan
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),  # Nama karyawan
  Usia = c(25, 30, 27, 35, 40),  # Usia karyawan
  Gaji = c(5000, 7000, 6500, 10000, 12000),  # Gaji karyawan dalam satuan tertentu
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),  # Jabatan karyawan
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")  # Evaluasi kinerja
)

# Menampilkan karyawan hingga "Manajer" ditemukan
i <- 1  # Memulai Karyawan dari pertama
while (i <= nrow(karyawan)) {
  cat("Name:", karyawan$Nama[i], ", Position:", karyawan$Posisi[i], "\n")  # Menampilkan nama dan posisi karyawan
  if (karyawan$Posisi[i] == "Manajer") {  # Jika posisi adalah "Manajer", hentikan loop
    cat("(Stop here)\n")
    break
  }
  i <- i + 1  # Lanjut ke karyawan berikutnya
}
## Name: Bagas , Position: Staf 
## Name: Joan , Position: Pengawas 
## Name: Alya , Position: Staf 
## Name: Dwi , Position: Manajer 
## (Stop here)

3. Gunakan break untuk menghentikan loop ketika karyawan dengan gaji di atas 10.000 ditemukan.

Hasil yang Diharapkan:

Name: Bagas, salary: seee

Name: Joan, Salary: 7000

Name: Alya, Salary: 6500

Name: Od, Salary: 10000

(Stopped because babil has a salery above 10,000)

# Dataset Dummy
karyawan <- data.frame(
  Pengenal = c(1, 2, 3, 4, 5),  # ID unik untuk setiap karyawan
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),  # Nama karyawan
  Usia = c(25, 30, 27, 35, 40),  # Usia karyawan
  Gaji = c(5000, 7000, 6500, 10000, 12000),  # Gaji karyawan dalam satuan tertentu
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),  # Jabatan karyawan
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")  # Evaluasi kinerja
)

# Menghentikan loop saat menemukan karyawan dengan gaji di atas 10.000
for (i in 1:nrow(karyawan)) {
  cat("Name:", karyawan$Nama[i], ", Salary:", karyawan$Gaji[i], "\n")  # Menampilkan nama dan gaji karyawan
  if (karyawan$Gaji[i] > 10000) {  # Jika gaji lebih dari 10.000, hentikan loop
    cat("(Stopped because", karyawan$Nama[i], "has a salary above 10,000)\n")
    break
  }
}
## Name: Bagas , Salary: 5000 
## Name: Joan , Salary: 7000 
## Name: Alya , Salary: 6500 
## Name: Dwi , Salary: 10000 
## Name: Nabil , Salary: 12000 
## (Stopped because Nabil has a salary above 10,000)

4. Gunakan lanjutkan untuk melewati karyawan dengan kinerja “Rata-rata”

Hasil yang Diharapkan:

Name: Bagas, Performance: Good

Name: Joan, Performance: Very Good

Name: Dwi, Performance: Good

Name: Nabil, Performance: Very Good

(Alya is skipped because the performance is “Average”)

# Dataset Dummy
karyawan <- data.frame(
  Pengenal = c(1, 2, 3, 4, 5),  # ID unik untuk setiap karyawan
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),  # Nama karyawan
  Usia = c(25, 30, 27, 35, 40),  # Usia karyawan
  Gaji = c(5000, 7000, 6500, 10000, 12000),  # Gaji karyawan dalam satuan tertentu
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),  # Jabatan karyawan
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")  # Evaluasi kinerja
)

# Melewati karyawan dengan kinerja "Rata-rata"
for (i in 1:nrow(karyawan)) {
  if (karyawan$Pertunjukan[i] == "Rata-rata") {  # Jika kinerja "Rata-rata", lewati iterasi ini
    next
  }
  cat("Name:", karyawan$Nama[i], ", Performance:", karyawan$Pertunjukan[i], "\n")  # Menampilkan karyawan dengan kinerja selain "Rata-rata"
}
## Name: Bagas , Performance: Bagus 
## Name: Joan , Performance: Sangat bagus 
## Name: Dwi , Performance: Bagus 
## Name: Nabil , Performance: Sangat bagus
cat("(Alya is skipped because the performance is 'Average')\n")
## (Alya is skipped because the performance is 'Average')

LS0tDQp0aXRsZTogIlNZTlRBWCBBTkQgQ09OVFJPTCBGTE9XIg0KDQpzdWJ0aXRsZTogIlByYXRpa3VtIENvbmRpdGlvbmFsIFN0YXRlbWVudHMgYW5kIExvb3BzIGluIFIiDQoNCmF1dGhvcjogDQogIC0gIiBGaWthIElyc2FuZGkgRGVzdnlhbnRpICg1MjI0MDAwMTMpIg0KICANCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiU3R5bGVlLmNzcyINCiAgICANCi0tLQ0KDQogPGltZyBpZD0ibG9nby11dGFtYSIgc3JjPSJGaWthYWEuanBnIiBhbHQ9IkZpa2FhYS5qcGciIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPg0KDQotLS0NCg0KICoqMS4gVHVqdWFuKioNCg0KKipBLiBNZW1haGFtaSBkYW4gbWVuZXJhcGthbiBwZXJueWF0YWFuIGtvbmRpc2lvbmFsIChpZiwgaWYtZWxzZSwgaWYtZWxpZi1lbHNlKS4qKg0KDQoqKkIuIFRlcmFwa2FuIGxvb3AgKGZvciBsb29wLCB3aGlsZSBsb29wLCBicmVhaywgY29udGludWUpIHVudHVrIG1lbmdhbmFsaXNpcyBoaW1wdW5hbiBkYXRhLioqDQoNCioqR3VuYWthbiBkYXRhc2V0IGR1bW15IGJlcmlrdXQgaW5pKioNCiANCg0KfCBQRU5HRU5BTCB8IE5hbWEgIHwgVXNpYSB8IEdhamkgIHwgUG9zaXNpICAgfCBQZXJ0dW5qdWthbiAgfA0KfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwNCnwgMSAgICAgICAgfCBCYWdhcyAgfCAyNSAgIHwgNTAwMCAgfCBTdGFmICAgICB8IEJhZ3VzICAgICAgICB8DQp8IDIgICAgICAgIHwgSm9hbiAgIHwgMzAgICB8IDcwMDAgIHwgUGVuZ2F3YXMgfCBTYW5nYXQgYmFndXMgfA0KfCAzICAgICAgICB8IEFseWEgICB8IDI3ICAgfCA2NTAwICB8IFN0YWYgICAgIHwgUmF0YS1yYXRhICAgIHwNCnwgNCAgICAgICAgfCBEd2kgICAgfCAzNSAgIHwgMTAwMDAgfCBNYW5hamVyICB8IEJhZ3VzICAgICAgICB8DQp8IDUgICAgICAgIHwgTmFiaWwgIHwgNDAgICB8IDEyMDAwIHwgRGlyZWt0dXIgfCBTYW5nYXQgYmFndXMgfA0KDQotLS0tDQoNCiMgKipUZW50dWthbiB0aW5na2F0IGJvbnVzIGJlcmRhc2Fya2FuIGtpbmVyamEga2FyeWF3YW4qKg0KDQotIFNhbmdhdCBCYWlrIC0yMCUgZGFyaSBnYWppDQoNCi0gUGVuZ3VtcHVsYW4gRGF0YQ0KDQotIEJhaWsgMTAlIGRhcmkgZ2FqaQ0KDQotIFBlbWJlcnNpaGFuIERhdGENCg0KLSBSYXRhLXJhdGEgNSUgZGFyaSBnYWppDQoNCi0gVHJhbnNmb3JtYXNpIERhdGENCg0KYGBge3IgIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQoNCiMgRGF0YXNldCBEdW1teQ0Ka2FyeWF3YW4gPC0gZGF0YS5mcmFtZSgNCiAgUGVuZ2VuYWwgPSBjKDEsIDIsIDMsIDQsIDUpLCMgSUQgdW5payB1bnR1ayBzZXRpYXAga2FyeWF3YW4NCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgIyBOYW1hIGthcnlhd2FuDQogIFVzaWEgPSBjKDI1LCAzMCwgMjcsIDM1LCA0MCksIyBVc2lhIGthcnlhd2FuDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksIyBHYWppIGthcnlhd2FuIGRhbGFtIHNhdHVhbiB0ZXJ0ZW50dQ0KICBQb3Npc2kgPSBjKCJTdGFmIiwgIlBlbmdhd2FzIiwgIlN0YWYiLCAiTWFuYWplciIsICJEaXJla3R1ciIpLCMgSmFiYXRhbiBrYXJ5YXdhbiAgDQogIFBlcnR1bmp1a2FuID0gYygiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIiwgIlJhdGEtcmF0YSIsICJCYWd1cyIsICJTYW5nYXQgYmFndXMiKSMgRXZhbHVhc2kga2luZXJqYQ0KKQ0KDQojIE1lbmVudHVrYW4gYm9udXMgYmVyZGFzYXJrYW4ga2luZXJqYQ0KaGl0dW5nX2JvbnVzIDwtIGZ1bmN0aW9uKGdhamksIGtpbmVyamEpIHsNCiAgaWYgKGtpbmVyamEgPT0gIlNhbmdhdCBiYWd1cyIpIHsgIyBKaWthIGtpbmVyamEgc2FuZ2F0IGJhZ3VzLCBib251cyAyMCUgZGFyaSBnYWppDQogICAgcmV0dXJuKGdhamkgKiAwLjIpDQogIH0gZWxzZSBpZiAoa2luZXJqYSA9PSAiQmFndXMiKSB7ICMgSmlrYSBraW5lcmphIGJhZ3VzLCBib251cyAxMCUgZGFyaSBnYWppDQogICAgcmV0dXJuKGdhamkgKiAwLjEpDQogIH0gZWxzZSBpZiAoa2luZXJqYSA9PSAiUmF0YS1yYXRhIikgeyAjIEppa2Ega2luZXJqYSByYXRhLXJhdGEsIGJvbnVzIDUlIGRhcmkgZ2FqaQ0KICAgIHJldHVybihnYWppICogMC4wNSkNCiAgfSBlbHNlIHsjIEppa2Ega2luZXJqYSBkaSBiYXdhaCByYXRhLXJhdGEsIHRpZGFrIGFkYSBib251cw0KICAgIHJldHVybigwKQ0KICB9DQp9DQoNCiMgTWVuZ2hpdHVuZyBkYW4gbWVuY2V0YWsgYm9udXMgdW50dWsgc2V0aWFwIGthcnlhd2FuDQpmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgew0KICBib251cyA8LSBoaXR1bmdfYm9udXMoa2FyeWF3YW4kR2FqaVtpXSwga2FyeWF3YW4kUGVydHVuanVrYW5baV0pICMgTWVuZ2hpdHVuZyBib251cyBiZXJkYXNhcmthbiBnYWppIGRhbiBraW5lcmphDQogIGNhdCgiTmFtZToiLCBrYXJ5YXdhbiROYW1hW2ldLCAiLCBCb251czoiLCBhcy5pbnRlZ2VyKGJvbnVzKSwgIlxuIikjIE1lbmFtcGlsa2FuIGhhc2lsIHBlcmhpdHVuZ2FuIGJvbnVzDQp9DQoNCmBgYA0KDQotLS0NCg0KDQojIyAqKjEuIEd1bmFrYW4gZm9yIGxvb3AgdW50dWsgbWVtYnVhdCBkYWZ0YXIga2FyeWF3YW4gZGVuZ2FuIGdhamkgbGViaWggZGFyaSA2MDAwKioNCg0KKipIYXNpbCB5YW5nIERpaGFyYXBrYW46KioNCg0KKipOYW1lOiBKb2FuLCBTYWxhcnk6IDcwMDAqKg0KDQoqKk5hbWU6IEFseWEsIFNhbGFyeTogNjUwMCoqDQoNCioqTmFtZTogRHdpLCBTYWxhcnk6IDEwMDAwKioNCg0KKipOYW1lOiBOYWJpbMKgU2FsYXJ5wqAxMjg4MCoqDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQojIERhdGFzZXQgRHVtbXkNCmthcnlhd2FuIDwtIGRhdGEuZnJhbWUoDQogIFBlbmdlbmFsID0gYygxLCAyLCAzLCA0LCA1KSwgICMgSUQgdW5payB1bnR1ayBzZXRpYXAga2FyeWF3YW4NCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgICMgTmFtYSBrYXJ5YXdhbg0KICBVc2lhID0gYygyNSwgMzAsIDI3LCAzNSwgNDApLCAgIyBVc2lhIGthcnlhd2FuDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksICAjIEdhamkga2FyeWF3YW4gZGFsYW0gc2F0dWFuIHRlcnRlbnR1DQogIFBvc2lzaSA9IGMoIlN0YWYiLCAiUGVuZ2F3YXMiLCAiU3RhZiIsICJNYW5hamVyIiwgIkRpcmVrdHVyIiksICAjIEphYmF0YW4ga2FyeWF3YW4NCiAgUGVydHVuanVrYW4gPSBjKCJCYWd1cyIsICJTYW5nYXQgYmFndXMiLCAiUmF0YS1yYXRhIiwgIkJhZ3VzIiwgIlNhbmdhdCBiYWd1cyIpICAjIEV2YWx1YXNpIGtpbmVyamENCikNCg0KIyBNZW5hbXBpbGthbiBkYWZ0YXIga2FyeWF3YW4gZGVuZ2FuIGdhamkgbGViaWggZGFyaSA2MDAwDQpjYXQoIlxuS2FyeWF3YW4gZGVuZ2FuIGdhamkgbGViaWggZGFyaSA2MDAwOlxuIikNCmZvciAoaSBpbiAxOm5yb3coa2FyeWF3YW4pKSB7DQogIGlmIChrYXJ5YXdhbiRHYWppW2ldID4gNjAwMCkgeyAgIyBNZW1lcmlrc2EgYXBha2FoIGdhamkga2FyeWF3YW4gbGViaWggZGFyaSA2MDAwDQogICAgY2F0KCJOYW1lOiIsIGthcnlhd2FuJE5hbWFbaV0sICIsIFNhbGFyeToiLCBrYXJ5YXdhbiRHYWppW2ldLCAiXG4iKSAgIyBNZW5hbXBpbGthbiBuYW1hIGRhbiBnYWppIGthcnlhd2FuIHlhbmcgbWVtZW51aGkga3JpdGVyaWENCiAgfQ0KfQ0KDQpgYGANCg0KLS0tDQoNCiMjICoqMi4gR3VuYWthbiB3aGlsZSBsb29wIHVudHVrIG1lbmFtcGlsa2FuIGthcnlhd2FuIGhpbmdnYSAiTWFuYWplciIgZGl0ZW11a2FuLioqDQoNCioqSGFzaWwgeWFuZyBEaWhhcmFwa2FuOioqDQoNCg0KKipOYW1lOiBCYWdlcywgUG9zaXRpb246IFN0YWZmKioNCg0KDQoqKk5hbWU6IEpvYW4sIFBvc2l0aW9uOiBTdXBlcnZpc29yKioNCg0KDQoqKk5hbWU6IEFseWEsIFBvc2l0aW9uOiBTdGFmZioqDQoNCg0KKipOYW1lOiBEZXdpLCBQb3NpdGlvbjogTWFuYWdlciAoU3RvcCBoZXJlKSoqDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQojIERhdGFzZXQgRHVtbXkNCmthcnlhd2FuIDwtIGRhdGEuZnJhbWUoDQogIFBlbmdlbmFsID0gYygxLCAyLCAzLCA0LCA1KSwgICMgSUQgdW5payB1bnR1ayBzZXRpYXAga2FyeWF3YW4NCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgICMgTmFtYSBrYXJ5YXdhbg0KICBVc2lhID0gYygyNSwgMzAsIDI3LCAzNSwgNDApLCAgIyBVc2lhIGthcnlhd2FuDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksICAjIEdhamkga2FyeWF3YW4gZGFsYW0gc2F0dWFuIHRlcnRlbnR1DQogIFBvc2lzaSA9IGMoIlN0YWYiLCAiUGVuZ2F3YXMiLCAiU3RhZiIsICJNYW5hamVyIiwgIkRpcmVrdHVyIiksICAjIEphYmF0YW4ga2FyeWF3YW4NCiAgUGVydHVuanVrYW4gPSBjKCJCYWd1cyIsICJTYW5nYXQgYmFndXMiLCAiUmF0YS1yYXRhIiwgIkJhZ3VzIiwgIlNhbmdhdCBiYWd1cyIpICAjIEV2YWx1YXNpIGtpbmVyamENCikNCg0KIyBNZW5hbXBpbGthbiBrYXJ5YXdhbiBoaW5nZ2EgIk1hbmFqZXIiIGRpdGVtdWthbg0KaSA8LSAxICAjIE1lbXVsYWkgS2FyeWF3YW4gZGFyaSBwZXJ0YW1hDQp3aGlsZSAoaSA8PSBucm93KGthcnlhd2FuKSkgew0KICBjYXQoIk5hbWU6Iiwga2FyeWF3YW4kTmFtYVtpXSwgIiwgUG9zaXRpb246Iiwga2FyeWF3YW4kUG9zaXNpW2ldLCAiXG4iKSAgIyBNZW5hbXBpbGthbiBuYW1hIGRhbiBwb3Npc2kga2FyeWF3YW4NCiAgaWYgKGthcnlhd2FuJFBvc2lzaVtpXSA9PSAiTWFuYWplciIpIHsgICMgSmlrYSBwb3Npc2kgYWRhbGFoICJNYW5hamVyIiwgaGVudGlrYW4gbG9vcA0KICAgIGNhdCgiKFN0b3AgaGVyZSlcbiIpDQogICAgYnJlYWsNCiAgfQ0KICBpIDwtIGkgKyAxICAjIExhbmp1dCBrZSBrYXJ5YXdhbiBiZXJpa3V0bnlhDQp9DQoNCmBgYA0KDQotLS0NCg0KIyMgKiozLiBHdW5ha2FuIGJyZWFrIHVudHVrIG1lbmdoZW50aWthbiBsb29wIGtldGlrYSBrYXJ5YXdhbiBkZW5nYW4gZ2FqaSBkaSBhdGFzIDEwLjAwMCBkaXRlbXVrYW4uKioNCg0KDQoqKkhhc2lsIHlhbmcgRGloYXJhcGthbjoqKg0KDQoqKk5hbWU6IEJhZ2FzLCBzYWxhcnk6IHNlZWUqKg0KDQoqKk5hbWU6IEpvYW4sIFNhbGFyeTogNzAwMCoqDQoNCioqTmFtZTogQWx5YSwgU2FsYXJ5OiA2NTAwKioNCg0KKipOYW1lOiBPZCwgU2FsYXJ5OiAxMDAwMCoqDQoNCioqKFN0b3BwZWQgYmVjYXVzZSBiYWJpbCBoYXMgYSBzYWxlcnnCoGFib3ZlwqAxMCwwMDApKioNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgRGF0YXNldCBEdW1teQ0Ka2FyeWF3YW4gPC0gZGF0YS5mcmFtZSgNCiAgUGVuZ2VuYWwgPSBjKDEsIDIsIDMsIDQsIDUpLCAgIyBJRCB1bmlrIHVudHVrIHNldGlhcCBrYXJ5YXdhbg0KICBOYW1hID0gYygiQmFnYXMiLCAiSm9hbiIsICJBbHlhIiwgIkR3aSIsICJOYWJpbCIpLCAgIyBOYW1hIGthcnlhd2FuDQogIFVzaWEgPSBjKDI1LCAzMCwgMjcsIDM1LCA0MCksICAjIFVzaWEga2FyeWF3YW4NCiAgR2FqaSA9IGMoNTAwMCwgNzAwMCwgNjUwMCwgMTAwMDAsIDEyMDAwKSwgICMgR2FqaSBrYXJ5YXdhbiBkYWxhbSBzYXR1YW4gdGVydGVudHUNCiAgUG9zaXNpID0gYygiU3RhZiIsICJQZW5nYXdhcyIsICJTdGFmIiwgIk1hbmFqZXIiLCAiRGlyZWt0dXIiKSwgICMgSmFiYXRhbiBrYXJ5YXdhbg0KICBQZXJ0dW5qdWthbiA9IGMoIkJhZ3VzIiwgIlNhbmdhdCBiYWd1cyIsICJSYXRhLXJhdGEiLCAiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIikgICMgRXZhbHVhc2kga2luZXJqYQ0KKQ0KDQojIE1lbmdoZW50aWthbiBsb29wIHNhYXQgbWVuZW11a2FuIGthcnlhd2FuIGRlbmdhbiBnYWppIGRpIGF0YXMgMTAuMDAwDQpmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgew0KICBjYXQoIk5hbWU6Iiwga2FyeWF3YW4kTmFtYVtpXSwgIiwgU2FsYXJ5OiIsIGthcnlhd2FuJEdhamlbaV0sICJcbiIpICAjIE1lbmFtcGlsa2FuIG5hbWEgZGFuIGdhamkga2FyeWF3YW4NCiAgaWYgKGthcnlhd2FuJEdhamlbaV0gPiAxMDAwMCkgeyAgIyBKaWthIGdhamkgbGViaWggZGFyaSAxMC4wMDAsIGhlbnRpa2FuIGxvb3ANCiAgICBjYXQoIihTdG9wcGVkIGJlY2F1c2UiLCBrYXJ5YXdhbiROYW1hW2ldLCAiaGFzIGEgc2FsYXJ5IGFib3ZlIDEwLDAwMClcbiIpDQogICAgYnJlYWsNCiAgfQ0KfQ0KDQpgYGANCg0KLS0tDQoNCiMjICoqNC4gR3VuYWthbiBsYW5qdXRrYW4gdW50dWsgbWVsZXdhdGkga2FyeWF3YW4gZGVuZ2FuIGtpbmVyamEgIlJhdGEtcmF0YSIqKg0KDQoqKkhhc2lsIHlhbmcgRGloYXJhcGthbjoqKg0KDQoqKk5hbWU6IEJhZ2FzLCBQZXJmb3JtYW5jZTogR29vZCoqDQoNCioqTmFtZTogSm9hbiwgUGVyZm9ybWFuY2U6IFZlcnkgR29vZCoqDQoNCioqTmFtZTogRHdpLCBQZXJmb3JtYW5jZTogR29vZCoqDQoNCioqTmFtZTogTmFiaWwsIFBlcmZvcm1hbmNlOiBWZXJ5IEdvb2QqKg0KDQoqKihBbHlhIGlzIHNraXBwZWQgYmVjYXVzZSB0aGUgcGVyZm9ybWFuY2UgaXMgIkF2ZXJhZ2UiKSoqDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQojIERhdGFzZXQgRHVtbXkNCmthcnlhd2FuIDwtIGRhdGEuZnJhbWUoDQogIFBlbmdlbmFsID0gYygxLCAyLCAzLCA0LCA1KSwgICMgSUQgdW5payB1bnR1ayBzZXRpYXAga2FyeWF3YW4NCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwgICMgTmFtYSBrYXJ5YXdhbg0KICBVc2lhID0gYygyNSwgMzAsIDI3LCAzNSwgNDApLCAgIyBVc2lhIGthcnlhd2FuDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksICAjIEdhamkga2FyeWF3YW4gZGFsYW0gc2F0dWFuIHRlcnRlbnR1DQogIFBvc2lzaSA9IGMoIlN0YWYiLCAiUGVuZ2F3YXMiLCAiU3RhZiIsICJNYW5hamVyIiwgIkRpcmVrdHVyIiksICAjIEphYmF0YW4ga2FyeWF3YW4NCiAgUGVydHVuanVrYW4gPSBjKCJCYWd1cyIsICJTYW5nYXQgYmFndXMiLCAiUmF0YS1yYXRhIiwgIkJhZ3VzIiwgIlNhbmdhdCBiYWd1cyIpICAjIEV2YWx1YXNpIGtpbmVyamENCikNCg0KIyBNZWxld2F0aSBrYXJ5YXdhbiBkZW5nYW4ga2luZXJqYSAiUmF0YS1yYXRhIg0KZm9yIChpIGluIDE6bnJvdyhrYXJ5YXdhbikpIHsNCiAgaWYgKGthcnlhd2FuJFBlcnR1bmp1a2FuW2ldID09ICJSYXRhLXJhdGEiKSB7ICAjIEppa2Ega2luZXJqYSAiUmF0YS1yYXRhIiwgbGV3YXRpIGl0ZXJhc2kgaW5pDQogICAgbmV4dA0KICB9DQogIGNhdCgiTmFtZToiLCBrYXJ5YXdhbiROYW1hW2ldLCAiLCBQZXJmb3JtYW5jZToiLCBrYXJ5YXdhbiRQZXJ0dW5qdWthbltpXSwgIlxuIikgICMgTWVuYW1waWxrYW4ga2FyeWF3YW4gZGVuZ2FuIGtpbmVyamEgc2VsYWluICJSYXRhLXJhdGEiDQp9DQpjYXQoIihBbHlhIGlzIHNraXBwZWQgYmVjYXVzZSB0aGUgcGVyZm9ybWFuY2UgaXMgJ0F2ZXJhZ2UnKVxuIikNCg0KYGBgDQoNCi0tLQ0KDQoNCg==