Membuat Data SARIMA Dengan Rumus Manual
Menentukan parameter model SARIMA
Model: SARIMA(0,0,0)(3,1,0)^12 SARIMA(0,0,0)(3,1,0)^12
- p=0, d=0, q=0 (orde non-musiman)
- P=3, D=1, Q=0 (orde musiman)
- S=12 (periode musiman)
Menentukan koefisien AR musiman (Phi):
- SAR(1) = 0,7
- SAR(2) = 0,6
- SAR(3) = -0,8
Menentukan Parameter Model
# Parameter Model
sphi1 <- 0.7
sphi2 <- 0.6
sphi3 <- -0.8
sd_a <- 1 # Standar deviasi dari a_t (noise)
phi_seasonal <- c(sphi1, sphi2, sphi3)
# Panjang data
n_desired <- 1000
n_burn_in_manual <- 100 # Periode burn-in
n_total <- n_desired + n_burn_in_manual
Melakukan Simulasi Model Manual
# Inisialisasi vektor y untuk menyimpan semua nilai (termasuk burn-in)
y_manual <- numeric(n_total)
# Menghasilkan data menggunakan loop
set.seed(164) # Untuk reproduktifitas
for (t in 1:n_total) {
# Hasilkan white noise a_t
a_t <- rnorm(1, mean = 0, sd = sd_a)
# Ambil nilai lag, jika t-k <= 0, anggap y_{t-k} = 0 (umum untuk inisialisasi)
y_t_minus_12 <- ifelse(t - 12 > 0, y_manual[t - 12], 0)
y_t_minus_24 <- ifelse(t - 24 > 0, y_manual[t - 24], 0)
y_t_minus_36 <- ifelse(t - 36 > 0, y_manual[t - 36], 0)
y_t_minus_48 <- ifelse(t - 48 > 0, y_manual[t - 48], 0)
# Terapkan formula
if (t <= 12) { # Tidak ada lag musiman yang cukup
y_manual[t] <- a_t
} else if (t <= 24) { # Hanya bisa menghitung sampai lag 12
y_manual[t] <- y_t_minus_12 +
a_t
} else if (t <= 36) { # Hanya bisa menghitung sampai lag 24
y_manual[t] <- y_t_minus_12 +
sphi1 * (y_t_minus_12 - y_t_minus_24) +
a_t
} else if (t <= 48) { # Hanya bisa menghitung sampai lag 36
y_manual[t] <- y_t_minus_12 +
sphi1 * (y_t_minus_12 - y_t_minus_24) +
sphi2 * (y_t_minus_24 - y_t_minus_36) +
a_t
} else { # t > 48, semua lag tersedia
y_manual[t] <- y_t_minus_12 +
sphi1 * (y_t_minus_12 - y_t_minus_24) +
sphi2 * (y_t_minus_24 - y_t_minus_36) +
sphi3 * (y_t_minus_36 - y_t_minus_48) +
a_t
}
}
# Buang periode burn-in untuk mendapatkan Y_t final
data_sarima_manual_Yt <- y_manual[(n_burn_in_manual + 1):n_total]
# Melihat beberapa data pertama dari Y_t
print(head(data_sarima_manual_Yt))
[1] 3.3307716 2.8772205 4.6720470 -3.9119302 0.4191986 -12.6695242
# Memvisualisasikan data Y_t (opsional)
plot(ts(data_sarima_manual_Yt), main = "Data Simulasi Yt SARIMA(0,0,0)(3,1,0)^12 Manual Loop",
ylab = "Nilai Yt", col = "red")

Plot Yt ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 1, 0)^12 Tanpa
Library
# Menghitung dan memplot ACF Yt
acf(data_sarima_manual,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "Yt ACF untuk SARIMA(0,0,0)(3,1,0)^12 Tanpa Library",
ylab = "ACF")

# Menghitung dan memplot PACF Yt
pacf(data_sarima_manual,
lag.max = 48, # Tampilkan hingga lag 48
main = "Yt PACF untuk SARIMA(0,0,0)(3,1,0)^12 Tanpa Library",
ylab = "PACF")

Menghitung Wt ARIMA(0,0,0)(3,1,0)^12 Tanpa Library
# Hitung Wt = Yt - Y_{t-12}
# data_sarima_manual_Yt adalah seri Yt setelah burn-in
# Wt akan memiliki panjang n_desired - 12
data_sarima_manual_Wt <- diff(data_sarima_manual_Yt, lag = 12)
# Melihat beberapa data pertama dari Wt
cat("\nBeberapa data pertama dari Wt:\n")
Beberapa data pertama dari Wt:
print(head(data_sarima_manual_Wt))
[1] -2.331840 1.751699 2.436126 1.353494 -5.649257 -3.176931
# Memvisualisasikan data Wt
plot(ts(data_sarima_manual_Wt),
main = "Data Diferensiasi Musiman Wt = Yt - Y(t-12) Tanpa Library",
ylab = "Nilai Wt", col = "purple")

Plot Wt ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 1, 0)^12 Tanpa
Library
# Menghitung dan memplot ACF Wt
acf(data_sarima_manual_Wt,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "Wt ACF untuk SARIMA(0,0,0)(3,1,0)^12 Tanpa Library",
ylab = "ACF")

# Menghitung dan memplot PACF Wt
pacf(data_sarima_manual_Wt,
lag.max = 48, # Tampilkan hingga lag 48
main = "Wt PACF untuk SARIMA(0,0,0)(3,1,0)^12 Tanpa Library",
ylab = "PACF")

Kesimpulan:
- Plot ACF mengalami dies down pada lag kelipatan 12
- Plot PACF mengalami cutoff pada lag 36
Secara teori sudah benar
Membuat Data SARIMA(0,0,0)(3,1,0) Dengan Library
# Panjang data yang ingin dihasilkan
n_desired <- 1000
# Minimal 48 untuk model ini, tetapi lebih banyak lebih baik
n_burn_in_arima_sim <- n_burn_in_manual
# Membuat daftar model untuk arima.sim()
model_spec <- list(
order = c(0, 0, 0), # (p,d,q) non-musiman
seasonal = list(
order = c(3, 1, 0), # (P,D,Q) musiman
period = 12,
sar = phi_seasonal # Koefisien AR musiman
)
)
set.seed(1) # Untuk reproduktifitas
data_sarima_sim <- arima.sim(model = model_spec,
n = n_desired,
n.start = n_burn_in_arima_sim,
sd = 164) # Standar deviasi dari a_t
# Melihat beberapa data pertama
print(head(data_sarima_sim))
Time Series:
Start = 1
End = 6
Frequency = 1
[1] -101.740135 6.907003 -149.391150 25.916719 -107.351882 289.835112
# Memvisualisasikan data (opsional)
plot(data_sarima_sim, main = "Data Simulasi Yt SARIMA(0,0,0)(3,1,0)^12 via arima.sim",
ylab = "Nilai", col = "blue")

Plot Yt ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 1, 0)^12 Via
arima.sim
# Menghitung dan memplot ACF Yt
acf(data_sarima_sim,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "Yt ACF untuk SARIMA(0,0,0)(3,1,0)^12 arima.sim",
ylab = "ACF")

