Housing Cost Burden (HCB) merupakan indikator yang digunakan untuk mengukur tingkat tekanan biaya perumahan terhadap rumah tangga, yang umumnya didefinisikan sebagai kondisi ketika rumah tangga mengalokasikan 30 persen atau lebih dari total pengeluarannya untuk biaya perumahan. Indikator ini banyak digunakan dalam analisis kesejahteraan karena mencerminkan keterjangkauan perumahan serta potensi kerentanan ekonomi rumah tangga (Stone, 2006; Joint Center for Housing Studies of Harvard University, 2023).

Dalam konteks negara berkembang, termasuk Indonesia, variasi HCB antardaerah dipengaruhi oleh perbedaan harga rumah dan sewa, struktur pasar tenaga kerja, tingkat urbanisasi, serta akses terhadap infrastruktur dan bahan bangunan. Oleh karena itu, analisis HCB secara spasial hingga tingkat kabupaten/kota menjadi penting untuk mengidentifikasi ketimpangan keterjangkauan perumahan antarwilayah (World Bank, 2019).

Data survei rumah tangga seperti Survei Sosial Ekonomi Nasional (Susenas) memungkinkan pengukuran HCB secara komprehensif karena mencakup komponen pengeluaran perumahan dan karakteristik sosial ekonomi rumah tangga. Pemanfaatan data ini memberikan dasar empiris yang kuat dalam perumusan kebijakan perumahan yang lebih tepat sasaran.

knitr::opts_chunk$set(echo = TRUE)

Data yang digunakan adalah Susenas Konsumsi dan Pengeluaran (KP) Maret 2025.

1 Housing Cost Burden

Housing Cost Burden (HCB) dihitung sebagai rasio pengeluaran perumahan terhadap total pengeluaran rumah tangga. Ambang batas 30 persen digunakan untuk mengklasifikasikan rumah tangga sebagai unaffordable, mengikuti praktik yang luas digunakan dalam literatur kebijakan perumahan dan perencanaan kota. Meskipun ambang ini bersifat normatif, berbagai studi menunjukkan bahwa rumah tangga dengan rasio pengeluaran perumahan di atas 30 persen cenderung mengalami penurunan konsumsi kebutuhan dasar lainnya dan peningkatan kerentanan ekonomi (Kutty, 2005).

Dalam analisis ini, pengeluaran perumahan mencakup biaya sewa aktual maupun imputasi sewa rumah milik sendiri, utilitas dasar (listrik dan air), dan energi bahan bakar untuk memasak. Pendekatan agregatif ini sejalan dengan praktik pengukuran pengeluaran perumahan dalam survei rumah tangga nasional dan internasional.

dataku <- dataku %>%
  mutate(kabu = r101*100 + r102) %>%
  rename(prov="r101", kab="r102") %>%
  mutate(denom=100) %>%
  mutate(
    exp_housing = rowSums(across(
      c(sebulan_228, sebulan_229, sebulan_230, sebulan_231,
        sebulan_234, sebulan_236,
        sebulan_253, sebulan_255, sebulan_257,
        sebulan_259, sebulan_260, sebulan_261),
      ~replace_na(., 0)
    )),
    AMBANG = (exp_housing / expend) * 100,
    HCB = if_else(AMBANG > 30, 100, 0)
  )

2 Set Design Sampling

Design sampling yang digunakan mengikuti design sampling yang dilakukan pada SPSS yaitu Cluster Sampling design with replacement.

susenas.design<- svydesign(id=~psu, strata=~strata, data = dataku, weights=~fwt)
susenas.design
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (34473) clusters.
## svydesign(id = ~psu, strata = ~strata, data = dataku, weights = ~fwt)
summary(susenas.design$prob)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.000201 0.003795 0.008842 0.029646 0.025600 0.968267

3 Set Output Statistics

Kualitas presisi hasil estimasi suatu survei bisa diamati dari nilai RSE yang dihasilkan. Kesalahan sampling dari beberapa estimasi harus digunakan secara hati-hati. Untuk estimasi yang berdasarkan jumlah kasus yang kecil, kesalahan relatif cenderung besar.

Batasan nilai RSE ( Australian Bureau Statistics):

  1. Jika \(RSE \le 25\%\), estimasi bersifat presisi.

  2. Jika \(25\% < RSE \le 50\%\), estimasi perlu dilakukan dengan hati-hati.

  3. Jika \(RSE > 50\%\), estimasi dianggap sangat tidak presisi.

