crittermanager Smart Contract
{
"id": "ssc-mainnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "crittermanager",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCi8qIGdsb2JhbCBhY3Rpb25zLCBhcGkgKi8KCi8vIHRlc3QgY29udHJhY3QgdG8gZGVtb25zdHJhdGUgU3BsaW50ZXJsYW5kcyBzdHlsZQovLyBwYWNrIGlzc3VhbmNlIG9mIGNvbGxlY3RhYmxlIGNyaXR0ZXJzCmNvbnN0IENPTlRSQUNUX05BTUUgPSAnY3JpdHRlcm1hbmFnZXInOwoKLy8gbm9ybWFsbHkgd2Ugd291bGQgdXNlIGFwaS5vd25lciB0byByZWZlciB0byB0aGUgY29udHJhY3QKLy8gb3duZXIgKHRoZSBhY2NvdW50IHRoYXQgZGVwbG95ZWQgdGhlIGNvbnRyYWN0KSwgYnV0IGZvciBub3cKLy8gY29udHJhY3QgZGVwbG95bWVudCBpcyByZXN0cmljdGVkLCBzbyB3ZSBuZWVkIGFub3RoZXIgd2F5Ci8vIHRvIHJlY29nbml6ZSB0aGUgQ3JpdHRlciBhcHAgb3duZXIKY29uc3QgQ1JJVFRFUl9DUkVBVE9SID0gJ2NyeXB0b21hbmNlcic7CgovLyB0aGlzIHBsYWNlaG9sZGVyIHJlcHJlc2VudHMgRU5HIHRva2VucyBvbiB0aGUgbWFpbm5ldCBhbmQgU1NDIG9uIHRoZSB0ZXN0bmV0Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKY29uc3QgVVRJTElUWV9UT0tFTl9TWU1CT0wgPSAnRU5HJzsKCi8vIHdlIHdpbGwgaXNzdWUgY3JpdHRlcnMgaW4gInBhY2tzIiBvZiA1IGF0IGEgdGltZQpjb25zdCBDUklUVEVSU19QRVJfUEFDSyA9IDU7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygncGFyYW1zJyk7CiAgaWYgKHRhYmxlRXhpc3RzID09PSBmYWxzZSkgewogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwYXJhbXMnKTsKCiAgICAvLyBUaGlzIHRhYmxlIHdpbGwgc3RvcmUgY29udHJhY3QgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KICAgIC8vIEZvciB0aGlzIHRlc3QsIHdlIGhhdmUgMyBDUklUVEVSIGVkaXRpb25zIHRoYXQgeW91IGNhbiBidXkKICAgIC8vIHdpdGggZGlmZmVyZW50IHRva2Vucy4gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiBhZGQgbW9yZQogICAgLy8gZWRpdGlvbnMgdmlhIHRoZSB1cGRhdGVQYXJhbXMgYWN0aW9uLgogICAgY29uc3QgcGFyYW1zID0ge307CiAgICBwYXJhbXMuZWRpdGlvbk1hcHBpbmcgPSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICAgICAgRU5HOiAxLAogICAgICBBTFBIQTogMiwKICAgICAgQkVUQTogMywKICAgIH07CiAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdwYXJhbXMnLCBwYXJhbXMpOwogIH0KfTsKCi8vIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB0aGF0IHRva2VuIHRyYW5zZmVycyBzdWNjZWVkZWQKY29uc3QgaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQgPSAocmVzdWx0LCBmcm9tLCB0bywgc3ltYm9sLCBxdWFudGl0eSwgZXZlbnRTdHIpID0+IHsKICBpZiAocmVzdWx0LmVycm9ycyA9PT0gdW5kZWZpbmVkCiAgICAmJiByZXN1bHQuZXZlbnRzICYmIHJlc3VsdC5ldmVudHMuZmluZChlbCA9PiBlbC5jb250cmFjdCA9PT0gJ3Rva2VucycgJiYgZWwuZXZlbnQgPT09IGV2ZW50U3RyCiAgICAmJiBlbC5kYXRhLmZyb20gPT09IGZyb20gJiYgZWwuZGF0YS50byA9PT0gdG8gJiYgZWwuZGF0YS5xdWFudGl0eSA9PT0gcXVhbnRpdHkgJiYgZWwuZGF0YS5zeW1ib2wgPT09IHN5bWJvbCkgIT09IHVuZGVmaW5lZCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfTsKCi8vIFRoZSBjb250cmFjdCBvd25lciBjYW4gdXNlIHRoaXMgYWN0aW9uIHRvIHVwZGF0ZSBzZXR0aW5ncwovLyB3aXRob3V0IGhhdmluZyB0byBjaGFuZ2UgJiByZWRlcGxveSB0aGUgY29udHJhY3Qgc291cmNlIGNvZGUuCmFjdGlvbnMudXBkYXRlUGFyYW1zID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gQ1JJVFRFUl9DUkVBVE9SKSByZXR1cm47CgogIGNvbnN0IHsKICAgIGVkaXRpb25NYXBwaW5nLAogIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICBpZiAoZWRpdGlvbk1hcHBpbmcgJiYgdHlwZW9mIGVkaXRpb25NYXBwaW5nID09PSAnb2JqZWN0JykgewogICAgcGFyYW1zLmVkaXRpb25NYXBwaW5nID0gZWRpdGlvbk1hcHBpbmc7CiAgfQoKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKLy8gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiBjYWxsIHRoaXMgYWN0aW9uIG9uZSB0aW1lIG9ubHksIHRvCi8vIGNyZWF0ZSB0aGUgQ1JJVFRFUiBORlQgZGVmaW5pdGlvbi4gTm9ybWFsbHkgeW91IHdvdWxkIHByb2JhYmx5Ci8vIGRvIHRoaXMgdGhyb3VnaCB0aGUgU3RlZW0gRW5naW5lIHdlYiBzaXRlLCBidXQgd2UgaW5jbHVkZSBpdAovLyBoZXJlIHRvIGlsbHVzdHJhdGUgcHJvZ3JhbW1hdGljIE5GVCBjcmVhdGlvbiwgYW5kIHRvIG1ha2UgaXQKLy8gY2xlYXIgd2hhdCBkYXRhIHByb3BlcnRpZXMgd2UgbmVlZC4gTm90ZTogdGhlIGNvbnRyYWN0IG93bmVyCi8vIG11c3QgaGF2ZSBlbm91Z2ggRU5HL1NTQyB0byBwYXkgdGhlIGNyZWF0aW9uIGZlZXMuIEZvciBzaW1wbGljaXR5Ci8vIHdlIGRvbid0IGRvIGNoZWNrcyBvbiB0aGUgb3duZXIncyBiYWxhbmNlIGhlcmUsIGJ1dCBpbiBhCi8vIHByb2R1Y3Rpb24gcmVhZHkgc21hcnQgY29udHJhY3Qgd2UgZGVmaW5pdGVseSBzaG91bGQgZG8gc28KLy8gYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIHRoYXQgc3BlbmRzIHRva2VucyBhcyBhIHNpZGUgZWZmZWN0LgphY3Rpb25zLmNyZWF0ZU5mdCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5zZW5kZXIgIT09IENSSVRURVJfQ1JFQVRPUikgcmV0dXJuOwoKICAvLyB0aGlzIGFjdGlvbiByZXF1aXJlcyBhY3RpdmUga2V5IGF1dGhvcml6YXRpb24KICBjb25zdCB7CiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIC8vIHZlcmlmeSBDUklUVEVSIGRvZXMgbm90IGV4aXN0IHlldAogIGNvbnN0IG5mdCA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgnbmZ0JywgJ25mdHMnLCB7IHN5bWJvbDogJ0NSSVRURVInIH0pOwogIGlmIChhcGkuYXNzZXJ0KG5mdCA9PT0gbnVsbCwgJ0NSSVRURVIgYWxyZWFkeSBleGlzdHMnKQogICAgJiYgYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKSkgewogICAgLy8gY3JlYXRlIENSSVRURVIKICAgIC8vIE5vdGUgMTogd2UgZG9uJ3Qgc3BlY2lmeSBtYXhTdXBwbHksIHdoaWNoIG1lYW5zIHRoZSBzdXBwbHkgb2YgQ1JJVFRFUgogICAgLy8gd2lsbCBiZSB1bmxpbWl0ZWQuIEJ1dCBpbmRpcmVjdGx5IHRoZSBzdXBwbHkgaXMgbGltaXRlZCBieSB0aGUKICAgIC8vIHN1cHBseSBvZiB0aGUgdG9rZW5zIHlvdSBjYW4gdXNlIHRvIGJ1eSBDUklUVEVSUy4KICAgIC8vIE5vdGUgMjogd2Ugd2FudCB0aGlzIGNvbnRyYWN0IHRvIGJlIHRoZSBvbmx5IGF1dGhvcml6ZWQgdG9rZW4gaXNzdWVyCiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdjcmVhdGUnLCB7CiAgICAgIG5hbWU6ICdNaXNjaGlldm91cyBDcnlwdG8gQ3JpdHRlcnMnLAogICAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgICAgYXV0aG9yaXplZElzc3VpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwoKICAgIC8vIE5vdyBhZGQgc29tZSBkYXRhIHByb3BlcnRpZXMgKG5vdGUgdGhhdCBvbmx5IHRoaXMgY29udHJhY3QgaXMKICAgIC8vIGF1dGhvcml6ZWQgdG8gZWRpdCBkYXRhIHByb3BlcnRpZXMpLiBXZSBjb3VsZCBoYXZlIGNob3NlbiBhIG1vcmUKICAgIC8vIGVjb25vbWljYWwgZGVzaWduIGJ5IGZvcm1hdHRpbmcgdGhlc2UgaW4gc29tZSBjdXN0b20gd2F5IHRvIGZpdAogICAgLy8gd2l0aGluIGEgc2luZ2xlIHN0cmluZyBkYXRhIHByb3BlcnR5LCB3aGljaCB3b3VsZCBjdXQgZG93biBvbgogICAgLy8gdG9rZW4gaXNzdWFuY2UgZmVlcy4gVGhlIGRyYXdiYWNrIGlzIHRoZW4gd2UgbG9zZSB0aGUgYWJpbGl0eSB0bwogICAgLy8gZWFzaWx5IHF1ZXJ5IHRva2VucyBieSBwcm9wZXJ0aWVzIChmb3IgZXhhbXBsZSwgZ2V0IGEgbGlzdCBvZiBhbGwKICAgIC8vIHJhcmUgY3JpdHRlcnMgb3IgYWxsIGNyaXR0ZXJzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gZWRpdGlvbiwgZXRjKS4KCiAgICAvLyBFZGl0aW9uIG9ubHkgZ2V0cyBzZXQgb25jZSBhdCBpc3N1YW5jZSBhbmQgbmV2ZXIgY2hhbmdlcywgc28gd2UKICAgIC8vIGNhbiBtYWtlIGl0IHJlYWQgb25seS4KICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2FkZFByb3BlcnR5JywgewogICAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgICAgbmFtZTogJ2VkaXRpb24nLAogICAgICB0eXBlOiAnbnVtYmVyJywKICAgICAgaXNSZWFkT25seTogdHJ1ZSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwoKICAgIC8vIFR5cGUgKHdoaWNoIGFsc28gbmV2ZXIgY2hhbmdlcyBvbmNlIHNldCkgcmVwcmVzZW50cyB0aGUga2luZCBvZgogICAgLy8gY3JpdHRlciB3aXRoaW4gYW4gZWRpdGlvbi4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgdmFsdWUgaXMKICAgIC8vIGhhbmRsZWQgYnkgd2hhdGV2ZXIgYXBwIHVzZXMgdGhlc2UgdG9rZW5zOyBmb3IgZXhhbXBsZSBtYXliZQogICAgLy8gMCA9IGRyYWdvbiwgMSA9IHRyb2xsLCAyID0gZ29ibGluLCBldGMKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2FkZFByb3BlcnR5JywgewogICAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgICAgbmFtZTogJ3R5cGUnLAogICAgICB0eXBlOiAnbnVtYmVyJywKICAgICAgaXNSZWFkT25seTogdHJ1ZSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwoKICAgIC8vIEhvdyByYXJlIGlzIHRoaXMgY3JpdHRlcj8gMCA9IGNvbW1vbiwgMSA9IHVuY29tbW9uLAogICAgLy8gMiA9IHJhcmUsIDMgPSBsZWdlbmRhcnkKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2FkZFByb3BlcnR5JywgewogICAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgICAgbmFtZTogJ3Jhcml0eScsCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gRG8gd2UgaGF2ZSBhIHN1cGVyIHJhcmUgZ29sZCBmb2lsPwogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnaXNHb2xkRm9pbCcsCiAgICAgIHR5cGU6ICdib29sZWFuJywKICAgICAgaXNSZWFkT25seTogdHJ1ZSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwoKICAgIC8vIFdlIHdpbGwgYWxsb3cgcGVvcGxlIHRvIGN1c3RvbWl6ZSB0aGVpciBjcml0dGVycwogICAgLy8gYnkgbmFtaW5nIHRoZW0gKG5vdGUgdGhpcyBpcyBOT1QgcmVhZCBvbmx5ISkKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2FkZFByb3BlcnR5JywgewogICAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgICAgbmFtZTogJ25hbWUnLAogICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwoKICAgIC8vIGFkZCBzb21lIG90aGVyIG1pc2NlbGxhbmVvdXMgcHJvcGVydGllcyBmb3IgdGhlIHNha2Ugb2YKICAgIC8vIGNvbXBsZXRlbmVzcwogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAneHAnLCAvLyBleHBlcmllbmNlIHBvaW50cwogICAgICB0eXBlOiAnbnVtYmVyJywKICAgICAgYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50czogW10sCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzOiBbQ09OVFJBQ1RfTkFNRV0sCiAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0pOwogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnaHAnLCAvLyBoZWFsdGggcG9pbnRzCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgfQp9OwoKLy8gVGhpcyBhY3Rpb24gY2FuIGJlIGNhbGxlZCBieSBhIHRva2VuIGhvbGRlciB0byBjaGFuZ2UKLy8gdGhlaXIgY3JpdHRlcidzIG5hbWUuCmFjdGlvbnMudXBkYXRlTmFtZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJwogICAgJiYgIWFwaS5CaWdOdW1iZXIoaWQpLmlzTmFOKCkgJiYgYXBpLkJpZ051bWJlcihpZCkuZ3QoMCkKICAgICYmIG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnLCAnaW52YWxpZCBwYXJhbXMnKQogICAgJiYgYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsICcgJykpICYmIG5hbWUubGVuZ3RoID4gMCAmJiBuYW1lLmxlbmd0aCA8PSAyNSwgJ2ludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiAyNScpKSB7CiAgICAvLyBmZXRjaCB0aGUgdG9rZW4gd2Ugd2FudCB0byBlZGl0CiAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgnbmZ0JywgJ0NSSVRURVJpbnN0YW5jZXMnLCB7IF9pZDogYXBpLkJpZ051bWJlcihpZCkudG9OdW1iZXIoKSB9KTsKCiAgICBpZiAoaW5zdGFuY2UpIHsKICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgdG9rZW4gaXMgb3duZWQgYnkgdGhlIGNhbGxlcgogICAgICBpZiAoYXBpLmFzc2VydChpbnN0YW5jZS5hY2NvdW50ID09PSBhcGkuc2VuZGVyICYmIGluc3RhbmNlLm93bmVkQnkgPT09ICd1JywgJ211c3QgYmUgdGhlIHRva2VuIGhvbGRlcicpKSB7CiAgICAgICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnc2V0UHJvcGVydGllcycsIHsKICAgICAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICAgICAgZnJvbVR5cGU6ICdjb250cmFjdCcsCiAgICAgICAgICBuZnRzOiBbewogICAgICAgICAgICBpZCwgcHJvcGVydGllczogeyBuYW1lIH0sCiAgICAgICAgICB9XSwKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0KfTsKCi8vIGdlbmVyYXRlIGlzc3VhbmNlIGRhdGEgZm9yIGEgcmFuZG9tIGNyaXR0ZXIgb2YgdGhlIGdpdmVuIGVkaXRpb24KY29uc3QgZ2VuZXJhdGVSYW5kb21Dcml0dGVyID0gKGVkaXRpb24sIHRvKSA9PiB7CiAgLy8gZWFjaCByYXJpdHkgaGFzIDEwIHR5cGVzIG9mIGNyaXR0ZXJzCiAgY29uc3QgdHlwZSA9IE1hdGguZmxvb3IoYXBpLnJhbmRvbSgpICogMTApICsgMTsKCiAgLy8gZGV0ZXJtaW5lIHJhcml0eQogIGxldCByYXJpdHkgPSAwOwogIGxldCByYXJpdHlSb2xsID0gTWF0aC5mbG9vcihhcGkucmFuZG9tKCkgKiAxMDAwKSArIDE7CiAgaWYgKHJhcml0eVJvbGwgPiA5OTUpIHsgLy8gMC41JSBjaGFuY2Ugb2YgbGVnZW5kYXJ5CiAgICByYXJpdHkgPSAzOwogIH0gZWxzZSBpZiAocmFyaXR5Um9sbCA+IDkwMCkgeyAvLyAxMCUgY2hhbmNlIG9mIHJhcmUgb3IgaGlnaGVyCiAgICByYXJpdHkgPSAyOwogIH0gZWxzZSBpZiAocmFyaXR5Um9sbCA+IDcwMCkgeyAvLyAzMCUgb2YgdW5jb21tb24gb3IgaGlnaGVyCiAgICByYXJpdHkgPSAxOwogIH0KCiAgLy8gZGV0ZXJtaW5lIGdvbGQgZm9pbAogIGxldCBpc0dvbGRGb2lsID0gZmFsc2U7CiAgcmFyaXR5Um9sbCA9IE1hdGguZmxvb3IoYXBpLnJhbmRvbSgpICogMTAwKSArIDE7CiAgaWYgKHJhcml0eVJvbGwgPiA5NSkgeyAvLyA1JSBjaGFuY2Ugb2YgYmVpbmcgZ29sZAogICAgaXNHb2xkRm9pbCA9IHRydWU7CiAgfQoKICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgZWRpdGlvbiwKICAgIHR5cGUsCiAgICByYXJpdHksCiAgICBpc0dvbGRGb2lsLAogICAgbmFtZTogJycsCiAgICB4cDogMCwKICAgIGhwOiAxMDAsCiAgfTsKCiAgY29uc3QgaW5zdGFuY2UgPSB7CiAgICBzeW1ib2w6ICdDUklUVEVSJywKICAgIGZyb21UeXBlOiAnY29udHJhY3QnLAogICAgdG8sCiAgICBmZWVTeW1ib2w6IFVUSUxJVFlfVE9LRU5fU1lNQk9MLAogICAgcHJvcGVydGllcywKICB9OwoKICByZXR1cm4gaW5zdGFuY2U7Cn07CgovLyBpc3N1ZSBzb21lIHJhbmRvbSBjcml0dGVycyEKYWN0aW9ucy5oYXRjaCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgLy8gdGhpcyBhY3Rpb24gcmVxdWlyZXMgYWN0aXZlIGtleSBhdXRob3JpemF0aW9uCiAgY29uc3QgewogICAgcGFja1N5bWJvbCwgLy8gdGhlIHRva2VuIHdlIHdhbnQgdG8gYnV5IHdpdGggZGV0ZXJtaW5lcyB3aGljaCBlZGl0aW9uIHRvIGlzc3VlCiAgICBwYWNrcywgLy8gaG93IG1hbnkgY3JpdHRlcnMgdG8gaGF0Y2ggKDEgcGFjayA9IDUgY3JpdHRlcnMpCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIC8vIGdldCBjb250cmFjdCBwYXJhbXMKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogIGNvbnN0IHsgZWRpdGlvbk1hcHBpbmcgfSA9IHBhcmFtczsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQocGFja1N5bWJvbCAmJiB0eXBlb2YgcGFja1N5bWJvbCA9PT0gJ3N0cmluZycgJiYgcGFja1N5bWJvbCBpbiBlZGl0aW9uTWFwcGluZywgJ2ludmFsaWQgcGFjayBzeW1ib2wnKQogICAgJiYgYXBpLmFzc2VydChwYWNrcyAmJiB0eXBlb2YgcGFja3MgPT09ICdudW1iZXInICYmIHBhY2tzID49IDEgJiYgcGFja3MgPD0gMTAgJiYgTnVtYmVyLmlzSW50ZWdlcihwYWNrcyksICdwYWNrcyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMCcpKSB7CiAgICAvLyB2ZXJpZnkgdXNlciBoYXMgZW5vdWdoIGJhbGFuY2UgdG8gcGF5IGZvciBhbGwgdGhlIHBhY2tzCiAgICBjb25zdCBwYXltZW50VG9rZW5CYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IGFjY291bnQ6IGFwaS5zZW5kZXIsIHN5bWJvbDogcGFja1N5bWJvbCB9KTsKICAgIGNvbnN0IGF1dGhvcml6ZWQgPSBwYXltZW50VG9rZW5CYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIocGF5bWVudFRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUocGFja3MpOwogICAgaWYgKGFwaS5hc3NlcnQoYXV0aG9yaXplZCwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHBhY2sgdG9rZW5zJykpIHsKICAgICAgLy8gdmVyaWZ5IHRoaXMgY29udHJhY3QgaGFzIGVub3VnaCBiYWxhbmNlIHRvIHBheSB0aGUgTkZUIGlzc3VhbmNlIGZlZXMKICAgICAgY29uc3QgY3JpdHRlcnNUb0hhdGNoID0gcGFja3MgKiBDUklUVEVSU19QRVJfUEFDSzsKICAgICAgY29uc3QgbmZ0UGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAncGFyYW1zJywge30pOwogICAgICBjb25zdCB7IG5mdElzc3VhbmNlRmVlIH0gPSBuZnRQYXJhbXM7CiAgICAgIGNvbnN0IG9uZVRva2VuSXNzdWFuY2VGZWUgPSBhcGkuQmlnTnVtYmVyKG5mdElzc3VhbmNlRmVlW1VUSUxJVFlfVE9LRU5fU1lNQk9MXSkubXVsdGlwbGllZEJ5KDgpOyAvLyBiYXNlIGZlZSArIDcgZGF0YSBwcm9wZXJ0aWVzCiAgICAgIGNvbnN0IHRvdGFsSXNzdWFuY2VGZWUgPSBvbmVUb2tlbklzc3VhbmNlRmVlLm11bHRpcGxpZWRCeShjcml0dGVyc1RvSGF0Y2gpOwogICAgICBjb25zdCB1dGlsaXR5VG9rZW5CYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnY29udHJhY3RzQmFsYW5jZXMnLCB7IGFjY291bnQ6IENPTlRSQUNUX05BTUUsIHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wgfSk7CiAgICAgIGNvbnN0IGNhbkFmZm9yZElzc3VhbmNlID0gdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHRvdGFsSXNzdWFuY2VGZWUpOwogICAgICBpZiAoYXBpLmFzc2VydChjYW5BZmZvcmRJc3N1YW5jZSwgJ2NvbnRyYWN0IGNhbm5vdCBhZmZvcmQgaXNzdWFuY2UnKSkgewogICAgICAgIC8vIGJ1cm4gdGhlIHBhY2sgdG9rZW5zCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgICAgICB0bzogJ251bGwnLCBzeW1ib2w6IHBhY2tTeW1ib2wsIHF1YW50aXR5OiBwYWNrcy50b1N0cmluZygpLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKHJlcywgYXBpLnNlbmRlciwgJ251bGwnLCBwYWNrU3ltYm9sLCBwYWNrcy50b1N0cmluZygpLCAndHJhbnNmZXInKSwgJ3VuYWJsZSB0byB0cmFuc2ZlciBwYWNrIHRva2VucycpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyB3ZSB3aWxsIGlzc3VlIGNyaXR0ZXJzIGluIHBhY2tzIG9mIDUgYXQgb25jZQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja3M7IGkgKz0gMSkgewogICAgICAgICAgY29uc3QgaW5zdGFuY2VzID0gW107CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IENSSVRURVJTX1BFUl9QQUNLOyBqICs9IDEpIHsKICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goZ2VuZXJhdGVSYW5kb21Dcml0dGVyKGVkaXRpb25NYXBwaW5nW3BhY2tTeW1ib2xdLCBhcGkuc2VuZGVyKSk7CiAgICAgICAgICB9CgogICAgICAgICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnaXNzdWVNdWx0aXBsZScsIHsKICAgICAgICAgICAgaW5zdGFuY2VzLAogICAgICAgICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9Owo="
}
}
}