# Menghitung dan memplot PACF Yt
pacf(data_sarima_sim,
lag.max = 48, # Tampilkan hingga lag 48
main = "Yt PACF untuk SARIMA(0,0,0)(3,1,0)^12 arima.sim",
ylab = "PACF")

Menghitung Wt ARIMA(0,0,0)(3,1,0)^12 Dengan Library
# Hitung Wt = Yt - Y_{t-12}
# data_sarima_manual_Yt adalah seri Yt setelah burn-in
# Wt akan memiliki panjang n_desired - 12
data_sarima_library_Wt <- diff(data_sarima_sim, lag = 12)
# Melihat beberapa data pertama dari Wt
cat("\nBeberapa data pertama dari Wt:\n")
Beberapa data pertama dari Wt:
print(head(data_sarima_library_Wt))
Time Series:
Start = 13
End = 18
Frequency = 1
[1] 336.63442 -113.62121 115.38071 -90.33722 54.87305 -335.60969
# Memvisualisasikan data Wt
plot(ts(data_sarima_library_Wt),
main = "Data Diferensiasi Musiman Wt = Yt - Y(t-12) Via arima.sim",
ylab = "Nilai Wt", col = "purple")

Plot Wt ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 1, 0)^12
Dengan Library
# Menghitung dan memplot ACF Wt
acf(data_sarima_library_Wt,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "Wt ACF untuk SARIMA(0,0,0)(3,1,0)^12 Dengan Library",
ylab = "ACF")

# Menghitung dan memplot PACF Wt
pacf(data_sarima_library_Wt,
lag.max = 60, # Tampilkan hingga lag 48
main = "Wt PACF untuk SARIMA(0,0,0)(3,1,0)^12 Dengan Library",
ylab = "PACF")

Kesimpulan:
- Plot ACF mengalami cut off pada lag 12
- Plot PACF mengalami dies down pada kelipatan 12
Secara teori belum benar
Model Tanpa Differencing
\[
\Phi_3 (B^{12}) y_t = a_t \\
y_t - \Phi_1 B^{12} y_t - \Phi_2 B^{24} y_t - \Phi_3 B^{36} y_t = a_t \\
y_t = \Phi_1 B^{12} y_t + \Phi_2 B^{24} y_t + \Phi_3 B^{36} + a_t \\
y_t = \Phi_1 y_{t-12} + \Phi_2 y_{t-24} + \Phi_3 y_{t-36} + a_t
\]
Menentukan Parameter
# Parameter Model
phi1_m <- sphi1
phi2_m <- sphi2
phi3_m <- sphi3 # Koefisien yang sama dengan arima.sim di atas
sd_a_m <- sd_a # Standar deviasi dari a_t (noise)
# Untuk model stasioner (D=0, d=0), kita bisa menambahkan konstanta c
constant_c <- 0
# Panjang data
n_desired_manual_P3D0 <- 1000
n_burn_in_manual_P3D0 <- 100 # Periode burn-in
n_total_manual_P3D0 <- n_desired_manual_P3D0 + n_burn_in_manual_P3D0
Simulasi Model ARIMA(0, 0, 0)(3, 0, 0)^12 Tanpa Library
# Inisialisasi vektor y untuk menyimpan semua nilai (termasuk burn-in)
y_manual_P3D0 <- numeric(n_total_manual_P3D0)
# Menghasilkan data menggunakan loop
set.seed(164) # Untuk reproduktifitas
for (t in 1:n_total_manual_P3D0) {
# Hasilkan white noise a_t
a_t <- rnorm(1, mean = 0, sd = sd_a_m)
# Ambil nilai lag, jika t-k <= 0, anggap y_{t-k} = 0 (untuk mean nol proses awal)
# Ini adalah pendekatan sederhana untuk inisialisasi; periode burn-in membantu.
y_t_minus_12 <- ifelse(t - 12 > 0, y_manual_P3D0[t - 12], 0)
y_t_minus_24 <- ifelse(t - 24 > 0, y_manual_P3D0[t - 24], 0)
y_t_minus_36 <- ifelse(t - 36 > 0, y_manual_P3D0[t - 36], 0)
# Terapkan formula
# Kita perlu setidaknya 36 observasi sebelumnya untuk menggunakan formula lengkap.
# Logika if/else ini menangani iterasi awal selama periode burn-in.
if (t > 36) {
y_manual_P3D0[t] <- constant_c +
phi1_m * y_t_minus_12 +
phi2_m * y_t_minus_24 +
phi3_m * y_t_minus_36 +
a_t
} else if (t > 24) { # Hanya bisa menggunakan lag 12 dan 24
y_manual_P3D0[t] <- constant_c +
phi1_m * y_t_minus_12 +
phi2_m * y_t_minus_24 +
a_t # phi3_m * y_t_minus_36 tidak ada
} else if (t > 12) { # Hanya bisa menggunakan lag 12
y_manual_P3D0[t] <- constant_c +
phi1_m * y_t_minus_12 +
a_t # phi2_m dan phi3_m tidak ada
} else { # Tidak ada lag musiman yang cukup
y_manual_P3D0[t] <- constant_c + a_t
}
}
# Buang periode burn-in
data_sarima_manual_P3D0 <- y_manual_P3D0[(n_burn_in_manual_P3D0 + 1):n_total_manual_P3D0]
# Melihat beberapa data pertama
print(head(data_sarima_manual_P3D0))
[1] -4.1002584 2.5593445 2.8826714 0.2394817 -6.4316180 -3.9651008
# Memvisualisasikan data (opsional)
plot(ts(data_sarima_manual_P3D0),
main = "Data Simulasi SARIMA(0,0,0)(3,0,0)^12 Manual Loop",
ylab = "Nilai", col = "purple4")

Plot Yt ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 0, 0)^12 Tanpa
Library
# Menghitung dan memplot ACF
acf(data_sarima_manual_P3D0,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "Yt ACF untuk SARIMA(0,0,0)(3,0,0)^12 Manual",
ylab = "ACF")

# Menghitung dan memplot PACF
pacf(data_sarima_manual_P3D0,
lag.max = 48, # Tampilkan hingga lag 48
main = "Yt PACF untuk SARIMA(0,0,0)(3,0,0)^12 Manual",
ylab = "PACF")