Provinsi

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasilP = svyby(formula = ~HCB, denom= ~denom, ~prov, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasilP[is.na(hasilP)] <- 0
hasilP$theta = round(hasilP$`HCB/denom`*100,2)
hasilP$SE = round(hasilP$`se.HCB/denom`*100,2)
hasilP$VAR = round(hasilP$SE*hasilP$SE,2)
hasilP$CI_LOWER = round(hasilP$`ci_l`*100,2)
hasilP$CI_LOWER[hasilP$CI_LOWER<0] <- 0
hasilP$CI_UPPER = round(hasilP$`ci_u`*100,2)
hasilP$RSE = round(hasilP$`cv%`,2)
hasilP$DEFF = round(hasilP$DEff,2)

Kabupaten/kota

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasil = svyby(formula = ~HCB, denom= ~denom, ~kabu, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasil[is.na(hasil)] <- 0
hasil$theta = round(hasil$`HCB/denom`*100,2)
hasil$SE = round(hasil$`se.HCB/denom`*100,2)
hasil$VAR = round(hasil$SE*hasil$SE,2)
hasil$CI_LOWER = round(hasil$`ci_l`*100,2)
hasil$CI_LOWER[hasil$CI_LOWER<0] <- 0
hasil$CI_UPPER = round(hasil$`ci_u`*100,2)
hasil$RSE = round(hasil$`cv%`,2)
hasil$DEFF = round(hasil$DEff,2)

4 Level Estimate

4.1 Estimation by province

outputP = as.data.frame(cbind(hasilP$prov, hasilP$theta, hasilP$SE, hasilP$VAR, hasilP$CI_LOWER, hasilP$CI_UPPER, hasilP$RSE, hasilP$DEFF))
names(outputP) = c("Prov","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
(outputP[order(outputP$Prov, decreasing = FALSE), ]   )
##    Prov Estimasi   SE  VAR CI LOWER CI UPPER   RSE DEFF
## 1    11     1.27 0.13 0.02     1.01     1.54 10.49 1.96
## 2    12     2.16 0.28 0.08     1.61     2.70 12.90 7.88
## 3    13     2.37 0.24 0.06     1.91     2.84  9.95 2.81
## 4    14     2.18 0.23 0.05     1.72     2.63 10.63 2.16
## 5    15     1.95 0.24 0.06     1.48     2.42 12.36 2.20
## 6    16     2.77 0.33 0.11     2.12     3.42 11.91 4.79
## 7    17     2.16 0.26 0.07     1.65     2.66 11.87 1.87
## 8    18     2.06 0.26 0.07     1.56     2.56 12.45 3.52
## 9    19     4.77 0.56 0.31     3.66     5.87 11.83 3.00
## 10   21     6.64 1.17 1.37     4.34     8.93 17.64 9.24
## 11   31    20.38 1.19 1.42    18.05    22.71  5.83 4.43
## 12   32     6.35 0.27 0.07     5.82     6.87  4.21 2.96
## 13   33     4.38 0.21 0.04     3.98     4.78  4.70 2.97
## 14   34     9.22 0.72 0.52     7.81    10.62  7.77 2.42
## 15   35     4.05 0.18 0.03     3.71     4.40  4.39 2.57
## 16   36     6.64 0.58 0.34     5.50     7.79  8.79 3.89
## 17   51    11.89 0.69 0.48    10.53    13.25  5.82 2.88
## 18   52     4.59 0.46 0.21     3.70     5.48  9.93 3.39
## 19   53     7.57 0.42 0.18     6.75     8.40  5.57 3.36
## 20   61     3.82 0.43 0.18     2.98     4.65 11.13 4.63
## 21   62     5.20 0.44 0.19     4.34     6.06  8.49 3.31
## 22   63     5.41 0.38 0.14     4.67     6.16  7.02 2.47
## 23   64    12.09 0.71 0.50    10.70    13.47  5.84 3.05
## 24   65    12.07 1.31 1.72     9.51    14.62 10.82 4.31
## 25   71     7.45 0.54 0.29     6.39     8.52  7.29 3.68
## 26   72     9.15 0.59 0.35     8.00    10.31  6.45 3.31
## 27   73     8.05 0.51 0.26     7.05     9.05  6.35 5.63
## 28   74     8.63 0.61 0.37     7.44     9.82  7.03 4.41
## 29   75    10.00 0.84 0.71     8.35    11.64  8.41 2.84
## 30   76     4.35 0.52 0.27     3.32     5.37 12.07 2.39
## 31   81    15.59 1.00 1.00    13.62    17.56  6.44 4.67
## 32   82    16.06 1.07 1.14    13.97    18.15  6.64 4.45
## 33   91    17.18 1.26 1.59    14.72    19.65  7.31 3.79
## 34   92    21.34 2.25 5.06    16.92    25.75 10.56 8.91
## 35   94    26.10 1.52 2.31    23.13    29.07  5.81 5.29
## 36   95    12.26 1.43 2.04     9.47    15.06 11.64 3.92
## 37   96    14.40 1.25 1.56    11.94    16.85  8.70 5.57
## 38   97    11.52 1.10 1.21     9.36    13.68  9.56 4.95

Kelompok RSE Provinsi

hasilP <- hasilP %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSEP_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasilP$RSEP_kat, useNA = "ifany")
## 
## < 25% 
##    38

Visualisasi Provinsi

ggplot(hasilP, aes(x = Urut, y = RSE, group = 1, color = RSEP_kat)) +
  geom_point(size = 3) +
  
  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
  
scale_color_manual(
  name = "Kategori RSE",
  limits = c("< 25%", "26–50%", "> 50%"),
  values = c(
    "< 25%"  = "#1B9E77",
    "26–50%" = "#FF8C00",
    "> 50%"  = "#7570B3"
  ),
  na.value = "#D73027",
  drop = FALSE
) +
    labs(
    title = "RSE HCB per Provinsi",
    subtitle = "dengan garis batas RSE 25% dan 50%",
    x = "Provinsi",
    y = "Nilai RSE (%)"
  ) +
  
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 15),
    legend.position = "bottom",
    axis.text.x = element_text(angle = 40, vjust = 1, hjust = 1)
  )

