tx · DoHc1sCR9mwjKWKa4NMcUSVMDhfN5d1xcFRqNTPSRamE

3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK:  -0.14000000 Waves

2022.12.05 11:42 [2346839] smart account 3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK > SELF 0.00000000 Waves

{ "type": 13, "id": "DoHc1sCR9mwjKWKa4NMcUSVMDhfN5d1xcFRqNTPSRamE", "fee": 14000000, "feeAssetId": null, "timestamp": 1670229762486, "version": 2, "chainId": 84, "sender": "3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK", "senderPublicKey": "FFdBua5rzzMkZebvsvmN7sAdU7XhFK8QNJ3hiwwxAYRA", "proofs": [ "33rNQju4gAYcKPr9NicWh5DQuxgLtb62E42EzxP8LCc9EB21NqzGbC3xC8kXwJ3znUKjkg9avC8rgHjiMTqMEDJq", "39Ra5LVDWxf8ZmUrTJZXhZzVQQwW88NtbGieJtxKiiC1TRfUYrxFqKdBSdRiUHWT685vvDyhFY3fwyiEZE4TJLuo" ], "script": "base64:BgJcCAISAwoBCBIDCgEIEgMKAQgSBAoCCAESBQoDAggBEgUKAwgBARIECgIICBIECgIIARIFCgMCCAESAwoBCBIECgIIAhIDCgEIEgMKARgSAwoBGBIECgIICBIAEgBaAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkABtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCHl9wcmV2aW91c19wb29sX2ZyYWN0aW9uX3Jld2FyZAATa0hlaWdodFBvb2xGcmFjdGlvbgIaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAG2tUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIedG90YWxfcmV3YXJkX3Blcl9ibG9ja19jdXJyZW50ABxrVG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzAh90b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX3ByZXZpb3VzABNrUmV3YXJkVXBkYXRlSGVpZ2h0AhRyZXdhcmRfdXBkYXRlX2hlaWdodAAWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAIUX3NoYXJlX3Rva2Vuc19sb2NrZWQAFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQCFV9zaGFyZV90b2tlbnNfYmxvY2tlZAAaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUCGl9zaGFyZV90b2tlbnNfYmxvY2tlZF90eXBlABxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0Ahxfc2hhcmVfdG9rZW5zX2Jsb2NrZWRfaGVpZ2h0ABdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAIVX3NoYXJlX3Rva2Vuc192aXJ0dWFsABZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zAhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAATa1NoYXJlVG9rZW5zVmlydHVhbAIbX3RvdGFsX3NoYXJlX3Rva2Vuc192aXJ0dWFsAAtrTG9ja1BhcmFtcwIMX2xvY2tfcGFyYW1zAA1rTG9ja1dhdmVzRmVlAg5sb2NrX3dhdmVzX2ZlZQAOa1Bvb2xCb29zdENvZWYCC19ib29zdF9jb2VmABFrRmFybUxhc3RJbnRlcmVzdAIOX2xhc3RfaW50ZXJlc3QAFWtGYXJtVXNlckxhc3RJbnRlcmVzdAIOX2xhc3RfaW50ZXJlc3QAEmtCb29zdExhc3RJbnRlcmVzdAIQX2xhc3RfaW50ZXJlc3RfYgAWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAISX2xhc3RfaW50ZXJlc3RfdV9iABNrTGFzdEludGVyZXN0SGVpZ2h0AhVfbGFzdF9pbnRlcmVzdF9oZWlnaHQAB2tTV09QaWQCB1NXT1BfaWQADmtBdmFpbGFibGVTV09QAg9fYXZhaWxhYmxlX1NXT1AAEWtTd29wWWVhckVtaXNzaW9uAhJzd29wX3llYXJfZW1pc3Npb24AEGtIYXJ2ZXN0UG9vbFZvdGUCGF9oYXJ2ZXN0X3Bvb2xfdm90ZV9nU1dPUAAJa1Bvb2xWb3RlAhBfcG9vbF92b3RlX2dTV09QAA1rVXNlclBvb2xWb3RlAhBfdXNlcl92b3RlX2dTV09QAAprUG9vbFN0cnVjAgtfcG9vbF9zdHJ1YwAOa1VzZXJQb29sU3RydWMCEF91c2VyX3Bvb2xfc3RydWMAFGtIYXJ2ZXN0VXNlclBvb2xWb3RlAh1faGFydmVzdF91c2VyX3Bvb2xfdm90ZV9nU1dPUAATa0ZpcnN0SGFydmVzdEhlaWdodAIUZmlyc3RfaGFydmVzdF9oZWlnaHQADWtTaGFyZUxpbWl0RkgCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QADWtDcG1tQ29udHJhY3QCDWNwbW1fY29udHJhY3QADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcAFGtGYXJtaW5nVHJlYXN1cmVBZGRyAhBmYXJtaW5nX3RyZWFzdXJlAAZvcmFjbGUJAQdBZGRyZXNzAQEaAVRIE5cMwNMzzCUygLYp96dkaICr48x7S5kADnRvdGFsVm90ZVNoYXJlAIDIr6AlAAtzY2FsZVZhbHVlOACAwtcvABJsb2NrQm9vc3RDb2VmU2NhbGUA6AcAEGRlZlBvb2xCb29zdENvZWYA9AMBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAEGxwRmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRFrTFBGYXJtaW5nQWRkcmVzcwATZmFybWluZ1RyZWFzdXJlQWRkcgkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFFGtGYXJtaW5nVHJlYXN1cmVBZGRyAAxjcG1tQ29udHJhY3QJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQ3BtbUNvbnRyYWN0AAZhY3RpdmUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMFB2tBY3RpdmUACmFjdGl2ZUdsb2IJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlBQtrQWN0aXZlR2xvYgYABFNXT1AJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa1NXT1BpZAEVZ2V0SGVpZ2h0Rmlyc3RIYXJ2ZXN0AQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBRNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AAABFGdldEZIU2hhcmVMaW1pdFRva2VuAQRwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEcG9vbAUNa1NoYXJlTGltaXRGSAkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUNa1NoYXJlTGltaXRGSAESZ2V0VG90YWxTaGFyZVRva2VuAQRwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMBDGdldFBvb2xWb3RlZAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ12b3RpbmdBZGRyZXNzCQCsAgIFBHBvb2wFCWtQb29sVm90ZQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ12b3RpbmdBZGRyZXNzCQCsAgIFBHBvb2wFCmtQb29sU3RydWMCAAIBXwAAAAABEGdldFVzZXJQb29sVm90ZWQCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ12b3RpbmdBZGRyZXNzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQRwb29sBQ1rVXNlclBvb2xWb3RlCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBHBvb2wFDmtVc2VyUG9vbFN0cnVjAgACAV8AAAAAAQ9nZXRTaGFyZUFzc2V0SWQBBHBvb2wJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBDmNhbGNTY2FsZVZhbHVlAghhc3NldElkMQhhc3NldElkMgQQYXNzZXRJZDFEZWNpbWFscwgJAQV2YWx1ZQEJAOwHAQUIYXNzZXRJZDEIZGVjaW1hbHMEEGFzc2V0SWQyRGVjaW1hbHMICQEFdmFsdWUBCQDsBwEFCGFzc2V0SWQyCGRlY2ltYWxzBAtzY2FsZURpZ2l0cwkAZAIJAGUCBRBhc3NldElkMkRlY2ltYWxzBRBhc3NldElkMURlY2ltYWxzAAgJAGwGAAoAAAULc2NhbGVEaWdpdHMAAAAABQRET1dOARF1c2VyQXZhaWxhYmxlU1dPUAIEcG9vbAR1c2VyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QAAABCnJld2FyZEluZm8BBHBvb2wEGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwUba1RvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUba1RvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50AgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQbdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwUca1RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkArAICCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFHGtUb3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMCDCBhdCBhZGRyZXNzIAkApQgBBQpnb3ZBZGRyZXNzBBlyZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQRwb29sBRprUmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAkArAICCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCDCBhdCBhZGRyZXNzIAkApQgBBQpnb3ZBZGRyZXNzBBJyZXdhcmRVcGRhdGVIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzBRNrUmV3YXJkVXBkYXRlSGVpZ2h0CQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUTa1Jld2FyZFVwZGF0ZUhlaWdodAIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQRwb29sBRNrSGVpZ2h0UG9vbEZyYWN0aW9uBRJyZXdhcmRVcGRhdGVIZWlnaHQEGnJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQRwb29sBRtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMJAKwCAgkArAICCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFG2tSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEEXJld2FyZFBvb2xDdXJyZW50CQBrAwUadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQFGXJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQFDnRvdGFsVm90ZVNoYXJlBBJyZXdhcmRQb29sUHJldmlvdXMJAGsDBRp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMFDnRvdGFsVm90ZVNoYXJlAwMJAGYCBRFyZXdhcmRQb29sQ3VycmVudAUadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQGCQBmAgUScmV3YXJkUG9vbFByZXZpb3VzBRt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAIBAmJyZXdhcmRQb29sQ3VycmVudCA+IHRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50IG9yIHJld2FyZFBvb2xQcmV2aW91cyA+IHRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkAlgoEBRFyZXdhcmRQb29sQ3VycmVudAUScmV3YXJkVXBkYXRlSGVpZ2h0BRJyZXdhcmRQb29sUHJldmlvdXMFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQBE2dldExhc3RJbnRlcmVzdEluZm8BBHBvb2wEDGZhcm1JbnRlcmVzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QEDWJvb3N0SW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QAAAQSbGFzdEludGVyZXN0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQCVCgMFEmxhc3RJbnRlcmVzdEhlaWdodAUMZmFybUludGVyZXN0BQ1ib29zdEludGVyZXN0AQtjYWxjRmFybVJ3ZAIEcG9vbA5jdXJUb3RhbFJld2FyZAQNcG9vbEJvb3N0Q29lZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQm9vc3RDb2VmBRBkZWZQb29sQm9vc3RDb2VmCQBrAwUOY3VyVG90YWxSZXdhcmQFEmxvY2tCb29zdENvZWZTY2FsZQkAZAIFDXBvb2xCb29zdENvZWYFEmxvY2tCb29zdENvZWZTY2FsZQEMY2FsY0Jvb3N0UndkAgRwb29sDmN1clRvdGFsUmV3YXJkBA1wb29sQm9vc3RDb2VmCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xCb29zdENvZWYFEGRlZlBvb2xCb29zdENvZWYJAGsDBQ5jdXJUb3RhbFJld2FyZAUNcG9vbEJvb3N0Q29lZgkAZAIFDXBvb2xCb29zdENvZWYFEmxvY2tCb29zdENvZWZTY2FsZQEMY2FsY0ludGVyZXN0CwRwb29sEmxhc3RJbnRlcmVzdEhlaWdodBJyZXdhcmRVcGRhdGVIZWlnaHQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAxmYXJtSW50ZXJlc3QNYm9vc3RJbnRlcmVzdAlwb29sVm90ZWQVY3VycmVudFJld2FyZFBlckJsb2NrEHNoYXJlVG9rZW5Mb2NrZWQWcHJldmlvdXNSZXdhcmRQZXJCbG9jawpzY2FsZVZhbHVlBAwkdDA5MzgzMTA1NTYDAwMJAGYCBRJyZXdhcmRVcGRhdGVIZWlnaHQFBmhlaWdodAkAAAIFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcGAwkAZgIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQECIT0CBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBAFyCQBoAgUWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQCVCgMFAXIFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAMDAwkAZgIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQAAAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwkAZgIFEmxhc3RJbnRlcmVzdEhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BwQBcgkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQCVCgMFAXIFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAQJcndkQmZyVXBkCQBoAgUWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAZQIFEnJld2FyZFVwZGF0ZUhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0BAZmQmZyVXAJAGQCBQxmYXJtSW50ZXJlc3QJAGsDCQELY2FsY0Zhcm1Sd2QCBQRwb29sBQlyd2RCZnJVcGQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEBmJCZnJVcAkAZAIFDWJvb3N0SW50ZXJlc3QDCQBmAgUJcG9vbFZvdGVkAAAJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUJcndkQmZyVXBkBQtzY2FsZVZhbHVlOAUJcG9vbFZvdGVkAAAEA3J3ZAkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQCVCgMFA3J3ZAUGZkJmclVwBQZiQmZyVXAEBnJld2FyZAgFDCR0MDkzODMxMDU1NgJfMQQOZmFybUludHJCZWZvcmUIBQwkdDA5MzgzMTA1NTYCXzIED2Jvb3N0SW50ckJlZm9yZQgFDCR0MDkzODMxMDU1NgJfMwQPbmV3RmFybUludGVyZXN0CQBkAgUOZmFybUludHJCZWZvcmUJAGsDCQELY2FsY0Zhcm1Sd2QCBQRwb29sBQZyZXdhcmQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEEG5ld0Jvb3N0SW50ZXJlc3QJAGQCBQ9ib29zdEludHJCZWZvcmUDCQBmAgUJcG9vbFZvdGVkAAAJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUGcmV3YXJkBQtzY2FsZVZhbHVlOAUJcG9vbFZvdGVkAAAJAJUKAwUPbmV3RmFybUludGVyZXN0BRBuZXdCb29zdEludGVyZXN0BQZyZXdhcmQBCWNsYWltQ2FsYwIEcG9vbAR1c2VyBApzY2FsZVZhbHVlCQEOY2FsY1NjYWxlVmFsdWUCBQRTV09QCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQJcG9vbFZvdGVkCQEMZ2V0UG9vbFZvdGVkAQUEcG9vbAQKdVBvb2xWb3RlZAkBEGdldFVzZXJQb29sVm90ZWQCBQRwb29sBQR1c2VyBApzaGFyZVRva2VuCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQRdG90YWxTaGFyZVZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBQpzaGFyZVRva2VuBA0kdDAxMTMxNDExMzk1CQETZ2V0TGFzdEludGVyZXN0SW5mbwEFBHBvb2wEEmxhc3RJbnRlcmVzdEhlaWdodAgFDSR0MDExMzE0MTEzOTUCXzEEDGZhcm1JbnRlcmVzdAgFDSR0MDExMzE0MTEzOTUCXzIEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxMTMxNDExMzk1Al8zBA0kdDAxMTQwMDExNTE0CQEKcmV3YXJkSW5mbwEFBHBvb2wEFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFDSR0MDExNDAwMTE1MTQCXzEEEnJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDExNDAwMTE1MTQCXzIEFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQ0kdDAxMTQwMDExNTE0Al8zBBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTE0MDAxMTUxNAJfNAQNdUZhcm1JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAQOdUJvb3N0SW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAQSdVNoYXJlVG9rZW5zU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQQdVNoYXJlVG9rZW5zVmlydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUSdVNoYXJlVG9rZW5zU3Rha2VkAwkAAAIFEXRvdGFsU2hhcmVWaXJ0dWFsAAAECnRvVHJlYXN1cnkDCQAAAgUMZmFybUludGVyZXN0AAAJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAAACQCWCgQFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAAABQp0b1RyZWFzdXJ5BA0kdDAxMjE3NTEyNTM1CQEMY2FsY0ludGVyZXN0CwUEcG9vbAUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUJcG9vbFZvdGVkBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sFEXRvdGFsU2hhcmVWaXJ0dWFsBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrBQpzY2FsZVZhbHVlBA9uZXdGYXJtSW50ZXJlc3QIBQ0kdDAxMjE3NTEyNTM1Al8xBBBuZXdCb29zdEludGVyZXN0CAUNJHQwMTIxNzUxMjUzNQJfMgQKZnVsbFJld2FyZAgFDSR0MDEyMTc1MTI1MzUCXzMEB2Zhcm1Sd2QJAGsDBRB1U2hhcmVUb2tlbnNWaXJ0CQBlAgUPbmV3RmFybUludGVyZXN0BQ11RmFybUludGVyZXN0BQpzY2FsZVZhbHVlBA1wb29sQm9vc3RDb2VmCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xCb29zdENvZWYFEGRlZlBvb2xCb29zdENvZWYEC2Jvb3N0UndkTWF4CQBrAwUHZmFybVJ3ZAUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlBAtjdXJCb29zdFJ3ZAkAawMJAGUCBRBuZXdCb29zdEludGVyZXN0BQ51Qm9vc3RJbnRlcmVzdAUKdVBvb2xWb3RlZAULc2NhbGVWYWx1ZTgECGJvb3N0UndkCQCXAwEJAMwIAgULYm9vc3RSd2RNYXgJAMwIAgULY3VyQm9vc3RSd2QFA25pbAQKdG9UcmVhc3VyeQkAZQIFC2Jvb3N0UndkTWF4BQhib29zdFJ3ZAMJAGYCAAAFCnRvVHJlYXN1cnkJAAIBAg50b1RyZWFzdXJ5IDwgMAkAlgoEBQ9uZXdGYXJtSW50ZXJlc3QFEG5ld0Jvb3N0SW50ZXJlc3QJAGQCBQdmYXJtUndkBQhib29zdFJ3ZAUKdG9UcmVhc3VyeQEbYXZhaWxhYmxlQ2xhaW1DYWxjQWxsQnlVc2VyAgVwb29scwR1c2VyCgENY2FsY0F2YWlsYWJsZQIDYWNjBHBvb2wEDSR0MDEzMjgyMTMzMTEFA2FjYwQIbmV3UG9vbHMIBQ0kdDAxMzI4MjEzMzExAl8xBAdhbW91bnRzCAUNJHQwMTMyODIxMzMxMQJfMgQNJHQwMTMzMjAxMzM3MwkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEAmZpCAUNJHQwMTMzMjAxMzM3MwJfMQQCYmkIBQ0kdDAxMzMyMDEzMzczAl8yBAtjbGFpbUFtb3VudAgFDSR0MDEzMzIwMTMzNzMCXzMEAnR0CAUNJHQwMTMzMjAxMzM3MwJfNAQNYXZhaWxhYmxlRnVuZAkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50CQCUCgIJAM0IAgUIbmV3UG9vbHMFBHBvb2wJAM0IAgUHYW1vdW50cwUNYXZhaWxhYmxlRnVuZAoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWNhbGNBdmFpbGFibGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDYwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8ARVjYW5Mb2NrSW5GaXJzdEhhcnZlc3QFBHBvb2wEdXNlchV1c2VyU2hhcmVUb2tlbnNTdGFrZWQJcG10QW1vdW50CGxvY2tUeXBlAwkAZgIJARVnZXRIZWlnaHRGaXJzdEhhcnZlc3QBBQRwb29sBQZoZWlnaHQED3RvdGFsVm90ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ12b3RpbmdBZGRyZXNzCQCsAgIFBHBvb2wFEGtIYXJ2ZXN0UG9vbFZvdGUAAAQOdXNlclZvdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUEcG9vbAUUa0hhcnZlc3RVc2VyUG9vbFZvdGUAAAQRRkhTaGFyZVRva2VuTGltaXQJARRnZXRGSFNoYXJlTGltaXRUb2tlbgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEFUZIU2hhcmVUb2tlblVzZXJMaW1pdAkAZQIJAGsDBRFGSFNoYXJlVG9rZW5MaW1pdAUOdXNlclZvdGVBbW91bnQFD3RvdGFsVm90ZUFtb3VudAUVdXNlclNoYXJlVG9rZW5zU3Rha2VkAwkAZgIFCGxvY2tUeXBlAAAJAAIBAjJZb3UgY2FuJ3QgbG9jayBzaGFyZVRva2VucyB0aWxsIGZpcnN0IGhhcnZlc3QgZW5kLgMJAAACBQ51c2VyVm90ZUFtb3VudAAAAAADCQBnAgUJcG10QW1vdW50BRVGSFNoYXJlVG9rZW5Vc2VyTGltaXQJAGUCBQlwbXRBbW91bnQFFUZIU2hhcmVUb2tlblVzZXJMaW1pdAAAAAABDWdldExvY2tQYXJhbXMBBHR5cGUECmxvY2tQYXJhbXMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkApAMBBQR0eXBlBQtrTG9ja1BhcmFtcwkArAICAh5UaGVyZSBhcmUgbm8ga2V5IGZvciBsb2NrIHR5cGUJAKQDAQUEdHlwZQIBXwkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbG9ja1BhcmFtcwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbG9ja1BhcmFtcwABAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQhpc0FjdGl2ZQADAwUGYWN0aXZlBQphY3RpdmVHbG9iBwUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1Bvb2xDYWxsAgFpBHBvb2wDAwkAAAIJAKUIAQgFAWkGY2FsbGVyBQRwb29sBgkAAAIIBQFpBmNhbGxlcgUMY3BtbUNvbnRyYWN0BQR1bml0CQACAQIgT25seSBwb29sIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgETY2FsY0xvY2tTaGFyZVRva2VucwQBaQZjYWxsZXIEcG9vbAhsb2NrVHlwZQQMc2hhcmVBc3NldElkCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQEdXNlcgkApQgBBQZjYWxsZXIECnRvdGFsU2hhcmUJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBBF0b3RhbFNoYXJlVmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFCnRvdGFsU2hhcmUEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABA91c2VyTG9ja2VkSGVpZ3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQEFHRvdGFsVXNlclNoYXJlVG9rZW5zCQBkAgkAZAIFEHVzZXJTdGFrZWRBbW91bnQFEHVzZXJMb2NrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA0kdDAxNjE3NDE2MjI2CQENZ2V0TG9ja1BhcmFtcwEFCGxvY2tUeXBlBApsb2NrUGVyaW9kCAUNJHQwMTYxNzQxNjIyNgJfMQQIbG9ja0NvZWYIBQ0kdDAxNjE3NDE2MjI2Al8yBAxsb2NrV2F2ZXNGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtMb2NrV2F2ZXNGZWUDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECG1dyb25nIHNoYXJldG9rZW4gaW4gcGF5bWVudAMJAGcCAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQACAQIlUGF5bWVudCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCGxvY2tUeXBlCQACAQIVbG9ja1R5cGUgbXVzdCBiZSA+PSAwBBVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJARVjYW5Mb2NrSW5GaXJzdEhhcnZlc3QFBQRwb29sBQR1c2VyBRB1c2VyU3Rha2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIbG9ja1R5cGUDCQAAAgUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZIBRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgEDSR0MDE2NjUzMTg1ODcDCQAAAgUIbG9ja1R5cGUAAAQUdXNlckFtb3VudFZpcnR1YWxOZXcJAGUCCQBkAgURdXNlckFtb3VudFZpcnR1YWwICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAkAZQIJAGQCBRB1c2VyU3Rha2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZICQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZQIJAGQCBRF0b3RhbFNoYXJlVmlydHVhbAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwJAGUCCQBkAgUKdG90YWxTaGFyZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAADAwkAZgIAAgkAkAMBCAUBaQhwYXltZW50cwYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAUEdW5pdAYJAGYCBQxsb2NrV2F2ZXNGZWUICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BwkAAgEJAKwCAgkArAICAitZb3UgbmVlZCB0byBwYXkgYWRkaXRpb25hbCB3YXZlcyBjb21pc3Npb24gCQCkAwEFDGxvY2tXYXZlc0ZlZQIFV0FWRVMDCQBmAgUPdXNlckxvY2tlZEhlaWd0CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kCQACAQJPWW91IGNhbm5vdCBsb2NrIHNoYXJldG9rZW5zIGZvciBhIHBlcmlvZCBsZXNzIHRoYW4gd2hhdCB5b3UgaGF2ZSBhbHJlYWR5IGxvY2tlZAQTdXNlckxvY2tlZEFtb3VudE5ldwkAZAIFEHVzZXJMb2NrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBJ1c2VyTG9ja2VkSGVpZ3ROZXcJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBkAgkAawMFE3VzZXJMb2NrZWRBbW91bnROZXcFCGxvY2tDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUFEHVzZXJTdGFrZWRBbW91bnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAUTdXNlckxvY2tlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAUSdXNlckxvY2tlZEhlaWd0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQUIbG9ja1R5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcFA25pbAkAZAIFCnRvdGFsU2hhcmUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAtsb2NrRW50cmllcwgFDSR0MDE2NjUzMTg1ODcCXzEEDXRvdGFsU2hhcmVOZXcIBQ0kdDAxNjY1MzE4NTg3Al8yAwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDHNoYXJlQXNzZXRJZAUNdG90YWxTaGFyZU5ldwkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAQNJHQwMTg3MTIxODc5NAkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDE4NzEyMTg3OTQCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxODcxMjE4Nzk0Al8yBAtjbGFpbUFtb3VudAgFDSR0MDE4NzEyMTg3OTQCXzMECnRvVHJlYXN1cmUIBQ0kdDAxODcxMjE4Nzk0Al80BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50BAR1cGxwAwkAAAIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3ZlcnNpb24CBTMuMC4wCQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCEnVwZGF0ZVVzZXJJbnRlcmVzdAkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgUUdG90YWxVc2VyU2hhcmVUb2tlbnMFA25pbAUDbmlsAAADCQAAAgUEdXBscAUEdXBscAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwUNdG90YWxTaGFyZU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAUDbmlsBQtsb2NrRW50cmllcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXY2FsY1dpdGhkcmF3U2hhcmVUb2tlbnMEAWkGY2FsbGVyBHBvb2wZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNc2hhcmVUb2tlbnNJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQEFdmFsdWUBCQCmCAEFBHBvb2wCDnNoYXJlX2Fzc2V0X2lkBAR1c2VyCQClCAEFBmNhbGxlcgQNJHQwMTk5ODYyMDA2OAkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDE5OTg2MjAwNjgCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxOTk4NjIwMDY4Al8yBAtjbGFpbUFtb3VudAgFDSR0MDE5OTg2MjAwNjgCXzMECnRvVHJlYXN1cmUIBQ0kdDAxOTk4NjIwMDY4Al80BBB1c2VyU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQQdXNlckxvY2tlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkAAAEEXVzZXJBbW91bnRWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRB1c2VyU3Rha2VkQW1vdW50BBN1c2VyU3Rha2VkQW1vdW50TmV3CQBlAgUQdXNlclN0YWtlZEFtb3VudAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAQQdG90YWxTaGFyZUFtb3VudAkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUQdG90YWxTaGFyZUFtb3VudAQTdG90YWxTaGFyZUFtb3VudE5ldwkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEFHRvdGFsU2hhcmVWaXJ0dWFsTmV3CQBlAgURdG90YWxTaGFyZVZpcnR1YWwFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBlAgURdXNlckFtb3VudFZpcnR1YWwFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQDCQBmAgUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAUQdXNlclN0YWtlZEFtb3VudAkAAgECLFdpdGhkcmF3IGFtb3VudCBtb3JlIHRoZW4gdXNlciBsb2NrZWQgYW1vdW50AwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDXNoYXJlVG9rZW5zSWQFEHRvdGFsU2hhcmVBbW91bnQJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQEBHVwbHADCQAAAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUEcG9vbAIHdmVyc2lvbgIFMy4wLjAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwISdXBkYXRlVXNlckludGVyZXN0CQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAUDbmlsBQNuaWwAAAMJAAACBQR1cGxwBQR1cGxwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zBRN0b3RhbFNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFFHRvdGFsU2hhcmVWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAUNc2hhcmVUb2tlbnNJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQljYWxjQ2xhaW0DAWkEcG9vbAZjYWxsZXIEDXNoYXJlVG9rZW5zSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAQEdXNlcgkApQgBBQZjYWxsZXIEEHNoYXJlVG9rZW5Mb2NrZWQJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBA0kdDAyMjU4MTIyNjYzCQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMjI1ODEyMjY2MwJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDIyNTgxMjI2NjMCXzIEC2NsYWltQW1vdW50CAUNJHQwMjI1ODEyMjY2MwJfMwQKdG9UcmVhc3VyZQgFDSR0MDIyNTgxMjI2NjMCXzQEDWF2YWlsYWJsZUZ1bmQJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAMJAGYCCQEOYWNjb3VudEJhbGFuY2UBBQ1zaGFyZVRva2Vuc0lkBRBzaGFyZVRva2VuTG9ja2VkCQACAQIwQmFsYW5jZSBvZiBzaGFyZS10b2tlbiBpcyBsb3dlciB0aGFuIHRvdGFsQW1vdW50BAZ1VHJhbnMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ1hdmFpbGFibGVGdW5kBQRTV09QBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AAAAkAzAgCCQEHUmVpc3N1ZQMFBFNXT1AJAGQCBQp0b1RyZWFzdXJlBQ1hdmFpbGFibGVGdW5kBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QBQNuaWwFBnVUcmFucwUNYXZhaWxhYmxlRnVuZBEBaQEEaW5pdAEHZWFybHlMUAMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFB2tTV09QaWQJAAIBAhhTV09QIGFscmVhZHkgaW5pdGlhbGl6ZWQECmluaXRBbW91bnQAgIDpg7HeFgQJU1dPUGlzc3VlCQDCCAUCBFNXT1ACE1NXT1AgcHJvdG9jb2wgdG9rZW4FCmluaXRBbW91bnQACAYEBlNXT1BpZAkAuAgBBQlTV09QaXNzdWUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAMIIBQIEU1dPUAITU1dPUCBwcm90b2NvbCB0b2tlbgUKaW5pdEFtb3VudAAIBgkAzAgCCQELU3RyaW5nRW50cnkCBQdrU1dPUGlkCQDYBAEFBlNXT1BpZAUDbmlsAWkBFGluaXRQb29sU2hhcmVGYXJtaW5nAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBEnVwZGF0ZVBvb2xJbnRlcmVzdAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQFpBmNhbGxlcgUKZ292QWRkcmVzcwkAAgECJk9ubHkgR292ZXJuYW5jZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBAR1c2VyCQClCAEJAKcIAQURYWRtaW5JbnZva2VQdWJLZXkEDSR0MDI0NTQwMjQ2MTQJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAyNDU0MDI0NjE0Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMjQ1NDAyNDYxNAJfMgQPYm9vc3RMUGludGVyZXN0CAUNJHQwMjQ1NDAyNDYxNAJfMwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQ9sb2NrU2hhcmVUb2tlbnMCBHBvb2wIbG9ja1R5cGUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJARNjYWxjTG9ja1NoYXJlVG9rZW5zBAUBaQgFAWkGY2FsbGVyBQRwb29sBQhsb2NrVHlwZQFpARdsb2NrU2hhcmVUb2tlbnNGcm9tUG9vbAMLY2FsbGVyQnl0ZXMEcG9vbAhsb2NrVHlwZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzUG9vbENhbGwCBQFpBQRwb29sCQETY2FsY0xvY2tTaGFyZVRva2VucwQFAWkJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMFBHBvb2wFCGxvY2tUeXBlAWkBFWxvY2tTdGFrZWRTaGFyZVRva2VucwMEcG9vbAhsb2NrVHlwZQpsb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAxzaGFyZUFzc2V0SWQJAQ9nZXRTaGFyZUFzc2V0SWQBBQRwb29sBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQKdG90YWxTaGFyZQkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUKdG90YWxTaGFyZQQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAED3VzZXJMb2NrZWRIZWlndAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0AAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAQUdG90YWxVc2VyU2hhcmVUb2tlbnMJAGQCBRB1c2VyU3Rha2VkQW1vdW50BRB1c2VyTG9ja2VkQW1vdW50BA0kdDAyNjAzMzI2MDg1CQENZ2V0TG9ja1BhcmFtcwEFCGxvY2tUeXBlBApsb2NrUGVyaW9kCAUNJHQwMjYwMzMyNjA4NQJfMQQIbG9ja0NvZWYIBQ0kdDAyNjAzMzI2MDg1Al8yBAxsb2NrV2F2ZXNGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtMb2NrV2F2ZXNGZWUDCQBmAgkBFWdldEhlaWdodEZpcnN0SGFydmVzdAEFBHBvb2wFBmhlaWdodAkAAgECMllvdSBjYW4ndCBsb2NrIHNoYXJlVG9rZW5zIHRpbGwgZmlyc3QgaGFydmVzdCBlbmQuAwkAZwIAAAUIbG9ja1R5cGUJAAIBAhRsb2NrVHlwZSBtdXN0IGJlID4gMAMJAGYCBQpsb2NrQW1vdW50BRB1c2VyU3Rha2VkQW1vdW50CQACAQkArAICAhlZb3UgY2FuJ3QgbG9jayBtb3JlIHRoYW4gCQCkAwEFEHVzZXJTdGFrZWRBbW91bnQDCQBmAgkBDmFjY291bnRCYWxhbmNlAQUMc2hhcmVBc3NldElkBQp0b3RhbFNoYXJlCQACAQIwQmFsYW5jZSBvZiBzaGFyZS10b2tlbiBpcyBsb3dlciB0aGFuIHRvdGFsQW1vdW50AwMJAAACBQ91c2VyTG9ja2VkSGVpZ3QAAAMDCQBmAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BgkAZgIFDGxvY2tXYXZlc0ZlZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQHCQACAQkArAICCQCsAgICK1lvdSBuZWVkIHRvIHBheSBhZGRpdGlvbmFsIHdhdmVzIGNvbWlzc2lvbiAJAKQDAQUMbG9ja1dhdmVzRmVlAgVXQVZFUwMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAAJAGcCAAAFCmxvY2tBbW91bnQHCQACAQIhbG9ja0Ftb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUKbG9ja0Ftb3VudAkAAgECG2xvY2tBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQMJAGYCBQ91c2VyTG9ja2VkSGVpZ3QJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QJAAIBAk9Zb3UgY2Fubm90IGxvY2sgc2hhcmV0b2tlbnMgZm9yIGEgcGVyaW9kIGxlc3MgdGhhbiB3aGF0IHlvdSBoYXZlIGFscmVhZHkgbG9ja2VkBBN1c2VyTG9ja2VkQW1vdW50TmV3CQBkAgUQdXNlckxvY2tlZEFtb3VudAUKbG9ja0Ftb3VudAQTdXNlclN0YWtlZEFtb3VudE5ldwkAZQIFEHVzZXJTdGFrZWRBbW91bnQFCmxvY2tBbW91bnQEEnVzZXJMb2NrZWRIZWlndE5ldwkAZAIFBmhlaWdodAUKbG9ja1BlcmlvZAQUdXNlckFtb3VudFZpcnR1YWxOZXcJAGQCCQBrAwUTdXNlckxvY2tlZEFtb3VudE5ldwUIbG9ja0NvZWYFEmxvY2tCb29zdENvZWZTY2FsZQUTdXNlclN0YWtlZEFtb3VudE5ldwQNJHQwMjczNzUyNzQ1NwkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDI3Mzc1Mjc0NTcCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyNzM3NTI3NDU3Al8yBAtjbGFpbUFtb3VudAgFDSR0MDI3Mzc1Mjc0NTcCXzMECnRvVHJlYXN1cmUIBQ0kdDAyNzM3NTI3NDU3Al80BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkBRN1c2VyTG9ja2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0BRJ1c2VyTG9ja2VkSGVpZ3ROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFGmtVc2VyU2hhcmVUb2tlbnNMb2NrZWRUeXBlBQhsb2NrVHlwZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwJAGQCCQBlAgURdG90YWxTaGFyZVZpcnR1YWwFEXVzZXJBbW91bnRWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QBQNuaWwBaQEOdW5sb2NrVXNlckxvY2sCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQMbG9ja1dhdmVzRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rTG9ja1dhdmVzRmVlBA91c2VyTG9ja2VkSGVpZ3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0CQCsAgIJAKwCAgkArAICCQCsAgICEVRoZXJlIGlzIG5vIHBvb2wgBQRwb29sAgkgb3IgdXNlciAFBHVzZXICCXdpdGggbG9jawQRdG90YWxTaGFyZVZpcnR1YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAMJAGYCBQ91c2VyTG9ja2VkSGVpZ3QFBmhlaWdodAkAAgEJAKwCAgIiWW91IGNhbid0IHVubG9jayBzaGFyZXRva2VucyB0aWxsIAkApAMBBQ91c2VyTG9ja2VkSGVpZ3QEE3VzZXJTdGFrZWRBbW91bnROZXcJAGQCBRB1c2VyU3Rha2VkQW1vdW50BRB1c2VyTG9ja2VkQW1vdW50BA0kdDAyOTUzNDI5NjE2CQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMjk1MzQyOTYxNgJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDI5NTM0Mjk2MTYCXzIEC2NsYWltQW1vdW50CAUNJHQwMjk1MzQyOTYxNgJfMwQKdG9UcmVhc3VyZQgFDSR0MDI5NTM0Mjk2MTYCXzQEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZAIJAGUCBRF0b3RhbFNoYXJlVmlydHVhbAURdXNlckFtb3VudFZpcnR1YWwFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QBRFhdmFpbGFibGVGdW5kc05ldwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMbG9ja1dhdmVzRmVlBQR1bml0BQNuaWwBaQETd2l0aGRyYXdTaGFyZVRva2VucwIEcG9vbBlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQEXY2FsY1dpdGhkcmF3U2hhcmVUb2tlbnMEBQFpCAUBaQZjYWxsZXIFBHBvb2wFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQBaQEbd2l0aGRyYXdTaGFyZVRva2Vuc0Zyb21Qb29sAwtjYWxsZXJCeXRlcwRwb29sGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc1Bvb2xDYWxsAgUBaQUEcG9vbAkBF2NhbGNXaXRoZHJhd1NoYXJlVG9rZW5zBAUBaQkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwUEcG9vbAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAFpAQVjbGFpbQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQBcgkBCWNhbGNDbGFpbQMFAWkFBHBvb2wIBQFpBmNhbGxlcgMJAAACCAUBcgJfMgAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAUBcgFpAQ1jbGFpbUludGVybmFsAgRwb29sBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpCQEJY2FsY0NsYWltAwUBaQUEcG9vbAkBB0FkZHJlc3MBBQZjYWxsZXIBaQENY2xhaW1BbmRTdGFrZQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50AwkAAAIFC2NsYWltQW1vdW50AAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QBApzdGFrZVRvR292CQD8BwQFCmdvdkFkZHJlc3MCE2xvY2tTV09QRnJvbUZhcm1pbmcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEU1dPUAULY2xhaW1BbW91bnQFA25pbAMJAAACBQpzdGFrZVRvR292BQpzdGFrZVRvR292BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY2xhaW1BbGwBBXBvb2xzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACgEIY2xhaW1JbnYCCmNsYWltVG90YWwEcG9vbAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50CQBkAgUKY2xhaW1Ub3RhbAULY2xhaW1BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECmNsYWltVG90YWwKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGNsYWltSW52AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAMJAAACBQpjbGFpbVRvdGFsAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKY2xhaW1Ub3RhbAUEU1dPUAUDbmlsAWkBEGNsYWltQWxsQW5kU3Rha2UBBXBvb2xzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACgEIY2xhaW1JbnYCCmNsYWltVG90YWwEcG9vbAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50CQBkAgUKY2xhaW1Ub3RhbAULY2xhaW1BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECmNsYWltVG90YWwKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGNsYWltSW52AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAMJAAACBQpjbGFpbVRvdGFsAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QBApzdGFrZVRvR292CQD8BwQFCmdvdkFkZHJlc3MCE2xvY2tTV09QRnJvbUZhcm1pbmcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEU1dPUAUKY2xhaW1Ub3RhbAUDbmlsAwkAAAIFCnN0YWtlVG9Hb3YFCnN0YWtlVG9Hb3YFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARd1cGRhdGVVc2VyQm9vc3RJbnRlcmVzdAIEcG9vbAR1c2VyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFAWkGY2FsbGVyBQ12b3RpbmdBZGRyZXNzCQACAQIjT25seSB2b2l0aW5nIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EDSR0MDMzMDkwMzMxNzIJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAzMzA5MDMzMTcyAl8xBA1ib29zdEludGVyZXN0CAUNJHQwMzMwOTAzMzE3MgJfMgQLY2xhaW1BbW91bnQIBQ0kdDAzMzA5MDMzMTcyAl8zBAp0b1RyZWFzdXJlCAUNJHQwMzMwOTAzMzE3MgJfNAQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwBAnR4AQZ2ZXJpZnkABAckbWF0Y2gwBQJ0eAQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBhFP3Q==", "height": 2346839, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8twS7zvqugChLtVgFiBJ7SQcooSJNne1f97CvNwgjexG Next: 3S7KLXSCCPqraMyA6W4wGE5QsVR8g43RNVpoYtD9iTzf Diff:
OldNewDifferences
4646 let kBoostLastInterest = "_last_interest_b"
4747
4848 let kBoostUserLastInterest = "_last_interest_u_b"
49-
50-let kBoostLPLastInterest = "_last_interest_lpb"
51-
52-let kBoostLPUserLastInterest = "_last_interest_u_lpb"
5349
5450 let kLastInterestHeight = "_last_interest_height"
5551
198194 func getLastInterestInfo (pool) = {
199195 let farmInterest = valueOrErrorMessage(getInteger(this, (pool + kFarmLastInterest)), (("No data on the key: " + pool) + kFarmLastInterest))
200196 let boostInterest = valueOrElse(getInteger(this, (pool + kBoostLastInterest)), 0)
201- let boostLPInterest = valueOrElse(getInteger(this, (pool + kBoostLPLastInterest)), 0)
202197 let lastInterestHeight = valueOrElse(getInteger(this, (pool + kLastInterestHeight)), height)
203- $Tuple4(lastInterestHeight, farmInterest, boostInterest, boostLPInterest)
198+ $Tuple3(lastInterestHeight, farmInterest, boostInterest)
204199 }
205200
206201
216211 }
217212
218213
219-func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
220- then $Tuple3(farmInterest, boostInterest, boostLpInterest)
221- else {
222- let $t0991411327 = if (if (if ((rewardUpdateHeight > height))
214+func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = {
215+ let $t0938310556 = if (if (if ((rewardUpdateHeight > height))
216+ then (rewardUpdateHeight == poolRewardUpdateHeight)
217+ else false)
218+ then true
219+ else if ((height > rewardUpdateHeight))
220+ then (rewardUpdateHeight != poolRewardUpdateHeight)
221+ else false)
222+ then {
223+ let r = (previousRewardPerBlock * (height - lastInterestHeight))
224+ $Tuple3(r, farmInterest, boostInterest)
225+ }
226+ else if (if (if ((height > rewardUpdateHeight))
223227 then (rewardUpdateHeight == poolRewardUpdateHeight)
224228 else false)
225- then true
226- else if ((height > rewardUpdateHeight))
227- then (rewardUpdateHeight != poolRewardUpdateHeight)
228- else false)
229+ then (lastInterestHeight > rewardUpdateHeight)
230+ else false)
229231 then {
230- let r = (previousRewardPerBlock * (height - lastInterestHeight))
231- $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
232+ let r = (currentRewardPerBlock * (height - lastInterestHeight))
233+ $Tuple3(r, farmInterest, boostInterest)
232234 }
233- else if (if (if ((height > rewardUpdateHeight))
234- then (rewardUpdateHeight == poolRewardUpdateHeight)
235- else false)
236- then (lastInterestHeight > rewardUpdateHeight)
237- else false)
238- then {
239- let r = (currentRewardPerBlock * (height - lastInterestHeight))
240- $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
241- }
242- else {
243- let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
244- let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
245- let bBfrUp = (boostInterest + (if ((poolVoted > 0))
246- then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
247- else 0))
248- let bLPBfrUp = (boostLpInterest + (if ((poolVoted > 0))
249- then fraction(fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
250- else 0))
251- let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
252- $Tuple4(rwd, fBfrUp, bBfrUp, bLPBfrUp)
253- }
254- let reward = $t0991411327._1
255- let farmIntrBefore = $t0991411327._2
256- let boostIntrBefore = $t0991411327._3
257- let boostLPIntrBefore = $t0991411327._4
258- let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
259- let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
260- then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
261- else 0))
262- let newBoostLPInterest = (boostLPIntrBefore + (if ((poolVoted > 0))
263- then fraction(fraction(calcBoostRwd(pool, reward), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
264- else 0))
265- $Tuple3(newFarmInterest, newBoostInterest, newBoostLPInterest)
266- }
235+ else {
236+ let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
237+ let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
238+ let bBfrUp = (boostInterest + (if ((poolVoted > 0))
239+ then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
240+ else 0))
241+ let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
242+ $Tuple3(rwd, fBfrUp, bBfrUp)
243+ }
244+ let reward = $t0938310556._1
245+ let farmIntrBefore = $t0938310556._2
246+ let boostIntrBefore = $t0938310556._3
247+ let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
248+ let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
249+ then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
250+ else 0))
251+ $Tuple3(newFarmInterest, newBoostInterest, reward)
252+ }
267253
268254
269255 func claimCalc (pool,user) = {
272258 let uPoolVoted = getUserPoolVoted(pool, user)
273259 let shareToken = getTotalShareToken(pool)
274260 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
275- let $t01227612374 = getLastInterestInfo(pool)
276- let lastInterestHeight = $t01227612374._1
277- let farmInterest = $t01227612374._2
278- let boostInterest = $t01227612374._3
279- let boostLPInterest = $t01227612374._4
280- let $t01237912493 = rewardInfo(pool)
281- let currentRewardPerBlock = $t01237912493._1
282- let rewardUpdateHeight = $t01237912493._2
283- let previousRewardPerBlock = $t01237912493._3
284- let poolRewardUpdateHeight = $t01237912493._4
261+ let $t01131411395 = getLastInterestInfo(pool)
262+ let lastInterestHeight = $t01131411395._1
263+ let farmInterest = $t01131411395._2
264+ let boostInterest = $t01131411395._3
265+ let $t01140011514 = rewardInfo(pool)
266+ let currentRewardPerBlock = $t01140011514._1
267+ let rewardUpdateHeight = $t01140011514._2
268+ let previousRewardPerBlock = $t01140011514._3
269+ let poolRewardUpdateHeight = $t01140011514._4
285270 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
286271 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
287- let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
288272 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
289273 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
290- let $t01306113454 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
291- let newFarmInterest = $t01306113454._1
292- let newBoostInterest = $t01306113454._2
293- let newBoostLPInterest = $t01306113454._3
294- let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
295- let claimBoostingMax = if ((uPoolVoted == 0))
296- then (claimFarming / 2)
297- else fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
298- let mul = fraction(toBigInt(uShareTokensVirt), toBigInt(uPoolVoted), toBigInt(1))
299- let claimBoosting = toInt(fraction(fraction(mul, toBigInt((newBoostLPInterest - uBoostLPInterest)), toBigInt(scaleValue8)), toBigInt(1), toBigInt(scaleValue8)))
300- let toTreasury = (claimBoostingMax - claimBoosting)
301- if ((0 > toTreasury))
302- then throw("toTreasury < 0")
303- else $Tuple5(newFarmInterest, newBoostInterest, newBoostLPInterest, (claimFarming + claimBoosting), toTreasury)
274+ if ((totalShareVirtual == 0))
275+ then {
276+ let toTreasury = if ((farmInterest == 0))
277+ then (currentRewardPerBlock * (height - lastInterestHeight))
278+ else 0
279+ $Tuple4(farmInterest, boostInterest, 0, toTreasury)
280+ }
281+ else {
282+ let $t01217512535 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
283+ let newFarmInterest = $t01217512535._1
284+ let newBoostInterest = $t01217512535._2
285+ let fullReward = $t01217512535._3
286+ let farmRwd = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
287+ let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
288+ let boostRwdMax = fraction(farmRwd, poolBoostCoef, lockBoostCoefScale)
289+ let curBoostRwd = fraction((newBoostInterest - uBoostInterest), uPoolVoted, scaleValue8)
290+ let boostRwd = min([boostRwdMax, curBoostRwd])
291+ let toTreasury = (boostRwdMax - boostRwd)
292+ if ((0 > toTreasury))
293+ then throw("toTreasury < 0")
294+ else $Tuple4(newFarmInterest, newBoostInterest, (farmRwd + boostRwd), toTreasury)
295+ }
304296 }
305297
306298
307299 func availableClaimCalcAllByUser (pools,user) = {
308300 func calcAvailable (acc,pool) = {
309- let $t01436514394 = acc
310- let newPools = $t01436514394._1
311- let amounts = $t01436514394._2
312- let $t01440314462 = claimCalc(pool, user)
313- let fi = $t01440314462._1
314- let bi = $t01440314462._2
315- let blpi = $t01440314462._3
316- let claimAmount = $t01440314462._4
317- let tt = $t01440314462._5
301+ let $t01328213311 = acc
302+ let newPools = $t01328213311._1
303+ let amounts = $t01328213311._2
304+ let $t01332013373 = claimCalc(pool, user)
305+ let fi = $t01332013373._1
306+ let bi = $t01332013373._2
307+ let claimAmount = $t01332013373._3
308+ let tt = $t01332013373._4
318309 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
319310 $Tuple2((newPools :+ pool), (amounts :+ availableFund))
320311 }
394385 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
395386 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
396387 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
397- let $t01726317315 = getLockParams(lockType)
398- let lockPeriod = $t01726317315._1
399- let lockCoef = $t01726317315._2
388+ let $t01617416226 = getLockParams(lockType)
389+ let lockPeriod = $t01617416226._1
390+ let lockCoef = $t01617416226._2
400391 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
401392 if ((i.payments[0].assetId != shareAssetId))
402393 then throw("Wrong sharetoken in payment")
408399 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
409400 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
410401 then {
411- let $t01774219676 = if ((lockType == 0))
402+ let $t01665318587 = if ((lockType == 0))
412403 then {
413404 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
414405 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(caller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
429420 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
430421 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew))], (totalShare + i.payments[0].amount))
431422 }
432- let lockEntries = $t01774219676._1
433- let totalShareNew = $t01774219676._2
423+ let lockEntries = $t01665318587._1
424+ let totalShareNew = $t01665318587._2
434425 if ((accountBalance(shareAssetId) > totalShareNew))
435426 then throw("Balance of share-token is lower than totalAmount")
436427 else {
437- let $t01980119900 = claimCalc(pool, user)
438- let farmInterest = $t01980119900._1
439- let boostInterest = $t01980119900._2
440- let boostLPinterest = $t01980119900._3
441- let claimAmount = $t01980119900._4
442- let toTreasure = $t01980119900._5
428+ let $t01871218794 = claimCalc(pool, user)
429+ let farmInterest = $t01871218794._1
430+ let boostInterest = $t01871218794._2
431+ let claimAmount = $t01871218794._3
432+ let toTreasure = $t01871218794._4
443433 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
444434 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
445435 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, totalUserShareTokens], nil)
446436 else 0
447437 if ((uplp == uplp))
448- then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ lockEntries)
438+ then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ lockEntries)
449439 else throw("Strict value is not equal to itself.")
450440 }
451441 }
457447 func calcWithdrawShareTokens (i,caller,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
458448 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
459449 let user = toString(caller)
460- let $t02124521344 = claimCalc(pool, user)
461- let farmInterest = $t02124521344._1
462- let boostInterest = $t02124521344._2
463- let boostLPinterest = $t02124521344._3
464- let claimAmount = $t02124521344._4
465- let toTreasure = $t02124521344._5
450+ let $t01998620068 = claimCalc(pool, user)
451+ let farmInterest = $t01998620068._1
452+ let boostInterest = $t01998620068._2
453+ let claimAmount = $t01998620068._3
454+ let toTreasure = $t01998620068._4
466455 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
467456 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
468457 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
482471 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
483472 else 0
484473 if ((uplp == uplp))
485- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
474+ then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
486475 else throw("Strict value is not equal to itself.")
487476 }
488477 })
492481 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
493482 let user = toString(caller)
494483 let shareTokenLocked = getTotalShareToken(pool)
495- let $t02401024109 = claimCalc(pool, user)
496- let farmInterest = $t02401024109._1
497- let boostInterest = $t02401024109._2
498- let boostLPinterest = $t02401024109._3
499- let claimAmount = $t02401024109._4
500- let toTreasure = $t02401024109._5
484+ let $t02258122663 = claimCalc(pool, user)
485+ let farmInterest = $t02258122663._1
486+ let boostInterest = $t02258122663._2
487+ let claimAmount = $t02258122663._3
488+ let toTreasure = $t02258122663._4
501489 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
502- if ((availableFund == 0))
503- then throw("You have 0 available SWOP")
504- else if ((accountBalance(shareTokensId) > shareTokenLocked))
505- then throw("Balance of share-token is lower than totalAmount")
506- else {
507- let uTrans = if ((i.caller != this))
508- then [ScriptTransfer(i.caller, availableFund, SWOP)]
509- else nil
510- $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, (toTreasure + availableFund), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ uTrans), availableFund)
511- }
490+ if ((accountBalance(shareTokensId) > shareTokenLocked))
491+ then throw("Balance of share-token is lower than totalAmount")
492+ else {
493+ let uTrans = if ((i.caller != this))
494+ then [ScriptTransfer(i.caller, availableFund, SWOP)]
495+ else nil
496+ $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, (toTreasure + availableFund), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ uTrans), availableFund)
497+ }
512498 }
513499
514500
525511
526512
527513 @Callable(i)
528-func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kBoostLPLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
514+func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
529515
530516
531517
534520 then throw("Only Governance can call this function")
535521 else {
536522 let user = toString(addressFromPublicKey(adminInvokePubKey))
537- let $t02626426338 = claimCalc(pool, user)
538- let farmInterest = $t02626426338._1
539- let boostInterest = $t02626426338._2
540- let boostLPinterest = $t02626426338._3
541-[IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
523+ let $t02454024614 = claimCalc(pool, user)
524+ let farmInterest = $t02454024614._1
525+ let boostInterest = $t02454024614._2
526+ let boostLPinterest = $t02454024614._3
527+[IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height)]
542528 })
543529
544530
564550 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
565551 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
566552 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
567- let $t02782527877 = getLockParams(lockType)
568- let lockPeriod = $t02782527877._1
569- let lockCoef = $t02782527877._2
553+ let $t02603326085 = getLockParams(lockType)
554+ let lockPeriod = $t02603326085._1
555+ let lockCoef = $t02603326085._2
570556 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
571557 if ((getHeightFirstHarvest(pool) > height))
572558 then throw("You can't lock shareTokens till first harvest end.")
597583 let userStakedAmountNew = (userStakedAmount - lockAmount)
598584 let userLockedHeigtNew = (height + lockPeriod)
599585 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
600- let $t02916729266 = claimCalc(pool, user)
601- let farmInterest = $t02916729266._1
602- let boostInterest = $t02916729266._2
603- let boostLPinterest = $t02916729266._3
604- let claimAmount = $t02916729266._4
605- let toTreasure = $t02916729266._5
586+ let $t02737527457 = claimCalc(pool, user)
587+ let farmInterest = $t02737527457._1
588+ let boostInterest = $t02737527457._2
589+ let claimAmount = $t02737527457._3
590+ let toTreasure = $t02737527457._4
606591 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
607-[IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
592+[IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
608593 }
609594 })
610595
622607 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
623608 else {
624609 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
625- let $t03149631595 = claimCalc(pool, user)
626- let farmInterest = $t03149631595._1
627- let boostInterest = $t03149631595._2
628- let boostLPinterest = $t03149631595._3
629- let claimAmount = $t03149631595._4
630- let toTreasure = $t03149631595._5
610+ let $t02953429616 = claimCalc(pool, user)
611+ let farmInterest = $t02953429616._1
612+ let boostInterest = $t02953429616._2
613+ let claimAmount = $t02953429616._3
614+ let toTreasure = $t02953429616._4
631615 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
632-[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
616+[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
633617 }
634618 })
635619
646630
647631
648632 @Callable(i)
649-func claim (pool) = valueOrElse(isActive(), calcClaim(i, pool, i.caller))
633+func claim (pool) = valueOrElse(isActive(), {
634+ let r = calcClaim(i, pool, i.caller)
635+ if ((r._2 == 0))
636+ then throw("You have 0 available SWOP")
637+ else r
638+ })
650639
651640
652641
664653 else throw(($getType(@) + " couldn't be cast to Int"))
665654 }
666655 if ((claimAmount == claimAmount))
667- then {
668- let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
669- if ((stakeToGov == stakeToGov))
670- then nil
671- else throw("Strict value is not equal to itself.")
672- }
656+ then if ((claimAmount == 0))
657+ then throw("You have 0 available SWOP")
658+ else {
659+ let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
660+ if ((stakeToGov == stakeToGov))
661+ then nil
662+ else throw("Strict value is not equal to itself.")
663+ }
673664 else throw("Strict value is not equal to itself.")
674665 })
675666
754745 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
755746 then throw("Only voiting can call this function")
756747 else {
757- let $t03507735176 = claimCalc(pool, user)
758- let farmInterest = $t03507735176._1
759- let boostInterest = $t03507735176._2
760- let boostLPinterest = $t03507735176._3
761- let claimAmount = $t03507735176._4
762- let toTreasure = $t03507735176._5
748+ let $t03309033172 = claimCalc(pool, user)
749+ let farmInterest = $t03309033172._1
750+ let boostInterest = $t03309033172._2
751+ let claimAmount = $t03309033172._3
752+ let toTreasure = $t03309033172._4
763753 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
764-[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
754+[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
765755 })
766756
767757
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let kCause = "shutdown_cause"
99
1010 let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1111
1212 let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
1313
1414 let kHeightPoolFraction = "_pool_reward_update_height"
1515
1616 let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
1717
1818 let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
1919
2020 let kRewardUpdateHeight = "reward_update_height"
2121
2222 let kUserShareTokensStaked = "_share_tokens_locked"
2323
2424 let kUserShareTokensLocked = "_share_tokens_blocked"
2525
2626 let kUserShareTokensLockedType = "_share_tokens_blocked_type"
2727
2828 let kUserShareTokensLockedHeight = "_share_tokens_blocked_height"
2929
3030 let kUserShareTokensVirtual = "_share_tokens_virtual"
3131
3232 let kShareTotalShareTokens = "_total_share_tokens_locked"
3333
3434 let kShareTokensVirtual = "_total_share_tokens_virtual"
3535
3636 let kLockParams = "_lock_params"
3737
3838 let kLockWavesFee = "lock_waves_fee"
3939
4040 let kPoolBoostCoef = "_boost_coef"
4141
4242 let kFarmLastInterest = "_last_interest"
4343
4444 let kFarmUserLastInterest = "_last_interest"
4545
4646 let kBoostLastInterest = "_last_interest_b"
4747
4848 let kBoostUserLastInterest = "_last_interest_u_b"
49-
50-let kBoostLPLastInterest = "_last_interest_lpb"
51-
52-let kBoostLPUserLastInterest = "_last_interest_u_lpb"
5349
5450 let kLastInterestHeight = "_last_interest_height"
5551
5652 let kSWOPid = "SWOP_id"
5753
5854 let kAvailableSWOP = "_available_SWOP"
5955
6056 let kSwopYearEmission = "swop_year_emission"
6157
6258 let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
6359
6460 let kPoolVote = "_pool_vote_gSWOP"
6561
6662 let kUserPoolVote = "_user_vote_gSWOP"
6763
6864 let kPoolStruc = "_pool_struc"
6965
7066 let kUserPoolStruc = "_user_pool_struc"
7167
7268 let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
7369
7470 let kFirstHarvestHeight = "first_harvest_height"
7571
7672 let kShareLimitFH = "share_limit_on_first_harvest"
7773
7874 let kCpmmContract = "cpmm_contract"
7975
8076 let kAdminPubKey1 = "admin_pub_1"
8177
8278 let kAdminPubKey2 = "admin_pub_2"
8379
8480 let kAdminPubKey3 = "admin_pub_3"
8581
8682 let kAdminInvokePubKey = "admin_invoke_pub"
8783
8884 let kMoneyBoxAddress = "money_box_address"
8985
9086 let kVotingAddress = "voting_address"
9187
9288 let kGovAddress = "governance_address"
9389
9490 let kLPFarmingAddress = "lp_farming"
9591
9692 let kFarmingTreasureAddr = "farming_treasure"
9793
9894 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
9995
10096 let totalVoteShare = 10000000000
10197
10298 let scaleValue8 = 100000000
10399
104100 let lockBoostCoefScale = 1000
105101
106102 let defPoolBoostCoef = 500
107103
108104 func getBase58FromOracle (key) = match getString(oracle, key) {
109105 case string: String =>
110106 fromBase58String(string)
111107 case nothing =>
112108 throw((key + "is empty"))
113109 }
114110
115111
116112 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
117113
118114 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
119115
120116 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
121117
122118 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
123119
124120 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
125121
126122 let govAddress = Address(getBase58FromOracle(kGovAddress))
127123
128124 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
129125
130126 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
131127
132128 let farmingTreasureAddr = Address(getBase58FromOracle(kFarmingTreasureAddr))
133129
134130 let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
135131
136132 let active = getBooleanValue(this, kActive)
137133
138134 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
139135
140136 let SWOP = fromBase58String(getStringValue(this, kSWOPid))
141137
142138 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(Address(fromBase58String(pool)), kFirstHarvestHeight), 0)
143139
144140
145141 func getFHShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimitFH), ("No data on the key: " + kShareLimitFH))
146142
147143
148144 func getTotalShareToken (pool) = valueOrErrorMessage(getInteger(this, (pool + kShareTotalShareTokens)), (("No data on the key: " + pool) + kShareTotalShareTokens))
149145
150146
151147 func getPoolVoted (pool) = valueOrElse(getInteger(votingAddress, (pool + kPoolVote)), valueOrElse(parseInt(split(valueOrElse(getString(votingAddress, (pool + kPoolStruc)), ""), "_")[0]), 0))
152148
153149
154150 func getUserPoolVoted (pool,user) = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kUserPoolVote)), valueOrElse(parseInt(split(valueOrElse(getString(votingAddress, (((user + "_") + pool) + kUserPoolStruc)), ""), "_")[0]), 0))
155151
156152
157153 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
158154
159155
160156 func accountBalance (assetId) = match assetId {
161157 case id: ByteVector =>
162158 assetBalance(this, id)
163159 case waves: Unit =>
164160 wavesBalance(this).available
165161 case _ =>
166162 throw("Match error")
167163 }
168164
169165
170166 func calcScaleValue (assetId1,assetId2) = {
171167 let assetId1Decimals = value(assetInfo(assetId1)).decimals
172168 let assetId2Decimals = value(assetInfo(assetId2)).decimals
173169 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
174170 pow(10, 0, scaleDigits, 0, 0, DOWN)
175171 }
176172
177173
178174 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + kAvailableSWOP)), 0)
179175
180176
181177 func rewardInfo (pool) = {
182178 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockCurrent), ((("No data on the key: " + kTotalRewardPerBlockCurrent) + " at address ") + toString(govAddress)))
183179 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockPrevious), ((("No data on the key: " + kTotalRewardPerBlockPrevious) + " at address ") + toString(govAddress)))
184180 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + kRewardPoolFractionCurrent) + " at address ") + toString(govAddress)))
185181 let rewardUpdateHeight = valueOrErrorMessage(getInteger(govAddress, kRewardUpdateHeight), ((("No data on the key: " + kRewardUpdateHeight) + " at address ") + toString(govAddress)))
186182 let poolRewardUpdateHeight = valueOrElse(getInteger(govAddress, (pool + kHeightPoolFraction)), rewardUpdateHeight)
187183 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + kRewardPoolFractionPrevious) + " at address ") + toString(govAddress)))
188184 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
189185 let rewardPoolPrevious = fraction(totalRewardPerBlockCurrent, rewardPoolFractionPrevious, totalVoteShare)
190186 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
191187 then true
192188 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
193189 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
194190 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
195191 }
196192
197193
198194 func getLastInterestInfo (pool) = {
199195 let farmInterest = valueOrErrorMessage(getInteger(this, (pool + kFarmLastInterest)), (("No data on the key: " + pool) + kFarmLastInterest))
200196 let boostInterest = valueOrElse(getInteger(this, (pool + kBoostLastInterest)), 0)
201- let boostLPInterest = valueOrElse(getInteger(this, (pool + kBoostLPLastInterest)), 0)
202197 let lastInterestHeight = valueOrElse(getInteger(this, (pool + kLastInterestHeight)), height)
203- $Tuple4(lastInterestHeight, farmInterest, boostInterest, boostLPInterest)
198+ $Tuple3(lastInterestHeight, farmInterest, boostInterest)
204199 }
205200
206201
207202 func calcFarmRwd (pool,curTotalReward) = {
208203 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
209204 fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + lockBoostCoefScale))
210205 }
211206
212207
213208 func calcBoostRwd (pool,curTotalReward) = {
214209 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
215210 fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + lockBoostCoefScale))
216211 }
217212
218213
219-func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
220- then $Tuple3(farmInterest, boostInterest, boostLpInterest)
221- else {
222- let $t0991411327 = if (if (if ((rewardUpdateHeight > height))
214+func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = {
215+ let $t0938310556 = if (if (if ((rewardUpdateHeight > height))
216+ then (rewardUpdateHeight == poolRewardUpdateHeight)
217+ else false)
218+ then true
219+ else if ((height > rewardUpdateHeight))
220+ then (rewardUpdateHeight != poolRewardUpdateHeight)
221+ else false)
222+ then {
223+ let r = (previousRewardPerBlock * (height - lastInterestHeight))
224+ $Tuple3(r, farmInterest, boostInterest)
225+ }
226+ else if (if (if ((height > rewardUpdateHeight))
223227 then (rewardUpdateHeight == poolRewardUpdateHeight)
224228 else false)
225- then true
226- else if ((height > rewardUpdateHeight))
227- then (rewardUpdateHeight != poolRewardUpdateHeight)
228- else false)
229+ then (lastInterestHeight > rewardUpdateHeight)
230+ else false)
229231 then {
230- let r = (previousRewardPerBlock * (height - lastInterestHeight))
231- $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
232+ let r = (currentRewardPerBlock * (height - lastInterestHeight))
233+ $Tuple3(r, farmInterest, boostInterest)
232234 }
233- else if (if (if ((height > rewardUpdateHeight))
234- then (rewardUpdateHeight == poolRewardUpdateHeight)
235- else false)
236- then (lastInterestHeight > rewardUpdateHeight)
237- else false)
238- then {
239- let r = (currentRewardPerBlock * (height - lastInterestHeight))
240- $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
241- }
242- else {
243- let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
244- let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
245- let bBfrUp = (boostInterest + (if ((poolVoted > 0))
246- then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
247- else 0))
248- let bLPBfrUp = (boostLpInterest + (if ((poolVoted > 0))
249- then fraction(fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
250- else 0))
251- let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
252- $Tuple4(rwd, fBfrUp, bBfrUp, bLPBfrUp)
253- }
254- let reward = $t0991411327._1
255- let farmIntrBefore = $t0991411327._2
256- let boostIntrBefore = $t0991411327._3
257- let boostLPIntrBefore = $t0991411327._4
258- let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
259- let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
260- then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
261- else 0))
262- let newBoostLPInterest = (boostLPIntrBefore + (if ((poolVoted > 0))
263- then fraction(fraction(calcBoostRwd(pool, reward), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
264- else 0))
265- $Tuple3(newFarmInterest, newBoostInterest, newBoostLPInterest)
266- }
235+ else {
236+ let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
237+ let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
238+ let bBfrUp = (boostInterest + (if ((poolVoted > 0))
239+ then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
240+ else 0))
241+ let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
242+ $Tuple3(rwd, fBfrUp, bBfrUp)
243+ }
244+ let reward = $t0938310556._1
245+ let farmIntrBefore = $t0938310556._2
246+ let boostIntrBefore = $t0938310556._3
247+ let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
248+ let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
249+ then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
250+ else 0))
251+ $Tuple3(newFarmInterest, newBoostInterest, reward)
252+ }
267253
268254
269255 func claimCalc (pool,user) = {
270256 let scaleValue = calcScaleValue(SWOP, getShareAssetId(pool))
271257 let poolVoted = getPoolVoted(pool)
272258 let uPoolVoted = getUserPoolVoted(pool, user)
273259 let shareToken = getTotalShareToken(pool)
274260 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
275- let $t01227612374 = getLastInterestInfo(pool)
276- let lastInterestHeight = $t01227612374._1
277- let farmInterest = $t01227612374._2
278- let boostInterest = $t01227612374._3
279- let boostLPInterest = $t01227612374._4
280- let $t01237912493 = rewardInfo(pool)
281- let currentRewardPerBlock = $t01237912493._1
282- let rewardUpdateHeight = $t01237912493._2
283- let previousRewardPerBlock = $t01237912493._3
284- let poolRewardUpdateHeight = $t01237912493._4
261+ let $t01131411395 = getLastInterestInfo(pool)
262+ let lastInterestHeight = $t01131411395._1
263+ let farmInterest = $t01131411395._2
264+ let boostInterest = $t01131411395._3
265+ let $t01140011514 = rewardInfo(pool)
266+ let currentRewardPerBlock = $t01140011514._1
267+ let rewardUpdateHeight = $t01140011514._2
268+ let previousRewardPerBlock = $t01140011514._3
269+ let poolRewardUpdateHeight = $t01140011514._4
285270 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
286271 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
287- let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
288272 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
289273 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
290- let $t01306113454 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
291- let newFarmInterest = $t01306113454._1
292- let newBoostInterest = $t01306113454._2
293- let newBoostLPInterest = $t01306113454._3
294- let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
295- let claimBoostingMax = if ((uPoolVoted == 0))
296- then (claimFarming / 2)
297- else fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
298- let mul = fraction(toBigInt(uShareTokensVirt), toBigInt(uPoolVoted), toBigInt(1))
299- let claimBoosting = toInt(fraction(fraction(mul, toBigInt((newBoostLPInterest - uBoostLPInterest)), toBigInt(scaleValue8)), toBigInt(1), toBigInt(scaleValue8)))
300- let toTreasury = (claimBoostingMax - claimBoosting)
301- if ((0 > toTreasury))
302- then throw("toTreasury < 0")
303- else $Tuple5(newFarmInterest, newBoostInterest, newBoostLPInterest, (claimFarming + claimBoosting), toTreasury)
274+ if ((totalShareVirtual == 0))
275+ then {
276+ let toTreasury = if ((farmInterest == 0))
277+ then (currentRewardPerBlock * (height - lastInterestHeight))
278+ else 0
279+ $Tuple4(farmInterest, boostInterest, 0, toTreasury)
280+ }
281+ else {
282+ let $t01217512535 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
283+ let newFarmInterest = $t01217512535._1
284+ let newBoostInterest = $t01217512535._2
285+ let fullReward = $t01217512535._3
286+ let farmRwd = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
287+ let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
288+ let boostRwdMax = fraction(farmRwd, poolBoostCoef, lockBoostCoefScale)
289+ let curBoostRwd = fraction((newBoostInterest - uBoostInterest), uPoolVoted, scaleValue8)
290+ let boostRwd = min([boostRwdMax, curBoostRwd])
291+ let toTreasury = (boostRwdMax - boostRwd)
292+ if ((0 > toTreasury))
293+ then throw("toTreasury < 0")
294+ else $Tuple4(newFarmInterest, newBoostInterest, (farmRwd + boostRwd), toTreasury)
295+ }
304296 }
305297
306298
307299 func availableClaimCalcAllByUser (pools,user) = {
308300 func calcAvailable (acc,pool) = {
309- let $t01436514394 = acc
310- let newPools = $t01436514394._1
311- let amounts = $t01436514394._2
312- let $t01440314462 = claimCalc(pool, user)
313- let fi = $t01440314462._1
314- let bi = $t01440314462._2
315- let blpi = $t01440314462._3
316- let claimAmount = $t01440314462._4
317- let tt = $t01440314462._5
301+ let $t01328213311 = acc
302+ let newPools = $t01328213311._1
303+ let amounts = $t01328213311._2
304+ let $t01332013373 = claimCalc(pool, user)
305+ let fi = $t01332013373._1
306+ let bi = $t01332013373._2
307+ let claimAmount = $t01332013373._3
308+ let tt = $t01332013373._4
318309 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
319310 $Tuple2((newPools :+ pool), (amounts :+ availableFund))
320311 }
321312
322313 let $l = pools
323314 let $s = size($l)
324315 let $acc0 = $Tuple2(nil, nil)
325316 func $f0_1 ($a,$i) = if (($i >= $s))
326317 then $a
327318 else calcAvailable($a, $l[$i])
328319
329320 func $f0_2 ($a,$i) = if (($i >= $s))
330321 then $a
331322 else throw("List size exceeds 60")
332323
333324 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
334325 }
335326
336327
337328 func canLockInFirstHarvest (pool,user,userShareTokensStaked,pmtAmount,lockType) = if ((getHeightFirstHarvest(pool) > height))
338329 then {
339330 let totalVoteAmount = valueOrElse(getInteger(votingAddress, (pool + kHarvestPoolVote)), 0)
340331 let userVoteAmount = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kHarvestUserPoolVote)), 0)
341332 let FHShareTokenLimit = getFHShareLimitToken(addressFromStringValue(pool))
342333 let FHShareTokenUserLimit = (fraction(FHShareTokenLimit, userVoteAmount, totalVoteAmount) - userShareTokensStaked)
343334 if ((lockType > 0))
344335 then throw("You can't lock shareTokens till first harvest end.")
345336 else if ((userVoteAmount == 0))
346337 then 0
347338 else if ((pmtAmount >= FHShareTokenUserLimit))
348339 then (pmtAmount - FHShareTokenUserLimit)
349340 else 0
350341 }
351342 else 0
352343
353344
354345 func getLockParams (type) = {
355346 let lockParams = split(valueOrErrorMessage(getString(this, (toString(type) + kLockParams)), ("There are no key for lock type" + toString(type))), "_")
356347 $Tuple2(parseIntValue(lockParams[0]), parseIntValue(lockParams[1]))
357348 }
358349
359350
360351 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
361352
362353
363354 func isActive () = if (if (active)
364355 then activeGlob
365356 else false)
366357 then unit
367358 else throw("DApp is inactive at this moment")
368359
369360
370361 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
371362 then unit
372363 else throw("Only admin can call this function")
373364
374365
375366 func isPoolCall (i,pool) = if (if ((toString(i.caller) == pool))
376367 then true
377368 else (i.caller == cpmmContract))
378369 then unit
379370 else throw("Only pool can call this function")
380371
381372
382373 func isSelfCall (i) = if ((i.caller == this))
383374 then unit
384375 else throw("Only contract itself can call this function")
385376
386377
387378 func calcLockShareTokens (i,caller,pool,lockType) = {
388379 let shareAssetId = getShareAssetId(pool)
389380 let user = toString(caller)
390381 let totalShare = getTotalShareToken(pool)
391382 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
392383 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
393384 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
394385 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
395386 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
396387 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
397- let $t01726317315 = getLockParams(lockType)
398- let lockPeriod = $t01726317315._1
399- let lockCoef = $t01726317315._2
388+ let $t01617416226 = getLockParams(lockType)
389+ let lockPeriod = $t01617416226._1
390+ let lockCoef = $t01617416226._2
400391 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
401392 if ((i.payments[0].assetId != shareAssetId))
402393 then throw("Wrong sharetoken in payment")
403394 else if ((0 >= i.payments[0].amount))
404395 then throw("Payment amount must be greater than 0")
405396 else if ((0 > lockType))
406397 then throw("lockType must be >= 0")
407398 else {
408399 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
409400 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
410401 then {
411- let $t01774219676 = if ((lockType == 0))
402+ let $t01665318587 = if ((lockType == 0))
412403 then {
413404 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
414405 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(caller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
415406 }
416407 else if (if ((userLockedHeigt == 0))
417408 then if (if ((2 > size(i.payments)))
418409 then true
419410 else (i.payments[1].assetId != unit))
420411 then true
421412 else (lockWavesFee > i.payments[1].amount)
422413 else false)
423414 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
424415 else if ((userLockedHeigt > (height + lockPeriod)))
425416 then throw("You cannot lock sharetokens for a period less than what you have already locked")
426417 else {
427418 let userLockedAmountNew = (userLockedAmount + i.payments[0].amount)
428419 let userLockedHeigtNew = (height + lockPeriod)
429420 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
430421 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew))], (totalShare + i.payments[0].amount))
431422 }
432- let lockEntries = $t01774219676._1
433- let totalShareNew = $t01774219676._2
423+ let lockEntries = $t01665318587._1
424+ let totalShareNew = $t01665318587._2
434425 if ((accountBalance(shareAssetId) > totalShareNew))
435426 then throw("Balance of share-token is lower than totalAmount")
436427 else {
437- let $t01980119900 = claimCalc(pool, user)
438- let farmInterest = $t01980119900._1
439- let boostInterest = $t01980119900._2
440- let boostLPinterest = $t01980119900._3
441- let claimAmount = $t01980119900._4
442- let toTreasure = $t01980119900._5
428+ let $t01871218794 = claimCalc(pool, user)
429+ let farmInterest = $t01871218794._1
430+ let boostInterest = $t01871218794._2
431+ let claimAmount = $t01871218794._3
432+ let toTreasure = $t01871218794._4
443433 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
444434 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
445435 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, totalUserShareTokens], nil)
446436 else 0
447437 if ((uplp == uplp))
448- then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ lockEntries)
438+ then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ lockEntries)
449439 else throw("Strict value is not equal to itself.")
450440 }
451441 }
452442 else throw("Strict value is not equal to itself.")
453443 }
454444 }
455445
456446
457447 func calcWithdrawShareTokens (i,caller,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
458448 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
459449 let user = toString(caller)
460- let $t02124521344 = claimCalc(pool, user)
461- let farmInterest = $t02124521344._1
462- let boostInterest = $t02124521344._2
463- let boostLPinterest = $t02124521344._3
464- let claimAmount = $t02124521344._4
465- let toTreasure = $t02124521344._5
450+ let $t01998620068 = claimCalc(pool, user)
451+ let farmInterest = $t01998620068._1
452+ let boostInterest = $t01998620068._2
453+ let claimAmount = $t01998620068._3
454+ let toTreasure = $t01998620068._4
466455 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
467456 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
468457 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
469458 let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
470459 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
471460 let totalShareAmount = getTotalShareToken(pool)
472461 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
473462 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
474463 let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
475464 let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
476465 if ((shareTokensWithdrawAmount > userStakedAmount))
477466 then throw("Withdraw amount more then user locked amount")
478467 else if ((accountBalance(shareTokensId) > totalShareAmount))
479468 then throw("Balance of share-token is lower than totalAmount")
480469 else {
481470 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
482471 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
483472 else 0
484473 if ((uplp == uplp))
485- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
474+ then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
486475 else throw("Strict value is not equal to itself.")
487476 }
488477 })
489478
490479
491480 func calcClaim (i,pool,caller) = {
492481 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
493482 let user = toString(caller)
494483 let shareTokenLocked = getTotalShareToken(pool)
495- let $t02401024109 = claimCalc(pool, user)
496- let farmInterest = $t02401024109._1
497- let boostInterest = $t02401024109._2
498- let boostLPinterest = $t02401024109._3
499- let claimAmount = $t02401024109._4
500- let toTreasure = $t02401024109._5
484+ let $t02258122663 = claimCalc(pool, user)
485+ let farmInterest = $t02258122663._1
486+ let boostInterest = $t02258122663._2
487+ let claimAmount = $t02258122663._3
488+ let toTreasure = $t02258122663._4
501489 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
502- if ((availableFund == 0))
503- then throw("You have 0 available SWOP")
504- else if ((accountBalance(shareTokensId) > shareTokenLocked))
505- then throw("Balance of share-token is lower than totalAmount")
506- else {
507- let uTrans = if ((i.caller != this))
508- then [ScriptTransfer(i.caller, availableFund, SWOP)]
509- else nil
510- $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, (toTreasure + availableFund), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ uTrans), availableFund)
511- }
490+ if ((accountBalance(shareTokensId) > shareTokenLocked))
491+ then throw("Balance of share-token is lower than totalAmount")
492+ else {
493+ let uTrans = if ((i.caller != this))
494+ then [ScriptTransfer(i.caller, availableFund, SWOP)]
495+ else nil
496+ $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, (toTreasure + availableFund), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ uTrans), availableFund)
497+ }
512498 }
513499
514500
515501 @Callable(i)
516502 func init (earlyLP) = if (isDefined(getString(this, kSWOPid)))
517503 then throw("SWOP already initialized")
518504 else {
519505 let initAmount = 100000000000000
520506 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
521507 let SWOPid = calculateAssetId(SWOPissue)
522508 [BooleanEntry(kActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(kSWOPid, toBase58String(SWOPid))]
523509 }
524510
525511
526512
527513 @Callable(i)
528-func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kBoostLPLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
514+func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
529515
530516
531517
532518 @Callable(i)
533519 func updatePoolInterest (pool) = valueOrElse(isActive(), if ((i.caller != govAddress))
534520 then throw("Only Governance can call this function")
535521 else {
536522 let user = toString(addressFromPublicKey(adminInvokePubKey))
537- let $t02626426338 = claimCalc(pool, user)
538- let farmInterest = $t02626426338._1
539- let boostInterest = $t02626426338._2
540- let boostLPinterest = $t02626426338._3
541-[IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
523+ let $t02454024614 = claimCalc(pool, user)
524+ let farmInterest = $t02454024614._1
525+ let boostInterest = $t02454024614._2
526+ let boostLPinterest = $t02454024614._3
527+[IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height)]
542528 })
543529
544530
545531
546532 @Callable(i)
547533 func lockShareTokens (pool,lockType) = valueOrElse(isActive(), calcLockShareTokens(i, i.caller, pool, lockType))
548534
549535
550536
551537 @Callable(i)
552538 func lockShareTokensFromPool (callerBytes,pool,lockType) = valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcLockShareTokens(i, Address(callerBytes), pool, lockType)))
553539
554540
555541
556542 @Callable(i)
557543 func lockStakedShareTokens (pool,lockType,lockAmount) = valueOrElse(isActive(), {
558544 let shareAssetId = getShareAssetId(pool)
559545 let user = toString(i.caller)
560546 let totalShare = getTotalShareToken(pool)
561547 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
562548 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
563549 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
564550 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
565551 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
566552 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
567- let $t02782527877 = getLockParams(lockType)
568- let lockPeriod = $t02782527877._1
569- let lockCoef = $t02782527877._2
553+ let $t02603326085 = getLockParams(lockType)
554+ let lockPeriod = $t02603326085._1
555+ let lockCoef = $t02603326085._2
570556 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
571557 if ((getHeightFirstHarvest(pool) > height))
572558 then throw("You can't lock shareTokens till first harvest end.")
573559 else if ((0 >= lockType))
574560 then throw("lockType must be > 0")
575561 else if ((lockAmount > userStakedAmount))
576562 then throw(("You can't lock more than " + toString(userStakedAmount)))
577563 else if ((accountBalance(shareAssetId) > totalShare))
578564 then throw("Balance of share-token is lower than totalAmount")
579565 else if (if ((userLockedHeigt == 0))
580566 then if (if ((1 > size(i.payments)))
581567 then true
582568 else (i.payments[0].assetId != unit))
583569 then true
584570 else (lockWavesFee > i.payments[0].amount)
585571 else false)
586572 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
587573 else if (if ((userLockedHeigt == 0))
588574 then (0 >= lockAmount)
589575 else false)
590576 then throw("lockAmount must be greater than 0")
591577 else if ((0 > lockAmount))
592578 then throw("lockAmount must be positive")
593579 else if ((userLockedHeigt > (height + lockPeriod)))
594580 then throw("You cannot lock sharetokens for a period less than what you have already locked")
595581 else {
596582 let userLockedAmountNew = (userLockedAmount + lockAmount)
597583 let userStakedAmountNew = (userStakedAmount - lockAmount)
598584 let userLockedHeigtNew = (height + lockPeriod)
599585 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
600- let $t02916729266 = claimCalc(pool, user)
601- let farmInterest = $t02916729266._1
602- let boostInterest = $t02916729266._2
603- let boostLPinterest = $t02916729266._3
604- let claimAmount = $t02916729266._4
605- let toTreasure = $t02916729266._5
586+ let $t02737527457 = claimCalc(pool, user)
587+ let farmInterest = $t02737527457._1
588+ let boostInterest = $t02737527457._2
589+ let claimAmount = $t02737527457._3
590+ let toTreasure = $t02737527457._4
606591 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
607-[IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
592+[IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
608593 }
609594 })
610595
611596
612597
613598 @Callable(i)
614599 func unlockUserLock (pool,user) = valueOrElse(isActive(), {
615600 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
616601 let userLockedHeigt = valueOrErrorMessage(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), (((("There is no pool " + pool) + " or user ") + user) + "with lock"))
617602 let totalShareVirtual = getIntegerValue(this, (pool + kShareTokensVirtual))
618603 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
619604 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
620605 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
621606 if ((userLockedHeigt > height))
622607 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
623608 else {
624609 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
625- let $t03149631595 = claimCalc(pool, user)
626- let farmInterest = $t03149631595._1
627- let boostInterest = $t03149631595._2
628- let boostLPinterest = $t03149631595._3
629- let claimAmount = $t03149631595._4
630- let toTreasure = $t03149631595._5
610+ let $t02953429616 = claimCalc(pool, user)
611+ let farmInterest = $t02953429616._1
612+ let boostInterest = $t02953429616._2
613+ let claimAmount = $t02953429616._3
614+ let toTreasure = $t02953429616._4
631615 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
632-[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
616+[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
633617 }
634618 })
635619
636620
637621
638622 @Callable(i)
639623 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), calcWithdrawShareTokens(i, i.caller, pool, shareTokensWithdrawAmount))
640624
641625
642626
643627 @Callable(i)
644628 func withdrawShareTokensFromPool (callerBytes,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcWithdrawShareTokens(i, Address(callerBytes), pool, shareTokensWithdrawAmount)))
645629
646630
647631
648632 @Callable(i)
649-func claim (pool) = valueOrElse(isActive(), calcClaim(i, pool, i.caller))
633+func claim (pool) = valueOrElse(isActive(), {
634+ let r = calcClaim(i, pool, i.caller)
635+ if ((r._2 == 0))
636+ then throw("You have 0 available SWOP")
637+ else r
638+ })
650639
651640
652641
653642 @Callable(i)
654643 func claimInternal (pool,caller) = valueOrElse(isActive(), valueOrElse(isSelfCall(i), calcClaim(i, pool, Address(caller))))
655644
656645
657646
658647 @Callable(i)
659648 func claimAndStake (pool) = valueOrElse(isActive(), {
660649 let claimAmount = {
661650 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
662651 if ($isInstanceOf(@, "Int"))
663652 then @
664653 else throw(($getType(@) + " couldn't be cast to Int"))
665654 }
666655 if ((claimAmount == claimAmount))
667- then {
668- let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
669- if ((stakeToGov == stakeToGov))
670- then nil
671- else throw("Strict value is not equal to itself.")
672- }
656+ then if ((claimAmount == 0))
657+ then throw("You have 0 available SWOP")
658+ else {
659+ let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
660+ if ((stakeToGov == stakeToGov))
661+ then nil
662+ else throw("Strict value is not equal to itself.")
663+ }
673664 else throw("Strict value is not equal to itself.")
674665 })
675666
676667
677668
678669 @Callable(i)
679670 func claimAll (pools) = valueOrElse(isActive(), {
680671 func claimInv (claimTotal,pool) = {
681672 let claimAmount = {
682673 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
683674 if ($isInstanceOf(@, "Int"))
684675 then @
685676 else throw(($getType(@) + " couldn't be cast to Int"))
686677 }
687678 if ((claimAmount == claimAmount))
688679 then (claimTotal + claimAmount)
689680 else throw("Strict value is not equal to itself.")
690681 }
691682
692683 let claimTotal = {
693684 let $l = pools
694685 let $s = size($l)
695686 let $acc0 = 0
696687 func $f0_1 ($a,$i) = if (($i >= $s))
697688 then $a
698689 else claimInv($a, $l[$i])
699690
700691 func $f0_2 ($a,$i) = if (($i >= $s))
701692 then $a
702693 else throw("List size exceeds 60")
703694
704695 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
705696 }
706697 if ((claimTotal == 0))
707698 then throw("You have 0 available SWOP")
708699 else [ScriptTransfer(i.caller, claimTotal, SWOP)]
709700 })
710701
711702
712703
713704 @Callable(i)
714705 func claimAllAndStake (pools) = valueOrElse(isActive(), {
715706 func claimInv (claimTotal,pool) = {
716707 let claimAmount = {
717708 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
718709 if ($isInstanceOf(@, "Int"))
719710 then @
720711 else throw(($getType(@) + " couldn't be cast to Int"))
721712 }
722713 if ((claimAmount == claimAmount))
723714 then (claimTotal + claimAmount)
724715 else throw("Strict value is not equal to itself.")
725716 }
726717
727718 let claimTotal = {
728719 let $l = pools
729720 let $s = size($l)
730721 let $acc0 = 0
731722 func $f0_1 ($a,$i) = if (($i >= $s))
732723 then $a
733724 else claimInv($a, $l[$i])
734725
735726 func $f0_2 ($a,$i) = if (($i >= $s))
736727 then $a
737728 else throw("List size exceeds 60")
738729
739730 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
740731 }
741732 if ((claimTotal == 0))
742733 then throw("You have 0 available SWOP")
743734 else {
744735 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimTotal)])
745736 if ((stakeToGov == stakeToGov))
746737 then nil
747738 else throw("Strict value is not equal to itself.")
748739 }
749740 })
750741
751742
752743
753744 @Callable(i)
754745 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
755746 then throw("Only voiting can call this function")
756747 else {
757- let $t03507735176 = claimCalc(pool, user)
758- let farmInterest = $t03507735176._1
759- let boostInterest = $t03507735176._2
760- let boostLPinterest = $t03507735176._3
761- let claimAmount = $t03507735176._4
762- let toTreasure = $t03507735176._5
748+ let $t03309033172 = claimCalc(pool, user)
749+ let farmInterest = $t03309033172._1
750+ let boostInterest = $t03309033172._2
751+ let claimAmount = $t03309033172._3
752+ let toTreasure = $t03309033172._4
763753 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
764-[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
754+[IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
765755 })
766756
767757
768758
769759 @Callable(i)
770760 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
771761 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
772762 else suspend("Paused by admin"))
773763
774764
775765
776766 @Callable(i)
777767 func activate () = valueOrElse(isAdminCall(i), if (active)
778768 then throw("DApp is already active")
779769 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
780770
781771
782772 @Verifier(tx)
783773 func verify () = match tx {
784774 case _ =>
785775 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
786776 then 1
787777 else 0
788778 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
789779 then 1
790780 else 0
791781 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
792782 then 1
793783 else 0
794784 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
795785 }
796786

github/deemru/w8io/873ac7e 
143.73 ms