Introduction

On Friday, we discussed time-varying transmission and we ran out of time for a couple remaining questions:

  1. What is the impact of changing \(\tau\) (i.e., when we start the intervention and thus the time-varying \(\beta\) takes effect)?
  2. What is the impact of changing the decay of the transmission rate (k)?

This notebook will just quickly show you what happens to both. I’m assuming you’ve already gone through and done the ebola slides and worksheet. If you haven’t, please do those first, or this page probably won’t be very helpful to you.

Before we get started, recall that we use an SEIR model because we believe a priori that the latent period of ebola is important to its dynamics. The general rule of thumb is that if the latent period is of the same order of magnitude as the infectious period, it plays an important role (by removing people from the susceptible population).

While when to use a latent period is a judgment call, it is important you can always justify your decision. Play with this interactive ODE app and see how changing the latent duration (relative to the infectious duration) affects the dynamics of a disease.

Setup

Let’s load deSolve, create initial populations, and a time sequence.

## Load libraries
library(deSolve)
## Set a time sequence for one year in time steps of one day
dt <- seq(0, 365, 1) 
## Set some initial values
inits_alt1 <- c(S = 999999,E = 0, I = 1, R = 0, C = 0, D = 0) 

Make the model

This is a modified version of the SEIR_alt2 model we made in lab. Recall that in the previous model, we assumed tau was equal to 0 (i.e., intervention began immediately) and so we did not include it in our model. In this model, I’m going to add an if() statement that says to use B_init as our \(\beta\) value until we hit time == tau, then start the time-varying transmission.1

SEIR_alt3 <- function(t, x, parms) {
    with(as.list(c(parms, x)), {
        
        if ( (t - 1) >= tau) {
            B  <- B_init * exp(-k * t)
        } else {
            B  <- B_init
        }
        
        N  <- S + E + I + R
        dS <- -(B * S * I) / N 
        dE <- +(B * S * I) / N - (s * E) 
        dI <- (s * E) - (g * I) 
        dR <- (1 - f) * (g * I) 
        
        dC <- s * E
        dD <- f * g * I
        
        der <- c(dS, dE, dI, dR, dC, dD)
        
        return(list(der))
    }) 
}

Question 1: What happens when we change tau?

Now loop through tau

Now, let’s just loop through 11 values of tau from 0 to 100 by steps of ten. Then we will collect the infected column because we don’t really care about the other compartments for this exercise.

## Cycle through different values of tau
taus <- seq(0, 100, 10)
for (tau in taus) {
    parms_loop <- c(B_init = 0.45,   # Initial transmission prob * avg num contacts
                    s = 1/5.3,       # Transition rate from E to I
                    g = 1/5.61,      # Recover rate -- I to R
                    f = 0.6,         # Case fatality ratio
                    k = 0.0097,      # decay of transmission rate
                    tau = tau)       # How many days to delay intervention
    
    temp_holder <- as.data.frame(ode(inits_alt1, dt, SEIR_alt3, 
                                     parms = parms_loop))
    
    if (tau == 0) {
        tau_holder <- temp_holder[, c(1, 4)]
    } else {
        tau_holder <- cbind(tau_holder, tau = temp_holder[, 4])
    }
}

Test yourself. What is in the matrix tau_holder?

head(tau_holder, 10)

Plot it

Test yourself again. Intuitively, what do we expect to have happened to the infectious curve after we delay intervention? Will it shift left or right? Will the peak be higher or lower? Will the impact be linear or exponential?

matplot(tau_holder[, 1], tau_holder[, -1], lty = 1, type = "l", 
        ylab = "Infectious People", xlab= "Time (days)", col = 1:11)
legend("topright", title = "tau", legend = seq(0, 100, 10), 
       lty = 1, col = 1:11)

It’s clear that delaying intervention can have a huge impact on the dynamics in this model and that this impact is nonlinear, suggesting that while an immediate intervention may not be possible, acting quickly is vital.

Question 2: What happens when we change the decay (k)?

Now, let’s assume we always intervene immediately (tau = 0), what is the impact of our decay factor k?

Loop through different values of k.

orig_k <- .0097
## Cycle through different values of k
ks <- seq(orig_k - .0025,
          orig_k + .0025, 
          .0005)
 
