tx · HFj7WY5TbqkKppuH2wcPKHvFRghpt8qjZtGs6qr2aBTs

3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK:  -0.14000000 Waves

2022.10.31 13:03 [2296447] smart account 3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK > SELF 0.00000000 Waves

{ "type": 13, "id": "HFj7WY5TbqkKppuH2wcPKHvFRghpt8qjZtGs6qr2aBTs", "fee": 14000000, "feeAssetId": null, "timestamp": 1667210623530, "version": 2, "chainId": 84, "sender": "3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK", "senderPublicKey": "FFdBua5rzzMkZebvsvmN7sAdU7XhFK8QNJ3hiwwxAYRA", "proofs": [ "4dgX6jNRDvhw9HPBV9mipuzSp4EVKKasi8xNonURTWGy2viX7ydhQiuEswfyi87KVGQ3WryK9GK7hdd4cuLXLdAo", "5YVGyetjgetY53h3CU1CgtKKHvuk5iwD1oq2GXajAJsAMHFsVJphg4R5WxSqsRzKw3VkYV9VzS1zNZcsQF5eDJuk" ], "script": "base64:BgJICAISAwoBCBIDCgEIEgMKAQgSBAoCCAESBQoDCAEBEgQKAggIEgQKAggBEgMKAQgSAwoBCBIDCgEYEgMKARgSBAoCCAgSABIAXAAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UAGmtSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50Ah1fY3VycmVudF9wb29sX2ZyYWN0aW9uX3Jld2FyZAAba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzAh5fcHJldmlvdXNfcG9vbF9mcmFjdGlvbl9yZXdhcmQAE2tIZWlnaHRQb29sRnJhY3Rpb24CGl9wb29sX3Jld2FyZF91cGRhdGVfaGVpZ2h0ABtrVG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQCHnRvdGFsX3Jld2FyZF9wZXJfYmxvY2tfY3VycmVudAAca1RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIfdG90YWxfcmV3YXJkX3Blcl9ibG9ja19wcmV2aW91cwATa1Jld2FyZFVwZGF0ZUhlaWdodAIUcmV3YXJkX3VwZGF0ZV9oZWlnaHQAFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQCFF9zaGFyZV90b2tlbnNfbG9ja2VkABZrVXNlclNoYXJlVG9rZW5zTG9ja2VkAhVfc2hhcmVfdG9rZW5zX2Jsb2NrZWQAGmtVc2VyU2hhcmVUb2tlbnNMb2NrZWRUeXBlAhpfc2hhcmVfdG9rZW5zX2Jsb2NrZWRfdHlwZQAca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAIcX3NoYXJlX3Rva2Vuc19ibG9ja2VkX2hlaWdodAAXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwCFV9zaGFyZV90b2tlbnNfdmlydHVhbAAWa1NoYXJlVG90YWxTaGFyZVRva2VucwIaX3RvdGFsX3NoYXJlX3Rva2Vuc19sb2NrZWQAE2tTaGFyZVRva2Vuc1ZpcnR1YWwCG190b3RhbF9zaGFyZV90b2tlbnNfdmlydHVhbAALa0xvY2tQYXJhbXMCDF9sb2NrX3BhcmFtcwANa0xvY2tXYXZlc0ZlZQIObG9ja193YXZlc19mZWUADmtQb29sQm9vc3RDb2VmAgtfYm9vc3RfY29lZgARa0Zhcm1MYXN0SW50ZXJlc3QCDl9sYXN0X2ludGVyZXN0ABVrRmFybVVzZXJMYXN0SW50ZXJlc3QCDl9sYXN0X2ludGVyZXN0ABJrQm9vc3RMYXN0SW50ZXJlc3QCEF9sYXN0X2ludGVyZXN0X2IAFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QCEl9sYXN0X2ludGVyZXN0X3VfYgAUa0Jvb3N0TFBMYXN0SW50ZXJlc3QCEl9sYXN0X2ludGVyZXN0X2xwYgAYa0Jvb3N0TFBVc2VyTGFzdEludGVyZXN0AhRfbGFzdF9pbnRlcmVzdF91X2xwYgATa0xhc3RJbnRlcmVzdEhlaWdodAIVX2xhc3RfaW50ZXJlc3RfaGVpZ2h0AAdrU1dPUGlkAgdTV09QX2lkAA5rQXZhaWxhYmxlU1dPUAIPX2F2YWlsYWJsZV9TV09QABFrU3dvcFllYXJFbWlzc2lvbgISc3dvcF95ZWFyX2VtaXNzaW9uABBrSGFydmVzdFBvb2xWb3RlAhhfaGFydmVzdF9wb29sX3ZvdGVfZ1NXT1AACWtQb29sVm90ZQIQX3Bvb2xfdm90ZV9nU1dPUAANa1VzZXJQb29sVm90ZQIQX3VzZXJfdm90ZV9nU1dPUAAUa0hhcnZlc3RVc2VyUG9vbFZvdGUCHV9oYXJ2ZXN0X3VzZXJfcG9vbF92b3RlX2dTV09QAAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAANa1NoYXJlTGltaXRGSAIcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzABFrTFBGYXJtaW5nQWRkcmVzcwIKbHBfZmFybWluZwAUa0Zhcm1pbmdUcmVhc3VyZUFkZHICEGZhcm1pbmdfdHJlYXN1cmUABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAOdG90YWxWb3RlU2hhcmUAgMivoCUAC3NjYWxlVmFsdWU4AIDC1y8AEmxvY2tCb29zdENvZWZTY2FsZQDoBwAQZGVmUG9vbEJvb3N0Q29lZgD0AwETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwAPbW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUQa01vbmV5Qm94QWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEWFkbWluSW52b2tlUHViS2V5CQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEmtBZG1pbkludm9rZVB1YktleQAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzABNmYXJtaW5nVHJlYXN1cmVBZGRyCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUUa0Zhcm1pbmdUcmVhc3VyZUFkZHIACmJhc2VQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQtrQmFzZVBlcmlvZAIRRW1wdHkga0Jhc2VQZXJpb2QAC3N0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUMa1N0YXJ0SGVpZ2h0AhJFbXB0eSBrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFDWtQZXJpb2RMZW5ndGgCE0VtcHR5IGtQZXJpb2RMZW5ndGgACmN1cnJQZXJpb2QJAGQCBQpiYXNlUGVyaW9kCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQULa0FjdGl2ZUdsb2IGABBTd29wWWVhckVtaXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU3dvcFllYXJFbWlzc2lvbgAEU1dPUAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQdrU1dPUGlkARVnZXRIZWlnaHRGaXJzdEhhcnZlc3QBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFE2tGaXJzdEhhcnZlc3RIZWlnaHQAAAEUZ2V0RkhTaGFyZUxpbWl0VG9rZW4BBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQRwb29sBQ1rU2hhcmVMaW1pdEZICQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQ1rU2hhcmVMaW1pdEZIARJnZXRUb3RhbFNoYXJlVG9rZW4BBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwEMZ2V0UG9vbFZvdGVkAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgUEcG9vbAUJa1Bvb2xWb3RlAAABEGdldFVzZXJQb29sVm90ZWQCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ12b3RpbmdBZGRyZXNzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQRwb29sBQlrUG9vbFZvdGUAAAEPZ2V0U2hhcmVBc3NldElkAQRwb29sCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQxnZXRBc3NldEluZm8BB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAECHN0cmluZ0lkCQDYBAEFAmlkBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAJAJUKAwIFV0FWRVMCBVdBVkVTAAgJAAIBAgtNYXRjaCBlcnJvcgEOY2FsY1NjYWxlVmFsdWUCCGFzc2V0SWQxCGFzc2V0SWQyBBBhc3NldElkMURlY2ltYWxzCAkBBXZhbHVlAQkA7AcBBQhhc3NldElkMQhkZWNpbWFscwQQYXNzZXRJZDJEZWNpbWFscwgJAQV2YWx1ZQEJAOwHAQUIYXNzZXRJZDIIZGVjaW1hbHMEC3NjYWxlRGlnaXRzCQBkAgkAZQIFEGFzc2V0SWQyRGVjaW1hbHMFEGFzc2V0SWQxRGVjaW1hbHMACAkAbAYACgAABQtzY2FsZURpZ2l0cwAAAAAFBERPV04BEXVzZXJBdmFpbGFibGVTV09QAgRwb29sBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AAAAEKcmV3YXJkSW5mbwEEcG9vbAQadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzBRtrVG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBRtrVG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQCDCBhdCBhZGRyZXNzIAkApQgBBQpnb3ZBZGRyZXNzBBt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzBRxrVG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUca1RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEGXJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFGmtSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQCsAgIJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRprUmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEEnJld2FyZFVwZGF0ZUhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MFE2tSZXdhcmRVcGRhdGVIZWlnaHQJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBRNrUmV3YXJkVXBkYXRlSGVpZ2h0AgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFE2tIZWlnaHRQb29sRnJhY3Rpb24FEnJld2FyZFVwZGF0ZUhlaWdodAQacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFG2tSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkArAICCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzAgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQRcmV3YXJkUG9vbEN1cnJlbnQJAGsDBRp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUOdG90YWxWb3RlU2hhcmUEEnJld2FyZFBvb2xQcmV2aW91cwkAawMFGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50BRpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwUOdG90YWxWb3RlU2hhcmUDAwkAZgIFEXJld2FyZFBvb2xDdXJyZW50BRp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAYJAGYCBRJyZXdhcmRQb29sUHJldmlvdXMFG3RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkAAgECYnJld2FyZFBvb2xDdXJyZW50ID4gdG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQgb3IgcmV3YXJkUG9vbFByZXZpb3VzID4gdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQCWCgQFEXJld2FyZFBvb2xDdXJyZW50BRJyZXdhcmRVcGRhdGVIZWlnaHQFEnJld2FyZFBvb2xQcmV2aW91cwUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAETZ2V0TGFzdEludGVyZXN0SW5mbwEEcG9vbAQMZmFybUludGVyZXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAQNYm9vc3RJbnRlcmVzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0CQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAQPYm9vc3RMUEludGVyZXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAQSbGFzdEludGVyZXN0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQCWCgQFEmxhc3RJbnRlcmVzdEhlaWdodAUMZmFybUludGVyZXN0BQ1ib29zdEludGVyZXN0BQ9ib29zdExQSW50ZXJlc3QBC2NhbGNGYXJtUndkAgRwb29sDmN1clRvdGFsUmV3YXJkBA1wb29sQm9vc3RDb2VmCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xCb29zdENvZWYFEGRlZlBvb2xCb29zdENvZWYJAGsDBQ5jdXJUb3RhbFJld2FyZAUSbG9ja0Jvb3N0Q29lZlNjYWxlCQBkAgUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlAQxjYWxjQm9vc3RSd2QCBHBvb2wOY3VyVG90YWxSZXdhcmQEDXBvb2xCb29zdENvZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbEJvb3N0Q29lZgUQZGVmUG9vbEJvb3N0Q29lZgkAawMFDmN1clRvdGFsUmV3YXJkBQ1wb29sQm9vc3RDb2VmCQBkAgUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlAQxjYWxjSW50ZXJlc3QMBHBvb2wSbGFzdEludGVyZXN0SGVpZ2h0EnJld2FyZFVwZGF0ZUhlaWdodBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0DGZhcm1JbnRlcmVzdA1ib29zdEludGVyZXN0CXBvb2xWb3RlZA9ib29zdExwSW50ZXJlc3QVY3VycmVudFJld2FyZFBlckJsb2NrEHNoYXJlVG9rZW5Mb2NrZWQWcHJldmlvdXNSZXdhcmRQZXJCbG9jawpzY2FsZVZhbHVlAwkAAAIFEHNoYXJlVG9rZW5Mb2NrZWQAAAkAlQoDAAAAAAAABA0kdDAxMDQxNzExODExAwMDCQBmAgUScmV3YXJkVXBkYXRlSGVpZ2h0BQZoZWlnaHQJAAACBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBgMJAGYCBQZoZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAkBAiE9AgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwQBcgkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAkAlgoEBQFyBQxmYXJtSW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QFD2Jvb3N0THBJbnRlcmVzdAMDAwkAZgIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQAAAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwkAZgIFEmxhc3RJbnRlcmVzdEhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BwQBcgkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQCWCgQFAXIFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUPYm9vc3RMcEludGVyZXN0BAlyd2RCZnJVcGQJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQEB2ZBZnRyVXAJAGQCBQxmYXJtSW50ZXJlc3QJAGsDCQELY2FsY0Zhcm1Sd2QCBQRwb29sBQlyd2RCZnJVcGQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEB2JBZnRyVXAJAGQCBQ1ib29zdEludGVyZXN0AwkAZgIFCXBvb2xWb3RlZAAACQBrAwkBDGNhbGNCb29zdFJ3ZAIFBHBvb2wFCXJ3ZEJmclVwZAUKc2NhbGVWYWx1ZQUJcG9vbFZvdGVkAAAECWJMUEFmdHJVcAkAZAIFDGZhcm1JbnRlcmVzdAMDCQBmAgUJcG9vbFZvdGVkAAAJAGYCBRBzaGFyZVRva2VuTG9ja2VkAAAHCQBrAwkBDGNhbGNCb29zdFJ3ZAIFBHBvb2wFCXJ3ZEJmclVwZAUKc2NhbGVWYWx1ZQUJcG9vbFZvdGVkAAAEAXIJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAkAlgoEBQFyBQdmQWZ0clVwBQdiQWZ0clVwBQliTFBBZnRyVXAEBnJld2FyZAgFDSR0MDEwNDE3MTE4MTECXzEEDmZhcm1JbnRyQmVmb3JlCAUNJHQwMTA0MTcxMTgxMQJfMgQPYm9vc3RJbnRyQmVmb3JlCAUNJHQwMTA0MTcxMTgxMQJfMwQRYm9vc3RMUEludHJCZWZvcmUIBQ0kdDAxMDQxNzExODExAl80BA9uZXdGYXJtSW50ZXJlc3QJAGQCBQ5mYXJtSW50ckJlZm9yZQkAawMJAQtjYWxjRmFybVJ3ZAIFBHBvb2wFBnJld2FyZAUKc2NhbGVWYWx1ZQUQc2hhcmVUb2tlbkxvY2tlZAQQbmV3Qm9vc3RJbnRlcmVzdAkAZAIFD2Jvb3N0SW50ckJlZm9yZQMJAGYCBQlwb29sVm90ZWQAAAkAawMJAQxjYWxjQm9vc3RSd2QCBQRwb29sBQZyZXdhcmQFC3NjYWxlVmFsdWU4BQlwb29sVm90ZWQAAAQSbmV3Qm9vc3RMUEludGVyZXN0CQBkAgURYm9vc3RMUEludHJCZWZvcmUDAwkAZgIFCXBvb2xWb3RlZAAACQBmAgUQc2hhcmVUb2tlbkxvY2tlZAAABwkAawMJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUGcmV3YXJkBQtzY2FsZVZhbHVlOAUQc2hhcmVUb2tlbkxvY2tlZAULc2NhbGVWYWx1ZTgFCXBvb2xWb3RlZAAACQCVCgMFD25ld0Zhcm1JbnRlcmVzdAUQbmV3Qm9vc3RJbnRlcmVzdAUSbmV3Qm9vc3RMUEludGVyZXN0AQljbGFpbUNhbGMCBHBvb2wEdXNlcgQKc2NhbGVWYWx1ZQkBDmNhbGNTY2FsZVZhbHVlAgUEU1dPUAkBD2dldFNoYXJlQXNzZXRJZAEFBHBvb2wECXBvb2xWb3RlZAkBDGdldFBvb2xWb3RlZAEFBHBvb2wECnVQb29sVm90ZWQJARBnZXRVc2VyUG9vbFZvdGVkAgUEcG9vbAUEdXNlcgQKc2hhcmVUb2tlbgkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUKc2hhcmVUb2tlbgQNJHQwMTI3ODQxMjg4MgkBE2dldExhc3RJbnRlcmVzdEluZm8BBQRwb29sBBJsYXN0SW50ZXJlc3RIZWlnaHQIBQ0kdDAxMjc4NDEyODgyAl8xBAxmYXJtSW50ZXJlc3QIBQ0kdDAxMjc4NDEyODgyAl8yBA1ib29zdEludGVyZXN0CAUNJHQwMTI3ODQxMjg4MgJfMwQPYm9vc3RMUEludGVyZXN0CAUNJHQwMTI3ODQxMjg4MgJfNAQNJHQwMTI4ODcxMzAwMQkBCnJld2FyZEluZm8BBQRwb29sBBVjdXJyZW50UmV3YXJkUGVyQmxvY2sIBQ0kdDAxMjg4NzEzMDAxAl8xBBJyZXdhcmRVcGRhdGVIZWlnaHQIBQ0kdDAxMjg4NzEzMDAxAl8yBBZwcmV2aW91c1Jld2FyZFBlckJsb2NrCAUNJHQwMTI4ODcxMzAwMQJfMwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDEyODg3MTMwMDECXzQEDXVGYXJtSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QEDnVCb29zdEludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QEEHVCb29zdExQSW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUYa0Jvb3N0TFBVc2VyTGFzdEludGVyZXN0BQ9ib29zdExQSW50ZXJlc3QEEnVTaGFyZVRva2Vuc1N0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVTaGFyZVRva2Vuc1ZpcnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEnVTaGFyZVRva2Vuc1N0YWtlZAQNJHQwMTM1NjkxMzk2MgkBDGNhbGNJbnRlcmVzdAwFBHBvb2wFEmxhc3RJbnRlcmVzdEhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BQxmYXJtSW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QFCXBvb2xWb3RlZAUPYm9vc3RMUEludGVyZXN0BRVjdXJyZW50UmV3YXJkUGVyQmxvY2sFEXRvdGFsU2hhcmVWaXJ0dWFsBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrBQpzY2FsZVZhbHVlBA9uZXdGYXJtSW50ZXJlc3QIBQ0kdDAxMzU2OTEzOTYyAl8xBBBuZXdCb29zdEludGVyZXN0CAUNJHQwMTM1NjkxMzk2MgJfMgQSbmV3Qm9vc3RMUEludGVyZXN0CAUNJHQwMTM1NjkxMzk2MgJfMwQMY2xhaW1GYXJtaW5nCQBrAwUQdVNoYXJlVG9rZW5zVmlydAkAZQIFD25ld0Zhcm1JbnRlcmVzdAUNdUZhcm1JbnRlcmVzdAUKc2NhbGVWYWx1ZQQQY2xhaW1Cb29zdGluZ01heAkAawMFCnVQb29sVm90ZWQJAGUCBRBuZXdCb29zdEludGVyZXN0BQ51Qm9vc3RJbnRlcmVzdAULc2NhbGVWYWx1ZTgEDWNsYWltQm9vc3RpbmcJAGkCCQBrAwkAaAIFEHVTaGFyZVRva2Vuc1ZpcnQFCnVQb29sVm90ZWQJAGUCBRJuZXdCb29zdExQSW50ZXJlc3QFEHVCb29zdExQSW50ZXJlc3QFC3NjYWxlVmFsdWU4BQtzY2FsZVZhbHVlOAQKdG9UcmVhc3VyeQkAZQIFEGNsYWltQm9vc3RpbmdNYXgFDWNsYWltQm9vc3RpbmcJAJcKBQUPbmV3RmFybUludGVyZXN0BRBuZXdCb29zdEludGVyZXN0BRJuZXdCb29zdExQSW50ZXJlc3QJAGQCBQxjbGFpbUZhcm1pbmcFDWNsYWltQm9vc3RpbmcFCnRvVHJlYXN1cnkBG2F2YWlsYWJsZUNsYWltQ2FsY0FsbEJ5VXNlcgIFcG9vbHMEdXNlcgoBDWNhbGNBdmFpbGFibGUCA2FjYwRwb29sBA0kdDAxNDU5MjE0NjIxBQNhY2MECG5ld1Bvb2xzCAUNJHQwMTQ1OTIxNDYyMQJfMQQHYW1vdW50cwgFDSR0MDE0NTkyMTQ2MjECXzIEDSR0MDE0NjMwMTQ2ODkJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAJmaQgFDSR0MDE0NjMwMTQ2ODkCXzEEAmJpCAUNJHQwMTQ2MzAxNDY4OQJfMgQEYmxwaQgFDSR0MDE0NjMwMTQ2ODkCXzMEC2NsYWltQW1vdW50CAUNJHQwMTQ2MzAxNDY4OQJfNAQCdHQIBQ0kdDAxNDYzMDE0Njg5Al81BA1hdmFpbGFibGVGdW5kCQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAJQKAgkAzQgCBQhuZXdQb29scwUEdXNlcgkAzQgCBQdhbW91bnRzBQ1hdmFpbGFibGVGdW5kCgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENY2FsY0F2YWlsYWJsZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwBFWNhbkxvY2tJbkZpcnN0SGFydmVzdAUEcG9vbAR1c2VyFXVzZXJTaGFyZVRva2Vuc1N0YWtlZAlwbXRBbW91bnQIbG9ja1R5cGUDCQBmAgkBFWdldEhlaWdodEZpcnN0SGFydmVzdAEFBHBvb2wFBmhlaWdodAQPdG90YWxWb3RlQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgUEcG9vbAUQa0hhcnZlc3RQb29sVm90ZQAABA51c2VyVm90ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ12b3RpbmdBZGRyZXNzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQRwb29sBRBrSGFydmVzdFBvb2xWb3RlAAAEEUZIU2hhcmVUb2tlbkxpbWl0CQEUZ2V0RkhTaGFyZUxpbWl0VG9rZW4BCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBBVGSFNoYXJlVG9rZW5Vc2VyTGltaXQJAGUCCQBrAwURRkhTaGFyZVRva2VuTGltaXQFDnVzZXJWb3RlQW1vdW50BQ90b3RhbFZvdGVBbW91bnQFFXVzZXJTaGFyZVRva2Vuc1N0YWtlZAMJAGYCBQhsb2NrVHlwZQAACQACAQIyWW91IGNhbid0IGxvY2sgc2hhcmVUb2tlbnMgdGlsbCBmaXJzdCBoYXJ2ZXN0IGVuZC4DCQAAAgUOdXNlclZvdGVBbW91bnQAAAAAAwkAZwIFCXBtdEFtb3VudAUVRkhTaGFyZVRva2VuVXNlckxpbWl0CQBlAgUJcG10QW1vdW50BRVGSFNoYXJlVG9rZW5Vc2VyTGltaXQAAAAAAQ1nZXRMb2NrUGFyYW1zAQR0eXBlBApsb2NrUGFyYW1zCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQUEdHlwZQULa0xvY2tQYXJhbXMJAKwCAgIeVGhlcmUgYXJlIG5vIGtleSBmb3IgbG9jayB0eXBlCQCkAwEFBHR5cGUCAV8JAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxvY2tQYXJhbXMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxvY2tQYXJhbXMAAQEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbg4BaQEEaW5pdAEHZWFybHlMUAMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFB2tTV09QaWQJAAIBAhhTV09QIGFscmVhZHkgaW5pdGlhbGl6ZWQECmluaXRBbW91bnQAgIDpg7HeFgQJU1dPUGlzc3VlCQDCCAUCBFNXT1ACE1NXT1AgcHJvdG9jb2wgdG9rZW4FCmluaXRBbW91bnQACAYEBlNXT1BpZAkAuAgBBQlTV09QaXNzdWUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAMIIBQIEU1dPUAITU1dPUCBwcm90b2NvbCB0b2tlbgUKaW5pdEFtb3VudAAIBgkAzAgCCQELU3RyaW5nRW50cnkCBQdrU1dPUGlkCQDYBAEFBlNXT1BpZAUDbmlsAWkBFGluaXRQb29sU2hhcmVGYXJtaW5nAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQESdXBkYXRlUG9vbEludGVyZXN0AQRwb29sCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFAWkGY2FsbGVyBQpnb3ZBZGRyZXNzCQACAQImT25seSBHb3Zlcm5hbmNlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EBHVzZXIJAKUIAQkApwgBBRFhZG1pbkludm9rZVB1YktleQQNJHQwMTc0MjExNzQ5NQkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDE3NDIxMTc0OTUCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxNzQyMTE3NDk1Al8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAxNzQyMTE3NDk1Al8zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEPbG9ja1NoYXJlVG9rZW5zAgRwb29sCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAxzaGFyZUFzc2V0SWQJAQ9nZXRTaGFyZUFzc2V0SWQBBQRwb29sBAR1c2VyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQKdG90YWxTaGFyZQkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUKdG90YWxTaGFyZQQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAED3VzZXJMb2NrZWRIZWlndAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0AAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAQUdG90YWxVc2VyU2hhcmVUb2tlbnMJAGQCCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDSR0MDE4NjA0MTg2NTYJAQ1nZXRMb2NrUGFyYW1zAQUIbG9ja1R5cGUECmxvY2tQZXJpb2QIBQ0kdDAxODYwNDE4NjU2Al8xBAhsb2NrQ29lZggFDSR0MDE4NjA0MTg2NTYCXzIEDGxvY2tXYXZlc0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa0xvY2tXYXZlc0ZlZQMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQIbV3Jvbmcgc2hhcmV0b2tlbiBpbiBwYXltZW50AwkAZwIAAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAAIBAiVQYXltZW50IGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUIbG9ja1R5cGUJAAIBAhVsb2NrVHlwZSBtdXN0IGJlID49IDAEFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkBFWNhbkxvY2tJbkZpcnN0SGFydmVzdAUFBHBvb2wFBHVzZXIFEHVzZXJTdGFrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQhsb2NrVHlwZQMJAAACBRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAQNJHQwMTkwODMyMDkyOAMJAAACBQhsb2NrVHlwZQAABBR1c2VyQW1vdW50VmlydHVhbE5ldwkAZQIJAGQCBRF1c2VyQW1vdW50VmlydHVhbAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkCQBlAgkAZAIFEHVzZXJTdGFrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZQIJAGQCBRF0b3RhbFNoYXJlVmlydHVhbAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQxvcmlnaW5DYWxsZXIFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwJAGUCCQBkAgUKdG90YWxTaGFyZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAADAwkAZgIAAgkAkAMBCAUBaQhwYXltZW50cwYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAUEdW5pdAYJAGYCBQxsb2NrV2F2ZXNGZWUICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BwkAAgEJAKwCAgkArAICAitZb3UgbmVlZCB0byBwYXkgYWRkaXRpb25hbCB3YXZlcyBjb21pc3Npb24gCQCkAwEFDGxvY2tXYXZlc0ZlZQIFV0FWRVMDCQBmAgUPdXNlckxvY2tlZEhlaWd0CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kCQACAQJPWW91IGNhbm5vdCBsb2NrIHNoYXJldG9rZW5zIGZvciBhIHBlcmlvZCBsZXNzIHRoYW4gd2hhdCB5b3UgaGF2ZSBhbHJlYWR5IGxvY2tlZAQTdXNlckxvY2tlZEFtb3VudE5ldwkAZAIFEHVzZXJMb2NrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBJ1c2VyTG9ja2VkSGVpZ3ROZXcJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBkAgkAawMFE3VzZXJMb2NrZWRBbW91bnROZXcFCGxvY2tDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUFEHVzZXJTdGFrZWRBbW91bnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAUTdXNlckxvY2tlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAUSdXNlckxvY2tlZEhlaWd0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQUIbG9ja1R5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcFA25pbAkAZAIFCnRvdGFsU2hhcmUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAtsb2NrRW50cmllcwgFDSR0MDE5MDgzMjA5MjgCXzEEDXRvdGFsU2hhcmVOZXcIBQ0kdDAxOTA4MzIwOTI4Al8yAwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDHNoYXJlQXNzZXRJZAUNdG90YWxTaGFyZU5ldwkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAQNJHQwMjEwNTMyMTE1MgkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDIxMDUzMjExNTICXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyMTA1MzIxMTUyAl8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAyMTA1MzIxMTUyAl8zBAtjbGFpbUFtb3VudAgFDSR0MDIxMDUzMjExNTICXzQECnRvVHJlYXN1cmUIBQ0kdDAyMTA1MzIxMTUyAl81BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50BAR1cGxwAwkAAAIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3ZlcnNpb24CBTMuMC4wCQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCEnVwZGF0ZVVzZXJJbnRlcmVzdAkAzAgCBQRwb29sCQDMCAIFFHRvdGFsVXNlclNoYXJlVG9rZW5zBQNuaWwFA25pbAAAAwkAAAIFBHVwbHAFBHVwbHAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa0Jvb3N0TFBMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwUNdG90YWxTaGFyZU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAUDbmlsBQtsb2NrRW50cmllcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVsb2NrU3Rha2VkU2hhcmVUb2tlbnMDBHBvb2wIbG9ja1R5cGUKbG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQMc2hhcmVBc3NldElkCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQEdXNlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIECnRvdGFsU2hhcmUJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBBF0b3RhbFNoYXJlVmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFCnRvdGFsU2hhcmUEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABA91c2VyTG9ja2VkSGVpZ3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQEFHRvdGFsVXNlclNoYXJlVG9rZW5zCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAQNJHQwMjMwNTAyMzEwMgkBDWdldExvY2tQYXJhbXMBBQhsb2NrVHlwZQQKbG9ja1BlcmlvZAgFDSR0MDIzMDUwMjMxMDICXzEECGxvY2tDb2VmCAUNJHQwMjMwNTAyMzEwMgJfMgQMbG9ja1dhdmVzRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rTG9ja1dhdmVzRmVlAwkAZgIJARVnZXRIZWlnaHRGaXJzdEhhcnZlc3QBBQRwb29sBQZoZWlnaHQJAAIBAjJZb3UgY2FuJ3QgbG9jayBzaGFyZVRva2VucyB0aWxsIGZpcnN0IGhhcnZlc3QgZW5kLgMJAGcCAAAFCGxvY2tUeXBlCQACAQIUbG9ja1R5cGUgbXVzdCBiZSA+IDADCQBmAgUKbG9ja0Ftb3VudAUQdXNlclN0YWtlZEFtb3VudAkAAgEJAKwCAgIZWW91IGNhbid0IGxvY2sgbW9yZSB0aGFuIAkApAMBBRB1c2VyU3Rha2VkQW1vdW50AwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDHNoYXJlQXNzZXRJZAUKdG90YWxTaGFyZQkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAADAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEdW5pdAYJAGYCBQxsb2NrV2F2ZXNGZWUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BwkAAgEJAKwCAgkArAICAitZb3UgbmVlZCB0byBwYXkgYWRkaXRpb25hbCB3YXZlcyBjb21pc3Npb24gCQCkAwEFDGxvY2tXYXZlc0ZlZQIFV0FWRVMDAwkAAAIFD3VzZXJMb2NrZWRIZWlndAAACQBnAgAABQpsb2NrQW1vdW50BwkAAgECIWxvY2tBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCmxvY2tBbW91bnQJAAIBAhtsb2NrQW1vdW50IG11c3QgYmUgcG9zaXRpdmUDCQBmAgUPdXNlckxvY2tlZEhlaWd0CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kCQACAQJPWW91IGNhbm5vdCBsb2NrIHNoYXJldG9rZW5zIGZvciBhIHBlcmlvZCBsZXNzIHRoYW4gd2hhdCB5b3UgaGF2ZSBhbHJlYWR5IGxvY2tlZAQTdXNlckxvY2tlZEFtb3VudE5ldwkAZAIFEHVzZXJMb2NrZWRBbW91bnQFCmxvY2tBbW91bnQEE3VzZXJTdGFrZWRBbW91bnROZXcJAGUCBRB1c2VyU3Rha2VkQW1vdW50BQpsb2NrQW1vdW50BBJ1c2VyTG9ja2VkSGVpZ3ROZXcJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBkAgkAawMFE3VzZXJMb2NrZWRBbW91bnROZXcFCGxvY2tDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUFEHVzZXJTdGFrZWRBbW91bnQEDSR0MDI0Mzg5MjQ0ODgJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAyNDM4OTI0NDg4Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMjQzODkyNDQ4OAJfMgQPYm9vc3RMUGludGVyZXN0CAUNJHQwMjQzODkyNDQ4OAJfMwQLY2xhaW1BbW91bnQIBQ0kdDAyNDM4OTI0NDg4Al80BAp0b1RyZWFzdXJlCAUNJHQwMjQzODkyNDQ4OAJfNQQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAUTdXNlckxvY2tlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAUSdXNlckxvY2tlZEhlaWd0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQUIbG9ja1R5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QBQNuaWwBaQEOdW5sb2NrVXNlckxvY2sCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQMbG9ja1dhdmVzRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rTG9ja1dhdmVzRmVlBA91c2VyTG9ja2VkSGVpZ3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0CQCsAgIJAKwCAgkArAICCQCsAgICEVRoZXJlIGlzIG5vIHBvb2wgBQRwb29sAgkgb3IgdXNlciAFBHVzZXICCXdpdGggbG9jawQRdG90YWxTaGFyZVZpcnR1YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAMJAGYCBQ91c2VyTG9ja2VkSGVpZ3QFBmhlaWdodAkAAgEJAKwCAgIiWW91IGNhbid0IHVubG9jayBzaGFyZXRva2VucyB0aWxsIAkApAMBBQ91c2VyTG9ja2VkSGVpZ3QEE3VzZXJTdGFrZWRBbW91bnROZXcJAGQCBRB1c2VyU3Rha2VkQW1vdW50BRB1c2VyTG9ja2VkQW1vdW50BA0kdDAyNjcxNDI2ODEzCQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMjY3MTQyNjgxMwJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDI2NzE0MjY4MTMCXzIED2Jvb3N0TFBpbnRlcmVzdAgFDSR0MDI2NzE0MjY4MTMCXzMEC2NsYWltQW1vdW50CAUNJHQwMjY3MTQyNjgxMwJfNAQKdG9UcmVhc3VyZQgFDSR0MDI2NzE0MjY4MTMCXzUEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUJAMwIAgkBB1JlaXNzdWUDBQRTV09QBQp0b1RyZWFzdXJlBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMbG9ja1dhdmVzRmVlBQR1bml0BQNuaWwBaQETd2l0aGRyYXdTaGFyZVRva2VucwIEcG9vbBlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA1zaGFyZVRva2Vuc0lkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQEBHVzZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBA0kdDAyODMwNzI4NDA2CQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMjgzMDcyODQwNgJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDI4MzA3Mjg0MDYCXzIED2Jvb3N0TFBpbnRlcmVzdAgFDSR0MDI4MzA3Mjg0MDYCXzMEC2NsYWltQW1vdW50CAUNJHQwMjgzMDcyODQwNgJfNAQKdG9UcmVhc3VyZQgFDSR0MDI4MzA3Mjg0MDYCXzUEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQEE3VzZXJTdGFrZWRBbW91bnROZXcJAGUCBRB1c2VyU3Rha2VkQW1vdW50BRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50BBB0b3RhbFNoYXJlQW1vdW50CQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQRdG90YWxTaGFyZVZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBRB0b3RhbFNoYXJlQW1vdW50BBN0b3RhbFNoYXJlQW1vdW50TmV3CQBlAgUQdG90YWxTaGFyZUFtb3VudAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQUdG90YWxTaGFyZVZpcnR1YWxOZXcJAGUCBRF0b3RhbFNoYXJlVmlydHVhbAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQUdXNlckFtb3VudFZpcnR1YWxOZXcJAGUCBRF1c2VyQW1vdW50VmlydHVhbAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAMJAGYCBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BRB1c2VyU3Rha2VkQW1vdW50CQACAQIsV2l0aGRyYXcgYW1vdW50IG1vcmUgdGhlbiB1c2VyIGxvY2tlZCBhbW91bnQDCQBmAgkBDmFjY291bnRCYWxhbmNlAQUNc2hhcmVUb2tlbnNJZAUQdG90YWxTaGFyZUFtb3VudAkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAQEdXBscAMJAAACCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd2ZXJzaW9uAgUzLjAuMAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAhJ1cGRhdGVVc2VySW50ZXJlc3QJAMwIAgUEcG9vbAkAzAgCCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAUDbmlsBQNuaWwAAAMJAAACBQR1cGxwBQR1cGxwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUUa0Jvb3N0TFBMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMFE3RvdGFsU2hhcmVBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUUdG90YWxTaGFyZVZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QBRFhdmFpbGFibGVGdW5kc05ldwkAzAgCCQEHUmVpc3N1ZQMFBFNXT1AFCnRvVHJlYXN1cmUGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2Zhcm1pbmdUcmVhc3VyZUFkZHIFCnRvVHJlYXN1cmUFBFNXT1AJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BQ1zaGFyZVRva2Vuc0lkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDXNoYXJlVG9rZW5zSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEEHNoYXJlVG9rZW5Mb2NrZWQJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBA0kdDAzMTA2NTMxMTY0CQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMzEwNjUzMTE2NAJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDMxMDY1MzExNjQCXzIED2Jvb3N0TFBpbnRlcmVzdAgFDSR0MDMxMDY1MzExNjQCXzMEC2NsYWltQW1vdW50CAUNJHQwMzEwNjUzMTE2NAJfNAQKdG9UcmVhc3VyZQgFDSR0MDMxMDY1MzExNjQCXzUEDWF2YWlsYWJsZUZ1bmQJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAMJAAACBQ1hdmFpbGFibGVGdW5kAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QAwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDXNoYXJlVG9rZW5zSWQFEHNoYXJlVG9rZW5Mb2NrZWQJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa0Jvb3N0TFBMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QAAAJAMwIAgkBB1JlaXNzdWUDBQRTV09QCQBkAgUKdG9UcmVhc3VyZQUNYXZhaWxhYmxlRnVuZAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDWF2YWlsYWJsZUZ1bmQFBFNXT1AFA25pbAUNYXZhaWxhYmxlRnVuZAFpAQ1jbGFpbUFuZFN0YWtlAQRwb29sCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAtjbGFpbUFtb3VudAoAAUAJAPwHBAUEdGhpcwIFY2xhaW0JAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFC2NsYWltQW1vdW50BQtjbGFpbUFtb3VudAQKc3Rha2VUb0dvdgkA/AcEBQpnb3ZBZGRyZXNzAhNsb2NrU1dPUEZyb21GYXJtaW5nBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBFNXT1AFC2NsYWltQW1vdW50BQNuaWwDCQAAAgUKc3Rha2VUb0dvdgUKc3Rha2VUb0dvdgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNsYWltQWxsAQVwb29scwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAoBCGNsYWltSW52AgpjbGFpbVRvdGFsBHBvb2wEC2NsYWltQW1vdW50CgABQAkA/AcEBQR0aGlzAgVjbGFpbQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50CQBkAgUKY2xhaW1Ub3RhbAULY2xhaW1BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECmNsYWltVG90YWwKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGNsYWltSW52AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAMJAAACBQpjbGFpbVRvdGFsAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKY2xhaW1Ub3RhbAUEU1dPUAUDbmlsAWkBEGNsYWltQWxsQW5kU3Rha2UBBXBvb2xzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACgEIY2xhaW1JbnYCCmNsYWltVG90YWwEcG9vbAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQtjbGFpbUFtb3VudAULY2xhaW1BbW91bnQJAGQCBQpjbGFpbVRvdGFsBQtjbGFpbUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQKY2xhaW1Ub3RhbAoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIY2xhaW1JbnYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDYwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AwkAAAIFCmNsYWltVG90YWwAAAkAAgECGVlvdSBoYXZlIDAgYXZhaWxhYmxlIFNXT1AECnN0YWtlVG9Hb3YJAPwHBAUKZ292QWRkcmVzcwITbG9ja1NXT1BGcm9tRmFybWluZwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRTV09QBQpjbGFpbVRvdGFsBQNuaWwDCQAAAgUKc3Rha2VUb0dvdgUKc3Rha2VUb0dvdgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF3VwZGF0ZVVzZXJCb29zdEludGVyZXN0AgRwb29sBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCAUBaQZjYWxsZXIFDXZvdGluZ0FkZHJlc3MJAAIBAiNPbmx5IHZvaXRpbmcgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQNJHQwMzM1NDAzMzYzOQkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDMzNTQwMzM2MzkCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAzMzU0MDMzNjM5Al8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAzMzU0MDMzNjM5Al8zBAtjbGFpbUFtb3VudAgFDSR0MDMzNTQwMzM2MzkCXzQECnRvVHJlYXN1cmUIBQ0kdDAzMzU0MDMzNjM5Al81BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUUa0Jvb3N0TFBMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMFBmFjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAUCdHgEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAmDe+1s=", "height": 2296447, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3oeHBprB2HvZT3YCJ72dKqmFP56dtkR83BcgQvpsF1nL Next: AKEaRrNBUXGo7fgW9FQHeuUQtDezmCPhCv737tTAmeRC Diff:
OldNewDifferences
226226
227227 func calcFarmRwd (pool,curTotalReward) = {
228228 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
229- fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + 1000))
229+ fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + lockBoostCoefScale))
230230 }
231231
232232
233233 func calcBoostRwd (pool,curTotalReward) = {
234234 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
235- (fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + 1000)) / lockBoostCoefScale)
235+ fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + lockBoostCoefScale))
236236 }
237237
238238
239239 func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
240240 then $Tuple3(0, 0, 0)
241241 else {
242- let $t01041011804 = if (if (if ((rewardUpdateHeight > height))
242+ let $t01041711811 = if (if (if ((rewardUpdateHeight > height))
243243 then (rewardUpdateHeight == poolRewardUpdateHeight)
244244 else false)
245245 then true
273273 let r = (currentRewardPerBlock * (height - rewardUpdateHeight))
274274 $Tuple4(r, fAftrUp, bAftrUp, bLPAftrUp)
275275 }
276- let reward = $t01041011804._1
277- let farmIntrBefore = $t01041011804._2
278- let boostIntrBefore = $t01041011804._3
279- let boostLPIntrBefore = $t01041011804._4
276+ let reward = $t01041711811._1
277+ let farmIntrBefore = $t01041711811._2
278+ let boostIntrBefore = $t01041711811._3
279+ let boostLPIntrBefore = $t01041711811._4
280280 let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
281281 let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
282282 then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
296296 let uPoolVoted = getUserPoolVoted(pool, user)
297297 let shareToken = getTotalShareToken(pool)
298298 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
299- let $t01277712875 = getLastInterestInfo(pool)
300- let lastInterestHeight = $t01277712875._1
301- let farmInterest = $t01277712875._2
302- let boostInterest = $t01277712875._3
303- let boostLPInterest = $t01277712875._4
304- let $t01288012994 = rewardInfo(pool)
305- let currentRewardPerBlock = $t01288012994._1
306- let rewardUpdateHeight = $t01288012994._2
307- let previousRewardPerBlock = $t01288012994._3
308- let poolRewardUpdateHeight = $t01288012994._4
299+ let $t01278412882 = getLastInterestInfo(pool)
300+ let lastInterestHeight = $t01278412882._1
301+ let farmInterest = $t01278412882._2
302+ let boostInterest = $t01278412882._3
303+ let boostLPInterest = $t01278412882._4
304+ let $t01288713001 = rewardInfo(pool)
305+ let currentRewardPerBlock = $t01288713001._1
306+ let rewardUpdateHeight = $t01288713001._2
307+ let previousRewardPerBlock = $t01288713001._3
308+ let poolRewardUpdateHeight = $t01288713001._4
309309 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
310310 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
311311 let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
312312 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
313313 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
314- let $t01356213955 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
315- let newFarmInterest = $t01356213955._1
316- let newBoostInterest = $t01356213955._2
317- let newBoostLPInterest = $t01356213955._3
314+ let $t01356913962 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
315+ let newFarmInterest = $t01356913962._1
316+ let newBoostInterest = $t01356913962._2
317+ let newBoostLPInterest = $t01356913962._3
318318 let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
319319 let claimBoostingMax = fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
320320 let claimBoosting = (fraction((uShareTokensVirt * uPoolVoted), (newBoostLPInterest - uBoostLPInterest), scaleValue8) / scaleValue8)
325325
326326 func availableClaimCalcAllByUser (pools,user) = {
327327 func calcAvailable (acc,pool) = {
328- let $t01458514614 = acc
329- let newPools = $t01458514614._1
330- let amounts = $t01458514614._2
331- let $t01462314682 = claimCalc(pool, user)
332- let fi = $t01462314682._1
333- let bi = $t01462314682._2
334- let blpi = $t01462314682._3
335- let claimAmount = $t01462314682._4
336- let tt = $t01462314682._5
328+ let $t01459214621 = acc
329+ let newPools = $t01459214621._1
330+ let amounts = $t01459214621._2
331+ let $t01463014689 = claimCalc(pool, user)
332+ let fi = $t01463014689._1
333+ let bi = $t01463014689._2
334+ let blpi = $t01463014689._3
335+ let claimAmount = $t01463014689._4
336+ let tt = $t01463014689._5
337337 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
338338 $Tuple2((newPools :+ user), (amounts :+ availableFund))
339339 }
413413 then throw("Only Governance can call this function")
414414 else {
415415 let user = toString(addressFromPublicKey(adminInvokePubKey))
416- let $t01741417488 = claimCalc(pool, user)
417- let farmInterest = $t01741417488._1
418- let boostInterest = $t01741417488._2
419- let boostLPinterest = $t01741417488._3
416+ let $t01742117495 = claimCalc(pool, user)
417+ let farmInterest = $t01742117495._1
418+ let boostInterest = $t01742117495._2
419+ let boostLPinterest = $t01742117495._3
420420 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
421421 })
422422
433433 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
434434 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
435435 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
436- let $t01859718649 = getLockParams(lockType)
437- let lockPeriod = $t01859718649._1
438- let lockCoef = $t01859718649._2
436+ let $t01860418656 = getLockParams(lockType)
437+ let lockPeriod = $t01860418656._1
438+ let lockCoef = $t01860418656._2
439439 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
440440 if ((i.payments[0].assetId != shareAssetId))
441441 then throw("Wrong sharetoken in payment")
447447 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
448448 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
449449 then {
450- let $t01907620921 = if ((lockType == 0))
450+ let $t01908320928 = if ((lockType == 0))
451451 then {
452452 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
453453 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(i.originCaller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
468468 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
469469 $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))
470470 }
471- let lockEntries = $t01907620921._1
472- let totalShareNew = $t01907620921._2
471+ let lockEntries = $t01908320928._1
472+ let totalShareNew = $t01908320928._2
473473 if ((accountBalance(shareAssetId) > totalShareNew))
474474 then throw("Balance of share-token is lower than totalAmount")
475475 else {
476- let $t02104621145 = claimCalc(pool, user)
477- let farmInterest = $t02104621145._1
478- let boostInterest = $t02104621145._2
479- let boostLPinterest = $t02104621145._3
480- let claimAmount = $t02104621145._4
481- let toTreasure = $t02104621145._5
476+ let $t02105321152 = claimCalc(pool, user)
477+ let farmInterest = $t02105321152._1
478+ let boostInterest = $t02105321152._2
479+ let boostLPinterest = $t02105321152._3
480+ let claimAmount = $t02105321152._4
481+ let toTreasure = $t02105321152._5
482482 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
483483 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
484484 then invoke(lpFarmingAddress, "updateUserInterest", [pool, totalUserShareTokens], nil)
505505 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
506506 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
507507 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
508- let $t02304323095 = getLockParams(lockType)
509- let lockPeriod = $t02304323095._1
510- let lockCoef = $t02304323095._2
508+ let $t02305023102 = getLockParams(lockType)
509+ let lockPeriod = $t02305023102._1
510+ let lockCoef = $t02305023102._2
511511 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
512512 if ((getHeightFirstHarvest(pool) > height))
513513 then throw("You can't lock shareTokens till first harvest end.")
538538 let userStakedAmountNew = (userStakedAmount - lockAmount)
539539 let userLockedHeigtNew = (height + lockPeriod)
540540 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
541- let $t02438224481 = claimCalc(pool, user)
542- let farmInterest = $t02438224481._1
543- let boostInterest = $t02438224481._2
544- let boostLPinterest = $t02438224481._3
545- let claimAmount = $t02438224481._4
546- let toTreasure = $t02438224481._5
541+ let $t02438924488 = claimCalc(pool, user)
542+ let farmInterest = $t02438924488._1
543+ let boostInterest = $t02438924488._2
544+ let boostLPinterest = $t02438924488._3
545+ let claimAmount = $t02438924488._4
546+ let toTreasure = $t02438924488._5
547547 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
548548 [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) + kBoostLPLastInterest), 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)]
549549 }
563563 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
564564 else {
565565 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
566- let $t02670726806 = claimCalc(pool, user)
567- let farmInterest = $t02670726806._1
568- let boostInterest = $t02670726806._2
569- let boostLPinterest = $t02670726806._3
570- let claimAmount = $t02670726806._4
571- let toTreasure = $t02670726806._5
566+ let $t02671426813 = claimCalc(pool, user)
567+ let farmInterest = $t02671426813._1
568+ let boostInterest = $t02671426813._2
569+ let boostLPinterest = $t02671426813._3
570+ let claimAmount = $t02671426813._4
571+ let toTreasure = $t02671426813._5
572572 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
573573 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)), 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)]
574574 }
580580 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
581581 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
582582 let user = toString(i.originCaller)
583- let $t02830028399 = claimCalc(pool, user)
584- let farmInterest = $t02830028399._1
585- let boostInterest = $t02830028399._2
586- let boostLPinterest = $t02830028399._3
587- let claimAmount = $t02830028399._4
588- let toTreasure = $t02830028399._5
583+ let $t02830728406 = claimCalc(pool, user)
584+ let farmInterest = $t02830728406._1
585+ let boostInterest = $t02830728406._2
586+ let boostLPinterest = $t02830728406._3
587+ let claimAmount = $t02830728406._4
588+ let toTreasure = $t02830728406._5
589589 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
590590 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
591591 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
617617 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
618618 let user = toString(i.caller)
619619 let shareTokenLocked = getTotalShareToken(pool)
620- let $t03105831157 = claimCalc(pool, user)
621- let farmInterest = $t03105831157._1
622- let boostInterest = $t03105831157._2
623- let boostLPinterest = $t03105831157._3
624- let claimAmount = $t03105831157._4
625- let toTreasure = $t03105831157._5
620+ let $t03106531164 = claimCalc(pool, user)
621+ let farmInterest = $t03106531164._1
622+ let boostInterest = $t03106531164._2
623+ let boostLPinterest = $t03106531164._3
624+ let claimAmount = $t03106531164._4
625+ let toTreasure = $t03106531164._5
626626 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
627627 if ((availableFund == 0))
628628 then throw("You have 0 available SWOP")
732732 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
733733 then throw("Only voiting can call this function")
734734 else {
735- let $t03353333632 = claimCalc(pool, user)
736- let farmInterest = $t03353333632._1
737- let boostInterest = $t03353333632._2
738- let boostLPinterest = $t03353333632._3
739- let claimAmount = $t03353333632._4
740- let toTreasure = $t03353333632._5
735+ let $t03354033639 = claimCalc(pool, user)
736+ let farmInterest = $t03354033639._1
737+ let boostInterest = $t03354033639._2
738+ let boostLPinterest = $t03354033639._3
739+ let claimAmount = $t03354033639._4
740+ let toTreasure = $t03354033639._5
741741 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
742742 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)]
743743 })
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"
4949
5050 let kBoostLPLastInterest = "_last_interest_lpb"
5151
5252 let kBoostLPUserLastInterest = "_last_interest_u_lpb"
5353
5454 let kLastInterestHeight = "_last_interest_height"
5555
5656 let kSWOPid = "SWOP_id"
5757
5858 let kAvailableSWOP = "_available_SWOP"
5959
6060 let kSwopYearEmission = "swop_year_emission"
6161
6262 let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
6363
6464 let kPoolVote = "_pool_vote_gSWOP"
6565
6666 let kUserPoolVote = "_user_vote_gSWOP"
6767
6868 let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
6969
7070 let kBasePeriod = "base_period"
7171
7272 let kPeriodLength = "period_length"
7373
7474 let kStartHeight = "start_height"
7575
7676 let kFirstHarvestHeight = "first_harvest_height"
7777
7878 let kShareLimitFH = "share_limit_on_first_harvest"
7979
8080 let kAdminPubKey1 = "admin_pub_1"
8181
8282 let kAdminPubKey2 = "admin_pub_2"
8383
8484 let kAdminPubKey3 = "admin_pub_3"
8585
8686 let kAdminInvokePubKey = "admin_invoke_pub"
8787
8888 let kMoneyBoxAddress = "money_box_address"
8989
9090 let kVotingAddress = "voting_address"
9191
9292 let kGovAddress = "governance_address"
9393
9494 let kLPFarmingAddress = "lp_farming"
9595
9696 let kFarmingTreasureAddr = "farming_treasure"
9797
9898 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
9999
100100 let totalVoteShare = 10000000000
101101
102102 let scaleValue8 = 100000000
103103
104104 let lockBoostCoefScale = 1000
105105
106106 let defPoolBoostCoef = 500
107107
108108 func getBase58FromOracle (key) = match getString(oracle, key) {
109109 case string: String =>
110110 fromBase58String(string)
111111 case nothing =>
112112 throw((key + "is empty"))
113113 }
114114
115115
116116 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
117117
118118 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
119119
120120 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
121121
122122 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
123123
124124 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
125125
126126 let govAddress = Address(getBase58FromOracle(kGovAddress))
127127
128128 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
129129
130130 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
131131
132132 let farmingTreasureAddr = Address(getBase58FromOracle(kFarmingTreasureAddr))
133133
134134 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
135135
136136 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
137137
138138 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
139139
140140 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
141141
142142 let active = getBooleanValue(this, kActive)
143143
144144 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
145145
146146 let SwopYearEmission = getIntegerValue(this, kSwopYearEmission)
147147
148148 let SWOP = fromBase58String(getStringValue(this, kSWOPid))
149149
150150 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(Address(fromBase58String(pool)), kFirstHarvestHeight), 0)
151151
152152
153153 func getFHShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimitFH), ("No data on the key: " + kShareLimitFH))
154154
155155
156156 func getTotalShareToken (pool) = valueOrErrorMessage(getInteger(this, (pool + kShareTotalShareTokens)), (("No data on the key: " + pool) + kShareTotalShareTokens))
157157
158158
159159 func getPoolVoted (pool) = valueOrElse(getInteger(votingAddress, (pool + kPoolVote)), 0)
160160
161161
162162 func getUserPoolVoted (pool,user) = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kPoolVote)), 0)
163163
164164
165165 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
166166
167167
168168 func accountBalance (assetId) = match assetId {
169169 case id: ByteVector =>
170170 assetBalance(this, id)
171171 case waves: Unit =>
172172 wavesBalance(this).available
173173 case _ =>
174174 throw("Match error")
175175 }
176176
177177
178178 func getAssetInfo (assetId) = match assetId {
179179 case id: ByteVector =>
180180 let stringId = toBase58String(id)
181181 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
182182 $Tuple3(stringId, info.name, info.decimals)
183183 case waves: Unit =>
184184 $Tuple3("WAVES", "WAVES", 8)
185185 case _ =>
186186 throw("Match error")
187187 }
188188
189189
190190 func calcScaleValue (assetId1,assetId2) = {
191191 let assetId1Decimals = value(assetInfo(assetId1)).decimals
192192 let assetId2Decimals = value(assetInfo(assetId2)).decimals
193193 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
194194 pow(10, 0, scaleDigits, 0, 0, DOWN)
195195 }
196196
197197
198198 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + kAvailableSWOP)), 0)
199199
200200
201201 func rewardInfo (pool) = {
202202 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockCurrent), ((("No data on the key: " + kTotalRewardPerBlockCurrent) + " at address ") + toString(govAddress)))
203203 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockPrevious), ((("No data on the key: " + kTotalRewardPerBlockPrevious) + " at address ") + toString(govAddress)))
204204 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + kRewardPoolFractionCurrent) + " at address ") + toString(govAddress)))
205205 let rewardUpdateHeight = valueOrErrorMessage(getInteger(govAddress, kRewardUpdateHeight), ((("No data on the key: " + kRewardUpdateHeight) + " at address ") + toString(govAddress)))
206206 let poolRewardUpdateHeight = valueOrElse(getInteger(govAddress, (pool + kHeightPoolFraction)), rewardUpdateHeight)
207207 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + kRewardPoolFractionPrevious) + " at address ") + toString(govAddress)))
208208 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
209209 let rewardPoolPrevious = fraction(totalRewardPerBlockCurrent, rewardPoolFractionPrevious, totalVoteShare)
210210 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
211211 then true
212212 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
213213 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
214214 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
215215 }
216216
217217
218218 func getLastInterestInfo (pool) = {
219219 let farmInterest = valueOrErrorMessage(getInteger(this, (pool + kFarmLastInterest)), (("No data on the key: " + pool) + kFarmLastInterest))
220220 let boostInterest = valueOrErrorMessage(getInteger(this, (pool + kBoostLastInterest)), (("No data on the key: " + pool) + kBoostLastInterest))
221221 let boostLPInterest = valueOrErrorMessage(getInteger(this, (pool + kBoostLPLastInterest)), (("No data on the key: " + pool) + kBoostLPLastInterest))
222222 let lastInterestHeight = valueOrElse(getInteger(this, (pool + kLastInterestHeight)), height)
223223 $Tuple4(lastInterestHeight, farmInterest, boostInterest, boostLPInterest)
224224 }
225225
226226
227227 func calcFarmRwd (pool,curTotalReward) = {
228228 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
229- fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + 1000))
229+ fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + lockBoostCoefScale))
230230 }
231231
232232
233233 func calcBoostRwd (pool,curTotalReward) = {
234234 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
235- (fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + 1000)) / lockBoostCoefScale)
235+ fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + lockBoostCoefScale))
236236 }
237237
238238
239239 func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
240240 then $Tuple3(0, 0, 0)
241241 else {
242- let $t01041011804 = if (if (if ((rewardUpdateHeight > height))
242+ let $t01041711811 = if (if (if ((rewardUpdateHeight > height))
243243 then (rewardUpdateHeight == poolRewardUpdateHeight)
244244 else false)
245245 then true
246246 else if ((height > rewardUpdateHeight))
247247 then (rewardUpdateHeight != poolRewardUpdateHeight)
248248 else false)
249249 then {
250250 let r = (previousRewardPerBlock * (height - lastInterestHeight))
251251 $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
252252 }
253253 else if (if (if ((height > rewardUpdateHeight))
254254 then (rewardUpdateHeight == poolRewardUpdateHeight)
255255 else false)
256256 then (lastInterestHeight > rewardUpdateHeight)
257257 else false)
258258 then {
259259 let r = (currentRewardPerBlock * (height - lastInterestHeight))
260260 $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
261261 }
262262 else {
263263 let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
264264 let fAftrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
265265 let bAftrUp = (boostInterest + (if ((poolVoted > 0))
266266 then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue, poolVoted)
267267 else 0))
268268 let bLPAftrUp = (farmInterest + (if (if ((poolVoted > 0))
269269 then (shareTokenLocked > 0)
270270 else false)
271271 then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue, poolVoted)
272272 else 0))
273273 let r = (currentRewardPerBlock * (height - rewardUpdateHeight))
274274 $Tuple4(r, fAftrUp, bAftrUp, bLPAftrUp)
275275 }
276- let reward = $t01041011804._1
277- let farmIntrBefore = $t01041011804._2
278- let boostIntrBefore = $t01041011804._3
279- let boostLPIntrBefore = $t01041011804._4
276+ let reward = $t01041711811._1
277+ let farmIntrBefore = $t01041711811._2
278+ let boostIntrBefore = $t01041711811._3
279+ let boostLPIntrBefore = $t01041711811._4
280280 let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
281281 let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
282282 then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
283283 else 0))
284284 let newBoostLPInterest = (boostLPIntrBefore + (if (if ((poolVoted > 0))
285285 then (shareTokenLocked > 0)
286286 else false)
287287 then fraction(fraction(calcBoostRwd(pool, reward), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
288288 else 0))
289289 $Tuple3(newFarmInterest, newBoostInterest, newBoostLPInterest)
290290 }
291291
292292
293293 func claimCalc (pool,user) = {
294294 let scaleValue = calcScaleValue(SWOP, getShareAssetId(pool))
295295 let poolVoted = getPoolVoted(pool)
296296 let uPoolVoted = getUserPoolVoted(pool, user)
297297 let shareToken = getTotalShareToken(pool)
298298 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
299- let $t01277712875 = getLastInterestInfo(pool)
300- let lastInterestHeight = $t01277712875._1
301- let farmInterest = $t01277712875._2
302- let boostInterest = $t01277712875._3
303- let boostLPInterest = $t01277712875._4
304- let $t01288012994 = rewardInfo(pool)
305- let currentRewardPerBlock = $t01288012994._1
306- let rewardUpdateHeight = $t01288012994._2
307- let previousRewardPerBlock = $t01288012994._3
308- let poolRewardUpdateHeight = $t01288012994._4
299+ let $t01278412882 = getLastInterestInfo(pool)
300+ let lastInterestHeight = $t01278412882._1
301+ let farmInterest = $t01278412882._2
302+ let boostInterest = $t01278412882._3
303+ let boostLPInterest = $t01278412882._4
304+ let $t01288713001 = rewardInfo(pool)
305+ let currentRewardPerBlock = $t01288713001._1
306+ let rewardUpdateHeight = $t01288713001._2
307+ let previousRewardPerBlock = $t01288713001._3
308+ let poolRewardUpdateHeight = $t01288713001._4
309309 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
310310 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
311311 let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
312312 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
313313 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
314- let $t01356213955 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
315- let newFarmInterest = $t01356213955._1
316- let newBoostInterest = $t01356213955._2
317- let newBoostLPInterest = $t01356213955._3
314+ let $t01356913962 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
315+ let newFarmInterest = $t01356913962._1
316+ let newBoostInterest = $t01356913962._2
317+ let newBoostLPInterest = $t01356913962._3
318318 let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
319319 let claimBoostingMax = fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
320320 let claimBoosting = (fraction((uShareTokensVirt * uPoolVoted), (newBoostLPInterest - uBoostLPInterest), scaleValue8) / scaleValue8)
321321 let toTreasury = (claimBoostingMax - claimBoosting)
322322 $Tuple5(newFarmInterest, newBoostInterest, newBoostLPInterest, (claimFarming + claimBoosting), toTreasury)
323323 }
324324
325325
326326 func availableClaimCalcAllByUser (pools,user) = {
327327 func calcAvailable (acc,pool) = {
328- let $t01458514614 = acc
329- let newPools = $t01458514614._1
330- let amounts = $t01458514614._2
331- let $t01462314682 = claimCalc(pool, user)
332- let fi = $t01462314682._1
333- let bi = $t01462314682._2
334- let blpi = $t01462314682._3
335- let claimAmount = $t01462314682._4
336- let tt = $t01462314682._5
328+ let $t01459214621 = acc
329+ let newPools = $t01459214621._1
330+ let amounts = $t01459214621._2
331+ let $t01463014689 = claimCalc(pool, user)
332+ let fi = $t01463014689._1
333+ let bi = $t01463014689._2
334+ let blpi = $t01463014689._3
335+ let claimAmount = $t01463014689._4
336+ let tt = $t01463014689._5
337337 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
338338 $Tuple2((newPools :+ user), (amounts :+ availableFund))
339339 }
340340
341341 let $l = pools
342342 let $s = size($l)
343343 let $acc0 = $Tuple2(nil, nil)
344344 func $f0_1 ($a,$i) = if (($i >= $s))
345345 then $a
346346 else calcAvailable($a, $l[$i])
347347
348348 func $f0_2 ($a,$i) = if (($i >= $s))
349349 then $a
350350 else throw("List size exceeds 60")
351351
352352 $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)
353353 }
354354
355355
356356 func canLockInFirstHarvest (pool,user,userShareTokensStaked,pmtAmount,lockType) = if ((getHeightFirstHarvest(pool) > height))
357357 then {
358358 let totalVoteAmount = valueOrElse(getInteger(votingAddress, (pool + kHarvestPoolVote)), 0)
359359 let userVoteAmount = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kHarvestPoolVote)), 0)
360360 let FHShareTokenLimit = getFHShareLimitToken(addressFromStringValue(pool))
361361 let FHShareTokenUserLimit = (fraction(FHShareTokenLimit, userVoteAmount, totalVoteAmount) - userShareTokensStaked)
362362 if ((lockType > 0))
363363 then throw("You can't lock shareTokens till first harvest end.")
364364 else if ((userVoteAmount == 0))
365365 then 0
366366 else if ((pmtAmount >= FHShareTokenUserLimit))
367367 then (pmtAmount - FHShareTokenUserLimit)
368368 else 0
369369 }
370370 else 0
371371
372372
373373 func getLockParams (type) = {
374374 let lockParams = split(valueOrErrorMessage(getString(this, (toString(type) + kLockParams)), ("There are no key for lock type" + toString(type))), "_")
375375 $Tuple2(parseIntValue(lockParams[0]), parseIntValue(lockParams[1]))
376376 }
377377
378378
379379 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
380380
381381
382382 func isActive () = if (if (active)
383383 then activeGlob
384384 else false)
385385 then unit
386386 else throw("DApp is inactive at this moment")
387387
388388
389389 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
390390 then unit
391391 else throw("Only admin can call this function")
392392
393393
394394 @Callable(i)
395395 func init (earlyLP) = if (isDefined(getString(this, kSWOPid)))
396396 then throw("SWOP already initialized")
397397 else {
398398 let initAmount = 100000000000000
399399 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
400400 let SWOPid = calculateAssetId(SWOPissue)
401401 [BooleanEntry(kActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(kSWOPid, toBase58String(SWOPid))]
402402 }
403403
404404
405405
406406 @Callable(i)
407407 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)])
408408
409409
410410
411411 @Callable(i)
412412 func updatePoolInterest (pool) = valueOrElse(isActive(), if ((i.caller != govAddress))
413413 then throw("Only Governance can call this function")
414414 else {
415415 let user = toString(addressFromPublicKey(adminInvokePubKey))
416- let $t01741417488 = claimCalc(pool, user)
417- let farmInterest = $t01741417488._1
418- let boostInterest = $t01741417488._2
419- let boostLPinterest = $t01741417488._3
416+ let $t01742117495 = claimCalc(pool, user)
417+ let farmInterest = $t01742117495._1
418+ let boostInterest = $t01742117495._2
419+ let boostLPinterest = $t01742117495._3
420420 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
421421 })
422422
423423
424424
425425 @Callable(i)
426426 func lockShareTokens (pool,lockType) = valueOrElse(isActive(), {
427427 let shareAssetId = getShareAssetId(pool)
428428 let user = toString(i.originCaller)
429429 let totalShare = getTotalShareToken(pool)
430430 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
431431 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
432432 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
433433 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
434434 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
435435 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
436- let $t01859718649 = getLockParams(lockType)
437- let lockPeriod = $t01859718649._1
438- let lockCoef = $t01859718649._2
436+ let $t01860418656 = getLockParams(lockType)
437+ let lockPeriod = $t01860418656._1
438+ let lockCoef = $t01860418656._2
439439 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
440440 if ((i.payments[0].assetId != shareAssetId))
441441 then throw("Wrong sharetoken in payment")
442442 else if ((0 >= i.payments[0].amount))
443443 then throw("Payment amount must be greater than 0")
444444 else if ((0 > lockType))
445445 then throw("lockType must be >= 0")
446446 else {
447447 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
448448 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
449449 then {
450- let $t01907620921 = if ((lockType == 0))
450+ let $t01908320928 = if ((lockType == 0))
451451 then {
452452 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
453453 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(i.originCaller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
454454 }
455455 else if (if ((userLockedHeigt == 0))
456456 then if (if ((2 > size(i.payments)))
457457 then true
458458 else (i.payments[1].assetId != unit))
459459 then true
460460 else (lockWavesFee > i.payments[1].amount)
461461 else false)
462462 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
463463 else if ((userLockedHeigt > (height + lockPeriod)))
464464 then throw("You cannot lock sharetokens for a period less than what you have already locked")
465465 else {
466466 let userLockedAmountNew = (userLockedAmount + i.payments[0].amount)
467467 let userLockedHeigtNew = (height + lockPeriod)
468468 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
469469 $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))
470470 }
471- let lockEntries = $t01907620921._1
472- let totalShareNew = $t01907620921._2
471+ let lockEntries = $t01908320928._1
472+ let totalShareNew = $t01908320928._2
473473 if ((accountBalance(shareAssetId) > totalShareNew))
474474 then throw("Balance of share-token is lower than totalAmount")
475475 else {
476- let $t02104621145 = claimCalc(pool, user)
477- let farmInterest = $t02104621145._1
478- let boostInterest = $t02104621145._2
479- let boostLPinterest = $t02104621145._3
480- let claimAmount = $t02104621145._4
481- let toTreasure = $t02104621145._5
476+ let $t02105321152 = claimCalc(pool, user)
477+ let farmInterest = $t02105321152._1
478+ let boostInterest = $t02105321152._2
479+ let boostLPinterest = $t02105321152._3
480+ let claimAmount = $t02105321152._4
481+ let toTreasure = $t02105321152._5
482482 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
483483 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
484484 then invoke(lpFarmingAddress, "updateUserInterest", [pool, totalUserShareTokens], nil)
485485 else 0
486486 if ((uplp == uplp))
487487 then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)
488488 else throw("Strict value is not equal to itself.")
489489 }
490490 }
491491 else throw("Strict value is not equal to itself.")
492492 }
493493 })
494494
495495
496496
497497 @Callable(i)
498498 func lockStakedShareTokens (pool,lockType,lockAmount) = valueOrElse(isActive(), {
499499 let shareAssetId = getShareAssetId(pool)
500500 let user = toString(i.originCaller)
501501 let totalShare = getTotalShareToken(pool)
502502 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
503503 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
504504 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
505505 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
506506 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
507507 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
508- let $t02304323095 = getLockParams(lockType)
509- let lockPeriod = $t02304323095._1
510- let lockCoef = $t02304323095._2
508+ let $t02305023102 = getLockParams(lockType)
509+ let lockPeriod = $t02305023102._1
510+ let lockCoef = $t02305023102._2
511511 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
512512 if ((getHeightFirstHarvest(pool) > height))
513513 then throw("You can't lock shareTokens till first harvest end.")
514514 else if ((0 >= lockType))
515515 then throw("lockType must be > 0")
516516 else if ((lockAmount > userStakedAmount))
517517 then throw(("You can't lock more than " + toString(userStakedAmount)))
518518 else if ((accountBalance(shareAssetId) > totalShare))
519519 then throw("Balance of share-token is lower than totalAmount")
520520 else if (if ((userLockedHeigt == 0))
521521 then if (if ((1 > size(i.payments)))
522522 then true
523523 else (i.payments[0].assetId != unit))
524524 then true
525525 else (lockWavesFee > i.payments[0].amount)
526526 else false)
527527 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
528528 else if (if ((userLockedHeigt == 0))
529529 then (0 >= lockAmount)
530530 else false)
531531 then throw("lockAmount must be greater than 0")
532532 else if ((0 > lockAmount))
533533 then throw("lockAmount must be positive")
534534 else if ((userLockedHeigt > (height + lockPeriod)))
535535 then throw("You cannot lock sharetokens for a period less than what you have already locked")
536536 else {
537537 let userLockedAmountNew = (userLockedAmount + lockAmount)
538538 let userStakedAmountNew = (userStakedAmount - lockAmount)
539539 let userLockedHeigtNew = (height + lockPeriod)
540540 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
541- let $t02438224481 = claimCalc(pool, user)
542- let farmInterest = $t02438224481._1
543- let boostInterest = $t02438224481._2
544- let boostLPinterest = $t02438224481._3
545- let claimAmount = $t02438224481._4
546- let toTreasure = $t02438224481._5
541+ let $t02438924488 = claimCalc(pool, user)
542+ let farmInterest = $t02438924488._1
543+ let boostInterest = $t02438924488._2
544+ let boostLPinterest = $t02438924488._3
545+ let claimAmount = $t02438924488._4
546+ let toTreasure = $t02438924488._5
547547 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
548548 [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) + kBoostLPLastInterest), 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)]
549549 }
550550 })
551551
552552
553553
554554 @Callable(i)
555555 func unlockUserLock (pool,user) = valueOrElse(isActive(), {
556556 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
557557 let userLockedHeigt = valueOrErrorMessage(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), (((("There is no pool " + pool) + " or user ") + user) + "with lock"))
558558 let totalShareVirtual = getIntegerValue(this, (pool + kShareTokensVirtual))
559559 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
560560 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
561561 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
562562 if ((userLockedHeigt > height))
563563 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
564564 else {
565565 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
566- let $t02670726806 = claimCalc(pool, user)
567- let farmInterest = $t02670726806._1
568- let boostInterest = $t02670726806._2
569- let boostLPinterest = $t02670726806._3
570- let claimAmount = $t02670726806._4
571- let toTreasure = $t02670726806._5
566+ let $t02671426813 = claimCalc(pool, user)
567+ let farmInterest = $t02671426813._1
568+ let boostInterest = $t02671426813._2
569+ let boostLPinterest = $t02671426813._3
570+ let claimAmount = $t02671426813._4
571+ let toTreasure = $t02671426813._5
572572 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
573573 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)), 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)]
574574 }
575575 })
576576
577577
578578
579579 @Callable(i)
580580 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
581581 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
582582 let user = toString(i.originCaller)
583- let $t02830028399 = claimCalc(pool, user)
584- let farmInterest = $t02830028399._1
585- let boostInterest = $t02830028399._2
586- let boostLPinterest = $t02830028399._3
587- let claimAmount = $t02830028399._4
588- let toTreasure = $t02830028399._5
583+ let $t02830728406 = claimCalc(pool, user)
584+ let farmInterest = $t02830728406._1
585+ let boostInterest = $t02830728406._2
586+ let boostLPinterest = $t02830728406._3
587+ let claimAmount = $t02830728406._4
588+ let toTreasure = $t02830728406._5
589589 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
590590 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
591591 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
592592 let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
593593 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
594594 let totalShareAmount = getTotalShareToken(pool)
595595 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
596596 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
597597 let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
598598 let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
599599 if ((shareTokensWithdrawAmount > userStakedAmount))
600600 then throw("Withdraw amount more then user locked amount")
601601 else if ((accountBalance(shareTokensId) > totalShareAmount))
602602 then throw("Balance of share-token is lower than totalAmount")
603603 else {
604604 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
605605 then invoke(lpFarmingAddress, "updateUserInterest", [pool, (userStakedAmount + userLockedAmount)], nil)
606606 else 0
607607 if ((uplp == uplp))
608608 then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)]
609609 else throw("Strict value is not equal to itself.")
610610 }
611611 })
612612
613613
614614
615615 @Callable(i)
616616 func claim (pool) = valueOrElse(isActive(), {
617617 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
618618 let user = toString(i.caller)
619619 let shareTokenLocked = getTotalShareToken(pool)
620- let $t03105831157 = claimCalc(pool, user)
621- let farmInterest = $t03105831157._1
622- let boostInterest = $t03105831157._2
623- let boostLPinterest = $t03105831157._3
624- let claimAmount = $t03105831157._4
625- let toTreasure = $t03105831157._5
620+ let $t03106531164 = claimCalc(pool, user)
621+ let farmInterest = $t03106531164._1
622+ let boostInterest = $t03106531164._2
623+ let boostLPinterest = $t03106531164._3
624+ let claimAmount = $t03106531164._4
625+ let toTreasure = $t03106531164._5
626626 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
627627 if ((availableFund == 0))
628628 then throw("You have 0 available SWOP")
629629 else if ((accountBalance(shareTokensId) > shareTokenLocked))
630630 then throw("Balance of share-token is lower than totalAmount")
631631 else $Tuple2([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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), ScriptTransfer(i.caller, availableFund, SWOP)], availableFund)
632632 })
633633
634634
635635
636636 @Callable(i)
637637 func claimAndStake (pool) = valueOrElse(isActive(), {
638638 let claimAmount = {
639639 let @ = invoke(this, "claim", [pool], nil)
640640 if ($isInstanceOf(@, "Int"))
641641 then @
642642 else throw(($getType(@) + " couldn't be cast to Int"))
643643 }
644644 if ((claimAmount == claimAmount))
645645 then {
646646 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
647647 if ((stakeToGov == stakeToGov))
648648 then nil
649649 else throw("Strict value is not equal to itself.")
650650 }
651651 else throw("Strict value is not equal to itself.")
652652 })
653653
654654
655655
656656 @Callable(i)
657657 func claimAll (pools) = valueOrElse(isActive(), {
658658 func claimInv (claimTotal,pool) = {
659659 let claimAmount = {
660660 let @ = invoke(this, "claim", [pool], nil)
661661 if ($isInstanceOf(@, "Int"))
662662 then @
663663 else throw(($getType(@) + " couldn't be cast to Int"))
664664 }
665665 if ((claimAmount == claimAmount))
666666 then (claimTotal + claimAmount)
667667 else throw("Strict value is not equal to itself.")
668668 }
669669
670670 let claimTotal = {
671671 let $l = pools
672672 let $s = size($l)
673673 let $acc0 = 0
674674 func $f0_1 ($a,$i) = if (($i >= $s))
675675 then $a
676676 else claimInv($a, $l[$i])
677677
678678 func $f0_2 ($a,$i) = if (($i >= $s))
679679 then $a
680680 else throw("List size exceeds 60")
681681
682682 $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)
683683 }
684684 if ((claimTotal == 0))
685685 then throw("You have 0 available SWOP")
686686 else [ScriptTransfer(i.caller, claimTotal, SWOP)]
687687 })
688688
689689
690690
691691 @Callable(i)
692692 func claimAllAndStake (pools) = valueOrElse(isActive(), {
693693 func claimInv (claimTotal,pool) = {
694694 let claimAmount = {
695695 let @ = invoke(this, "claim", [pool], nil)
696696 if ($isInstanceOf(@, "Int"))
697697 then @
698698 else throw(($getType(@) + " couldn't be cast to Int"))
699699 }
700700 if ((claimAmount == claimAmount))
701701 then (claimTotal + claimAmount)
702702 else throw("Strict value is not equal to itself.")
703703 }
704704
705705 let claimTotal = {
706706 let $l = pools
707707 let $s = size($l)
708708 let $acc0 = 0
709709 func $f0_1 ($a,$i) = if (($i >= $s))
710710 then $a
711711 else claimInv($a, $l[$i])
712712
713713 func $f0_2 ($a,$i) = if (($i >= $s))
714714 then $a
715715 else throw("List size exceeds 60")
716716
717717 $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)
718718 }
719719 if ((claimTotal == 0))
720720 then throw("You have 0 available SWOP")
721721 else {
722722 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimTotal)])
723723 if ((stakeToGov == stakeToGov))
724724 then nil
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 })
728728
729729
730730
731731 @Callable(i)
732732 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
733733 then throw("Only voiting can call this function")
734734 else {
735- let $t03353333632 = claimCalc(pool, user)
736- let farmInterest = $t03353333632._1
737- let boostInterest = $t03353333632._2
738- let boostLPinterest = $t03353333632._3
739- let claimAmount = $t03353333632._4
740- let toTreasure = $t03353333632._5
735+ let $t03354033639 = claimCalc(pool, user)
736+ let farmInterest = $t03354033639._1
737+ let boostInterest = $t03354033639._2
738+ let boostLPinterest = $t03354033639._3
739+ let claimAmount = $t03354033639._4
740+ let toTreasure = $t03354033639._5
741741 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
742742 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPLastInterest), 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)]
743743 })
744744
745745
746746
747747 @Callable(i)
748748 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
749749 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
750750 else suspend("Paused by admin"))
751751
752752
753753
754754 @Callable(i)
755755 func activate () = valueOrElse(isAdminCall(i), if (active)
756756 then throw("DApp is already active")
757757 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
758758
759759
760760 @Verifier(tx)
761761 func verify () = match tx {
762762 case _ =>
763763 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
764764 then 1
765765 else 0
766766 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
767767 then 1
768768 else 0
769769 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
770770 then 1
771771 else 0
772772 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
773773 }
774774

github/deemru/w8io/873ac7e 
121.80 ms