Format Data
# Import the required pacakges
library(dplyr)
library(tidyr)
library(ggplot2)
library(readxl)
# Define the directories
BASE_DIR <- "/Users/dorh012/Documents/2019/cmip-arctic-data/SLCFimpulse"
INPUT_DIR <- file.path(BASE_DIR, 'data-raw')
# Import the Sand et al BC impulse resonse function and
path_csv <- file.path(INPUT_DIR, 'TREFHT_fig1_toSteveSmith.xlsx')
raw_data <- read_excel(path_csv)
-
/
The Sand et. al impulse response is the monthly temperature response but we want to work with the annual temperature response so I averaged the monthly data to get the average annual temperature response.
# Figure out how many year of data there are in the data set.
n_yrs <- nrow(raw_data) / 12
# Then add the column of the years starting from 1 to the number of years
# of data in monthly data set. Note that becasue the data is currently
# monthly each year will need to be repreated 12 times in a row.
data.frame(year = rep(1:n_yrs, each = 12),
value = raw_data$`SAT BC`) %>%
# Remove 1 from the year so that the temperature response is relative to the year of the step.
mutate(year = year - 1) %>%
# Find the annual average.
group_by(year) %>%
summarise(value = mean(value)) %>%
ungroup ->
data
Here is the annual temperature response to the BC step experiment. There is a lot of noise in the data so we will need to fit an exponential equation to the time sereis.
ggplot(data = data, aes(x = year, y = value)) +
geom_line() +
labs(y = 'deg C',
x = 'year',
title = 'Annual Temperature Response to BC Step') ->
temp_step_plot
The function we are fitting to the step temperature response is the following.
\[amplitude *(1 - {e}^{\frac{-year}{\tau}})\] where we need to solve for the amplitude and \(\tau\).
# Fit the exponetial results.
fit <- nls(data$value ~ a *(1 - exp(-data$year / tau)), data = data, start = list(a = 2, tau = 1))
fit_rslts <- predict(fit)
How does the fit compare ti the annual data?
# plot the fit.
plot(data$year,data$value, xlab = 'Year', ylab = 'deg C', main = 'Annual Temperature Response to BC Step with Fit')
lines(data$year, fit_rslts, col="red")

What are our values for \(amplitude\) and \(\tau\)?
coefficients(summary(fit))
Estimate Std. Error t value Pr(>|t|)
a 1.176718 0.01028081 114.457737 2.384155e-146
tau 2.079153 0.30534521 6.809188 2.291458e-10
amplitude <- coefficients(summary(fit))[1,1]
tau <- coefficients(summary(fit))[2,1]
Does the amplitude match what we would expect the amplitude to look like? How close it is to the mean temp of the step after 50 years? (By this point in time the temperature has reached equilibrium).
# Subset the data so that the it only contains the temperature response after the first 50 years.
data %>%
filter(year > 50) %>%
pull(value) %>%
mean() ->
expected_amp
# Our expected value based on the equilibirum temp
expected_amp
[1] 1.179832
# The amplitude we got from the nonlinear fit
amplitude
[1] 1.176718
Hey they are pretty close to one another! I think that is pretty darn good!
Now that we have values for \(amplitude\) and \(\tau\) we can take a look at the deriative of the step fit which is equivalent to the temperature impulse response.
The derivative of the step fit looks like this.
\[ \frac{amplitude}{\tau}{e}^{\frac{-year}{\tau}}\]

