tx · 6jWLsSCEiqv863AGbEtUcMNChrGXDasyZyWVvYS9mYbp

3MqQg3GcBjjk5727HxPKgQfqGQwWm6QA2yL:  -0.13400000 Waves

2022.09.15 17:47 [2230367] smart account 3MqQg3GcBjjk5727HxPKgQfqGQwWm6QA2yL > SELF 0.00000000 Waves

{ "type": 13, "id": "6jWLsSCEiqv863AGbEtUcMNChrGXDasyZyWVvYS9mYbp", "fee": 13400000, "feeAssetId": null, "timestamp": 1663253115514, "version": 2, "chainId": 84, "sender": "3MqQg3GcBjjk5727HxPKgQfqGQwWm6QA2yL", "senderPublicKey": "4AhS4PdxdW6j71mgHB4Xq7Eewk1rPdm57kDHAwQTTweK", "proofs": [ "5Bfqz9wrme7c9WG15fefNGoH7pNTjCaPCQbmKSc92qfh2pYVB2fzea99L5S8TxJTBXHVLefwTbw6vvifrz7eRdgQ", "5ji6VeGoDuwZHgoTnaTmJC3L3WqtRzMi5PBBL5SRHyKTAUe35qDPNyLt6ZFyk8BT9wqqkhFUMqBQUhJaxRH3YnrW" ], "script": "base64:BgJpCAISBAoCEQESBgoECAEBBBIECgIBBBIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBXgAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rU2hhcmVBc3NldElkAg5zaGFyZV9hc3NldF9pZAARa1NoYXJlQXNzZXRTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAEa0ZlZQIKY29tbWlzc2lvbgASa0RBcHBUaHJlc2hvbGRDb2VmAhFkQXBwVGhyZXNob2xkQ29lZgAMa1VTRE5BZGRyZXNzAhhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MACmtEaXNjb3VudHMCCWRpc2NvdW50cwAPa0Rpc2NvdW50VmFsdWVzAg9kaXNjb3VudF92YWx1ZXMADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQADWtGaXJzdEhhcnZlc3QCDWZpcnN0X2hhcnZlc3QAE2tGaXJzdEhhcnZlc3RIZWlnaHQCFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAtrU2hhcmVMaW1pdAIcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAALa0Jhc2VQZXJpb2QCC2Jhc2VfcGVyaW9kAA1rUGVyaW9kTGVuZ3RoAg1wZXJpb2RfbGVuZ3RoAAxrU3RhcnRIZWlnaHQCDHN0YXJ0X2hlaWdodAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDWtTaGFyZUFzc2V0SWQAC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU2hhcmVBc3NldFN1cHBseQAJZmVlU2NhbGU2AMCEPQADZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQRrRmVlAA1mZWVHb3Zlcm5hbmNlCQBrAwAoBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIEBHVzZXIEByRtYXRjaDAFCHVzZXJBZGRyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAXUFByRtYXRjaDAJAKUIAQUBdQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXUFByRtYXRjaDAFAXUJAAIBAhhVbmtub3cgdHlwZSBvZiB1c2VyIEFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICBQR1c2VyBQ5rVXNlclN3b3BJbkdvdgAABA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEF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ZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8ECnhwX3JlZHVjZWQIBQ0kdDAxMDY5OTEwNzYzAl8xBAVpbmRleAgFDSR0MDEwNjk5MTA3NjMCXzIEDHhwX3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMTMyNzExMzkzCQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTMyNzExMzkzAl8xBAtzdGFraW5nQWRkcggFDSR0MDExMzI3MTEzOTMCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDExNDc5MTE1NDUJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExNDc5MTE1NDUCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTE0NzkxMTU0NQJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExNzMyMTE4MzQJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExNzMyMTE4MzQCXzEEBGFkZHIIBQ0kdDAxMTczMjExODM0Al8yBAZwYXJhbXMIBQ0kdDAxMTczMjExODM0Al8zBAhwYXltZW50cwgFDSR0MDExNzMyMTE4MzQCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMjAxOTEyMTIyCQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMjAxOTEyMTIyAl8xBARhZGRyCAUNJHQwMTIwMTkxMjEyMgJfMgQGcGFyYW1zCAUNJHQwMTIwMTkxMjEyMgJfMwQIcGF5bWVudHMIBQ0kdDAxMjAxOTEyMTIyAl80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjczMzEyNzU4BQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjczMzEyNzU4Al8xBAFpCAUNJHQwMTI3MzMxMjc1OAJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOBAptYXhCYWxhbmNlCQCWAwEFC25ld0JhbGFuY2VzBAptaW5CYWxhbmNlCQCXAwEFC25ld0JhbGFuY2VzBAVyYXRpbwkAawMFCm1heEJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQptaW5CYWxhbmNlAwkAZgIFBXJhdGlvCQBoAgURZEFwcFRocmVzaG9sZENvZWYFDnRocmVzaG9sZFNjYWxlCQACAQI4TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQHAQpjaGVja0NvaW5zAQhhc3NldElkcwQFY29pbnMJALUJAgUIYXNzZXRJZHMCASwKAQljaGVja0NvaW4CBWVycm9yB2Fzc2V0SWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUHYXNzZXRJZAkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFB2Fzc2V0SWQECGRlY2ltYWxzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBWFzc2V0CQCsAgICC2Fzc2V0SW5mbzogBQdhc3NldElkCGRlY2ltYWxzAwkBAiE9AgUIZGVjaW1hbHMFCERFQ0lNQUxTCQACAQIOd3JvbmcgZGVjaW1hbHMHCgACJGwFBWNvaW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWNoZWNrQ29pbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8UA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQECGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgxmaXJzdEhhcnZlc3QDCQEBIQEJAJ4IAQUEdGhpcwkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQDCQBnAgAABQJfQQkAAgECFEFtcCBtdXN0IGJlIG11c3QgPiAwAwkAZwIAAAUSX2RBcHBUaHJlc2hvbGRDb2VmCQACAQIfZEFwcCBUaHJlc2hvbGQgQ29lZiBtdXN0IGJlID4gMAQJc2hhcmVOYW1lAgtzX011bHRpX1VTRAQQc2hhcmVEZXNjcmlwdGlvbgkArAICAkJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgTXVsdGlTdGFibGUgVVNEIHBvb2wgYXQgYWRkcmVzcyAJAKUIAQUEdGhpcwQKaXNzdWVUb2tlbgkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24AAAAGBgQHdG9rZW5JZAkAuAgBBQppc3N1ZVRva2VuAwkBCmNoZWNrQ29pbnMBBQhhc3NldElkcwkBBXRocm93AAQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQNtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8DCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMTcwNjYxNzA5NQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE3MDY2MTcwOTUCXzEEAWkIBQ0kdDAxNzA2NjE3MDk1Al8yBAFqCAUNJHQwMTcwNjYxNzA5NQJfMwMDCQBmAgUMcGF5bWVudHNTaXplBQFqCQAAAgkBDWdldFN0ckFzc2V0SWQBCAkAkQMCBQhwYXltZW50cwUBagdhc3NldElkBQdhc3NldElkBwkAlQoDCQDNCAIFC25ld0JhbGFuY2VzCQBkAgkAkQMCBQJ4cAUBaQgJAJEDAgUIcGF5bWVudHMFAWoGYW1vdW50CQBkAgUBaQABCQBkAgUBagABCQCVCgMJAM0IAgULbmV3QmFsYW5jZXMJAJEDAgUCeHAFAWkJAGQCBQFpAAEFAWoEDSR0MDE3MzE1MTc0MDEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDE3MzE1MTc0MDECXzEEAWsIBQ0kdDAxNzMxNTE3NDAxAl8yBA5wYXJzZWRQYXltZW50cwgFDSR0MDE3MzE1MTc0MDECXzMDCQBmAgUMcGF5bWVudHNTaXplBQ5wYXJzZWRQYXltZW50cwkAAgECF0luY29yZWN0IHBheW1lbnRzIG9yZGVyAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE3ODAyMTc4NDMFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNzgwMjE3ODQzAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTc4MDIxNzg0MwJfMgQBaQgFDSR0MDE3ODAyMTc4NDMCXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBANwbXQJAGUCBQpuZXdCYWxhbmNlCQCRAwIFAnhwBQFpBAZscEZlZXMJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxOTU0ODE5NjM2CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC2ludkJhbGFuY2VzCAUNJHQwMTk1NDgxOTYzNgJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE5NTQ4MTk2MzYCXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEOY2FsY01pbnRBbW91bnQCC25ld0JhbGFuY2VzBHVzZXIEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkAAAIFC3NoYXJlU3VwcGx5AAAJAJQKAgUDbmlsBQJEMQQCRDAJAQdnZXRETWVtAgUCeHAFA2FtcAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBHVzZXIKAQ9jYWxjSW52QmFsYW5jZXMCA2FjYwpuZXdCYWxhbmNlBA0kdDAyMDgyNTIwODUxBQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMjA4MjUyMDg1MQJfMQQBaQgFDSR0MDIwODI1MjA4NTECXzIEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzCQCUCgIJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAGQCBQFpAAEEDSR0MDIxNDUzMjE1MjMKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjSW52QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDIxNDUzMjE1MjMCXzEEAWsIBQ0kdDAyMTQ1MzIxNTIzAl8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMzU1ODIzNTg0BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjM1NTgyMzU4NAJfMQQBaQgFDSR0MDIzNTU4MjM1ODQCXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjM4MzUyMzg5NgoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjM4MzUyMzg5NgJfMQQBaQgFDSR0MDIzODM1MjM4OTYCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIFA19keQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwQHYWlyZHJvcAMJAGYCBQZscEZlZXMAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3Rva2VuT3V0QjU4BQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAzAgCBQJkeQkAzAgCBQt0b2tlbk91dEI1OAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEId2l0aGRyYXcBCm1pbkFtb3VudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECXBtdEFtb3VudAgJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyNTE4NzI1MjE1BQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyNTE4NzI1MjE1Al8xBAFpCAUNJHQwMjUxODcyNTIxNQJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFCXBtdEFtb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjU3MDUyNTc3MwoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDI1NzA1MjU3NzMCXzEEAWkIBQ0kdDAyNTcwNTI1NzczAl8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwDbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAgh3aXRoZHJhdwkAzAgCBQptaW5BbW91bnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgIIdG9rZW5PdXQJbWluQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnDG9yaWdpbkNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFCnBtdEFzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4ECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAnhwCQEDX3hwAAQNJHQwMjc3MzcyNzgxOQkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFCXBtdEFtb3VudAUIb3V0SW5kZXgIBQNtc2cMb3JpZ2luQ2FsbGVyBAJkeQgFDSR0MDI3NzM3Mjc4MTkCXzEEBmR5X2ZlZQgFDSR0MDI3NzM3Mjc4MTkCXzIDCQEGYXNzZXJ0AQkAZwIFAmR5BQltaW5BbW91bnQJAAIBAhhOb3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDmdvdmVybmFuY2VGZWVzCQBrAwUGZHlfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECmR5X2FuZF9mZWUJAGQCBQJkeQUGZHlfZmVlCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyODA3NzI4MTAzBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjgwNzcyODEwMwJfMQQBaQgFDSR0MDI4MDc3MjgxMDMCXzIDCQAAAgUBaQUIb3V0SW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUKZHlfYW5kX2ZlZQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDI4MjcwMjgzMzEKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDI4MjcwMjgzMzECXzEEAXYIBQ0kdDAyODI3MDI4MzMxAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMzAzNDgzMDM3NAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDMwMzQ4MzAzNzQCXzEEAWkIBQ0kdDAzMDM0ODMwMzc0Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARhrZWVwTGltaXRGb3JGaXJzdEhhcnZlc3QBCnNoYXJlTGltaXQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQTY2FsbFRha2VJbnRvQWNjb3VudAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAAACCAUDaW52CGZ1bmN0aW9uAhl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAURYWRtaW5QdWJLZXlJbnZva2UDAwUTY2FsbFRha2VJbnRvQWNjb3VudAUNc2lnbmVkQnlBZG1pbgcGBRNtdWx0aVNpZ25lZEJ5QWRtaW5zBRNtdWx0aVNpZ25lZEJ5QWRtaW5z7UbC3A==", "height": 2230367, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EJ3eZimZTcoh46BuCER4W8oFq92pkCzDVXAi8U8uF7Pi Next: 4FzvezCYuo6RJZyzVpca5geyJtLbDjCoz7SpGm6Ka1N6 Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kCause = "shutdown_cause"
2525
2626 let kShareAssetId = "share_asset_id"
2727
2828 let kShareAssetSupply = "share_asset_supply"
2929
3030 let kFee = "commission"
3131
3232 let kDAppThresholdCoef = "dAppThresholdCoef"
3333
3434 let kUSDNAddress = "staking_usdnnsbt_address"
3535
3636 let kDiscounts = "discounts"
3737
3838 let kDiscountValues = "discount_values"
3939
4040 let kUserSwopInGov = "_SWOP_amount"
4141
4242 let kFirstHarvest = "first_harvest"
4343
4444 let kFirstHarvestHeight = "first_harvest_height"
4545
4646 let kShareLimit = "share_limit_on_first_harvest"
4747
4848 let kBasePeriod = "base_period"
4949
5050 let kPeriodLength = "period_length"
5151
5252 let kStartHeight = "start_height"
5353
5454 let kAdminPubKey1 = "admin_pub_1"
5555
5656 let kAdminPubKey2 = "admin_pub_2"
5757
5858 let kAdminPubKey3 = "admin_pub_3"
5959
6060 let kAdminInvokePubKey = "admin_invoke_pub"
6161
6262 let kMoneyBoxAddress = "money_box_address"
6363
6464 let kGovAddress = "governance_address"
6565
6666 let kVotingAddress = "voting_address"
6767
6868 let kFarmingAddress = "farming_address"
6969
7070 let kLPFarmingAddress = "lp_farming"
7171
7272 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7373
7474 func getBase58FromOracle (key) = match getString(oracle, key) {
7575 case string: String =>
7676 fromBase58String(string)
7777 case nothing =>
7878 throw((key + "is empty"))
7979 }
8080
8181
8282 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8383
8484 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8585
8686 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8787
8888 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8989
9090 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
9191
9292 let govAddress = Address(getBase58FromOracle(kGovAddress))
9393
9494 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9595
9696 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9797
9898 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9999
100100 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
101101
102102 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
103103
104104 let stakingAssets = [toBase58String(USDN)]
105105
106106 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
107107
108108 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
109109
110110 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
111111
112112 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
113113
114114 let active = getBooleanValue(this, kActive)
115115
116116 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
117117
118118 let shareSupply = getIntegerValue(this, kShareAssetSupply)
119119
120120 let feeScale6 = 1000000
121121
122122 let fee = getIntegerValue(this, kFee)
123123
124124 let feeGovernance = fraction(40, feeScale6, 100)
125125
126126 let initial_A = getIntegerValue(this, "initial_A")
127127
128128 let future_A = getIntegerValue(this, "future_A")
129129
130130 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
131131
132132 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
133133
134134 let assetIds = split(getStringValue(this, kAssets), ",")
135135
136136 let nCoins = size(assetIds)
137137
138138 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
139139
140140
141141 func throwIsActive () = throw("DApp is already active")
142142
143143
144144 func isActive () = if (active)
145145 then unit
146146 else throw("DApp is inactive at this moment")
147147
148148
149149 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
150150 then unit
151151 else throw("Only admin can call this function")
152152
153153
154154 func isSelfCall (i) = if ((this == i.caller))
155155 then unit
156156 else throw("Only contract itself can call this function")
157157
158158
159159 let big2 = toBigInt(2)
160160
161161 let blockTimestamp = height
162162
163163 func assert (a) = if (a)
164164 then false
165165 else true
166166
167167
168168 func calculateFeeDiscount (userAddr) = {
169169 let user = match userAddr {
170170 case u: Address =>
171171 toString(u)
172172 case u: String =>
173173 u
174174 case _ =>
175175 throw("Unknow type of user Addr")
176176 }
177177 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
178178 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
179179 let discounts = split(getStringValue(oracle, kDiscounts), ",")
180180 if (if ((swopAmount >= parseIntValue(discountValues[0])))
181181 then (parseIntValue(discountValues[1]) > swopAmount)
182182 else false)
183183 then (feeScale6 - parseIntValue(discounts[0]))
184184 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
185185 then (parseIntValue(discountValues[2]) > swopAmount)
186186 else false)
187187 then (feeScale6 - parseIntValue(discounts[1]))
188188 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
189189 then (parseIntValue(discountValues[3]) > swopAmount)
190190 else false)
191191 then (feeScale6 - parseIntValue(discounts[2]))
192192 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
193193 then (parseIntValue(discountValues[4]) > swopAmount)
194194 else false)
195195 then (feeScale6 - parseIntValue(discounts[3]))
196196 else if ((swopAmount >= parseIntValue(discountValues[4])))
197197 then (feeScale6 - parseIntValue(discounts[4]))
198198 else feeScale6
199199 }
200200
201201
202202 func _A () = {
203203 let t1 = future_A_time
204204 let A1 = future_A
205205 if ((t1 > blockTimestamp))
206206 then {
207207 let A0 = initial_A
208208 let t0 = initial_A_time
209209 if ((A1 > A0))
210210 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
211211 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
212212 }
213213 else A1
214214 }
215215
216216
217217 func _xp () = {
218218 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
219219
220220 let $l = assetIds
221221 let $s = size($l)
222222 let $acc0 = nil
223223 func $f0_1 ($a,$i) = if (($i >= $s))
224224 then $a
225225 else assetBalances($a, $l[$i])
226226
227227 func $f0_2 ($a,$i) = if (($i >= $s))
228228 then $a
229229 else throw("List size exceeds 15")
230230
231231 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
232232 }
233233
234234
235235 func _xp_mem (xp) = xp
236236
237237
238238 func sumList (acc,element) = (acc + element)
239239
240240
241241 func get_D (xp,amp) = {
242242 let @ = invoke(this, "D", [xp, amp], nil)
243243 if ($isInstanceOf(@, "Int"))
244244 then @
245245 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
246246 }
247247
248248
249249 func get_D_internal (xp,amp) = {
250250 let S = {
251251 let $l = xp
252252 let $s = size($l)
253253 let $acc0 = 0
254254 func $f0_1 ($a,$i) = if (($i >= $s))
255255 then $a
256256 else sumList($a, $l[$i])
257257
258258 func $f0_2 ($a,$i) = if (($i >= $s))
259259 then $a
260260 else throw("List size exceeds 15")
261261
262262 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
263263 }
264264 if ((S == 0))
265265 then 0
266266 else {
267267 let Ann = (amp * nCoins)
268268 let AnnS = (toBigInt(Ann) * toBigInt(S))
269269 let Ann1 = toBigInt((Ann - 1))
270270 func Dproc (acc,i) = if ((acc._2 == true))
271271 then acc
272272 else {
273273 let Dprev = acc._1
274274 func D_PProc (D_P,i) = if ((nCoins > i))
275275 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
276276 else D_P
277277
278278 let D_P = {
279279 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
280280 let $s = size($l)
281281 let $acc0 = Dprev
282282 func $f1_1 ($a,$i) = if (($i >= $s))
283283 then $a
284284 else D_PProc($a, $l[$i])
285285
286286 func $f1_2 ($a,$i) = if (($i >= $s))
287287 then $a
288288 else throw("List size exceeds 15")
289289
290290 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
291291 }
292292 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
293293 if ((D > Dprev))
294294 then if ((1 >= toInt((D - Dprev))))
295295 then $Tuple2(D, true)
296296 else $Tuple2(D, false)
297297 else if ((1 >= toInt((Dprev - D))))
298298 then $Tuple2(D, true)
299299 else $Tuple2(D, false)
300300 }
301301
302302 let $t068406952 = {
303303 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
304304 let $s = size($l)
305305 let $acc0 = $Tuple2(toBigInt(S), false)
306306 func $f1_1 ($a,$i) = if (($i >= $s))
307307 then $a
308308 else Dproc($a, $l[$i])
309309
310310 func $f1_2 ($a,$i) = if (($i >= $s))
311311 then $a
312312 else throw("List size exceeds 15")
313313
314314 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
315315 }
316316 let D = $t068406952._1
317317 let finished = $t068406952._2
318318 if ((finished == false))
319319 then throw(("get_D() not finished with " + toString(D)))
320320 else toInt(D)
321321 }
322322 }
323323
324324
325325 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
326326
327327
328328 func getY (in,out,x,xp_) = if (assert((in != out)))
329329 then throw("same coin")
330330 else if (assert(if ((out >= 0))
331331 then (in >= 0)
332332 else false))
333333 then throw("below zero")
334334 else if (assert(if ((nCoins > out))
335335 then (nCoins > in)
336336 else false))
337337 then throw("above N_COINS")
338338 else {
339339 let amp = _A()
340340 let D = get_D(xp_, amp)
341341 let Ann = (amp * nCoins)
342342 func S_c (acc,i) = {
343343 let $t075237540 = acc
344344 let S_ = $t075237540._1
345345 let c = $t075237540._2
346346 let x_ = if ((in == i))
347347 then x
348348 else xp_[i]
349349 if (if ((i != out))
350350 then (nCoins > i)
351351 else false)
352352 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
353353 else $Tuple2(S_, c)
354354 }
355355
356356 let $t077487849 = {
357357 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
358358 let $s = size($l)
359359 let $acc0 = $Tuple2(0, toBigInt(D))
360360 func $f0_1 ($a,$i) = if (($i >= $s))
361361 then $a
362362 else S_c($a, $l[$i])
363363
364364 func $f0_2 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else throw("List size exceeds 15")
367367
368368 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
369369 }
370370 let S_ = $t077487849._1
371371 let c_ = $t077487849._2
372372 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
373373 let bD = toBigInt(((S_ + (D / Ann)) - D))
374374 func y_proc (acc,_i) = if ((acc._2 == true))
375375 then acc
376376 else {
377377 let y_prev = acc._1
378378 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
379379 if ((y > y_prev))
380380 then if ((1 >= toInt((y - y_prev))))
381381 then $Tuple2(y, true)
382382 else $Tuple2(y, false)
383383 else if ((1 >= toInt((y_prev - y))))
384384 then $Tuple2(y, true)
385385 else $Tuple2(y, false)
386386 }
387387
388388 let $t083318448 = {
389389 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
390390 let $s = size($l)
391391 let $acc0 = $Tuple2(toBigInt(D), false)
392392 func $f1_1 ($a,$i) = if (($i >= $s))
393393 then $a
394394 else y_proc($a, $l[$i])
395395
396396 func $f1_2 ($a,$i) = if (($i >= $s))
397397 then $a
398398 else throw("List size exceeds 16")
399399
400400 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
401401 }
402402 let y = $t083318448._1
403403 let finished = $t083318448._2
404404 if ((finished == false))
405405 then throw(("getY() not finished with " + toString(y)))
406406 else toInt(y)
407407 }
408408
409409
410410 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
411411 then throw("i below zero")
412412 else if (assert((nCoins > in)))
413413 then throw("i above N_COINS")
414414 else {
415415 let Ann = (A_ * nCoins)
416416 func S_c (acc,i) = {
417417 let $t088278844 = acc
418418 let S_ = $t088278844._1
419419 let c = $t088278844._2
420420 let x_ = if (if ((in != i))
421421 then (nCoins > i)
422422 else false)
423423 then xp[i]
424424 else 0
425425 if (if ((nCoins > i))
426426 then (in != i)
427427 else false)
428428 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
429429 else $Tuple2(S_, c)
430430 }
431431
432432 let $t090649165 = {
433433 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
434434 let $s = size($l)
435435 let $acc0 = $Tuple2(0, toBigInt(D))
436436 func $f0_1 ($a,$i) = if (($i >= $s))
437437 then $a
438438 else S_c($a, $l[$i])
439439
440440 func $f0_2 ($a,$i) = if (($i >= $s))
441441 then $a
442442 else throw("List size exceeds 15")
443443
444444 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
445445 }
446446 let S_ = $t090649165._1
447447 let c_ = $t090649165._2
448448 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
449449 let bD = toBigInt(((S_ + (D / Ann)) - D))
450450 func y_D_proc (acc,i) = if ((acc._2 == true))
451451 then acc
452452 else {
453453 let y_prev = acc._1
454454 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
455455 if ((y > y_prev))
456456 then if ((1 >= toInt((y - y_prev))))
457457 then $Tuple2(y, true)
458458 else $Tuple2(y, false)
459459 else if ((1 >= toInt((y_prev - y))))
460460 then $Tuple2(y, true)
461461 else $Tuple2(y, false)
462462 }
463463
464464 let $t096489767 = {
465465 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
466466 let $s = size($l)
467467 let $acc0 = $Tuple2(toBigInt(D), false)
468468 func $f1_1 ($a,$i) = if (($i >= $s))
469469 then $a
470470 else y_D_proc($a, $l[$i])
471471
472472 func $f1_2 ($a,$i) = if (($i >= $s))
473473 then $a
474474 else throw("List size exceeds 16")
475475
476476 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
477477 }
478478 let y = $t096489767._1
479479 let finished = $t096489767._2
480480 if ((finished == false))
481481 then throw(("get_y_D() not finished with " + toString(y)))
482482 else toInt(y)
483483 }
484484
485485
486486 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
487487 let feeDiscount = calculateFeeDiscount(caller)
488488 let amp = _A()
489489 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
490490 let total_supply = shareSupply
491491 let D0 = get_D(xp, amp)
492492 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
493493 let new_y = get_y_D(amp, i, xp, D1)
494494 let dy_0 = (xp[i] - new_y)
495495 func xp_reduced_proc (acc,xp_j) = {
496496 let $t01040810437 = acc
497497 let xp_reduced = $t01040810437._1
498498 let index = $t01040810437._2
499499 let dx_expected = if ((index == i))
500500 then (fraction(xp_j, D1, D0) - new_y)
501501 else (xp_j - fraction(xp_j, D1, D0))
502502 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
503503 }
504504
505505 let $t01069910763 = {
506506 let $l = xp
507507 let $s = size($l)
508508 let $acc0 = $Tuple2(nil, 0)
509509 func $f0_1 ($a,$i) = if (($i >= $s))
510510 then $a
511511 else xp_reduced_proc($a, $l[$i])
512512
513513 func $f0_2 ($a,$i) = if (($i >= $s))
514514 then $a
515515 else throw("List size exceeds 15")
516516
517517 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
518518 }
519519 let xp_reduced = $t01069910763._1
520520 let index = $t01069910763._2
521521 let xp_reduced_i = xp_reduced[i]
522522 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
523523 $Tuple2(dy, (dy_0 - dy))
524524 }
525525
526526
527527 func getStrAssetId (assetId) = match assetId {
528528 case id: ByteVector =>
529529 toBase58String(id)
530530 case waves: Unit =>
531531 "WAVES"
532532 case _ =>
533533 throw("Match error")
534534 }
535535
536536
537537 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
538538 then $Tuple2("lockNeutrino", stakingUSDNAddress)
539539 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
540540
541541
542542 func calcStakingParams (stake,amount,assetId) = if (stake)
543543 then {
544544 let $t01132711393 = calcStakingFuncAndAddres(stake, assetId)
545545 let call = $t01132711393._1
546546 let stakingAddr = $t01132711393._2
547547 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
548548 }
549549 else {
550550 let $t01147911545 = calcStakingFuncAndAddres(stake, assetId)
551551 let call = $t01147911545._1
552552 let stakingAddr = $t01147911545._2
553553 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
554554 }
555555
556556
557557 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
558558 then {
559559 let $t01173211834 = calcStakingParams(true, amount, fromBase58String(assetIdString))
560560 let call = $t01173211834._1
561561 let addr = $t01173211834._2
562562 let params = $t01173211834._3
563563 let payments = $t01173211834._4
564564 invoke(addr, call, params, payments)
565565 }
566566 else 0
567567
568568
569569 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
570570 then {
571571 let $t01201912122 = calcStakingParams(false, amount, fromBase58String(assetIdString))
572572 let call = $t01201912122._1
573573 let addr = $t01201912122._2
574574 let params = $t01201912122._3
575575 let payments = $t01201912122._4
576576 invoke(addr, call, params, payments)
577577 }
578578 else 0
579579
580580
581581 func stakedAmount (assetId) = {
582582 let stakedAmountCalculated = match assetId {
583583 case aId: ByteVector =>
584584 if ((aId == USDN))
585585 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
586586 else 0
587587 case _: Unit =>
588588 0
589589 case _ =>
590590 throw("Match error")
591591 }
592592 match stakedAmountCalculated {
593593 case i: Int =>
594594 i
595595 case _ =>
596596 0
597597 }
598598 }
599599
600600
601601 func checkSuspicious () = {
602602 let contractBalances = _xp()
603603 func checkBalance (acc,assetId) = {
604604 let $t01273312758 = acc
605605 let suspicious = $t01273312758._1
606606 let i = $t01273312758._2
607607 if (suspicious)
608608 then $Tuple2(suspicious, i)
609609 else {
610610 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
611611 if ((contractBalances[i] > aBalance))
612612 then $Tuple2(true, i)
613613 else $Tuple2(false, (i + 1))
614614 }
615615 }
616616
617617 let $l = assetIds
618618 let $s = size($l)
619619 let $acc0 = $Tuple2(false, 0)
620620 func $f0_1 ($a,$i) = if (($i >= $s))
621621 then $a
622622 else checkBalance($a, $l[$i])
623623
624624 func $f0_2 ($a,$i) = if (($i >= $s))
625625 then $a
626626 else throw("List size exceeds 15")
627627
628628 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
629629 }
630630
631631
632632 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
633633
634634
635635 func returnPayments (caller,payments) = {
636636 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
637637
638638 let $l = payments
639639 let $s = size($l)
640640 let $acc0 = nil
641641 func $f0_1 ($a,$i) = if (($i >= $s))
642642 then $a
643643 else parsePayments($a, $l[$i])
644644
645645 func $f0_2 ($a,$i) = if (($i >= $s))
646646 then $a
647647 else throw("List size exceeds 15")
648648
649649 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
650650 }
651651
652652
653653 func checkDAppThreshold (newBalances) = {
654654 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
655655 let thresholdScale = 10000
656656 let maxBalance = max(newBalances)
657657 let minBalance = min(newBalances)
658658 let ratio = fraction(maxBalance, thresholdScale, minBalance)
659659 if ((ratio > (dAppThresholdCoef * thresholdScale)))
660660 then throw("New balance in assets of the DApp is less than threshold")
661661 else false
662662 }
663663
664664
665665 func checkCoins (assetIds) = {
666666 let coins = split(assetIds, ",")
667667 func checkCoin (error,assetId) = {
668668 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
669669 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
670670 if ((decimals != DECIMALS))
671671 then throw("wrong decimals")
672672 else false
673673 }
674674
675675 let $l = coins
676676 let $s = size($l)
677677 let $acc0 = false
678678 func $f0_1 ($a,$i) = if (($i >= $s))
679679 then $a
680680 else checkCoin($a, $l[$i])
681681
682682 func $f0_2 ($a,$i) = if (($i >= $s))
683683 then $a
684684 else throw("List size exceeds 15")
685685
686686 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
687687 }
688688
689689
690690 @Callable(msg)
691691 func D (xp,amp) = {
692692 let D = get_D_internal(xp, amp)
693693 $Tuple2([IntegerEntry("D", D)], D)
694694 }
695695
696696
697697
698698 @Callable(msg)
699699 func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
700700 then throw("Already initialized")
701701 else if ((0 >= _A))
702702 then throw("Amp must be must > 0")
703703 else if ((0 >= _dAppThresholdCoef))
704704 then throw("dApp Threshold Coef must be > 0")
705705 else {
706706 let shareName = "s_Multi_USD"
707707 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
708708 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
709709 let tokenId = calculateAssetId(issueToken)
710710 if (checkCoins(assetIds))
711711 then throw()
712712 else {
713713 let baseEntry = [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
714714 if (firstHarvest)
715715 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
716716 else baseEntry
717717 }
718718 }
719719
720720
721721
722722 @Callable(msg)
723723 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
724724 let amp = _A()
725725 let xp = _xp()
726726 let D0 = if ((shareSupply == 0))
727727 then 0
728728 else getDMem(xp, amp)
729729 let payments = msg.payments
730730 let paymentsSize = size(payments)
731731 func validPayments (n) = if ((paymentsSize > nCoins))
732732 then throw(("payments size > " + toString(nCoins)))
733733 else if ((1 > paymentsSize))
734734 then throw("payments size < 1")
735735 else if (if ((shareSupply == 0))
736736 then (nCoins != paymentsSize)
737737 else false)
738738 then throw("initial deposit requires all coins")
739739 else {
740740 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
741741 then true
742742 else throw("Invalid asset in payment")
743743
744744 let $l = payments
745745 let $s = size($l)
746746 let $acc0 = false
747747 func $f0_1 ($a,$i) = if (($i >= $s))
748748 then $a
749749 else paymantValid($a, $l[$i])
750750
751751 func $f0_2 ($a,$i) = if (($i >= $s))
752752 then $a
753753 else throw("List size exceeds 15")
754754
755755 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
756756 }
757757
758758 if (!(validPayments(paymentsSize)))
759759 then throw()
760760 else {
761761 let suspicious = checkSuspicious()
762762 if (suspicious._1)
763763 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
764764 else {
765765 func parsePayments (acc,assetId) = {
766766 let $t01706617095 = acc
767767 let newBalances = $t01706617095._1
768768 let i = $t01706617095._2
769769 let j = $t01706617095._3
770770 if (if ((paymentsSize > j))
771771 then (getStrAssetId(payments[j].assetId) == assetId)
772772 else false)
773773 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
774774 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
775775 }
776776
777777 let $t01731517401 = {
778778 let $l = assetIds
779779 let $s = size($l)
780780 let $acc0 = $Tuple3(nil, 0, 0)
781781 func $f0_1 ($a,$i) = if (($i >= $s))
782782 then $a
783783 else parsePayments($a, $l[$i])
784784
785785 func $f0_2 ($a,$i) = if (($i >= $s))
786786 then $a
787787 else throw("List size exceeds 15")
788788
789789 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
790790 }
791791 let newBalances = $t01731517401._1
792792 let k = $t01731517401._2
793793 let parsedPayments = $t01731517401._3
794794 if ((paymentsSize > parsedPayments))
795795 then throw("Incorect payments order")
796796 else if (checkDAppThreshold(newBalances))
797797 then throw()
798798 else {
799799 let D1 = getDMem(newBalances, amp)
800800 if (assert((D1 > D0)))
801801 then throw("D1 > D0")
802802 else {
803803 let feeDiscount = calculateFeeDiscount(msg.caller)
804804 func calcScriptActions (acc,newBalance) = {
805805 let $t01780217843 = acc
806806 let invBalances = $t01780217843._1
807807 let scriptActions = $t01780217843._2
808808 let i = $t01780217843._3
809809 if ((shareSupply > 0))
810810 then {
811811 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
812812 let fees = {
813813 let idealBalance = fraction(D1, xp[i], D0)
814814 let difference = if ((idealBalance > newBalance))
815815 then (idealBalance - newBalance)
816816 else (newBalance - idealBalance)
817817 fraction(_fee, difference, feeScale6)
818818 }
819819 let governanceFees = fraction(fees, feeGovernance, feeScale6)
820820 let finalBalance = (newBalance - fees)
821821 let invariantBalance = (newBalance - fees)
822822 let pmt = (newBalance - xp[i])
823823 let lpFees = (fees - governanceFees)
824824 let inv = if ((pmt > 0))
825825 then stake((pmt - fees), assetIds[i])
826826 else unstake(fees, assetIds[i])
827827 if ((inv == inv))
828828 then {
829829 let airdrop = if ((lpFees > 0))
830830 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
831831 else 0
832832 if ((airdrop == airdrop))
833833 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
834834 else throw("Strict value is not equal to itself.")
835835 }
836836 else throw("Strict value is not equal to itself.")
837837 }
838838 else {
839839 let inv = stake(newBalance, assetIds[i])
840840 if ((inv == inv))
841841 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
842842 else throw("Strict value is not equal to itself.")
843843 }
844844 }
845845
846846 let $t01954819636 = {
847847 let $l = newBalances
848848 let $s = size($l)
849849 let $acc0 = $Tuple3(nil, nil, 0)
850850 func $f1_1 ($a,$i) = if (($i >= $s))
851851 then $a
852852 else calcScriptActions($a, $l[$i])
853853
854854 func $f1_2 ($a,$i) = if (($i >= $s))
855855 then $a
856856 else throw("List size exceeds 15")
857857
858858 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
859859 }
860860 let invBalances = $t01954819636._1
861861 let scriptActions = $t01954819636._2
862862 let D2 = getDMem(invBalances, amp)
863863 let mint_amount = if ((shareSupply == 0))
864864 then D1
865865 else fraction(shareSupply, (D2 - D0), D0)
866866 if (assert((mint_amount >= minMintAmount)))
867867 then throw("Slippage screwed you")
868868 else if (stakeFarming)
869869 then {
870870 let re = invoke(this, "reissueShare", [mint_amount], nil)
871871 if ((re == re))
872872 then {
873873 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
874874 if ((s == s))
875875 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
876876 else throw("Strict value is not equal to itself.")
877877 }
878878 else throw("Strict value is not equal to itself.")
879879 }
880880 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
881881 }
882882 }
883883 }
884884 }
885885 })
886886
887887
888888
889889 @Callable(msg)
890890 func calcMintAmount (newBalances,user) = {
891891 let amp = _A()
892892 let xp = _xp()
893893 let D1 = getDMem(newBalances, amp)
894894 if ((shareSupply == 0))
895895 then $Tuple2(nil, D1)
896896 else {
897897 let D0 = getDMem(xp, amp)
898898 let feeDiscount = calculateFeeDiscount(user)
899899 func calcInvBalances (acc,newBalance) = {
900900 let $t02082520851 = acc
901901 let invBalances = $t02082520851._1
902902 let i = $t02082520851._2
903903 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
904904 let fees = {
905905 let idealBalance = fraction(D1, xp[i], D0)
906906 let difference = if ((idealBalance > newBalance))
907907 then (idealBalance - newBalance)
908908 else (newBalance - idealBalance)
909909 fraction(_fee, difference, feeScale6)
910910 }
911911 let invariantBalance = (newBalance - fees)
912912 $Tuple2((invBalances :+ invariantBalance), (i + 1))
913913 }
914914
915915 let $t02145321523 = {
916916 let $l = newBalances
917917 let $s = size($l)
918918 let $acc0 = $Tuple2(nil, 0)
919919 func $f0_1 ($a,$i) = if (($i >= $s))
920920 then $a
921921 else calcInvBalances($a, $l[$i])
922922
923923 func $f0_2 ($a,$i) = if (($i >= $s))
924924 then $a
925925 else throw("List size exceeds 15")
926926
927927 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
928928 }
929929 let invBalances = $t02145321523._1
930930 let k = $t02145321523._2
931931 let D2 = getDMem(invBalances, amp)
932932 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
933933 $Tuple2(nil, mintAmount)
934934 }
935935 }
936936
937937
938938
939939 @Callable(msg)
940940 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
941941
942942
943943
944944 @Callable(msg)
945945 func getDy (assetFrom,assetTo,dx,userAddress) = {
946946 let xp = _xp()
947947 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
948948 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
949949 let x = (xp[fromIndex] + dx)
950950 let y = getY(fromIndex, toIndex, x, xp)
951951 let dy = ((xp[toIndex] - y) - 1)
952952 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
953953 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
954954 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
955955 }
956956
957957
958958
959959 @Callable(msg)
960960 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
961961 then throw("size(payments) != 1")
962962 else {
963963 let suspicious = checkSuspicious()
964964 if (suspicious._1)
965965 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
966966 else {
967967 let payment = msg.payments[0]
968968 let tokenIn = getStrAssetId(payment.assetId)
969969 let tokenOutB58 = fromBase58String(tokenOut)
970970 let dx = payment.amount
971971 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
972972 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
973973 let xp = _xp()
974974 let x = (xp[fromIndex] + dx)
975975 let y = getY(fromIndex, toIndex, x, xp)
976976 let _dy = ((xp[toIndex] - y) - 1)
977977 let feeDiscount = calculateFeeDiscount(msg.caller)
978978 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
979979 let dy = (_dy - _fee)
980980 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
981981 if (assert((dy >= min_dy)))
982982 then throw("Exchange resulted in fewer coins than expected")
983983 else {
984984 func makeNewBalances (acc,tokenBalance) = {
985985 let $t02355823584 = acc
986986 let newBalances = $t02355823584._1
987987 let i = $t02355823584._2
988988 if ((i == fromIndex))
989989 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
990990 else if ((i == toIndex))
991991 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
992992 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
993993 }
994994
995995 let $t02383523896 = {
996996 let $l = xp
997997 let $s = size($l)
998998 let $acc0 = $Tuple2(nil, 0)
999999 func $f0_1 ($a,$i) = if (($i >= $s))
10001000 then $a
10011001 else makeNewBalances($a, $l[$i])
10021002
10031003 func $f0_2 ($a,$i) = if (($i >= $s))
10041004 then $a
10051005 else throw("List size exceeds 15")
10061006
10071007 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10081008 }
10091009 let newBalances = $t02383523896._1
10101010 let i = $t02383523896._2
10111011 if (checkDAppThreshold(newBalances))
10121012 then throw()
10131013 else {
10141014 let s = stake(payment.amount, getStrAssetId(payment.assetId))
10151015 if ((s == s))
10161016 then {
10171017 let us = unstake(_dy, tokenOut)
10181018 if ((us == us))
10191019 then {
10201020 let lpFees = (_fee - governanceFees)
10211021 let airdrop = if ((lpFees > 0))
10221022 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
10231023 else 0
10241024 if ((airdrop == airdrop))
10251025 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
10261026 else throw("Strict value is not equal to itself.")
10271027 }
10281028 else throw("Strict value is not equal to itself.")
10291029 }
10301030 else throw("Strict value is not equal to itself.")
10311031 }
10321032 }
10331033 }
10341034 })
10351035
10361036
10371037
10381038 @Callable(msg)
10391039 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10401040 then throw("size(payments) != 1")
10411041 else {
10421042 let pmtAmount = msg.payments[0].amount
10431043 let pmtAssetId = msg.payments[0].assetId
10441044 if ((shareAssetId != pmtAssetId))
10451045 then throw("unknown payment token")
10461046 else {
10471047 let suspicious = checkSuspicious()
10481048 if (suspicious._1)
10491049 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10501050 else {
10511051 func calcScriptActions (acc,balance) = {
10521052 let $t02518725215 = acc
10531053 let scriptActions = $t02518725215._1
10541054 let i = $t02518725215._2
10551055 let wAmount = fraction(balance, pmtAmount, shareSupply)
10561056 if (assert((wAmount >= minAmounts[i])))
10571057 then throw("Withdrawal resulted in fewer coins than expected")
10581058 else {
10591059 let us = unstake(wAmount, assetIds[i])
10601060 if ((us == us))
10611061 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
10621062 else throw("Strict value is not equal to itself.")
10631063 }
10641064 }
10651065
10661066 let $t02570525773 = {
10671067 let $l = _xp()
10681068 let $s = size($l)
10691069 let $acc0 = $Tuple2(nil, 0)
10701070 func $f0_1 ($a,$i) = if (($i >= $s))
10711071 then $a
10721072 else calcScriptActions($a, $l[$i])
10731073
10741074 func $f0_2 ($a,$i) = if (($i >= $s))
10751075 then $a
10761076 else throw("List size exceeds 15")
10771077
10781078 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10791079 }
10801080 let scriptActions = $t02570525773._1
10811081 let i = $t02570525773._2
10821082 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10831083 }
10841084 }
10851085 })
10861086
10871087
10881088
10891089 @Callable(msg)
10901090 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10911091 then throw("Unlock amount must be positive")
10921092 else {
10931093 let suspicious = checkSuspicious()
10941094 if (suspicious._1)
10951095 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10961096 else {
10971097 let pmtAmount = if ((size(msg.payments) > 0))
10981098 then if ((size(msg.payments) != 1))
10991099 then throw("size(payments) != 1")
11001100 else {
11011101 let pmtAssetId = msg.payments[0].assetId
11021102 if ((shareAssetId != pmtAssetId))
11031103 then throw("unknown payment token")
11041104 else msg.payments[0].amount
11051105 }
11061106 else 0
11071107 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11081108 if ((unlock == unlock))
11091109 then {
11101110 let withdrawAmount = (pmtAmount + unlockAmount)
11111111 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
11121112 if ((inv == inv))
11131113 then nil
11141114 else throw("Strict value is not equal to itself.")
11151115 }
11161116 else throw("Strict value is not equal to itself.")
11171117 }
11181118 })
11191119
11201120
11211121
11221122 @Callable(msg)
11231123 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
11241124 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11251125 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
11261126 }
11271127
11281128
11291129
11301130 @Callable(msg)
11311131 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
11321132 then throw("size(payments) != 1")
11331133 else {
11341134 let suspicious = checkSuspicious()
11351135 if (suspicious._1)
11361136 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
11371137 else {
11381138 let pmtAmount = msg.payments[0].amount
11391139 let pmtAssetId = msg.payments[0].assetId
11401140 if ((pmtAssetId != shareAssetId))
11411141 then throw("unknown token")
11421142 else {
11431143 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11441144 let tokenOutB58 = fromBase58String(tokenOut)
11451145 let xp = _xp()
11461146 let $t02773727819 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
11471147 let dy = $t02773727819._1
11481148 let dy_fee = $t02773727819._2
11491149 if (assert((dy >= minAmount)))
11501150 then throw("Not enough coins removed")
11511151 else {
11521152 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
11531153 let dy_and_fee = (dy + dy_fee)
11541154 func makeNewBalances (acc,tokenBalance) = {
11551155 let $t02807728103 = acc
11561156 let newBalances = $t02807728103._1
11571157 let i = $t02807728103._2
11581158 if ((i == outIndex))
11591159 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
11601160 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11611161 }
11621162
11631163 let $t02827028331 = {
11641164 let $l = xp
11651165 let $s = size($l)
11661166 let $acc0 = $Tuple2(nil, 0)
11671167 func $f0_1 ($a,$i) = if (($i >= $s))
11681168 then $a
11691169 else makeNewBalances($a, $l[$i])
11701170
11711171 func $f0_2 ($a,$i) = if (($i >= $s))
11721172 then $a
11731173 else throw("List size exceeds 15")
11741174
11751175 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
11761176 }
11771177 let newBalances = $t02827028331._1
11781178 let v = $t02827028331._2
11791179 if (checkDAppThreshold(newBalances))
11801180 then throw()
11811181 else {
11821182 let us = unstake(dy_and_fee, tokenOut)
11831183 if ((us == us))
11841184 then {
11851185 let lpFees = (dy_fee - governanceFees)
11861186 let airdrop = if ((lpFees > 0))
11871187 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11881188 else 0
11891189 if ((airdrop == airdrop))
11901190 then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
11911191 else throw("Strict value is not equal to itself.")
11921192 }
11931193 else throw("Strict value is not equal to itself.")
11941194 }
11951195 }
11961196 }
11971197 }
11981198 })
11991199
12001200
12011201
12021202 @Callable(msg)
12031203 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
12041204 then throw("Unlock amount must be positive")
12051205 else {
12061206 let suspicious = checkSuspicious()
12071207 if (suspicious._1)
12081208 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
12091209 else {
12101210 let pmtAmount = if ((size(msg.payments) > 0))
12111211 then if ((size(msg.payments) != 1))
12121212 then throw("size(payments) != 1")
12131213 else {
12141214 let pmtAssetId = msg.payments[0].assetId
12151215 if ((shareAssetId != pmtAssetId))
12161216 then throw("unknown payment token")
12171217 else msg.payments[0].amount
12181218 }
12191219 else 0
12201220 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
12211221 if ((unlock == unlock))
12221222 then {
12231223 let withdrawAmount = (pmtAmount + unlockAmount)
12241224 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
12251225 if ((inv == inv))
12261226 then nil
12271227 else throw("Strict value is not equal to itself.")
12281228 }
12291229 else throw("Strict value is not equal to itself.")
12301230 }
12311231 })
12321232
12331233
12341234
12351235 @Callable(msg)
12361236 func A () = $Tuple2(nil, _A())
12371237
12381238
12391239
12401240 @Callable(msg)
12411241 func getVirtualPrice () = {
12421242 let D = get_D(_xp(), _A())
12431243 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12441244 }
12451245
12461246
12471247
12481248 @Callable(msg)
12491249 func calcTokenAmount (amounts,deposit) = {
12501250 let amp = _A()
12511251 let balances = _xp()
12521252 let D0 = getDMem(balances, amp)
12531253 func calcNewBalances (acc,balance) = {
12541254 let $t03034830374 = acc
12551255 let newBalances = $t03034830374._1
12561256 let i = $t03034830374._2
12571257 let newBalance = (balance + (if (deposit)
12581258 then amounts[i]
12591259 else -(amounts[i])))
12601260 $Tuple2((newBalances :+ newBalance), (i + 1))
12611261 }
12621262
12631263 let newBalances = ( let $l = balances
12641264 let $s = size($l)
12651265 let $acc0 = $Tuple2(nil, 0)
12661266 func $f0_1 ($a,$i) = if (($i >= $s))
12671267 then $a
12681268 else calcNewBalances($a, $l[$i])
12691269
12701270 func $f0_2 ($a,$i) = if (($i >= $s))
12711271 then $a
12721272 else throw("List size exceeds 15")
12731273
12741274 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
12751275 let D1 = getDMem(newBalances, amp)
12761276 let diff = if (deposit)
12771277 then (D1 - D0)
12781278 else (D0 - D1)
12791279 $Tuple2(nil, fraction(diff, shareSupply, D0))
12801280 }
12811281
12821282
12831283
12841284 @Callable(msg)
12851285 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12861286 then throw("too often")
12871287 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12881288 then throw("insufficient time")
12891289 else {
12901290 let _initial_A = _A()
12911291 if (assert(if ((_futureA > 0))
12921292 then (MAX_A > _futureA)
12931293 else false))
12941294 then throw("out of base range")
12951295 else if (assert(if (if ((_futureA >= _initial_A))
12961296 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12971297 else false)
12981298 then true
12991299 else if ((_initial_A > _futureA))
13001300 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
13011301 else false))
13021302 then throw("out of range")
13031303 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
13041304 }))
13051305
13061306
13071307
13081308 @Callable(msg)
13091309 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13101310 let currentA = _A()
13111311 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13121312 }))
13131313
13141314
13151315
13161316 @Callable(msg)
13171317 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13181318 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13191319 else suspend("Paused by admin"))
13201320
13211321
13221322
13231323 @Callable(msg)
13241324 func activate () = valueOrElse(isAdminCall(msg), if (active)
13251325 then throwIsActive()
13261326 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13271327
13281328
13291329
13301330 @Callable(msg)
13311331 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
13321332
13331333
13341334 @Verifier(tx)
13351335 func verify () = {
13361336 let multiSignedByAdmins = {
13371337 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13381338 then 1
13391339 else 0
13401340 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13411341 then 1
13421342 else 0
13431343 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13441344 then 1
13451345 else 0
13461346 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13471347 }
13481348 match tx {
13491349 case inv: InvokeScriptTransaction =>
13501350 let callTakeIntoAccount = if ((inv.dApp == this))
13511351 then (inv.function == "takeIntoAccountExtraFunds")
13521352 else false
13531353 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13541354 then true
13551355 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13561356 then true
13571357 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13581358 then true
13591359 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13601360 if (if (callTakeIntoAccount)
13611361 then signedByAdmin
13621362 else false)
13631363 then true
13641364 else multiSignedByAdmins
13651365 case _ =>
13661366 multiSignedByAdmins
13671367 }
13681368 }
13691369

github/deemru/w8io/c3f4982 
104.24 ms