Data handling
# Start Inf data
# --------------
# read data
dtf <- read_dta("Data/Brazil/startinf_brazil_m.dta", encoding = "latin1")
# labels of each variable
dtf_labels <- unlist(lapply(dtf, attr, which = "label"))
# remove labels
dtf <- as.data.frame(lapply(dtf, c))
# Notice that for a given frequency,
# the data begins at the start of the period
# it reports to (for example, monthly data's date is on the 1st of
# each month)
# fix date
datelookup <- seq.Date(from = as.Date("2005-01-01"),
to = as.Date("2021-12-01"),
by = "month")
dtf$date <- datelookup[dtf$date - abs(min(dtf$date)) + 1]
# order by date
dtf <- arrange(dtf, date)
# correct magnitude of certain variables
dtf <- dtf %>% mutate_at(vars(-date, -contains("_skew")),
~ ./100 )
# create max-min
dtf$IPCA12_max_minus_min <- dtf$IPCA12_max - dtf$IPCA12_min
# Create breakeven rates
# ----------------------
for (n0 in 1:(10-1)) {
var0 <- paste0("breakeven", n0)
for (nf in (n0+1):10) {
varf <- paste0("breakeven", nf)
var1 <- paste(sep = "_","breakeven_f", n0, nf)
# forward rate
dtf[,var1] <- ( (1 + dtf[,varf])^nf ) / ( (1 + dtf[,var0])^n0 )
dtf[,var1] <- exp( (1/(nf-n0)) * log(dtf[,var1])) - 1
# if desired, forwards are lagged so that
# their value at time t corresponds to
# the expectation of the tn-t0 rate at t-tn
if (bAdjustPeriodTiming) dtf[, var1] <- lag(dtf[, var1], nf-1)
}
}
# adjustment of lead data
# -----------------------
# be careful. If you use more than one year horizons, you have
# to adjust the lagging
if (bAdjustPeriodTiming) {
dtf <- dtf %>%
mutate_at(vars(starts_with("IPCA12_"), fgv_ibre_exp, matches("breakeven(\\d+)") # no forwards
), ~ lag(.,12-1) # monthly date
) %>%
# -1 because data has date 01mmyyyy, refers to previous period
mutate_at(vars(starts_with("fgv_md_")),
~ lag(.,12) #monthly date
) %>%
mutate(EIPCA_1y_median = lag(EIPCA_1y_median, 12),
EIPCA_2y_median = lag(EIPCA_2y_median, 12*2),
EIPCA_3y_median = lag(EIPCA_3y_median, 12*3)
)
# no "-1" because this data is end of month
}
# lag as it is realized inflation that one needs
dtf <- dtf %>% mutate_at(vars(IGPM, core_IPC, IPCA),
~ lag(., 12-1))
# notice the -1 since every data point is plotted at the start of the
# respective period (monthly freq <=> beginning of month)
# pivot data to long format for plotting
dtf_long <- pivot_longer(dtf, !date,
names_to = "variable",
values_to = "value",
values_transform = as.numeric)
Timespan is 2008/01 - 2016/12
Figure(s) 11
Subfigure 11(a): Actual inflation and its target
# actual and expected inflation
target <- 0.045
target_ub <- 0.065
# vertical line width
vline_w <- 0.6 #mm
legs <- c("Consumer Price Inflation",
"Consumer price inflation - admin prices",
"Consumer price inflation - free prices",
"Inflation Target",
"Upper Bound")
legv <- c("red", "blue", "orange3", "green4", "black")
linev <- c("solid", "dotted", "dotdash", "longdash", "solid")
labs <- c(0, 0.025, 0.045, 0.065, seq(0.1, 0.18, 0.04))
plot <- create_plot(dtf_long,
vars = c("IPCA", "IPCA_admin", "IPCA_free"),
scales = 0) +
geom_hline(aes(yintercept = target_ub, colour = "Upper Bound", linetype = "Upper Bound"),
size = tfont(vline_w)) +
geom_hline(aes(yintercept = target, colour = "Target", linetype = "Target"),
size = tfont(vline_w)) +
scale_linetype_manual(values = linev, labels = legs) +
scale_colour_manual(values = legv, labels = legs) +
scale_y_continuous(breaks = labs, labels = scales::percent(labs)) +
scale_y_continuous(limits = c(0, 0.20), breaks = labs, labels = scales::percent(labs))
Scale for ‘y’ is already present. Adding another scale for ‘y’, which will replace the existing scale. Scale for ‘y’ is already present. Adding another scale for ‘y’, which will replace the existing scale.
print(plot)