OKay so now that we have the temperature impulse response we are going to have to normalize the temperature repsonse by RF to get the BC temperature response to a RF pulse because that is what we want the to used in HIRM.
So the units we want here are \(\frac{degC * m^2}{W}\)
If we start with \(deg C\) then we need to divide by the \(\frac\)
# Run Hector for some emissions pathwaway, we will use the BC emissions and RF output to determine Hecotr's RF/Tg BC relationship.
core <- newcore(system.file('input/hector_rcp26.ini', package = 'hector'))
run(core)
hector_output <- fetchvars(core, 1850:2100, vars = c(EMISSIONS_BC(), RF_BC()))
hector_output %>%
select(year, variable, value) %>%
spread(variable, value) %>%
mutate(value = FBC/BC_emissions) %>%
pull(value) %>%
mean ->
RF_Emiss
However the RF_Emiss is the radaitve foring response per TG of BC emissions and according to an email exchange
Use Sand et al.. That is temperature change for a 133 Tg step change in BC emissions. You’ll want to mathematically invert that to the change for 133 Tg impulse.
Therefore we need to multiply the RF_Emiss so that the RF_Emiss we use to normalize the BC temperature response is the appropriate size.

OKay so when we compare the BC and the generic IRF against one another they are similar the BC Sand et al IRF has less of a warming effect and declines faster. I guess that is the dynamic that we are interested in. But let’s see how it holds up when we use it in HIRM.
# First set up HIRM to reproduce Hector temperature.
matrix <- SLCFimpulse::Hector_ConfigMatrix
matrix[ , ] <- 1
rcp45_rows <- which(grepl(x = row.names(matrix), pattern = 'rcp45'))
config_rcp45 <- matrix[rcp45_rows, , drop = FALSE]
rlst_rcp45 <- core_IRM(config_matrix = config_rcp45, rf_list = Hector_RF, irf_list = Hector_IRF, match_agents = FALSE)
rcp45_temp <- mutate(rlst_rcp45$total_temp, model = 'HIRM = Hector')
rcp45_conT <- mutate(rlst_rcp45$temp_contributions, model = 'HIRM = Hector')
BC_IRF_list <- BC_RF_IRF
BC_IRF_list$source <- 'Sand et al'
BC_IRF_list <- split(BC_IRF_list, BC_IRF_list$source)
BC_RF_IRF$agent <- NA
BC_RF_IRF$name <- NA
input <- BC_RF_IRF
Hector_IRF_new <- Hector_IRF
Hector_IRF_new[['BC']] <- input
rlst_BC <- core_IRM(config_matrix = config_BC, rf_list = Hector_RF, irf_list = Hector_IRF_new, match_agents = FALSE)

