Copy from: MORTGAGE RATES IN THE 21ST CENTURY

df2 <- df.rates %>% spread(symbol,price)


knitr::kable(head(df2,10))

Then we can group by this date variable and compute averages of the daily Treasury yields.

Make the code more readable by creating a fucntion

myr0 <- function(x, a= 0.02){
  geo_ribbon(alpha = a, 
             color =NA, 
             aes(ymin=0, ymax=min(x,!!var)))
}

myr <- function(x, a= 0.02){
  geom_ribbon(alpha =a , 
              color =NA,
              aes(ymin-min(x,!!var)))
}

Yield Curve Plot

Animation

oopt<-ani.options(interval=1/10)
suppressMessages(
  saveGIF({for (i in i.start:N){
  g<- myplotf(i)
  print(g)
  print(paste(i-i.start+1,"out of",N-i.start))
    ani.pause()
  }
    for (ii in 1:20){
      print(g)
      ani.pause()
      print(paste(ii,"out of",20))
    }
  }, movie.name = "ycv2_2018.gif",  ani.width=1200, ani.height=1200)  # set YOURDIRECTORY where you want to save file
)
[1] "1 out of 127"
[1] "2 out of 127"
[1] "3 out of 127"
[1] "4 out of 127"
[1] "5 out of 127"
[1] "6 out of 127"
[1] "7 out of 127"
[1] "8 out of 127"
[1] "9 out of 127"
[1] "10 out of 127"
[1] "11 out of 127"
[1] "12 out of 127"
[1] "13 out of 127"
[1] "14 out of 127"
[1] "15 out of 127"
[1] "16 out of 127"
[1] "17 out of 127"
[1] "18 out of 127"
[1] "19 out of 127"
[1] "20 out of 127"
[1] "21 out of 127"
[1] "22 out of 127"
[1] "23 out of 127"
[1] "24 out of 127"
[1] "25 out of 127"
[1] "26 out of 127"
[1] "27 out of 127"
[1] "28 out of 127"
[1] "29 out of 127"
[1] "30 out of 127"
[1] "31 out of 127"
[1] "32 out of 127"
[1] "33 out of 127"
[1] "34 out of 127"
[1] "35 out of 127"
[1] "36 out of 127"
[1] "37 out of 127"
[1] "38 out of 127"
[1] "39 out of 127"
[1] "40 out of 127"
[1] "41 out of 127"
[1] "42 out of 127"
[1] "43 out of 127"
[1] "44 out of 127"
[1] "45 out of 127"
[1] "46 out of 127"
[1] "47 out of 127"
[1] "48 out of 127"
[1] "49 out of 127"
[1] "50 out of 127"
[1] "51 out of 127"
[1] "52 out of 127"
[1] "53 out of 127"
[1] "54 out of 127"
[1] "55 out of 127"
[1] "56 out of 127"
[1] "57 out of 127"
[1] "58 out of 127"
[1] "59 out of 127"
[1] "60 out of 127"
[1] "61 out of 127"
[1] "62 out of 127"
[1] "63 out of 127"
[1] "64 out of 127"
[1] "65 out of 127"
[1] "66 out of 127"
[1] "67 out of 127"
[1] "68 out of 127"
[1] "69 out of 127"
[1] "70 out of 127"
[1] "71 out of 127"
[1] "72 out of 127"
[1] "73 out of 127"
[1] "74 out of 127"
[1] "75 out of 127"
[1] "76 out of 127"
[1] "77 out of 127"
[1] "78 out of 127"
[1] "79 out of 127"
[1] "80 out of 127"
[1] "81 out of 127"
[1] "82 out of 127"
[1] "83 out of 127"
[1] "84 out of 127"
[1] "85 out of 127"
[1] "86 out of 127"
[1] "87 out of 127"
[1] "88 out of 127"
[1] "89 out of 127"
[1] "90 out of 127"
[1] "91 out of 127"
[1] "92 out of 127"
[1] "93 out of 127"
[1] "94 out of 127"
[1] "95 out of 127"
[1] "96 out of 127"
[1] "97 out of 127"
[1] "98 out of 127"
[1] "99 out of 127"
[1] "100 out of 127"
[1] "101 out of 127"
[1] "102 out of 127"
[1] "103 out of 127"
[1] "104 out of 127"
[1] "105 out of 127"
[1] "106 out of 127"
[1] "107 out of 127"
[1] "108 out of 127"
[1] "109 out of 127"
[1] "110 out of 127"
[1] "111 out of 127"
[1] "112 out of 127"
[1] "113 out of 127"
[1] "114 out of 127"
[1] "115 out of 127"
[1] "116 out of 127"
[1] "117 out of 127"
[1] "118 out of 127"
[1] "119 out of 127"
[1] "120 out of 127"
[1] "121 out of 127"
[1] "122 out of 127"
[1] "123 out of 127"
[1] "124 out of 127"
[1] "125 out of 127"
[1] "126 out of 127"
[1] "127 out of 127"
[1] "128 out of 127"
[1] "1 out of 20"
[1] "2 out of 20"
[1] "3 out of 20"
[1] "4 out of 20"
[1] "5 out of 20"
[1] "6 out of 20"
[1] "7 out of 20"
[1] "8 out of 20"
[1] "9 out of 20"
[1] "10 out of 20"
[1] "11 out of 20"
[1] "12 out of 20"
[1] "13 out of 20"
[1] "14 out of 20"
[1] "15 out of 20"
[1] "16 out of 20"
[1] "17 out of 20"
[1] "18 out of 20"
[1] "19 out of 20"
[1] "20 out of 20"
[1] FALSE