4.2 Estimation by district

output = as.data.frame(cbind(hasil$kabu, hasil$theta, hasil$SE, hasil$VAR, hasil$CI_LOWER, hasil$CI_UPPER, hasil$RSE, hasil$DEFF))
names(output) = c("Kako","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
head((output[order(output$Kako, decreasing = FALSE), ]   ))
##   Kako Estimasi   SE  VAR CI LOWER CI UPPER   RSE DEFF
## 1 1101     0.59 0.31 0.10     0.00     1.19 51.71 0.82
## 2 1102     0.47 0.37 0.14     0.00     1.19 79.43 1.57
## 3 1103     0.77 0.48 0.23     0.00     1.70 61.69 1.85
## 4 1104     0.95 0.51 0.26     0.00     1.96 54.12 1.72
## 5 1105     0.32 0.21 0.04     0.00     0.73 64.23 0.93
## 6 1106     0.97 0.49 0.24     0.01     1.92 50.33 1.48

Kelompok RSE Kabupaten/kota

hasil <- hasil %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSE_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasil$RSE_kat, useNA = "ifany")
## 
##  < 25%  > 50% 26–50%   <NA> 
##    251     39    223      1
hasil_plot <- hasil %>%
  mutate(
    RSE_plot = if_else(is.na(RSE), -2, RSE)  # taruh NA di bawah sumbu
  )

ggplot(hasil_plot, aes(x = Urut, y = RSE_plot, color = RSE_kat)) +
  geom_jitter(width = 0.35, height = 0, size = 1.8, alpha = 0.85) +

  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +

  scale_y_continuous(
    name = "Nilai RSE (%)",
    breaks = c(0, 25, 50),
    limits = c(-5, NA)
  ) +

  scale_color_manual(
    name = "Kategori RSE",
    limits = c("< 25%", "26–50%", "> 50%"),
    values = c(
      "< 25%"  = "#1B9E77",
      "26–50%" = "#FF8C00",
      "> 50%"  = "#7570B3"
    ),
    na.value = "#D73027",
    drop = FALSE
  ) +
  theme_minimal()

Satu kabupaten/kota memiliki nilai RSE = 0 sehingga diperlakukan sebagai data tidak tersedia (NA) dan ditampilkan dalam visualisasi sebagai titik berwarna merah.

write.xlsx(outputP,"HCB 2025_Prov.xlsx")
write.xlsx(output,"HCB 2025_Kako.xlsx")

5 Peta

library(sf)
petaku <- st_read("PetaSHP514_38.shp")
## Reading layer `PetaSHP514_38' from data source 
##   `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\PetaSHP514_38.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 514 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS:  WGS 84
petaku <- petaku %>%
  mutate(idkab = as.character(idkab))
hasil <- hasil %>%
  mutate(kabu = as.character(kabu))
names(petaku)
## [1] "fid"      "idkab"    "nmprov"   "nmkab"    "kdprov"   "kdkab"    "sumber"  
## [8] "periode"  "geometry"
kab_map <- petaku %>%
  left_join(
    hasil %>% select(kabu, RSE, RSE_kat),
    by = c("idkab" = "kabu")
  )
kab_map$RSE_kat <- factor(
  kab_map$RSE_kat,
  levels = c("< 25%", "26–50%", "> 50%")
)

6 References

[1] Joint Center for Housing Studies of Harvard University. (2023). The state of the nation’s housing 2023. Cambridge, MA: Harvard University.

[2] Kutty, N. K. (2005). A new measure of housing affordability: Estimates and analytical results. Housing Policy Debate, 16(1), 113–142.

[3] Stone, M. E. (2006). What is housing affordability? The case for the residual income approach. Housing Policy Debate, 17(1), 151–184. https://doi.org/10.1080/10511482.2006.9521564

