diff --git a/blog.json b/blog.json index eccec17..a3ac7c7 100644 --- a/blog.json +++ b/blog.json @@ -461,7 +461,7 @@ }, "how-to-generate-a-report-for-songs-you-listen-to-using-mpv": { "title": "SG93IHRvIGdlbmVyYXRlIGEgcmVwb3J0IGZvciBzb25ncyB5b3UgbGlzdGVuIHRvIHVzaW5nIE1QVg==", - "content": "QSBkYXkgYWdvIEkgc3RhcnRlZCBjb2xsZWN0aW5nIGRhdGEgYWJvdXQgd2hhdCBJIGxpc3RlbiB0bwpvbiBteSBwbGF5bGlzdCwgYW5kIGN1cnJlbnRseSBpdCdzIHdvcmtpbmcgb3V0IGFtYXppbmcsIGl0J3MgdmVyeQpmdW4sIHNvIEkgdGhvdWdodCB0byBteXNlbGYsICd3aHkgbm90IHNoYXJlIGl0Jywgc28gaGVyZQp5b3UgZ28KCiMjIDEuIFNldCB1cCBgbXB2cGAgYWxpYXMKCmBtcHZwYCBhbGlhcyBpcyB3aGF0IHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIGNvbGxlY3QgZGF0YSBhYm91dAp5b3VyIHBsYXlsaXN0LCB5b3UgY2FuIHNldCB1cCBhbm90aGVyIG5hbWUgYnV0IGNvZGUgc2hvdWxkIGJlCmFyb3VuZCB0aGUgc2FtZQoKQmFzaWNhbGx5LCBhZGQgdGhpcyB0byB5b3VyIGB+Ly5iYXNocmNgOgoKICAgIG1wdnBfY29sbGVjdCgpIHsKICAgICAgICBbICEgLWYgIiRIT01FLy5tcHZwIiBdICYmIDogPiIkSE9NRS8ubXB2cCIKCiAgICAgICAgc2xlZXAgMgoKICAgICAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICAgICBzbGVlcCA1CgogICAgICAgICAgICB4PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKCiAgICAgICAgICAgIFsgISAiJHgiIF0gJiYgYnJlYWsKCiAgICAgICAgICAgIGlmIFsgIiR4IiBdICYmIFsgIiR4IiAhPSAiJCh0YWlsIC1uIDEgIiRIT01FLy5tcHZwIikiIF07IHRoZW4KICAgICAgICAgICAgICAgIHNsZWVwIDQKCiAgICAgICAgICAgICAgICB5PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKICAgICAgICAgICAgICAgIFsgIiR4IiA9ICIkeSIgXSAmJiBlY2hvICIkeCIgPj4iJEhPTUUvLm1wdnAiCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZQogICAgfQoKICAgIGFsaWFzIG1wdnA9J21wdnBfY29sbGVjdCAmIG1wdiAtLXNodWZmbGUgLS1sb29wLXBsYXlsaXN0IC0taW5wdXQtaXBjLXNlcnZlcj0vdG1wL21wdmlwYycKCldoZW4geW91IHVzZSB0aGUgYG1wdnBgIGFsaWFzIGl0J2xsIHN0YXJ0IHRoZSBkYXRhIGNvbGxlY3RvciBpbiB0aGUgYmFja2dyb3VuZCwKdGhlIElQQyB3aWxsIGJlIGFjY2Vzc2libGUgdGhvdWdoIGAvdG1wL21wdmlwY2AsIHRoaXMgd2lsbCBjb2xsZWN0IGFsbApkYXRhIHRvIGB+Ly5tcHZwYCwgbGlzdGVuIHRvIHNvbWUgbXVzaWMgYW5kIGlnbm9yZSBpdCBmb3IgYSBiaXQsIGFsc28sIGtlZXAgaW4gbWluZCwKdGhpcyBjb2RlIGlzIGJhZCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBpbXByb3ZlIGl0IGFuZCBJIG1hZGUgaXQgZmFzdCwgYW55d2F5LCB5b3UKbmVlZCB0byBpbnN0YWxsIGBzb2NhdGAgZm9yIHRoaXMgdG8gd29yawoKIyMgMi4gR2VuZXJhdGUgZGF0YSByZXBvcnQKCldlbGwgYXQgdGhpcyBwb2ludCB5b3UgY2FuIGRvIGFueXRoaW5nIHlvdSB3YW50IHdpdGggeW91ciBkYXRhLCBhbHRob3VnaApJIG1hZGUgYSBzaW1wbGUgZ2VuZXJhdG9yIGZvciBpdAoKU28gSSBtYWRlIHVzZSBvZiB0aGUgZGF0YSBJIGhhdmUgYW5kIG15IHBsYXlsaXN0IHN0cnVjdHVyZSwgaGVyZSdzIGFuIGV4YW1wbGUgZW50cnk6CgogICAgeyJkYXRhIjoicGxheWxpc3QvZ2lybCBpbiByZWQgLSBpJ2xsIGRpZSBhbnl3YXkuIFs4TU1hMzVCM0hUOF0ubXAzIiwicmVxdWVzdF9pZCI6MCwiZXJyb3IiOiJzdWNjZXNzIn0KClRoZXJlJ3MgYW4gSUQgdGhlcmUgc28gSSBhZGQgWW91VHViZSBhZGRpbmcgdG8gdGhlIGdlbmVyYXRvciBieQpkZWZhdWx0LCB5b3VycyBtaWdodCBub3QgaGF2ZSBpdCwgYnV0IEkgbWVhbiwgeW91IGNhbiBzdGlsbCBwcmV0dHkgbXVjaAp1c2UgaXQsIGp1c3QgbGlua3Mgd29uJ3Qgd29yawoKIyMjIDIuMSBUaGUgc2NyaXB0CgpJIG1hZGUgYSBweXRob24gc2NyaXB0IGFzIG15IGdlbmVyYXRvcjoKCiAgICAjIS91c3IvYmluL2VudiBweXRob24zCiAgICAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogICAgIiIiTVBWIHBsYXlsaXN0IHNvbmcgcmVwb3J0ZXIiIiIKCiAgICBpbXBvcnQgb3MKICAgIGltcG9ydCBzeXMKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlIGFzIGh0bWxfZXNjYXBlCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBUdXBsZQogICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MgYXMgZmlsdGVyX3dhcm5pbmdzCgogICAgaW1wb3J0IHVqc29uICAjIHR5cGU6IGlnbm9yZQogICAgZnJvbSBjc3NfaHRtbF9qc19taW5pZnkgaW1wb3J0IGh0bWxfbWluaWZ5ICAjIHR5cGU6IGlnbm9yZQoKICAgIFNPTkdfVE9fQVJUSVNUOiBEaWN0W3N0ciwgc3RyXSA9IHsKICAgICAgICAiMTk4NSI6ICJibyBidXJuaGFtIiwKICAgICAgICAiYXBvY2FseXBzZSI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImFzdHJvbm9teSI6ICJjb25hbiBncmF5IiwKICAgICAgICAiYnJvb2tseW4gYmFieSI6ICJsYW5hIGRlbCByZXkiLAogICAgICAgICJjb21lIGhvbWUgdG8gbWUiOiAiY3Jhd2xlcnMiLAogICAgICAgICJkYWRkeSBpc3N1ZXMiOiAidGhlIG5laWdoYm91cmhvb2QiLAogICAgICAgICJmZWVsIGJldHRlciI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgImhvcm55bG92ZXNpY2ttZXNzIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAiaSB3YW5uYSBiZSB5b3VyIGdpcmxmcmllbmQiOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJrLiI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImxvb2thbGlrZSI6ICJjb25hbiBncmF5IiwKICAgICAgICAibG90dGEgdHJ1ZSBjcmltZSI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgIm15IG1hbidzIGEgaGV4YWdvbiAobXVzaWMgdmlkZW8pIjogIm3DvG5lY2F0IiwKICAgICAgICAicsOkdCI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgInNhcHBobyI6ICJidXNoaWVzIiwKICAgICAgICAic2VyaWFsIGtpbGxlciAtIGxhbmEgZGVsIHJleSBseXJpY3MiOiAibGFuYSBkZWwgcmV5IiwKICAgICAgICAic3VnYXIsIHdlJ3JlIGdvaW4gZG93biBidXQgaXQncyBjcmVlcGllciI6ICJrYWRlIiwKICAgICAgICAic3dlYXRlciB3ZWF0aGVyIjogInRoZSBuZWlnaGJvdXJob29kIiwKICAgICAgICAidGFsaWEg4qe44qe4IGdpcmwgaW4gcmVkIGNvdmVyIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAidHYiOiAiYnVzaGllcyIsCiAgICAgICAgInVuaW9uaXplIC0gbcO8bmVjYXQgKG11c2ljIHZpZGVvKSI6ICJtw7xuZWNhdCIsCiAgICAgICAgIndhdGNoIHlvdSBzbGVlcC4iOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJ5b3UgdXNlZCBtZSBmb3IgbXkgbG92ZV9naXJsIGluIHJlZCI6ICJnaXJsIGluIHJlZCIsCiAgICB9CgoKICAgIGNsYXNzIFVua25vd25NdXNpY0FydGlzdEVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBtdXNpYyBhcnRpc3QiIiIKCgogICAgZGVmIHNvcnRfZGljdChkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgcmV0dXJuIHtrOiB2IGZvciBrLCB2IGluIHNvcnRlZChkLml0ZW1zKCksIGtleT1sYW1iZGEgaXRlbTogaXRlbVsxXSwgcmV2ZXJzZT1UcnVlKX0KCgogICAgZGVmIGZzcGxpdF9kZWxzKHM6IHN0ciwgKmRlbHM6IHN0cikgLT4gc3RyOgogICAgICAgIGZvciBkZWxpbSBpbiBkZWxzOgogICAgICAgICAgICBzID0gcy5zcGxpdChkZWxpbSwgbWF4c3BsaXQ9MSlbMF0KCiAgICAgICAgcmV0dXJuIHMuc3RyaXAoKQoKCiAgICBkZWYgZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZzogc3RyKSAtPiBzdHI6CiAgICAgICAgc29uZyA9IHNvbmcubG93ZXIoKQogICAgICAgIGRlbGltczogVHVwbGVbc3RyLCAuLi5dID0gKAogICAgICAgICAgICAi4oCTIiwKICAgICAgICAgICAgIi0iLAogICAgICAgICkKCiAgICAgICAgaWYgYW55KGQgaW4gc29uZyBmb3IgZCBpbiBkZWxpbXMpOgogICAgICAgICAgICByZXR1cm4gZnNwbGl0X2RlbHMoCiAgICAgICAgICAgICAgICBzb25nLAogICAgICAgICAgICAgICAgKmRlbGltcywKICAgICAgICAgICAgICAgICIsIiwKICAgICAgICAgICAgICAgICJmZWF0LiIsCiAgICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgICAiJiIsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzb25nIGluIFNPTkdfVE9fQVJUSVNUOgogICAgICAgICAgICAgICAgcmV0dXJuIFNPTkdfVE9fQVJUSVNUW3NvbmddLmxvd2VyKCkKCiAgICAgICAgICAgIHJhaXNlIFVua25vd25NdXNpY0FydGlzdEVycm9yKGYiTm8gaGFuZGxlZCBhcnRpc3QgZm9yIHNvbmc6IHtzb25nIXJ9IikKCgogICAgZGVmIGdldF9wbGF5ZWQoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgaW50XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0ge30KCiAgICAgICAgZm9yIHNvbmcsIF8gaW4gZGF0YToKICAgICAgICAgICAgaWYgc29uZyBub3QgaW4gcGxheWVkOgogICAgICAgICAgICAgICAgcGxheWVkW3NvbmddID0gMAoKICAgICAgICAgICAgcGxheWVkW3NvbmddICs9IDEKCiAgICAgICAgcmV0dXJuIHNvcnRfZGljdChwbGF5ZWQpCgoKICAgIGRlZiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgc3RyXToKICAgICAgICByZXR1cm4ge3Nvbmc6IGYiaHR0cHM6Ly9hcmktd2ViLnh5ei95dC93YXRjaD92PXt5dF9pZH0iIGZvciBzb25nLCB5dF9pZCBpbiBkYXRhfQoKCiAgICBkZWYgZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgYXJ0aXN0czogRGljdFtzdHIsIGludF0gPSB7fQoKICAgICAgICBmb3Igc29uZyBpbiBwbGF5ZWQ6CiAgICAgICAgICAgIGFydGlzdDogc3RyID0gZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZykKCiAgICAgICAgICAgIGlmIGFydGlzdCBub3QgaW4gYXJ0aXN0czoKICAgICAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSA9IDAKCiAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSArPSAxCgogICAgICAgIHJldHVybiBzb3J0X2RpY3QoYXJ0aXN0cykKCgogICAgZGVmIHBhcnNlX3Nvbmcoc29uZzogc3RyKSAtPiBUdXBsZVtzdHIsIHN0cl06CiAgICAgICAgYmFzZW5hbWU6IHN0ciA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzb25nKSlbMF0KICAgICAgICByZXR1cm4gYmFzZW5hbWVbOi0xNF0sIGJhc2VuYW1lWy0xMjotMV0KCgogICAgZGVmIHBhcnNlX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0gZ2V0X3BsYXllZChkYXRhKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidG90YWwiOiBsZW4oZGF0YSksCiAgICAgICAgICAgICJwbGF5ZWQiOiBwbGF5ZWQsCiAgICAgICAgICAgICJhcnRpc3RzIjogZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkKSwKICAgICAgICAgICAgInl0LXVybHMiOiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YSksCiAgICAgICAgfQoKCiAgICBkZWYgZ2VuZXJhdGVfaHRtbF9yZXBvcnQoZGF0YTogRGljdFtzdHIsIEFueV0pIC0+IHN0cjoKICAgICAgICBzb25ncyA9IGFydGlzdHMgPSAiIgoKICAgICAgICBmb3Igc29uZywgdGltZXMgaW4gZGF0YVsicGxheWVkIl0uaXRlbXMoKToKICAgICAgICAgICAgc29uZ3MgKz0gZiI8bGk+PGEgaHJlZj1cIntkYXRhWyd5dC11cmxzJ11bc29uZ119XCI+e2h0bWxfZXNjYXBlKHNvbmcpfTwvYT4gKHBsYXllZCB7dGltZXN9IHRpbWV7J3MnIGlmIHRpbWVzID4gMSBlbHNlICcnfSk8L2xpPiIKCiAgICAgICAgZm9yIGFydGlzdCwgc29uZ24gaW4gZGF0YVsiYXJ0aXN0cyJdLml0ZW1zKCk6CiAgICAgICAgICAgIGFydGlzdHMgKz0gZiI8bGk+e2h0bWxfZXNjYXBlKGFydGlzdCl9ICh7c29uZ259IHNvbmd7J3MnIGlmIHNvbmduID4gMSBlbHNlICcnfSBwbGF5ZWQpPC9saT4iCgogICAgICAgIHJldHVybiBodG1sX21pbmlmeSgKICAgICAgICAgICAgZiIiIjwhRE9DVFlQRSBodG1sPgogICAgPGh0bWwgbGFuZz0iZW4iPgogICAgICAgIDxoZWFkPgogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICAgICAgICAgICAgPHRpdGxlPkhUTUwgbXB2IHNvbmcgcmVwb3J0PC90aXRsZT4KCiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGF0IGRvIHlvdSBsaXN0ZW4gdG8iIC8+CiAgICAgICAgICAgIDxtZXRhCiAgICAgICAgICAgICAgICBuYW1lPSJrZXl3b3JkcyIKICAgICAgICAgICAgICAgIGNvbnRlbnQ9InNvcnQsIHJlcG9ydCwgbXVzaWMsIG11c2ljIHJlcG9ydCwgbGlzdGVuLCBzb25nIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8bWV0YQogICAgICAgICAgICAgICAgbmFtZT0icm9ib3RzIgogICAgICAgICAgICAgICAgY29udGVudD0iZm9sbG93LCBpbmRleCwgbWF4LXNuaXBwZXQ6LTEsIG1heC12aWRlby1wcmV2aWV3Oi0xLCBtYXgtaW1hZ2UtcHJldmlldzpsYXJnZSIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiIC8+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImNvbG9yLXNjaGVtZSIgY29udGVudD0iZGFyayIgLz4KCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0eWxlcy5jc3MiIC8+CiAgICAgICAgPC9oZWFkPgoKICAgICAgICA8Ym9keT4KICAgICAgICAgICAgPG1haW4+CiAgICAgICAgICAgICAgICA8aDE+V2hhdCBhcmUgeW91IGxpc3RlbmluZyB0bz88L2gxPgoKICAgICAgICAgICAgICAgIDxociAvPgoKICAgICAgICAgICAgICAgIDxoMj5Ub3RhbCBzb25ncyBwbGF5ZWQ6IHtkYXRhWyd0b3RhbCddfTwvaDI+CgogICAgICAgICAgICAgICAgPGgyPlNvbmdzPC9oMT4KCiAgICAgICAgICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5FeHBhbmQgZm9yIHRoZSBsaXN0IG9mIHNvbmdzPC9zdW1tYXJ5PgoKICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgIHtzb25nc30KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kZXRhaWxzPgoKICAgICAgICAgICAgICAgIDxoMj5BcnRpc3RzPC9oMj4KCiAgICAgICAgICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5FeHBhbmQgZm9yIHRoZSBsaXN0IG9mIGFydGlzdHM8L3N1bW1hcnk+CgogICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAge2FydGlzdHN9CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KICAgICAgICAgICAgPC9tYWluPgogICAgICAgIDwvYm9keT4KICAgIDwvaHRtbD4iIiIKICAgICAgICApCgoKICAgIGRlZiBtYWluKCkgLT4gaW50OgogICAgICAgICIiIkVudHJ5L21haW4gZnVuY3Rpb24iIiIKCiAgICAgICAgZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dID0gW10KCiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguZXhwYW5kdXNlcigifi8ubXB2cCIpLCAiciIpIGFzIG1wdl9kYXRhOgogICAgICAgICAgICBmb3IgbGluZSBpbiBtcHZfZGF0YToKICAgICAgICAgICAgICAgIGlmICciZGF0YSInIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQocGFyc2Vfc29uZyh1anNvbi5sb2FkcyhsaW5lKVsiZGF0YSJdKSkKCiAgICAgICAgd2l0aCBvcGVuKCJpbmRleC5odG1sIiwgInciKSBhcyBoOgogICAgICAgICAgICBoLndyaXRlKGdlbmVyYXRlX2h0bWxfcmVwb3J0KHBhcnNlX2RhdGEoZGF0YSkpKQoKICAgICAgICByZXR1cm4gMAoKCiAgICBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIGFzc2VydCBtYWluLl9fYW5ub3RhdGlvbnNfXy5nZXQoInJldHVybiIpIGlzIGludCwgIm1haW4oKSBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiCgogICAgICAgIGZpbHRlcl93YXJuaW5ncygiZXJyb3IiLCBjYXRlZ29yeT1XYXJuaW5nKQogICAgICAgIHN5cy5leGl0KG1haW4oKSkKClRoaXMgaXMgYSBwcmV0dHkgZWFzeSB0aGluZywgdmVyeSBzdHVwaWQgYW5kIG5vdCBmb29sLXByb29mIGJ1dCBlaCwKdGhpcyBnZW5lcmF0b3Igc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCB0aGUgc29uZyBuYW1lIGZvcm1hdApiZWluZyBgYXJ0aXN0IG5hbWUgLSBzb25nYCwgaWYgaXQncyBub3QgbWFrZSBzdXJlIHRvIGFkZCBhIGxvd2VyY2FzZQplbnRyeSB0byBgU09OR19UT19BUlRJU1RgLCBsaWtlIGlmIHlvdXIgc29uZyB3YXMgbmFtZWQgbGlrZSBgbmFNZSAtIEFydGlzdGAKeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhpcyBlbnRyeToKCiAgICAibmFtZSAtIGFydGlzdCI6ICJhcnRpc3QiLAoKVGhlc2Ugc2V0dGluZ3MgdGhhdCB5b3Ugc2VlIGluIG15IHNjcmlwdCBhcmUgZm9yIG15IHBsYXlsaXN0CgojIyAyLjIgRGVwZW5kZW5jaWVzCgpIZXJlJ3MgdGhlIHB5dGhvbiBkZXBlbmRlbmNpZXMgeW91IG5lZWQ6CgogICAgY3NzLWh0bWwtanMtbWluaWZ5CiAgICB1anNvbgoKWW91IG5lZWQgdG8gaW5zdGFsbCB0aGVtIHVzaW5nCgogICAgcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtLXVzZXIgY3NzLWh0bWwtanMtbWluaWZ5IHVqc29uCgojIyAyLjMgVGhlIGRhdGEgcmVwb3J0CgpPbmNlIHlvdSBoYXZlIGVub3VnaCBkYXRhIHRvIG1ha2UgYSByZXBvcnQgZnJvbSwgcnVuIHRoZSBzY3JpcHQsCmp1c3QKCiAgICBweXRob24zIG1haW4ucHkKCk9yIHdoYXRldmVyLCBpdCdsbCBnZW5lcmF0ZSBgaW5kZXguaHRtbGAgZmlsZSBhbmQgaXQnbGwgaW5jbHVkZSBhbGwgb2YKeW91ciByZXBvcnQgZGF0YSwgeW91IGNhbiBhbHNvIHN0eWxlIGl0IHVzaW5nIHRoZSBgc3R5bGVzLmNzc2AgZmlsZSwgZm9yCmV4YW1wbGUgSSBzdG9sZSBzb21lIENTUyBmcm9tIG15IGJsb2cgYW5kIGl0IGxvb2tzIGdvb2QgZW5vdWdoIHRiaDoKCiAgICBAaW1wb3J0IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9oYWNrLWZvbnRAMy9idWlsZC93ZWIvaGFjay5taW4uY3NzIik7CgogICAgOnJvb3QgewogICAgICAgIGNvbG9yLXNjaGVtZTogZGFyazsKCiAgICAgICAgLS1jbHItYmc6ICMyNjIyMjA7CiAgICAgICAgLS1jbHItZmc6ICNmOWY2ZTg7CiAgICB9CgogICAgKiwKICAgICo6OmJlZm9yZSwKICAgICo6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jbHItYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1jbHItZmcpOwogICAgICAgIGZvbnQtZmFtaWx5OiBIYWNrLCBoYWNrLCBtb25vc3BhY2U7CgogICAgICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKICAgICAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7CgogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CgogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgfQoKICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICBib2R5IHsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgcGFkZGluZzogMnJlbTsKICAgICAgICBtYXgtd2lkdGg6IDExMDBweDsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVTcGVlZDsKICAgIH0KCiAgICBoMSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgfQoKICAgIGxpIHsKICAgICAgICBtYXJnaW46IDAuNWVtOwogICAgfQoKICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB0ZXh0LXNoYWRvdzogMHB4IDBweCA0cHggd2hpdGU7CiAgICB9CgoKICAgIEBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAgICAgKiwKICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgKjo6YWZ0ZXIgewogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDEgIWltcG9ydGFudDsKICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMSAhaW1wb3J0YW50OwoKICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKICAgICAgICAgICAgLW8tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwoKICAgICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgfQoKICAgIEBtZWRpYSAocHJlZmVycy1jb250cmFzdDogbW9yZSkgewogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1jbHItYmc6IGJsYWNrOwogICAgICAgICAgICAtLWNsci1mZzogd2hpdGU7CgogICAgICAgICAgICAtLXNjcm9sbGJhci1oZWlnaHQ6IDEycHg7IC8qIFRPRE86IEZpcmVmb3ggKi8KICAgICAgICB9CgogICAgICAgIGh0bWw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgZGlzcGxheTogaW5pdGlhbCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgKiwKICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgKjo6YWZ0ZXIgewogICAgICAgICAgICBzY3JvbGxiYXItd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKICAgICAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBpbml0aWFsICFpbXBvcnRhbnQ7CiAgICAgICAgfQoKICAgICAgICBhIHsKICAgICAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKCiAgICAgICAgICAgIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgIH0KCiMjIDMuIEZpbmlzaGluZwoKVGhhdCdzIGFsbCwgZW5qb3kgeW91ciBzdGF0aXN0aWNzLCBhbmQgYXMgb2Ygbm93IEkgc2hhbGwgZ28gY29sbGVjdCBtb3JlIGRhdGEsCkkgYWxyZWFkeSBoYXZlIDE4S0Igb2YgaXQhCg==", + "content": "QSBkYXkgYWdvIEkgc3RhcnRlZCBjb2xsZWN0aW5nIGRhdGEgYWJvdXQgd2hhdCBJIGxpc3RlbiB0bwpvbiBteSBwbGF5bGlzdCwgYW5kIGN1cnJlbnRseSBpdCdzIHdvcmtpbmcgb3V0IGFtYXppbmcsIGl0J3MgdmVyeQpmdW4sIHNvIEkgdGhvdWdodCB0byBteXNlbGYsICd3aHkgbm90IHNoYXJlIGl0Jywgc28gaGVyZQp5b3UgZ28KCiMjIDEuIFNldCB1cCBgbXB2cGAgYWxpYXMKCmBtcHZwYCBhbGlhcyBpcyB3aGF0IHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIGNvbGxlY3QgZGF0YSBhYm91dAp5b3VyIHBsYXlsaXN0LCB5b3UgY2FuIHNldCB1cCBhbm90aGVyIG5hbWUgYnV0IGNvZGUgc2hvdWxkIGJlCmFyb3VuZCB0aGUgc2FtZQoKQmFzaWNhbGx5LCBhZGQgdGhpcyB0byB5b3VyIGB+Ly5iYXNocmNgOgoKICAgIG1wdnBfY29sbGVjdCgpIHsKICAgICAgICBbICEgLWYgIiRIT01FLy5tcHZwIiBdICYmIDogPiIkSE9NRS8ubXB2cCIKCiAgICAgICAgc2xlZXAgMgoKICAgICAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICAgICBzbGVlcCA1CgogICAgICAgICAgICB4PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKCiAgICAgICAgICAgIFsgISAiJHgiIF0gJiYgYnJlYWsKCiAgICAgICAgICAgIGlmIFsgIiR4IiBdICYmIFsgIiR4IiAhPSAiJCh0YWlsIC1uIDEgIiRIT01FLy5tcHZwIikiIF07IHRoZW4KICAgICAgICAgICAgICAgIHNsZWVwIDQKCiAgICAgICAgICAgICAgICB5PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKICAgICAgICAgICAgICAgIFsgIiR4IiA9ICIkeSIgXSAmJiBlY2hvICIkeCIgPj4iJEhPTUUvLm1wdnAiCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZQogICAgfQoKICAgIGFsaWFzIG1wdnA9J21wdnBfY29sbGVjdCAmIG1wdiAtLXNodWZmbGUgLS1sb29wLXBsYXlsaXN0IC0taW5wdXQtaXBjLXNlcnZlcj0vdG1wL21wdmlwYycKCldoZW4geW91IHVzZSB0aGUgYG1wdnBgIGFsaWFzIGl0J2xsIHN0YXJ0IHRoZSBkYXRhIGNvbGxlY3RvciBpbiB0aGUgYmFja2dyb3VuZCwKdGhlIElQQyB3aWxsIGJlIGFjY2Vzc2libGUgdGhvdWdoIGAvdG1wL21wdmlwY2AsIHRoaXMgd2lsbCBjb2xsZWN0IGFsbApkYXRhIHRvIGB+Ly5tcHZwYCwgbGlzdGVuIHRvIHNvbWUgbXVzaWMgYW5kIGlnbm9yZSBpdCBmb3IgYSBiaXQsIGFsc28sIGtlZXAgaW4gbWluZCwKdGhpcyBjb2RlIGlzIGJhZCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBpbXByb3ZlIGl0IGFuZCBJIG1hZGUgaXQgZmFzdCwgYW55d2F5LCB5b3UKbmVlZCB0byBpbnN0YWxsIGBzb2NhdGAgZm9yIHRoaXMgdG8gd29yawoKIyMgMi4gR2VuZXJhdGUgZGF0YSByZXBvcnQKCldlbGwgYXQgdGhpcyBwb2ludCB5b3UgY2FuIGRvIGFueXRoaW5nIHlvdSB3YW50IHdpdGggeW91ciBkYXRhLCBhbHRob3VnaApJIG1hZGUgYSBzaW1wbGUgZ2VuZXJhdG9yIGZvciBpdAoKU28gSSBtYWRlIHVzZSBvZiB0aGUgZGF0YSBJIGhhdmUgYW5kIG15IHBsYXlsaXN0IHN0cnVjdHVyZSwgaGVyZSdzIGFuIGV4YW1wbGUgZW50cnk6CgogICAgeyJkYXRhIjoicGxheWxpc3QvZ2lybCBpbiByZWQgLSBpJ2xsIGRpZSBhbnl3YXkuIFs4TU1hMzVCM0hUOF0ubXAzIiwicmVxdWVzdF9pZCI6MCwiZXJyb3IiOiJzdWNjZXNzIn0KClRoZXJlJ3MgYW4gSUQgdGhlcmUgc28gSSBhZGQgWW91VHViZSBhZGRpbmcgdG8gdGhlIGdlbmVyYXRvciBieQpkZWZhdWx0LCB5b3VycyBtaWdodCBub3QgaGF2ZSBpdCwgYnV0IEkgbWVhbiwgeW91IGNhbiBzdGlsbCBwcmV0dHkgbXVjaAp1c2UgaXQsIGp1c3QgbGlua3Mgd29uJ3Qgd29yawoKIyMjIDIuMSBUaGUgc2NyaXB0CgpJIG1hZGUgYSBweXRob24gc2NyaXB0IGFzIG15IGdlbmVyYXRvcjoKCiAgICAjIS91c3IvYmluL2VudiBweXRob24zCiAgICAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogICAgIiIiTVBWIHBsYXlsaXN0IHNvbmcgcmVwb3J0ZXIiIiIKCiAgICBpbXBvcnQgb3MKICAgIGltcG9ydCBzeXMKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlIGFzIGh0bWxfZXNjYXBlCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBUdXBsZQogICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MgYXMgZmlsdGVyX3dhcm5pbmdzCgogICAgaW1wb3J0IHVqc29uICAjIHR5cGU6IGlnbm9yZQogICAgZnJvbSBjc3NfaHRtbF9qc19taW5pZnkgaW1wb3J0IGh0bWxfbWluaWZ5ICAjIHR5cGU6IGlnbm9yZQoKICAgIFNPTkdfVE9fQVJUSVNUOiBEaWN0W3N0ciwgc3RyXSA9IHsKICAgICAgICAiMTk4NSI6ICJibyBidXJuaGFtIiwKICAgICAgICAiYXBvY2FseXBzZSI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImFzdHJvbm9teSI6ICJjb25hbiBncmF5IiwKICAgICAgICAiYnJvb2tseW4gYmFieSI6ICJsYW5hIGRlbCByZXkiLAogICAgICAgICJjb21lIGhvbWUgdG8gbWUiOiAiY3Jhd2xlcnMiLAogICAgICAgICJkYWRkeSBpc3N1ZXMiOiAidGhlIG5laWdoYm91cmhvb2QiLAogICAgICAgICJmZWVsIGJldHRlciI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgImhvcm55bG92ZXNpY2ttZXNzIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAiaSB3YW5uYSBiZSB5b3VyIGdpcmxmcmllbmQiOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJrLiI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImxvb2thbGlrZSI6ICJjb25hbiBncmF5IiwKICAgICAgICAibG90dGEgdHJ1ZSBjcmltZSI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgIm15IG1hbidzIGEgaGV4YWdvbiAobXVzaWMgdmlkZW8pIjogIm3DvG5lY2F0IiwKICAgICAgICAicsOkdCI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgInNhcHBobyI6ICJidXNoaWVzIiwKICAgICAgICAic2VyaWFsIGtpbGxlciAtIGxhbmEgZGVsIHJleSBseXJpY3MiOiAibGFuYSBkZWwgcmV5IiwKICAgICAgICAic3VnYXIsIHdlJ3JlIGdvaW4gZG93biBidXQgaXQncyBjcmVlcGllciI6ICJrYWRlIiwKICAgICAgICAic3dlYXRlciB3ZWF0aGVyIjogInRoZSBuZWlnaGJvdXJob29kIiwKICAgICAgICAidGFsaWEg4qe44qe4IGdpcmwgaW4gcmVkIGNvdmVyIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAidHYiOiAiYnVzaGllcyIsCiAgICAgICAgInVuaW9uaXplIC0gbcO8bmVjYXQgKG11c2ljIHZpZGVvKSI6ICJtw7xuZWNhdCIsCiAgICAgICAgIndhdGNoIHlvdSBzbGVlcC4iOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJ5b3UgdXNlZCBtZSBmb3IgbXkgbG92ZV9naXJsIGluIHJlZCI6ICJnaXJsIGluIHJlZCIsCiAgICB9CgoKICAgIGNsYXNzIFVua25vd25NdXNpY0FydGlzdEVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBtdXNpYyBhcnRpc3QiIiIKCgogICAgZGVmIHNvcnRfZGljdChkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgcmV0dXJuIHtrOiB2IGZvciBrLCB2IGluIHNvcnRlZChkLml0ZW1zKCksIGtleT1sYW1iZGEgaXRlbTogaXRlbVsxXSwgcmV2ZXJzZT1UcnVlKX0KCgogICAgZGVmIGZzcGxpdF9kZWxzKHM6IHN0ciwgKmRlbHM6IHN0cikgLT4gc3RyOgogICAgICAgIGZvciBkZWxpbSBpbiBkZWxzOgogICAgICAgICAgICBzID0gcy5zcGxpdChkZWxpbSwgbWF4c3BsaXQ9MSlbMF0KCiAgICAgICAgcmV0dXJuIHMuc3RyaXAoKQoKCiAgICBkZWYgZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZzogc3RyKSAtPiBzdHI6CiAgICAgICAgc29uZyA9IHNvbmcubG93ZXIoKQogICAgICAgIGRlbGltczogVHVwbGVbc3RyLCAuLi5dID0gKAogICAgICAgICAgICAi4oCTIiwKICAgICAgICAgICAgIi0iLAogICAgICAgICkKCiAgICAgICAgaWYgYW55KGQgaW4gc29uZyBmb3IgZCBpbiBkZWxpbXMpOgogICAgICAgICAgICByZXR1cm4gZnNwbGl0X2RlbHMoCiAgICAgICAgICAgICAgICBzb25nLAogICAgICAgICAgICAgICAgKmRlbGltcywKICAgICAgICAgICAgICAgICIsIiwKICAgICAgICAgICAgICAgICJmZWF0LiIsCiAgICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgICAiJiIsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzb25nIGluIFNPTkdfVE9fQVJUSVNUOgogICAgICAgICAgICAgICAgcmV0dXJuIFNPTkdfVE9fQVJUSVNUW3NvbmddLmxvd2VyKCkKCiAgICAgICAgICAgIHJhaXNlIFVua25vd25NdXNpY0FydGlzdEVycm9yKGYiTm8gaGFuZGxlZCBhcnRpc3QgZm9yIHNvbmc6IHtzb25nIXJ9IikKCgogICAgZGVmIGdldF9wbGF5ZWQoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgaW50XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0ge30KCiAgICAgICAgZm9yIHNvbmcsIF8gaW4gZGF0YToKICAgICAgICAgICAgaWYgc29uZyBub3QgaW4gcGxheWVkOgogICAgICAgICAgICAgICAgcGxheWVkW3NvbmddID0gMAoKICAgICAgICAgICAgcGxheWVkW3NvbmddICs9IDEKCiAgICAgICAgcmV0dXJuIHNvcnRfZGljdChwbGF5ZWQpCgoKICAgIGRlZiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgc3RyXToKICAgICAgICByZXR1cm4ge3Nvbmc6IGYiaHR0cHM6Ly9hcmktd2ViLnh5ei95dC93YXRjaD92PXt5dF9pZH0iIGZvciBzb25nLCB5dF9pZCBpbiBkYXRhfQoKCiAgICBkZWYgZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgYXJ0aXN0czogRGljdFtzdHIsIGludF0gPSB7fQoKICAgICAgICBmb3Igc29uZyBpbiBwbGF5ZWQ6CiAgICAgICAgICAgIGFydGlzdDogc3RyID0gZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZykKCiAgICAgICAgICAgIGlmIGFydGlzdCBub3QgaW4gYXJ0aXN0czoKICAgICAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSA9IDAKCiAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSArPSAxCgogICAgICAgIHJldHVybiBzb3J0X2RpY3QoYXJ0aXN0cykKCgogICAgZGVmIHBhcnNlX3Nvbmcoc29uZzogc3RyKSAtPiBUdXBsZVtzdHIsIHN0cl06CiAgICAgICAgYmFzZW5hbWU6IHN0ciA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzb25nKSlbMF0KICAgICAgICByZXR1cm4gYmFzZW5hbWVbOi0xNF0sIGJhc2VuYW1lWy0xMjotMV0KCgogICAgZGVmIHBhcnNlX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0gZ2V0X3BsYXllZChkYXRhKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidG90YWwiOiBsZW4oZGF0YSksCiAgICAgICAgICAgICJwbGF5ZWQiOiBwbGF5ZWQsCiAgICAgICAgICAgICJhcnRpc3RzIjogZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkKSwKICAgICAgICAgICAgInl0LXVybHMiOiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YSksCiAgICAgICAgfQoKCiAgICBkZWYgZ2VuZXJhdGVfaHRtbF9yZXBvcnQoZGF0YTogRGljdFtzdHIsIEFueV0pIC0+IHN0cjoKICAgICAgICBzb25ncyA9IGFydGlzdHMgPSAiIgoKICAgICAgICBmb3Igc29uZywgdGltZXMgaW4gZGF0YVsicGxheWVkIl0uaXRlbXMoKToKICAgICAgICAgICAgc29uZ3MgKz0gZiI8bGk+PGEgaHJlZj1cIntkYXRhWyd5dC11cmxzJ11bc29uZ119XCI+e2h0bWxfZXNjYXBlKHNvbmcpfTwvYT4gKHBsYXllZCA8Y29kZT57dGltZXN9PC9jb2RlPiB0aW1leydzJyBpZiB0aW1lcyA+IDEgZWxzZSAnJ30pPC9saT4iCgogICAgICAgIGZvciBhcnRpc3QsIHNvbmduIGluIGRhdGFbImFydGlzdHMiXS5pdGVtcygpOgogICAgICAgICAgICBhcnRpc3RzICs9IGYiPGxpPntodG1sX2VzY2FwZShhcnRpc3QpfSAoPGNvZGU+e3NvbmdufTwvY29kZT4gc29uZ3sncycgaWYgc29uZ24gPiAxIGVsc2UgJyd9IHBsYXllZCk8L2xpPiIKCiAgICAgICAgcmV0dXJuIGh0bWxfbWluaWZ5KAogICAgICAgICAgICBmIiIiPCFET0NUWVBFIGh0bWw+CiAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICAgICAgPGhlYWQ+CiAgICAgICAgICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KICAgICAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgICAgICAgICA8dGl0bGU+SFRNTCBtcHYgc29uZyByZXBvcnQ8L3RpdGxlPgoKICAgICAgICAgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoYXQgZG8geW91IGxpc3RlbiB0byIgLz4KICAgICAgICAgICAgPG1ldGEKICAgICAgICAgICAgICAgIG5hbWU9ImtleXdvcmRzIgogICAgICAgICAgICAgICAgY29udGVudD0ic29ydCwgcmVwb3J0LCBtdXNpYywgbXVzaWMgcmVwb3J0LCBsaXN0ZW4sIHNvbmciCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxtZXRhCiAgICAgICAgICAgICAgICBuYW1lPSJyb2JvdHMiCiAgICAgICAgICAgICAgICBjb250ZW50PSJmb2xsb3csIGluZGV4LCBtYXgtc25pcHBldDotMSwgbWF4LXZpZGVvLXByZXZpZXc6LTEsIG1heC1pbWFnZS1wcmV2aWV3OmxhcmdlIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0id2Vic2l0ZSIgLz4KICAgICAgICAgICAgPG1ldGEgbmFtZT0iY29sb3Itc2NoZW1lIiBjb250ZW50PSJkYXJrIiAvPgoKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3R5bGVzLmNzcyIgLz4KICAgICAgICA8L2hlYWQ+CgogICAgICAgIDxib2R5PgogICAgICAgICAgICA8bWFpbj4KICAgICAgICAgICAgICAgIDxoMT5XaGF0IGFyZSB5b3UgbGlzdGVuaW5nIHRvPzwvaDE+CgogICAgICAgICAgICAgICAgPGhyIC8+CgogICAgICAgICAgICAgICAgPGgyPlN0YXRzPC9oMj4KCiAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgPGxpPlNvbmdzIHBsYXllZDogPGNvZGU+e2RhdGFbJ3RvdGFsJ119PC9jb2RlPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPlVuaXF1ZSBzb25ncyBwbGF5ZWQ6IDxjb2RlPntsZW4oZGF0YVsncGxheWVkJ10pfTwvY29kZT48L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT5BcnRpc3RzOiA8Y29kZT57bGVuKGRhdGFbJ2FydGlzdHMnXSl9PC9jb2RlPjwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICAgIDxoMj5Tb25nczwvaDE+CgogICAgICAgICAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+RXhwYW5kIGZvciB0aGUgbGlzdCBvZiBzb25nczwvc3VtbWFyeT4KCiAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICB7c29uZ3N9CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KCiAgICAgICAgICAgICAgICA8aDI+QXJ0aXN0czwvaDI+CgogICAgICAgICAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+RXhwYW5kIGZvciB0aGUgbGlzdCBvZiBhcnRpc3RzPC9zdW1tYXJ5PgoKICAgICAgICAgICAgICAgICAgICA8dWw+e2FydGlzdHN9PC91bD4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KCiAgICAgICAgICAgICAgICA8aDI+UmF3IEpTT04gZGF0YTwvaDI+CgogICAgICAgICAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+RXhwYW5kIGZvciB0aGUgcmF3IGRhdGE8L3N1bW1hcnk+CiAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57dWpzb24uZHVtcHMoZGF0YSwgaW5kZW50PTQpfTwvY29kZT48L3ByZT4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KICAgICAgICAgICAgPC9tYWluPgogICAgICAgIDwvYm9keT4KICAgIDwvaHRtbD4iIiIKICAgICAgICApCgoKICAgIGRlZiBtYWluKCkgLT4gaW50OgogICAgICAgICIiIkVudHJ5L21haW4gZnVuY3Rpb24iIiIKCiAgICAgICAgZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dID0gW10KCiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguZXhwYW5kdXNlcigifi8ubXB2cCIpLCAiciIpIGFzIG1wdl9kYXRhOgogICAgICAgICAgICBmb3IgbGluZSBpbiBtcHZfZGF0YToKICAgICAgICAgICAgICAgIGlmICciZGF0YSInIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQocGFyc2Vfc29uZyh1anNvbi5sb2FkcyhsaW5lKVsiZGF0YSJdKSkKCiAgICAgICAgd2l0aCBvcGVuKCJpbmRleC5odG1sIiwgInciKSBhcyBoOgogICAgICAgICAgICBoLndyaXRlKGdlbmVyYXRlX2h0bWxfcmVwb3J0KHBhcnNlX2RhdGEoZGF0YSkpKQoKICAgICAgICByZXR1cm4gMAoKCiAgICBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIGFzc2VydCBtYWluLl9fYW5ub3RhdGlvbnNfXy5nZXQoInJldHVybiIpIGlzIGludCwgIm1haW4oKSBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiCgogICAgICAgIGZpbHRlcl93YXJuaW5ncygiZXJyb3IiLCBjYXRlZ29yeT1XYXJuaW5nKQogICAgICAgIHN5cy5leGl0KG1haW4oKSkKClRoaXMgaXMgYSBwcmV0dHkgZWFzeSB0aGluZywgdmVyeSBzdHVwaWQgYW5kIG5vdCBmb29sLXByb29mIGJ1dCBlaCwKdGhpcyBnZW5lcmF0b3Igc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCB0aGUgc29uZyBuYW1lIGZvcm1hdApiZWluZyBgYXJ0aXN0IG5hbWUgLSBzb25nYCwgaWYgaXQncyBub3QgbWFrZSBzdXJlIHRvIGFkZCBhIGxvd2VyY2FzZQplbnRyeSB0byBgU09OR19UT19BUlRJU1RgLCBsaWtlIGlmIHlvdXIgc29uZyB3YXMgbmFtZWQgbGlrZSBgbmFNZSAtIEFydGlzdGAKeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhpcyBlbnRyeToKCiAgICAibmFtZSAtIGFydGlzdCI6ICJhcnRpc3QiLAoKVGhlc2Ugc2V0dGluZ3MgdGhhdCB5b3Ugc2VlIGluIG15IHNjcmlwdCBhcmUgZm9yIG15IHBsYXlsaXN0CgojIyAyLjIgRGVwZW5kZW5jaWVzCgpIZXJlJ3MgdGhlIHB5dGhvbiBkZXBlbmRlbmNpZXMgeW91IG5lZWQ6CgogICAgY3NzLWh0bWwtanMtbWluaWZ5CiAgICB1anNvbgoKWW91IG5lZWQgdG8gaW5zdGFsbCB0aGVtIHVzaW5nCgogICAgcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtLXVzZXIgY3NzLWh0bWwtanMtbWluaWZ5IHVqc29uCgojIyAyLjMgVGhlIGRhdGEgcmVwb3J0CgpPbmNlIHlvdSBoYXZlIGVub3VnaCBkYXRhIHRvIG1ha2UgYSByZXBvcnQgZnJvbSwgcnVuIHRoZSBzY3JpcHQsCmp1c3QKCiAgICBweXRob24zIG1haW4ucHkKCk9yIHdoYXRldmVyLCBpdCdsbCBnZW5lcmF0ZSBgaW5kZXguaHRtbGAgZmlsZSBhbmQgaXQnbGwgaW5jbHVkZSBhbGwgb2YKeW91ciByZXBvcnQgZGF0YSwgeW91IGNhbiBhbHNvIHN0eWxlIGl0IHVzaW5nIHRoZSBgc3R5bGVzLmNzc2AgZmlsZSwgZm9yCmV4YW1wbGUgSSBzdG9sZSBzb21lIENTUyBmcm9tIG15IGJsb2cgYW5kIGl0IGxvb2tzIGdvb2QgZW5vdWdoIHRiaDoKCiAgICBAaW1wb3J0IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9oYWNrLWZvbnRAMy9idWlsZC93ZWIvaGFjay5taW4uY3NzIik7CgogICAgOnJvb3QgewogICAgICAgIGNvbG9yLXNjaGVtZTogZGFyazsKCiAgICAgICAgLS1jbHItYmc6ICMyNjIyMjA7CiAgICAgICAgLS1jbHItZmc6ICNmOWY2ZTg7CgogICAgICAgIC0tY2xyLWNvZGUtYmc6ICMxZjFiMWE7CiAgICAgICAgLS1jbHItY29kZS1mZzogI2YwZjNlNjsKICAgICAgICAtLWNsci1jb2RlLWJnLWRhcms6ICMxODE0MTQ7CgogICAgICAgIC0tc2Nyb2xsYmFyLWhlaWdodDogNnB4OyAvKiBUT0RPOiBGaXJlZm94ICovCiAgICB9CgogICAgKiwKICAgICo6OmJlZm9yZSwKICAgICo6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jbHItYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1jbHItZmcpOwogICAgICAgIGZvbnQtZmFtaWx5OiBIYWNrLCBoYWNrLCBtb25vc3BhY2U7CgogICAgICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKICAgICAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7CgogICAgICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tY2xyLWNvZGUtYmctZGFyaykgdHJhbnNwYXJlbnQ7CgogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgLyoKICAgICAgICAgKiBSZW1vdmVkIGJlY2F1c2UgdXNlcnMgYXNrZWQgdG8gdG86CiAgICAgICAgICogd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgICAqICovCgogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgfQoKICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIsCiAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXNjcm9sbGJhci1oZWlnaHQpOwogICAgfQoKICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgfQoKICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNsci1jb2RlLWJnLWRhcmspOwogICAgfQoKICAgIGh0bWw6Oi13ZWJraXQtc2Nyb2xsYmFyLAogICAgYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAvKgogICAgICogUmVtb3ZlZCBiZWNhdXNlIEkgd2FudCBjb2RlIGJsb2NrcyB0byBzY3JvbGwKICAgICAqCiAgICBjb2RlLAogICAgY29kZSAqLAogICAgcHJlLAogICAgcHJlICogewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsKICAgICAgICB3aGl0ZS1zcGFjZTogLXByZS13cmFwOwogICAgICAgIHdoaXRlLXNwYWNlOiAtby1wcmUtd3JhcDsKICAgIH0KICAgICAqCiAgICAgKi8KCiAgICBib2R5IHsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgcGFkZGluZzogMnJlbTsKICAgICAgICBtYXgtd2lkdGg6IDExMDBweDsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVTcGVlZDsKICAgIH0KCiAgICBoMSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgfQoKICAgIGxpIHsKICAgICAgICBtYXJnaW46IDAuNWVtOwogICAgfQoKICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB0ZXh0LXNoYWRvdzogMHB4IDBweCA0cHggd2hpdGU7CiAgICB9CgogICAgcHJlLAogICAgcHJlICogewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNsci1jb2RlLWJnKTsKICAgIH0KCiAgICBwcmUsCiAgICBwcmUgKiwKICAgIGNvZGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1jbHItY29kZS1mZyk7CiAgICB9CgogICAgcHJlLAogICAgcHJlIGNvZGUgewogICAgICAgIG92ZXJmbG93LXg6IGF1dG8gIWltcG9ydGFudDsKCiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBpbml0aWFsOwogICAgICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogaW5pdGlhbDsKICAgIH0KCiAgICBwcmUgewogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB9CgogICAgY29kZTpub3QocHJlIGNvZGUpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jbHItY29kZS1iZyk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIHBhZGRpbmc6IDAuMmVtOwogICAgfQoKICAgICNpbmZvLWJhciB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgfQoKICAgICNibG9nLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmc6IDAuM2VtOwogICAgfQoKICAgIEBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAgICAgKiwKICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgKjo6YWZ0ZXIgewogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDEgIWltcG9ydGFudDsKICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMSAhaW1wb3J0YW50OwoKICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKICAgICAgICAgICAgLW8tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwoKICAgICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgfQoKICAgIEBtZWRpYSAocHJlZmVycy1jb250cmFzdDogbW9yZSkgewogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1jbHItYmc6IGJsYWNrOwogICAgICAgICAgICAtLWNsci1mZzogd2hpdGU7CgogICAgICAgICAgICAtLWNsci1jb2RlLWJnOiAjMTgxODE4OwogICAgICAgICAgICAtLWNsci1jb2RlLWZnOiB3aGl0ZXNtb2tlOwoKICAgICAgICAgICAgLS1zY3JvbGxiYXItaGVpZ2h0OiAxMnB4OyAvKiBUT0RPOiBGaXJlZm94ICovCiAgICAgICAgfQoKICAgICAgICBodG1sOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgICAgIGRpc3BsYXk6IGluaXRpYWwgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgICosCiAgICAgICAgKjo6YmVmb3JlLAogICAgICAgICo6OmFmdGVyIHsKICAgICAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBpbml0aWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogaW5pdGlhbCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgYSB7CiAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAtd2Via2l0LXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZCAhaW1wb3J0YW50OwogICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQgIWltcG9ydGFudDsKICAgICAgICB9CiAgICB9CgojIyAzLiBGaW5pc2hpbmcKClRoYXQncyBhbGwsIGVuam95IHlvdXIgc3RhdGlzdGljcywgYW5kIGFzIG9mIG5vdyBJIHNoYWxsIGdvIGNvbGxlY3QgbW9yZSBkYXRhLApJIGFscmVhZHkgaGF2ZSAxOEtCIG9mIGl0IQoKUGx1cywgSSdsbCBhZG1pdCBpdCwgbW9zdCBvZiB0aGlzIGNvZGUgaXMgZ2FyYmFnZSwgSSBqdXN0IHdhbnRlZCB0byBtYWtlIGl0CndvcmsgYW5kIEkgZGlkLCBpdCdzIHJlYWRhYmxlIGVub3VnaCBmb3IganVzdCBhIHNjcmlwdCBJJ20gbm90IGV2ZW4KcmVsZWFzaW5nIGFzIGFueXRoaW5nIGxlZ2l0Cg==", "version": 1, "time": 1664422575.771071, "keywords": "song report song-report ststistics mpv mpv.io player music listening data html css python python3 generator",