LS0tCnRpdGxlOiAiQkMgSVJGIGZyb20gdGhlIFNhbmQgZXQgYWwgSW1wdWxzZSBSZXNwb25zZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIFB1cnBvc2UgCgpUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIG91dGxpbmUgdGhlIHByb2Nlc3MgSSB1c2VkIHRvIGdldCB0aGUgQkMgSVJGLgoKIyMjIEZvcm1hdCBEYXRhCgpgYGB7ciBzZXR1cCwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWFnZSA9IEZBTFNFfQojIEltcG9ydCB0aGUgcmVxdWlyZWQgcGFjYWtnZXMKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShoZWN0b3IpCmxpYnJhcnkoU0xDRmltcHVsc2UpCgojIERlZmluZSB0aGUgZGlyZWN0b3JpZXMKQkFTRV9ESVIgIDwtICIvVXNlcnMvZG9yaDAxMi9Eb2N1bWVudHMvMjAxOS9jbWlwLWFyY3RpYy1kYXRhL1NMQ0ZpbXB1bHNlIgpJTlBVVF9ESVIgPC0gZmlsZS5wYXRoKEJBU0VfRElSLCAnZGF0YS1yYXcnKQoKIyBJbXBvcnQgdGhlIFNhbmQgZXQgYWwgQkMgaW1wdWxzZSByZXNvbnNlIGZ1bmN0aW9uIGFuZCAKcGF0aF9jc3YgPC0gZmlsZS5wYXRoKElOUFVUX0RJUiwgJ1RSRUZIVF9maWcxX3RvU3RldmVTbWl0aC54bHN4JykKcmF3X2RhdGEgPC0gcmVhZF9leGNlbChwYXRoX2NzdikKYGBgCgpUaGUgU2FuZCBldC4gYWwgaW1wdWxzZSByZXNwb25zZSBpcyB0aGUgbW9udGhseSB0ZW1wZXJhdHVyZSByZXNwb25zZSBidXQgd2Ugd2FudCB0byB3b3JrIHdpdGggdGhlIGFubnVhbCB0ZW1wZXJhdHVyZSByZXNwb25zZSBzbyBJIGF2ZXJhZ2VkIHRoZSBtb250aGx5IGRhdGEgdG8gZ2V0IHRoZSBhdmVyYWdlIGFubnVhbCB0ZW1wZXJhdHVyZSByZXNwb25zZS4gCgpgYGB7cn0KIyBGaWd1cmUgb3V0IGhvdyBtYW55IHllYXIgb2YgZGF0YSB0aGVyZSBhcmUgaW4gdGhlIGRhdGEgc2V0LiAKbl95cnMgPC0gbnJvdyhyYXdfZGF0YSkgLyAxMgoKIyBUaGVuIGFkZCB0aGUgY29sdW1uIG9mIHRoZSB5ZWFycyBzdGFydGluZyBmcm9tIDEgdG8gdGhlIG51bWJlciBvZiB5ZWFycyAKIyBvZiBkYXRhIGluIG1vbnRobHkgZGF0YSBzZXQuIE5vdGUgdGhhdCBiZWNhc3VlIHRoZSBkYXRhIGlzIGN1cnJlbnRseSAKIyBtb250aGx5IGVhY2ggeWVhciB3aWxsIG5lZWQgdG8gYmUgcmVwcmVhdGVkIDEyIHRpbWVzIGluIGEgcm93LiAKZGF0YS5mcmFtZSh5ZWFyID0gcmVwKDE6bl95cnMsIGVhY2ggPSAxMiksCiAgICAgICAgICAgdmFsdWUgPSByYXdfZGF0YSRgU0FUIEJDYCkgJT4lCiAgIyBSZW1vdmUgMSBmcm9tIHRoZSB5ZWFyIHNvIHRoYXQgdGhlIHRlbXBlcmF0dXJlIHJlc3BvbnNlIGlzIHJlbGF0aXZlIHRvIHRoZSB5ZWFyIG9mIHRoZSBzdGVwLgogIG11dGF0ZSh5ZWFyID0geWVhciAtIDEpICU+JQogICMgRmluZCB0aGUgYW5udWFsIGF2ZXJhZ2UuCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHZhbHVlID0gbWVhbih2YWx1ZSkpICU+JQogIHVuZ3JvdXAgLT4KICBkYXRhCgpgYGAKCkhlcmUgaXMgdGhlIGFubnVhbCB0ZW1wZXJhdHVyZSByZXNwb25zZSB0byB0aGUgQkMgc3RlcCBleHBlcmltZW50LiBUaGVyZSBpcyBhIGxvdCBvZiBub2lzZSBpbiB0aGUgZGF0YSBzbyB3ZSB3aWxsIG5lZWQgdG8gZml0IGFuIGV4cG9uZW50aWFsIGVxdWF0aW9uIHRvIHRoZSB0aW1lIHNlcmVpcy4gIAoKYGBge3J9CmdncGxvdChkYXRhID0gZGF0YSwgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUpKSArIAogIGdlb21fbGluZSgpICsgCiAgbGFicyh5ID0gJ2RlZyBDJywgCiAgICAgICB4ID0gJ3llYXInLCAKICAgICAgIHRpdGxlID0gJ0FubnVhbCBUZW1wZXJhdHVyZSBSZXNwb25zZSB0byBCQyBTdGVwJykgLT4gCiAgdGVtcF9zdGVwX3Bsb3QKYGBgCgoKClRoZSBmdW5jdGlvbiB3ZSBhcmUgZml0dGluZyB0byB0aGUgc3RlcCB0ZW1wZXJhdHVyZSByZXNwb25zZSBpcyB0aGUgZm9sbG93aW5nLiAKCiQkYW1wbGl0dWRlICooMSAtIHtlfV57XGZyYWN7LXllYXJ9e1x0YXV9fSkkJAp3aGVyZSB3ZSBuZWVkIHRvIHNvbHZlIGZvciB0aGUgYW1wbGl0dWRlIGFuZCAkXHRhdSQuIAoKYGBge3J9CiMgRml0IHRoZSBleHBvbmV0aWFsIHJlc3VsdHMuCmZpdCAgICAgICA8LSBubHMoZGF0YSR2YWx1ZSB+IGEgKigxIC0gZXhwKC1kYXRhJHllYXIgLyB0YXUpKSwgZGF0YSA9IGRhdGEsIHN0YXJ0ID0gbGlzdChhID0gMiwgdGF1ID0gMSkpCmZpdF9yc2x0cyA8LSBwcmVkaWN0KGZpdCkKYGBgCgpIb3cgZG9lcyB0aGUgZml0IGNvbXBhcmUgdGkgdGhlIGFubnVhbCBkYXRhPyAKCgpgYGB7cn0KIyBwbG90IHRoZSBmaXQuCnBsb3QoZGF0YSR5ZWFyLGRhdGEkdmFsdWUsIHhsYWIgPSAnWWVhcicsIHlsYWIgPSAnZGVnIEMnLCBtYWluID0gJ0FubnVhbCBUZW1wZXJhdHVyZSBSZXNwb25zZSB0byBCQyBTdGVwIHdpdGggRml0JykKbGluZXMoZGF0YSR5ZWFyLCBmaXRfcnNsdHMsIGNvbD0icmVkIikKCmBgYAoKV2hhdCBhcmUgb3VyIHZhbHVlcyBmb3IgJGFtcGxpdHVkZSQgYW5kICRcdGF1JD8gCgpgYGB7cn0KY29lZmZpY2llbnRzKHN1bW1hcnkoZml0KSkgCgphbXBsaXR1ZGUgPC0gY29lZmZpY2llbnRzKHN1bW1hcnkoZml0KSlbMSwxXQp0YXUgICAgICAgPC0gY29lZmZpY2llbnRzKHN1bW1hcnkoZml0KSlbMiwxXQpgYGAKCkRvZXMgdGhlIGFtcGxpdHVkZSBtYXRjaCB3aGF0IHdlIHdvdWxkIGV4cGVjdCB0aGUgYW1wbGl0dWRlIHRvIGxvb2sgbGlrZT8gSG93IGNsb3NlIGl0IGlzIHRvIHRoZSBtZWFuIHRlbXAgb2YgdGhlIHN0ZXAgYWZ0ZXIgNTAgeWVhcnM/IChCeSB0aGlzIHBvaW50IGluIHRpbWUgdGhlIHRlbXBlcmF0dXJlIGhhcyByZWFjaGVkIGVxdWlsaWJyaXVtKS4gCgoKYGBge3J9CiMgU3Vic2V0IHRoZSBkYXRhIHNvIHRoYXQgdGhlIGl0IG9ubHkgY29udGFpbnMgdGhlIHRlbXBlcmF0dXJlIHJlc3BvbnNlIGFmdGVyIHRoZSBmaXJzdCA1MCB5ZWFycy4KZGF0YSAlPiUgCiAgZmlsdGVyKHllYXIgPiA1MCkgJT4lIAogIHB1bGwodmFsdWUpICU+JSAKICBtZWFuKCkgLT4gCiAgZXhwZWN0ZWRfYW1wCgojIE91ciBleHBlY3RlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgZXF1aWxpYmlydW0gdGVtcCAKZXhwZWN0ZWRfYW1wIAoKIyBUaGUgYW1wbGl0dWRlIHdlIGdvdCBmcm9tIHRoZSBub25saW5lYXIgZml0CmFtcGxpdHVkZQpgYGAKCkhleSB0aGV5IGFyZSBwcmV0dHkgY2xvc2UgdG8gb25lIGFub3RoZXIhIEkgdGhpbmsgdGhhdCBpcyBwcmV0dHkgZGFybiBnb29kISAKCgo8YnI+CgpOb3cgdGhhdCB3ZSBoYXZlIHZhbHVlcyBmb3IgJGFtcGxpdHVkZSQgYW5kICRcdGF1JCB3ZSBjYW4gdGFrZSBhIGxvb2sgYXQgdGhlIGRlcmlhdGl2ZSBvZiB0aGUgc3RlcCBmaXQgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgdGVtcGVyYXR1cmUgaW1wdWxzZSByZXNwb25zZS4gCgoKVGhlIGRlcml2YXRpdmUgb2YgdGhlIHN0ZXAgZml0IGxvb2tzIGxpa2UgdGhpcy4gCgokJCBcZnJhY3thbXBsaXR1ZGV9e1x0YXV9e2V9XntcZnJhY3steWVhcn17XHRhdX19JCQKCgoKYGBge3J9CiMgQ2FsdWNhbHRlIHRoZSBCQyB0ZW1wZXJhdHVyZSBpbXB1bHNlIHJlc3BvbnNlIGZ1bmN0aW9uLiAKeWVhciAgPC0gMDozMDAwCnZhbHVlIDwtIChjb2VmKGZpdClbWydhJ11dKSAvY29lZihmaXQpW1sndGF1J11dICAqIGV4cCgtIHllYXIgLyBjb2VmKGZpdClbWyd0YXUnXV0pCgpCQ190ZW1wX0lSRiA8LSB0aWJibGUoeWVhciA9IHllYXIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSkKCmdncGxvdChkYXRhID0gQkNfdGVtcF9JUkYpICsgCiAgZ2VvbV9saW5lKGFlcyh5ZWFyLCB2YWx1ZSkpICsgCiAgbGFicyh4ID0gJ3llYXIgc2luY2UgaW1wdWxzZScsIAogICAgICAgeSA9ICdkZWcgQycsIAogICAgICAgdGl0bGUgPSAnVGVtcGVyYXR1cmUgSW1wdWxzZSBSZXNwb25zZSB0byBCQyBwZXJ0dXJiYXRpb24nKSArIAogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA3NSkpCmBgYAoKT0theSBzbyBub3cgdGhhdCB3ZSBoYXZlIHRoZSB0ZW1wZXJhdHVyZSBpbXB1bHNlIHJlc3BvbnNlIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIG5vcm1hbGl6ZSB0aGUgdGVtcGVyYXR1cmUgcmVwc29uc2UgYnkgUkYgdG8gZ2V0IHRoZSBCQyB0ZW1wZXJhdHVyZSByZXNwb25zZSB0byBhIFJGIHB1bHNlIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHdlIHdhbnQgdGhlIHRvIHVzZWQgaW4gSElSTS4gCgpTbyB0aGUgdW5pdHMgd2Ugd2FudCBoZXJlIGFyZSAkXGZyYWN7ZGVnQyAqIG1eMn17V30kCgoKSWYgd2Ugc3RhcnQgd2l0aCAkZGVnIEMkIHRoZW4gd2UgbmVlZCB0byBkaXZpZGUgYnkgdGhlICRcZnJhYyQKCgoKYGBge3J9CiMgUnVuIEhlY3RvciBmb3Igc29tZSBlbWlzc2lvbnMgcGF0aHdhd2F5LCB3ZSB3aWxsIHVzZSB0aGUgQkMgZW1pc3Npb25zIGFuZCBSRiBvdXRwdXQgdG8gZGV0ZXJtaW5lIEhlY290cidzIFJGL1RnIEJDIHJlbGF0aW9uc2hpcC4gCmNvcmUgPC0gbmV3Y29yZShzeXN0ZW0uZmlsZSgnaW5wdXQvaGVjdG9yX3JjcDI2LmluaScsIHBhY2thZ2UgPSAnaGVjdG9yJykpIApydW4oY29yZSkKaGVjdG9yX291dHB1dCA8LSBmZXRjaHZhcnMoY29yZSwgMTg1MDoyMTAwLCB2YXJzID0gYyhFTUlTU0lPTlNfQkMoKSwgUkZfQkMoKSkpCgpoZWN0b3Jfb3V0cHV0ICU+JSAKICBzZWxlY3QoeWVhciwgdmFyaWFibGUsIHZhbHVlKSAlPiUgCiAgc3ByZWFkKHZhcmlhYmxlLCB2YWx1ZSkgJT4lIAogIG11dGF0ZSh2YWx1ZSA9IEZCQy9CQ19lbWlzc2lvbnMpICU+JSAKICBwdWxsKHZhbHVlKSAlPiUgCiAgbWVhbiAtPiAKICBSRl9FbWlzcwoKYGBgCgoKSG93ZXZlciB0aGUgUkZfRW1pc3MgaXMgdGhlIHJhZGFpdHZlIGZvcmluZyByZXNwb25zZSBwZXIgVEcgb2YgQkMgZW1pc3Npb25zIGFuZCBhY2NvcmRpbmcgdG8gYW4gZW1haWwgZXhjaGFuZ2UgCgo+IFVzZSBTYW5kIGV0IGFsLi4gClRoYXQgaXMgdGVtcGVyYXR1cmUgY2hhbmdlIGZvciBhIDEzMyBUZyBzdGVwIGNoYW5nZSBpbiBCQyBlbWlzc2lvbnMuIFlvdeKAmWxsIHdhbnQgdG8gbWF0aGVtYXRpY2FsbHkgaW52ZXJ0IHRoYXQgdG8gdGhlIGNoYW5nZSBmb3IgMTMzIFRnIGltcHVsc2UuCgoKVGhlcmVmb3JlIHdlIG5lZWQgdG8gbXVsdGlwbHkgdGhlIFJGX0VtaXNzIHNvIHRoYXQgdGhlIFJGX0VtaXNzIHdlIHVzZSB0byBub3JtYWxpemUgdGhlIEJDIHRlbXBlcmF0dXJlIHJlc3BvbnNlIGlzIHRoZSBhcHByb3ByaWF0ZSBzaXplLiAKCmBgYHtyfQpub3JtYWxpemVfYnkgPC0gUkZfRW1pc3MgKiAxMzMKCkJDX3RlbXBfSVJGICU+JSAKICBtdXRhdGUodmFsdWUgPSB2YWx1ZSAvIG5vcm1hbGl6ZV9ieSkgLT4KICBCQ19SRl9JUkYKYGBgCgoKYGBge3J9CmJpbmRfcm93cyhTTENGaW1wdWxzZTo6SGVjdG9yX0lSRiRnZW5lcmFsX2hlY3RvciAlPiUgCiAgbXV0YXRlKHNvdXJjZSA9ICdIZWN0b3InKSwKQkNfUkZfSVJGICU+JSAKICBtdXRhdGUoc291cmNlID0gJ1NhbmQgZXQgYWwnKSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbG9yID0gc291cmNlKSkgKyAKICBnZW9tX2xpbmUoKSArIAogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA3NSkpICsgCiAgbGFicyh5ID0gJ2RlZyBDIC8gVyAvIG0yJywgCiAgICAgICB4ID0gJ3llYXInLCAKICAgICAgIHRpdGxlID0gJ0JDIFNhbmQgZXQgbGEgdnMgSGVjdG9yIHRlbXAgcmVzcG9uc2UgdG8gUkYnKQoKYGBgCgoKT0theSBzbyB3aGVuIHdlIGNvbXBhcmUgdGhlIEJDIGFuZCB0aGUgZ2VuZXJpYyBJUkYgYWdhaW5zdCBvbmUgYW5vdGhlciB0aGV5IGFyZSBzaW1pbGFyIHRoZSBCQyBTYW5kIGV0IGFsIElSRiBoYXMgbGVzcyBvZiBhIHdhcm1pbmcgZWZmZWN0IGFuZCBkZWNsaW5lcyBmYXN0ZXIuIEkgZ3Vlc3MgdGhhdCBpcyB0aGUgZHluYW1pYyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiBCdXQgbGV0J3Mgc2VlIGhvdyBpdCBob2xkcyB1cCB3aGVuIHdlIHVzZSBpdCBpbiBISVJNLiAKCgoKYGBge3J9CiMgRmlyc3Qgc2V0IHVwIEhJUk0gdG8gcmVwcm9kdWNlIEhlY3RvciB0ZW1wZXJhdHVyZS4gCm1hdHJpeCAgICAgICA8LSBTTENGaW1wdWxzZTo6SGVjdG9yX0NvbmZpZ01hdHJpeAptYXRyaXhbICwgXSAgPC0gMQpyY3A0NV9yb3dzICAgPC0gd2hpY2goZ3JlcGwoeCA9IHJvdy5uYW1lcyhtYXRyaXgpLCBwYXR0ZXJuID0gJ3JjcDQ1JykpCmNvbmZpZ19yY3A0NSA8LSBtYXRyaXhbcmNwNDVfcm93cywgLCBkcm9wID0gRkFMU0VdCnJsc3RfcmNwNDUgICA8LSBjb3JlX0lSTShjb25maWdfbWF0cml4ID0gY29uZmlnX3JjcDQ1LCByZl9saXN0ID0gSGVjdG9yX1JGLCBpcmZfbGlzdCA9IEhlY3Rvcl9JUkYsIG1hdGNoX2FnZW50cyA9IEZBTFNFKQpyY3A0NV90ZW1wICAgPC0gbXV0YXRlKHJsc3RfcmNwNDUkdG90YWxfdGVtcCwgbW9kZWwgPSAnSElSTSA9IEhlY3RvcicpCnJjcDQ1X2NvblQgICA8LSBtdXRhdGUocmxzdF9yY3A0NSR0ZW1wX2NvbnRyaWJ1dGlvbnMsIG1vZGVsID0gJ0hJUk0gPSBIZWN0b3InKQoKQkNfSVJGX2xpc3QgPC0gQkNfUkZfSVJGCkJDX0lSRl9saXN0JHNvdXJjZSA8LSAnU2FuZCBldCBhbCcKQkNfSVJGX2xpc3QgPC0gc3BsaXQoQkNfSVJGX2xpc3QsIEJDX0lSRl9saXN0JHNvdXJjZSkKCkJDX1JGX0lSRiRhZ2VudCA8LSBOQQpCQ19SRl9JUkYkbmFtZSA8LSBOQQppbnB1dCA8LSBCQ19SRl9JUkYKICAKICBIZWN0b3JfSVJGX25ldyAgICAgICAgICA8LSBIZWN0b3JfSVJGCiAgSGVjdG9yX0lSRl9uZXdbWydCQyddXSA8LSAgaW5wdXQKICBybHN0X0JDICAgPC0gY29yZV9JUk0oY29uZmlnX21hdHJpeCA9IGNvbmZpZ19CQywgcmZfbGlzdCA9IEhlY3Rvcl9SRiwgaXJmX2xpc3QgPSBIZWN0b3JfSVJGX25ldywgbWF0Y2hfYWdlbnRzID0gRkFMU0UpCiAgCmBgYAoKCmBgYHtyfQpybHN0X0JDJHRvdGFsX3RlbXAgICU+JSAKICBtdXRhdGUobW9kZWwgPSAnSElSTSBCQycpICU+JSAKICBiaW5kX3Jvd3MocmNwNDVfdGVtcCAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKG1vZGVsID0gJ0hJUk0gSGVjdG9yJykpICU+JSAKICAgIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbG9yID0gbW9kZWwpKSArIAogICAgZ2VvbV9saW5lKCkKCmBgYAoK