knitr::opts_chunk$set(echo = TRUE)

Dalam era transformasi digital dan kebijakan Satu Data Indonesia, konvergensi antara data berbasis survei sampling dengan data registrasi administratif sektoral merupakan salah satu pilar penting dalam menjaga kualitas statistik nasional.

Kajian ini secara khusus menelaah koherensi data level kabupaten/kota menggunakan dua instrumen statistik yang berbeda.

Load Data

df_theta <- read_excel(nama_file) %>%
  mutate(
    DataD   = as.numeric(Data_D),
    DataS = as.numeric(Data_S)
  ) %>%
  filter(!is.na(Data_D) & !is.na(Data_S))
#print(head(df_theta, 3))

1 Ukuran Metrik Konsistensi

  • Rata-rata Bias (bias): Ukuran ini menghitung rata-rata selisih murni antara kedua sumber data. Angka bias yang bernilai positif tinggi mengonfirmasi secara empiris adanya kecenderungan sistematis (systematic error/overstatement) di mana pencatatan berbasis Keluarga secara konsisten menghasilkan volume yang lebih masif dibanding estimasi sampling Rumah Tangga.

  • RMSE (Root Mean Square Error): Ukuran ini mengukur akar dari rata-rata kuadrat selisih data. Karena menerapkan operasi kuadrat, RMSE bertindak sebagai instrumen yang memberikan bobot sangat sensitif terhadap kabupaten yang memiliki lompatan perbedaan angka yang sangat ekstrem (outlier). Semakin kecil nilai RMSE, semakin konsisten kedekatan antar-variabel.

  • MAPE (Mean Absolute Percentage Error): Menyatakan rata-rata persentase kesalahan absolut relatif. Ukuran ini sangat efektif digunakan untuk menerjemahkan tingkat deviasi data kepada pemangku kebijakan non-statistik, karena langsung merepresentasikan proporsi persentase penyimpangan di tingkat lapangan.

df_theta <- df_theta %>%
  mutate(
    selisih       = DataD - DataS,
    rata_rata     = (DataD + DataS) / 2,
    ape           = abs(DataD - DataS) / DataS * 100,
    rank_DataD    = rank(-DataD),
    rank_DataS  = rank(-DataS),
    selisih_rank  = abs(rank_DataD - rank_DataS)
  )
bias <- mean(df_theta$selisih)
rmse <- sqrt(mean((df_theta$DataD - df_theta$DataS)^2))
mape <- mean(df_theta$ape)

metrik <- round(c(bias, rmse, mape), 2)
names(metrik) <- c("bias", "rmse", "mape")
metrik
##    bias    rmse    mape 
## 2220.01 3916.17  277.22

Interpretasi

Hasil evaluasi metrik menunjukkan tingkat deviasi absolut yang besar antara kedua data, dicerminkan oleh nilai Bias sebesar 2.220,01 unit, RMSE sebesar 3.916,17 unit, dan penyimpangan relatif MAPE mencapai 277,22%. Deviasi yang tinggi ini menegaskan bahwa kedua sumber data memiliki karakteristik populasi dan definisi operasional yang berbeda nyata.

Oleh karena itu, fokus pemeriksaan koherensi tidak boleh bertumpu pada kedekatan angka numeriknya, melainkan harus dialihkan pada keselarasan arah tren dan konsistensi peringkat wilayah (Korelasi Spearman). Selama korelasi peringkatnya kuat, kedua data ini tetap aman digunakan sebagai dasar penentuan wilayah prioritas intervensi kebijakan.”

2 Uji Statistik

2.1 Korelasi Spearman

Korelasi Peringkat Spearman digunakan untuk menguji Koherensi Tren (Arah Kebijakan). Koefisien korelasi (\(Rho\)) yang mendekati nilai 1 menandakan keselarasan peringkat yang kuat; artinya kabupaten yang dikategorikan rawan oleh Data S secara konsisten juga dinilai rawan oleh Data D. Nilai signifikansi (\(p\text{-value} < 0.05\)) menjadi bukti absolut bahwa keselarasan tren tersebut nyata terjadi di populasi, bukan karena faktor kebetulan (random error).

uji_korelasi <- cor.test(df_theta$DataS, df_theta$DataD, method = "spearman")
uji_korelasi
## 
##  Spearman's rank correlation rho
## 
## data:  df_theta$DataS and df_theta$DataD
## S = 250, p-value = 0.002708
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.6936275

2.2 Wilcoxon Signed-Rank

Wilcoxon Signed-Rank digunakan untuk menguji Kesamaan Nilai Absolut Berpasangan. Uji non-parametrik ini mengonfirmasi apakah perbedaan nominal di tingkat kabupaten/kota bermakna secara statistik. Hasil \(p\text{-value} < 0.05\) menolak hipotesis kesamaan data, yang secara metodologis melegitimasi bahwa kedua data memang tidak bisa disamakan secara angka mutlak akibat perbedaan definisi unit analisis (Rumah Tangga vs Keluarga).

uji_beda <- wilcox.test(df_theta$DataS, df_theta$DataD, paired = TRUE)
uji_beda 
## 
##  Wilcoxon signed rank exact test
## 
## data:  df_theta$DataS and df_theta$DataD
## V = 17, p-value = 0.003159
## alternative hypothesis: true location shift is not equal to 0
validasi <- round(c(uji_korelasi$estimate, uji_korelasi$p.value, uji_beda$p.value), 4)
names(validasi) <- c("r Spearman", "p-value r Spearman", "p-value Wilcox")
validasi
##         r Spearman p-value r Spearman     p-value Wilcox 
##             0.6936             0.0027             0.0032

Interpretasi

  • Hasil Korelasi Spearman membuktikan kedua data ini sangat koheren secara signifikan (\(\rho = 0,694; p = 0,0027\)).

  • Dengan demikian, dapat disimpulkan bahwa kedua sumber data memberikan penilaian peringkat yang setara dan konsisten. Pengambil kebijakan dapat menggunakan kedua data ini dengan aman untuk melakukan penetapan prioritas wilayah intervensi program, karena daerah prioritas yang ditunjukkan oleh kedua data terbukti serupa secara statistik.

3 Ranking Wilayah