Kesimpulan:
- Plot ACF mengalami Dies down pada lag kelipatan 12
- Plot PACF mengalami cut off pada lag 36
Secara teori sudah benar
Menentukan Parameter
# Koefisien AR Musiman (Phi1, Phi2, Phi3)
phi_seasonal_P3D0 <- phi_seasonal
# Panjang data yang ingin dihasilkan (setelah burn-in)
n_desired_P3D0 <- 1000
# Periode burn-in (untuk membiarkan model stabil)
# Minimal 36 untuk model ini, tetapi lebih banyak lebih baik
n_burn_in_arima_sim_P3D0 <- 100
Simulasi Model ARIMA(0, 0, 0)(3, 0, 0)^12 Dengan Library
# Membuat daftar model untuk arima.sim()
model_spec_P3D0 <- list(
order = c(0, 0, 0), # (p,d,q) non-musiman
seasonal = list(
order = c(3, 0, 0), # (P,D,Q) musiman -> D=0 sekarang
period = 12,
sar = phi_seasonal_P3D0 # Koefisien AR musiman
)
)
# Menghasilkan data (secara default mean nol)
set.seed(456) # Untuk reproduktifitas
data_sarima_sim_P3D0 <- arima.sim(model = model_spec_P3D0,
n = n_desired_P3D0,
n.start = n_burn_in_arima_sim_P3D0,
sd = 1) # Standar deviasi dari a_t
# Melihat beberapa data pertama
print(head(data_sarima_sim_P3D0))
Time Series:
Start = 1
End = 6
Frequency = 1
[1] 0.11815133 0.86990262 -0.09193621 0.06889879 -1.68242675 1.11695555
# Memvisualisasikan data (opsional)
plot(data_sarima_sim_P3D0,
main = "Data Simulasi SARIMA(0,0,0)(3,0,0)^12 via arima.sim",
ylab = "Nilai", col = "green4")

Plot ACF & PACF Data Simulai ARIMA(0, 0, 0)(3, 0, 0)^12 Via
arima.sim
# Menghitung dan memplot ACF
acf(data_sarima_sim_P3D0,
lag.max = 48, # Tampilkan hingga lag 48 untuk melihat beberapa siklus musiman
main = "ACF untuk SARIMA(0,0,0)(3,0,0)^12",
ylab = "ACF")

# Menghitung dan memplot PACF
pacf(data_sarima_sim_P3D0,
lag.max = 48, # Tampilkan hingga lag 48
main = "PACF untuk SARIMA(0,0,0)(3,0,0)^12",
ylab = "PACF")

