Halo aku mau nganalsiis kemiskinan menggunakan analisis ridge, lasso
dan elastic nett Provinsi Sumatera Utara Variabel Y : Persentase
Kemiskinan Variabel X : UHH, HLS, Rata-rata lama sekolah, Pengeluaran
per Kapita, Jumlah Total Angkatan Kerja, TPAK (%), Jumlah Penduduk 2025,
UMK 2025, TPT, KRT Pertanian, APS, PE, Bahan Bakar Masak, Sanitasi
Taklayak, Jenis Lantai taklayak, Keluhan Kesehatan, Laju Penduduk, Rasio
JK Semua Data dari Publikasi dan Tabel Dinamis yang tersedia di web BPS
Sumut
library(readxl)
Data <- read_excel("Downloads/analisis kemiskinan data sumut.xlsx")
# Load library
library(glmnet)
# 1. Siapkan Variabel Dependen (Y) -> Persentase Kemiskinan
y <- Data$`Miskin (%)`
# 2. Siapkan Variabel Independen (X)
# Ambil kolom variabelnya saja (sesuaikan indeks kolomnya)
x <- as.matrix( Data[, c("X1", "X2", "X3", "X3",
"X4", "X5", "X6", "X7",
"X8", "X9", "X10", "X11",
"X12", "X13",
"X14", "X15", "X16")])
#Mencari lamda terbaik
set.seed(123) # Biar hasil konsisten
# alpha = 0 artinya Ridge Regression
cv_ridge <- cv.glmnet(x, y, alpha = 0, standardize = TRUE)
# Ambil lambda paling optimal
best_lambda <- cv_ridge$lambda.min
print(paste("Lambda Optimal Sumut:", best_lambda))
[1] "Lambda Optimal Sumut: 1.37779764687927"
# Plot lambda (Bagus buat ditaruh di Bab 4)
plot(cv_ridge)

Nilai Lambda (λ) 1.37 ini menunjukkan bahwa model Ridge kamu
memberikan penalti yang cukup kuat untuk “meredam” multikolinieritas di
antara 17 variabel yang kamu punya.
#Eksekusi Model Ridge Baru
# Fit model final
model_ridge_final <- glmnet(x, y, alpha = 0, lambda = best_lambda, standardize = TRUE)
# Tampilkan koefisien
coef(model_ridge_final)
18 x 1 sparse Matrix of class "dgCMatrix"
s0
(Intercept) -6.202407e+00
X1 5.570877e-01
X2 -5.941007e-01
X3 -5.078085e-01
X3 -5.082271e-01
X4 -2.142874e-04
X5 6.625567e-07
X6 1.641477e-02
X7 3.837907e-07
X8 -2.492073e-07
X9 -5.122148e-02
X10 -1.151732e-05
X11 1.019367e-01
X12 -1.862237e+00
X13 1.824346e-02
X14 2.112308e-02
X15 5.955808e-02
X16 -4.277213e-02
#Hitung Akurasi (R-Square & MSE)
# Prediksi
y_pred <- predict(model_ridge_final, s = best_lambda, newx = x)
# Hitung R-Squared
sst <- sum((y - mean(y))^2)
sse <- sum((y_pred - y)^2)
rsq <- 1 - (sse / sst)
# Hitung MSE & RMSE
mse <- mean((y - y_pred)^2)
rmse <- sqrt(mse)
print(paste("R-Squared Sumut:", rsq))
[1] "R-Squared Sumut: 0.857382753474833"
print(paste("MSE Sumut:", mse))
[1] "MSE Sumut: 2.47979971386065"
print(paste("RMSE Sumut:", rmse))
[1] "RMSE Sumut: 1.57473798260557"
R-Squared 85,7%: “Model yang Sangat Kuat” RMSE 1.57: “Akurasi
Prediksi”
Nilai RMSE 1.57 artinya rata-rata kesalahan prediksi model kamu
adalah sekitar 1,57 persen Kekuatan Ridge: Ridge sukses menangani
variabel-variabel yang tadi “berantem” (multikol) dan mendudukkan mereka
di porsi yang tepat.
# Plot koefisien Ridge
# Kita buat dulu objek fit yang berisi seluruh jalur lambda
fit_ridge <- glmnet(x, y, alpha = 0, standardize = TRUE)
# Sekarang baru di-plot
plot(fit_ridge, xvar = "lambda", label = TRUE)

- Arti Angka “17” di Atas
Angka 17 yang berjejer di bagian atas itu menunjukkan jumlah variabel
independen. Di Ridge Regression, angkanya tetap 17 dari ujung kiri
sampai ujung kanan. Ini membuktikan bahwa Ridge tidak membuang satu pun
variabel, beda sama LASSO yang nanti angkanya bakal berkurang (misal
jadi 10, 5, dst).
- Sumbu X: −log(λ)
Sisi Kanan (Angka Positif): Ini adalah kondisi saat Lambda sangat
kecil (penaltinya rendah). Di sini koefisien variabel kamu terlihat
“asli” dan bebas berekspresi. Kamu bisa lihat ada garis hitam (nomor 13)
yang melesat tajam ke bawah.
Sisi Kiri (Angka Negatif): Ini adalah saat Lambda semakin besar
(penalti diperketat). Perhatikan bagaimana semua garis warna-warni itu
“dipaksa” mengumpul menuju angka 0.
- Siapa Garis yang Paling “Nendang”?
Lihat garis yang paling jauh dari garis tengah (0):
Garis Nomor 13 (Hitam ke bawah): Wah, ini adalah variabel paling
dominan di Sumut! Berdasarkan data kamu, ini kemungkinan besar adalah
Sanitasi/Kualitas Hidup. Dia punya pengaruh negatif yang sangat kuat
terhadap kemiskinan.
Garis Nomor 1 (Hitam ke atas): Ini variabel dominan kedua yang
pengaruhnya positif (meningkatkan kemiskinan).
Garis Nomor 2, 3, 4: Ini adalah pasukan pendukung yang juga punya
pengaruh nyata.
# Gunakan lambda optimal yang tadi (1.377)
y_pred_sumut <- predict(model_ridge_final, s = 1.37779764687927, newx = x)
# Membuat dataframe untuk plot
plot_data <- data.frame(Aktual = y, Prediksi = as.vector(y_pred_sumut))
# Plot sederhana
plot(plot_data$Aktual, plot_data$Prediksi,
main = "Kesesuaian Data Aktual vs Prediksi Ridge (Sumut)",
xlab = "Data Kemiskinan Aktual (%)",
ylab = "Hasil Prediksi Ridge (%)",
pch = 19, col = "darkblue")
abline(0, 1, col = "red", lwd = 2) # Garis ideal

Garis Merah adalah “Garis Kejujuran” Garis merah itu adalah garis
y=x. Artinya, kalau titik biru pas kena garis merah, prediksi Ridge kamu
100% akurat sama dengan data BPS aslinya. Karena titik-titik kamu
ngumpul rapat di situ, berarti model kamu Sakti Mandraguna buat
memetakan kemiskinan Sumut.
Analisis Titik yang “Melenceng” Lihat ada dua atau tiga titik di
pojok kanan atas yang agak menjauh dari garis merah (prediksinya lebih
rendah dari aslinya)?
Itu kemungkinan besar adalah Kabupaten Nias, Nias Barat, atau Nias
Utara (yang kemiskinannya di atas 20%). Analisisnya: Kamu bisa bilang,
meskipun model Ridge sudah bagus banget, tapi untuk wilayah kepulauan
ekstrem seperti Nias, faktor kemiskinannya mungkin dipengaruhi variabel
lain yang belum masuk model (misal: biaya logistik laut atau
aksesibilitas geografis yang sangat sulit).
- “The Power of Ridge” Di bagian tengah (kemiskinan 5-10%),
titik-titiknya rapi banget. Ini membuktikan bahwa untuk mayoritas
kabupaten/kota di Sumut daratan, variabel yang kamu pakai (Pendidikan,
Sanitasi, Morbiditas) sudah sangat cukup untuk menjelaskan
kemiskinan.
##LASSO (Least Absolute Shrinkage and Selection Operator).##
set.seed(123)
# Cross-Validation untuk LASSO (alpha = 1)
cv_lasso_sumut <- cv.glmnet(x, y, alpha = 1, standardize = TRUE)
# Ambil lambda terbaik
best_lambda_lasso <- cv_lasso_sumut$lambda.min
print(paste("Lambda Optimal LASSO Sumut:", best_lambda_lasso))
[1] "Lambda Optimal LASSO Sumut: 0.109188107254409"
# Plot Cross-Validation LASSO
plot(cv_lasso_sumut)

