This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

# ==============================================================================
# TEMPLATE JAWABAN KUIS
# Komputasi Statistika, Kelas D
# Prodi S1 Statistika FSAD ITS - Semester Genap 2025/2026
# Kamis, 12 Maret 2026
# ==============================================================================
# Nama  : BEATRISIA KAYLLA SIMANJUNTAK
# NRP   : 5003251189
# Kelas : D
# ==============================================================================


# ==============================================================================
# Soal 1 [TOTAL 50 poin] - Winsorized Mean
# ==============================================================================

# Data
data <- c(12, 45, 52, 58, 61, 63, 67, 70, 72, 75, 78, 82, 88, 95, 310)
# --- [a] Buatlah fungsi winsorized_mean(x, alpha) ---
sort_function <- function(data){
  sorted_data <- sort(data)
  return(sorted_data)
}

mean_function <- function(data){
  mean_value <- mean(data)
  return(mean_value)
}

data <- sort_function(data)

winsor_function <- function(data, alpha){
  
  data_sort <- sort_function(data)
  
  n <- length(data_sort)
  k <- floor(n * alpha)
  
  winsor_data <- data_sort
  
  for(i in 1:k){
    winsor_data[i] <- data_sort[k+1]
  }
  
  for(i in (n-k+1):n){
    winsor_data[i] <- data_sort[n-k]
  }
  
  return(winsor_data)
}

winsor_mean <- function(data, alpha){
  
  data_winsor <- winsor_function(data, alpha)
  mean_w <- mean_function(data_winsor)
  
  return(list(
    winsor_data = data_winsor,
    winsor_mean = mean_w
  ))
}


# --- [b] Hitung ordinary mean (alpha=0) dan Winsorized mean 20% (alpha=0.2) ---

# Ordinary mean
# TULIS KODE ANDA DI SINI
result_00 <- winsor_mean(data, 0)
cat("Winsorized data alpha 0 :", result_00$winsor_data, "\n")
cat("Winsorized mean alpha 0 :", result_00$winsor_mean)

# Winsorized mean 20%
# TULIS KODE ANDA DI SINI
result_02 <- winsor_mean(data, 0.2)
cat("Winsorized data alpha 0.2 :", result_02$winsor_data, "\n")
cat("Winsorized mean alpha 0.2 :", result_02$winsor_mean, "\n\n")

# ==============================================================================
# Soal 2 [TOTAL 60 poin] - Weighted Multivariate Descriptive Statistics
# ==============================================================================

# --- Baca data CSV ---
df <- read.csv("C:/Users/HP/Downloads/Quiz 1 Komstat/data_quiz1.csv")
X <- as.matrix(df[, c("x1", "x2", "x3")])
w <- df$w

# --- [a] Buatlah fungsi weighted_corr(X, w) ---

weighted_corr <- function(X, w) {
  # TULIS KODE ANDA DI SINI
  X <- as.matrix(X)
  n <- nrow(X)
  W <- diag(w)
  
  one_n <- matrix(1, nrow = n, ncol = 1)
  nw <- as.numeric(t(one_n) %*% w)
  
  x_bar_w <- (1/nw) * t(X) %*% W %*% one_n
  
  D <- X - (one_n %*% t(x_bar_w))
  
  Sw <- (1/nw) * t(D) %*% W %*% D
  
  sw <- sqrt(diag(Sw))
  
  V_inv <- diag(1/sw)
  Rw <- V_inv %*% Sw %*% V_inv
  
  return(list(
    W = W,
    mean_w = x_bar_w,
    S_w = Sw,
    s_w = sw,
    R_w = Rw
  ))
}

hasil <- weighted_corr(X, w)
print(hasil$W)
print(hasil$mean_w)
print(hasil$S_w)
print(hasil$s_w)
print(hasil$R_w)





# --- [b] Aplikasikan fungsi pada data ---

# Panggil fungsi
# TULIS KODE ANDA DI SINI
hasil <- weighted_corr(X, w)

# Tampilkan vektor mean tertimbang
# TULIS KODE ANDA DI SINI
print(hasil$mean_w)

# Tampilkan matriks varians-kovarians tertimbang
# TULIS KODE ANDA DI SINI
print(hasil$S_w)

# Tampilkan vektor standar deviasi tertimbang
# TULIS KODE ANDA DI SINI
print(hasil$s_w)