if (bSavePlots) my_ggsave(paste0(path_figure_out, "figure_11_a.pdf"), plot)
# key indicators for paper
print(mean(dtf$IPCA[dtf$date >= as.Date("2012-01-01") &
dtf$date <= as.Date("2016-12-31")], na.rm = TRUE
)
)
[1] 0.07144252
Subigure 11(c): Cross-sectional disagreement of households
# now using max-min instead of max and min
vars1 <- c("fgv_md_skew_100")
vars2 <- c("fgv_md_sd_100")
vars <- c(vars1, vars2)
legss <- c("Cross-sectional survey skewness (lhs)",
"Cross-sectional survey standard deviation (rhs)")
legv <- c("red", "blue")
linev <- c("solid", 'dotdash')
transf_b <- 90 # for secondary axis
transf_a <- 0
plot <- create_plot(dtf_long,
vars = vars1,
perc = 0, scales = 0) +
theme(legend.position = c(0.3,0.88)) +
geom_line(data = dtf_long %>%
filter(date >= as.Date("2008-01-01") &
date <= as.Date("2017-12-31") &
variable %in% vars2 & !is.na(value)),
aes(x = date, y = (value * transf_b) - transf_a,
colour = variable, linetype = variable),
size = line_sizee) +
scale_y_continuous(limits = c(0, 7.5),
sec.axis = sec_axis( trans = ~ (. + transf_a) / transf_b,
labels = scales::percent_format(accuracy = 0.1))
) +
scale_linetype_manual(breaks = vars, values = linev, labels = legss) +
scale_colour_manual(breaks = vars, values = legv, labels = legss)
print(plot)