Nilainya cukup kecil, yang artinya LASSO tidak akan terlalu brutal
menghapus variabel, tapi tetap akan melakukan filtrasi yang
signifikan.
- Fit Model LASSO & Seleksi Variabel
# Fit model final LASSO
model_lasso_sumut <- glmnet(x, y, alpha = 1, lambda = best_lambda_lasso, standardize = TRUE)
# Lihat variabel yang TIDAK nol
coef(model_lasso_sumut)
18 x 1 sparse Matrix of class "dgCMatrix"
s0
(Intercept) -3.126770e+01
X1 8.838726e-01
X2 .
X3 -1.352752e+00
X3 -1.137099e-14
X4 -2.269811e-04
X5 1.183461e-06
X6 2.757770e-02
X7 .
X8 .
X9 .
X10 -1.136743e-05
X11 .
X12 -2.442108e+00
X13 .
X14 2.785450e-02
X15 9.326466e-02
X16 -6.017968e-02
- Variabel yang “Gugur” (Jadi Titik .)
Variabel X2, X7, X8, X9, X11, dan X13 resmi dieliminasi.
Artinya: LASSO merasa variabel-variabel ini (mungkin TPT, UMK, atau
beberapa indikator rumah tinggal) sudah terwakili oleh variabel lain
yang lebih kuat. Ini bagus banget, San! Skripsi kamu jadi nggak
“obesitas” variabel.
- Para “Juara Bertahan” (The Key Drivers)
X12 (-2.442): Lagi-lagi variabel Sanitasi/Fasilitas Rumah ini jadi
pemenang mutlak. Koefisiennya makin kuat dibanding Ridge tadi. Ini
variabel paling krusial buat nurunin kemiskinan di Sumut menurut model
LASSO.
X3 (-1.352): Pendidikan (RLS/HLS) terbukti sangat tangguh. LASSO
mempertahankan ini dengan koefisien negatif yang besar. Artinya,
investasi di pendidikan itu “harga mati” buat Sumut.
X1 (0.883): Dimensi Kesehatan (Morbiditas/Angka Keluhan) tetap
bertahan sebagai faktor yang meningkatkan kemiskinan.
- Fenomena X3 Dua Kali
Nah, di sini kelihatan jelas:
X3 yang pertama punya koefisien -1.35.
X3 yang kedua dapet koefisien -1.13e-14 (alias hampir NOL). Ini
membuktikan kalau ada duplikasi data atau variabel yang sangat mirip di
kolom X3 kamu. LASSO secara cerdas “mematikan” salah satunya agar tidak
terjadi gangguan multikolinieritas.
#Hitung Akurasi LASSO (Bandingkan dengan Ridge)
# Prediksi
y_pred_lasso <- predict(model_lasso_sumut, s = best_lambda_lasso, newx = x)
# R-Squared LASSO
sst <- sum((y - mean(y))^2)
sse_lasso <- sum((y_pred_lasso - y)^2)
rsq_lasso <- 1 - (sse_lasso / sst)
# RMSE LASSO
rmse_lasso <- sqrt(mean((y - y_pred_lasso)^2))
print(paste("R-Squared LASSO:", rsq_lasso))
[1] "R-Squared LASSO: 0.886441059368236"
print(paste("RMSE LASSO:", rmse_lasso))
[1] "RMSE LASSO: 1.40518318854559"
R-Squared LASSO (88,6%) ternyata LEBIH TINGGI daripada Ridge (85,7%).
Padahal LASSO sudah membuang beberapa variabel, tapi akurasinya justru
makin tajam. Ini namanya model yang lean, mean, and powerful.
Kenapa LASSO Menang dari Ridge? Biasanya Ridge lebih unggul kalau
semua variabel punya pengaruh kecil yang merata. Tapi di data Sumut
kamu, LASSO menang karena: Efek Pembersihan: Dengan membuang variabel
“sampah” atau yang duplikat (seperti X3 kedua yang hampir nol), LASSO
menghilangkan gangguan (noise) dalam model. Fokus pada Core Drivers:
LASSO berhasil menemukan “sinyal” yang paling kuat dari variabel
Sanitasi (X12) dan Pendidikan (X3).
Akurasi Luar Biasa (RMSE 1.40) Nilai RMSE kamu turun dari 1.57
(Ridge) ke 1.40 (LASSO). Artinya, rata-rata melesetnya prediksi kamu
cuma 1,4 persen poin. Untuk data kemiskinan yang variasinya lebar banget
(Nias vs Deli Serdang), ini akurasi yang “sangat ngeri”
bagusnya.
#Plot Perjalanan Seleksi (Coefficient Path)
fit_lasso <- glmnet(x, y, alpha = 1, standardize = TRUE)
plot(fit_lasso, xvar = "lambda", label = TRUE)

Proses Seleksi Otomatis (Garis yang “Mati”) Perhatikan sisi kiri
grafik (saat −log(λ) mendekati 0 atau angka negatif). Banyak garis yang
tadinya warna-warni tiba-tiba menghilang dan menyatu ke garis nol. Itu
adalah variabel-variabel “lemah” yang dipangkas oleh LASSO. atau bisa
bilang: “Grafik ini membuktikan bahwa LASSO berhasil menyederhanakan
model dari 17 prediktor menjadi hanya sekitar 11 prediktor utama tanpa
kehilangan akurasi.”
Tiga Naga Utama (Garis yang Bertahan Paling Lama)
Lihat tiga garis yang paling lebar jaraknya dari nol: Garis Nomor 13
(Hitam paling bawah): Ini variabel paling “sakti” (Sanitasi). Lihat
betapa dia bertahan paling ujung, nggak mau menyerah ke angka nol.
Artinya, sanitasi adalah akar masalah kemiskinan paling nyata di Sumut.
Garis Nomor 3 (Hijau/Biru muda di bawah): Ini Pendidikan (RLS). Dia juga
sangat dominan dan konsisten. Garis Nomor 1 (Hitam paling atas): Ini
faktor kesehatan/morbiditas yang terus memperparah kemiskinan.
- “The Sweet Spot”
Lambda optimal ada di sekitar angka 6 (pada skala atas), di mana
model menyisakan sekitar 11 variabel. Di situlah R-Squared kamu mencapai
88,6%.
##Elastic Nett 1. Mencari Alpha dan Lambda Terbaik Di Elastic Net,
nggak cuma cari Lambda (λ), tapi juga cari Alpha (α). Alpha = 0 (Ridge)
Alpha = 1 (LASSO) 0 < Alpha < 1 (Elastic Net) -> Biasanya kita
pakai 0.5 sebagai titik tengah.
set.seed(123)
# Kita coba Alpha = 0.5 (Kombinasi 50-50 Ridge & LASSO)
cv_en_sumut <- cv.glmnet(x, y, alpha = 0.5, standardize = TRUE)
# Ambil Best Lambda
best_lambda_en <- cv_en_sumut$lambda.min
print(paste("Lambda Optimal Elastic Net:", best_lambda_en))
[1] "Lambda Optimal Elastic Net: 0.198976273481921"
# Plot Cross-Validation
plot(cv_en_sumut)

Nilainya 0.198, sedikit lebih tinggi dari lambda LASSO tadi (0.109).
Ini menunjukkan Elastic Net memberikan penalti yang sedikit lebih
“tegas” untuk menyeimbangkan antara seleksi variabel (seperti LASSO) dan
stabilitas koefisien (seperti Ridge).
Fit Model Final & Cek Koefisien
# Fit model final
model_en_sumut <- glmnet(x, y, alpha = 0.5, lambda = best_lambda_en, standardize = TRUE)
# Tampilkan koefisien
coef(model_en_sumut)
18 x 1 sparse Matrix of class "dgCMatrix"
s0
(Intercept) -2.846282e+01
X1 8.422472e-01
X2 .
X3 -6.539484e-01
X3 -6.920269e-01
X4 -2.347585e-04
X5 1.167630e-06
X6 2.864076e-02
X7 .
X8 .
X9 .
X10 -1.151518e-05
X11 .
X12 -2.390109e+00
X13 .
X14 2.690348e-02
X15 8.998041e-02
X16 -5.841641e-02
Ada fenomena menarik yang terjadi di variabel X3 kamu:
- Pembuktian Grouping Effect (X3)
Ingat kan di LASSO tadi salah satu X3 “dimatikan” (jadi hampir nol)?
Di Elastic Net, keduanya “dihidupkan” kembali dengan nilai yang hampir
mirip (-0.65 dan -0.69). Interpretasinya: Elastic Net mendeteksi bahwa
kedua variabel X3 ini (mungkin RLS dan HLS atau data duplikat) memiliki
korelasi yang sangat kuat. Alih-alih memilih salah satu secara paksa
seperti LASSO, Elastic Net membagi koefisiennya secara adil. Ini membuat
model kamu jauh lebih stabil.
Konsistensi Sang Juara (X12) Lagi dan lagi, X12 tetap menjadi
pemegang koefisien negatif terbesar (-2.39). Ini membuktikan bahwa apa
pun metodenya—Ridge, LASSO, atau Elastic Net—Sanitasi adalah faktor
paling dominan dalam menjelaskan kemiskinan di Sumatera Utara. Hasil
penelitian kamu sangat robust (tangguh)!
Seleksi Variabel yang Bijak Meskipun tidak segalak LASSO, Elastic
Net tetap berhasil membuang variabel yang tidak perlu (X2, X7, X8, X9,
X11, X13 tetap jadi titik). Model tetap ringkas tapi tetap menjaga
informasi dari variabel yang saling berkaitan.
Hitung Akurasi (The Moment of Truth)
# Prediksi
y_pred_en <- predict(model_en_sumut, s = best_lambda_en, newx = x)
# R-Squared Elastic Net
sst <- sum((y - mean(y))^2)
sse_en <- sum((y_pred_en - y)^2)
rsq_en <- 1 - (sse_en / sst)
# RMSE Elastic Net
rmse_en <- sqrt(mean((y - y_pred_en)^2))
print(paste("R-Squared Elastic Net:", rsq_en))
[1] "R-Squared Elastic Net: 0.884656277578749"
print(paste("RMSE Elastic Net:", rmse_en))
[1] "RMSE Elastic Net: 1.41618262120324"
Wah, hasilnya tipis banget ya! R-Squared Elastic Net kamu (88,46%)
hampir setara dengan LASSO (88,64%). Meskipun secara angka LASSO unggul
sedikit sekali di digit kedua belakang koma, Elastic Net memberikan
stabilitas model yang lebih baik untuk data Sumut.
Plot Koefisien Path Elastic Net
fit_en <- glmnet(x, y, alpha = 0.5, standardize = TRUE)
plot(fit_en, xvar = "lambda", label = TRUE)