# Tampilkan matriks korelasi tertimbang
# TULIS KODE ANDA DI SINI
print(hasil$R_w)

install.packages("ggplot2")
install.packages("corrplot")
library("ggplot2")

# 1. LOAD LIBRARIES (Penting agar tidak error "function not found")
library(ggplot2)
library(corrplot)

# ==============================================================================
# SOAL 1: WINSORIZED MEAN
# ==============================================================================

# Data Awal (Definisikan objek ini dulu!)
data_awal <- c(12, 45, 52, 58, 61, 63, 67, 70, 72, 75, 78, 82, 88, 95, 310)

# Fungsi Winsor (Sesuai kode Anda yang sudah diperbaiki)
winsor_function <- function(data, alpha){
  data_sort <- sort(data)
  n <- length(data_sort)
  k <- floor(n * alpha)
  winsor_data <- data_sort
  if(k > 0){
    for(i in 1:k) winsor_data[i] <- data_sort[k+1]
    for(i in (n-k+1):n) winsor_data[i] <- data_sort[n-k]
  }
  return(winsor_data)
}

# Hitung Winsor 20%
data_winsor_20 <- winsor_function(data_awal, 0.2)
mean_winsor <- mean(data_winsor_20)

# VISUALISASI SOAL 1
library(ggplot2)

df_box <- data.frame(
  Nilai = c(data_awal, data_winsor_20),
  Tipe = rep(c("Original", "Winsorized 20%"), each = length(data_awal))
)

ggplot(df_box, aes(x = Tipe, y = Nilai, fill = Tipe)) +
  geom_boxplot() +
  scale_fill_manual(values = c("steelblue", "skyblue")) +
  labs(title = "Boxplot Perbandingan Data Asli vs Winsorized") +
  theme_minimal()

# ==============================================================================
# SOAL 2: MULTIVARIATE CORRELATION
# ==============================================================================

# Menggunakan matriks korelasi yang Anda dapatkan sebelumnya
# Kita buat matriksnya secara manual agar kode ini bisa jalan (reproducible)
Rw_matrix <- matrix(c(1.0000000, -0.9531095, -0.9558207,
                      -0.9531095,  1.0000000,  0.9891979,
                      -0.9558207,  0.9891979,  1.0000000), 
                    nrow = 3, byrow = TRUE)
colnames(Rw_matrix) <- rownames(Rw_matrix) <- c("x1", "x2", "x3")