print("----- 10 WILAYAH DENGAN ANOMALI PERBEDAAN RANKING TERBESAR -----")
## [1] "----- 10 WILAYAH DENGAN ANOMALI PERBEDAAN RANKING TERBESAR -----"
df_theta %>%
  arrange(desc(selisih_rank)) %>%
  select(kabupaten_kota, DataD, DataS, rank_DataD, rank_DataS, selisih_rank) %>%
  head(10) %>%
  print()
## # A tibble: 10 × 6
##    kabupaten_kota           DataD DataS rank_DataD rank_DataS selisih_rank
##    <chr>                    <dbl> <dbl>      <dbl>      <dbl>        <dbl>
##  1 KABUPATEN KOLAKA          8832 1403.          2         10            8
##  2 KABUPATEN BOMBANA         3738 1955.         11          4            7
##  3 KABUPATEN BUTON           4431 3408.          9          3            6
##  4 KABUPATEN KOLAKA UTARA    3389 1750.         12          6            6
##  5 KABUPATEN KONAWE          8394 1741.          3          7            4
##  6 KABUPATEN KONAWE SELATAN  6985 1639.          5          9            4
##  7 KABUPATEN BUTON TENGAH    5104 1272.          7         11            4
##  8 KABUPATEN BUTON SELATAN   4113  840.         10         13            3
##  9 KOTA BAU BAU              8231 8081.          4          2            2
## 10 KABUPATEN MUNA            6851 1876.          6          5            1

Interpretasi

Berdasarkan hasil perangkingan, meskipun terdapat korelasi tren yang kuat, terdapat 10 wilayah anomali yang menunjukkan perbedaan peringkat dengan rentang pergeseran antara 1 hingga 8 tingkat. Kabupaten Kolaka menjadi kabupaten dengan anomali tertinggi karena menduduki posisi atas di peringkat ke-2 pada Data D dengan volume 8.832 unit, namun pada Data S menjadi peringkat ke-10 (sebanyak 1.403 unit).

Kondisi anomali yang hampir sama juga terjadi di Kabupaten Bombana dan Kabupaten Buton, di mana kedua wilayah ini dinilai jauh lebih tinggi di Data S (masing-masing menduduki peringkat ke-4 dan ke-3) dibandingkan pada Data D yang menempatkan di peringkat ke-11 dan ke-9.

4 Visualisasi

4.1 Scatter Plot

Scatter Plot Koherensi memetakan posisi koordinat seluruh kabupaten/kota.

Grafik ini dilengkapi dengan Garis Kesamaan Ideal (\(Y=X\)) berwarna biru sebagai patokan jika kedua data sama persis, serta Garis Tren Linier Aktual (Regresi) berwarna merah putus-putus. Kedekatan dan kecondongan garis merah yang searah dengan garis biru menjadi konfirmasi visual langsung mengenai tingkat koherensi spasial data.

plot_koherensi <- ggplot(df_theta, aes(x = DataD, y = DataS)) +
  geom_point(color = "#1abc9c", size = 4, alpha = 0.9) +
  geom_abline(slope = 1, intercept = 0, color = "#3498db", linewidth = 1) + # Garis Ideal Y=X
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed", se = TRUE, fill = "#f39c12", alpha = 0.1) +
  geom_text(aes(label = kabupaten_kota), vjust = -1.2, size = 3, check_overlap = TRUE, fontface = "bold") +
  labs(
    title = "Scatter Plot Koherensi Indikator",
    subtitle = paste("Spearman Rho =", round(uji_korelasi$estimate, 3), " | MAPE =", round(mape, 2), "%"),
    x = "Jumlah Indikator (Data S)",
    y = "Jumlah Indikator (Data D)",
    caption = "Garis biru solid menunjukkan garis kesamaan ideal (Data D = Data S) \n Garis merah putus-putus menunjukkan tren regresi aktual data lapangan"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", size = 14, color = "#2c3e50"),
    axis.title = element_text(face = "bold", color = "#2c3e50"),
    panel.grid.minor = element_blank()
  )

print(plot_koherensi)
## `geom_smooth()` using formula = 'y ~ x'

Interpretasi

Sebaran titik pada grafik menunjukkan bahwa sebagian besar kabupaten/kota terkonsentrasi pada kelompok yang relatif rendah dan homogen. Kondisi ini mengindikasikan bahwa mayoritas wilayah memiliki tingkat kebutuhan perumahan yang tidak terlalu tinggi serta menunjukkan kesesuaian yang cukup baik antara kedua sumber data.

Meskipun demikian, sebagian besar titik berada di bawah garis kesamaan ideal, yang mengindikasikan estimasi berdasarkan Data D cenderung lebih tinggi dibandingkan Data S. Pola ini mencerminkan adanya fenomena beberapa kepala keluarga yang menempati satu unit rumah yang sama, sehingga jumlah keluarga yang membutuhkan hunian tercatat lebih besar. Temuan ini menunjukkan bahwa perencanaan intervensi perumahan perlu mempertimbangkan tidak hanya jumlah rumah yang tersedia, tetapi juga jumlah keluarga yang menempatinya.

Selain itu, Kota Kendari tampak sebagai outlier yang terpisah jauh dari wilayah lainnya dengan nilai tertinggi pada kedua sumber data. Kondisi ini mengindikasikan bahwa permasalahan di Kota Kendari relatif lebih tinggi dibandingkan kabupaten/kota lain di Provinsi Sulawesi Tenggara, yang kemungkinan berkaitan dengan tingginya konsentrasi penduduk dan aktivitas perkotaan.

4.2 Bland-Altman Plot

Bland-Altman Plot merupakan metode standar visualisasi dalam analisis kesepakatan (Agreement Analysis) dua instrumen pengukuran.

Sumbu X memetakan rata-rata nilai, sementara sumbu Y memetakan selisihnya. Grafik ini memetakan apakah sebaran kabupaten/kota masih berada di dalam koridor batas toleransi makro yang aman, yaitu di antara rentang batas atas dan batas bawah Limits of Agreement (\(\pm 1.96 \text{ Standar Deviasi}\)). Titik wilayah yang melompat keluar dari batas garis hijau putus-putus secara visual teridentifikasi sebagai pencilan yang memiliki kesalahan sistemik khusus di lapangan.

mean_diff   <- bias
sd_diff     <- sd(df_theta$selisih)
upper_limit <- mean_diff + 1.96 * sd_diff
lower_limit <- mean_diff - 1.96 * sd_diff