for (k in ks) {
    parms_loop <- c(B_init = 0.45,   # Initial transmission prob * avg num contacts
                    s = 1/5.3,       # Transition rate from E to I
                    g = 1/5.61,      # Recover rate -- I to R
                    f = 0.6,         # Case fatality ratio
                    k = k,           # decay of transmission rate
                    tau = 0)         # How many days to delay intervention
    
    temp_holder <- as.data.frame(ode(inits_alt1, dt, SEIR_alt3, 
                                     parms = parms_loop))
    
    if (k == min(ks)) {
        k_holder <- temp_holder[, c(1, 4)]
    } else {
        k_holder <- cbind(k_holder, k = temp_holder[, 4])
    }
}

Plot it

Again, what do you expect to happen? Will the curve shift left or right? Up or down? Linearly or nonlinearly?

matplot(k_holder[, 1], k_holder[, -1], lty = 1, type = "l", 
        ylab = "Infectious People", xlab= "Time (days)", col = 1:11)
legend("topright", title = "k", legend = ks, 
       lty = 1, col = 1:11)

Conclusion

Hopefully, this helps answer your questions about the time-varying transmission model. More importantly, I hope it helps you see why this class uses R. Exploring the effect of a range of parameters is quite straight-forward in R and makes understanding (highly unintuitive) dynamical models a little easier.

Footnotes


  1. Ignore the - 1 for now. Our first time step is 1 and we want tau == 0 to reflect time step == 1 so we offset it.