Further study and modification

LS0tDQp0aXRsZTogIk1vcnRhZ2UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KQ29weSBmcm9tOiAgW01PUlRHQUdFIFJBVEVTIElOIFRIRSAyMVNUIENFTlRVUlldKGh0dHA6Ly9sZW5raWVmZXIuY29tLzIwMTgvMDcvMDcvbW9ydGdhZ2UtcmF0ZXMtaW4tdGhlLTIxc3QtY2VudHVyeS8pDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBjYWNoZSA9IFRSVUUpDQoNCmluZGVudDEgPSAnICAgICcNCmluZGVudDIgPSBwYXN0ZShyZXAoaW5kZW50MSwgMiksIGNvbGxhcHNlPScnKQ0KaW5kZW50MyA9IHBhc3RlKHJlcChpbmRlbnQxLCAzKSwgY29sbGFwc2U9JycpDQoNCmRvZXZhbCA9IFRSVUUNCmRvZWNobyA9IEZBTFNFDQoNCiMgZGVmYXVsdCBkZXBlbmRhbmN5DQpsaWJyYXJ5KGtuaXRyKSAgICAgICAjIGZvciBrYWJsZSANCiNsaWJyYXJ5KHRpZHl2ZXJzZSkgICAjIGNvbHVtbiBhcyBuZXN0ZWQgZGF0YSAgZnJhbWUNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBhcHBseWluZyB0aGUgYG1vbnRoYCBmdW5jdGlvbiB0byBleHRyYWN0IG1vbnRoIGZyb20gZGF0ZQ0KICAgICAgICAgICAgICAgICAgICAgIyB0aGUgcGFjYWtnZSBgdGlkeXZlcnNlYCBpcyBkZXBlbmRlbnQgb24gdGhlIHBhY2thZ2UgYGx1YnJpZGF0ZWANCiNsaWJyYXJ5KGNvbmZsaWN0ZWQpICMgYGNvbmZsaWN0ZWRgIGxpYnJhcnkgYWx3YXlzIG1ha2UgdHJvdWJsZSBub3QgZGVidWdnYWJsZSBvciByZWFkYWJsZQ0KDQoNCiMgeWV0IGFub3RoZXIgZXhhbXBsZQ0KIyBbZ2dhbmltYXRlXShodHRwczovL2dpdGh1Yi5jb20vdGhvbWFzcDg1L2dnYW5pbWF0ZSkNCmxpYnJhcnkoZ2FwbWluZGVyKQ0KDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoY293cGxvdCkgICNmb3IgYXJyYW5naW5nIHBsb3RzDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkodGlkeXF1YW50KQ0KDQpsaWJyYXJ5KGFuaW1hdGlvbikNCmBgYA0KDQoNCmBgYHtyIGltcG9ydCBkYXRhLCBtZXNzYWdlID0gRkFMU0V9DQp0aWNrZXJzIDwtIGMoIkRHUzNNTyIsDQogICAgICAgICAgICAgIkRHUzEiLA0KICAgICAgICAgICAgICJER1MyIiwNCiAgICAgICAgICAgICAiREdTMyIsDQogICAgICAgICAgICAgIkRHUzUiLA0KICAgICAgICAgICAgICJER1M3IiwNCiAgICAgICAgICAgICAiREdTMTAiLCANCiAgICAgICAgICAgICAiTU9SVEdBR0UzMFVTIikNCg0KZGYucmF0ZXMgPC0gdGlkeXF1YW50Ojp0cV9nZXQodGlja2VycyxnZXQ9ImVjb25vbWljLmRhdGEiLGZyb209IjIwMDAtMDEtMDEiKQ0KDQpkZi5yYXRlcyAlPiUgaGVhZA0KYGBgDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KZGYyIDwtIGRmLnJhdGVzICU+JSBzcHJlYWQoc3ltYm9sLHByaWNlKQ0KDQoNCmtuaXRyOjprYWJsZShoZWFkKGRmMiwxMCkpDQpgYGANCg0KDQoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0NCmRmMiA8LSBkZjIgJT4lDQogIG11dGF0ZShpZCA9IGFzLm51bWVyaWMocmVsKCFpcy5uYShNT1JUR0FHRTMwVVMpKSksDQogICAgICAgIGlkMiA9IGN1bXN1bShpZCkgKyAxKihpZCA9PSAwKSkgJT4lDQogIG11dGF0ZShkYXRlMj1pZmVsc2UoaWQ9PTEsZGF0ZSxOQSkpICU+JSANCiAgZmlsbChkYXRlMiwgLmRpcmVjdGlvbiA9ICJ1cCIpICU+JQ0KICBtdXRhdGUoZGF0ZTIgPSBiYXNlOjphcy5EYXRlKGRhdGUyLG9yaWdpbiA9ICIxOTcwLTAxLTAxIikpDQoNCmtuaXRyOjprYWJsZShoZWFkKGRmMiwgMTApKQ0KYGBgDQoNCg0KIyBUaGVuIHdlIGNhbiBncm91cCBieSB0aGlzIGRhdGUgdmFyaWFibGUgYW5kIGNvbXB1dGUgYXZlcmFnZXMgb2YgdGhlIGRhaWx5IFRyZWFzdXJ5IHlpZWxkcy4NCg0KDQpgYGB7ciBSZWdyb3VwLCBtZXNzYWdlPUZBTFNFfQ0KZGYzIDwtIA0KICBkZjIgJT4lDQogIGdyb3VwX2J5KGRhdGUyKSAlPiUgDQogICMgZGUtc2VsZWN0IGRhdGUgaWQgYW5kIGBpZDJgDQogIHNlbGVjdCgtZGF0ZSwtaWQsLWlkMikgJT4lIA0KICBzdW1tYXJpemVfYWxsKG1lYW4sIG5hLnJtPVQpICU+JSANCiAgcmVuYW1lKGRhdGU9ZGF0ZTIpICU+JQ0KICBtdXRhdGUoeWVhcj15ZWFyKGRhdGUpLCANCiAgICAgICAgIHllYXJmPWZhY3Rvcih5ZWFyKSwgI3dpbGwgdXNlIGZvciBjb2xvciBsYXRlcg0KICAgICAgICAgc3ByZWFkMTB5Mnk9REdTMTAtREdTMikNCg0Ka25pdHI6OmthYmxlKGhlYWQoZGYzLDEwKSkNCmBgYA0KDQoNCmBgYHtyIEZ1bmN0aW9ucyBmb3IgY29sb3JzLCBtZXNzYWdlPUZBTFNFfQ0KICAjIEZ1bmN0aW9uIGZvciBjb2xvcnMgLS0tLQ0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMjIE1ha2UgQ29sb3IgU2NhbGUgLS0tLSAgIyMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICBteV9jb2xvcnMgPC0gYygNCiAgICAiZ3JlZW4iICAgICAgPSByZ2IoMTAzLDE4MCw3NSwgbWF4Q29sb3JWYWx1ZSA9IDI1NiksDQogICAgImdyZWVuMiIgICAgICA9IHJnYigxNDcsMTk4LDQ0LCBtYXhDb2xvclZhbHVlID0gMjU2KSwNCiAgICAibGlnaHRibHVlIiAgPSAgcmdiKDksIDE3NywyNDAsIG1heENvbG9yVmFsdWUgPSAyNTYpLA0KICAgICJsaWdodGJsdWUyIiA9IHJnYigxNzMsMjE2LDIzMCwgbWF4Q29sb3JWYWx1ZSA9IDI1NiksDQogICAgJ2JsdWUnICAgICAgID0gIiMwMGFlZGIiLA0KICAgICdyZWQnICAgICAgICA9ICIjZDExMTQxIiwNCiAgICAnb3JhbmdlJyAgICAgPSAiI2YzNzczNSIsDQogICAgJ3llbGxvdycgICAgID0gIiNmZmM0MjUiLA0KICAgICdnb2xkJyAgICAgICA9ICIjRkZENzAwIiwNCiAgICAnbGlnaHQgZ3JleScgPSAiI2NjY2NjYyIsDQogICAgJ3B1cnBsZScgICAgID0gIiM1NTFBOEIiLA0KICAgICdkYXJrIGdyZXknICA9ICIjOGM4YzhjIikNCiAgDQogIA0KICBteV9jb2xzIDwtIGZ1bmN0aW9uKC4uLikgew0KICAgIGNvbHMgPC0gYyguLi4pDQogICAgaWYgKGlzLm51bGwoY29scykpDQogICAgICByZXR1cm4gKG15X2NvbG9ycykNCiAgICBteV9jb2xvcnNbY29sc10NCiAgfQ0KICANCiAgDQogIG15X3BhbGV0dGVzIDwtIGxpc3QoDQogICAgYG1haW5gICA9IG15X2NvbHMoImJsdWUiLCAiZ3JlZW4iLCAieWVsbG93IiksDQogICAgYGNvb2xgICA9IG15X2NvbHMoImJsdWUiLCAiZ3JlZW4iKSwNCiAgICBgaG90YCAgID0gbXlfY29scygieWVsbG93IiwgIm9yYW5nZSIsICJyZWQiKSwNCiAgICBgbWl4ZWRgID0gbXlfY29scygibGlnaHRibHVlIiwgImdyZWVuIiwgInllbGxvdyIsICJvcmFuZ2UiLCAicmVkIiksDQogICAgYG1peGVkMmAgPSBteV9jb2xzKCJsaWdodGJsdWUyIiwibGlnaHRibHVlIiwgImdyZWVuIiwgImdyZWVuMiIsInllbGxvdyIsImdvbGQiLCAib3JhbmdlIiwgInJlZCIpLA0KICAgIGBtaXhlZDNgID0gbXlfY29scygibGlnaHRibHVlMiIsImxpZ2h0Ymx1ZSIsICJncmVlbiIsICJ5ZWxsb3ciLCJnb2xkIiwgIm9yYW5nZSIsICJyZWQiKSwNCiAgICBgbWl4ZWQ0YCA9IG15X2NvbHMoImxpZ2h0Ymx1ZTIiLCJsaWdodGJsdWUiLCAiZ3JlZW4iLCAiZ3JlZW4yIiwieWVsbG93IiwiZ29sZCIsICJvcmFuZ2UiLCAicmVkIiwicHVycGxlIiksDQogICAgYG1peGVkNWAgPSBteV9jb2xzKCJsaWdodGJsdWUiLCJncmVlbiIsICJncmVlbjIiLCJ5ZWxsb3ciLCJnb2xkIiwgIm9yYW5nZSIsICJyZWQiLCJwdXJwbGUiLCJibHVlIiksDQogICAgYG1peGVkNmAgPSBteV9jb2xzKCJncmVlbiIsICJnb2xkIiwgIm9yYW5nZSIsICJyZWQiLCJwdXJwbGUiLCJibHVlIiksDQogICAgYGdyZXlgICA9IG15X2NvbHMoImxpZ2h0IGdyZXkiLCAiZGFyayBncmV5IikNCiAgKQ0KICANCiAgDQogIG15X3BhbCA8LSBmdW5jdGlvbihwYWxldHRlID0gIm1haW4iLCByZXZlcnNlID0gRkFMU0UsIC4uLikgew0KICAgIHBhbCA8LSBteV9wYWxldHRlc1tbcGFsZXR0ZV1dDQogICAgDQogICAgaWYgKHJldmVyc2UpIHBhbCA8LSByZXYocGFsKQ0KICAgIA0KICAgIGNvbG9yUmFtcFBhbGV0dGUocGFsLCAuLi4pDQogIH0NCiAgDQogIA0KICBzY2FsZV9jb2xvcl9teWNvbCA8LSBmdW5jdGlvbihwYWxldHRlID0gIm1haW4iLCBkaXNjcmV0ZSA9IFRSVUUsIHJldmVyc2UgPSBGQUxTRSwgLi4uKSB7DQogICAgcGFsIDwtIG15X3BhbChwYWxldHRlID0gcGFsZXR0ZSwgcmV2ZXJzZSA9IHJldmVyc2UpDQogICAgDQogICAgaWYgKGRpc2NyZXRlKSB7DQogICAgICBkaXNjcmV0ZV9zY2FsZSgiY29sb3VyIiwgcGFzdGUwKCJteV8iLCBwYWxldHRlKSwgcGFsZXR0ZSA9IHBhbCwgLi4uKQ0KICAgIH0gZWxzZSB7DQogICAgICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IHBhbCgyNTYpLCAuLi4pDQogICAgfQ0KICB9DQogIA0KICANCiAgDQogIHNjYWxlX2ZpbGxfbXljb2wgPC0gZnVuY3Rpb24ocGFsZXR0ZSA9ICJtYWluIiwgZGlzY3JldGUgPSBUUlVFLCByZXZlcnNlID0gRkFMU0UsIC4uLikgew0KICAgIHBhbCA8LSBteV9wYWwocGFsZXR0ZSA9IHBhbGV0dGUsIHJldmVyc2UgPSByZXZlcnNlKQ0KICAgIA0KICAgIGlmIChkaXNjcmV0ZSkgew0KICAgICAgZGlzY3JldGVfc2NhbGUoImZpbGwiLCBwYXN0ZTAoIm15XyIsIHBhbGV0dGUpLCBwYWxldHRlID0gcGFsLCAuLi4pDQogICAgfSBlbHNlIHsNCiAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBwYWwoMjU2KSwgLi4uKQ0KICAgIH0NCiAgfQ0KDQpgYGANCg0KDQoNCmBgYHtyIHBsb3QsIG1lc3NhZ2U9RkFMU0V9DQoNCiBkZi5tdGc8LSANCiAgZGYucmF0ZXMlPiVkcGx5cjo6ZmlsdGVyKHN5bWJvbD09Ik1PUlRHQUdFMzBVUyIsIHllYXIoZGF0ZSk+PTIwMDApICU+JQ0KICAgIG11dGF0ZSh5ZWFyPXllYXIoZGF0ZSksIA0KICAgICAgICAgICB5ZWFyZj1mYWN0b3IoeWVhcikpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBtdXRhdGUod2Vlaz1yb3dfbnVtYmVyKCkpICU+JSANCiAgdW5ncm91cCgpDQogIA0KICBkZi5tdGckeWVhciA8LSB5ZWFyKGRmLm10ZyRkYXRlKQ0KICBkbGlzdCA8LSB1bmlxdWUoZGYubXRnJGRhdGUpDQogIE4gPC0gbGVuZ3RoKGRsaXN0KQ0KICANCiAgZGxpc3QgPC0gdW5pcXVlKGRmLm10ZyRkYXRlKQ0KICBOIDwtIGxlbmd0aChkbGlzdCkNCiAgVyA8LSBtYXgoZGYubXRnJHdlZWspDQogIA0KICBscDwtIHRhaWwoZGYubXRnLDEpJHByaWNlDQogIGcubGluZSA8LSANCiAgICBnZ3Bsb3QoZGF0YT1kZi5tdGcgLA0KICAgICAgICAgICBhZXMoeD1kYXRlLHk9cHJpY2UsIGZpbGw9eWVhcmYsY29sb3I9eWVhcmYpKSsNCiAgICBnZW9tX3JpYmJvbihhbHBoYT0wLjQsIGNvbG9yPU5BLCBhZXMoeW1pbj1scCx5bWF4PXByaWNlKSkrDQogICAgZ2VvbV9yaWJib24oYWxwaGE9MC4wNSwgY29sb3I9TkEsIGFlcyh5bWluPTMuNSx5bWF4PXByaWNlKSkrDQogICAgZ2VvbV9yaWJib24oYWxwaGE9MC4wNSwgIGNvbG9yPU5BLCBhZXMoeW1pbj0zLHltYXg9cHJpY2UpKSsNCiAgICBnZW9tX3JpYmJvbihhbHBoYT0wLjA1LCBjb2xvcj1OQSwgYWVzKHltaW49Mi41LHltYXg9cHJpY2UpKSsNCiAgICBnZW9tX3JpYmJvbihhbHBoYT0wLjA1LCBjb2xvcj1OQSwgYWVzKHltaW49MSx5bWF4PXByaWNlKSkrDQogICAgZ2VvbV9yaWJib24oYWxwaGE9MC4wNSwgY29sb3I9TkEsIGFlcyh5bWluPTAseW1heD1wcmljZSkpKw0KICAgIGdlb21faGxpbmUoeWludGVyY2VwdD1scCwgbGluZXR5cGU9MikrDQogICAgZ2VvbV9saW5lKHNpemU9MS4xKSsNCiAgICBzY2FsZV9jb2xvcl9teWNvbCgibWl4ZWQ1IikrDQogICAgc2NhbGVfZmlsbF9teWNvbCgibWl4ZWQ1IikrDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTYpKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICAgIGdlb21fdGV4dCggZGF0YT0gZmlsdGVyKGRmLm10ZywgeWVhcj4gMTk5OSAmIHdlZWs9PTI2ICYgeWVhcjwyMDE4IHwgKHllYXI9PTIwMTggJiB3ZWVrPT0xNCkpLCANCiAgICAgICAgICAgICAgIGFlcyh5PTMuMjUsbGFiZWw9eWVhcmYpLHNpemU9MykrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsOS4xKSxicmVha3M9c2VxKDAsOSwxKSxzZWMuYXhpcz1kdXBfYXhpcygpLGV4cGFuZD1jKDAsMCkpKw0KICAgIHNjYWxlX3hfZGF0ZShsaW1pdHM9YXMuRGF0ZShjKCIyMDAwLTAxLTAxIiwiMjAxOC0wNy0xNSIpKSxkYXRlX2JyZWFrcz0iMSB5ZWFyIixkYXRlX2xhYmVscz0iJVkiLGV4cGFuZD1jKDAsMCkpKw0KICAgIGxhYnMoeD0iIix5PSIzMC15ZWFyIGZpeGVkIG1vcnRnYWdlIHJhdGUgKCUpXG4iLA0KICAgICAgICAgc3VidGl0bGU9IlUuUy4gd2Vla2x5IGF2ZXJhZ2UgbW9ydGdhZ2UgcmF0ZXNcbmRvdHRlZCBsaW5lIDQuNTIlLCB3ZWVrbHkgYXZlcmFnZSBmb3IgSnVseSAwNSwgMjAxOCIsDQogICAgICAgICB0aXRsZT0iTW9ydGdhZ2UgcmF0ZSB0cmVuZHMiLA0KICAgICAgICAgY2FwdGlvbj0iQGxlbmtpZWZlciBTb3VyY2U6IEZyZWRkaWUgTWFjIFByaW1hcnkgTW9ydGdhZ2UgTWFya2V0IFN1cnZleSIpKw0KICAgIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3Q9MCkpDQogIGcubGluZQ0KYGBgDQoNCg0KDQojIyBNYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUgYnkgY3JlYXRpbmcgYSBmdWNudGlvbg0KDQpgYGB7ciBteXIwLG15ciBmdW5jaXRvbiwgbWVzc2FnZSA9IEZBTFNFfQ0KbXlyMCA8LSBmdW5jdGlvbih4LCBhPSAwLjAyKXsNCiAgZ2VvX3JpYmJvbihhbHBoYSA9IGEsIA0KICAgICAgICAgICAgIGNvbG9yID1OQSwgDQogICAgICAgICAgICAgYWVzKHltaW49MCwgeW1heD1taW4oeCwhIXZhcikpKQ0KfQ0KDQpteXIgPC0gZnVuY3Rpb24oeCwgYT0gMC4wMil7DQogIGdlb21fcmliYm9uKGFscGhhID1hICwgDQogICAgICAgICAgICAgIGNvbG9yID1OQSwNCiAgICAgICAgICAgICAgYWVzKHltaW4tbWluKHgsISF2YXIpKSkNCn0NCg0KYGBgDQoNCg0KDQoNCmBgYHtyIG1haW4gYm9keSwgbWVzc2FnZT0gRkFMU0V9DQpteWYgPC0gZnVuY3Rpb24odmFyPURHUzEwLCBteS55bGFiPU5VTEwpew0KICAgIHZhciA8LSAgZW5xdW8odmFyKQ0KDQogICAgaWYobWlzc2luZyhteS55bGFiKSkge215LnlsYWI9dmFyfSANCiAgICANCiAgICBteXIwIDwtIGZ1bmN0aW9uKHgsIGE9MC4wMil7DQogICAgZ2VvbV9yaWJib24oYWxwaGE9YSwgY29sb3I9TkEsIGFlcyh5bWluPTAseW1heD1taW4oeCwgISF2YXIgKSkpICAgIA0KICAgICAgfQ0KICAgIA0KICAgIG15ciA8LSBmdW5jdGlvbih4LCBhPTAuMDIpew0KICAgICAgZ2VvbV9yaWJib24oYWxwaGE9YSwgY29sb3I9TkEsIGFlcyh5bWluPW1pbih4LCAhIXZhciApKSkgICAgDQogICAgICB9DQogICAgDQogICAgZ2dwbG90KGRhdGE9ZGYzICwNCiAgICAgICAgICAgYWVzKHg9ZGF0ZSx5PSEhdmFyLCB5bWF4PSAhISB2YXIgLCBmaWxsPXllYXJmLGNvbG9yPXllYXJmKSkrDQogICAgICBnZW9tX2xpbmUoKSsNCiAgICAgIGdlb21fcmliYm9uKGFscGhhPTAuNSwgY29sb3I9TkEsIGFlcyh5bWluPWxhc3QoISF2YXIpKSkrDQogICAgICBtYXAoYygwLHB1bGwoZGYzLCEhdmFyKSAlPiUgbWluKCkpICU+JSBwcmV0dHkoMTIpLCBteXIwLCBhPTAuMDEpKw0KICAgICAgbWFwKGMoMCxwdWxsKGRmMywhIXZhcikgJT4lIGxhc3QoKSkgJT4lIHByZXR0eSgxMiksIG15ciwgYT0wLjAxNSkrDQogICAgICANCiAgICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9bGFzdCghIXZhcikpLCBsaW5ldHlwZT0yKSsNCiAgICAgIGdlb21fbGluZShzaXplPTEuMSkrDQogICAgICBzY2FsZV9jb2xvcl9teWNvbCgibWl4ZWQ1IikrDQogICAgICBzY2FsZV9maWxsX215Y29sKCJtaXhlZDUiKSsNCiAgICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTE0KSAgKw0KICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDksMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgI2xpbWl0cz1jKDAsOS4xKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWMuYXhpcz1kdXBfYXhpcygpLGV4cGFuZD1jKDAsMCkpKw0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cz1hcy5EYXRlKGMoIjIwMDAtMDEtMDEiLCIyMDE4LTA3LTE1IikpLGRhdGVfYnJlYWtzPSIxIHllYXIiLGRhdGVfbGFiZWxzPSIlWSIsZXhwYW5kPWMoMCwwKSkrDQogICAgICBsYWJzKHg9IiIseT1teS55bGFiLA0KICAgICAgICAgICBzdWJ0aXRsZT0iRG90dGVkIGxpbmUgYXQgbGFzdCBvYnNlcnZhdGlvbiIsDQogICAgICAgICAgIHRpdGxlPSJSYXRlIHRyZW5kcyIsDQogICAgICAgICAgIGNhcHRpb249IlNvdXJjZTogRmVkZXJhbCBSZXNlcnZlIEguMTUsIEZyZWRkaWUgTWFjIFByaW1hcnkgTW9ydGdhZ2UgTWFya2V0IFN1cnZleVxuV2Vla2x5IGF2ZXJhZ2VzIChkYWlseSBUcmVhc3VyeSB5aWVsZHMgYXZlcmFnZWQgb3ZlciB3ZWVrIGVuZGluZyBUaHVyc2RheSlcbkBsZW5raWVmZXIgIikrDQogICAgICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0PTApKQ0KICB9DQogIA0KICBteWYodmFyPURHUzEwLCBteS55bGFiPSIxMC15ZWFyIFRyZWFzdXJ5IFlpZWxkICglKSIpKyBsYWJzKHRpdGxlPSJVLlMuIFRyZWFzdXJ5IFlpZWxkczogMTAteWVhciBDb25zdGFudCBNYXR1cml0eSIpDQpgYGANCg0KDQoNCmBgYHtyIGBteWZgL3Bsb3QgYXBwbGllZCB0byBgc3ByZWFkMTB5MnlgLCBtZXNzYWdlPUZBTFNFfQ0KbXlmKHNwcmVhZDEweTJ5KSsgDQogIGxhYnModGl0bGU9IlUuUy4gVHJlYXN1cnkgWWllbGQgQ3VydmUgU2xvcGU6IDEwLXllYXIgbWludXMgMi15ZWFyIiwgDQogICAgICAgeT0iMTAteWVhciBDTVQgLSAyLXllYXIgQ01UICglKSIpDQpgYGANCg0KDQoNCg0KDQojIFlpZWxkIEN1cnZlIFBsb3QNCg0KYGBge3IgWWllbGQgQ3VydmUgcGxvdCwgbWVzc2FnZT0gRkFMU0V9DQojIGZvciB5aWVsZCBjdXJ2ZSAtLS0tDQp5YyA8LSBkYXRhLmZyYW1lKHN5bWJvbD1jKCJER1MzTU8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiREdTMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJER1MyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkRHUzMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiREdTNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJER1M3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkRHUzEwIiksDQogICAgICAgICAgICAgICAgIG1vbnRocz1jKDMsMTIsMjQsMzYsNjAsODQsMTIwKSwNCiAgICAgICAgICAgICAgICAgdHRtPWMoIjMgbW9udGhzIiwiMSB5ZWFyIiwgIjIgeWVhcnMiLCIzIHllYXJzIiwiNSB5ZWFycyIsIjcgeWVhcnMiLCIxMCB5ZWFycyIpKSAlPiUgYXMudGJsDQoNCmRmLnljIDwtIGRmLnJhdGVzICU+JQ0KICBsZWZ0X2pvaW4oeWMsYnk9InN5bWJvbCIpICU+JSANCiAgZmlsdGVyKHN5bWJvbCAhPSJNT1JUR0FHRTMwVVMiKSAlPiUgICMgZHJvcCBtb3J0Z2FnZSByYXRlIGRhdGEgb2YgIk1PUlRHQUdFMzBVUyINCiAgZmlsdGVyKCFpcy5uYShwcmljZSkpICAjIHJlbW92ZSB0aGUgdW5hdmFpbGFibGUgcHJpY2UNCmtuaXRyOjprYWJsZShoZWFkKGRmLnljLDEwKSkNCg0KYGBgDQoNCg0KDQoNCmBgYHtyIE1haW4gcGFydCBmb3IgWUMgcGxvdCxtZXNzYWdlPSBGQUxTRX0NCmRsaXN0LnljIDwtIHVuaXF1ZShkZi55YyRkYXRlKQ0KTiA8LSBsZW5ndGgoZGxpc3QueWMpDQojIGRsaXN0LnljW3llYXIoZGxpc3QueWMpPT0yMDE4XSBmaW5kIHN0YXJ0aW5nIGRhdGVzIHJvdyBudW1iZXIgPSA0NTA0DQoNCmkuc3RhcnQgPC0gNDUwNA0KDQpteXBsb3RmIDwtIGZ1bmN0aW9uKGk9aS5zdGFydCl7DQppbi5kZiA8LSBmaWx0ZXIoZGYueWMsZGF0ZSAlaW4lIGRsaXN0LnljW2MoaS0zMCxpKV0pICU+JSANCiAgZ3JvdXBfYnkodHRtKSAlPiUgDQogIG11dGF0ZShwbWF4PW1heChwcmljZSksIA0KICAgICAgICAgcG1pbj1taW4ocHJpY2UpKSAlPiUNCiAgbXV0YXRlKHAudXAgPSBpZmVsc2UoZGF0ZT09bWF4KGRhdGUpLHByaWNlLCBwbWluKSwNCiAgICAgICAgIHAuZG93biA9IGlmZWxzZShkYXRlPT1tYXgoZGF0ZSkscHJpY2UsIHBtYXgpKQ0KDQpnLmxpbmUgPC0gDQpnZ3Bsb3QoZGF0YT1pbi5kZiwgDQogICAgICAgYWVzKHg9bW9udGhzLHk9cHJpY2UsIGdyb3VwPWRhdGUsIGxpbmV0eXBlPWZhY3RvcihkYXRlKSxjb2xvcj1mYWN0b3IoZGF0ZSkpKSsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTQpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXljJG1vbnRocywgbGFiZWxzPXljJHR0bSkrDQogIGdlb21fcmliYm9uKGFlcyh5bWluPXBtaW4sIHltYXg9cC51cCwgZmlsbD0idXAiKSxhbHBoYT0wLjI1LGNvbG9yPU5BKSsNCiAgZ2VvbV9yaWJib24oYWVzKHltaW49cG1heCwgeW1heD1wLmRvd24sIGZpbGw9ImRvd24iKSwgYWxwaGE9MC4yNSkrDQogIGdlb21fcG9pbnQoc2l6ZT00KSsNCiAgZ2VvbV9wYXRoKCkrDQogIHNjYWxlX2NvbG9yX215Y29sKCJtaXhlZCIscmV2ZXJzZT1ULCBuYW1lPSJEYXRlIikrDQogIHNjYWxlX2ZpbGxfbXljb2woIm1peGVkIixyZXZlcnNlPVQsIG5hbWU9IkRhdGUiKSsNCiAgZ3VpZGVzKGZpbGw9RixsaW5ldHlwZT1GKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiKSsNCiAgbGFicyh4PSJ0aW1lIHRvIG1hdHVyaXR5Iix5PSJZaWVsZCAoJSkiLA0KICAgICAgIHRpdGxlPSJVLlMuIFRyZWFzdXJ5IFlpZWxkIEN1cnZlIiwNCiAgICAgICBzdWJ0aXRsZT0iQmx1ZTogY3VycmVudCBkYXksIFJlZDogMzAgdHJhZGluZyBkYXlzIHByaW9yIikrDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDMuNSksYnJlYWtzPXNlcSgwLDMuNSwwLjUpKQ0KDQpnLmJhciA8LSANCmdncGxvdChkYXRhPWluLmRmLCBhZXMoeD1tb250aHMsDQogICAgICAgICAgICAgICAgICAgICAgIHk9cC5kb3duLXByaWNlKSkrDQogIGdlb21fY29sKGFlcyhmaWxsPSJ5aWVsZCB1cCIpLA0KICAgICAgICAgICBhbHBoYT0wLjUpKw0KICBnZW9tX2NvbChhZXMoeT1wLnVwLXByaWNlLGZpbGw9InlpZWxkIGRvd24iKSwNCiAgICAgICAgICAgYWxwaGE9MC41KSsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTQpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXljJG1vbnRocywgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eWMkdHRtKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKC0wLjYsMC42KSkrDQogIHNjYWxlX2NvbG9yX215Y29sKCJtaXhlZCIsDQogICAgICAgICAgICAgICAgICAgIHJldmVyc2U9VCwgDQogICAgICAgICAgICAgICAgICAgIG5hbWU9IkNoYW5nZSIpKw0KICBzY2FsZV9maWxsX215Y29sKCJtaXhlZCIsDQogICAgICAgICAgICAgICAgICAgcmV2ZXJzZT1ULCANCiAgICAgICAgICAgICAgICAgICBuYW1lPSJDaGFuZ2UiKSsNCiAgIyB0aGVtZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsDQogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3Q9MCkpKw0KICBsYWJzKHg9InRpbWUgdG8gbWF0dXJpdHkiLA0KICAgICAgIHk9ImNoYW5nZSBpbiB5aWVsZCAoJSkiLA0KICAgICAgIHRpdGxlPSIiLA0KICAgICAgIGNhcHRpb249IlNvdXJjZTogQm9hcmQgb2YgR292ZXJub3JzIG9mIHRoZSBGZWRlcmFsIFJlc2VydmUgU3lzdGVtIChVUyksIEguMTUgU2VsZWN0ZWQgSW50ZXJlc3QgUmF0ZXMNCiAgICAgICBcbnJldHJpZXZlZCBmcm9tIEZSRUQsIEZlZGVyYWwgUmVzZXJ2ZSBCYW5rIG9mIFN0LiBMb3VpczsgSnVseSA2LCAyMDE4DQogICAgICAgXG5AbGVua2llZmVyICIpDQoNCiBnPC0gY293cGxvdDo6cGxvdF9ncmlkKGcubGluZSxnLmJhciwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5jb2w9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygyLDEpLCBhbGlnbj0iaHYiKSAgIyB1c2UgY293cGxvdCBmb3IgbXVsdGlwbGUgcGxvdHMNCn0NCg0KDQpteXBsb3RmKE4pICU+JSBwcmludA0KYGBgDQoNCg0KIyBBbmltYXRpb24NCg0KYGBge3IgYW5pbWF0aW9uLCBtZXNzYWdlID0gRkFMU0V9DQpvb3B0PC1hbmkub3B0aW9ucyhpbnRlcnZhbD0xLzEwKQ0KDQpzdXBwcmVzc01lc3NhZ2VzKA0KICBzYXZlR0lGKHtmb3IgKGkgaW4gaS5zdGFydDpOKXsNCiAgZzwtIG15cGxvdGYoaSkNCiAgcHJpbnQoZykNCiAgcHJpbnQocGFzdGUoaS1pLnN0YXJ0KzEsIm91dCBvZiIsTi1pLnN0YXJ0KSkNCiAgICBhbmkucGF1c2UoKQ0KICB9DQogICAgZm9yIChpaSBpbiAxOjIwKXsNCiAgICAgIHByaW50KGcpDQogICAgICBhbmkucGF1c2UoKQ0KICAgICAgcHJpbnQocGFzdGUoaWksIm91dCBvZiIsMjApKQ0KICAgIH0NCiAgfSwgbW92aWUubmFtZSA9ICJ5Y3YyXzIwMTguZ2lmIiwgIGFuaS53aWR0aD0xMjAwLCBhbmkuaGVpZ2h0PTEyMDApICAjIHNldCBZT1VSRElSRUNUT1JZIHdoZXJlIHlvdSB3YW50IHRvIHNhdmUgZmlsZQ0KKQ0KYGBgDQoNCg0KIyBGdXJ0aGVyIHN0dWR5IGFuZCBtb2RpZmljYXRpb24NCg0KLSBbIF0gQ2hhbmdlIHRoZSB0aGVtZSBmb3Igd3NqLCBiYmcsIG55dCBhbmQgZWNvbm9taXN0czsNCi0gWyBdIFVuZGVyc3RhbmQgdGhlIHNjcmlwdHMgYW5kIG1ha2UgaXQgbW9yZSByZWFkYmxlOw0KLSBbIF0gQ2hhbmdlIHRoZSBwbG90IHRvIHBsb3R5Pw0KDQo=