plot_bland <- ggplot(df_theta, aes(x = rata_rata, y = selisih)) +
  geom_point(color = "#3498db", size = 3.5, alpha = 0.8) +
  geom_hline(yintercept = mean_diff, color = "#e74c3c", linewidth = 1.2) + # Garis Nilai Bias rata-rata
  geom_hline(yintercept = upper_limit, linetype = "dashed", color = "darkgreen", linewidth = 0.8) +
  geom_hline(yintercept = lower_limit, linetype = "dashed", color = "darkgreen", linewidth = 0.8) +
  # Teks Indikator Batas Toleransi pada Grafik
  annotate("text", x = max(df_theta$rata_rata)*0.85, y = upper_limit, label = paste("Batas Atas (+1.96 SD):", round(upper_limit, 1)), vjust = -0.5, color = "darkgreen", size = 3) +
  annotate("text", x = max(df_theta$rata_rata)*0.85, y = mean_diff, label = paste("Mean Bias:", round(mean_diff, 1)), vjust = -0.5, color = "#e74c3c", size = 3) +
  annotate("text", x = max(df_theta$rata_rata)*0.85, y = lower_limit, label = paste("Batas Bawah (-1.96 SD):", round(lower_limit, 1)), vjust = 1.5, color = "darkgreen", size = 3) +
  geom_text(aes(label = kabupaten_kota), vjust = -0.8, size = 2.8, check_overlap = TRUE) +
  labs(
    title = "Bland-Altman Plot Kesepakatan Metode Data",
    subtitle = paste("Penyebaran Kabupaten/Kota terhadap Rentang Batas Toleransi Makro (Bias:", round(mean_diff, 2), ")"),
    x = "Rata-rata Nilai (Data D dan S)",
    y = "Selisih Pengukuran (Data D - Data S)"
  ) +
  theme_minimal()

print(plot_bland)

Interpretasi

Grafik Bland-Altman menunjukkan secara umum Data D menghasilkan indikator yang lebih tinggi dibandingkan Data S (tergambar dari nilai bias positif sebesar 2.220). Sebagian besar kabupaten/kota berada di sekitar garis rata-rata selisih, yang mengindikasikan adanya pola perbedaan yang relatif konsisten antara kedua sumber data.

Seluruh titik pengamatan juga masih berada dalam batas kesepakatan (limits of agreement) ±1,96 standar deviasi. Hal ini menunjukkan variasi perbedaan kedua data masih berada dalam rentang yang dapat diterima secara statistik, sehingga kedua sumber data masih memiliki tingkat kesepakatan yang cukup baik pada level agregat.