LS0tCnRpdGxlOiAiVGltZS12YXJ5aW5nIHRyYW5zbWlzc2lvbiBhbmQgZWJvbGEgZHluYW1pY3MiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQotLS0KCiMjIEludHJvZHVjdGlvbgoKT24gRnJpZGF5LCB3ZSBkaXNjdXNzZWQgdGltZS12YXJ5aW5nIHRyYW5zbWlzc2lvbiBhbmQgd2UgcmFuIG91dCBvZiB0aW1lIGZvciBhIGNvdXBsZSByZW1haW5pbmcgcXVlc3Rpb25zOiAgCgoxLiBXaGF0IGlzIHRoZSBpbXBhY3Qgb2YgY2hhbmdpbmcgJFx0YXUkIChpLmUuLCB3aGVuIHdlIHN0YXJ0IHRoZSBpbnRlcnZlbnRpb24gYW5kIHRodXMgdGhlIHRpbWUtdmFyeWluZyAkXGJldGEkIHRha2VzIGVmZmVjdCk/IAoxLiBXaGF0IGlzIHRoZSBpbXBhY3Qgb2YgY2hhbmdpbmcgdGhlIGRlY2F5IG9mIHRoZSB0cmFuc21pc3Npb24gcmF0ZSAoYGtgKT8gCgpUaGlzIG5vdGVib29rIHdpbGwganVzdCBxdWlja2x5IHNob3cgeW91IHdoYXQgaGFwcGVucyB0byBib3RoLiBJJ20gYXNzdW1pbmcgeW91J3ZlIGFscmVhZHkgZ29uZSB0aHJvdWdoIGFuZCBkb25lIFt0aGUgZWJvbGEgc2xpZGVzIGFuZCB3b3Jrc2hlZXRdKGh0dHBzOi8vbWtpYW5nLmdpdGh1Yi5pby9lcGk1MDFfcmV2aWV3LzIwMTgwMjAyX2Vib2xhL2luZGV4Lmh0bWwjMSkuIElmIHlvdSBoYXZlbid0LCBwbGVhc2UgZG8gdGhvc2UgZmlyc3QsIG9yIHRoaXMgcGFnZSBwcm9iYWJseSB3b24ndCBiZSB2ZXJ5IGhlbHBmdWwgdG8geW91LgoKQmVmb3JlIHdlIGdldCBzdGFydGVkLCByZWNhbGwgdGhhdCB3ZSB1c2UgYW4gU0VJUiBtb2RlbCBiZWNhdXNlIHdlIGJlbGlldmUgKmEgcHJpb3JpKiB0aGF0IHRoZSBsYXRlbnQgcGVyaW9kIG9mIGVib2xhIGlzIGltcG9ydGFudCB0byBpdHMgZHluYW1pY3MuIFRoZSBnZW5lcmFsIHJ1bGUgb2YgdGh1bWIgaXMgdGhhdCBpZiB0aGUgbGF0ZW50IHBlcmlvZCBpcyBvZiB0aGUgc2FtZSBvcmRlciBvZiBtYWduaXR1ZGUgYXMgdGhlIGluZmVjdGlvdXMgcGVyaW9kLCBpdCBwbGF5cyBhbiBpbXBvcnRhbnQgcm9sZSAoYnkgcmVtb3ZpbmcgcGVvcGxlIGZyb20gdGhlIHN1c2NlcHRpYmxlIHBvcHVsYXRpb24pLiAKCldoaWxlICp3aGVuKiB0byB1c2UgYSBsYXRlbnQgcGVyaW9kIGlzIGEganVkZ21lbnQgY2FsbCwgaXQgaXMgaW1wb3J0YW50IHlvdSBjYW4gKmFsd2F5cyBqdXN0aWZ5KiB5b3VyIGRlY2lzaW9uLiBQbGF5IHdpdGggdGhpcyBbaW50ZXJhY3RpdmUgT0RFIGFwcF0oaHR0cHM6Ly9ta2lhbmcuc2hpbnlhcHBzLmlvL0Rpc2Vhc2VEeW5hbWljcy8pIGFuZCBzZWUgaG93IGNoYW5naW5nIHRoZSBsYXRlbnQgZHVyYXRpb24gKHJlbGF0aXZlIHRvIHRoZSBpbmZlY3Rpb3VzIGR1cmF0aW9uKSBhZmZlY3RzIHRoZSBkeW5hbWljcyBvZiBhIGRpc2Vhc2UuCgojIyBTZXR1cApMZXQncyBsb2FkIGBkZVNvbHZlYCwgY3JlYXRlIGluaXRpYWwgcG9wdWxhdGlvbnMsIGFuZCBhIHRpbWUgc2VxdWVuY2UuCgpgYGB7cn0KIyMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShkZVNvbHZlKQoKIyMgU2V0IGEgdGltZSBzZXF1ZW5jZSBmb3Igb25lIHllYXIgaW4gdGltZSBzdGVwcyBvZiBvbmUgZGF5CmR0IDwtIHNlcSgwLCAzNjUsIDEpIAoKIyMgU2V0IHNvbWUgaW5pdGlhbCB2YWx1ZXMKaW5pdHNfYWx0MSA8LSBjKFMgPSA5OTk5OTksRSA9IDAsIEkgPSAxLCBSID0gMCwgQyA9IDAsIEQgPSAwKSAKYGBgCgojIyBNYWtlIHRoZSBtb2RlbAoKVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGBTRUlSX2FsdDJgIG1vZGVsIHdlIG1hZGUgaW4gbGFiLiBSZWNhbGwgdGhhdCBpbiB0aGUgcHJldmlvdXMgbW9kZWwsIHdlIGFzc3VtZWQgYHRhdWAgd2FzIGVxdWFsIHRvIDAgKGkuZS4sIGludGVydmVudGlvbiBiZWdhbiBpbW1lZGlhdGVseSkgYW5kIHNvIHdlIGRpZCBub3QgaW5jbHVkZSBpdCBpbiBvdXIgbW9kZWwuIEluIHRoaXMgbW9kZWwsIEknbSBnb2luZyB0byBhZGQgYW4gYGlmKClgIHN0YXRlbWVudCB0aGF0IHNheXMgdG8gdXNlIGBCX2luaXRgIGFzIG91ciAkXGJldGEkIHZhbHVlIHVudGlsIHdlIGhpdCB0aW1lID09IGB0YXVgLCB0aGVuIHN0YXJ0IHRoZSB0aW1lLXZhcnlpbmcgdHJhbnNtaXNzaW9uLlteMV0KCmBgYHtyfQpTRUlSX2FsdDMgPC0gZnVuY3Rpb24odCwgeCwgcGFybXMpIHsKICAgIHdpdGgoYXMubGlzdChjKHBhcm1zLCB4KSksIHsKICAgICAgICAKICAgICAgICBpZiAoICh0IC0gMSkgPj0gdGF1KSB7CiAgICAgICAgICAgIEIgIDwtIEJfaW5pdCAqIGV4cCgtayAqIHQpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQiAgPC0gQl9pbml0CiAgICAgICAgfQogICAgICAgIAogICAgICAgIE4gIDwtIFMgKyBFICsgSSArIFIKICAgICAgICBkUyA8LSAtKEIgKiBTICogSSkgLyBOIAogICAgICAgIGRFIDwtICsoQiAqIFMgKiBJKSAvIE4gLSAocyAqIEUpIAogICAgICAgIGRJIDwtIChzICogRSkgLSAoZyAqIEkpIAogICAgICAgIGRSIDwtICgxIC0gZikgKiAoZyAqIEkpIAogICAgICAgIAogICAgICAgIGRDIDwtIHMgKiBFCiAgICAgICAgZEQgPC0gZiAqIGcgKiBJCiAgICAgICAgCiAgICAgICAgZGVyIDwtIGMoZFMsIGRFLCBkSSwgZFIsIGRDLCBkRCkKICAgICAgICAKICAgICAgICByZXR1cm4obGlzdChkZXIpKQogICAgfSkgCn0KYGBgCgojIyBRdWVzdGlvbiAxOiBXaGF0IGhhcHBlbnMgd2hlbiB3ZSBjaGFuZ2UgYHRhdWA/CiMjIyBOb3cgbG9vcCB0aHJvdWdoIGB0YXVgCgpOb3csIGxldCdzIGp1c3QgbG9vcCB0aHJvdWdoIDExIHZhbHVlcyBvZiBgdGF1YCBmcm9tIDAgdG8gMTAwIGJ5IHN0ZXBzIG9mIHRlbi4gVGhlbiB3ZSB3aWxsIGNvbGxlY3QgdGhlICoqaW5mZWN0ZWQqKiBjb2x1bW4gYmVjYXVzZSB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgb3RoZXIgY29tcGFydG1lbnRzIGZvciB0aGlzIGV4ZXJjaXNlLiAKCmBgYHtyfQojIyBDeWNsZSB0aHJvdWdoIGRpZmZlcmVudCB2YWx1ZXMgb2YgdGF1CnRhdXMgPC0gc2VxKDAsIDEwMCwgMTApCgpmb3IgKHRhdSBpbiB0YXVzKSB7CiAgICBwYXJtc19sb29wIDwtIGMoQl9pbml0ID0gMC40NSwgICAjIEluaXRpYWwgdHJhbnNtaXNzaW9uIHByb2IgKiBhdmcgbnVtIGNvbnRhY3RzCiAgICAgICAgICAgICAgICAgICAgcyA9IDEvNS4zLCAgICAgICAjIFRyYW5zaXRpb24gcmF0ZSBmcm9tIEUgdG8gSQogICAgICAgICAgICAgICAgICAgIGcgPSAxLzUuNjEsICAgICAgIyBSZWNvdmVyIHJhdGUgLS0gSSB0byBSCiAgICAgICAgICAgICAgICAgICAgZiA9IDAuNiwgICAgICAgICAjIENhc2UgZmF0YWxpdHkgcmF0aW8KICAgICAgICAgICAgICAgICAgICBrID0gMC4wMDk3LCAgICAgICMgZGVjYXkgb2YgdHJhbnNtaXNzaW9uIHJhdGUKICAgICAgICAgICAgICAgICAgICB0YXUgPSB0YXUpICAgICAgICMgSG93IG1hbnkgZGF5cyB0byBkZWxheSBpbnRlcnZlbnRpb24KICAgIAogICAgdGVtcF9ob2xkZXIgPC0gYXMuZGF0YS5mcmFtZShvZGUoaW5pdHNfYWx0MSwgZHQsIFNFSVJfYWx0MywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcm1zX2xvb3ApKQogICAgCiAgICBpZiAodGF1ID09IDApIHsKICAgICAgICB0YXVfaG9sZGVyIDwtIHRlbXBfaG9sZGVyWywgYygxLCA0KV0KICAgIH0gZWxzZSB7CiAgICAgICAgdGF1X2hvbGRlciA8LSBjYmluZCh0YXVfaG9sZGVyLCB0YXUgPSB0ZW1wX2hvbGRlclssIDRdKQogICAgfQp9CmBgYAoKVGVzdCB5b3Vyc2VsZi4gV2hhdCBpcyBpbiB0aGUgbWF0cml4IGB0YXVfaG9sZGVyYD8KCmBgYHtyfQpoZWFkKHRhdV9ob2xkZXIsIDEwKQpgYGAKCiMjIyBQbG90IGl0CgpUZXN0IHlvdXJzZWxmIGFnYWluLiBJbnR1aXRpdmVseSwgd2hhdCBkbyB3ZSBleHBlY3QgdG8gaGF2ZSBoYXBwZW5lZCB0byB0aGUgaW5mZWN0aW91cyBjdXJ2ZSBhZnRlciB3ZSBkZWxheSBpbnRlcnZlbnRpb24/IFdpbGwgaXQgc2hpZnQgbGVmdCBvciByaWdodD8gV2lsbCB0aGUgcGVhayBiZSBoaWdoZXIgb3IgbG93ZXI/IFdpbGwgdGhlIGltcGFjdCBiZSBsaW5lYXIgb3IgZXhwb25lbnRpYWw/CgpgYGB7ciBmaWcuaGVpZ2h0PTMuMjUsIGZpZy53aWR0aD01fQptYXRwbG90KHRhdV9ob2xkZXJbLCAxXSwgdGF1X2hvbGRlclssIC0xXSwgbHR5ID0gMSwgdHlwZSA9ICJsIiwgCiAgICAgICAgeWxhYiA9ICJJbmZlY3Rpb3VzIFBlb3BsZSIsIHhsYWI9ICJUaW1lIChkYXlzKSIsIGNvbCA9IDE6MTEpCmxlZ2VuZCgidG9wcmlnaHQiLCB0aXRsZSA9ICJ0YXUiLCBsZWdlbmQgPSBzZXEoMCwgMTAwLCAxMCksIAogICAgICAgbHR5ID0gMSwgY29sID0gMToxMSkKYGBgCgpJdCdzIGNsZWFyIHRoYXQgZGVsYXlpbmcgaW50ZXJ2ZW50aW9uIGNhbiBoYXZlIGEgaHVnZSBpbXBhY3Qgb24gdGhlIGR5bmFtaWNzIGluIHRoaXMgbW9kZWwgYW5kIHRoYXQgdGhpcyBpbXBhY3QgaXMgbm9ubGluZWFyLCBzdWdnZXN0aW5nIHRoYXQgd2hpbGUgYW4gaW1tZWRpYXRlIGludGVydmVudGlvbiBtYXkgbm90IGJlIHBvc3NpYmxlLCBhY3RpbmcgcXVpY2tseSBpcyB2aXRhbC4KCiMjIFF1ZXN0aW9uIDI6IFdoYXQgaGFwcGVucyB3aGVuIHdlIGNoYW5nZSB0aGUgZGVjYXkgKGBrYCk/CgpOb3csIGxldCdzIGFzc3VtZSB3ZSBhbHdheXMgaW50ZXJ2ZW5lIGltbWVkaWF0ZWx5IChgdGF1ID0gMGApLCB3aGF0IGlzIHRoZSBpbXBhY3Qgb2Ygb3VyIGRlY2F5IGZhY3RvciBga2A/CgojIyMgTG9vcCB0aHJvdWdoIGRpZmZlcmVudCB2YWx1ZXMgb2YgYGtgLgoKYGBge3J9Cm9yaWdfayA8LSAuMDA5NwoKIyMgQ3ljbGUgdGhyb3VnaCBkaWZmZXJlbnQgdmFsdWVzIG9mIGsKa3MgPC0gc2VxKG9yaWdfayAtIC4wMDI1LAogICAgICAgICAgb3JpZ19rICsgLjAwMjUsIAogICAgICAgICAgLjAwMDUpCiAKZm9yIChrIGluIGtzKSB7CiAgICBwYXJtc19sb29wIDwtIGMoQl9pbml0ID0gMC40NSwgICAjIEluaXRpYWwgdHJhbnNtaXNzaW9uIHByb2IgKiBhdmcgbnVtIGNvbnRhY3RzCiAgICAgICAgICAgICAgICAgICAgcyA9IDEvNS4zLCAgICAgICAjIFRyYW5zaXRpb24gcmF0ZSBmcm9tIEUgdG8gSQogICAgICAgICAgICAgICAgICAgIGcgPSAxLzUuNjEsICAgICAgIyBSZWNvdmVyIHJhdGUgLS0gSSB0byBSCiAgICAgICAgICAgICAgICAgICAgZiA9IDAuNiwgICAgICAgICAjIENhc2UgZmF0YWxpdHkgcmF0aW8KICAgICAgICAgICAgICAgICAgICBrID0gaywgICAgICAgICAgICMgZGVjYXkgb2YgdHJhbnNtaXNzaW9uIHJhdGUKICAgICAgICAgICAgICAgICAgICB0YXUgPSAwKSAgICAgICAgICMgSG93IG1hbnkgZGF5cyB0byBkZWxheSBpbnRlcnZlbnRpb24KICAgIAogICAgdGVtcF9ob2xkZXIgPC0gYXMuZGF0YS5mcmFtZShvZGUoaW5pdHNfYWx0MSwgZHQsIFNFSVJfYWx0MywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcyA9IHBhcm1zX2xvb3ApKQogICAgCiAgICBpZiAoayA9PSBtaW4oa3MpKSB7CiAgICAgICAga19ob2xkZXIgPC0gdGVtcF9ob2xkZXJbLCBjKDEsIDQpXQogICAgfSBlbHNlIHsKICAgICAgICBrX2hvbGRlciA8LSBjYmluZChrX2hvbGRlciwgayA9IHRlbXBfaG9sZGVyWywgNF0pCiAgICB9Cn0KYGBgCgojIyMgUGxvdCBpdAoKQWdhaW4sIHdoYXQgZG8geW91IGV4cGVjdCB0byBoYXBwZW4/IFdpbGwgdGhlIGN1cnZlIHNoaWZ0IGxlZnQgb3IgcmlnaHQ/IFVwIG9yIGRvd24/IExpbmVhcmx5IG9yIG5vbmxpbmVhcmx5PyAKCmBgYHtyIGZpZy5oZWlnaHQ9My4yNSwgZmlnLndpZHRoPTV9Cm1hdHBsb3Qoa19ob2xkZXJbLCAxXSwga19ob2xkZXJbLCAtMV0sIGx0eSA9IDEsIHR5cGUgPSAibCIsIAogICAgICAgIHlsYWIgPSAiSW5mZWN0aW91cyBQZW9wbGUiLCB4bGFiPSAiVGltZSAoZGF5cykiLCBjb2wgPSAxOjExKQpsZWdlbmQoInRvcHJpZ2h0IiwgdGl0bGUgPSAiayIsIGxlZ2VuZCA9IGtzLCAKICAgICAgIGx0eSA9IDEsIGNvbCA9IDE6MTEpCmBgYAoKIyMgQ29uY2x1c2lvbgoKSG9wZWZ1bGx5LCB0aGlzIGhlbHBzIGFuc3dlciB5b3VyIHF1ZXN0aW9ucyBhYm91dCB0aGUgdGltZS12YXJ5aW5nIHRyYW5zbWlzc2lvbiBtb2RlbC4gTW9yZSBpbXBvcnRhbnRseSwgSSBob3BlIGl0IGhlbHBzIHlvdSBzZWUgd2h5IHRoaXMgY2xhc3MgdXNlcyBgUmAuIEV4cGxvcmluZyB0aGUgZWZmZWN0IG9mIGEgcmFuZ2Ugb2YgcGFyYW1ldGVycyBpcyBxdWl0ZSBzdHJhaWdodC1mb3J3YXJkIGluIGBSYCBhbmQgbWFrZXMgdW5kZXJzdGFuZGluZyAoaGlnaGx5IHVuaW50dWl0aXZlKSBkeW5hbWljYWwgbW9kZWxzIGEgbGl0dGxlIGVhc2llci4gCgojIyBGb290bm90ZXMKW14xXTogSWdub3JlIHRoZSBgLSAxYCBmb3Igbm93LiBPdXIgZmlyc3QgdGltZSBzdGVwIGlzIDEgYW5kIHdlIHdhbnQgYHRhdSA9PSAwYCB0byByZWZsZWN0IHRpbWUgc3RlcCA9PSAxIHNvIHdlIG9mZnNldCBpdC4=