# VISUALISASI SOAL 2
corrplot(Rw_matrix, method = "color", addCoef.col = "black", 
         tl.col = "black", title = "\nHeatmap Korelasi Tertimbang", mar=c(0,0,1,0))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLg0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouDQoNCmBgYHtyfQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgVEVNUExBVEUgSkFXQUJBTiBLVUlTDQojIEtvbXB1dGFzaSBTdGF0aXN0aWthLCBLZWxhcyBEDQojIFByb2RpIFMxIFN0YXRpc3Rpa2EgRlNBRCBJVFMgLSBTZW1lc3RlciBHZW5hcCAyMDI1LzIwMjYNCiMgS2FtaXMsIDEyIE1hcmV0IDIwMjYNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIE5hbWEgIDogQkVBVFJJU0lBIEtBWUxMQSBTSU1BTkpVTlRBSw0KIyBOUlAgICA6IDUwMDMyNTExODkNCiMgS2VsYXMgOiBEDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFNvYWwgMSBbVE9UQUwgNTAgcG9pbl0gLSBXaW5zb3JpemVkIE1lYW4NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgRGF0YQ0KZGF0YSA8LSBjKDEyLCA0NSwgNTIsIDU4LCA2MSwgNjMsIDY3LCA3MCwgNzIsIDc1LCA3OCwgODIsIDg4LCA5NSwgMzEwKQ0KIyAtLS0gW2FdIEJ1YXRsYWggZnVuZ3NpIHdpbnNvcml6ZWRfbWVhbih4LCBhbHBoYSkgLS0tDQpzb3J0X2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGRhdGEpew0KICBzb3J0ZWRfZGF0YSA8LSBzb3J0KGRhdGEpDQogIHJldHVybihzb3J0ZWRfZGF0YSkNCn0NCg0KbWVhbl9mdW5jdGlvbiA8LSBmdW5jdGlvbihkYXRhKXsNCiAgbWVhbl92YWx1ZSA8LSBtZWFuKGRhdGEpDQogIHJldHVybihtZWFuX3ZhbHVlKQ0KfQ0KDQpkYXRhIDwtIHNvcnRfZnVuY3Rpb24oZGF0YSkNCg0Kd2luc29yX2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGRhdGEsIGFscGhhKXsNCiAgDQogIGRhdGFfc29ydCA8LSBzb3J0X2Z1bmN0aW9uKGRhdGEpDQogIA0KICBuIDwtIGxlbmd0aChkYXRhX3NvcnQpDQogIGsgPC0gZmxvb3IobiAqIGFscGhhKQ0KICANCiAgd2luc29yX2RhdGEgPC0gZGF0YV9zb3J0DQogIA0KICBmb3IoaSBpbiAxOmspew0KICAgIHdpbnNvcl9kYXRhW2ldIDwtIGRhdGFfc29ydFtrKzFdDQogIH0NCiAgDQogIGZvcihpIGluIChuLWsrMSk6bil7DQogICAgd2luc29yX2RhdGFbaV0gPC0gZGF0YV9zb3J0W24ta10NCiAgfQ0KICANCiAgcmV0dXJuKHdpbnNvcl9kYXRhKQ0KfQ0KDQp3aW5zb3JfbWVhbiA8LSBmdW5jdGlvbihkYXRhLCBhbHBoYSl7DQogIA0KICBkYXRhX3dpbnNvciA8LSB3aW5zb3JfZnVuY3Rpb24oZGF0YSwgYWxwaGEpDQogIG1lYW5fdyA8LSBtZWFuX2Z1bmN0aW9uKGRhdGFfd2luc29yKQ0KICANCiAgcmV0dXJuKGxpc3QoDQogICAgd2luc29yX2RhdGEgPSBkYXRhX3dpbnNvciwNCiAgICB3aW5zb3JfbWVhbiA9IG1lYW5fdw0KICApKQ0KfQ0KDQoNCiMgLS0tIFtiXSBIaXR1bmcgb3JkaW5hcnkgbWVhbiAoYWxwaGE9MCkgZGFuIFdpbnNvcml6ZWQgbWVhbiAyMCUgKGFscGhhPTAuMikgLS0tDQoNCiMgT3JkaW5hcnkgbWVhbg0KIyBUVUxJUyBLT0RFIEFOREEgREkgU0lOSQ0KcmVzdWx0XzAwIDwtIHdpbnNvcl9tZWFuKGRhdGEsIDApDQpjYXQoIldpbnNvcml6ZWQgZGF0YSBhbHBoYSAwIDoiLCByZXN1bHRfMDAkd2luc29yX2RhdGEsICJcbiIpDQpjYXQoIldpbnNvcml6ZWQgbWVhbiBhbHBoYSAwIDoiLCByZXN1bHRfMDAkd2luc29yX21lYW4pDQoNCiMgV2luc29yaXplZCBtZWFuIDIwJQ0KIyBUVUxJUyBLT0RFIEFOREEgREkgU0lOSQ0KcmVzdWx0XzAyIDwtIHdpbnNvcl9tZWFuKGRhdGEsIDAuMikNCmNhdCgiV2luc29yaXplZCBkYXRhIGFscGhhIDAuMiA6IiwgcmVzdWx0XzAyJHdpbnNvcl9kYXRhLCAiXG4iKQ0KY2F0KCJXaW5zb3JpemVkIG1lYW4gYWxwaGEgMC4yIDoiLCByZXN1bHRfMDIkd2luc29yX21lYW4sICJcblxuIikNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgU29hbCAyIFtUT1RBTCA2MCBwb2luXSAtIFdlaWdodGVkIE11bHRpdmFyaWF0ZSBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIC0tLSBCYWNhIGRhdGEgQ1NWIC0tLQ0KZGYgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0hQL0Rvd25sb2Fkcy9RdWl6IDEgS29tc3RhdC9kYXRhX3F1aXoxLmNzdiIpDQpYIDwtIGFzLm1hdHJpeChkZlssIGMoIngxIiwgIngyIiwgIngzIildKQ0KdyA8LSBkZiR3DQoNCiMgLS0tIFthXSBCdWF0bGFoIGZ1bmdzaSB3ZWlnaHRlZF9jb3JyKFgsIHcpIC0tLQ0KDQp3ZWlnaHRlZF9jb3JyIDwtIGZ1bmN0aW9uKFgsIHcpIHsNCiAgIyBUVUxJUyBLT0RFIEFOREEgREkgU0lOSQ0KICBYIDwtIGFzLm1hdHJpeChYKQ0KICBuIDwtIG5yb3coWCkNCiAgVyA8LSBkaWFnKHcpDQogIA0KICBvbmVfbiA8LSBtYXRyaXgoMSwgbnJvdyA9IG4sIG5jb2wgPSAxKQ0KICBudyA8LSBhcy5udW1lcmljKHQob25lX24pICUqJSB3KQ0KICANCiAgeF9iYXJfdyA8LSAoMS9udykgKiB0KFgpICUqJSBXICUqJSBvbmVfbg0KICANCiAgRCA8LSBYIC0gKG9uZV9uICUqJSB0KHhfYmFyX3cpKQ0KICANCiAgU3cgPC0gKDEvbncpICogdChEKSAlKiUgVyAlKiUgRA0KICANCiAgc3cgPC0gc3FydChkaWFnKFN3KSkNCiAgDQogIFZfaW52IDwtIGRpYWcoMS9zdykNCiAgUncgPC0gVl9pbnYgJSolIFN3ICUqJSBWX2ludg0KICANCiAgcmV0dXJuKGxpc3QoDQogICAgVyA9IFcsDQogICAgbWVhbl93ID0geF9iYXJfdywNCiAgICBTX3cgPSBTdywNCiAgICBzX3cgPSBzdywNCiAgICBSX3cgPSBSdw0KICApKQ0KfQ0KDQpoYXNpbCA8LSB3ZWlnaHRlZF9jb3JyKFgsIHcpDQpwcmludChoYXNpbCRXKQ0KcHJpbnQoaGFzaWwkbWVhbl93KQ0KcHJpbnQoaGFzaWwkU193KQ0KcHJpbnQoaGFzaWwkc193KQ0KcHJpbnQoaGFzaWwkUl93KQ0KDQoNCg0KDQoNCiMgLS0tIFtiXSBBcGxpa2FzaWthbiBmdW5nc2kgcGFkYSBkYXRhIC0tLQ0KDQojIFBhbmdnaWwgZnVuZ3NpDQojIFRVTElTIEtPREUgQU5EQSBESSBTSU5JDQpoYXNpbCA8LSB3ZWlnaHRlZF9jb3JyKFgsIHcpDQoNCiMgVGFtcGlsa2FuIHZla3RvciBtZWFuIHRlcnRpbWJhbmcNCiMgVFVMSVMgS09ERSBBTkRBIERJIFNJTkkNCnByaW50KGhhc2lsJG1lYW5fdykNCg0KIyBUYW1waWxrYW4gbWF0cmlrcyB2YXJpYW5zLWtvdmFyaWFucyB0ZXJ0aW1iYW5nDQojIFRVTElTIEtPREUgQU5EQSBESSBTSU5JDQpwcmludChoYXNpbCRTX3cpDQoNCiMgVGFtcGlsa2FuIHZla3RvciBzdGFuZGFyIGRldmlhc2kgdGVydGltYmFuZw0KIyBUVUxJUyBLT0RFIEFOREEgREkgU0lOSQ0KcHJpbnQoaGFzaWwkc193KQ0KDQojIFRhbXBpbGthbiBtYXRyaWtzIGtvcmVsYXNpIHRlcnRpbWJhbmcNCiMgVFVMSVMgS09ERSBBTkRBIERJIFNJTkkNCnByaW50KGhhc2lsJFJfdykNCg0KDQpgYGANCg0KYGBge3J9DQoNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQoNCiMgMS4gTE9BRCBMSUJSQVJJRVMgKFBlbnRpbmcgYWdhciB0aWRhayBlcnJvciAiZnVuY3Rpb24gbm90IGZvdW5kIikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY29ycnBsb3QpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFNPQUwgMTogV0lOU09SSVpFRCBNRUFODQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIERhdGEgQXdhbCAoRGVmaW5pc2lrYW4gb2JqZWsgaW5pIGR1bHUhKQ0KZGF0YV9hd2FsIDwtIGMoMTIsIDQ1LCA1MiwgNTgsIDYxLCA2MywgNjcsIDcwLCA3MiwgNzUsIDc4LCA4MiwgODgsIDk1LCAzMTApDQoNCiMgRnVuZ3NpIFdpbnNvciAoU2VzdWFpIGtvZGUgQW5kYSB5YW5nIHN1ZGFoIGRpcGVyYmFpa2kpDQp3aW5zb3JfZnVuY3Rpb24gPC0gZnVuY3Rpb24oZGF0YSwgYWxwaGEpew0KICBkYXRhX3NvcnQgPC0gc29ydChkYXRhKQ0KICBuIDwtIGxlbmd0aChkYXRhX3NvcnQpDQogIGsgPC0gZmxvb3IobiAqIGFscGhhKQ0KICB3aW5zb3JfZGF0YSA8LSBkYXRhX3NvcnQNCiAgaWYoayA+IDApew0KICAgIGZvcihpIGluIDE6aykgd2luc29yX2RhdGFbaV0gPC0gZGF0YV9zb3J0W2srMV0NCiAgICBmb3IoaSBpbiAobi1rKzEpOm4pIHdpbnNvcl9kYXRhW2ldIDwtIGRhdGFfc29ydFtuLWtdDQogIH0NCiAgcmV0dXJuKHdpbnNvcl9kYXRhKQ0KfQ0KDQojIEhpdHVuZyBXaW5zb3IgMjAlDQpkYXRhX3dpbnNvcl8yMCA8LSB3aW5zb3JfZnVuY3Rpb24oZGF0YV9hd2FsLCAwLjIpDQptZWFuX3dpbnNvciA8LSBtZWFuKGRhdGFfd2luc29yXzIwKQ0KDQojIFZJU1VBTElTQVNJIFNPQUwgMQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpkZl9ib3ggPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfYXdhbCwgZGF0YV93aW5zb3JfMjApLA0KICBUaXBlID0gcmVwKGMoIk9yaWdpbmFsIiwgIldpbnNvcml6ZWQgMjAlIiksIGVhY2ggPSBsZW5ndGgoZGF0YV9hd2FsKSkNCikNCg0KZ2dwbG90KGRmX2JveCwgYWVzKHggPSBUaXBlLCB5ID0gTmlsYWksIGZpbGwgPSBUaXBlKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInN0ZWVsYmx1ZSIsICJza3libHVlIikpICsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IFBlcmJhbmRpbmdhbiBEYXRhIEFzbGkgdnMgV2luc29yaXplZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIFNPQUwgMjogTVVMVElWQVJJQVRFIENPUlJFTEFUSU9ODQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIE1lbmdndW5ha2FuIG1hdHJpa3Mga29yZWxhc2kgeWFuZyBBbmRhIGRhcGF0a2FuIHNlYmVsdW1ueWENCiMgS2l0YSBidWF0IG1hdHJpa3NueWEgc2VjYXJhIG1hbnVhbCBhZ2FyIGtvZGUgaW5pIGJpc2EgamFsYW4gKHJlcHJvZHVjaWJsZSkNClJ3X21hdHJpeCA8LSBtYXRyaXgoYygxLjAwMDAwMDAsIC0wLjk1MzEwOTUsIC0wLjk1NTgyMDcsDQogICAgICAgICAgICAgICAgICAgICAgLTAuOTUzMTA5NSwgIDEuMDAwMDAwMCwgIDAuOTg5MTk3OSwNCiAgICAgICAgICAgICAgICAgICAgICAtMC45NTU4MjA3LCAgMC45ODkxOTc5LCAgMS4wMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgIG5yb3cgPSAzLCBieXJvdyA9IFRSVUUpDQpjb2xuYW1lcyhSd19tYXRyaXgpIDwtIHJvd25hbWVzKFJ3X21hdHJpeCkgPC0gYygieDEiLCAieDIiLCAieDMiKQ0KDQojIFZJU1VBTElTQVNJIFNPQUwgMg0KY29ycnBsb3QoUndfbWF0cml4LCBtZXRob2QgPSAiY29sb3IiLCBhZGRDb2VmLmNvbCA9ICJibGFjayIsIA0KICAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGl0bGUgPSAiXG5IZWF0bWFwIEtvcmVsYXNpIFRlcnRpbWJhbmciLCBtYXI9YygwLDAsMSwwKSkNCmBgYA0K