Meskipun demikian, terdapat beberapa wilayah yang menonjol. Kota Kendari memiliki nilai yang jauh lebih tinggi dibandingkan wilayah lain sehingga menjadi outlier dalam distribusi data. Sementara itu, Kabupaten Kolaka dan Konawe menunjukkan selisih estimasi yang relatif lebih besar dibandingkan kabupaten/kota lainnya. Oleh karena itu, wilayah-wilayah tersebut perlu mendapat perhatian lebih lanjut dalam proses validasi dan rekonsiliasi data untuk memastikan konsistensi pencatatan antara kedua sumber data.


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIlBlbWVyaWtzYWFuIEtvaGVyZW5zaSBJbmRpa2F0b3IgPGJyPiBkYXJpIFN1bWJlciBEYXRhIEJlcmJlZGEiDQphdXRob3I6ICJTYXB0YSBIYXN0aG8gUG9uY28iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogam91cm5hbA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHl7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpEYWxhbSBlcmEgdHJhbnNmb3JtYXNpIGRpZ2l0YWwgZGFuIGtlYmlqYWthbiBTYXR1IERhdGEgSW5kb25lc2lhLCBrb252ZXJnZW5zaSBhbnRhcmEgZGF0YSBiZXJiYXNpcyBzdXJ2ZWkgc2FtcGxpbmcgZGVuZ2FuIGRhdGEgcmVnaXN0cmFzaSBhZG1pbmlzdHJhdGlmIHNla3RvcmFsIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBpbGFyIHBlbnRpbmcgZGFsYW0gbWVuamFnYSBrdWFsaXRhcyBzdGF0aXN0aWsgbmFzaW9uYWwuIA0KDQpLYWppYW4gaW5pIHNlY2FyYSBraHVzdXMgbWVuZWxhYWgga29oZXJlbnNpIGRhdGEgbGV2ZWwga2FidXBhdGVuL2tvdGEgbWVuZ2d1bmFrYW4gZHVhIGluc3RydW1lbiBzdGF0aXN0aWsgeWFuZyBiZXJiZWRhLg0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWR4bCkNCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kc2V0d2QoIkQ6XFwyLiBQZW5nZW1iYW5nYW4gZGlyaVxcMSBFeGVyY2lzZSBCYWd1c1xcS29oZXJlbnNpIERhdGEiKQ0KbmFtYV9maWxlIDwtICJCYWNrbG9nMSBEVFNFTiB2MiBkYW4gU3VzZW5hcyAyMDI2Xzc0MDAueGxzeCINCmBgYA0KDQoqKkxvYWQgRGF0YSoqDQoNCmBgYHtyfQ0KZGZfdGhldGEgPC0gcmVhZF9leGNlbChuYW1hX2ZpbGUpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0YUQgICA9IGFzLm51bWVyaWMoRGF0YV9EKSwNCiAgICBEYXRhUyA9IGFzLm51bWVyaWMoRGF0YV9TKQ0KICApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERhdGFfRCkgJiAhaXMubmEoRGF0YV9TKSkNCiNwcmludChoZWFkKGRmX3RoZXRhLCAzKSkNCmBgYA0KDQojIFVrdXJhbiBNZXRyaWsgS29uc2lzdGVuc2kNCg0KLSBSYXRhLXJhdGEgQmlhcyAoKmJpYXMqKTogVWt1cmFuIGluaSBtZW5naGl0dW5nIHJhdGEtcmF0YSBzZWxpc2loIG11cm5pIGFudGFyYSBrZWR1YSBzdW1iZXIgZGF0YS4gQW5na2EgYmlhcyB5YW5nIGJlcm5pbGFpIHBvc2l0aWYgdGluZ2dpIG1lbmdvbmZpcm1hc2kgc2VjYXJhIGVtcGlyaXMgYWRhbnlhIGtlY2VuZGVydW5nYW4gc2lzdGVtYXRpcyAoKnN5c3RlbWF0aWMgZXJyb3Ivb3ZlcnN0YXRlbWVudCopIGRpIG1hbmEgcGVuY2F0YXRhbiBiZXJiYXNpcyBLZWx1YXJnYSBzZWNhcmEga29uc2lzdGVuIG1lbmdoYXNpbGthbiB2b2x1bWUgeWFuZyBsZWJpaCBtYXNpZiBkaWJhbmRpbmcgZXN0aW1hc2kgc2FtcGxpbmcgUnVtYWggVGFuZ2dhLg0KDQotIFJNU0UgKCpSb290IE1lYW4gU3F1YXJlIEVycm9yKik6IFVrdXJhbiBpbmkgbWVuZ3VrdXIgYWthciBkYXJpIHJhdGEtcmF0YSBrdWFkcmF0IHNlbGlzaWggZGF0YS4gS2FyZW5hIG1lbmVyYXBrYW4gb3BlcmFzaSBrdWFkcmF0LCBSTVNFIGJlcnRpbmRhayBzZWJhZ2FpIGluc3RydW1lbiB5YW5nIG1lbWJlcmlrYW4gYm9ib3Qgc2FuZ2F0IHNlbnNpdGlmIHRlcmhhZGFwIGthYnVwYXRlbiB5YW5nIG1lbWlsaWtpIGxvbXBhdGFuIHBlcmJlZGFhbiBhbmdrYSB5YW5nIHNhbmdhdCBla3N0cmVtIChvdXRsaWVyKS4gU2VtYWtpbiBrZWNpbCBuaWxhaSBSTVNFLCBzZW1ha2luIGtvbnNpc3RlbiBrZWRla2F0YW4gYW50YXItdmFyaWFiZWwuDQoNCi0gTUFQRSAoKk1lYW4gQWJzb2x1dGUgUGVyY2VudGFnZSBFcnJvciopOiBNZW55YXRha2FuIHJhdGEtcmF0YSBwZXJzZW50YXNlIGtlc2FsYWhhbiBhYnNvbHV0IHJlbGF0aWYuIFVrdXJhbiBpbmkgc2FuZ2F0IGVmZWt0aWYgZGlndW5ha2FuIHVudHVrIG1lbmVyamVtYWhrYW4gdGluZ2thdCBkZXZpYXNpIGRhdGEga2VwYWRhIHBlbWFuZ2t1IGtlYmlqYWthbiBub24tc3RhdGlzdGlrLCBrYXJlbmEgbGFuZ3N1bmcgbWVyZXByZXNlbnRhc2lrYW4gcHJvcG9yc2kgcGVyc2VudGFzZSBwZW55aW1wYW5nYW4gZGkgdGluZ2thdCBsYXBhbmdhbi4NCg0KYGBge3J9DQpkZl90aGV0YSA8LSBkZl90aGV0YSAlPiUNCiAgbXV0YXRlKA0KICAgIHNlbGlzaWggICAgICAgPSBEYXRhRCAtIERhdGFTLA0KICAgIHJhdGFfcmF0YSAgICAgPSAoRGF0YUQgKyBEYXRhUykgLyAyLA0KICAgIGFwZSAgICAgICAgICAgPSBhYnMoRGF0YUQgLSBEYXRhUykgLyBEYXRhUyAqIDEwMCwNCiAgICByYW5rX0RhdGFEICAgID0gcmFuaygtRGF0YUQpLA0KICAgIHJhbmtfRGF0YVMgID0gcmFuaygtRGF0YVMpLA0KICAgIHNlbGlzaWhfcmFuayAgPSBhYnMocmFua19EYXRhRCAtIHJhbmtfRGF0YVMpDQogICkNCmJpYXMgPC0gbWVhbihkZl90aGV0YSRzZWxpc2loKQ0Kcm1zZSA8LSBzcXJ0KG1lYW4oKGRmX3RoZXRhJERhdGFEIC0gZGZfdGhldGEkRGF0YVMpXjIpKQ0KbWFwZSA8LSBtZWFuKGRmX3RoZXRhJGFwZSkNCg0KbWV0cmlrIDwtIHJvdW5kKGMoYmlhcywgcm1zZSwgbWFwZSksIDIpDQpuYW1lcyhtZXRyaWspIDwtIGMoImJpYXMiLCAicm1zZSIsICJtYXBlIikNCm1ldHJpaw0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKioNCg0KSGFzaWwgZXZhbHVhc2kgbWV0cmlrIG1lbnVuanVra2FuIHRpbmdrYXQgZGV2aWFzaSBhYnNvbHV0IHlhbmcgYmVzYXIgYW50YXJhIGtlZHVhIGRhdGEsIGRpY2VybWlua2FuIG9sZWggbmlsYWkgKipCaWFzIHNlYmVzYXIgMi4yMjAsMDEgdW5pdCwgUk1TRSBzZWJlc2FyIDMuOTE2LDE3IHVuaXQsIGRhbiBwZW55aW1wYW5nYW4gcmVsYXRpZiBNQVBFIG1lbmNhcGFpIDI3NywyMiUqKi4gRGV2aWFzaSB5YW5nIHRpbmdnaSBpbmkgbWVuZWdhc2thbiBiYWh3YSBrZWR1YSBzdW1iZXIgZGF0YSBtZW1pbGlraSBrYXJha3RlcmlzdGlrIHBvcHVsYXNpIGRhbiBkZWZpbmlzaSBvcGVyYXNpb25hbCB5YW5nIGJlcmJlZGEgbnlhdGEuDQoNCk9sZWgga2FyZW5hIGl0dSwgZm9rdXMgcGVtZXJpa3NhYW4ga29oZXJlbnNpIHRpZGFrIGJvbGVoIGJlcnR1bXB1IHBhZGEga2VkZWthdGFuIGFuZ2thIG51bWVyaWtueWEsIG1lbGFpbmthbiBoYXJ1cyBkaWFsaWhrYW4gcGFkYSBrZXNlbGFyYXNhbiBhcmFoIHRyZW4gZGFuIGtvbnNpc3RlbnNpIHBlcmluZ2thdCB3aWxheWFoIChLb3JlbGFzaSBTcGVhcm1hbikuIFNlbGFtYSBrb3JlbGFzaSBwZXJpbmdrYXRueWEga3VhdCwga2VkdWEgZGF0YSBpbmkgdGV0YXAgYW1hbiBkaWd1bmFrYW4gc2ViYWdhaSBkYXNhciBwZW5lbnR1YW4gd2lsYXlhaCBwcmlvcml0YXMgaW50ZXJ2ZW5zaSBrZWJpamFrYW4uIg0KDQoNCiMgVWppIFN0YXRpc3Rpaw0KDQojIyBLb3JlbGFzaSBTcGVhcm1hbg0KDQpLb3JlbGFzaSBQZXJpbmdrYXQgU3BlYXJtYW4gZGlndW5ha2FuIHVudHVrIG1lbmd1amkgKipLb2hlcmVuc2kgVHJlbiAoQXJhaCBLZWJpamFrYW4pKiouIEtvZWZpc2llbiBrb3JlbGFzaSAoJFJobyQpIHlhbmcgbWVuZGVrYXRpIG5pbGFpIDEgbWVuYW5kYWthbiBrZXNlbGFyYXNhbiBwZXJpbmdrYXQgeWFuZyBrdWF0OyBhcnRpbnlhIGthYnVwYXRlbiB5YW5nIGRpa2F0ZWdvcmlrYW4gcmF3YW4gb2xlaCBEYXRhIFMgc2VjYXJhIGtvbnNpc3RlbiBqdWdhIGRpbmlsYWkgcmF3YW4gb2xlaCBEYXRhIEQuIE5pbGFpIHNpZ25pZmlrYW5zaSAoJHBcdGV4dHstdmFsdWV9IDwgMC4wNSQpIG1lbmphZGkgYnVrdGkgYWJzb2x1dCBiYWh3YSBrZXNlbGFyYXNhbiB0cmVuIHRlcnNlYnV0IG55YXRhIHRlcmphZGkgZGkgcG9wdWxhc2ksIGJ1a2FuIGthcmVuYSBmYWt0b3Iga2ViZXR1bGFuICgqcmFuZG9tIGVycm9yKikuDQoNCg0KYGBge3J9DQoNCnVqaV9rb3JlbGFzaSA8LSBjb3IudGVzdChkZl90aGV0YSREYXRhUywgZGZfdGhldGEkRGF0YUQsIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQp1amlfa29yZWxhc2kNCmBgYA0KDQojIyBXaWxjb3hvbiBTaWduZWQtUmFuaw0KDQpXaWxjb3hvbiBTaWduZWQtUmFuayBkaWd1bmFrYW4gdW50dWsgbWVuZ3VqaSBLZXNhbWFhbiBOaWxhaSBBYnNvbHV0IEJlcnBhc2FuZ2FuLiBVamkgbm9uLXBhcmFtZXRyaWsgaW5pIG1lbmdvbmZpcm1hc2kgYXBha2FoIHBlcmJlZGFhbiBub21pbmFsIGRpIHRpbmdrYXQga2FidXBhdGVuL2tvdGEgYmVybWFrbmEgc2VjYXJhIHN0YXRpc3Rpay4gSGFzaWwgJHBcdGV4dHstdmFsdWV9IDwgMC4wNSQgbWVub2xhayBoaXBvdGVzaXMga2VzYW1hYW4gZGF0YSwgeWFuZyBzZWNhcmEgbWV0b2RvbG9naXMgbWVsZWdpdGltYXNpIGJhaHdhIGtlZHVhIGRhdGEgbWVtYW5nIHRpZGFrIGJpc2EgZGlzYW1ha2FuIHNlY2FyYSBhbmdrYSBtdXRsYWsgYWtpYmF0IHBlcmJlZGFhbiBkZWZpbmlzaSB1bml0IGFuYWxpc2lzIChSdW1haCBUYW5nZ2EgdnMgS2VsdWFyZ2EpLg0KDQoNCmBgYHtyfQ0KdWppX2JlZGEgPC0gd2lsY294LnRlc3QoZGZfdGhldGEkRGF0YVMsIGRmX3RoZXRhJERhdGFELCBwYWlyZWQgPSBUUlVFKQ0KdWppX2JlZGEgDQpgYGANCg0KDQpgYGB7cn0NCnZhbGlkYXNpIDwtIHJvdW5kKGModWppX2tvcmVsYXNpJGVzdGltYXRlLCB1amlfa29yZWxhc2kkcC52YWx1ZSwgdWppX2JlZGEkcC52YWx1ZSksIDQpDQpuYW1lcyh2YWxpZGFzaSkgPC0gYygiciBTcGVhcm1hbiIsICJwLXZhbHVlIHIgU3BlYXJtYW4iLCAicC12YWx1ZSBXaWxjb3giKQ0KdmFsaWRhc2kNCmBgYA0KDQoqKkludGVycHJldGFzaSoqDQoNCiogSGFzaWwgS29yZWxhc2kgU3BlYXJtYW4gbWVtYnVrdGlrYW4ga2VkdWEgZGF0YSBpbmkgc2FuZ2F0IGtvaGVyZW4gc2VjYXJhIHNpZ25pZmlrYW4gKCRccmhvID0gMCw2OTQ7IHAgPSAwLDAwMjckKS4NCg0KKiBEZW5nYW4gZGVtaWtpYW4sIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhIGtlZHVhIHN1bWJlciBkYXRhIG1lbWJlcmlrYW4gcGVuaWxhaWFuIHBlcmluZ2thdCB5YW5nIHNldGFyYSBkYW4ga29uc2lzdGVuLiBQZW5nYW1iaWwga2ViaWpha2FuIGRhcGF0IG1lbmdndW5ha2FuIGtlZHVhIGRhdGEgaW5pIGRlbmdhbiBhbWFuIHVudHVrIG1lbGFrdWthbiBwZW5ldGFwYW4gcHJpb3JpdGFzIHdpbGF5YWggaW50ZXJ2ZW5zaSBwcm9ncmFtLCBrYXJlbmEgZGFlcmFoIHByaW9yaXRhcyB5YW5nIGRpdHVuanVra2FuIG9sZWgga2VkdWEgZGF0YSB0ZXJidWt0aSBzZXJ1cGEgc2VjYXJhIHN0YXRpc3Rpay4NCg0KDQojIFJhbmtpbmcgV2lsYXlhaA0KDQpgYGB7cn0NCnByaW50KCItLS0tLSAxMCBXSUxBWUFIIERFTkdBTiBBTk9NQUxJIFBFUkJFREFBTiBSQU5LSU5HIFRFUkJFU0FSIC0tLS0tIikNCmRmX3RoZXRhICU+JQ0KICBhcnJhbmdlKGRlc2Moc2VsaXNpaF9yYW5rKSkgJT4lDQogIHNlbGVjdChrYWJ1cGF0ZW5fa290YSwgRGF0YUQsIERhdGFTLCByYW5rX0RhdGFELCByYW5rX0RhdGFTLCBzZWxpc2loX3JhbmspICU+JQ0KICBoZWFkKDEwKSAlPiUNCiAgcHJpbnQoKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKioNCg0KQmVyZGFzYXJrYW4gaGFzaWwgcGVyYW5na2luZ2FuLCBtZXNraXB1biB0ZXJkYXBhdCBrb3JlbGFzaSB0cmVuIHlhbmcga3VhdCwgdGVyZGFwYXQgMTAgd2lsYXlhaCBhbm9tYWxpIHlhbmcgbWVudW5qdWtrYW4gcGVyYmVkYWFuIHBlcmluZ2thdCBkZW5nYW4gcmVudGFuZyBwZXJnZXNlcmFuIGFudGFyYSAxIGhpbmdnYSA4IHRpbmdrYXQuIEthYnVwYXRlbiBLb2xha2EgbWVuamFkaSBrYWJ1cGF0ZW4gZGVuZ2FuIGFub21hbGkgdGVydGluZ2dpIGthcmVuYSBtZW5kdWR1a2kgcG9zaXNpIGF0YXMgZGkgcGVyaW5na2F0IGtlLTIgcGFkYSBEYXRhIEQgZGVuZ2FuIHZvbHVtZSA4LjgzMiB1bml0LCBuYW11biBwYWRhIERhdGEgUyBtZW5qYWRpIHBlcmluZ2thdCBrZS0xMCAoc2ViYW55YWsgMS40MDMgdW5pdCkuIA0KDQpLb25kaXNpIGFub21hbGkgeWFuZyBoYW1waXIgc2FtYSBqdWdhIHRlcmphZGkgZGkgS2FidXBhdGVuIEJvbWJhbmEgZGFuIEthYnVwYXRlbiBCdXRvbiwgZGkgbWFuYSBrZWR1YSB3aWxheWFoIGluaSBkaW5pbGFpIGphdWggbGViaWggdGluZ2dpIGRpIERhdGEgUyAobWFzaW5nLW1hc2luZyBtZW5kdWR1a2kgcGVyaW5na2F0IGtlLTQgZGFuIGtlLTMpIGRpYmFuZGluZ2thbiBwYWRhIERhdGEgRCB5YW5nIG1lbmVtcGF0a2FuIGRpIHBlcmluZ2thdCBrZS0xMSBkYW4ga2UtOS4NCg0KDQojIFZpc3VhbGlzYXNpDQoNCiMjIFNjYXR0ZXIgUGxvdA0KDQpTY2F0dGVyIFBsb3QgS29oZXJlbnNpIG1lbWV0YWthbiBwb3Npc2kga29vcmRpbmF0IHNlbHVydWgga2FidXBhdGVuL2tvdGEuIA0KDQpHcmFmaWsgaW5pIGRpbGVuZ2thcGkgZGVuZ2FuIEdhcmlzIEtlc2FtYWFuIElkZWFsICgkWT1YJCkgYmVyd2FybmEgYmlydSBzZWJhZ2FpIHBhdG9rYW4gamlrYSBrZWR1YSBkYXRhIHNhbWEgcGVyc2lzLCBzZXJ0YSBHYXJpcyBUcmVuIExpbmllciBBa3R1YWwgKFJlZ3Jlc2kpIGJlcndhcm5hIG1lcmFoIHB1dHVzLXB1dHVzLiBLZWRla2F0YW4gZGFuIGtlY29uZG9uZ2FuIGdhcmlzIG1lcmFoIHlhbmcgc2VhcmFoIGRlbmdhbiBnYXJpcyBiaXJ1IG1lbmphZGkga29uZmlybWFzaSB2aXN1YWwgbGFuZ3N1bmcgbWVuZ2VuYWkgdGluZ2thdCBrb2hlcmVuc2kgc3Bhc2lhbCBkYXRhLg0KDQpgYGB7cn0NCnBsb3Rfa29oZXJlbnNpIDwtIGdncGxvdChkZl90aGV0YSwgYWVzKHggPSBEYXRhRCwgeSA9IERhdGFTKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gIiMxYWJjOWMiLCBzaXplID0gNCwgYWxwaGEgPSAwLjkpICsNCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICIjMzQ5OGRiIiwgbGluZXdpZHRoID0gMSkgKyAjIEdhcmlzIElkZWFsIFk9WA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2UgPSBUUlVFLCBmaWxsID0gIiNmMzljMTIiLCBhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0ga2FidXBhdGVuX2tvdGEpLCB2anVzdCA9IC0xLjIsIHNpemUgPSAzLCBjaGVja19vdmVybGFwID0gVFJVRSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJTY2F0dGVyIFBsb3QgS29oZXJlbnNpIEluZGlrYXRvciIsDQogICAgc3VidGl0bGUgPSBwYXN0ZSgiU3BlYXJtYW4gUmhvID0iLCByb3VuZCh1amlfa29yZWxhc2kkZXN0aW1hdGUsIDMpLCAiIHwgTUFQRSA9Iiwgcm91bmQobWFwZSwgMiksICIlIiksDQogICAgeCA9ICJKdW1sYWggSW5kaWthdG9yIChEYXRhIFMpIiwNCiAgICB5ID0gIkp1bWxhaCBJbmRpa2F0b3IgKERhdGEgRCkiLA0KICAgIGNhcHRpb24gPSAiR2FyaXMgYmlydSBzb2xpZCBtZW51bmp1a2thbiBnYXJpcyBrZXNhbWFhbiBpZGVhbCAoRGF0YSBEID0gRGF0YSBTKSBcbiBHYXJpcyBtZXJhaCBwdXR1cy1wdXR1cyBtZW51bmp1a2thbiB0cmVuIHJlZ3Jlc2kgYWt0dWFsIGRhdGEgbGFwYW5nYW4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0LCBjb2xvciA9ICIjMmMzZTUwIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMmMzZTUwIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCnByaW50KHBsb3Rfa29oZXJlbnNpKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKioNCg0KU2ViYXJhbiB0aXRpayBwYWRhIGdyYWZpayBtZW51bmp1a2thbiBiYWh3YSBzZWJhZ2lhbiBiZXNhciBrYWJ1cGF0ZW4va290YSB0ZXJrb25zZW50cmFzaSBwYWRhIGtlbG9tcG9rIHlhbmcgcmVsYXRpZiByZW5kYWggZGFuIGhvbW9nZW4uIEtvbmRpc2kgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBtYXlvcml0YXMgd2lsYXlhaCBtZW1pbGlraSB0aW5na2F0IGtlYnV0dWhhbiBwZXJ1bWFoYW4geWFuZyB0aWRhayB0ZXJsYWx1IHRpbmdnaSBzZXJ0YSBtZW51bmp1a2thbiBrZXNlc3VhaWFuIHlhbmcgY3VrdXAgYmFpayBhbnRhcmEga2VkdWEgc3VtYmVyIGRhdGEuDQoNCk1lc2tpcHVuIGRlbWlraWFuLCBzZWJhZ2lhbiBiZXNhciB0aXRpayBiZXJhZGEgZGkgYmF3YWggZ2FyaXMga2VzYW1hYW4gaWRlYWwsIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGVzdGltYXNpIGJlcmRhc2Fya2FuIERhdGEgRCBjZW5kZXJ1bmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBEYXRhIFMuIFBvbGEgaW5pIG1lbmNlcm1pbmthbiBhZGFueWEgZmVub21lbmEgYmViZXJhcGEga2VwYWxhIGtlbHVhcmdhIHlhbmcgbWVuZW1wYXRpIHNhdHUgdW5pdCBydW1haCB5YW5nIHNhbWEsIHNlaGluZ2dhIGp1bWxhaCBrZWx1YXJnYSB5YW5nIG1lbWJ1dHVoa2FuIGh1bmlhbiB0ZXJjYXRhdCBsZWJpaCBiZXNhci4gVGVtdWFuIGluaSBtZW51bmp1a2thbiBiYWh3YSBwZXJlbmNhbmFhbiBpbnRlcnZlbnNpIHBlcnVtYWhhbiBwZXJsdSBtZW1wZXJ0aW1iYW5na2FuIHRpZGFrIGhhbnlhIGp1bWxhaCBydW1haCB5YW5nIHRlcnNlZGlhLCB0ZXRhcGkganVnYSBqdW1sYWgga2VsdWFyZ2EgeWFuZyBtZW5lbXBhdGlueWEuDQoNClNlbGFpbiBpdHUsIEtvdGEgS2VuZGFyaSB0YW1wYWsgc2ViYWdhaSBvdXRsaWVyIHlhbmcgdGVycGlzYWggamF1aCBkYXJpIHdpbGF5YWggbGFpbm55YSBkZW5nYW4gbmlsYWkgdGVydGluZ2dpIHBhZGEga2VkdWEgc3VtYmVyIGRhdGEuIEtvbmRpc2kgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBwZXJtYXNhbGFoYW4gZGkgS290YSBLZW5kYXJpIHJlbGF0aWYgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBrYWJ1cGF0ZW4va290YSBsYWluIGRpIFByb3ZpbnNpIFN1bGF3ZXNpIFRlbmdnYXJhLCB5YW5nIGtlbXVuZ2tpbmFuIGJlcmthaXRhbiBkZW5nYW4gdGluZ2dpbnlhIGtvbnNlbnRyYXNpIHBlbmR1ZHVrIGRhbiBha3Rpdml0YXMgcGVya290YWFuLg0KDQojIyBCbGFuZC1BbHRtYW4gUGxvdA0KDQpCbGFuZC1BbHRtYW4gUGxvdCBtZXJ1cGFrYW4gbWV0b2RlIHN0YW5kYXIgdmlzdWFsaXNhc2kgZGFsYW0gYW5hbGlzaXMga2VzZXBha2F0YW4gKCpBZ3JlZW1lbnQgQW5hbHlzaXMqKSBkdWEgaW5zdHJ1bWVuIHBlbmd1a3VyYW4uIA0KDQpTdW1idSBYIG1lbWV0YWthbiByYXRhLXJhdGEgbmlsYWksIHNlbWVudGFyYSBzdW1idSBZIG1lbWV0YWthbiBzZWxpc2lobnlhLiBHcmFmaWsgaW5pIG1lbWV0YWthbiBhcGFrYWggc2ViYXJhbiBrYWJ1cGF0ZW4va290YSBtYXNpaCBiZXJhZGEgZGkgZGFsYW0ga29yaWRvciBiYXRhcyB0b2xlcmFuc2kgbWFrcm8geWFuZyBhbWFuLCB5YWl0dSBkaSBhbnRhcmEgcmVudGFuZyBiYXRhcyBhdGFzIGRhbiBiYXRhcyBiYXdhaCBMaW1pdHMgb2YgQWdyZWVtZW50ICgkXHBtIDEuOTYgXHRleHR7IFN0YW5kYXIgRGV2aWFzaX0kKS4gVGl0aWsgd2lsYXlhaCB5YW5nIG1lbG9tcGF0IGtlbHVhciBkYXJpIGJhdGFzIGdhcmlzIGhpamF1IHB1dHVzLXB1dHVzIHNlY2FyYSB2aXN1YWwgdGVyaWRlbnRpZmlrYXNpIHNlYmFnYWkgcGVuY2lsYW4geWFuZyBtZW1pbGlraSBrZXNhbGFoYW4gc2lzdGVtaWsga2h1c3VzIGRpIGxhcGFuZ2FuLg0KDQpgYGB7cn0NCm1lYW5fZGlmZiAgIDwtIGJpYXMNCnNkX2RpZmYgICAgIDwtIHNkKGRmX3RoZXRhJHNlbGlzaWgpDQp1cHBlcl9saW1pdCA8LSBtZWFuX2RpZmYgKyAxLjk2ICogc2RfZGlmZg0KbG93ZXJfbGltaXQgPC0gbWVhbl9kaWZmIC0gMS45NiAqIHNkX2RpZmYNCg0KcGxvdF9ibGFuZCA8LSBnZ3Bsb3QoZGZfdGhldGEsIGFlcyh4ID0gcmF0YV9yYXRhLCB5ID0gc2VsaXNpaCkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjMzQ5OGRiIiwgc2l6ZSA9IDMuNSwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbl9kaWZmLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXdpZHRoID0gMS4yKSArICMgR2FyaXMgTmlsYWkgQmlhcyByYXRhLXJhdGENCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdXBwZXJfbGltaXQsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV3aWR0aCA9IDAuOCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBsb3dlcl9saW1pdCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXdpZHRoID0gMC44KSArDQogICMgVGVrcyBJbmRpa2F0b3IgQmF0YXMgVG9sZXJhbnNpIHBhZGEgR3JhZmlrDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IG1heChkZl90aGV0YSRyYXRhX3JhdGEpKjAuODUsIHkgPSB1cHBlcl9saW1pdCwgbGFiZWwgPSBwYXN0ZSgiQmF0YXMgQXRhcyAoKzEuOTYgU0QpOiIsIHJvdW5kKHVwcGVyX2xpbWl0LCAxKSksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gbWF4KGRmX3RoZXRhJHJhdGFfcmF0YSkqMC44NSwgeSA9IG1lYW5fZGlmZiwgbGFiZWwgPSBwYXN0ZSgiTWVhbiBCaWFzOiIsIHJvdW5kKG1lYW5fZGlmZiwgMSkpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gIiNlNzRjM2MiLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtYXgoZGZfdGhldGEkcmF0YV9yYXRhKSowLjg1LCB5ID0gbG93ZXJfbGltaXQsIGxhYmVsID0gcGFzdGUoIkJhdGFzIEJhd2FoICgtMS45NiBTRCk6Iiwgcm91bmQobG93ZXJfbGltaXQsIDEpKSwgdmp1c3QgPSAxLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSAzKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBrYWJ1cGF0ZW5fa290YSksIHZqdXN0ID0gLTAuOCwgc2l6ZSA9IDIuOCwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCbGFuZC1BbHRtYW4gUGxvdCBLZXNlcGFrYXRhbiBNZXRvZGUgRGF0YSIsDQogICAgc3VidGl0bGUgPSBwYXN0ZSgiUGVueWViYXJhbiBLYWJ1cGF0ZW4vS290YSB0ZXJoYWRhcCBSZW50YW5nIEJhdGFzIFRvbGVyYW5zaSBNYWtybyAoQmlhczoiLCByb3VuZChtZWFuX2RpZmYsIDIpLCAiKSIpLA0KICAgIHggPSAiUmF0YS1yYXRhIE5pbGFpIChEYXRhIEQgZGFuIFMpIiwNCiAgICB5ID0gIlNlbGlzaWggUGVuZ3VrdXJhbiAoRGF0YSBEIC0gRGF0YSBTKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwcmludChwbG90X2JsYW5kKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKioNCg0KR3JhZmlrIEJsYW5kLUFsdG1hbiBtZW51bmp1a2thbiBzZWNhcmEgdW11bSBEYXRhIEQgbWVuZ2hhc2lsa2FuIGluZGlrYXRvciB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gRGF0YSBTICh0ZXJnYW1iYXIgZGFyaSBuaWxhaSBiaWFzIHBvc2l0aWYgc2ViZXNhciAyLjIyMCkuIFNlYmFnaWFuIGJlc2FyIGthYnVwYXRlbi9rb3RhIGJlcmFkYSBkaSBzZWtpdGFyIGdhcmlzIHJhdGEtcmF0YSBzZWxpc2loLCB5YW5nIG1lbmdpbmRpa2FzaWthbiBhZGFueWEgcG9sYSBwZXJiZWRhYW4geWFuZyByZWxhdGlmIGtvbnNpc3RlbiBhbnRhcmEga2VkdWEgc3VtYmVyIGRhdGEuDQoNClNlbHVydWggdGl0aWsgcGVuZ2FtYXRhbiBqdWdhIG1hc2loIGJlcmFkYSBkYWxhbSBiYXRhcyBrZXNlcGFrYXRhbiAoKmxpbWl0cyBvZiBhZ3JlZW1lbnQqKSDCsTEsOTYgc3RhbmRhciBkZXZpYXNpLiBIYWwgaW5pIG1lbnVuanVra2FuIHZhcmlhc2kgcGVyYmVkYWFuIGtlZHVhIGRhdGEgbWFzaWggYmVyYWRhIGRhbGFtIHJlbnRhbmcgeWFuZyBkYXBhdCBkaXRlcmltYSBzZWNhcmEgc3RhdGlzdGlrLCBzZWhpbmdnYSBrZWR1YSBzdW1iZXIgZGF0YSBtYXNpaCBtZW1pbGlraSB0aW5na2F0IGtlc2VwYWthdGFuIHlhbmcgY3VrdXAgYmFpayBwYWRhIGxldmVsIGFncmVnYXQuDQoNCk1lc2tpcHVuIGRlbWlraWFuLCB0ZXJkYXBhdCBiZWJlcmFwYSB3aWxheWFoIHlhbmcgbWVub25qb2wuIEtvdGEgS2VuZGFyaSBtZW1pbGlraSBuaWxhaSB5YW5nIGphdWggbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiB3aWxheWFoIGxhaW4gc2VoaW5nZ2EgbWVuamFkaSBvdXRsaWVyIGRhbGFtIGRpc3RyaWJ1c2kgZGF0YS4gU2VtZW50YXJhIGl0dSwgS2FidXBhdGVuIEtvbGFrYSBkYW4gS29uYXdlIG1lbnVuanVra2FuIHNlbGlzaWggZXN0aW1hc2kgeWFuZyByZWxhdGlmIGxlYmloIGJlc2FyIGRpYmFuZGluZ2thbiBrYWJ1cGF0ZW4va290YSBsYWlubnlhLiBPbGVoIGthcmVuYSBpdHUsIHdpbGF5YWgtd2lsYXlhaCB0ZXJzZWJ1dCBwZXJsdSBtZW5kYXBhdCBwZXJoYXRpYW4gbGViaWggbGFuanV0IGRhbGFtIHByb3NlcyB2YWxpZGFzaSBkYW4gcmVrb25zaWxpYXNpIGRhdGEgdW50dWsgbWVtYXN0aWthbiBrb25zaXN0ZW5zaSBwZW5jYXRhdGFuIGFudGFyYSBrZWR1YSBzdW1iZXIgZGF0YS4NCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBEaXJla3RvcmF0IFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCwgQlBTLCBzYXB0YWhhc0BicHMuZ28uaWQNCg0KDQoNCg0K