- Karakteristik “Grouping Effect”
Coba kamu perhatikan garis nomor 3 (hijau/biru muda di bawah). Di
grafik ini, garisnya terlihat “berhimpitan” atau berjalan barengan.
Inilah Grouping Effect. Di LASSO tadi, salah satunya dipaksa mati, tapi
di Elastic Net, karena mereka dianggap satu kelompok (misal variabel
pendidikan), mereka diperbolehkan masuk bareng dengan koefisien yang
saling menyesuaikan. Ini bikin model kamu lebih stabil dan
interpretasinya lebih adil secara ekonomi.
Angka di Atas (0 → 17) Lihat pergerakan angka di atas plot: 0 → 9
→ 13 → 17. Ini menunjukkan bahwa Elastic Net tetap melakukan seleksi
variabel (seperti LASSO), tapi lebih lambat dan hati-hati. Saat −log(λ)
makin ke kanan, variabel mulai masuk satu per satu sampai lengkap 17.
Namun, saat penalti diperketat (makin ke kiri), dia menyisakan
variabel-variabel yang benar-benar solid.
Tiga Penguasa Sumatera Utara Sama seperti dua model sebelumnya,
ada tiga garis yang paling “berani” menjauh dari nol: Garis 13 (Hitam
Bawah): Tetap konsisten sebagai variabel paling dominan (Sanitasi).
Pengaruhnya terhadap penurunan kemiskinan sangat masif. Garis 1 (Hitam
Atas): Variabel kesehatan/morbiditas yang jadi faktor pendorong
kemiskinan. Garis 3: Dimensi pendidikan yang stabil mendukung penurunan
kemiskinan.
#PEMBAHASAN# Perbandingan Interpretasi Visual : Ridge: Menunjukkan
bahwa semua variabel punya peran, meski kecil. LASSO: Menunjukkan
efisiensi model dengan membuang variabel yang redundan. Elastic Net :
Menunjukkan stabilitas model dengan tetap menjaga variabel yang
berkorelasi (grouping) tanpa mengorbankan akurasi.
Syntax Gabungan
# 1. Ambil koefisien dari ketiga model (Pastikan nama modelnya sesuai)
coef_ridge <- as.matrix(coef(model_ridge_final, s = 1.37779764687927))
coef_lasso <- as.matrix(coef(model_lasso_sumut, s = 0.109188107254409))
coef_en <- as.matrix(coef(model_en_sumut, s = 0.198976273481921))
# 2. Gabungkan menjadi satu tabel
tabel_perbandingan <- data.frame(
Variabel = rownames(coef_ridge),
Ridge = as.vector(coef_ridge),
LASSO = as.vector(coef_lasso),
Elastic_Net = as.vector(coef_en)
)
# 3. Bulatkan angka biar cantik (4 angka di belakang koma)
tabel_perbandingan[, 2:4] <- round(tabel_perbandingan[, 2:4], 4)
# 4. Tampilkan di Konsol
print(tabel_perbandingan)
Variabel Ridge LASSO Elastic_Net
1 (Intercept) -6.2024 -31.2677 -28.4628
2 X1 0.5571 0.8839 0.8422
3 X2 -0.5941 0.0000 0.0000
4 X3 -0.5078 -1.3528 -0.6539
5 X3 -0.5082 0.0000 -0.6920
6 X4 -0.0002 -0.0002 -0.0002
7 X5 0.0000 0.0000 0.0000
8 X6 0.0164 0.0276 0.0286
9 X7 0.0000 0.0000 0.0000
10 X8 0.0000 0.0000 0.0000
11 X9 -0.0512 0.0000 0.0000
12 X10 0.0000 0.0000 0.0000
13 X11 0.1019 0.0000 0.0000
14 X12 -1.8622 -2.4421 -2.3901
15 X13 0.0182 0.0000 0.0000
16 X14 0.0211 0.0279 0.0269
17 X15 0.0596 0.0933 0.0900
18 X16 -0.0428 -0.0602 -0.0584
# 5. Ekspor ke CSV (Buka pakai Excel nanti)
write.csv(tabel_perbandingan, "Perbandingan_Koefisien_Sumut.csv", row.names = FALSE)
Syntax Tabel Performa Model (R-Square & RMSE)
# Buat tabel performa
tabel_performa <- data.frame(
Metode = c("Ridge", "LASSO", "Elastic Net"),
Alpha = c(0, 1, 0.5),
R_Squared = c(0.8574, 0.8864, 0.8847),
RMSE = c(1.5747, 1.4052, 1.4162)
)
print(tabel_performa)
Metode Alpha R_Squared RMSE
1 Ridge 0.0 0.8574 1.5747
2 LASSO 1.0 0.8864 1.4052
3 Elastic Net 0.5 0.8847 1.4162
# Ekspor
write.csv(tabel_performa, "Performa_Model_Sumut.csv", row.names = FALSE)
Konsistensi Variabel: Sebutkan bahwa variabel X12 (Sanitasi) dan X3
(Pendidikan) secara konsisten menjadi prediktor utama di ketiga metode
dengan koefisien negatif yang kuat. Ini menunjukkan hasil yang Robust
(Sangat Kuat).
Efisiensi LASSO: LASSO berhasil memberikan akurasi tertinggi (R 2
=88,6%) meskipun telah mereduksi jumlah variabel. Ini membuktikan bahwa
tidak semua indikator kemiskinan memiliki pengaruh unik yang signifikan
secara statistik di Sumut.
Stabilitas Elastic Net: Elastic Net memberikan hasil yang hampir sama
dengan LASSO namun lebih stabil dalam menangani variabel yang saling
berkorelasi (seperti dua variabel X3 kamu).
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpIYWxvIGFrdSBtYXUgbmdhbmFsc2lpcyBrZW1pc2tpbmFuIG1lbmdndW5ha2FuIGFuYWxpc2lzIHJpZGdlLCBsYXNzbyBkYW4gZWxhc3RpYyBuZXR0IFByb3ZpbnNpIFN1bWF0ZXJhIFV0YXJhIApWYXJpYWJlbCBZIDogUGVyc2VudGFzZSBLZW1pc2tpbmFuClZhcmlhYmVsIFggOiBVSEgsIEhMUywgUmF0YS1yYXRhIGxhbWEgc2Vrb2xhaCwgUGVuZ2VsdWFyYW4gcGVyIEthcGl0YSwgSnVtbGFoIFRvdGFsIEFuZ2thdGFuIEtlcmphLCBUUEFLICglKSwgSnVtbGFoIFBlbmR1ZHVrIDIwMjUsIFVNSyAyMDI1LCBUUFQsIEtSVCBQZXJ0YW5pYW4sIEFQUywgUEUsIEJhaGFuIEJha2FyIE1hc2FrLCBTYW5pdGFzaSBUYWtsYXlhaywgSmVuaXMgTGFudGFpIHRha2xheWFrLCBLZWx1aGFuIEtlc2VoYXRhbiwgTGFqdSBQZW5kdWR1aywgUmFzaW8gSksKU2VtdWEgRGF0YSBkYXJpIFB1Ymxpa2FzaSBkYW4gVGFiZWwgRGluYW1pcyB5YW5nIHRlcnNlZGlhIGRpIHdlYiBCUFMgU3VtdXQgCgoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpEYXRhIDwtIHJlYWRfZXhjZWwoIkRvd25sb2Fkcy9hbmFsaXNpcyBrZW1pc2tpbmFuIGRhdGEgc3VtdXQueGxzeCIpCgoKCiMgTG9hZCBsaWJyYXJ5CmxpYnJhcnkoZ2xtbmV0KQoKIyAxLiBTaWFwa2FuIFZhcmlhYmVsIERlcGVuZGVuIChZKSAtPiBQZXJzZW50YXNlIEtlbWlza2luYW4KeSA8LSBEYXRhJGBNaXNraW4gKCUpYAoKIyAyLiBTaWFwa2FuIFZhcmlhYmVsIEluZGVwZW5kZW4gKFgpIAojIEFtYmlsIGtvbG9tIHZhcmlhYmVsbnlhIHNhamEgKHNlc3VhaWthbiBpbmRla3Mga29sb21ueWEpCnggPC0gYXMubWF0cml4KCBEYXRhWywgYygiWDEiLCAiWDIiLCAiWDMiLCAiWDMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDQiLCAiWDUiLCAiWDYiLCAiWDciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWDgiLCAiWDkiLCAiWDEwIiwgIlgxMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYMTIiLCAiWDEzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgxNCIsICJYMTUiLCAiWDE2IildKQpgYGAKYGBge1J9CiNNZW5jYXJpIGxhbWRhIHRlcmJhaWsKc2V0LnNlZWQoMTIzKSAjIEJpYXIgaGFzaWwga29uc2lzdGVuCgojIGFscGhhID0gMCBhcnRpbnlhIFJpZGdlIFJlZ3Jlc3Npb24KY3ZfcmlkZ2UgPC0gY3YuZ2xtbmV0KHgsIHksIGFscGhhID0gMCwgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBBbWJpbCBsYW1iZGEgcGFsaW5nIG9wdGltYWwKYmVzdF9sYW1iZGEgPC0gY3ZfcmlkZ2UkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgU3VtdXQ6IiwgYmVzdF9sYW1iZGEpKQoKIyBQbG90IGxhbWJkYSAoQmFndXMgYnVhdCBkaXRhcnVoIGRpIEJhYiA0KQpwbG90KGN2X3JpZGdlKQoKYGBgCk5pbGFpIExhbWJkYSAozrspIDEuMzcgaW5pIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIFJpZGdlIGthbXUgbWVtYmVyaWthbiBwZW5hbHRpIHlhbmcgY3VrdXAga3VhdCB1bnR1ayAibWVyZWRhbSIgbXVsdGlrb2xpbmllcml0YXMgZGkgYW50YXJhIDE3IHZhcmlhYmVsIHlhbmcga2FtdSBwdW55YS4KCmBgYHtyfQojRWtzZWt1c2kgTW9kZWwgUmlkZ2UgQmFydSAKIyBGaXQgbW9kZWwgZmluYWwKbW9kZWxfcmlkZ2VfZmluYWwgPC0gZ2xtbmV0KHgsIHksIGFscGhhID0gMCwgbGFtYmRhID0gYmVzdF9sYW1iZGEsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgVGFtcGlsa2FuIGtvZWZpc2llbgpjb2VmKG1vZGVsX3JpZGdlX2ZpbmFsKQpgYGAKYGBge3J9CiNIaXR1bmcgQWt1cmFzaSAoUi1TcXVhcmUgJiBNU0UpCiMgUHJlZGlrc2kKeV9wcmVkIDwtIHByZWRpY3QobW9kZWxfcmlkZ2VfZmluYWwsIHMgPSBiZXN0X2xhbWJkYSwgbmV3eCA9IHgpCgojIEhpdHVuZyBSLVNxdWFyZWQKc3N0IDwtIHN1bSgoeSAtIG1lYW4oeSkpXjIpCnNzZSA8LSBzdW0oKHlfcHJlZCAtIHkpXjIpCnJzcSA8LSAxIC0gKHNzZSAvIHNzdCkKCiMgSGl0dW5nIE1TRSAmIFJNU0UKbXNlIDwtIG1lYW4oKHkgLSB5X3ByZWQpXjIpCnJtc2UgPC0gc3FydChtc2UpCgpwcmludChwYXN0ZSgiUi1TcXVhcmVkIFN1bXV0OiIsIHJzcSkpCnByaW50KHBhc3RlKCJNU0UgU3VtdXQ6IiwgbXNlKSkKcHJpbnQocGFzdGUoIlJNU0UgU3VtdXQ6Iiwgcm1zZSkpCmBgYApSLVNxdWFyZWQgODUsNyU6ICJNb2RlbCB5YW5nIFNhbmdhdCBLdWF0IgpSTVNFIDEuNTc6ICJBa3VyYXNpIFByZWRpa3NpIgoKTmlsYWkgUk1TRSAxLjU3IGFydGlueWEgcmF0YS1yYXRhIGtlc2FsYWhhbiBwcmVkaWtzaSBtb2RlbCBrYW11IGFkYWxhaCBzZWtpdGFyIDEsNTcgcGVyc2VuCktla3VhdGFuIFJpZGdlOiBSaWRnZSBzdWtzZXMgbWVuYW5nYW5pIHZhcmlhYmVsLXZhcmlhYmVsIHlhbmcgdGFkaSAiYmVyYW50ZW0iIChtdWx0aWtvbCkgZGFuIG1lbmR1ZHVra2FuIG1lcmVrYSBkaSBwb3JzaSB5YW5nIHRlcGF0LgoKYGBge3J9CiMgUGxvdCBrb2VmaXNpZW4gUmlkZ2UKIyBLaXRhIGJ1YXQgZHVsdSBvYmplayBmaXQgeWFuZyBiZXJpc2kgc2VsdXJ1aCBqYWx1ciBsYW1iZGEKZml0X3JpZGdlIDwtIGdsbW5ldCh4LCB5LCBhbHBoYSA9IDAsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgU2VrYXJhbmcgYmFydSBkaS1wbG90CnBsb3QoZml0X3JpZGdlLCB4dmFyID0gImxhbWJkYSIsIGxhYmVsID0gVFJVRSkKYGBgCjEuIEFydGkgQW5na2EgIjE3IiBkaSBBdGFzCgpBbmdrYSAxNyB5YW5nIGJlcmplamVyIGRpIGJhZ2lhbiBhdGFzIGl0dSBtZW51bmp1a2thbiBqdW1sYWggdmFyaWFiZWwgaW5kZXBlbmRlbi4gRGkgUmlkZ2UgUmVncmVzc2lvbiwgYW5na2FueWEgdGV0YXAgMTcgZGFyaSB1anVuZyBraXJpIHNhbXBhaSB1anVuZyBrYW5hbi4gSW5pIG1lbWJ1a3Rpa2FuIGJhaHdhIFJpZGdlIHRpZGFrIG1lbWJ1YW5nIHNhdHUgcHVuIHZhcmlhYmVsLCBiZWRhIHNhbWEgTEFTU08geWFuZyBuYW50aSBhbmdrYW55YSBiYWthbCBiZXJrdXJhbmcgKG1pc2FsIGphZGkgMTAsIDUsIGRzdCkuCgoyLiBTdW1idSBYOiDiiJJsb2cozrspCgpTaXNpIEthbmFuIChBbmdrYSBQb3NpdGlmKTogSW5pIGFkYWxhaCBrb25kaXNpIHNhYXQgTGFtYmRhIHNhbmdhdCBrZWNpbCAocGVuYWx0aW55YSByZW5kYWgpLiBEaSBzaW5pIGtvZWZpc2llbiB2YXJpYWJlbCBrYW11IHRlcmxpaGF0ICJhc2xpIiBkYW4gYmViYXMgYmVyZWtzcHJlc2kuIEthbXUgYmlzYSBsaWhhdCBhZGEgZ2FyaXMgaGl0YW0gKG5vbW9yIDEzKSB5YW5nIG1lbGVzYXQgdGFqYW0ga2UgYmF3YWguCgpTaXNpIEtpcmkgKEFuZ2thIE5lZ2F0aWYpOiBJbmkgYWRhbGFoIHNhYXQgTGFtYmRhIHNlbWFraW4gYmVzYXIgKHBlbmFsdGkgZGlwZXJrZXRhdCkuIFBlcmhhdGlrYW4gYmFnYWltYW5hIHNlbXVhIGdhcmlzIHdhcm5hLXdhcm5pIGl0dSAiZGlwYWtzYSIgbWVuZ3VtcHVsIG1lbnVqdSBhbmdrYSAwLgoKMy4gU2lhcGEgR2FyaXMgeWFuZyBQYWxpbmcgIk5lbmRhbmciPwoKTGloYXQgZ2FyaXMgeWFuZyBwYWxpbmcgamF1aCBkYXJpIGdhcmlzIHRlbmdhaCAoMCk6CgpHYXJpcyBOb21vciAxMyAoSGl0YW0ga2UgYmF3YWgpOiBXYWgsIGluaSBhZGFsYWggdmFyaWFiZWwgcGFsaW5nIGRvbWluYW4gZGkgU3VtdXQhIEJlcmRhc2Fya2FuIGRhdGEga2FtdSwgaW5pIGtlbXVuZ2tpbmFuIGJlc2FyIGFkYWxhaCBTYW5pdGFzaS9LdWFsaXRhcyBIaWR1cC4gRGlhIHB1bnlhIHBlbmdhcnVoIG5lZ2F0aWYgeWFuZyBzYW5nYXQga3VhdCB0ZXJoYWRhcCBrZW1pc2tpbmFuLgoKR2FyaXMgTm9tb3IgMSAoSGl0YW0ga2UgYXRhcyk6IEluaSB2YXJpYWJlbCBkb21pbmFuIGtlZHVhIHlhbmcgcGVuZ2FydWhueWEgcG9zaXRpZiAobWVuaW5na2F0a2FuIGtlbWlza2luYW4pLgoKR2FyaXMgTm9tb3IgMiwgMywgNDogSW5pIGFkYWxhaCBwYXN1a2FuIHBlbmR1a3VuZyB5YW5nIGp1Z2EgcHVueWEgcGVuZ2FydWggbnlhdGEuCgoKYGBge3J9CiMgR3VuYWthbiBsYW1iZGEgb3B0aW1hbCB5YW5nIHRhZGkgKDEuMzc3KQp5X3ByZWRfc3VtdXQgPC0gcHJlZGljdChtb2RlbF9yaWRnZV9maW5hbCwgcyA9IDEuMzc3Nzk3NjQ2ODc5MjcsIG5ld3ggPSB4KQojIE1lbWJ1YXQgZGF0YWZyYW1lIHVudHVrIHBsb3QKcGxvdF9kYXRhIDwtIGRhdGEuZnJhbWUoQWt0dWFsID0geSwgUHJlZGlrc2kgPSBhcy52ZWN0b3IoeV9wcmVkX3N1bXV0KSkKCiMgUGxvdCBzZWRlcmhhbmEKcGxvdChwbG90X2RhdGEkQWt0dWFsLCBwbG90X2RhdGEkUHJlZGlrc2ksCiAgICAgbWFpbiA9ICJLZXNlc3VhaWFuIERhdGEgQWt0dWFsIHZzIFByZWRpa3NpIFJpZGdlIChTdW11dCkiLAogICAgIHhsYWIgPSAiRGF0YSBLZW1pc2tpbmFuIEFrdHVhbCAoJSkiLAogICAgIHlsYWIgPSAiSGFzaWwgUHJlZGlrc2kgUmlkZ2UgKCUpIiwKICAgICBwY2ggPSAxOSwgY29sID0gImRhcmtibHVlIikKYWJsaW5lKDAsIDEsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKSAjIEdhcmlzIGlkZWFsCgpgYGAKMS4gR2FyaXMgTWVyYWggYWRhbGFoICJHYXJpcyBLZWp1anVyYW4iCkdhcmlzIG1lcmFoIGl0dSBhZGFsYWggZ2FyaXMgeT14LiBBcnRpbnlhLCBrYWxhdSB0aXRpayBiaXJ1IHBhcyBrZW5hIGdhcmlzIG1lcmFoLCBwcmVkaWtzaSBSaWRnZSBrYW11IDEwMCUgYWt1cmF0IHNhbWEgZGVuZ2FuIGRhdGEgQlBTIGFzbGlueWEuIEthcmVuYSB0aXRpay10aXRpayBrYW11IG5ndW1wdWwgcmFwYXQgZGkgc2l0dSwgYmVyYXJ0aSBtb2RlbCBrYW11IFNha3RpIE1hbmRyYWd1bmEgYnVhdCBtZW1ldGFrYW4ga2VtaXNraW5hbiBTdW11dC4KCjIuIEFuYWxpc2lzIFRpdGlrIHlhbmcgIk1lbGVuY2VuZyIKTGloYXQgYWRhIGR1YSBhdGF1IHRpZ2EgdGl0aWsgZGkgcG9qb2sga2FuYW4gYXRhcyB5YW5nIGFnYWsgbWVuamF1aCBkYXJpIGdhcmlzIG1lcmFoIChwcmVkaWtzaW55YSBsZWJpaCByZW5kYWggZGFyaSBhc2xpbnlhKT8KCkl0dSBrZW11bmdraW5hbiBiZXNhciBhZGFsYWggS2FidXBhdGVuIE5pYXMsIE5pYXMgQmFyYXQsIGF0YXUgTmlhcyBVdGFyYSAoeWFuZyBrZW1pc2tpbmFubnlhIGRpIGF0YXMgMjAlKS4KQW5hbGlzaXNueWE6IEthbXUgYmlzYSBiaWxhbmcsIG1lc2tpcHVuIG1vZGVsIFJpZGdlIHN1ZGFoIGJhZ3VzIGJhbmdldCwgdGFwaSB1bnR1ayB3aWxheWFoIGtlcHVsYXVhbiBla3N0cmVtIHNlcGVydGkgTmlhcywgZmFrdG9yIGtlbWlza2luYW5ueWEgbXVuZ2tpbiBkaXBlbmdhcnVoaSB2YXJpYWJlbCBsYWluIHlhbmcgYmVsdW0gbWFzdWsgbW9kZWwgKG1pc2FsOiBiaWF5YSBsb2dpc3RpayBsYXV0IGF0YXUgYWtzZXNpYmlsaXRhcyBnZW9ncmFmaXMgeWFuZyBzYW5nYXQgc3VsaXQpLgoKMy4gIlRoZSBQb3dlciBvZiBSaWRnZSIKRGkgYmFnaWFuIHRlbmdhaCAoa2VtaXNraW5hbiA1LTEwJSksIHRpdGlrLXRpdGlrbnlhIHJhcGkgYmFuZ2V0LiBJbmkgbWVtYnVrdGlrYW4gYmFod2EgdW50dWsgbWF5b3JpdGFzIGthYnVwYXRlbi9rb3RhIGRpIFN1bXV0IGRhcmF0YW4sIHZhcmlhYmVsIHlhbmcga2FtdSBwYWthaSAoUGVuZGlkaWthbiwgU2FuaXRhc2ksIE1vcmJpZGl0YXMpIHN1ZGFoIHNhbmdhdCBjdWt1cCB1bnR1ayBtZW5qZWxhc2thbiBrZW1pc2tpbmFuLgoKCiMjTEFTU08gKExlYXN0IEFic29sdXRlIFNocmlua2FnZSBhbmQgU2VsZWN0aW9uIE9wZXJhdG9yKS4jIwpgYGB7cn0Kc2V0LnNlZWQoMTIzKQoKIyBDcm9zcy1WYWxpZGF0aW9uIHVudHVrIExBU1NPIChhbHBoYSA9IDEpCmN2X2xhc3NvX3N1bXV0IDwtIGN2LmdsbW5ldCh4LCB5LCBhbHBoYSA9IDEsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgQW1iaWwgbGFtYmRhIHRlcmJhaWsKYmVzdF9sYW1iZGFfbGFzc28gPC0gY3ZfbGFzc29fc3VtdXQkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgTEFTU08gU3VtdXQ6IiwgYmVzdF9sYW1iZGFfbGFzc28pKQoKIyBQbG90IENyb3NzLVZhbGlkYXRpb24gTEFTU08KcGxvdChjdl9sYXNzb19zdW11dCkKYGBgCk5pbGFpbnlhIGN1a3VwIGtlY2lsLCB5YW5nIGFydGlueWEgTEFTU08gdGlkYWsgYWthbiB0ZXJsYWx1IGJydXRhbCBtZW5naGFwdXMgdmFyaWFiZWwsIHRhcGkgdGV0YXAgYWthbiBtZWxha3VrYW4gZmlsdHJhc2kgeWFuZyBzaWduaWZpa2FuLgoKCjIuIEZpdCBNb2RlbCBMQVNTTyAmIFNlbGVrc2kgVmFyaWFiZWwKCmBgYHtyfQojIEZpdCBtb2RlbCBmaW5hbCBMQVNTTwptb2RlbF9sYXNzb19zdW11dCA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAxLCBsYW1iZGEgPSBiZXN0X2xhbWJkYV9sYXNzbywgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBMaWhhdCB2YXJpYWJlbCB5YW5nIFRJREFLIG5vbApjb2VmKG1vZGVsX2xhc3NvX3N1bXV0KQpgYGAKMS4gVmFyaWFiZWwgeWFuZyAiR3VndXIiIChKYWRpIFRpdGlrIC4pCgpWYXJpYWJlbCBYMiwgWDcsIFg4LCBYOSwgWDExLCBkYW4gWDEzIHJlc21pIGRpZWxpbWluYXNpLgoKQXJ0aW55YTogTEFTU08gbWVyYXNhIHZhcmlhYmVsLXZhcmlhYmVsIGluaSAobXVuZ2tpbiBUUFQsIFVNSywgYXRhdSBiZWJlcmFwYSBpbmRpa2F0b3IgcnVtYWggdGluZ2dhbCkgc3VkYWggdGVyd2FraWxpIG9sZWggdmFyaWFiZWwgbGFpbiB5YW5nIGxlYmloIGt1YXQuIEluaSBiYWd1cyBiYW5nZXQsIFNhbiEgU2tyaXBzaSBrYW11IGphZGkgbmdnYWsgIm9iZXNpdGFzIiB2YXJpYWJlbC4KCjIuIFBhcmEgIkp1YXJhIEJlcnRhaGFuIiAoVGhlIEtleSBEcml2ZXJzKQoKWDEyICgtMi40NDIpOiBMYWdpLWxhZ2kgdmFyaWFiZWwgU2FuaXRhc2kvRmFzaWxpdGFzIFJ1bWFoIGluaSBqYWRpIHBlbWVuYW5nIG11dGxhay4gS29lZmlzaWVubnlhIG1ha2luIGt1YXQgZGliYW5kaW5nIFJpZGdlIHRhZGkuIEluaSB2YXJpYWJlbCBwYWxpbmcga3J1c2lhbCBidWF0IG51cnVuaW4ga2VtaXNraW5hbiBkaSBTdW11dCBtZW51cnV0IG1vZGVsIExBU1NPLgoKWDMgKC0xLjM1Mik6IFBlbmRpZGlrYW4gKFJMUy9ITFMpIHRlcmJ1a3RpIHNhbmdhdCB0YW5nZ3VoLiBMQVNTTyBtZW1wZXJ0YWhhbmthbiBpbmkgZGVuZ2FuIGtvZWZpc2llbiBuZWdhdGlmIHlhbmcgYmVzYXIuIEFydGlueWEsIGludmVzdGFzaSBkaSBwZW5kaWRpa2FuIGl0dSAiaGFyZ2EgbWF0aSIgYnVhdCBTdW11dC4KClgxICgwLjg4Myk6IERpbWVuc2kgS2VzZWhhdGFuIChNb3JiaWRpdGFzL0FuZ2thIEtlbHVoYW4pIHRldGFwIGJlcnRhaGFuIHNlYmFnYWkgZmFrdG9yIHlhbmcgbWVuaW5na2F0a2FuIGtlbWlza2luYW4uCgozLiBGZW5vbWVuYSBYMyBEdWEgS2FsaQoKTmFoLCBkaSBzaW5pIGtlbGloYXRhbiBqZWxhczoKClgzIHlhbmcgcGVydGFtYSBwdW55YSBrb2VmaXNpZW4gLTEuMzUuCgpYMyB5YW5nIGtlZHVhIGRhcGV0IGtvZWZpc2llbiAtMS4xM2UtMTQgKGFsaWFzIGhhbXBpciBOT0wpLgpJbmkgbWVtYnVrdGlrYW4ga2FsYXUgYWRhIGR1cGxpa2FzaSBkYXRhIGF0YXUgdmFyaWFiZWwgeWFuZyBzYW5nYXQgbWlyaXAgZGkga29sb20gWDMga2FtdS4gTEFTU08gc2VjYXJhIGNlcmRhcyAibWVtYXRpa2FuIiBzYWxhaCBzYXR1bnlhIGFnYXIgdGlkYWsgdGVyamFkaSBnYW5nZ3VhbiBtdWx0aWtvbGluaWVyaXRhcy4KCgojSGl0dW5nIEFrdXJhc2kgTEFTU08gKEJhbmRpbmdrYW4gZGVuZ2FuIFJpZGdlKQpgYGB7cn0KIyBQcmVkaWtzaQp5X3ByZWRfbGFzc28gPC0gcHJlZGljdChtb2RlbF9sYXNzb19zdW11dCwgcyA9IGJlc3RfbGFtYmRhX2xhc3NvLCBuZXd4ID0geCkKCiMgUi1TcXVhcmVkIExBU1NPCnNzdCA8LSBzdW0oKHkgLSBtZWFuKHkpKV4yKQpzc2VfbGFzc28gPC0gc3VtKCh5X3ByZWRfbGFzc28gLSB5KV4yKQpyc3FfbGFzc28gPC0gMSAtIChzc2VfbGFzc28gLyBzc3QpCgojIFJNU0UgTEFTU08Kcm1zZV9sYXNzbyA8LSBzcXJ0KG1lYW4oKHkgLSB5X3ByZWRfbGFzc28pXjIpKQoKcHJpbnQocGFzdGUoIlItU3F1YXJlZCBMQVNTTzoiLCByc3FfbGFzc28pKQpwcmludChwYXN0ZSgiUk1TRSBMQVNTTzoiLCBybXNlX2xhc3NvKSkKYGBgClItU3F1YXJlZCBMQVNTTyAoODgsNiUpIHRlcm55YXRhIExFQklIIFRJTkdHSSBkYXJpcGFkYSBSaWRnZSAoODUsNyUpLiBQYWRhaGFsIExBU1NPIHN1ZGFoIG1lbWJ1YW5nIGJlYmVyYXBhIHZhcmlhYmVsLCB0YXBpIGFrdXJhc2lueWEganVzdHJ1IG1ha2luIHRhamFtLiBJbmkgbmFtYW55YSBtb2RlbCB5YW5nIGxlYW4sIG1lYW4sIGFuZCBwb3dlcmZ1bC4KCjEuIEtlbmFwYSBMQVNTTyBNZW5hbmcgZGFyaSBSaWRnZT8KQmlhc2FueWEgUmlkZ2UgbGViaWggdW5nZ3VsIGthbGF1IHNlbXVhIHZhcmlhYmVsIHB1bnlhIHBlbmdhcnVoIGtlY2lsIHlhbmcgbWVyYXRhLiBUYXBpIGRpIGRhdGEgU3VtdXQga2FtdSwgTEFTU08gbWVuYW5nIGthcmVuYToKRWZlayBQZW1iZXJzaWhhbjogRGVuZ2FuIG1lbWJ1YW5nIHZhcmlhYmVsICJzYW1wYWgiIGF0YXUgeWFuZyBkdXBsaWthdCAoc2VwZXJ0aSBYMyBrZWR1YSB5YW5nIGhhbXBpciBub2wpLCBMQVNTTyBtZW5naGlsYW5na2FuIGdhbmdndWFuIChub2lzZSkgZGFsYW0gbW9kZWwuCkZva3VzIHBhZGEgQ29yZSBEcml2ZXJzOiBMQVNTTyBiZXJoYXNpbCBtZW5lbXVrYW4gInNpbnlhbCIgeWFuZyBwYWxpbmcga3VhdCBkYXJpIHZhcmlhYmVsIFNhbml0YXNpIChYMTIpIGRhbiBQZW5kaWRpa2FuIChYMykuCgoyLiBBa3VyYXNpIEx1YXIgQmlhc2EgKFJNU0UgMS40MCkKTmlsYWkgUk1TRSBrYW11IHR1cnVuIGRhcmkgMS41NyAoUmlkZ2UpIGtlIDEuNDAgKExBU1NPKS4gQXJ0aW55YSwgcmF0YS1yYXRhIG1lbGVzZXRueWEgcHJlZGlrc2kga2FtdSBjdW1hIDEsNCBwZXJzZW4gcG9pbi4gVW50dWsgZGF0YSBrZW1pc2tpbmFuIHlhbmcgdmFyaWFzaW55YSBsZWJhciBiYW5nZXQgKE5pYXMgdnMgRGVsaSBTZXJkYW5nKSwgaW5pIGFrdXJhc2kgeWFuZyAic2FuZ2F0IG5nZXJpIiBiYWd1c255YS4KCiNQbG90IFBlcmphbGFuYW4gU2VsZWtzaSAoQ29lZmZpY2llbnQgUGF0aCkKYGBge3J9CmZpdF9sYXNzbyA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAxLCBzdGFuZGFyZGl6ZSA9IFRSVUUpCnBsb3QoZml0X2xhc3NvLCB4dmFyID0gImxhbWJkYSIsIGxhYmVsID0gVFJVRSkKYGBgCjEuIFByb3NlcyBTZWxla3NpIE90b21hdGlzIChHYXJpcyB5YW5nICJNYXRpIikKUGVyaGF0aWthbiBzaXNpIGtpcmkgZ3JhZmlrIChzYWF0IOKIkmxvZyjOuykgbWVuZGVrYXRpIDAgYXRhdSBhbmdrYSBuZWdhdGlmKS4gQmFueWFrIGdhcmlzIHlhbmcgdGFkaW55YSB3YXJuYS13YXJuaSB0aWJhLXRpYmEgbWVuZ2hpbGFuZyBkYW4gbWVueWF0dSBrZSBnYXJpcyBub2wuIEl0dSBhZGFsYWggdmFyaWFiZWwtdmFyaWFiZWwgImxlbWFoIiB5YW5nIGRpcGFuZ2thcyBvbGVoIExBU1NPLiBhdGF1IGJpc2EgYmlsYW5nOiAiR3JhZmlrIGluaSBtZW1idWt0aWthbiBiYWh3YSBMQVNTTyBiZXJoYXNpbCBtZW55ZWRlcmhhbmFrYW4gbW9kZWwgZGFyaSAxNyBwcmVkaWt0b3IgbWVuamFkaSBoYW55YSBzZWtpdGFyIDExIHByZWRpa3RvciB1dGFtYSB0YW5wYSBrZWhpbGFuZ2FuIGFrdXJhc2kuIgoKMi4gVGlnYSBOYWdhIFV0YW1hIChHYXJpcyB5YW5nIEJlcnRhaGFuIFBhbGluZyBMYW1hKQoKTGloYXQgdGlnYSBnYXJpcyB5YW5nIHBhbGluZyBsZWJhciBqYXJha255YSBkYXJpIG5vbDoKR2FyaXMgTm9tb3IgMTMgKEhpdGFtIHBhbGluZyBiYXdhaCk6IEluaSB2YXJpYWJlbCBwYWxpbmcgInNha3RpIiAgKFNhbml0YXNpKS4gTGloYXQgYmV0YXBhIGRpYSBiZXJ0YWhhbiBwYWxpbmcgdWp1bmcsIG5nZ2FrIG1hdSBtZW55ZXJhaCBrZSBhbmdrYSBub2wuIEFydGlueWEsIHNhbml0YXNpIGFkYWxhaCBha2FyIG1hc2FsYWgga2VtaXNraW5hbiBwYWxpbmcgbnlhdGEgZGkgU3VtdXQuCkdhcmlzIE5vbW9yIDMgKEhpamF1L0JpcnUgbXVkYSBkaSBiYXdhaCk6IEluaSBQZW5kaWRpa2FuIChSTFMpLiBEaWEganVnYSBzYW5nYXQgZG9taW5hbiBkYW4ga29uc2lzdGVuLgpHYXJpcyBOb21vciAxIChIaXRhbSBwYWxpbmcgYXRhcyk6IEluaSBmYWt0b3Iga2VzZWhhdGFuL21vcmJpZGl0YXMgeWFuZyB0ZXJ1cyBtZW1wZXJwYXJhaCBrZW1pc2tpbmFuLgoKMy4gIlRoZSBTd2VldCBTcG90IgoKTGFtYmRhIG9wdGltYWwgIGFkYSBkaSBzZWtpdGFyIGFuZ2thIDYgKHBhZGEgc2thbGEgYXRhcyksIGRpIG1hbmEgbW9kZWwgIG1lbnlpc2FrYW4gc2VraXRhciAxMSB2YXJpYWJlbC4gRGkgc2l0dWxhaCBSLVNxdWFyZWQga2FtdSBtZW5jYXBhaSA4OCw2JS4KCgojI0VsYXN0aWMgTmV0dAoxLiBNZW5jYXJpIEFscGhhIGRhbiBMYW1iZGEgVGVyYmFpawpEaSBFbGFzdGljIE5ldCwgbmdnYWsgY3VtYSBjYXJpIExhbWJkYSAozrspLCB0YXBpIGp1Z2EgY2FyaSBBbHBoYSAozrEpLgpBbHBoYSA9IDAgKFJpZGdlKQpBbHBoYSA9IDEgKExBU1NPKQowIDwgQWxwaGEgPCAxIChFbGFzdGljIE5ldCkgLT4gQmlhc2FueWEga2l0YSBwYWthaSAwLjUgc2ViYWdhaSB0aXRpayB0ZW5nYWguCgpgYGB7cn0Kc2V0LnNlZWQoMTIzKQoKIyBLaXRhIGNvYmEgQWxwaGEgPSAwLjUgKEtvbWJpbmFzaSA1MC01MCBSaWRnZSAmIExBU1NPKQpjdl9lbl9zdW11dCA8LSBjdi5nbG1uZXQoeCwgeSwgYWxwaGEgPSAwLjUsIHN0YW5kYXJkaXplID0gVFJVRSkKCiMgQW1iaWwgQmVzdCBMYW1iZGEKYmVzdF9sYW1iZGFfZW4gPC0gY3ZfZW5fc3VtdXQkbGFtYmRhLm1pbgpwcmludChwYXN0ZSgiTGFtYmRhIE9wdGltYWwgRWxhc3RpYyBOZXQ6IiwgYmVzdF9sYW1iZGFfZW4pKQoKIyBQbG90IENyb3NzLVZhbGlkYXRpb24KcGxvdChjdl9lbl9zdW11dCkKCmBgYApOaWxhaW55YSAwLjE5OCwgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBsYW1iZGEgTEFTU08gdGFkaSAoMC4xMDkpLiBJbmkgbWVudW5qdWtrYW4gRWxhc3RpYyBOZXQgbWVtYmVyaWthbiBwZW5hbHRpIHlhbmcgc2VkaWtpdCBsZWJpaCAidGVnYXMiIHVudHVrIG1lbnllaW1iYW5na2FuIGFudGFyYSBzZWxla3NpIHZhcmlhYmVsIChzZXBlcnRpIExBU1NPKSBkYW4gc3RhYmlsaXRhcyBrb2VmaXNpZW4gKHNlcGVydGkgUmlkZ2UpLgoKRml0IE1vZGVsIEZpbmFsICYgQ2VrIEtvZWZpc2llbgpgYGB7cn0KIyBGaXQgbW9kZWwgZmluYWwKbW9kZWxfZW5fc3VtdXQgPC0gZ2xtbmV0KHgsIHksIGFscGhhID0gMC41LCBsYW1iZGEgPSBiZXN0X2xhbWJkYV9lbiwgc3RhbmRhcmRpemUgPSBUUlVFKQoKIyBUYW1waWxrYW4ga29lZmlzaWVuCmNvZWYobW9kZWxfZW5fc3VtdXQpCmBgYApBZGEgZmVub21lbmEgbWVuYXJpayB5YW5nIHRlcmphZGkgZGkgdmFyaWFiZWwgWDMga2FtdToKCjEuIFBlbWJ1a3RpYW4gR3JvdXBpbmcgRWZmZWN0IChYMykKCkluZ2F0IGthbiBkaSBMQVNTTyB0YWRpIHNhbGFoIHNhdHUgWDMgImRpbWF0aWthbiIgKGphZGkgaGFtcGlyIG5vbCk/IERpIEVsYXN0aWMgTmV0LCBrZWR1YW55YSAiZGloaWR1cGthbiIga2VtYmFsaSBkZW5nYW4gbmlsYWkgeWFuZyBoYW1waXIgbWlyaXAgKC0wLjY1IGRhbiAtMC42OSkuCkludGVycHJldGFzaW55YTogRWxhc3RpYyBOZXQgbWVuZGV0ZWtzaSBiYWh3YSBrZWR1YSB2YXJpYWJlbCBYMyBpbmkgKG11bmdraW4gUkxTIGRhbiBITFMgYXRhdSBkYXRhIGR1cGxpa2F0KSBtZW1pbGlraSBrb3JlbGFzaSB5YW5nIHNhbmdhdCBrdWF0LiBBbGloLWFsaWggbWVtaWxpaCBzYWxhaCBzYXR1IHNlY2FyYSBwYWtzYSBzZXBlcnRpIExBU1NPLCBFbGFzdGljIE5ldCBtZW1iYWdpIGtvZWZpc2llbm55YSBzZWNhcmEgYWRpbC4gSW5pIG1lbWJ1YXQgbW9kZWwga2FtdSBqYXVoIGxlYmloIHN0YWJpbC4KCjIuIEtvbnNpc3RlbnNpIFNhbmcgSnVhcmEgKFgxMikKTGFnaSBkYW4gbGFnaSwgWDEyIHRldGFwIG1lbmphZGkgcGVtZWdhbmcga29lZmlzaWVuIG5lZ2F0aWYgdGVyYmVzYXIgKC0yLjM5KS4gSW5pIG1lbWJ1a3Rpa2FuIGJhaHdhIGFwYSBwdW4gbWV0b2Rlbnlh4oCUUmlkZ2UsIExBU1NPLCBhdGF1IEVsYXN0aWMgTmV04oCUU2FuaXRhc2kgYWRhbGFoIGZha3RvciBwYWxpbmcgZG9taW5hbiBkYWxhbSBtZW5qZWxhc2thbiBrZW1pc2tpbmFuIGRpIFN1bWF0ZXJhIFV0YXJhLiBIYXNpbCBwZW5lbGl0aWFuIGthbXUgc2FuZ2F0IHJvYnVzdCAodGFuZ2d1aCkhCgozLiBTZWxla3NpIFZhcmlhYmVsIHlhbmcgQmlqYWsKTWVza2lwdW4gdGlkYWsgc2VnYWxhayBMQVNTTywgRWxhc3RpYyBOZXQgdGV0YXAgYmVyaGFzaWwgbWVtYnVhbmcgdmFyaWFiZWwgeWFuZyB0aWRhayBwZXJsdSAoWDIsIFg3LCBYOCwgWDksIFgxMSwgWDEzIHRldGFwIGphZGkgdGl0aWspLiBNb2RlbCAgdGV0YXAgcmluZ2thcyB0YXBpIHRldGFwIG1lbmphZ2EgaW5mb3JtYXNpIGRhcmkgdmFyaWFiZWwgeWFuZyBzYWxpbmcgYmVya2FpdGFuLgoKCkhpdHVuZyBBa3VyYXNpIChUaGUgTW9tZW50IG9mIFRydXRoKQpgYGB7cn0KIyBQcmVkaWtzaQp5X3ByZWRfZW4gPC0gcHJlZGljdChtb2RlbF9lbl9zdW11dCwgcyA9IGJlc3RfbGFtYmRhX2VuLCBuZXd4ID0geCkKCiMgUi1TcXVhcmVkIEVsYXN0aWMgTmV0CnNzdCA8LSBzdW0oKHkgLSBtZWFuKHkpKV4yKQpzc2VfZW4gPC0gc3VtKCh5X3ByZWRfZW4gLSB5KV4yKQpyc3FfZW4gPC0gMSAtIChzc2VfZW4gLyBzc3QpCgojIFJNU0UgRWxhc3RpYyBOZXQKcm1zZV9lbiA8LSBzcXJ0KG1lYW4oKHkgLSB5X3ByZWRfZW4pXjIpKQoKcHJpbnQocGFzdGUoIlItU3F1YXJlZCBFbGFzdGljIE5ldDoiLCByc3FfZW4pKQpwcmludChwYXN0ZSgiUk1TRSBFbGFzdGljIE5ldDoiLCBybXNlX2VuKSkKYGBgCldhaCwgaGFzaWxueWEgdGlwaXMgYmFuZ2V0IHlhISBSLVNxdWFyZWQgRWxhc3RpYyBOZXQga2FtdSAoODgsNDYlKSBoYW1waXIgc2V0YXJhIGRlbmdhbiBMQVNTTyAoODgsNjQlKS4gTWVza2lwdW4gc2VjYXJhIGFuZ2thIExBU1NPIHVuZ2d1bCBzZWRpa2l0IHNla2FsaSBkaSBkaWdpdCBrZWR1YSBiZWxha2FuZyBrb21hLCBFbGFzdGljIE5ldCBtZW1iZXJpa2FuIHN0YWJpbGl0YXMgbW9kZWwgeWFuZyBsZWJpaCBiYWlrIHVudHVrIGRhdGEgU3VtdXQuIAoKClBsb3QgS29lZmlzaWVuIFBhdGggRWxhc3RpYyBOZXQKYGBge3J9CmZpdF9lbiA8LSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAwLjUsIHN0YW5kYXJkaXplID0gVFJVRSkKcGxvdChmaXRfZW4sIHh2YXIgPSAibGFtYmRhIiwgbGFiZWwgPSBUUlVFKQpgYGAKMS4gS2FyYWt0ZXJpc3RpayAiR3JvdXBpbmcgRWZmZWN0IgoKQ29iYSBrYW11IHBlcmhhdGlrYW4gZ2FyaXMgbm9tb3IgMyAoaGlqYXUvYmlydSBtdWRhIGRpIGJhd2FoKS4gRGkgZ3JhZmlrIGluaSwgZ2FyaXNueWEgdGVybGloYXQgImJlcmhpbXBpdGFuIiBhdGF1IGJlcmphbGFuIGJhcmVuZ2FuLgpJbmlsYWggR3JvdXBpbmcgRWZmZWN0LiBEaSBMQVNTTyB0YWRpLCBzYWxhaCBzYXR1bnlhIGRpcGFrc2EgbWF0aSwgdGFwaSBkaSBFbGFzdGljIE5ldCwga2FyZW5hIG1lcmVrYSBkaWFuZ2dhcCBzYXR1IGtlbG9tcG9rIChtaXNhbCB2YXJpYWJlbCBwZW5kaWRpa2FuKSwgbWVyZWthIGRpcGVyYm9sZWhrYW4gbWFzdWsgYmFyZW5nIGRlbmdhbiBrb2VmaXNpZW4geWFuZyBzYWxpbmcgbWVueWVzdWFpa2FuLgpJbmkgYmlraW4gbW9kZWwga2FtdSBsZWJpaCBzdGFiaWwgZGFuIGludGVycHJldGFzaW55YSBsZWJpaCBhZGlsIHNlY2FyYSBla29ub21pLgoKMi4gQW5na2EgZGkgQXRhcyAoMCDihpIgMTcpCkxpaGF0IHBlcmdlcmFrYW4gYW5na2EgZGkgYXRhcyBwbG90OgowIOKGkiA5IOKGkiAxMyDihpIgMTcuCkluaSBtZW51bmp1a2thbiBiYWh3YSBFbGFzdGljIE5ldCB0ZXRhcCBtZWxha3VrYW4gc2VsZWtzaSB2YXJpYWJlbCAoc2VwZXJ0aSBMQVNTTyksIHRhcGkgbGViaWggbGFtYmF0IGRhbiBoYXRpLWhhdGkuClNhYXQg4oiSbG9nKM67KSBtYWtpbiBrZSBrYW5hbiwgdmFyaWFiZWwgbXVsYWkgbWFzdWsgc2F0dSBwZXIgc2F0dSBzYW1wYWkgbGVuZ2thcCAxNy4gTmFtdW4sIHNhYXQgcGVuYWx0aSBkaXBlcmtldGF0IChtYWtpbiBrZSBraXJpKSwgZGlhIG1lbnlpc2FrYW4gdmFyaWFiZWwtdmFyaWFiZWwgeWFuZyBiZW5hci1iZW5hciBzb2xpZC4KCjMuIFRpZ2EgUGVuZ3Vhc2EgU3VtYXRlcmEgVXRhcmEKU2FtYSBzZXBlcnRpIGR1YSBtb2RlbCBzZWJlbHVtbnlhLCBhZGEgdGlnYSBnYXJpcyB5YW5nIHBhbGluZyAiYmVyYW5pIiBtZW5qYXVoIGRhcmkgbm9sOgpHYXJpcyAxMyAoSGl0YW0gQmF3YWgpOiBUZXRhcCBrb25zaXN0ZW4gc2ViYWdhaSB2YXJpYWJlbCBwYWxpbmcgZG9taW5hbiAoU2FuaXRhc2kpLiBQZW5nYXJ1aG55YSB0ZXJoYWRhcCBwZW51cnVuYW4ga2VtaXNraW5hbiBzYW5nYXQgbWFzaWYuCkdhcmlzIDEgKEhpdGFtIEF0YXMpOiBWYXJpYWJlbCBrZXNlaGF0YW4vbW9yYmlkaXRhcyB5YW5nIGphZGkgZmFrdG9yIHBlbmRvcm9uZyBrZW1pc2tpbmFuLgpHYXJpcyAzOiBEaW1lbnNpIHBlbmRpZGlrYW4geWFuZyBzdGFiaWwgbWVuZHVrdW5nIHBlbnVydW5hbiBrZW1pc2tpbmFuLgoKCgojUEVNQkFIQVNBTiMKUGVyYmFuZGluZ2FuIEludGVycHJldGFzaSBWaXN1YWwgOgpSaWRnZTogTWVudW5qdWtrYW4gYmFod2Egc2VtdWEgdmFyaWFiZWwgcHVueWEgcGVyYW4sIG1lc2tpIGtlY2lsLgpMQVNTTzogTWVudW5qdWtrYW4gZWZpc2llbnNpIG1vZGVsIGRlbmdhbiBtZW1idWFuZyB2YXJpYWJlbCB5YW5nIHJlZHVuZGFuLgpFbGFzdGljIE5ldCA6IE1lbnVuanVra2FuIHN0YWJpbGl0YXMgbW9kZWwgZGVuZ2FuIHRldGFwIG1lbmphZ2EgdmFyaWFiZWwgeWFuZyBiZXJrb3JlbGFzaSAoZ3JvdXBpbmcpIHRhbnBhIG1lbmdvcmJhbmthbiBha3VyYXNpLgoKU3ludGF4IEdhYnVuZ2FuIApgYGB7cn0KIyAxLiBBbWJpbCBrb2VmaXNpZW4gZGFyaSBrZXRpZ2EgbW9kZWwgKFBhc3Rpa2FuIG5hbWEgbW9kZWxueWEgc2VzdWFpKQpjb2VmX3JpZGdlIDwtIGFzLm1hdHJpeChjb2VmKG1vZGVsX3JpZGdlX2ZpbmFsLCBzID0gMS4zNzc3OTc2NDY4NzkyNykpCmNvZWZfbGFzc28gPC0gYXMubWF0cml4KGNvZWYobW9kZWxfbGFzc29fc3VtdXQsIHMgPSAwLjEwOTE4ODEwNzI1NDQwOSkpCmNvZWZfZW4gICAgPC0gYXMubWF0cml4KGNvZWYobW9kZWxfZW5fc3VtdXQsIHMgPSAwLjE5ODk3NjI3MzQ4MTkyMSkpCgojIDIuIEdhYnVuZ2thbiBtZW5qYWRpIHNhdHUgdGFiZWwKdGFiZWxfcGVyYmFuZGluZ2FuIDwtIGRhdGEuZnJhbWUoCiAgVmFyaWFiZWwgPSByb3duYW1lcyhjb2VmX3JpZGdlKSwKICBSaWRnZSA9IGFzLnZlY3Rvcihjb2VmX3JpZGdlKSwKICBMQVNTTyA9IGFzLnZlY3Rvcihjb2VmX2xhc3NvKSwKICBFbGFzdGljX05ldCA9IGFzLnZlY3Rvcihjb2VmX2VuKQopCgojIDMuIEJ1bGF0a2FuIGFuZ2thIGJpYXIgY2FudGlrICg0IGFuZ2thIGRpIGJlbGFrYW5nIGtvbWEpCnRhYmVsX3BlcmJhbmRpbmdhblssIDI6NF0gPC0gcm91bmQodGFiZWxfcGVyYmFuZGluZ2FuWywgMjo0XSwgNCkKCiMgNC4gVGFtcGlsa2FuIGRpIEtvbnNvbApwcmludCh0YWJlbF9wZXJiYW5kaW5nYW4pCgojIDUuIEVrc3BvciBrZSBDU1YgKEJ1a2EgcGFrYWkgRXhjZWwgbmFudGkpCndyaXRlLmNzdih0YWJlbF9wZXJiYW5kaW5nYW4sICJQZXJiYW5kaW5nYW5fS29lZmlzaWVuX1N1bXV0LmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKClN5bnRheCBUYWJlbCBQZXJmb3JtYSBNb2RlbCAoUi1TcXVhcmUgJiBSTVNFKQpgYGB7cn0KIyBCdWF0IHRhYmVsIHBlcmZvcm1hCnRhYmVsX3BlcmZvcm1hIDwtIGRhdGEuZnJhbWUoCiAgTWV0b2RlID0gYygiUmlkZ2UiLCAiTEFTU08iLCAiRWxhc3RpYyBOZXQiKSwKICBBbHBoYSA9IGMoMCwgMSwgMC41KSwKICBSX1NxdWFyZWQgPSBjKDAuODU3NCwgMC44ODY0LCAwLjg4NDcpLAogIFJNU0UgPSBjKDEuNTc0NywgMS40MDUyLCAxLjQxNjIpCikKCnByaW50KHRhYmVsX3BlcmZvcm1hKQoKIyBFa3Nwb3IKd3JpdGUuY3N2KHRhYmVsX3BlcmZvcm1hLCAiUGVyZm9ybWFfTW9kZWxfU3VtdXQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKS29uc2lzdGVuc2kgVmFyaWFiZWw6IFNlYnV0a2FuIGJhaHdhIHZhcmlhYmVsIFgxMiAoU2FuaXRhc2kpIGRhbiBYMyAoUGVuZGlkaWthbikgc2VjYXJhIGtvbnNpc3RlbiBtZW5qYWRpIHByZWRpa3RvciB1dGFtYSBkaSBrZXRpZ2EgbWV0b2RlIGRlbmdhbiBrb2VmaXNpZW4gbmVnYXRpZiB5YW5nIGt1YXQuIEluaSBtZW51bmp1a2thbiBoYXNpbCB5YW5nIFJvYnVzdCAoU2FuZ2F0IEt1YXQpLgoKRWZpc2llbnNpIExBU1NPOiBMQVNTTyBiZXJoYXNpbCBtZW1iZXJpa2FuIGFrdXJhc2kgdGVydGluZ2dpIChSIDIgPTg4LDYlKSBtZXNraXB1biB0ZWxhaCBtZXJlZHVrc2kganVtbGFoIHZhcmlhYmVsLiBJbmkgbWVtYnVrdGlrYW4gYmFod2EgdGlkYWsgc2VtdWEgaW5kaWthdG9yIGtlbWlza2luYW4gbWVtaWxpa2kgcGVuZ2FydWggdW5payB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBkaSBTdW11dC4KClN0YWJpbGl0YXMgRWxhc3RpYyBOZXQ6IEVsYXN0aWMgTmV0IG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBoYW1waXIgc2FtYSBkZW5nYW4gTEFTU08gbmFtdW4gbGViaWggc3RhYmlsIGRhbGFtIG1lbmFuZ2FuaSB2YXJpYWJlbCB5YW5nIHNhbGluZyBiZXJrb3JlbGFzaSAoc2VwZXJ0aSBkdWEgdmFyaWFiZWwgWDMga2FtdSkuCgoKCgoKCgoK