if (bSavePlots) my_ggsave(paste0(path_figure_out, "figure_11_c.pdf"), plot)
LS0tDQp0aXRsZTogIkJyb29raW5ncyBQYXBlciAtIEJyYXppbCAtIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc3RhcnRfUiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBJbml0aWF0aW9uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpybShsaXN0ID0gbHMoKSkNCg0KIyBjbGVhbiBjb25zb2xlDQpjYXQoIlwwMTQiKQ0KDQojIyMjIFBMRUFTRSBDSE9PU0UgIyMjIyMNCg0KIyBwcmludCBhbmQgc2F2ZSBwbG90cz8NCmJTYXZlUGxvdHMgPC0gMSAgICMgMDogbm8NCiAgICAgICAgICAgICAgICAgICMgMTogeWVzDQoNCiMgRXhwZWN0YXRpb25zIGF0IFQgPSBULWggb3IgVCtoPw0KIyB3aWxsIHNoaWZ0IGJ5IDEyIHBlcmlvZHMgKG1vbnRobHkpLCBiZSBjYXJlZnVsIGZvciBlLmcuIHF1YXJ0ZXJseSBkYXRhDQpiQWRqdXN0UGVyaW9kVGltaW5nIDwtIDAgICAjIDA6IFQraA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxOiBULWgNCiMjIyMgIENIT0lDRSBFTkQgICAjIyMjIw0KDQojIEJFV0FSRSBPTkxZIFZBUklBQkxFUyBVU0VEIEFSRSBBREpVU1RFRA0KIyBJRiBZT1UgV0FOVCBUTyBVU0UgT1RIRVIgVkFSSUFCTEVTDQojIFBMRUFTRSBBREQgVEhFTSBCRUxPVyBXSEVOIFRIRSBBREpVU1RNRU5UDQojIElTIE1BREUNCg0KIyBwYWNrYWdlcw0KIyBsaXN0IG9mIGxpYnJhcmllcw0KcGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiAgICMgZGF0YSBhbmFseXNpcw0KICAgICAgICAgICAgICAsImtuaXRyIiAgICAgICMgbWFya2Rvd24NCiAgICAgICAgICAgICAgLCJoYXZlbiIgICAgICAjIHJlYWQgLmR0YSBmaWxlcw0KICAgICAgICAgICAgICAsInJlYWR4bCIgICAgICMgcmVhZCBleGNlbCBmaWxlcw0KICAgICAgICAgICAgICAsImx1YnJpZGF0ZSIgICMgZGF0ZXMNCiAgICAgICAgICAgICAgLCJ0aW55dGV4IiAgICAjIGZvciBtYXJrZG93bg0KICAgICAgICAgICAgICAsImtzIiAgICAgICAgICMga2VybmVsIGVzdGltYXRpb24NCiAgICAgICAgICAgICAgLCJtYWdyaXR0ciIgICAjIHBpZSBvcGVyYXRvcg0KKQ0KDQojIGluc3RhbGwgdGhlbSBpZiBuZWVkZWQNCm5ld19wYWNrYWdlcyA8LSBwYWNrYWdlc1shKHBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCAiUGFja2FnZSJdKV0gDQoNCmlmIChsZW5ndGgobmV3X3BhY2thZ2VzKSA+IDApeyAjaW5zdGFsbHMgdGhlbQ0KICAgaW5zdGFsbC5wYWNrYWdlcyhuZXdfcGFja2FnZXMsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQp9DQoNCiMgbG9hZCBsaWJyYXJpZXMNCmxhcHBseShwYWNrYWdlcywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KDQpgYGANCg0KYGBge3IgcGxvdF9kZWYsIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBnZ3Bsb3QyIG9wdGlvbnMNCg0KIyBzaXplIG9mIGZpZ3VyZXMgZm9yIHNhdmluZyBhbmQgZGlzcGxheWluZyAoZGlzcCB3aWxsIGJlIGFkanVzdGVkKQ0KIyBmaWd1cmUgc2l6ZSBpbiBjbSAoZm9yIGluY2hlcyBkaXZpZGUgYnkgMC4zOTM3MDA3ODcpDQpmaWdfaCA8LSAyLjUgKiA4LjQzNzUqIDAuMzkzNzAwNzg3ICMgd2lkdGgNCmZpZ193IDwtIDIuNSAqIDE1ICogMC4zOTM3MDA3ODcgICAgIyBoZWlnaHQNCmZpZ19kaXNwX2FkaiA8LSAxICAgICAgICAgICAgICAgICAgIyBhZGp1c3RtZW50IGZvciBmaWd1cmUgZGlzcGxheQ0KDQoNCiMgQ29udmVydCBmcm9tIG1tIHRvIGludGVybmFsIHVuaXRzIHVzZWQgaW4gZ3JpZCBnZ3Bsb3QNCnRmb250IDwtIGZ1bmN0aW9uKHgpIHJldHVybigucHQqeCkgICAgICAgICMgdGhpcyB3YXkgbm8gcmVzIHByb2JsZW1zDQp0bHdkICA8LSBmdW5jdGlvbih4KSByZXR1cm4oLnN0cm9rZSp4KSANCg0KIyBnZ3Bsb3QyIG9wdGlvbnMNCiMgcGxvdCBkZWZpbml0aW9ucyANCg0KbGVnZW5kX3RleHRfc2l6ZSA8LSA3LjUNCmF4aXNfdGV4dF9zaXplICAgPC0gNw0KDQpsZWdlbmRfa2V5X3dpZHRoIDwtIDIwICMgbW0NCg0KIyBzaXplIG9mIGxpbmUgZm9yIHBsb3RzDQpsaW5lX3NpemVlIDwtIHRsd2QoMSkNCg0KdGhlbWVfc2V0KA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICAgICAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIsIHNpemUgPSB0Zm9udCg2KSksDQogICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiksDQogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXI9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSwgc2l6ZSA9IDAuNSksDQogICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMjUsMC44KSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSksDQogICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdChsZWdlbmRfa2V5X3dpZHRoLCAibW0iKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSB0Zm9udChsZWdlbmRfdGV4dF9zaXplKSksDQogICAgICAgICAgICAgICAgICBheGlzLnRleHQgID0gZWxlbWVudF90ZXh0KHNpemUgPSB0Zm9udChheGlzX3RleHRfc2l6ZSkpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICApDQopDQoNCiMgZnVuY3Rpb25zIHRvIGNyZWF0ZSBjb2xvdXIvbGluZSBzY2hlbWUNCg0KY3JlYXRlX2xlZ3YgPC0gZnVuY3Rpb24oeCkgew0KDQogICNjb2xvdXJzIHRvIGJlIHVzZWQgaW4gcGxvdHMNCiAgeSA8LSBjKCdyZWQnLCdibHVlJywnZ3JlZW40Jywnb3JhbmdlMycsInB1cnBsZTIiKQ0KICBuIDwtIGxlbmd0aCh4KQ0KICB5IDwtIHlbMTpuXQ0KICBuYW1lcyh5KSA8LSB4IA0KICByZXR1cm4oeSkNCg0KfQ0KDQpjcmVhdGVfbGluZXYgPC0gZnVuY3Rpb24oeCkgew0KDQogICMgbGluZXR5cGVzIHRvIGJlIHVzZWQgaW4gcGxvdHMNCiAgeSA8LSBjKCdzb2xpZCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsImRvdGRhc2giLCdsb25nZGFzaCcpDQogIG4gPC0gbGVuZ3RoKHgpDQogIHkgPC0geVsxOm5dDQogIG5hbWVzKHkpIDwtIHgNCiAgcmV0dXJuKHkpDQoNCn0NCg0KY3JlYXRlX3Bsb3QgPC0gZnVuY3Rpb24oZGYsDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVncyA9IE5VTEwsDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2xiID0gYXMuRGF0ZSgiMjAwOC0wMS0wMSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV91YiA9IGFzLkRhdGUoIjIwMTctMTItMzEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmMgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZWUpIHsNCiAgDQogICMgZGF0ZSBib3VuZHMNCiAgZGF0ZV9sYiA8LSBhcy5EYXRlKGRhdGVfbGIpDQogIGRhdGVfdWIgPC0gYXMuRGF0ZShkYXRlX3ViKQ0KICANCiAgIyBjb2xvdXJzL2xpbmV0eXBlcw0KICBsZWd2IDwtIGNyZWF0ZV9sZWd2KHZhcnMpDQogIGxpbmV2IDwtIGNyZWF0ZV9saW5ldih2YXJzKQ0KICANCiAgZGYgPC0gZGYgJT4lDQogICAgICAgIGZpbHRlcihkYXRlID49IGRhdGVfbGIgJiBkYXRlIDw9IGRhdGVfdWIgJg0KICAgICAgICAgICAgICAgdmFyaWFibGUgJWluJSB2YXJzICYgIWlzLm5hKHZhbHVlKSkgJT4lDQogICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9IGZhY3Rvcih2YXJpYWJsZSwgbGV2ZWxzID0gdmFycykpDQogIA0KICBwbG90IDwtIGdncGxvdChkZiwgYWVzKHggPSBkYXRlLCB5ID0gdmFsdWUpKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSB2YXJpYWJsZSwgbGluZXR5cGUgPSB2YXJpYWJsZSksDQogICAgICAgICAgICAgIHNpemUgPSBsaW5lX3NpemUpICsNCiAgICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJVkiKQ0KICANCiAgaWYgKHNjYWxlcykgcGxvdCA8LSBwbG90ICsgDQogICAgICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChicmVha3MgPSB2YXJzLCB2YWx1ZXM9IGxpbmV2LCBsYWJlbHMgPSBsZWdzKSArDQogICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwoYnJlYWtzID0gdmFycywgdmFsdWVzID0gbGVndiwgbGFiZWxzID0gbGVncykgDQogIA0KICBpZiAocGVyYykgcGxvdCA8LSBwbG90ICsgDQogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpDQogIA0KICByZXR1cm4ocGxvdCkNCiAgDQp9DQoNCm15X2dnc2F2ZSA8LSBmdW5jdGlvbiguZmlsZW5hbWUsIC5wbG90LA0KICAgICAgICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAicGRmIiwgLndpZHRoID0gZmlnX3csDQogICAgICAgICAgICAgICAgICAgICAgLmhlaWdodCA9IGZpZ19oLCAudW5pdHMgPSAiaW4iLCAuZHBpID0gMzAwLCAuLi4pIHsNCiAgDQogIGdnc2F2ZShmaWxlbmFtZSA9IC5maWxlbmFtZSwgcGxvdCA9IC5wbG90LA0KICAgICAgICAgZGV2aWNlID0gLmRldmljZSwNCiAgICAgICAgIHdpZHRoID0gLndpZHRoLCBoZWlnaHQgPSAuaGVpZ2h0LA0KICAgICAgICAgdW5pdHMgPSAudW5pdHMsIGRwaSA9IC5kcGksIC4uLikNCiAgDQp9DQoNCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KDQojIGRpcmVjdG9yeQ0KZGlyZWN0b3J5IDwtIGdldHdkKCkNCmRpcmVjdG9yeSA8LSBnc3ViKCIvQ29kZSIsICIiLCBkaXJlY3RvcnkpDQpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gZGlyZWN0b3J5KQ0KDQpwYXRoX2ZpZ3VyZV9vdXQgPC0gIi4vRmlndXJlcy8iDQoNCiMgZGVmYXVsdCBjaHVuayBvcHRpb25zDQpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICdhc2lzJywgZWNobyA9IFRSVUUsDQogICAgICAgICAgICAgICBmaWcud2lkdGggPSBmaWdfZGlzcF9hZGogKiBmaWdfdywgZmlnLmhlaWdodCA9IGZpZ19kaXNwX2FkaiAqIGZpZ19oLA0KICAgICAgICAgICAgICAgZmlnLnJldGluYSA9IDEpICMgZmlndXJlIG9wdGlvbnMNCg0KYGBgDQoNCiMjIERhdGEgaGFuZGxpbmcNCg0KYGBge3IgbG9hZF9kYXRhfQ0KDQojIFN0YXJ0IEluZiBkYXRhDQojIC0tLS0tLS0tLS0tLS0tDQoNCiMgcmVhZCBkYXRhDQpkdGYgPC0gcmVhZF9kdGEoIkRhdGEvQnJhemlsL3N0YXJ0aW5mX2JyYXppbF9tLmR0YSIsIGVuY29kaW5nID0gImxhdGluMSIpDQoNCiMgbGFiZWxzIG9mIGVhY2ggdmFyaWFibGUNCmR0Zl9sYWJlbHMgPC0gdW5saXN0KGxhcHBseShkdGYsIGF0dHIsIHdoaWNoID0gImxhYmVsIikpDQoNCiMgcmVtb3ZlIGxhYmVscw0KZHRmIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGR0ZiwgYykpDQoNCiMgTm90aWNlIHRoYXQgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5LA0KIyB0aGUgZGF0YSBiZWdpbnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwZXJpb2QNCiMgaXQgcmVwb3J0cyB0byAoZm9yIGV4YW1wbGUsIG1vbnRobHkgZGF0YSdzIGRhdGUgaXMgb24gdGhlIDFzdCBvZg0KIyBlYWNoIG1vbnRoKQ0KDQojIGZpeCBkYXRlDQpkYXRlbG9va3VwIDwtIHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDA1LTAxLTAxIiksDQogICAgICAgICAgICAgICAgICAgICAgIHRvID0gYXMuRGF0ZSgiMjAyMS0xMi0wMSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtb250aCIpICANCg0KZHRmJGRhdGUgPC0gZGF0ZWxvb2t1cFtkdGYkZGF0ZSAtIGFicyhtaW4oZHRmJGRhdGUpKSArIDFdDQoNCiMgb3JkZXIgYnkgZGF0ZQ0KZHRmIDwtIGFycmFuZ2UoZHRmLCBkYXRlKQ0KDQojIGNvcnJlY3QgbWFnbml0dWRlIG9mIGNlcnRhaW4gdmFyaWFibGVzDQpkdGYgPC0gZHRmICU+JSBtdXRhdGVfYXQodmFycygtZGF0ZSwgLWNvbnRhaW5zKCJfc2tldyIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB+IC4vMTAwICkNCg0KIyBjcmVhdGUgbWF4LW1pbg0KZHRmJElQQ0ExMl9tYXhfbWludXNfbWluIDwtIGR0ZiRJUENBMTJfbWF4IC0gZHRmJElQQ0ExMl9taW4NCg0KIyBDcmVhdGUgYnJlYWtldmVuIHJhdGVzDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KZm9yIChuMCBpbiAxOigxMC0xKSkgew0KICANCiAgdmFyMCA8LSBwYXN0ZTAoImJyZWFrZXZlbiIsIG4wKQ0KICANCiAgZm9yIChuZiBpbiAobjArMSk6MTApIHsNCiAgICANCiAgICB2YXJmIDwtIHBhc3RlMCgiYnJlYWtldmVuIiwgbmYpDQogICAgdmFyMSA8LSBwYXN0ZShzZXAgPSAiXyIsImJyZWFrZXZlbl9mIiwgbjAsIG5mKQ0KICAgIA0KICAgICMgZm9yd2FyZCByYXRlDQogICAgZHRmWyx2YXIxXSA8LSAoICgxICsgZHRmWyx2YXJmXSlebmYgKSAvICggKDEgKyBkdGZbLHZhcjBdKV5uMCApDQogICAgZHRmWyx2YXIxXSA8LSBleHAoICgxLyhuZi1uMCkpICogbG9nKGR0ZlssdmFyMV0pKSAtIDENCiAgICANCiAgICAjIGlmIGRlc2lyZWQsIGZvcndhcmRzIGFyZSBsYWdnZWQgc28gdGhhdA0KICAgICMgdGhlaXIgdmFsdWUgYXQgdGltZSB0IGNvcnJlc3BvbmRzIHRvDQogICAgIyB0aGUgZXhwZWN0YXRpb24gb2YgdGhlIHRuLXQwIHJhdGUgYXQgdC10bg0KICAgIGlmIChiQWRqdXN0UGVyaW9kVGltaW5nKSBkdGZbLCB2YXIxXSA8LSBsYWcoZHRmWywgdmFyMV0sIG5mLTEpDQogICAgDQogIH0gDQogIA0KfQ0KDQojIGFkanVzdG1lbnQgb2YgbGVhZCBkYXRhDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIGJlIGNhcmVmdWwuIElmIHlvdSB1c2UgbW9yZSB0aGFuIG9uZSB5ZWFyIGhvcml6b25zLCB5b3UgaGF2ZQ0KIyB0byBhZGp1c3QgdGhlIGxhZ2dpbmcNCg0KaWYgKGJBZGp1c3RQZXJpb2RUaW1pbmcpIHsNCiAgDQogIGR0ZiA8LSBkdGYgJT4lDQogICAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIklQQ0ExMl8iKSwgZmd2X2licmVfZXhwLCBtYXRjaGVzKCJicmVha2V2ZW4oXFxkKykiKSAjIG5vIGZvcndhcmRzDQogICAgICAgICAgICAgICAgICApLCB+IGxhZyguLDEyLTEpICMgbW9udGhseSBkYXRlDQogICAgICAgICAgICAgICkgJT4lDQogICAgIyAtMSBiZWNhdXNlIGRhdGEgaGFzIGRhdGUgMDFtbXl5eXksIHJlZmVycyB0byBwcmV2aW91cyBwZXJpb2QNCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmd2X21kXyIpKSwNCiAgICAgICAgICAgICAgfiBsYWcoLiwxMikgI21vbnRobHkgZGF0ZQ0KICAgICAgICAgICAgICApICU+JQ0KICAgIG11dGF0ZShFSVBDQV8xeV9tZWRpYW4gPSBsYWcoRUlQQ0FfMXlfbWVkaWFuLCAxMiksDQogICAgICAgICAgIEVJUENBXzJ5X21lZGlhbiA9IGxhZyhFSVBDQV8yeV9tZWRpYW4sIDEyKjIpLA0KICAgICAgICAgICBFSVBDQV8zeV9tZWRpYW4gPSBsYWcoRUlQQ0FfM3lfbWVkaWFuLCAxMiozKQ0KICAgICAgICAgICkNCiAgICAjIG5vICItMSIgYmVjYXVzZSB0aGlzIGRhdGEgaXMgZW5kIG9mIG1vbnRoDQp9DQoNCiMgbGFnIGFzIGl0IGlzIHJlYWxpemVkIGluZmxhdGlvbiB0aGF0IG9uZSBuZWVkcw0KZHRmIDwtIGR0ZiAlPiUgbXV0YXRlX2F0KHZhcnMoSUdQTSwgY29yZV9JUEMsIElQQ0EpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIH4gbGFnKC4sIDEyLTEpKQ0KIyBub3RpY2UgdGhlIC0xIHNpbmNlIGV2ZXJ5IGRhdGEgcG9pbnQgaXMgcGxvdHRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlDQojIHJlc3BlY3RpdmUgcGVyaW9kIChtb250aGx5IGZyZXEgPD0+IGJlZ2lubmluZyBvZiBtb250aCkNCg0KDQojIHBpdm90IGRhdGEgdG8gbG9uZyBmb3JtYXQgZm9yIHBsb3R0aW5nDQpkdGZfbG9uZyA8LSBwaXZvdF9sb25nZXIoZHRmLCAhZGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdHJhbnNmb3JtID0gYXMubnVtZXJpYykNCg0KYGBgDQoNCiMjIFRpbWVzcGFuIGlzIDIwMDgvMDEgLSAyMDE2LzEyDQoNCiMjIEZpZ3VyZShzKSAxMQ0KIyMgU3ViZmlndXJlIDExKGEpOiBBY3R1YWwgaW5mbGF0aW9uIGFuZCBpdHMgdGFyZ2V0DQoNCmBgYHtyIGZpZ18xMV9hfQ0KDQojIGFjdHVhbCBhbmQgZXhwZWN0ZWQgaW5mbGF0aW9uIA0KDQp0YXJnZXQgICAgPC0gMC4wNDUNCnRhcmdldF91YiA8LSAwLjA2NQ0KDQojIHZlcnRpY2FsIGxpbmUgd2lkdGgNCnZsaW5lX3cgPC0gMC42ICNtbQ0KDQpsZWdzIDwtIGMoIkNvbnN1bWVyIFByaWNlIEluZmxhdGlvbiIsDQogICAgICAgICAgIkNvbnN1bWVyIHByaWNlIGluZmxhdGlvbiAtIGFkbWluIHByaWNlcyIsDQogICAgICAgICAgIkNvbnN1bWVyIHByaWNlIGluZmxhdGlvbiAtIGZyZWUgcHJpY2VzIiwNCiAgICAgICAgICAiSW5mbGF0aW9uIFRhcmdldCIsDQogICAgICAgICAgIlVwcGVyIEJvdW5kIikNCmxlZ3YgPC0gYygicmVkIiwgImJsdWUiLCAib3JhbmdlMyIsICJncmVlbjQiLCAiYmxhY2siKQ0KbGluZXYgPC0gYygic29saWQiLCAiZG90dGVkIiwgImRvdGRhc2giLCAibG9uZ2Rhc2giLCAic29saWQiKQ0KbGFicyA8LSBjKDAsIDAuMDI1LCAwLjA0NSwgMC4wNjUsIHNlcSgwLjEsIDAuMTgsIDAuMDQpKQ0KDQpwbG90IDwtIGNyZWF0ZV9wbG90KGR0Zl9sb25nLA0KICAgICAgICAgICAgICAgICAgICB2YXJzID0gYygiSVBDQSIsICJJUENBX2FkbWluIiwgIklQQ0FfZnJlZSIpLA0KICAgICAgICAgICAgICAgICAgICBzY2FsZXMgPSAwKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSB0YXJnZXRfdWIsIGNvbG91ciA9ICJVcHBlciBCb3VuZCIsIGxpbmV0eXBlID0gIlVwcGVyIEJvdW5kIiksDQogICAgICAgICAgICAgc2l6ZSA9IHRmb250KHZsaW5lX3cpKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSB0YXJnZXQsIGNvbG91ciA9ICJUYXJnZXQiLCBsaW5ldHlwZSA9ICJUYXJnZXQiKSwNCiAgICAgICAgICAgICBzaXplID0gdGZvbnQodmxpbmVfdykpICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV2LCBsYWJlbHMgPSBsZWdzKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbGVndiwgbGFiZWxzID0gbGVncykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gbGFicywgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KGxhYnMpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDAuMjApLCBicmVha3MgPSBsYWJzLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQobGFicykpDQoNCnByaW50KHBsb3QpDQppZiAoYlNhdmVQbG90cykgbXlfZ2dzYXZlKHBhc3RlMChwYXRoX2ZpZ3VyZV9vdXQsICJmaWd1cmVfMTFfYS5wZGYiKSwgcGxvdCkNCg0KIyBrZXkgaW5kaWNhdG9ycyBmb3IgcGFwZXINCnByaW50KG1lYW4oZHRmJElQQ0FbZHRmJGRhdGUgPj0gYXMuRGF0ZSgiMjAxMi0wMS0wMSIpICYNCiAgICAgICAgICAgICAgICAgICAgZHRmJGRhdGUgPD0gYXMuRGF0ZSgiMjAxNi0xMi0zMSIpXSwgbmEucm0gPSBUUlVFDQogICAgICAgICAgKQ0KICAgICApDQoNCmBgYA0KDQojIyBTdWJmaWd1cmUgMTEoYik6IE1hcmtldHMgYW5kIHN1cnZleSBmaXJzdC1vcmRlciBtb21lbnRzDQoNCmBgYHtyIGZpZ18xMV9ifQ0KDQojIHZlcnRpY2FsIGxpbmUgd2lkdGgNCnZsaW5lX3cgPC0gMC42ICNtbQ0KDQp2YXJzIDwtIGMoImJyZWFrZXZlbjEiLA0KICAgICAgICAgICJJUENBMTJfbWVkaWFuIiwNCiAgICAgICAgICAiZmd2X2licmVfZXhwIikNCg0KYnJlYWtzcyA8LSBjKHZhcnMsICJUYXJnZXQiLCAiVXBwZXIgQm91bmQiKQ0KbGVncyA8LSBjKCJNYXJrZXQtcHJpY2UgaW1wbGllZCIsDQogICAgICAgICAgIlN1cnZleSBvZiBQcm9mZXNzaW9uYWxzIiwNCiAgICAgICAgICAiU3VydmV5IG9mIEhvdXNlaG9sZHMiLA0KICAgICAgICAgICJJbmZsYXRpb24gVGFyZ2V0IiwNCiAgICAgICAgICAiVXBwZXIgQm91bmQiKQ0KDQpsZWd2IDwtIGMoInJlZCIsICJibHVlIiwgIm9yYW5nZTMiLCAiZ3JlZW40IiwgImJsYWNrIikNCmxpbmV2IDwtIGMoInNvbGlkIiwgImRvdHRlZCIsICJkb3RkYXNoIiwgImxvbmdkYXNoIiwgInNvbGlkIikNCg0KcGxvdCA8LSBjcmVhdGVfcGxvdChkdGZfbG9uZywNCiAgICAgICAgICAgICAgICAgICAgdmFycyA9IHZhcnMsDQogICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IDApICsNCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IHRhcmdldCwgY29sb3VyID0gIlRhcmdldCIsIGxpbmV0eXBlID0gIlRhcmdldCIpLA0KICAgICAgICAgICAgIHNpemUgPSB0Zm9udCh2bGluZV93KSkgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ViLCBjb2xvdXIgPSAiVXBwZXIgQm91bmQiLCBsaW5ldHlwZSA9ICJVcHBlciBCb3VuZCIpLA0KICAgICAgICAgICAgIHNpemUgPSB0Zm9udCh2bGluZV93KSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoYnJlYWtzID0gYnJlYWtzcywgdmFsdWVzPSBsaW5ldiwgbGFiZWxzID0gbGVncykgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKGJyZWFrcyA9IGJyZWFrc3MsIHZhbHVlcyA9IGxlZ3YsIGxhYmVscyA9IGxlZ3MpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMC4xMiksIGJyZWFrcyA9IGxhYnMsIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudChsYWJzKSkNCg0KcHJpbnQocGxvdCkNCmlmIChiU2F2ZVBsb3RzKSBteV9nZ3NhdmUocGFzdGUwKHBhdGhfZmlndXJlX291dCwgImZpZ3VyZV8xMV9iLnBkZiIpLCBwbG90KQ0KDQpgYGANCg0KIyMgU3ViaWd1cmUgMTEoYyk6IENyb3NzLXNlY3Rpb25hbCBkaXNhZ3JlZW1lbnQgb2YgaG91c2Vob2xkcw0KDQpgYGB7ciBmaWdfMTFfY30NCg0KIyBub3cgdXNpbmcgbWF4LW1pbiBpbnN0ZWFkIG9mIG1heCBhbmQgbWluDQoNCnZhcnMxIDwtIGMoImZndl9tZF9za2V3XzEwMCIpDQp2YXJzMiA8LSBjKCJmZ3ZfbWRfc2RfMTAwIikNCnZhcnMgPC0gYyh2YXJzMSwgdmFyczIpDQoNCmxlZ3NzIDwtIGMoIkNyb3NzLXNlY3Rpb25hbCBzdXJ2ZXkgc2tld25lc3MgKGxocykiLA0KICAgICAgICAgICAiQ3Jvc3Mtc2VjdGlvbmFsIHN1cnZleSBzdGFuZGFyZCBkZXZpYXRpb24gKHJocykiKQ0KbGVndiA8LSBjKCJyZWQiLCAiYmx1ZSIpDQpsaW5ldiA8LSBjKCJzb2xpZCIsICdkb3RkYXNoJykNCg0KdHJhbnNmX2IgPC0gOTAgIyBmb3Igc2Vjb25kYXJ5IGF4aXMNCnRyYW5zZl9hIDwtIDANCiAgDQpwbG90IDwtIGNyZWF0ZV9wbG90KGR0Zl9sb25nLA0KICAgICAgICAgICAgICAgICAgICB2YXJzID0gdmFyczEsDQogICAgICAgICAgICAgICAgICAgIHBlcmMgPSAwLCBzY2FsZXMgPSAwKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4zLDAuODgpKSArDQogIGdlb21fbGluZShkYXRhID0gZHRmX2xvbmcgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihkYXRlID49IGFzLkRhdGUoIjIwMDgtMDEtMDEiKSAmDQogICAgICAgICAgICAgICAgICAgICBkYXRlIDw9IGFzLkRhdGUoIjIwMTctMTItMzEiKSAmDQogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSAlaW4lIHZhcnMyICYgIWlzLm5hKHZhbHVlKSksDQogICAgICAgICAgICBhZXMoeCA9IGRhdGUsIHkgPSAodmFsdWUgKiB0cmFuc2ZfYikgLSB0cmFuc2ZfYSwNCiAgICAgICAgICAgICAgICBjb2xvdXIgPSB2YXJpYWJsZSwgbGluZXR5cGUgPSB2YXJpYWJsZSksDQogICAgICAgICAgICBzaXplID0gbGluZV9zaXplZSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA3LjUpLA0KICAgICAgICAgICAgICAgICAgICAgc2VjLmF4aXMgPSBzZWNfYXhpcyggdHJhbnMgPSB+ICguICsgdHJhbnNmX2EpIC8gdHJhbnNmX2IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGJyZWFrcyA9IHZhcnMsIHZhbHVlcyA9IGxpbmV2LCBsYWJlbHMgPSBsZWdzcykgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKGJyZWFrcyAgPSB2YXJzLCB2YWx1ZXMgPSBsZWd2LCBsYWJlbHMgPSBsZWdzcykNCiAgDQpwcmludChwbG90KQ0KaWYgKGJTYXZlUGxvdHMpIG15X2dnc2F2ZShwYXN0ZTAocGF0aF9maWd1cmVfb3V0LCAiZmlndXJlXzExX2MucGRmIiksIHBsb3QpDQoNCmBgYA0KDQojIyBTdWJmaWd1cmUgMTEoZCk6IENyb3NzLXNlY3Rpb25hbCBkaXN0cmlidXRpb24gb2YgaG91c2Vob2xkDQoNCmBgYHtyIGZpZ18xMV9kfQ0KDQojIHJlYWQgZGF0YQ0KZHRmX21pY3JvIDwtIHJlYWQuY3N2KCJEYXRhL0JyYXppbC9mZ3ZfaG91c2Vob2xkX2RlbnNpdHkuY3N2IiwgZW5jb2RpbmcgPSAibGF0aW4xIikNCmR0Zl9taWNybyAlPD4lIG11dGF0ZSh5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQ0KDQojIGxpbmUNCmxpbmV2IDwtIGMoJ2RvdGRhc2gnLCAnZG90dGVkJywgJ3NvbGlkJykNCmxlZ3YgPC0gYygncmVkJywgJ2JsdWUnLCAnZ3JlZW40JykNCg0KcGxvdCA8LSBnZ3Bsb3QoZHRmX21pY3JvLCBhZXMoeCA9IGZndl9tZF9FSVBDQSkpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0geCwgeSA9IHksDQogICAgICAgICAgICAgICAgY29sb3VyID0geWVhciwgbGluZXR5cGUgPSB5ZWFyKSwNCiAgICAgICAgICAgIHNpemUgPSBsaW5lX3NpemVlLCBnZW9tID0gImxpbmUiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV2KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbGVndikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBsaW1pdHMgPSBjKDAsIDAuMjUpKSArDQogICMgdHJ1bmNhdGVkIGF0IDI1JSENCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjEsMC44KSkNCg0KcHJpbnQocGxvdCkNCmlmIChiU2F2ZVBsb3RzKSBteV9nZ3NhdmUocGFzdGUwKHBhdGhfZmlndXJlX291dCwgImZpZ3VyZV8xMV9kLnBkZiIpLCBwbG90KQ0KDQpgYGAgDQo=