[4] World Bank. (2019). Indonesia affordable housing: Policy and institutional assessment. Washington, DC: World Bank.


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIkhvdXNpbmcgQ29zdCBCdXJkZW4gKEhDQikgMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCl9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSBtZXJ1cGFrYW4gaW5kaWthdG9yIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIHRpbmdrYXQgdGVrYW5hbiBiaWF5YSBwZXJ1bWFoYW4gdGVyaGFkYXAgcnVtYWggdGFuZ2dhLCB5YW5nIHVtdW1ueWEgZGlkZWZpbmlzaWthbiBzZWJhZ2FpIGtvbmRpc2kga2V0aWthIHJ1bWFoIHRhbmdnYSBtZW5nYWxva2FzaWthbiAzMCBwZXJzZW4gYXRhdSBsZWJpaCBkYXJpIHRvdGFsIHBlbmdlbHVhcmFubnlhIHVudHVrIGJpYXlhIHBlcnVtYWhhbi4gSW5kaWthdG9yIGluaSBiYW55YWsgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGtlc2VqYWh0ZXJhYW4ga2FyZW5hIG1lbmNlcm1pbmthbiBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gc2VydGEgcG90ZW5zaSBrZXJlbnRhbmFuIGVrb25vbWkgcnVtYWggdGFuZ2dhIChTdG9uZSwgMjAwNjsgSm9pbnQgQ2VudGVyIGZvciBIb3VzaW5nIFN0dWRpZXMgb2YgSGFydmFyZCBVbml2ZXJzaXR5LCAyMDIzKS4NCg0KRGFsYW0ga29udGVrcyBuZWdhcmEgYmVya2VtYmFuZywgdGVybWFzdWsgSW5kb25lc2lhLCB2YXJpYXNpIEhDQiBhbnRhcmRhZXJhaCBkaXBlbmdhcnVoaSBvbGVoIHBlcmJlZGFhbiBoYXJnYSBydW1haCBkYW4gc2V3YSwgc3RydWt0dXIgcGFzYXIgdGVuYWdhIGtlcmphLCB0aW5na2F0IHVyYmFuaXNhc2ksIHNlcnRhIGFrc2VzIHRlcmhhZGFwIGluZnJhc3RydWt0dXIgZGFuIGJhaGFuIGJhbmd1bmFuLiBPbGVoIGthcmVuYSBpdHUsIGFuYWxpc2lzIEhDQiBzZWNhcmEgc3Bhc2lhbCBoaW5nZ2EgdGluZ2thdCBrYWJ1cGF0ZW4va290YSBtZW5qYWRpIHBlbnRpbmcgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBrZXRpbXBhbmdhbiBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gYW50YXJ3aWxheWFoIChXb3JsZCBCYW5rLCAyMDE5KS4NCg0KRGF0YSBzdXJ2ZWkgcnVtYWggdGFuZ2dhIHNlcGVydGkgU3VydmVpIFNvc2lhbCBFa29ub21pIE5hc2lvbmFsIChTdXNlbmFzKSBtZW11bmdraW5rYW4gcGVuZ3VrdXJhbiBIQ0Igc2VjYXJhIGtvbXByZWhlbnNpZiBrYXJlbmEgbWVuY2FrdXAga29tcG9uZW4gcGVuZ2VsdWFyYW4gcGVydW1haGFuIGRhbiBrYXJha3RlcmlzdGlrIHNvc2lhbCBla29ub21pIHJ1bWFoIHRhbmdnYS4gUGVtYW5mYWF0YW4gZGF0YSBpbmkgbWVtYmVyaWthbiBkYXNhciBlbXBpcmlzIHlhbmcga3VhdCBkYWxhbSBwZXJ1bXVzYW4ga2ViaWpha2FuIHBlcnVtYWhhbiB5YW5nIGxlYmloIHRlcGF0IHNhc2FyYW4uDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIFN1c2VuYXMgS29uc3Vtc2kgZGFuIFBlbmdlbHVhcmFuIChLUCkgTWFyZXQgMjAyNS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpkYXRha3UgPC0gcmVhZF9zYXYoIkJMT0s0M18yMDI1LnNhdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KIyBIb3VzaW5nIENvc3QgQnVyZGVuDQoNCl9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSBkaWhpdHVuZyBzZWJhZ2FpIHJhc2lvIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiB0ZXJoYWRhcCB0b3RhbCBwZW5nZWx1YXJhbiBydW1haCB0YW5nZ2EuIEFtYmFuZyBiYXRhcyAzMCBwZXJzZW4gZGlndW5ha2FuIHVudHVrIG1lbmdrbGFzaWZpa2FzaWthbiBydW1haCB0YW5nZ2Egc2ViYWdhaSBfdW5hZmZvcmRhYmxlXywgbWVuZ2lrdXRpIHByYWt0aWsgeWFuZyBsdWFzIGRpZ3VuYWthbiBkYWxhbSBsaXRlcmF0dXIga2ViaWpha2FuIHBlcnVtYWhhbiBkYW4gcGVyZW5jYW5hYW4ga290YS4gTWVza2lwdW4gYW1iYW5nIGluaSBiZXJzaWZhdCBub3JtYXRpZiwgYmVyYmFnYWkgc3R1ZGkgbWVudW5qdWtrYW4gYmFod2EgcnVtYWggdGFuZ2dhIGRlbmdhbiByYXNpbyBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gZGkgYXRhcyAzMCBwZXJzZW4gY2VuZGVydW5nIG1lbmdhbGFtaSBwZW51cnVuYW4ga29uc3Vtc2kga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEgZGFuIHBlbmluZ2thdGFuIGtlcmVudGFuYW4gZWtvbm9taSAoS3V0dHksIDIwMDUpLg0KDQpEYWxhbSBhbmFsaXNpcyBpbmksIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBtZW5jYWt1cCBiaWF5YSBzZXdhIGFrdHVhbCBtYXVwdW4gaW1wdXRhc2kgc2V3YSBydW1haCBtaWxpayBzZW5kaXJpLCB1dGlsaXRhcyBkYXNhciAobGlzdHJpayBkYW4gYWlyKSwgZGFuIGVuZXJnaSBiYWhhbiBiYWthciB1bnR1ayBtZW1hc2FrLiBQZW5kZWthdGFuIGFncmVnYXRpZiBpbmkgc2VqYWxhbiBkZW5nYW4gcHJha3RpayBwZW5ndWt1cmFuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBkYWxhbSBzdXJ2ZWkgcnVtYWggdGFuZ2dhIG5hc2lvbmFsIGRhbiBpbnRlcm5hc2lvbmFsLg0KDQpgYGB7cn0NCmRhdGFrdSA8LSBkYXRha3UgJT4lDQogIG11dGF0ZShrYWJ1ID0gcjEwMSoxMDAgKyByMTAyKSAlPiUNCiAgcmVuYW1lKHByb3Y9InIxMDEiLCBrYWI9InIxMDIiKSAlPiUNCiAgbXV0YXRlKGRlbm9tPTEwMCkgJT4lDQogIG11dGF0ZSgNCiAgICBleHBfaG91c2luZyA9IHJvd1N1bXMoYWNyb3NzKA0KICAgICAgYyhzZWJ1bGFuXzIyOCwgc2VidWxhbl8yMjksIHNlYnVsYW5fMjMwLCBzZWJ1bGFuXzIzMSwNCiAgICAgICAgc2VidWxhbl8yMzQsIHNlYnVsYW5fMjM2LA0KICAgICAgICBzZWJ1bGFuXzI1Mywgc2VidWxhbl8yNTUsIHNlYnVsYW5fMjU3LA0KICAgICAgICBzZWJ1bGFuXzI1OSwgc2VidWxhbl8yNjAsIHNlYnVsYW5fMjYxKSwNCiAgICAgIH5yZXBsYWNlX25hKC4sIDApDQogICAgKSksDQogICAgQU1CQU5HID0gKGV4cF9ob3VzaW5nIC8gZXhwZW5kKSAqIDEwMCwNCiAgICBIQ0IgPSBpZl9lbHNlKEFNQkFORyA+IDMwLCAxMDAsIDApDQogICkNCmBgYA0KICANCiMgU2V0IERlc2lnbiBTYW1wbGluZw0KDQpEZXNpZ24gc2FtcGxpbmcgeWFuZyBkaWd1bmFrYW4gbWVuZ2lrdXRpIGRlc2lnbiBzYW1wbGluZyB5YW5nIGRpbGFrdWthbiBwYWRhIFNQU1MgeWFpdHUgQ2x1c3RlciBTYW1wbGluZyBkZXNpZ24gd2l0aCByZXBsYWNlbWVudC4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpzdXNlbmFzLmRlc2lnbjwtIHN2eWRlc2lnbihpZD1+cHN1LCBzdHJhdGE9fnN0cmF0YSwgZGF0YSA9IGRhdGFrdSwgd2VpZ2h0cz1+Znd0KQ0Kc3VzZW5hcy5kZXNpZ24NCnN1bW1hcnkoc3VzZW5hcy5kZXNpZ24kcHJvYikNCmBgYA0KDQojIFNldCBPdXRwdXQgU3RhdGlzdGljcw0KDQpLdWFsaXRhcyBwcmVzaXNpIGhhc2lsIGVzdGltYXNpIHN1YXR1IHN1cnZlaSBiaXNhIGRpYW1hdGkgZGFyaSBuaWxhaSBSU0UgeWFuZyBkaWhhc2lsa2FuLiBLZXNhbGFoYW4gc2FtcGxpbmcgZGFyaSBiZWJlcmFwYSBlc3RpbWFzaSBoYXJ1cyBkaWd1bmFrYW4gc2VjYXJhIGhhdGktaGF0aS4gVW50dWsgZXN0aW1hc2kgeWFuZyBiZXJkYXNhcmthbiBqdW1sYWgga2FzdXMgeWFuZyBrZWNpbCwga2VzYWxhaGFuIHJlbGF0aWYgY2VuZGVydW5nIGJlc2FyLg0KDQpCYXRhc2FuIG5pbGFpIFJTRSAoIF9BdXN0cmFsaWFuIEJ1cmVhdSBTdGF0aXN0aWNzXyk6DQoNCjEuICBKaWthICRSU0UgXGxlIDI1XCUkLCBlc3RpbWFzaSBiZXJzaWZhdCBwcmVzaXNpLg0KDQoyLiAgSmlrYSAkMjVcJSA8IFJTRSBcbGUgNTBcJSQsIGVzdGltYXNpIHBlcmx1IGRpbGFrdWthbiBkZW5nYW4gaGF0aS1oYXRpLg0KDQozLiAgSmlrYSAkUlNFID4gNTBcJSQsIGVzdGltYXNpIGRpYW5nZ2FwIHNhbmdhdCB0aWRhayBwcmVzaXNpLg0KDQoNCioqUHJvdmluc2kqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm9wdGlvbnMoc3VydmV5LmFkanVzdC5kb21haW4ubG9uZWx5PVRSVUUpDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1PSJhZGp1c3QiKQ0KaGFzaWxQID0gc3Z5YnkoZm9ybXVsYSA9IH5IQ0IsIGRlbm9tPSB+ZGVub20sIH5wcm92LCBkZXNpZ24gPSBzdXNlbmFzLmRlc2lnbiwgZGF0YSA9IGRhdGFrdSwgZGVmZj1UUlVFLCBzdnlyYXRpbywgdmFydHlwZT1jKCJzZSIsImNpIiwiY2kiLCJjdiIsImN2cGN0IiwidmFyIikpDQpoYXNpbFBbaXMubmEoaGFzaWxQKV0gPC0gMA0KaGFzaWxQJHRoZXRhID0gcm91bmQoaGFzaWxQJGBIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFNFID0gcm91bmQoaGFzaWxQJGBzZS5IQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFZBUiA9IHJvdW5kKGhhc2lsUCRTRSpoYXNpbFAkU0UsMikNCmhhc2lsUCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsUCRgY2lfbGAqMTAwLDIpDQpoYXNpbFAkQ0lfTE9XRVJbaGFzaWxQJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsUCRDSV9VUFBFUiA9IHJvdW5kKGhhc2lsUCRgY2lfdWAqMTAwLDIpDQpoYXNpbFAkUlNFID0gcm91bmQoaGFzaWxQJGBjdiVgLDIpDQpoYXNpbFAkREVGRiA9IHJvdW5kKGhhc2lsUCRERWZmLDIpDQpgYGANCg0KKipLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kb3B0aW9ucyhzdXJ2ZXkuYWRqdXN0LmRvbWFpbi5sb25lbHk9VFJVRSkNCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3U9ImFkanVzdCIpDQpoYXNpbCA9IHN2eWJ5KGZvcm11bGEgPSB+SENCLCBkZW5vbT0gfmRlbm9tLCB+a2FidSwgZGVzaWduID0gc3VzZW5hcy5kZXNpZ24sIGRhdGEgPSBkYXRha3UsIGRlZmY9VFJVRSwgc3Z5cmF0aW8sIHZhcnR5cGU9Yygic2UiLCJjaSIsImNpIiwiY3YiLCJjdnBjdCIsInZhciIpKQ0KaGFzaWxbaXMubmEoaGFzaWwpXSA8LSAwDQpoYXNpbCR0aGV0YSA9IHJvdW5kKGhhc2lsJGBIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWwkU0UgPSByb3VuZChoYXNpbCRgc2UuSENCL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFZBUiA9IHJvdW5kKGhhc2lsJFNFKmhhc2lsJFNFLDIpDQpoYXNpbCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsJGBjaV9sYCoxMDAsMikNCmhhc2lsJENJX0xPV0VSW2hhc2lsJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsJENJX1VQUEVSID0gcm91bmQoaGFzaWwkYGNpX3VgKjEwMCwyKQ0KaGFzaWwkUlNFID0gcm91bmQoaGFzaWwkYGN2JWAsMikNCmhhc2lsJERFRkYgPSByb3VuZChoYXNpbCRERWZmLDIpDQpgYGANCg0KIyBMZXZlbCBFc3RpbWF0ZQ0KDQojIyBFc3RpbWF0aW9uIGJ5IHByb3ZpbmNlDQoNCmBgYHtyfQ0Kb3V0cHV0UCA9IGFzLmRhdGEuZnJhbWUoY2JpbmQoaGFzaWxQJHByb3YsIGhhc2lsUCR0aGV0YSwgaGFzaWxQJFNFLCBoYXNpbFAkVkFSLCBoYXNpbFAkQ0lfTE9XRVIsIGhhc2lsUCRDSV9VUFBFUiwgaGFzaWxQJFJTRSwgaGFzaWxQJERFRkYpKQ0KbmFtZXMob3V0cHV0UCkgPSBjKCJQcm92IiwiRXN0aW1hc2kiLCJTRSIsIlZBUiIsIkNJIExPV0VSIiwiQ0kgVVBQRVIiLCJSU0UiLCJERUZGIikNCihvdXRwdXRQW29yZGVyKG91dHB1dFAkUHJvdiwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXSAgICkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBQcm92aW5zaSoqDQoNCmBgYHtyfQ0KaGFzaWxQIDwtIGhhc2lsUCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFUF9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWxQJFJTRVBfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIFByb3ZpbnNpKioNCg0KYGBge3J9DQpnZ3Bsb3QoaGFzaWxQLCBhZXMoeCA9IFVydXQsIHkgPSBSU0UsIGdyb3VwID0gMSwgY29sb3IgPSBSU0VQX2thdCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKw0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQogIA0Kc2NhbGVfY29sb3JfbWFudWFsKA0KICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogIHZhbHVlcyA9IGMoDQogICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAiPiA1MCUiICA9ICIjNzU3MEIzIg0KICApLA0KICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgZHJvcCA9IEZBTFNFDQopICsNCiAgICBsYWJzKA0KICAgIHRpdGxlID0gIlJTRSBIQ0IgcGVyIFByb3ZpbnNpIiwNCiAgICBzdWJ0aXRsZSA9ICJkZW5nYW4gZ2FyaXMgYmF0YXMgUlNFIDI1JSBkYW4gNTAlIiwNCiAgICB4ID0gIlByb3ZpbnNpIiwNCiAgICB5ID0gIk5pbGFpIFJTRSAoJSkiDQogICkgKw0KICANCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0MCwgdmp1c3QgPSAxLCBoanVzdCA9IDEpDQogICkNCmBgYA0KDQojIyBFc3RpbWF0aW9uIGJ5IGRpc3RyaWN0DQoNCmBgYHtyfQ0Kb3V0cHV0ID0gYXMuZGF0YS5mcmFtZShjYmluZChoYXNpbCRrYWJ1LCBoYXNpbCR0aGV0YSwgaGFzaWwkU0UsIGhhc2lsJFZBUiwgaGFzaWwkQ0lfTE9XRVIsIGhhc2lsJENJX1VQUEVSLCBoYXNpbCRSU0UsIGhhc2lsJERFRkYpKQ0KbmFtZXMob3V0cHV0KSA9IGMoIktha28iLCJFc3RpbWFzaSIsIlNFIiwiVkFSIiwiQ0kgTE9XRVIiLCJDSSBVUFBFUiIsIlJTRSIsIkRFRkYiKQ0KaGVhZCgob3V0cHV0W29yZGVyKG91dHB1dCRLYWtvLCBkZWNyZWFzaW5nID0gRkFMU0UpLCBdICAgKSkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyfQ0KaGFzaWwgPC0gaGFzaWwgJT4lDQogIG11dGF0ZSgNCiAgICBSU0UgPSBpZl9lbHNlKFJTRSA9PSAwLCBOQV9yZWFsXywgUlNFKQ0KICApICU+JQ0KICBhcnJhbmdlKFJTRSkgJT4lDQogIG11dGF0ZSgNCiAgICBVcnV0ID0gcm93X251bWJlcigpLA0KICAgIFJTRV9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWwkUlNFX2thdCwgdXNlTkEgPSAiaWZhbnkiKQ0KYGBgDQoNCg0KYGBge3J9DQpoYXNpbF9wbG90IDwtIGhhc2lsICU+JQ0KICBtdXRhdGUoDQogICAgUlNFX3Bsb3QgPSBpZl9lbHNlKGlzLm5hKFJTRSksIC0yLCBSU0UpICAjIHRhcnVoIE5BIGRpIGJhd2FoIHN1bWJ1DQogICkNCg0KZ2dwbG90KGhhc2lsX3Bsb3QsIGFlcyh4ID0gVXJ1dCwgeSA9IFJTRV9wbG90LCBjb2xvciA9IFJTRV9rYXQpKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4zNSwgaGVpZ2h0ID0gMCwgc2l6ZSA9IDEuOCwgYWxwaGEgPSAwLjg1KSArDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQoNCiAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgIG5hbWUgPSAiTmlsYWkgUlNFICglKSIsDQogICAgYnJlYWtzID0gYygwLCAyNSwgNTApLA0KICAgIGxpbWl0cyA9IGMoLTUsIE5BKQ0KICApICsNCg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgbmFtZSA9ICJLYXRlZ29yaSBSU0UiLA0KICAgIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogICAgdmFsdWVzID0gYygNCiAgICAgICI8IDI1JSIgID0gIiMxQjlFNzciLA0KICAgICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAgICI+IDUwJSIgID0gIiM3NTcwQjMiDQogICAgKSwNCiAgICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgICBkcm9wID0gRkFMU0UNCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClNhdHUga2FidXBhdGVuL2tvdGEgbWVtaWxpa2kgbmlsYWkgUlNFID0gMCBzZWhpbmdnYSBkaXBlcmxha3VrYW4gc2ViYWdhaSBkYXRhIHRpZGFrIHRlcnNlZGlhIChOQSkgZGFuIGRpdGFtcGlsa2FuIGRhbGFtIHZpc3VhbGlzYXNpIHNlYmFnYWkgdGl0aWsgYmVyd2FybmEgbWVyYWguDQoNCmBgYHtyfQ0Kd3JpdGUueGxzeChvdXRwdXRQLCJIQ0IgMjAyNV9Qcm92Lnhsc3giKQ0Kd3JpdGUueGxzeChvdXRwdXQsIkhDQiAyMDI1X0tha28ueGxzeCIpDQpgYGANCg0KIyBQZXRhDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCnBldGFrdSA8LSBzdF9yZWFkKCJQZXRhU0hQNTE0XzM4LnNocCIpDQoNCnBldGFrdSA8LSBwZXRha3UgJT4lDQogIG11dGF0ZShpZGthYiA9IGFzLmNoYXJhY3RlcihpZGthYikpDQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKGthYnUgPSBhcy5jaGFyYWN0ZXIoa2FidSkpDQpuYW1lcyhwZXRha3UpDQpgYGANCg0KYGBge3J9DQprYWJfbWFwIDwtIHBldGFrdSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGhhc2lsICU+JSBzZWxlY3Qoa2FidSwgUlNFLCBSU0Vfa2F0KSwNCiAgICBieSA9IGMoImlka2FiIiA9ICJrYWJ1IikNCiAgKQ0Ka2FiX21hcCRSU0Vfa2F0IDwtIGZhY3RvcigNCiAga2FiX21hcCRSU0Vfa2F0LA0KICBsZXZlbHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3Qoa2FiX21hcCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUlNFX2thdCksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgID0gIiMxYTk4NTAiLCAgIyBzYW5nYXQgYmFpaw0KICAgICAgIjI24oCTNTAlIiAgPSAiI2ZlZTA4YiIsICAjIGhhdGktaGF0aQ0KICAgICAgIj4gNTAlIiAgID0gIiNkNzMwMjciICAgIyB0aWRhayByZWxpYWJlbA0KICAgICksDQogICAgbmEudmFsdWUgPSAiZGFya2JsdWUiLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgSENCIHBlciBLYWJ1cGF0ZW4va290YSIsDQogICAgZmlsbCAgPSAiS2F0ZWdvcmkgUlNFIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyBfUmVmZXJlbmNlc18NCg0KWzFdIEpvaW50IENlbnRlciBmb3IgSG91c2luZyBTdHVkaWVzIG9mIEhhcnZhcmQgVW5pdmVyc2l0eS4gKDIwMjMpLiBfVGhlIHN0YXRlIG9mIHRoZSBuYXRpb27igJlzIGhvdXNpbmcgMjAyM18uIENhbWJyaWRnZSwgTUE6IEhhcnZhcmQgVW5pdmVyc2l0eS4NCg0KWzJdIEt1dHR5LCBOLiBLLiAoMjAwNSkuIF9BIG5ldyBtZWFzdXJlIG9mIGhvdXNpbmcgYWZmb3JkYWJpbGl0eTogRXN0aW1hdGVzIGFuZCBhbmFseXRpY2FsIHJlc3VsdHNfLiBIb3VzaW5nIFBvbGljeSBEZWJhdGUsIDE2KDEpLCAxMTPigJMxNDIuDQoNClszXSBTdG9uZSwgTS4gRS4gKDIwMDYpLiBfV2hhdCBpcyBob3VzaW5nIGFmZm9yZGFiaWxpdHk/IFRoZSBjYXNlIGZvciB0aGUgcmVzaWR1YWwgaW5jb21lIGFwcHJvYWNoXy4gSG91c2luZyBQb2xpY3kgRGViYXRlLCAxNygxKSwgMTUx4oCTMTg0LiBodHRwczovL2RvaS5vcmcvMTAuMTA4MC8xMDUxMTQ4Mi4yMDA2Ljk1MjE1NjQNCg0KWzRdIFdvcmxkIEJhbmsuICgyMDE5KS4gX0luZG9uZXNpYSBhZmZvcmRhYmxlIGhvdXNpbmc6IFBvbGljeSBhbmQgaW5zdGl0dXRpb25hbCBhc3Nlc3NtZW50Xy4gV2FzaGluZ3RvbiwgREM6IFdvcmxkIEJhbmsuDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==