Kesimpulan:
- Plot ACF tidak ada lag yang signifikan, mungkin hanya pada lag
27
- Plot PACF yang memiliki lag yang signifikan ada pada lag 12, dan
27
Secara teori belum benar
LS0tDQp0aXRsZTogIkFSSU1BIFNlYXNvbmFsIFNpbXVsYXRpb24iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KTkFNQTogVGl0byBGYXV6YW4gUHV0cmEgPGJyPg0KTlJQOiA1MDAzMjIxMTY0IDxicj4NCktlbGFzOiBQZW5nYW50YXIgQW5hbGlzaXMgRGVyZXQgV2FrdHUgQSA8YnI+DQoNCiMjIEFSSU1BKDAsMCwwKSgzLDEsMCkgTW9kZWwNCg0KIyMjIE1vZGVsIERlbmdhbiBCYWNrc2hpZnQgT3BlcmF0b3I6DQokJA0KKFxQaGlfezN9KUJeezEyfSgxLUJeezEyfSl5X3Q9YV90IFxcDQooMS1cUGhpXzFCXnsxMn0tXFBoaV8yQl57MjR9LVxQaGlfM0JeezM2fSkoMS1CXnsxMn0peV90PWFfdCBcXA0KJCQNCg0KDQojIyMgSmlrYSBiYWNrc2hpZnQgZGkga29udmVyc2kgbWVuamFkaSB5dCBtYWthOg0KJCQNCnlfe3Qtbn0gPSBCXm55X3QNCiQkDQoNCiMjIyBNYWthIHBlcnNhbWFhbiBla3NwbGlzaXQgbWVuamFkaToNCiQkDQooMSAtIFxQaGlfMSBCXnsxMn0gLSBcUGhpXzIgQl57MjR9IC1cUGhpXzMgQl57MzZ9KSAoeV90IC0gQl57MTJ9IHlfdCkgPSBhX3QgXFwNCnlfdCAtIEJeezEyfSB5X3QgLSBcUGhpXzFCXnsxMn0geV90ICsgXFBoaV8xIEJeezI0fSB5X3QgLSBcUGhpXzIgQl57MjR9IHlfdCArIFxQaGlfMiBCXnszNn0geV90IC0gXFBoaV8zIEJeezM2fSB5X3QgKyBcUGhpXzMgQl57NDh9IHlfdCA9IGFfdCBcXA0KeV90ID0gQl57MTJ9IHlfdCArIFxQaGlfMSBCXnsxMn0geV90IC0gXFBoaV8xQl57MjR9IHlfdCArIFxQaGlfMkJeezI0fXlfdC1cUGhpXzJCXnszNn15X3QrXFBoaV8zQl57MzZ9eV90LVxQaGlfM0JeezQ4fXlfdCArIGFfdCBcXA0KeV90ID0geV97dC0xMn0gKyBcUGhpXzEgKHlfe3QtMTJ9IC0geV97dC0yNH0pICsgXFBoaV8yICh5X3t0LTI0fSAtIHlfe3QtMzZ9KSArIFxQaGlfMyAoeV97dC0zNn0gLSB5X3t0LTQ4fSkgKyBhX3QNCiQkDQoNCiMjIE1lbWJ1YXQgRGF0YSBTQVJJTUEgRGVuZ2FuIFJ1bXVzIE1hbnVhbA0KDQojIyMgTWVuZW50dWthbiBwYXJhbWV0ZXIgbW9kZWwgU0FSSU1BDQpNb2RlbDogU0FSSU1BKDAsMCwwKSgzLDEsMCleMTINClNBUklNQSgwLDAsMCkoMywxLDApXjEyDQoNCi0gcD0wLCBkPTAsIHE9MCAob3JkZSBub24tbXVzaW1hbikNCi0gUD0zLCBEPTEsIFE9MCAob3JkZSBtdXNpbWFuKQ0KLSBTPTEyIChwZXJpb2RlIG11c2ltYW4pDQoNCk1lbmVudHVrYW4ga29lZmlzaWVuIEFSIG11c2ltYW4gKFBoaSk6DQoNCi0gU0FSKDEpID0gMCw3DQotIFNBUigyKSA9IDAsNg0KLSBTQVIoMykgPSAtMCw4DQoNCiMjIyBNZW5lbnR1a2FuIFBhcmFtZXRlciBNb2RlbA0KYGBge3J9DQojIFBhcmFtZXRlciBNb2RlbA0Kc3BoaTEgPC0gMC43DQpzcGhpMiA8LSAwLjYNCnNwaGkzIDwtIC0wLjgNCnNkX2EgPC0gMSAjIFN0YW5kYXIgZGV2aWFzaSBkYXJpIGFfdCAobm9pc2UpDQpwaGlfc2Vhc29uYWwgPC0gYyhzcGhpMSwgc3BoaTIsIHNwaGkzKQ0KDQojIFBhbmphbmcgZGF0YQ0Kbl9kZXNpcmVkIDwtIDEwMDANCm5fYnVybl9pbl9tYW51YWwgPC0gMTAwICMgUGVyaW9kZSBidXJuLWluDQpuX3RvdGFsIDwtIG5fZGVzaXJlZCArIG5fYnVybl9pbl9tYW51YWwNCmBgYA0KDQojIyMgTWVsYWt1a2FuIFNpbXVsYXNpIE1vZGVsIE1hbnVhbA0KYGBge3J9DQojIEluaXNpYWxpc2FzaSB2ZWt0b3IgeSB1bnR1ayBtZW55aW1wYW4gc2VtdWEgbmlsYWkgKHRlcm1hc3VrIGJ1cm4taW4pDQp5X21hbnVhbCA8LSBudW1lcmljKG5fdG90YWwpDQoNCiMgTWVuZ2hhc2lsa2FuIGRhdGEgbWVuZ2d1bmFrYW4gbG9vcA0Kc2V0LnNlZWQoMTY0KSAjIFVudHVrIHJlcHJvZHVrdGlmaXRhcw0KZm9yICh0IGluIDE6bl90b3RhbCkgew0KICAjIEhhc2lsa2FuIHdoaXRlIG5vaXNlIGFfdA0KICBhX3QgPC0gcm5vcm0oMSwgbWVhbiA9IDAsIHNkID0gc2RfYSkNCiAgDQogICMgQW1iaWwgbmlsYWkgbGFnLCBqaWthIHQtayA8PSAwLCBhbmdnYXAgeV97dC1rfSA9IDAgKHVtdW0gdW50dWsgaW5pc2lhbGlzYXNpKQ0KICB5X3RfbWludXNfMTIgPC0gaWZlbHNlKHQgLSAxMiA+IDAsIHlfbWFudWFsW3QgLSAxMl0sIDApDQogIHlfdF9taW51c18yNCA8LSBpZmVsc2UodCAtIDI0ID4gMCwgeV9tYW51YWxbdCAtIDI0XSwgMCkNCiAgeV90X21pbnVzXzM2IDwtIGlmZWxzZSh0IC0gMzYgPiAwLCB5X21hbnVhbFt0IC0gMzZdLCAwKQ0KICB5X3RfbWludXNfNDggPC0gaWZlbHNlKHQgLSA0OCA+IDAsIHlfbWFudWFsW3QgLSA0OF0sIDApDQogIA0KICAjIFRlcmFwa2FuIGZvcm11bGENCiAgaWYgKHQgPD0gMTIpIHsgIyBUaWRhayBhZGEgbGFnIG11c2ltYW4geWFuZyBjdWt1cA0KICAgICB5X21hbnVhbFt0XSA8LSBhX3QgDQogIH0gZWxzZSBpZiAodCA8PSAyNCkgeyAjIEhhbnlhIGJpc2EgbWVuZ2hpdHVuZyBzYW1wYWkgbGFnIDEyDQogICAgIHlfbWFudWFsW3RdIDwtIHlfdF9taW51c18xMiArIA0KICAgICAgICAgICAgICAgICAgIGFfdCANCiAgfSBlbHNlIGlmICh0IDw9IDM2KSB7ICMgSGFueWEgYmlzYSBtZW5naGl0dW5nIHNhbXBhaSBsYWcgMjQNCiAgICAgeV9tYW51YWxbdF0gPC0geV90X21pbnVzXzEyICsgDQogICAgICAgICAgICAgICAgICAgc3BoaTEgKiAoeV90X21pbnVzXzEyIC0geV90X21pbnVzXzI0KSArIA0KICAgICAgICAgICAgICAgICAgIGFfdCANCiAgfSBlbHNlIGlmICh0IDw9IDQ4KSB7ICMgSGFueWEgYmlzYSBtZW5naGl0dW5nIHNhbXBhaSBsYWcgMzYNCiAgICB5X21hbnVhbFt0XSA8LSB5X3RfbWludXNfMTIgKyANCiAgICAgICAgICAgICAgICAgICBzcGhpMSAqICh5X3RfbWludXNfMTIgLSB5X3RfbWludXNfMjQpICsgDQogICAgICAgICAgICAgICAgICAgc3BoaTIgKiAoeV90X21pbnVzXzI0IC0geV90X21pbnVzXzM2KSArIA0KICAgICAgICAgICAgICAgICAgIGFfdCANCiAgfSBlbHNlIHsgIyB0ID4gNDgsIHNlbXVhIGxhZyB0ZXJzZWRpYQ0KICAgIHlfbWFudWFsW3RdIDwtIHlfdF9taW51c18xMiArIA0KICAgICAgICAgICAgICAgICAgIHNwaGkxICogKHlfdF9taW51c18xMiAtIHlfdF9taW51c18yNCkgKyANCiAgICAgICAgICAgICAgICAgICBzcGhpMiAqICh5X3RfbWludXNfMjQgLSB5X3RfbWludXNfMzYpICsgDQogICAgICAgICAgICAgICAgICAgc3BoaTMgKiAoeV90X21pbnVzXzM2IC0geV90X21pbnVzXzQ4KSArIA0KICAgICAgICAgICAgICAgICAgIGFfdA0KICB9DQp9DQoNCiMgQnVhbmcgcGVyaW9kZSBidXJuLWluIHVudHVrIG1lbmRhcGF0a2FuIFlfdCBmaW5hbA0KZGF0YV9zYXJpbWFfbWFudWFsX1l0IDwtIHlfbWFudWFsWyhuX2J1cm5faW5fbWFudWFsICsgMSk6bl90b3RhbF0NCg0KIyBNZWxpaGF0IGJlYmVyYXBhIGRhdGEgcGVydGFtYSBkYXJpIFlfdA0KcHJpbnQoaGVhZChkYXRhX3NhcmltYV9tYW51YWxfWXQpKQ0KDQojIE1lbXZpc3VhbGlzYXNpa2FuIGRhdGEgWV90IChvcHNpb25hbCkNCnBsb3QodHMoZGF0YV9zYXJpbWFfbWFudWFsX1l0KSwgbWFpbiA9ICJEYXRhIFNpbXVsYXNpIFl0IFNBUklNQSgwLDAsMCkoMywxLDApXjEyIE1hbnVhbCBMb29wIiwgDQogICAgIHlsYWIgPSAiTmlsYWkgWXQiLCBjb2wgPSAicmVkIikNCmBgYA0KIyMjIFBsb3QgWXQgQUNGICYgUEFDRiBEYXRhIFNpbXVsYWkgQVJJTUEoMCwgMCwgMCkoMywgMSwgMCleMTIgVGFucGEgTGlicmFyeQ0KYGBge3J9DQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgQUNGIFl0DQphY2YoZGF0YV9zYXJpbWFfbWFudWFsLCANCiAgICBsYWcubWF4ID0gNDgsICMgVGFtcGlsa2FuIGhpbmdnYSBsYWcgNDggdW50dWsgbWVsaWhhdCBiZWJlcmFwYSBzaWtsdXMgbXVzaW1hbg0KICAgIG1haW4gPSAiWXQgQUNGIHVudHVrIFNBUklNQSgwLDAsMCkoMywxLDApXjEyIFRhbnBhIExpYnJhcnkiLA0KICAgIHlsYWIgPSAiQUNGIikNCg0KIyBNZW5naGl0dW5nIGRhbiBtZW1wbG90IFBBQ0YgWXQNCnBhY2YoZGF0YV9zYXJpbWFfbWFudWFsLCANCiAgICAgbGFnLm1heCA9IDQ4LCAjIFRhbXBpbGthbiBoaW5nZ2EgbGFnIDQ4DQogICAgIG1haW4gPSAiWXQgUEFDRiB1bnR1ayBTQVJJTUEoMCwwLDApKDMsMSwwKV4xMiBUYW5wYSBMaWJyYXJ5IiwNCiAgICAgeWxhYiA9ICJQQUNGIikNCmBgYA0KIyMjIE1lbmdoaXR1bmcgV3QgQVJJTUEoMCwwLDApKDMsMSwwKV4xMiBUYW5wYSBMaWJyYXJ5DQpgYGB7cn0NCiMgSGl0dW5nIFd0ID0gWXQgLSBZX3t0LTEyfQ0KIyBkYXRhX3NhcmltYV9tYW51YWxfWXQgYWRhbGFoIHNlcmkgWXQgc2V0ZWxhaCBidXJuLWluDQojIFd0IGFrYW4gbWVtaWxpa2kgcGFuamFuZyBuX2Rlc2lyZWQgLSAxMg0KZGF0YV9zYXJpbWFfbWFudWFsX1d0IDwtIGRpZmYoZGF0YV9zYXJpbWFfbWFudWFsX1l0LCBsYWcgPSAxMikNCg0KIyBNZWxpaGF0IGJlYmVyYXBhIGRhdGEgcGVydGFtYSBkYXJpIFd0DQpjYXQoIlxuQmViZXJhcGEgZGF0YSBwZXJ0YW1hIGRhcmkgV3Q6XG4iKQ0KcHJpbnQoaGVhZChkYXRhX3NhcmltYV9tYW51YWxfV3QpKQ0KDQojIE1lbXZpc3VhbGlzYXNpa2FuIGRhdGEgV3QNCnBsb3QodHMoZGF0YV9zYXJpbWFfbWFudWFsX1d0KSwgDQogICAgIG1haW4gPSAiRGF0YSBEaWZlcmVuc2lhc2kgTXVzaW1hbiBXdCA9IFl0IC0gWSh0LTEyKSBUYW5wYSBMaWJyYXJ5IiwgDQogICAgIHlsYWIgPSAiTmlsYWkgV3QiLCBjb2wgPSAicHVycGxlIikNCmBgYA0KDQojIyMgUGxvdCBXdCBBQ0YgJiBQQUNGIERhdGEgU2ltdWxhaSBBUklNQSgwLCAwLCAwKSgzLCAxLCAwKV4xMiBUYW5wYSBMaWJyYXJ5DQpgYGB7cn0NCiMgTWVuZ2hpdHVuZyBkYW4gbWVtcGxvdCBBQ0YgV3QNCmFjZihkYXRhX3NhcmltYV9tYW51YWxfV3QsIA0KICAgIGxhZy5tYXggPSA0OCwgIyBUYW1waWxrYW4gaGluZ2dhIGxhZyA0OCB1bnR1ayBtZWxpaGF0IGJlYmVyYXBhIHNpa2x1cyBtdXNpbWFuDQogICAgbWFpbiA9ICJXdCBBQ0YgdW50dWsgU0FSSU1BKDAsMCwwKSgzLDEsMCleMTIgVGFucGEgTGlicmFyeSIsDQogICAgeWxhYiA9ICJBQ0YiKQ0KDQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgUEFDRiBXdA0KcGFjZihkYXRhX3NhcmltYV9tYW51YWxfV3QsIA0KICAgICBsYWcubWF4ID0gNDgsICMgVGFtcGlsa2FuIGhpbmdnYSBsYWcgNDgNCiAgICAgbWFpbiA9ICJXdCBQQUNGIHVudHVrIFNBUklNQSgwLDAsMCkoMywxLDApXjEyIFRhbnBhIExpYnJhcnkiLA0KICAgICB5bGFiID0gIlBBQ0YiKQ0KYGBgDQpLZXNpbXB1bGFuOg0KDQotIFBsb3QgQUNGIG1lbmdhbGFtaSBkaWVzIGRvd24gcGFkYSBsYWcga2VsaXBhdGFuIDEyDQotIFBsb3QgUEFDRiBtZW5nYWxhbWkgY3V0b2ZmIHBhZGEgbGFnIDM2DQoNClNlY2FyYSB0ZW9yaSBzdWRhaCBiZW5hcg0KDQoNCiMjIE1lbWJ1YXQgRGF0YSBTQVJJTUEoMCwwLDApKDMsMSwwKSBEZW5nYW4gTGlicmFyeQ0KYGBge3J9DQojIFBhbmphbmcgZGF0YSB5YW5nIGluZ2luIGRpaGFzaWxrYW4NCm5fZGVzaXJlZCA8LSAxMDAwDQoNCiMgTWluaW1hbCA0OCB1bnR1ayBtb2RlbCBpbmksIHRldGFwaSBsZWJpaCBiYW55YWsgbGViaWggYmFpaw0Kbl9idXJuX2luX2FyaW1hX3NpbSA8LSBuX2J1cm5faW5fbWFudWFsDQoNCiMgTWVtYnVhdCBkYWZ0YXIgbW9kZWwgdW50dWsgYXJpbWEuc2ltKCkNCm1vZGVsX3NwZWMgPC0gbGlzdCgNCiAgb3JkZXIgPSBjKDAsIDAsIDApLCAjIChwLGQscSkgbm9uLW11c2ltYW4NCiAgc2Vhc29uYWwgPSBsaXN0KA0KICAgIG9yZGVyID0gYygzLCAxLCAwKSwgIyAoUCxELFEpIG11c2ltYW4NCiAgICBwZXJpb2QgPSAxMiwNCiAgICBzYXIgPSBwaGlfc2Vhc29uYWwgIyBLb2VmaXNpZW4gQVIgbXVzaW1hbg0KICApDQopDQoNCnNldC5zZWVkKDEpICMgVW50dWsgcmVwcm9kdWt0aWZpdGFzDQpkYXRhX3NhcmltYV9zaW0gPC0gYXJpbWEuc2ltKG1vZGVsID0gbW9kZWxfc3BlYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuX2Rlc2lyZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnN0YXJ0ID0gbl9idXJuX2luX2FyaW1hX3NpbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSAxNjQpICMgU3RhbmRhciBkZXZpYXNpIGRhcmkgYV90DQoNCiMgTWVsaWhhdCBiZWJlcmFwYSBkYXRhIHBlcnRhbWENCnByaW50KGhlYWQoZGF0YV9zYXJpbWFfc2ltKSkNCg0KIyBNZW12aXN1YWxpc2FzaWthbiBkYXRhIChvcHNpb25hbCkNCnBsb3QoZGF0YV9zYXJpbWFfc2ltLCBtYWluID0gIkRhdGEgU2ltdWxhc2kgWXQgU0FSSU1BKDAsMCwwKSgzLDEsMCleMTIgdmlhIGFyaW1hLnNpbSIsIA0KICAgICB5bGFiID0gIk5pbGFpIiwgY29sID0gImJsdWUiKQ0KYGBgDQojIyMgUGxvdCBZdCBBQ0YgJiBQQUNGIERhdGEgU2ltdWxhaSBBUklNQSgwLCAwLCAwKSgzLCAxLCAwKV4xMiBWaWEgYXJpbWEuc2ltDQpgYGB7cn0NCiMgTWVuZ2hpdHVuZyBkYW4gbWVtcGxvdCBBQ0YgWXQNCmFjZihkYXRhX3NhcmltYV9zaW0sIA0KICAgIGxhZy5tYXggPSA0OCwgIyBUYW1waWxrYW4gaGluZ2dhIGxhZyA0OCB1bnR1ayBtZWxpaGF0IGJlYmVyYXBhIHNpa2x1cyBtdXNpbWFuDQogICAgbWFpbiA9ICJZdCBBQ0YgdW50dWsgU0FSSU1BKDAsMCwwKSgzLDEsMCleMTIgYXJpbWEuc2ltIiwNCiAgICB5bGFiID0gIkFDRiIpDQoNCiMgTWVuZ2hpdHVuZyBkYW4gbWVtcGxvdCBQQUNGIFl0DQpwYWNmKGRhdGFfc2FyaW1hX3NpbSwgDQogICAgIGxhZy5tYXggPSA0OCwgIyBUYW1waWxrYW4gaGluZ2dhIGxhZyA0OA0KICAgICBtYWluID0gIll0IFBBQ0YgdW50dWsgU0FSSU1BKDAsMCwwKSgzLDEsMCleMTIgYXJpbWEuc2ltIiwNCiAgICAgeWxhYiA9ICJQQUNGIikNCmBgYA0KDQojIyMgTWVuZ2hpdHVuZyBXdCBBUklNQSgwLDAsMCkoMywxLDApXjEyIERlbmdhbiBMaWJyYXJ5DQpgYGB7cn0NCiMgSGl0dW5nIFd0ID0gWXQgLSBZX3t0LTEyfQ0KIyBkYXRhX3NhcmltYV9tYW51YWxfWXQgYWRhbGFoIHNlcmkgWXQgc2V0ZWxhaCBidXJuLWluDQojIFd0IGFrYW4gbWVtaWxpa2kgcGFuamFuZyBuX2Rlc2lyZWQgLSAxMg0KZGF0YV9zYXJpbWFfbGlicmFyeV9XdCA8LSBkaWZmKGRhdGFfc2FyaW1hX3NpbSwgbGFnID0gMTIpDQoNCiMgTWVsaWhhdCBiZWJlcmFwYSBkYXRhIHBlcnRhbWEgZGFyaSBXdA0KY2F0KCJcbkJlYmVyYXBhIGRhdGEgcGVydGFtYSBkYXJpIFd0OlxuIikNCnByaW50KGhlYWQoZGF0YV9zYXJpbWFfbGlicmFyeV9XdCkpDQoNCiMgTWVtdmlzdWFsaXNhc2lrYW4gZGF0YSBXdA0KcGxvdCh0cyhkYXRhX3NhcmltYV9saWJyYXJ5X1d0KSwgDQogICAgIG1haW4gPSAiRGF0YSBEaWZlcmVuc2lhc2kgTXVzaW1hbiBXdCA9IFl0IC0gWSh0LTEyKSBWaWEgYXJpbWEuc2ltIiwgDQogICAgIHlsYWIgPSAiTmlsYWkgV3QiLCBjb2wgPSAicHVycGxlIikNCmBgYA0KDQojIyMgUGxvdCBXdCBBQ0YgJiBQQUNGIERhdGEgU2ltdWxhaSBBUklNQSgwLCAwLCAwKSgzLCAxLCAwKV4xMiBEZW5nYW4gTGlicmFyeQ0KYGBge3J9DQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgQUNGIFd0DQphY2YoZGF0YV9zYXJpbWFfbGlicmFyeV9XdCwgDQogICAgbGFnLm1heCA9IDQ4LCAjIFRhbXBpbGthbiBoaW5nZ2EgbGFnIDQ4IHVudHVrIG1lbGloYXQgYmViZXJhcGEgc2lrbHVzIG11c2ltYW4NCiAgICBtYWluID0gIld0IEFDRiB1bnR1ayBTQVJJTUEoMCwwLDApKDMsMSwwKV4xMiBEZW5nYW4gTGlicmFyeSIsDQogICAgeWxhYiA9ICJBQ0YiKQ0KDQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgUEFDRiBXdA0KcGFjZihkYXRhX3NhcmltYV9saWJyYXJ5X1d0LCANCiAgICAgbGFnLm1heCA9IDYwLCAjIFRhbXBpbGthbiBoaW5nZ2EgbGFnIDQ4DQogICAgIG1haW4gPSAiV3QgUEFDRiB1bnR1ayBTQVJJTUEoMCwwLDApKDMsMSwwKV4xMiBEZW5nYW4gTGlicmFyeSIsDQogICAgIHlsYWIgPSAiUEFDRiIpDQpgYGANCg0KS2VzaW1wdWxhbjoNCg0KLSBQbG90IEFDRiBtZW5nYWxhbWkgY3V0IG9mZiBwYWRhIGxhZyAxMg0KLSBQbG90IFBBQ0YgbWVuZ2FsYW1pIGRpZXMgZG93biBwYWRhIGtlbGlwYXRhbiAxMg0KDQpTZWNhcmEgdGVvcmkgYmVsdW0gYmVuYXINCg0KIyBNb2RlbCBUYW5wYSBEaWZmZXJlbmNpbmcNCiQkDQpcUGhpXzMgKEJeezEyfSkgeV90ID0gYV90IFxcDQp5X3QgLSBcUGhpXzEgQl57MTJ9IHlfdCAtIFxQaGlfMiBCXnsyNH0geV90IC0gXFBoaV8zIEJeezM2fSB5X3QgPSBhX3QgXFwNCnlfdCA9IFxQaGlfMSBCXnsxMn0geV90ICsgXFBoaV8yIEJeezI0fSB5X3QgKyBcUGhpXzMgQl57MzZ9ICsgYV90IFxcDQp5X3QgPSBcUGhpXzEgIHlfe3QtMTJ9ICsgXFBoaV8yIHlfe3QtMjR9ICsgXFBoaV8zIHlfe3QtMzZ9ICsgYV90DQokJA0KDQojIyBNZW5lbnR1a2FuIFBhcmFtZXRlcg0KYGBge3J9DQojIFBhcmFtZXRlciBNb2RlbA0KcGhpMV9tIDwtIHNwaGkxDQpwaGkyX20gPC0gc3BoaTINCnBoaTNfbSA8LSBzcGhpMyAjIEtvZWZpc2llbiB5YW5nIHNhbWEgZGVuZ2FuIGFyaW1hLnNpbSBkaSBhdGFzDQpzZF9hX20gPC0gc2RfYSAgICMgU3RhbmRhciBkZXZpYXNpIGRhcmkgYV90IChub2lzZSkNCg0KIyBVbnR1ayBtb2RlbCBzdGFzaW9uZXIgKEQ9MCwgZD0wKSwga2l0YSBiaXNhIG1lbmFtYmFoa2FuIGtvbnN0YW50YSBjDQpjb25zdGFudF9jIDwtIDANCg0KIyBQYW5qYW5nIGRhdGENCm5fZGVzaXJlZF9tYW51YWxfUDNEMCA8LSAxMDAwDQpuX2J1cm5faW5fbWFudWFsX1AzRDAgPC0gMTAwICMgUGVyaW9kZSBidXJuLWluDQpuX3RvdGFsX21hbnVhbF9QM0QwIDwtIG5fZGVzaXJlZF9tYW51YWxfUDNEMCArIG5fYnVybl9pbl9tYW51YWxfUDNEMA0KYGBgDQoNCiMjIFNpbXVsYXNpIE1vZGVsIEFSSU1BKDAsIDAsIDApKDMsIDAsIDApXjEyIFRhbnBhIExpYnJhcnkNCmBgYHtyfQ0KIyBJbmlzaWFsaXNhc2kgdmVrdG9yIHkgdW50dWsgbWVueWltcGFuIHNlbXVhIG5pbGFpICh0ZXJtYXN1ayBidXJuLWluKQ0KeV9tYW51YWxfUDNEMCA8LSBudW1lcmljKG5fdG90YWxfbWFudWFsX1AzRDApDQoNCiMgTWVuZ2hhc2lsa2FuIGRhdGEgbWVuZ2d1bmFrYW4gbG9vcA0Kc2V0LnNlZWQoMTY0KSAjIFVudHVrIHJlcHJvZHVrdGlmaXRhcw0KZm9yICh0IGluIDE6bl90b3RhbF9tYW51YWxfUDNEMCkgew0KICAjIEhhc2lsa2FuIHdoaXRlIG5vaXNlIGFfdA0KICBhX3QgPC0gcm5vcm0oMSwgbWVhbiA9IDAsIHNkID0gc2RfYV9tKQ0KICANCiAgIyBBbWJpbCBuaWxhaSBsYWcsIGppa2EgdC1rIDw9IDAsIGFuZ2dhcCB5X3t0LWt9ID0gMCAodW50dWsgbWVhbiBub2wgcHJvc2VzIGF3YWwpDQogICMgSW5pIGFkYWxhaCBwZW5kZWthdGFuIHNlZGVyaGFuYSB1bnR1ayBpbmlzaWFsaXNhc2k7IHBlcmlvZGUgYnVybi1pbiBtZW1iYW50dS4NCiAgeV90X21pbnVzXzEyIDwtIGlmZWxzZSh0IC0gMTIgPiAwLCB5X21hbnVhbF9QM0QwW3QgLSAxMl0sIDApDQogIHlfdF9taW51c18yNCA8LSBpZmVsc2UodCAtIDI0ID4gMCwgeV9tYW51YWxfUDNEMFt0IC0gMjRdLCAwKQ0KICB5X3RfbWludXNfMzYgPC0gaWZlbHNlKHQgLSAzNiA+IDAsIHlfbWFudWFsX1AzRDBbdCAtIDM2XSwgMCkNCiAgDQogICMgVGVyYXBrYW4gZm9ybXVsYQ0KICAjIEtpdGEgcGVybHUgc2V0aWRha255YSAzNiBvYnNlcnZhc2kgc2ViZWx1bW55YSB1bnR1ayBtZW5nZ3VuYWthbiBmb3JtdWxhIGxlbmdrYXAuDQogICMgTG9naWthIGlmL2Vsc2UgaW5pIG1lbmFuZ2FuaSBpdGVyYXNpIGF3YWwgc2VsYW1hIHBlcmlvZGUgYnVybi1pbi4NCiAgaWYgKHQgPiAzNikgew0KICAgIHlfbWFudWFsX1AzRDBbdF0gPC0gY29uc3RhbnRfYyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgcGhpMV9tICogeV90X21pbnVzXzEyICsgDQogICAgICAgICAgICAgICAgICAgICAgICBwaGkyX20gKiB5X3RfbWludXNfMjQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIHBoaTNfbSAqIHlfdF9taW51c18zNiArIA0KICAgICAgICAgICAgICAgICAgICAgICAgYV90DQogIH0gZWxzZSBpZiAodCA+IDI0KSB7ICMgSGFueWEgYmlzYSBtZW5nZ3VuYWthbiBsYWcgMTIgZGFuIDI0DQogICAgeV9tYW51YWxfUDNEMFt0XSA8LSBjb25zdGFudF9jICsgDQogICAgICAgICAgICAgICAgICAgICAgICBwaGkxX20gKiB5X3RfbWludXNfMTIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIHBoaTJfbSAqIHlfdF9taW51c18yNCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgYV90ICMgcGhpM19tICogeV90X21pbnVzXzM2IHRpZGFrIGFkYQ0KICB9IGVsc2UgaWYgKHQgPiAxMikgeyAjIEhhbnlhIGJpc2EgbWVuZ2d1bmFrYW4gbGFnIDEyDQogICAgeV9tYW51YWxfUDNEMFt0XSA8LSBjb25zdGFudF9jICsgDQogICAgICAgICAgICAgICAgICAgICAgICBwaGkxX20gKiB5X3RfbWludXNfMTIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIGFfdCAjIHBoaTJfbSBkYW4gcGhpM19tIHRpZGFrIGFkYQ0KICB9IGVsc2UgeyAjIFRpZGFrIGFkYSBsYWcgbXVzaW1hbiB5YW5nIGN1a3VwDQogICAgeV9tYW51YWxfUDNEMFt0XSA8LSBjb25zdGFudF9jICsgYV90DQogIH0NCn0NCg0KIyBCdWFuZyBwZXJpb2RlIGJ1cm4taW4NCmRhdGFfc2FyaW1hX21hbnVhbF9QM0QwIDwtIHlfbWFudWFsX1AzRDBbKG5fYnVybl9pbl9tYW51YWxfUDNEMCArIDEpOm5fdG90YWxfbWFudWFsX1AzRDBdDQoNCiMgTWVsaWhhdCBiZWJlcmFwYSBkYXRhIHBlcnRhbWENCnByaW50KGhlYWQoZGF0YV9zYXJpbWFfbWFudWFsX1AzRDApKQ0KDQojIE1lbXZpc3VhbGlzYXNpa2FuIGRhdGEgKG9wc2lvbmFsKQ0KcGxvdCh0cyhkYXRhX3NhcmltYV9tYW51YWxfUDNEMCksIA0KICAgICBtYWluID0gIkRhdGEgU2ltdWxhc2kgU0FSSU1BKDAsMCwwKSgzLDAsMCleMTIgTWFudWFsIExvb3AiLA0KICAgICB5bGFiID0gIk5pbGFpIiwgY29sID0gInB1cnBsZTQiKQ0KYGBgDQoNCiMjIyBQbG90IFl0IEFDRiAmIFBBQ0YgRGF0YSBTaW11bGFpIEFSSU1BKDAsIDAsIDApKDMsIDAsIDApXjEyIFRhbnBhIExpYnJhcnkNCmBgYHtyfQ0KIyBNZW5naGl0dW5nIGRhbiBtZW1wbG90IEFDRg0KYWNmKGRhdGFfc2FyaW1hX21hbnVhbF9QM0QwLCANCiAgICBsYWcubWF4ID0gNDgsICMgVGFtcGlsa2FuIGhpbmdnYSBsYWcgNDggdW50dWsgbWVsaWhhdCBiZWJlcmFwYSBzaWtsdXMgbXVzaW1hbg0KICAgIG1haW4gPSAiWXQgQUNGIHVudHVrIFNBUklNQSgwLDAsMCkoMywwLDApXjEyIE1hbnVhbCIsDQogICAgeWxhYiA9ICJBQ0YiKQ0KDQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgUEFDRg0KcGFjZihkYXRhX3NhcmltYV9tYW51YWxfUDNEMCwgDQogICAgIGxhZy5tYXggPSA0OCwgIyBUYW1waWxrYW4gaGluZ2dhIGxhZyA0OA0KICAgICBtYWluID0gIll0IFBBQ0YgdW50dWsgU0FSSU1BKDAsMCwwKSgzLDAsMCleMTIgTWFudWFsIiwNCiAgICAgeWxhYiA9ICJQQUNGIikNCmBgYA0KDQpLZXNpbXB1bGFuOg0KDQotIFBsb3QgQUNGIG1lbmdhbGFtaSBEaWVzIGRvd24gcGFkYSBsYWcga2VsaXBhdGFuIDEyDQotIFBsb3QgUEFDRiBtZW5nYWxhbWkgY3V0IG9mZiBwYWRhIGxhZyAzNg0KDQpTZWNhcmEgdGVvcmkgc3VkYWggYmVuYXINCg0KIyMgTWVuZW50dWthbiBQYXJhbWV0ZXINCmBgYHtyfQ0KIyBLb2VmaXNpZW4gQVIgTXVzaW1hbiAoUGhpMSwgUGhpMiwgUGhpMykNCnBoaV9zZWFzb25hbF9QM0QwIDwtIHBoaV9zZWFzb25hbA0KDQojIFBhbmphbmcgZGF0YSB5YW5nIGluZ2luIGRpaGFzaWxrYW4gKHNldGVsYWggYnVybi1pbikNCm5fZGVzaXJlZF9QM0QwIDwtIDEwMDANCg0KIyBQZXJpb2RlIGJ1cm4taW4gKHVudHVrIG1lbWJpYXJrYW4gbW9kZWwgc3RhYmlsKQ0KIyBNaW5pbWFsIDM2IHVudHVrIG1vZGVsIGluaSwgdGV0YXBpIGxlYmloIGJhbnlhayBsZWJpaCBiYWlrDQpuX2J1cm5faW5fYXJpbWFfc2ltX1AzRDAgPC0gMTAwDQpgYGANCg0KIyMgU2ltdWxhc2kgTW9kZWwgQVJJTUEoMCwgMCwgMCkoMywgMCwgMCleMTIgRGVuZ2FuIExpYnJhcnkNCmBgYHtyfQ0KIyBNZW1idWF0IGRhZnRhciBtb2RlbCB1bnR1ayBhcmltYS5zaW0oKQ0KbW9kZWxfc3BlY19QM0QwIDwtIGxpc3QoDQogIG9yZGVyID0gYygwLCAwLCAwKSwgIyAocCxkLHEpIG5vbi1tdXNpbWFuDQogIHNlYXNvbmFsID0gbGlzdCgNCiAgICBvcmRlciA9IGMoMywgMCwgMCksICMgKFAsRCxRKSBtdXNpbWFuIC0+IEQ9MCBzZWthcmFuZw0KICAgIHBlcmlvZCA9IDEyLA0KICAgIHNhciA9IHBoaV9zZWFzb25hbF9QM0QwICMgS29lZmlzaWVuIEFSIG11c2ltYW4NCiAgKQ0KKQ0KDQojIE1lbmdoYXNpbGthbiBkYXRhIChzZWNhcmEgZGVmYXVsdCBtZWFuIG5vbCkNCnNldC5zZWVkKDQ1NikgIyBVbnR1ayByZXByb2R1a3RpZml0YXMNCmRhdGFfc2FyaW1hX3NpbV9QM0QwIDwtIGFyaW1hLnNpbShtb2RlbCA9IG1vZGVsX3NwZWNfUDNEMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbl9kZXNpcmVkX1AzRDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zdGFydCA9IG5fYnVybl9pbl9hcmltYV9zaW1fUDNEMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IDEpICMgU3RhbmRhciBkZXZpYXNpIGRhcmkgYV90DQoNCiMgTWVsaWhhdCBiZWJlcmFwYSBkYXRhIHBlcnRhbWENCnByaW50KGhlYWQoZGF0YV9zYXJpbWFfc2ltX1AzRDApKQ0KDQojIE1lbXZpc3VhbGlzYXNpa2FuIGRhdGEgKG9wc2lvbmFsKQ0KcGxvdChkYXRhX3NhcmltYV9zaW1fUDNEMCwgDQogICAgIG1haW4gPSAiRGF0YSBTaW11bGFzaSBTQVJJTUEoMCwwLDApKDMsMCwwKV4xMiB2aWEgYXJpbWEuc2ltIiwNCiAgICAgeWxhYiA9ICJOaWxhaSIsIGNvbCA9ICJncmVlbjQiKQ0KYGBgDQojIyMgUGxvdCBBQ0YgJiBQQUNGIERhdGEgU2ltdWxhaSBBUklNQSgwLCAwLCAwKSgzLCAwLCAwKV4xMiBWaWEgYXJpbWEuc2ltDQpgYGB7cn0NCiMgTWVuZ2hpdHVuZyBkYW4gbWVtcGxvdCBBQ0YNCmFjZihkYXRhX3NhcmltYV9zaW1fUDNEMCwgDQogICAgbGFnLm1heCA9IDQ4LCAjIFRhbXBpbGthbiBoaW5nZ2EgbGFnIDQ4IHVudHVrIG1lbGloYXQgYmViZXJhcGEgc2lrbHVzIG11c2ltYW4NCiAgICBtYWluID0gIkFDRiB1bnR1ayBTQVJJTUEoMCwwLDApKDMsMCwwKV4xMiIsDQogICAgeWxhYiA9ICJBQ0YiKQ0KDQojIE1lbmdoaXR1bmcgZGFuIG1lbXBsb3QgUEFDRg0KcGFjZihkYXRhX3NhcmltYV9zaW1fUDNEMCwgDQogICAgIGxhZy5tYXggPSA0OCwgIyBUYW1waWxrYW4gaGluZ2dhIGxhZyA0OA0KICAgICBtYWluID0gIlBBQ0YgdW50dWsgU0FSSU1BKDAsMCwwKSgzLDAsMCleMTIiLA0KICAgICB5bGFiID0gIlBBQ0YiKQ0KYGBgDQoNCktlc2ltcHVsYW46DQoNCi0gUGxvdCBBQ0YgdGlkYWsgYWRhIGxhZyB5YW5nIHNpZ25pZmlrYW4sIG11bmdraW4gaGFueWEgcGFkYSBsYWcgMjcNCi0gUGxvdCBQQUNGIHlhbmcgbWVtaWxpa2kgbGFnIHlhbmcgc2lnbmlmaWthbiBhZGEgcGFkYSBsYWcgMTIsIGRhbiAyNw0KDQpTZWNhcmEgdGVvcmkgYmVsdW0gYmVuYXI=