Transaction

32be45eecf7b0e476481097df94de726372a972a124ff9d4f43f3fdb827a0d70
Timestamp (utc)
2025-03-27 20:03:00
Fee Paid
0.00000150 BSV
(
0.00001000 BSV
-
0.00000850 BSV
)
Fee Rate
4.983 sat/KB
Version
1
Confirmations
47,992
Size Stats
30,098 B

2 Outputs

Total Output:
0.00000850 BSV
  • jMÂt{"name":"ChainDisk","timestamp":1743104100326,"files":[{"name":"classWhitePagesPublishA4.html","size":22311,"type":"text/html","content":"Y2xhc3MgV2hpdGVQYWdlc1B1Ymxpc2hlciB7DQogIGNvbnN0cnVjdG9yKCkgew0KICAgIC8vIEluaXRpYWxpemUgY2xhc3MgcHJvcGVydGllcw0KICAgIHRoaXMubW9kYWxJZCA9ICd3aGl0ZS1wYWdlcy1wdWJsaXNoZXItbW9kYWwnOw0KICAgIHRoaXMuY3VycmVudEFkZHJlc3MgPSBudWxsOw0KICAgIHRoaXMuUEFZTUVOVF9BTU9VTlQgPSA2MDA7IC8vIDYwMCBzYXRvc2hpcw0KICAgIHRoaXMuV0hJVEVfUEFHRVNfRElSRUNUT1JZX0FERFJFU1MgPSAnMTliRHRKZEJveUFZMnk2SjY0SzlOVjEyRnVOcUZEdFJyTCc7IC8vIENvcnJlY3QgYWRkcmVzcyBmcm9tIHRoZSBBdXRvbm9tb3VzIERpcmVjdG9yeSBEZXBsb3llcg0KICAgIHRoaXMuQVBJX0JBU0UgPSAiaHR0cHM6Ly9hcGkud2hhdHNvbmNoYWluLmNvbS92MS9ic3YvbWFpbiI7DQogICAgDQogICAgLy8gQmluZCBtZXRob2RzIHRvIHByZXNlcnZlICd0aGlzJyBjb250ZXh0DQogICAgdGhpcy5zaG93TW9kYWwgPSB0aGlzLnNob3dNb2RhbC5iaW5kKHRoaXMpOw0KICAgIHRoaXMuaGlkZU1vZGFsID0gdGhpcy5oaWRlTW9kYWwuYmluZCh0aGlzKTsNCiAgICB0aGlzLnB1Ymxpc2ggPSB0aGlzLnB1Ymxpc2guYmluZCh0aGlzKTsNCiAgICB0aGlzLnZhbGlkYXRlRmllbGRzID0gdGhpcy52YWxpZGF0ZUZpZWxkcy5iaW5kKHRoaXMpOw0KICAgIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24gPSB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uLmJpbmQodGhpcyk7DQogICAgdGhpcy5nZXRJUEFkZHJlc3MgPSB0aGlzLmdldElQQWRkcmVzcy5iaW5kKHRoaXMpOw0KICAgIHRoaXMuZ2V0R2VvTG9jYXRpb24gPSB0aGlzLmdldEdlb0xvY2F0aW9uLmJpbmQodGhpcyk7DQogICAgdGhpcy5zaG93QWxlcnQgPSB0aGlzLnNob3dBbGVydC5iaW5kKHRoaXMpOw0KICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMgPSB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzLmJpbmQodGhpcyk7DQogICAgdGhpcy5jcmVhdGVNb2RhbEhUTUwgPSB0aGlzLmNyZWF0ZU1vZGFsSFRNTC5iaW5kKHRoaXMpOw0KICAgIHRoaXMub25DbG9zZSA9IHRoaXMub25DbG9zZS5iaW5kKHRoaXMpOw0KICAgIHRoaXMub25QdWJsaXNoZWQgPSB0aGlzLm9uUHVibGlzaGVkLmJpbmQodGhpcyk7DQogICAgdGhpcy5jbGVhbnVwID0gdGhpcy5jbGVhbnVwLmJpbmQodGhpcyk7DQogICAgDQogICAgLy8gQ2FsbGJhY2tzDQogICAgdGhpcy5fY2xvc2VDYWxsYmFjayA9IG51bGw7DQogICAgdGhpcy5fcHVibGlzaGVkQ2FsbGJhY2sgPSBudWxsOw0KICAgIA0KICAgIC8vIE1ha2UgdGhlIHB1Ymxpc2hlciBnbG9iYWxseSBhY2Nlc3NpYmxlDQogICAgd2luZG93LndoaXRlUGFnZXNQdWJsaXNoZXIgPSB0aGlzOw0KICAgIA0KICAgIC8vIEFkZCBzdHlsZXMgaWYgbm90IGFscmVhZHkgcHJlc2VudA0KICAgIHRoaXMuaW5pdFN0eWxlcygpOw0KICAgIA0KICAgIGNvbnNvbGUubG9nKCJXaGl0ZSBQYWdlcyBQdWJsaXNoZXIgaW5pdGlhbGl6ZWQiKTsNCiAgfQ0KICANCiAgLyoqDQogICAqIEluaXRpYWxpemUgcmVxdWlyZWQgQ1NTIHN0eWxlcw0KICAgKi8NCiAgaW5pdFN0eWxlcygpIHsNCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3doaXRlLXBhZ2VzLXB1Ymxpc2hlci1zdHlsZXMnKSkgcmV0dXJuOw0KDQogICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgIHN0eWxlLmlkID0gJ3doaXRlLXBhZ2VzLXB1Ymxpc2hlci1zdHlsZXMnOw0KICAgIHN0eWxlLnRleHRDb250ZW50ID0gYA0KICAgICAgLndoaXRlLXBhZ2VzLW1vZGFsIHsNCiAgICAgICAgcG9zaXRpb246IGZpeGVkOw0KICAgICAgICB0b3A6IDA7DQogICAgICAgIGxlZnQ6IDA7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBoZWlnaHQ6IDEwMCU7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIHotaW5kZXg6IDEwMDAwOw0KICAgICAgICBwYWRkaW5nOiAyMHB4Ow0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLW1vZGFsLWNvbnRlbnQgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7DQogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjE1KTsNCiAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgIG1heC13aWR0aDogNzAwcHg7DQogICAgICAgIG1heC1oZWlnaHQ6IDkwdmg7DQogICAgICAgIG92ZXJmbG93LXk6IGF1dG87DQogICAgICAgIGFuaW1hdGlvbjogZmFkZUluVXAgMC4zczsNCiAgICAgIH0NCiAgICAgIEBrZXlmcmFtZXMgZmFkZUluVXAgew0KICAgICAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpOyB9DQogICAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtaGVhZGVyIHsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICBwYWRkaW5nOiAyMHB4Ow0KICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTdlYjsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1oZWFkZXIgaDIgew0KICAgICAgICBmb250LXNpemU6IDEuNXJlbTsNCiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgY29sb3I6ICMxMTE4Mjc7DQogICAgICAgIG1hcmdpbjogMDsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1jbG9zZSB7DQogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQogICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgZm9udC1zaXplOiAxLjVyZW07DQogICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgY29sb3I6ICM2YjcyODA7DQogICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgICAgICB3aWR0aDogMzJweDsNCiAgICAgICAgaGVpZ2h0OiAzMnB4Ow0KICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7DQogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yczsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1jbG9zZTpob3ZlciB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7DQogICAgICAgIGNvbG9yOiAjMTExODI3Ow0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWJvZHkgew0KICAgICAgICBwYWRkaW5nOiAyMHB4Ow0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWZvcm0tZ3JvdXAgew0KICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWZvcm0tZ3JvdXAgbGFiZWwgew0KICAgICAgICBkaXNwbGF5OiBibG9jazsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4Ow0KICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICBmb250LXNpemU6IDAuODc1cmVtOw0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWZvcm0tZ3JvdXAgaW5wdXQsDQogICAgICAud2hpdGUtcGFnZXMtZm9ybS1ncm91cCB0ZXh0YXJlYSwNCiAgICAgIC53aGl0ZS1wYWdlcy1mb3JtLWdyb3VwIHNlbGVjdCB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjsNCiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgICAgICBmb250LXNpemU6IDAuODc1cmVtOw0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLXJlcXVpcmVkIHsNCiAgICAgICAgY29sb3I6ICNlZjQ0NDQ7DQogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtaGVscGVyLXRleHQgew0KICAgICAgICBmb250LXNpemU6IDAuNzVyZW07DQogICAgICAgIGNvbG9yOiAjNmI3MjgwOw0KICAgICAgICBtYXJnaW4tdG9wOiA0cHg7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtYnV0dG9uIHsNCiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7DQogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTsNCiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMsIGNvbG9yIDAuMnM7DQogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgICAgZ2FwOiA2cHg7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtYnV0dG9uLXByaW1hcnkgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjU2M2ViOw0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1idXR0b24tcHJpbWFyeTpob3ZlciB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxZDRlZDg7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtYnV0dG9uLXNlY29uZGFyeSB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7DQogICAgICAgIGNvbG9yOiAjMzc0MTUxOw0KICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDFkNWRiOw0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWJ1dHRvbi1zZWNvbmRhcnk6aG92ZXIgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlN2ViOw0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLWZvb3RlciB7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgcGFkZGluZzogMTZweCAyMHB4Ow0KICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTdlYjsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1pbmZvLWJveCB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7DQogICAgICAgIHBhZGRpbmc6IDEycHg7DQogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsNCiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1zdWNjZXNzLW1lc3NhZ2Ugew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmZGY0Ow0KICAgICAgICBwYWRkaW5nOiAxNnB4Ow0KICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NmVmYWM7DQogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtc3RhdHVzIHsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4Ow0KICAgICAgfQ0KICAgICAgLndoaXRlLXBhZ2VzLXN0YXR1cy1kb3Qgew0KICAgICAgICB3aWR0aDogOHB4Ow0KICAgICAgICBoZWlnaHQ6IDhweDsNCiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsNCiAgICAgIH0NCiAgICAgIC53aGl0ZS1wYWdlcy1zdGF0dXMtZG90LnB1Ymxpc2hlZCB7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxMGI5ODE7DQogICAgICB9DQogICAgICAud2hpdGUtcGFnZXMtc3RhdHVzLWRvdC5ub3QtcHVibGlzaGVkIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzljYTNhZjsNCiAgICAgIH0NCiAgICAgIA0KICAgICAgLyogUmVzcG9uc2l2ZSBzdHlsZXMgKi8NCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCkgew0KICAgICAgICAud2hpdGUtcGFnZXMtZm9vdGVyIHsNCiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICAgICAgICAgIGdhcDogMTBweDsNCiAgICAgICAgfQ0KICAgICAgICAud2hpdGUtcGFnZXMtZm9vdGVyIC53aGl0ZS1wYWdlcy1idXR0b25zIHsNCiAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIGA7DQogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgDQogIC8qKg0KICAgKiBTaG93IHRoZSBXaGl0ZSBQYWdlcyBwdWJsaXNoZXIgbW9kYWwNCiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBCU1Ygd2FsbGV0IGFkZHJlc3MNCiAgICovDQogIHNob3dNb2RhbChhZGRyZXNzKSB7DQogICAgLy8gU3RvcmUgYWRkcmVzcyBmb3IgbGF0ZXIgdXNlDQogICAgdGhpcy5jdXJyZW50QWRkcmVzcyA9IGFkZHJlc3M7DQogICAgaWYgKCF0aGlzLmN1cnJlbnRBZGRyZXNzKSB7DQogICAgICAvLyBUcnkgdG8gZ2V0IGZyb20gbG9jYWxTdG9yYWdlIGlmIG5vdCBwcm92aWRlZA0KICAgICAgdGhpcy5jdXJyZW50QWRkcmVzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRBZGRyZXNzIik7DQogICAgICBpZiAoIXRoaXMuY3VycmVudEFkZHJlc3MpIHsNCiAgICAgICAgdGhpcy5zaG93QWxlcnQoJ05vIEFkZHJlc3MnLCAnTm8gd2FsbGV0IGFkZHJlc3MgZm91bmQuJywgJ2Vycm9yJyk7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgLy8gR2V0IGV4aXN0aW5nIGVudHJ5IGRhdGEgaWYgYXZhaWxhYmxlDQogICAgY29uc3QgY29udGFjdCA9IHRoaXMuZ2V0Q29udGFjdCh0aGlzLmN1cnJlbnRBZGRyZXNzKTsNCiAgICBjb25zdCBoYXNXaGl0ZVBhZ2VzID0gY29udGFjdD8ud2hpdGVQYWdlc0lkID8gdHJ1ZSA6IGZhbHNlOw0KICAgIGNvbnN0IGxhc3RXaGl0ZVBhZ2VzVXBkYXRlID0gY29udGFjdD8ubGFzdFdoaXRlUGFnZXNVcGRhdGUgDQogICAgICA/IG5ldyBEYXRlKGNvbnRhY3QubGFzdFdoaXRlUGFnZXNVcGRhdGUpLnRvTG9jYWxlU3RyaW5nKCkgDQogICAgICA6ICdOZXZlcic7DQogICAgDQogICAgLy8gQ3JlYXRlIG1vZGFsIGNvbnRhaW5lciBpZiBub3QgZXhpc3RzDQogICAgbGV0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tb2RhbElkKTsNCiAgICBpZiAoIW1vZGFsKSB7DQogICAgICBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgbW9kYWwuaWQgPSB0aGlzLm1vZGFsSWQ7DQogICAgICBtb2RhbC5jbGFzc05hbWUgPSAnd2hpdGUtcGFnZXMtbW9kYWwnOw0KICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7DQogICAgfQ0KICAgIA0KICAgIC8vIEdlbmVyYXRlIG1vZGFsIEhUTUwNCiAgICBtb2RhbC5pbm5lckhUTUwgPSB0aGlzLmNyZWF0ZU1vZGFsSFRNTChjb250YWN0LCBoYXNXaGl0ZVBhZ2VzLCBsYXN0V2hpdGVQYWdlc1VwZGF0ZSk7DQogICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsNCiAgICANCiAgICAvLyBBdHRhY2ggZXZlbnQgbGlzdGVuZXJzDQogICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycygpOw0KICAgIA0KICAgIC8vIEFkZCBrZXlkb3duIGV2ZW50IHRvIGNsb3NlIG9uIGVzY2FwZQ0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHsNCiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7DQogICAgICAgIHRoaXMuaGlkZU1vZGFsKCk7DQogICAgICB9DQogICAgfSk7DQogIH0NCiAgDQogIC8qKg0KICAgKiBDcmVhdGUgdGhlIG1vZGFsIEhUTUwNCiAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRhY3QgLSBDb250YWN0IGRhdGENCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNXaGl0ZVBhZ2VzIC0gV2hldGhlciBhIFdoaXRlIFBhZ2VzIGVudHJ5IGV4aXN0cw0KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFzdFdoaXRlUGFnZXNVcGRhdGUgLSBMYXN0IHVwZGF0ZSB0aW1lc3RhbXANCiAgICogQHJldHVybnMge3N0cmluZ30gTW9kYWwgSFRNTA0KICAgKi8NCiAgY3JlYXRlTW9kYWxIVE1MKGNvbnRhY3QsIGhhc1doaXRlUGFnZXMsIGxhc3RXaGl0ZVBhZ2VzVXBkYXRlKSB7DQogICAgcmV0dXJuIGANCiAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLW1vZGFsLWNvbnRlbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJ3aGl0ZS1wYWdlcy1oZWFkZXIiPg0KICAgICAgICAgIDxoMj5XaGl0ZSBQYWdlcyBEaXJlY3Rvcnk8L2gyPg0KICAgICAgICAgIDxidXR0b24gY2xhc3M9IndoaXRlLXBhZ2VzLWNsb3NlIiBpZD0id2hpdGUtcGFnZXMtY2xvc2UiPiZ0aW1lczs8L2J1dHRvbj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLWJvZHkiPg0KICAgICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLXN0YXR1cyI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aGl0ZS1wYWdlcy1zdGF0dXMtZG90ICR7aGFzV2hpdGVQYWdlcyA/ICdwdWJsaXNoZWQnIDogJ25vdC1wdWJsaXNoZWQnfSI+PC9kaXY+DQogICAgICAgICAgICA8ZGl2PiR7aGFzV2hpdGVQYWdlcyA/IGBQdWJsaXNoZWQ6ICR7bGFzdFdoaXRlUGFnZXNVcGRhdGV9YCA6ICdOb3QgcHVibGlzaGVkJ308L2Rpdj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICANCiAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTZweDsgZm9udC1zaXplOiAwLjlyZW07IGNvbG9yOiAjNGI1NTYzOyI+DQogICAgICAgICAgICBZb3VyIGJhc2ljIGRpcmVjdG9yeSBsaXN0aW5nIChsaWtlIGEgcGhvbmUgYm9vaykuIFRoaXMgbWFrZXMgeW91ciBpZGVudGl0eSBzZWFyY2hhYmxlIGJ5IG5hbWUuDQogICAgICAgICAgPC9wPg0KICAgICAgICAgIA0KICAgICAgICAgIDxmb3JtIGlkPSJ3aGl0ZS1wYWdlcy1mb3JtIj4NCiAgICAgICAgICAgIDwhLS0gTmFtZSBJbnB1dCAtLT4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLWZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ3aGl0ZS1wYWdlcy1uYW1lIj5OYW1lIChBbGlhcykgPHNwYW4gY2xhc3M9IndoaXRlLXBhZ2VzLXJlcXVpcmVkIj4qPC9zcGFuPjwvbGFiZWw+DQogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2hpdGUtcGFnZXMtbmFtZSIgdmFsdWU9IiR7Y29udGFjdD8ubmFtZSB8fCAnJ30iIHBsYWNlaG9sZGVyPSJlLmcuIE15IFdhbGxldCI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLWhlbHBlci10ZXh0Ij5UaGUgbmFtZSBvdGhlcnMgd2lsbCB1c2UgdG8gc2VhcmNoIGZvciB5b3U8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICANCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aGl0ZS1wYWdlcy1pbmZvLWJveCI+DQogICAgICAgICAgICA8cD5XaGl0ZSBQYWdlcyBlbnRyaWVzIGFyZSBkaXJlY3RseSBwdWJsaXNoZWQgdG8gdGhlIGJsb2NrY2hhaW4uPC9wPg0KICAgICAgICAgICAgPHA+WW91ciBjdXJyZW50IHByb2ZpbGUgbmFtZTogPHN0cm9uZz4ke2NvbnRhY3Q/Lm5hbWUgfHwgIk5vdCBzZXQifTwvc3Ryb25nPjwvcD4NCiAgICAgICAgICAgIDxwPlB1Ymxpc2hpbmcgY29zdHMgJHt0aGlzLlBBWU1FTlRfQU1PVU5UfSBzYXRvc2hpcyBwbHVzIG5ldHdvcmsgZmVlcy48L3A+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgDQogICAgICAgICAgJHtoYXNXaGl0ZVBhZ2VzID8gYA0KICAgICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLXN1Y2Nlc3MtbWVzc2FnZSI+DQogICAgICAgICAgICA8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4OyI+WW91ciBXaGl0ZSBQYWdlcyBlbnRyeSBoYXMgYmVlbiBwdWJsaXNoZWQuPC9wPg0KICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMC44NzVyZW07Ij5UcmFuc2FjdGlvbiBJRDogPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsiPiR7Y29udGFjdC53aGl0ZVBhZ2VzSWR9PC9zcGFuPjwvcD4NCiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd2hhdHNvbmNoYWluLmNvbS90eC8ke2NvbnRhY3Qud2hpdGVQYWdlc0lkfSIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJjb2xvcjogIzI1NjNlYjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDhweDsiPg0KICAgICAgICAgICAgICBWaWV3IG9uIFdoYXRzT25DaGFpbg0KICAgICAgICAgICAgPC9hPg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIGAgOiAnJ30NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9IndoaXRlLXBhZ2VzLWZvb3RlciI+DQogICAgICAgICAgPGJ1dHRvbiBpZD0id2hpdGUtcGFnZXMtY2FuY2VsIiBjbGFzcz0id2hpdGUtcGFnZXMtYnV0dG9uIHdoaXRlLXBhZ2VzLWJ1dHRvbi1zZWNvbmRhcnkiPkNhbmNlbDwvYnV0dG9uPg0KICAgICAgICAgIDxidXR0b24gaWQ9IndoaXRlLXBhZ2VzLXB1Ymxpc2giIGNsYXNzPSJ3aGl0ZS1wYWdlcy1idXR0b24gd2hpdGUtcGFnZXMtYnV0dG9uLXByaW1hcnkiPlB1Ymxpc2ggV2hpdGUgUGFnZXM8L2J1dHRvbj4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2Rpdj4NCiAgICBgOw0KICB9DQogIA0KICAvKioNCiAgICogQXR0YWNoIGV2ZW50IGxpc3RlbmVycyB0byBtb2RhbCBlbGVtZW50cw0KICAgKi8NCiAgYXR0YWNoRXZlbnRMaXN0ZW5lcnMoKSB7DQogICAgLy8gQ2xvc2UgYnV0dG9uDQogICAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2hpdGUtcGFnZXMtY2xvc2UnKTsNCiAgICBpZiAoY2xvc2VCdG4pIHsNCiAgICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oaWRlTW9kYWwpOw0KICAgIH0NCiAgICANCiAgICAvLyBDYW5jZWwgYnV0dG9uDQogICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3doaXRlLXBhZ2VzLWNhbmNlbCcpOw0KICAgIGlmIChjYW5jZWxCdG4pIHsNCiAgICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU1vZGFsKTsNCiAgICB9DQogICAgDQogICAgLy8gUHVibGlzaCBidXR0b24NCiAgICBjb25zdCBwdWJsaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3doaXRlLXBhZ2VzLXB1Ymxpc2gnKTsNCiAgICBpZiAocHVibGlzaEJ0bikgew0KICAgICAgcHVibGlzaEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHsNCiAgICAgICAgY29uc3QgdHhpZCA9IGF3YWl0IHRoaXMucHVibGlzaCgpOw0KICAgICAgICBpZiAodHhpZCkgew0KICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIG1vZGFsIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBzdGF0dXMNCiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvd01vZGFsKHRoaXMuY3VycmVudEFkZHJlc3MpLCA1MDApOw0KICAgICAgICAgIA0KICAgICAgICAgIC8vIEV4ZWN1dGUgcHVibGlzaGVkIGNhbGxiYWNrIGlmIHByb3ZpZGVkDQogICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9wdWJsaXNoZWRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICAgICAgdGhpcy5fcHVibGlzaGVkQ2FsbGJhY2sodHhpZCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQogIH0NCiAgDQogIC8qKg0KICAgKiBIaWRlIHRoZSBtb2RhbA0KICAgKi8NCiAgaGlkZU1vZGFsKCkgew0KICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tb2RhbElkKTsNCiAgICBpZiAobW9kYWwpIHsNCiAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICANCiAgICAgIC8vIEV4ZWN1dGUgY2xvc2UgY2FsbGJhY2sgaWYgcHJvdmlkZWQNCiAgICAgIGlmICh0eXBlb2YgdGhpcy5fY2xvc2VDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICB0aGlzLl9jbG9zZUNhbGxiYWNrKCk7DQogICAgICB9DQogICAgfQ0KICB9DQogIA0KICAvKioNCiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBtb2RhbCBpcyBjbG9zZWQNCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIG9uIG1vZGFsIGNsb3NlDQogICAqLw0KICBvbkNsb3NlKGNhbGxiYWNrKSB7DQogICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgdGhpcy5fY2xvc2VDYWxsYmFjayA9IGNhbGxiYWNrOw0KICAgIH0NCiAgfQ0KICANCiAgLyoqDQogICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgd2hlbiBwdWJsaXNoaW5nIGlzIGNvbXBsZXRlDQogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCBvbiBwdWJsaXNoIGNvbXBsZXRpb24NCiAgICovDQogIG9uUHVibGlzaGVkKGNhbGxiYWNrKSB7DQogICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgdGhpcy5fcHVibGlzaGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsNCiAgICB9DQogIH0NCiAgDQogIC8qKg0KICAgKiBDbGVhbnVwIHJlc291cmNlcyAtIGNhbiBiZSBjYWxsZWQgYnkgbWVtb3J5IG1hbmFnZXINCiAgICovDQogIGNsZWFudXAoKSB7DQogICAgY29uc29sZS5sb2coIldoaXRlIFBhZ2VzIHB1Ymxpc2hlciBjbGVhbnVwIGNhbGxlZCIpOw0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aGl0ZS1wYWdlcy1tb2RhbCcpLmZvckVhY2gobW9kYWwgPT4gbW9kYWwucmVtb3ZlKCkpOw0KICAgIHRoaXMuX2Nsb3NlQ2FsbGJhY2sgPSBudWxsOw0KICAgIHRoaXMuX3B1Ymxpc2hlZENhbGxiYWNrID0gbnVsbDsNCiAgfQ0KICANCiAgLyoqDQogICAqIE1haW4gcHVibGlzaCBtZXRob2QgLSBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgUHVibGlzaA0KICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUcmFuc2FjdGlvbiBJRCBvZiB0aGUgcHVibGlzaGVkIGVudHJ5DQogICAqLw0KICBhc3luYyBwdWJsaXNoKCkgew0KICAgIHRyeSB7DQogICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIGFkZHJlc3MNCiAgICAgIGlmICghdGhpcy5jdXJyZW50QWRkcmVzcykgew0KICAgICAgICB0aGlzLmN1cnJlbnRBZGRyZXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIndhbGxldEFkZHJlc3MiKTsNCiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRBZGRyZXNzKSB7DQogICAgICAgICAgdGhpcy5zaG93QWxlcnQoJ05vIEFkZHJlc3MnLCAnTm8gd2FsbGV0IGFkZHJlc3MgZm91bmQuJywgJ2Vycm9yJyk7DQogICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgLy8gR2V0IGZvcm0gZGF0YQ0KICAgICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3aGl0ZS1wYWdlcy1uYW1lJyk/LnZhbHVlLnRyaW0oKTsNCiAgICAgIGlmICghbmFtZSkgew0KICAgICAgICB0aGlzLnNob3dBbGVydCgnTWlzc2luZyBJbmZvcm1hdGlvbicsICdOYW1lL0FsaWFzIGlzIHJlcXVpcmVkIGZvciBXaGl0ZSBQYWdlcyBlbnRyeS4nLCAnZXJyb3InKTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9DQogICAgICANCiAgICAgIC8vIFNob3cgcHJvY2Vzc2luZyBhbGVydA0KICAgICAgdGhpcy5zaG93QWxlcnQoJ1Byb2Nlc3NpbmcnLCAnQ3JlYXRpbmcgV2hpdGUgUGFnZXMgZW50cnkuLi4nLCAnaW5mbycpOw0KICAgICAgDQogICAgICAvLyBHZXQgSVAgYW5kIGdlbyBkYXRhDQogICAgICBjb25zdCBpcCA9IGF3YWl0IHRoaXMuZ2V0SVBBZGRyZXNzKCk7DQogICAgICBjb25zdCBnZW9EYXRhID0gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbihpcCk7DQogICAgICANCiAgICAgIC8vIENyZWF0ZSB0aGUgV2hpdGUgUGFnZXMgZGF0YSBzdHJ1Y3R1cmUNCiAgICAgIGNvbnN0IHdoaXRlUGFnZXNEYXRhID0gew0KICAgICAgICAicHJvdG9jb2wiOiAiQlNWX1dISVRFX1BBR0VTXzFfMCIsDQogICAgICAgICJkYXRhIjogew0KICAgICAgICAgICJhZGRyZXNzIjogdGhpcy5jdXJyZW50QWRkcmVzcywNCiAgICAgICAgICAibmFtZSI6IG5hbWUsDQogICAgICAgICAgImlwX2FkZHJlc3MiOiBpcCB8fCAiMC4wLjAuMCIsDQogICAgICAgICAgImNvdW50cnkiOiBnZW9EYXRhPy5jb3VudHJ5IHx8ICJVbmtub3duIiwNCiAgICAgICAgICAiY2l0eSI6IGdlb0RhdGE/LmNpdHkgfHwgIlVua25vd24iLA0KICAgICAgICAgICJ0aW1lc3RhbXAiOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksDQogICAgICAgICAgInJlY29yZF90eXBlIjogIldISVRFX1BBR0VTX0VOVFJZIiwNCiAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiDQogICAgICAgIH0NCiAgICAgIH07DQogICAgICANCiAgICAgIC8vIENyZWF0ZSBhbmQgYnJvYWRjYXN0IHRyYW5zYWN0aW9uDQogICAgICBjb25zdCB0eGlkID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbih3aGl0ZVBhZ2VzRGF0YSk7DQogICAgICANCiAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGFjdCB3aXRoIFdoaXRlIFBhZ2VzIGluZm9ybWF0aW9uDQogICAgICBjb25zdCBjb250YWN0ID0gdGhpcy5nZXRDb250YWN0KHRoaXMuY3VycmVudEFkZHJlc3MpOw0KICAgICAgY29udGFjdC53aGl0ZVBhZ2VzSWQgPSB0eGlkOw0KICAgICAgY29udGFjdC5sYXN0V2hpdGVQYWdlc1VwZGF0ZSA9IERhdGUubm93KCk7DQogICAgICB0aGlzLnNhdmVDb250YWN0KGNvbnRhY3QpOw0KICAgICAgDQogICAgICB0aGlzLnNob3dBbGVydCgnV2hpdGUgUGFnZXMgRW50cnkgQ3JlYXRlZCcsIA0KICAgICAgICAnWW91ciBXaGl0ZSBQYWdlcyBlbnRyeSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcHVibGlzaGVkIHRvIHRoZSBibG9ja2NoYWluLicsICdzdWNjZXNzJyk7DQogICAgICANCiAgICAgIC8vIE5vdGlmeSBDb250YWN0c01hbmFnZXIgb2YgdXBkYXRlcyBpZiBhdmFpbGFibGUNCiAgICAgIGlmICh3aW5kb3cudW5pZmllZENvbnRhY3RzTWFuYWdlcj8udXBkYXRlSGVhZGVyUHJvZmlsZSkgew0KICAgICAgICB3aW5kb3cudW5pZmllZENvbnRhY3RzTWFuYWdlci51cGRhdGVIZWFkZXJQcm9maWxlKCk7DQogICAgICB9DQogICAgICANCiAgICAgIHJldHVybiB0eGlkOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICBjb25zb2xlLmVycm9yKCdXaGl0ZSBQYWdlcyBwdWJsaWNhdGlvbiBlcnJvcjonLCBlcnJvcik7DQogICAgICB0aGlzLnNob3dBbGVydCgnUHVibGljYXRpb24gRmFpbGVkJywgDQogICAgICAgIGBGYWlsZWQgdG8gcHVibGlzaCBXaGl0ZSBQYWdlcyBlbnRyeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpOw0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KICB9DQogIA0KICAvKioNCiAgICogVmFsaWRhdGVzIHRoZSByZXF1aXJlZCBmaWVsZHMNCiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdmFsaWRhdGlvbiBwYXNzZWQNCiAgICovDQogIHZhbGlkYXRlRmllbGRzKCkgew0KICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2hpdGUtcGFnZXMtbmFtZScpPy52YWx1ZS50cmltKCk7DQogICAgaWYgKCFuYW1lKSB7DQogICAgICB0aGlzLnNob3dBbGVydCgnTWlzc2luZyBJbmZvcm1hdGlvbicsICdOYW1lL0FsaWFzIGlzIHJlcXVpcmVkIGZvciBXaGl0ZSBQYWdlcyBlbnRyeS4nLCAnZXJyb3InKTsNCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgcmV0dXJuIHRydWU7DQogIH0NCiAgDQogIC8qKg0KICAgKiBHZXRzIHRoZSB1c2VyJ3MgSVAgYWRkcmVzcw0KICAgKi8NCiAgYXN5bmMgZ2V0SVBBZGRyZXNzKCkgew0KICAgIHRyeSB7DQogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5pcGlmeS5vcmc/Zm9ybWF0PWpzb24nKTsNCiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7DQogICAgICByZXR1cm4gZGF0YS5pcCB8fCAnMC4wLjAuMCc7DQogICAgfSBjYXRjaCAoZXJyKSB7DQogICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIElQIGFkZHJlc3M6JywgZXJyKTsNCiAgICAgIHJldHVybiAnMC4wLjAuMCc7DQogICAgfQ0KICB9DQogIA0KICAvKioNCiAgICogR2V0cyBnZW8gbG9jYXRpb24gZGF0YSBiYXNlZCBvbiBJUA0KICAgKi8NCiAgYXN5bmMgZ2V0R2VvTG9jYXRpb24oaXApIHsNCiAgICB0cnkgew0KICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9pcGFwaS5jby8ke2lwfS9qc29uL2ApOw0KICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTsNCiAgICB9IGNhdGNoIChlcnIpIHsNCiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgZ2VvIGxvY2F0aW9uOicsIGVycik7DQogICAgICByZXR1cm4geyBjb3VudHJ5OiAnVW5rbm93bicsIGNpdHk6ICdVbmtub3duJyB9Ow0KICAgIH0NCiAgfQ0KICANCiAgLyoqDQogICAqIENyZWF0ZXMgYW5kIGJyb2FkY2FzdHMgYSBCU1YgdHJhbnNhY3Rpb24gZm9yIFdoaXRlIFBhZ2VzIHB1Ymxpc2hpbmcNCiAgICogQHBhcmFtIHtPYmplY3R9IHdoaXRlUGFnZXNEYXRhIC0gV2hpdGUgUGFnZXMgZGF0YSB0byBwdWJsaXNoDQogICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRyYW5zYWN0aW9uIElEDQogICAqLw0KICBhc3luYyBjcmVhdGVUcmFuc2FjdGlvbih3aGl0ZVBhZ2VzRGF0YSkgew0KICAgIGNvbnN0IHByaXZhdGVLZXlXSUYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmF0ZUtleSIpOw0KICAgIGlmICghcHJpdmF0ZUtleVdJRikgdGhyb3cgbmV3IEVycm9yKCJObyBwcml2YXRlIGtleSBmb3VuZCBmb3IgdGhpcyB3YWxsZXQiKTsNCiAgICANCiAgICBjb25zdCBwcml2YXRlS2V5ID0gbmV3IGJzdi5Qcml2YXRlS2V5LmZyb21XSUYocHJpdmF0ZUtleVdJRik7DQogICAgY29uc3QgZnJvbUFkZHJlc3MgPSBwcml2YXRlS2V5LnRvQWRkcmVzcygpLnRvU3RyaW5nKCk7DQogICAgDQogICAgLy8gR2V0IFVUWE9zDQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLkFQSV9CQVNFfS9hZGRyZXNzLyR7ZnJvbUFkZHJlc3N9L3Vuc3BlbnRgKTsNCiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBVVFhPcycpOw0KICAgIA0KICAgIGNvbnN0IHV0eG9zID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgIGlmICghdXR4b3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHNwZW5kYWJsZSBmdW5kcycpOw0KICAgIA0KICAgIGxldCB0eCA9IG5ldyBic3YuVHJhbnNhY3Rpb24oKTsNCiAgICB1dHhvcy5mb3JFYWNoKHV0eG8gPT4gew0KICAgICAgdHguZnJvbSh7DQogICAgICAgIHR4SWQ6IHV0eG8udHhfaGFzaCwNCiAgICAgICAgb3V0cHV0SW5kZXg6IHV0eG8udHhfcG9zLA0KICAgICAgICBzY3JpcHQ6IGJzdi5TY3JpcHQuYnVpbGRQdWJsaWNLZXlIYXNoT3V0KGZyb21BZGRyZXNzKSwNCiAgICAgICAgc2F0b3NoaXM6IHV0eG8udmFsdWUNCiAgICAgIH0pOw0KICAgIH0pOw0KICAgIA0KICAgIC8vIEFkZCBwYXltZW50IG91dHB1dCB0byBkaXJlY3RvcnkgYWRkcmVzcw0KICAgIGlmICh0aGlzLldISVRFX1BBR0VTX0RJUkVDVE9SWV9BRERSRVNTICYmIHRoaXMuUEFZTUVOVF9BTU9VTlQgPiAwKSB7DQogICAgICB0eC50byh0aGlzLldISVRFX1BBR0VTX0RJUkVDVE9SWV9BRERSRVNTLCB0aGlzLlBBWU1FTlRfQU1PVU5UKTsNCiAgICB9DQogICAgDQogICAgLy8gQWRkIGRhdGEgdG8gT1BfUkVUVVJODQogICAgY29uc3QgZGF0YVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHdoaXRlUGFnZXNEYXRhKTsNCiAgICBjb25zdCBkYXRhQnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YVN0cmluZyk7DQogICAgY29uc3QgZGF0YUhleCA9IEFycmF5LmZyb20oZGF0YUJ5dGVzKS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTsNCiAgICANCiAgICB0eC5hZGRPdXRwdXQobmV3IGJzdi5UcmFuc2FjdGlvbi5PdXRwdXQoew0KICAgICAgc2NyaXB0OiBic3YuU2NyaXB0LmZyb21BU00oYE9QX0ZBTFNFIE9QX1JFVFVSTiAke2RhdGFIZXh9YCksDQogICAgICBzYXRvc2hpczogMA0KICAgIH0pKTsNCiAgICANCiAgICAvLyBDYWxjdWxhdGUgZmVlDQogICAgY29uc3QgYmFzZUZlZSA9IE1hdGguY2VpbCgodHgudG9CdWZmZXIoKS5sZW5ndGggLyAxMDAwKSAqIDUpOw0KICAgIGNvbnN0IGVzdGltYXRlZEZlZSA9IE1hdGgubWF4KGJhc2VGZWUsIDExNSk7DQogICAgDQogICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGNvc3QNCiAgICBjb25zdCB0b3RhbENvc3QgPSBlc3RpbWF0ZWRGZWUgKyB0aGlzLlBBWU1FTlRfQU1PVU5UOw0KICAgIA0KICAgIC8vIEFzayB1c2VyIHRvIGFwcHJvdmUgZmVlDQogICAgY29uc3QgZmVlQXBwcm92YWwgPSB3aW5kb3cuY29uZmlybShgVGhlIFdoaXRlIFBhZ2VzIGVudHJ5IHdpbGwgY29zdCBhIHRvdGFsIG9mICR7dG90YWxDb3N0fSBzYXRvc2hpcyAoJHt0aGlzLlBBWU1FTlRfQU1PVU5UfSBkaXJlY3RvcnkgZmVlICsgJHtlc3RpbWF0ZWRGZWV9IG5ldHdvcmsgZmVlKS4gRG8geW91IGFwcHJvdmUgdGhpcyB0cmFuc2FjdGlvbj9gKTsNCiAgICBpZiAoIWZlZUFwcHJvdmFsKSB7DQogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgZGVuaWVkIHRyYW5zYWN0aW9uIGFwcHJvdmFsLicpOw0KICAgIH0NCiAgICANCiAgICAvLyBBZGQgY2hhbmdlIG91dHB1dA0KICAgIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSB1dHhvcy5yZWR1Y2UoKHN1bSwgdXR4bykgPT4gc3VtICsgdXR4by52YWx1ZSwgMCk7DQogICAgY29uc3QgdG90YWxPdXRwdXRBbW91bnQgPSB0eC5vdXRwdXRzLnJlZHVjZSgoc3VtLCBvdXRwdXQpID0+IHN1bSArIG91dHB1dC5zYXRvc2hpcywgMCk7DQogICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIHRvdGFsT3V0cHV0QW1vdW50IC0gZXN0aW1hdGVkRmVlOw0KICAgIA0KICAgIGlmIChjaGFuZ2VBbW91bnQgPiA1NDYpIHsNCiAgICAgIHR4LnRvKGZyb21BZGRyZXNzLCBjaGFuZ2VBbW91bnQpOw0KICAgIH0NCiAgICANCiAgICAvLyBTaWduIGFuZCBicm9hZGNhc3QNCiAgICB0eC5zaWduKHByaXZhdGVLZXkpOw0KICAgIGNvbnN0IGJyb2FkY2FzdFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5BUElfQkFTRX0vdHgvcmF3YCwgew0KICAgICAgbWV0aG9kOiAnUE9TVCcsDQogICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwNCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHhoZXg6IHR4LnNlcmlhbGl6ZSgpIH0pDQogICAgfSk7DQogICAgDQogICAgaWYgKCFicm9hZGNhc3RSZXNwb25zZS5vaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gYnJvYWRjYXN0IHRyYW5zYWN0aW9uOiAnICsgYXdhaXQgYnJvYWRjYXN0UmVzcG9uc2UudGV4dCgpKTsNCiAgICB9DQogICAgDQogICAgcmV0dXJuIGF3YWl0IGJyb2FkY2FzdFJlc3BvbnNlLnRleHQoKTsNCiAgfQ0KICANCiAgLyoqDQogICAqIEdldCBjb250YWN0IGRhdGEgZnJvbSBzdG9yYWdlDQogICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQlNWIHdhbGxldCBhZGRyZXNzDQogICAqIEByZXR1cm5zIHtPYmplY3R8bnVsbH0gQ29udGFjdCBkYXRhIG9yIG51bGwNCiAgICovDQogIGdldENvbnRhY3QoYWRkcmVzcykgew0KICAgIGlmICghYWRkcmVzcykgcmV0dXJuIG51bGw7DQogICAgDQogICAgLy8gVXNlIHdhbGxldCBtb2R1bGUgaWYgYXZhaWxhYmxlDQogICAgaWYgKHdpbmRvdy5ic3ZXYWxsZXQ/LmdldENvbnRhY3QpIHsNCiAgICAgIHJldHVybiB3aW5kb3cuYnN2V2FsbGV0LmdldENvbnRhY3QoYWRkcmVzcyk7DQogICAgfQ0KICAgIA0KICAgIC8vIEZhbGwgYmFjayB0byBsb2NhbFN0b3JhZ2UNCiAgICBjb25zdCBrZXkgPSBgQ29udGFjdF8ke2FkZHJlc3N9YDsNCiAgICB0cnkgew0KICAgICAgbGV0IGNvbnRhY3QgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgInt9Iik7DQogICAgICAvLyBFbnN1cmUgYWRkcmVzcyBpcyBzZXQNCiAgICAgIGlmICghY29udGFjdC5hZGRyZXNzICYmIGFkZHJlc3MpIHsNCiAgICAgICAgY29udGFjdC5hZGRyZXNzID0gYWRkcmVzczsNCiAgICAgIH0NCiAgICAgIHJldHVybiBjb250YWN0Ow0KICAgIH0gY2F0Y2ggKGVycikgew0KICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBjb250YWN0IGRhdGE6JywgZXJyKTsNCiAgICAgIHJldHVybiB7IGFkZHJlc3MgfTsNCiAgICB9DQogIH0NCiAgDQogIC8qKg0KICAgKiBTYXZlIGNvbnRhY3QgZGF0YSB0byBzdG9yYWdlDQogICAqIEBwYXJhbSB7T2JqZWN0fSBjb250YWN0IC0gQ29udGFjdCBkYXRhIHRvIHNhdmUNCiAgICovDQogIHNhdmVDb250YWN0KGNvbnRhY3QpIHsNCiAgICBpZiAoIWNvbnRhY3QgfHwgIWNvbnRhY3QuYWRkcmVzcykgcmV0dXJuOw0KICAgIA0KICAgIC8vIFVzZSB3YWxsZXQgbW9kdWxlIGlmIGF2YWlsYWJsZQ0KICAgIGlmICh3aW5kb3cuYnN2V2FsbGV0Py5zYXZlQ29udGFjdCkgew0KICAgICAgd2luZG93LmJzdldhbGxldC5zYXZlQ29udGFjdChjb250YWN0KTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgLy8gRmFsbCBiYWNrIHRvIGxvY2FsU3RvcmFnZQ0KICAgIGNvbnN0IGtleSA9IGBDb250YWN0XyR7Y29udGFjdC5hZGRyZXNzfWA7DQogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShjb250YWN0KSk7DQogICAgDQogICAgLy8gTm90aWZ5IENvbnRhY3RzTWFuYWdlciBpZiBhdmFpbGFibGUNCiAgICBpZiAod2luZG93LnVuaWZpZWRDb250YWN0c01hbmFnZXI/LnVwZGF0ZUhlYWRlclByb2ZpbGUpIHsNCiAgICAgIHdpbmRvdy51bmlmaWVkQ29udGFjdHNNYW5hZ2VyLnVwZGF0ZUhlYWRlclByb2ZpbGUoKTsNCiAgICB9DQogIH0NCiAgDQogIC8qKg0KICAgKiBTaG93cyBhbiBhbGVydC9ub3RpZmljYXRpb24NCiAgICogVXNlcyB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIGFsZXJ0IHN5c3RlbSBpZiBhdmFpbGFibGUNCiAgICovDQogIHNob3dBbGVydCh0aXRsZSwgbWVzc2FnZSwgdHlwZSA9ICdpbmZvJykgew0KICAgIC8vIFVzZSBtb2RhbE1hbmFnZXIgaWYgYXZhaWxhYmxlDQogICAgaWYgKHdpbmRvdy5tb2RhbE1hbmFnZXI/LnNob3dBbGVydCkgew0KICAgICAgd2luZG93Lm1vZGFsTWFuYWdlci5zaG93QWxlcnQodGl0bGUsIG1lc3NhZ2UsIHR5cGUpOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICANCiAgICAvLyBVc2UgUHJvZmlsZUVkaXRvcidzIHNob3dBbGVydCBpZiBhdmFpbGFibGUNCiAgICBpZiAod2luZG93LnByb2ZpbGVFZGl0b3I/LnNob3dBbGVydCkgew0KICAgICAgd2luZG93LnByb2ZpbGVFZGl0b3Iuc2hvd0FsZXJ0KHRpdGxlLCBtZXNzYWdlLCB0eXBlKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgLy8gRmFsbCBiYWNrIHRvIGFsZXJ0IGZvciBzaW1wbGUgY2FzZXMNCiAgICBpZiAodHlwZSA9PT0gJ2Vycm9yJykgew0KICAgICAgYWxlcnQoYCR7dGl0bGV9OiAke21lc3NhZ2V9YCk7DQogICAgfSBlbHNlIHsNCiAgICAgIGNvbnNvbGUubG9nKGAke3RpdGxlfTogJHttZXNzYWdlfWApOw0KICAgIH0NCiAgfQ0KfQ0KDQovLyBTZWxmLWluaXRpYWxpemluZyBmdW5jdGlvbg0KKGZ1bmN0aW9uKCkgew0KICAvLyBSZWdpc3RlciB3aXRoIG1vZHVsZSBtYW5hZ2VyIGlmIGF2YWlsYWJsZQ0KICBpZiAod2luZG93Lm9uRGVtYW5kTW9kdWxlcykgew0KICAgIHdpbmRvdy5vbkRlbWFuZE1vZHVsZXMud2hpdGVQYWdlc1B1Ymxpc2hlciA9IHsNCiAgICAgIGxvYWRlZDogdHJ1ZSwNCiAgICAgIGluc3RhbmNlTmFtZTogIndoaXRlUGFnZXNQdWJsaXNoZXIiLA0KICAgICAgY2xhc3NOYW1lOiAiV2hpdGVQYWdlc1B1Ymxpc2hlciIsDQogICAgICBwZXJzaXN0ZW50OiBmYWxzZQ0KICAgIH07DQogIH0NCiAgDQogIC8vIENyZWF0ZSBhbmQgZXhwb3NlIGluc3RhbmNlDQogIHdpbmRvdy53aGl0ZVBhZ2VzUHVibGlzaGVyID0gbmV3IFdoaXRlUGFnZXNQdWJsaXNoZXIoKTsNCn0pKCk7"}]}
    https://whatsonchain.com/tx/32be45eecf7b0e476481097df94de726372a972a124ff9d4f43f3fdb827a0d70