tx · 6gHBgENsotbG5F4UtyAVR6rPs49dpK4euuHh7AUaovPz

3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5:  -0.14000000 Waves

2022.11.16 13:42 [2319559] smart account 3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5 > SELF 0.00000000 Waves

{ "type": 13, "id": "6gHBgENsotbG5F4UtyAVR6rPs49dpK4euuHh7AUaovPz", "fee": 14000000, "feeAssetId": null, "timestamp": 1668595358404, "version": 2, "chainId": 84, "sender": "3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5", "senderPublicKey": "FEnkfXnQZkk1FmjhH6QZqyK2taN6ngnZBexevKxouLUM", "proofs": [ "2VLMpBbZxbtxw19hE47NK4jYL1YsTfW3BE7pAY61CQPc14H6hmcwE1HmbeEBGHRJRHfJWHYK29vgecCG3G6XQiLT", "3eNLr6MLvyS2ZrpqeUGUc22mwnQaDCXfMJbFeecrTyKwdWvA8axvoagqd7Do4SzHHSZnvauKb4sgnGovKdMJtwqG" ], "script": "base64:BgJKCAISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERJMAAd2ZXJzaW9uAgUxLjAuMAAIa1ZlcnNpb24CB3ZlcnNpb24AB2tBY3RpdmUCBmFjdGl2ZQAJa0Fzc2V0SWRBAgpBX2Fzc2V0X2lkAAlrQXNzZXRJZEICCkJfYXNzZXRfaWQACWtCYWxhbmNlQQIPQV9hc3NldF9iYWxhbmNlAAlrQmFsYW5jZUICD0JfYXNzZXRfYmFsYW5jZQANa0JhbGFuY2VJbml0QQIMQV9hc3NldF9pbml0AA1rQmFsYW5jZUluaXRCAgxCX2Fzc2V0X2luaXQADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAxrRVVSTkFkZHJlc3MCFHN0YWtpbmdfZXVybl9hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQADGtVU0ROQXNzZXRJZAINdXNkbl9hc3NldF9pZAAMa0VVUk5Bc3NldElkAg1ldXJuX2Fzc2V0X2lkAA5rU3Rha2luZ0Fzc2V0cwIOc3Rha2luZ19hc3NldHMADWtPcmFjbGVBY3RpdmUCFGFjdGl2ZV9hbGxfY29udHJhY3RzABdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwIYYWN0aXZlX2dsb2JhbF9leGNoYW5nZXJzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQAC2tPcmFjbGVQb29sAgVwb29sXwANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFUSBOXDMDTM8wlMoC2KfenZGiAq+PMe0uZARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBm9yYWNsZQUNa09yYWNsZUFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUGb3JhY2xlBRdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwcACWZlZVNjYWxlNgDAhD0ABnNjYWxlOACAwtcvAQ5hY2NvdW50QmFsYW5jZQIHYXNzZXRJZARwb29sBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHBvb2wFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQxzdGFrZWRBbW91bnQCB2Fzc2V0SWQEcG9vbAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQRwb29sAwkAAAIFA2FJZAUERVVSTgkAmggCBRJzdGFraW5nRVVSTkFkZHJlc3MJAKwCAgkArAICCQCsAgICGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkA2AQBBQNhSWQCAl9fCQClCAEFBHBvb2wAAAMJAAECBQckbWF0Y2gwAgRVbml0CQELdmFsdWVPckVsc2UCCQCaCAIFBHBvb2wFDmtMZWFzaW5nQW1vdW50AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwMJAAECBQckbWF0Y2gwAgZTdHJpbmcGCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAECyR0MDQwMDU0MTc3BAckbWF0Y2gxBQJpZAMJAAECBQckbWF0Y2gxAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDEJAJQKAgkA2AQBBQNhSWQFA2FJZAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEA2FJZAUHJG1hdGNoMQkAlAoCBQNhSWQJANkEAQUDYUlkCQACAQILTWF0Y2ggZXJyb3IECHN0cmluZ0lkCAULJHQwNDAwNTQxNzcCXzEEB2J5dGVzSWQIBQskdDA0MDA1NDE3NwJfMgQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFB2J5dGVzSWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAJAJUKAwIFV0FWRVMCBVdBVkVTAAgJAAIBAgtNYXRjaCBlcnJvcgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQh1c2VyQWRkcgUOa1VzZXJTd29wSW5Hb3YAAAQLZ1N3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ9rVXNlckdTd29wSW5Hb3YFCnN3b3BBbW91bnQEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAADAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgENY2FsY3VsYXRlRmVlcwYJcG10QW1vdW50Em1pbkFtb3VudFRvUmVjZWl2ZQl0b2tlbkZyb20HdG9rZW5UbwNmZWUNZmVlR292ZXJuYW5jZQQQYW1vdW50V2l0aG91dEZlZQkAawMFB3Rva2VuVG8FCXBtdEFtb3VudAkAZAIFCXBtdEFtb3VudAUJdG9rZW5Gcm9tBA1hbW91bnRXaXRoRmVlCQBrAwUQYW1vdW50V2l0aG91dEZlZQkAZQIFCWZlZVNjYWxlNgUDZmVlBQlmZWVTY2FsZTYEEGdvdmVybmFuY2VSZXdhcmQJAGsDBRBhbW91bnRXaXRob3V0RmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQBmAgUSbWluQW1vdW50VG9SZWNlaXZlBQ1hbW91bnRXaXRoRmVlCQACAQkArAICCQCsAgIJAKwCAgIdQ2FsY3VsYXRlZCBhbW91bnQgdG8gcmVjZWl2ZSAJAKQDAQUNYW1vdW50V2l0aEZlZQIgIGlzIGxlc3MgdGhhbiBzcGVjaWZpZWQgbWluaW11bSAJAKQDAQUSbWluQW1vdW50VG9SZWNlaXZlCQCVCgMFEGFtb3VudFdpdGhvdXRGZWUFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQBEGNhbGN1bGF0ZVZpcnRQYXkDCXBtdEFtb3VudAdiYWxhbmNlA2ZlZQQBRgkAZQIFCWZlZVNjYWxlNgUDZmVlBAFrCQBrAwUDZmVlADwAZAQBYQkAZAIFBnNjYWxlOAkAawMJAGgCBQFGBQFrBQZzY2FsZTgJAGgCBQlmZWVTY2FsZTYFCWZlZVNjYWxlNgQBYgkAZQIJAGUCCQBkAgkAZAIFB2JhbGFuY2UJAGsDBQdiYWxhbmNlBQFGBQlmZWVTY2FsZTYJAGsDBQlwbXRBbW91bnQFAUYFCWZlZVNjYWxlNgUJcG10QW1vdW50CQBrAwUJcG10QW1vdW50CQBoAgUBRgUBawkAaAIFCWZlZVNjYWxlNgUJZmVlU2NhbGU2BAFjCQC5AgIJAL4CAQkAtgIBBQdiYWxhbmNlCQC2AgEFCXBtdEFtb3VudAQBRAkAuAICCQC5AgIJALYCAQUBYgkAtgIBBQFiCQC8AgMJALkCAgkAtgIBAAQFAWMJALYCAQUBYQkAtgIBBQZzY2FsZTgJAKADAQkAvAIDCQC3AgIJAL4CAQkAtgIBBQFiCQEKc3FydEJpZ0ludAQFAUQAAAAABQRET1dOCQC2AgEFBnNjYWxlOAkAtgIBCQBoAgACBQFhARFwYXJzZVBheW1lbnRBc3NldAEHYXNzZXRJZAMJAAACBQdhc3NldElkAQAFBHVuaXQFB2Fzc2V0SWQBEXN1c3BlbmRTdXNwaWNpb3VzBg9hY2NvdW50QmFsYW5jZUEPYWNjb3VudEJhbGFuY2VCCGJhbGFuY2VBCGJhbGFuY2VCCGFzc2V0SWRBCGFzc2V0SWRCCQEHc3VzcGVuZAEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQCkAwEFD2FjY291bnRCYWxhbmNlQQIBIAUIYXNzZXRJZEECAiwgCQCkAwEFD2FjY291bnRCYWxhbmNlQgIBIAUIYXNzZXRJZEICCS4gU3RhdGU6IAkApAMBBQhiYWxhbmNlQQIBIAUIYXNzZXRJZEECAiwgCQCkAwEFCGJhbGFuY2VCAgEgBQhhc3NldElkQgEIaXNBY3RpdmUAAwUGYWN0aXZlBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEMaXNPcmFjbGVQb29sAQtwb29sQWRkcmVzcwMJAQlpc0RlZmluZWQBCQCdCAIFBm9yYWNsZQkArAICBQtrT3JhY2xlUG9vbAULcG9vbEFkZHJlc3MFBHVuaXQJAAIBAhtEQXBwIGlzIG5vdCByZWdpc3RlcmVkIHBvb2wBD2dldFBvb2xCYWxhbmNlcwMEcG9vbAhhc3NldElkQQhhc3NldElkQgQIYmFsYW5jZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wFCWtCYWxhbmNlQQQIYmFsYW5jZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wFCWtCYWxhbmNlQgQNc3Rha2VkQW1vdW50QQkBDHN0YWtlZEFtb3VudAIFCGFzc2V0SWRBBQRwb29sBA1zdGFrZWRBbW91bnRCCQEMc3Rha2VkQW1vdW50AgUIYXNzZXRJZEIFBHBvb2wED2FjY291bnRCYWxhbmNlQQkAZAIJAQ5hY2NvdW50QmFsYW5jZQIFCGFzc2V0SWRBBQRwb29sBQ1zdGFrZWRBbW91bnRBBA9hY2NvdW50QmFsYW5jZUIJAGQCCQEOYWNjb3VudEJhbGFuY2UCBQhhc3NldElkQgUEcG9vbAUNc3Rha2VkQW1vdW50QgQLc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wFEWtTaGFyZUFzc2V0U3VwcGx5CQCXCgUFCGJhbGFuY2VBBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFC3NoYXJlU3VwcGx5AQ1nZXRQb29sQXNzZXRzAQRwb29sBAtzdHJBc3NldElkQQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAUJa0Fzc2V0SWRBBAtzdHJBc3NldElkQgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAUJa0Fzc2V0SWRCBAhhc3NldElkQQMJAAACBQtzdHJBc3NldElkQQIFV0FWRVMFBHVuaXQJANkEAQULc3RyQXNzZXRJZEEECGFzc2V0SWRCAwkAAAIFC3N0ckFzc2V0SWRCAgVXQVZFUwUEdW5pdAkA2QQBBQtzdHJBc3NldElkQgQMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFDWtTaGFyZUFzc2V0SWQJAJcKBQULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBQhhc3NldElkQQUIYXNzZXRJZEIFDHNoYXJlQXNzZXRJZAEMZ2V0RmVlUGFyYW1zAgRwb29sBmNhbGxlcgQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBmNhbGxlcgQDZmVlCQBuBAkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAUEa0ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwQGZ292RmVlCQBuBAkAawMFA2ZlZQAoAGQFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcJAJQKAgUDZmVlBQZnb3ZGZWUJAWkBBGluaXQEC2NhbGxlckJ5dGVzBGFyZ3MIcEFtb3VudHMJcEFzc2V0SWRzBAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMECyR0MDkxODQ5MjYyCQCUCgIJAJEDAgUIcEFtb3VudHMAAAkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAAQKcG10QW1vdW50QQgFCyR0MDkxODQ5MjYyAl8xBAtwbXRBc3NldElkQQgFCyR0MDkxODQ5MjYyAl8yBAskdDA5MjY3OTM0NQkAlAoCCQCRAwIFCHBBbW91bnRzAAEJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAEECnBtdEFtb3VudEIIBQskdDA5MjY3OTM0NQJfMQQLcG10QXNzZXRJZEIIBQskdDA5MjY3OTM0NQJfMgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMJAMwIAgURYWRtaW5JbnZva2VQdWJLZXkFA25pbAgFAWkVb3JpZ2luQ2FsbGVyUHVibGljS2V5CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwkBAiE9AgkAkAMBBQRhcmdzAAEJAAIBAg9Xcm9uZyBhcmdzIHNpemUDCQEJaXNEZWZpbmVkAQkAmwgCBQZjYWxsZXIFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAIFC3BtdEFzc2V0SWRBBQtwbXRBc3NldElkQgkAAgECGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQLJHQwOTc4MDk4NTcJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQQQOcG10U3RyQXNzZXRJZEEIBQskdDA5NzgwOTg1NwJfMQQNcG10QXNzZXROYW1lQQgFCyR0MDk3ODA5ODU3Al8yBAxwbXREZWNpbWFsc0EIBQskdDA5NzgwOTg1NwJfMwQLJHQwOTg2Njk5NDMJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQskdDA5ODY2OTk0MwJfMQQNcG10QXNzZXROYW1lQggFCyR0MDk4NjY5OTQzAl8yBAxwbXREZWNpbWFsc0IIBQskdDA5ODY2OTk0MwJfMwQMZmlyc3RIYXJ2ZXN0CQAAAgkAkQMCBQRhcmdzAAACBHRydWUECXNoYXJlTmFtZQkArAICCQCsAgIJAKwCAgIBcwkArwICBQ1wbXRBc3NldE5hbWVBAAcCAV8JAK8CAgUNcG10QXNzZXROYW1lQgAHBBBzaGFyZURlc2NyaXB0aW9uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIiU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIAUNcG10QXNzZXROYW1lQQIFIGFuZCAFDXBtdEFzc2V0TmFtZUICDCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBA1zaGFyZURlY2ltYWxzCQBpAgkAZAIFDHBtdERlY2ltYWxzQQUMcG10RGVjaW1hbHNCAAIEBGFyZzEJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04EBGFyZzIJAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04EBGFyZzMJAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04EEnNoYXJlSW5pdGlhbFN1cHBseQkAawMFBGFyZzEFBGFyZzIFBGFyZzMECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QQkAzAgCBQ5wbXRTdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQUKcG10QW1vdW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQpwbXRBbW91bnRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQRrRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQZvcmFjbGUCDWJhc2VfZmVlX2NwbW0JAMwIAgUKc2hhcmVJc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFDHNoYXJlSXNzdWVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkFEnNoYXJlSW5pdGlhbFN1cHBseQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFEnNoYXJlSW5pdGlhbFN1cHBseQUMc2hhcmVJc3N1ZUlkBQNuaWwDBQxmaXJzdEhhcnZlc3QJAJQKAgUDbmlsCQCUCgIJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFA25pbAkAlAoCBQNuaWwJAJQKAgUJYmFzZUVudHJ5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERaW5pdFdpdGhJbml0UmF0aW8EC2NhbGxlckJ5dGVzBGFyZ3MIcEFtb3VudHMJcEFzc2V0SWRzBAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDEyMTY0MTIzNjQJAJcKBQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQkAkQMCBQRhcmdzAAIJAJEDAgUEYXJncwADCQAAAgkAkQMCBQRhcmdzAAQCBHRydWUECWFtdEFzc2V0QQgFDSR0MDEyMTY0MTIzNjQCXzEECWFtdEFzc2V0QggFDSR0MDEyMTY0MTIzNjQCXzIEC2Fzc2V0SWRBU3RyCAUNJHQwMTIxNjQxMjM2NAJfMwQLYXNzZXRJZEJTdHIIBQ0kdDAxMjE2NDEyMzY0Al80BAxmaXJzdEhhcnZlc3QIBQ0kdDAxMjE2NDEyMzY0Al81AwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQECIT0CCQCQAwEFBGFyZ3MABQkAAgECD1dyb25nIGFyZ3Mgc2l6ZQMJAQlpc0RlZmluZWQBCQCbCAIFBmNhbGxlcgUHa0FjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BA0kdDAxMjc5OTEyODc2CQEMZ2V0QXNzZXRJbmZvAQULYXNzZXRJZEFTdHIEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTI3OTkxMjg3NgJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDEyNzk5MTI4NzYCXzIEDHBtdERlY2ltYWxzQQgFDSR0MDEyNzk5MTI4NzYCXzMEDSR0MDEyODg1MTI5NjIJAQxnZXRBc3NldEluZm8BBQthc3NldElkQlN0cgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxMjg4NTEyOTYyAl8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTI4ODUxMjk2MgJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTI4ODUxMjk2MgJfMwQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQSc2hhcmVJbml0aWFsU3VwcGx5AAAECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtCYWxhbmNlSW5pdEEFCWFtdEFzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa0JhbGFuY2VJbml0QgUJYW10QXNzZXRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5BQNuaWwDBQxmaXJzdEhhcnZlc3QJAJQKAgUDbmlsCQCUCgIJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFA25pbAkAlAoCBQNuaWwJAJQKAgUJYmFzZUVudHJ5BQNuaWwBaQEYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQECIT0CCQCQAwEFBGFyZ3MAAQkAAgECD1dyb25nIGFyZ3Mgc2l6ZQQKc2hhcmVMaW1pdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAkAlAoCBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1NoYXJlTGltaXQFCnNoYXJlTGltaXQFA25pbAUDbmlsAWkBCGV4Y2hhbmdlBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDE1MzQ4MTU0MjQJAJQKAgkAkQMCBQhwQW1vdW50cwAACQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAABAlwbXRBbW91bnQIBQ0kdDAxNTM0ODE1NDI0Al8xBApwbXRBc3NldElkCAUNJHQwMTUzNDgxNTQyNAJfMgQSbWluQW1vdW50VG9SZWNlaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAABA0kdDAxNTQ5NzE1NTczCQENZ2V0UG9vbEFzc2V0cwEIBQFpBmNhbGxlcgQLc3RyQXNzZXRJZEEIBQ0kdDAxNTQ5NzE1NTczAl8xBAtzdHJBc3NldElkQggFDSR0MDE1NDk3MTU1NzMCXzIECGFzc2V0SWRBCAUNJHQwMTU0OTcxNTU3MwJfMwQIYXNzZXRJZEIIBQ0kdDAxNTQ5NzE1NTczAl80BA0kdDAxNTU4NjE1NjkyCQEPZ2V0UG9vbEJhbGFuY2VzAwgFAWkGY2FsbGVyBQhhc3NldElkQQUIYXNzZXRJZEIECGJhbGFuY2VBCAUNJHQwMTU1ODYxNTY5MgJfMQQIYmFsYW5jZUIIBQ0kdDAxNTU4NjE1NjkyAl8yBA9hY2NvdW50QmFsYW5jZUEIBQ0kdDAxNTU4NjE1NjkyAl8zBA9hY2NvdW50QmFsYW5jZUIIBQ0kdDAxNTU4NjE1NjkyAl80AwkBAiE9AgkAkAMBBQRhcmdzAAEJAAIBAg9Xcm9uZyBhcmdzIHNpemUDAwkAAAIFCGJhbGFuY2VBAAAGCQAAAgUIYmFsYW5jZUIAAAkAAgECIENhbid0IGV4Y2hhbmdlIHdpdGggemVybyBiYWxhbmNlAwkAZwIAAAUSbWluQW1vdW50VG9SZWNlaXZlCQACAQkArAICAjRNaW5pbWFsIGFtb3VudCB0byByZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQCkAwEFEm1pbkFtb3VudFRvUmVjZWl2ZQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhc3NldElkQQkAzAgCBQhhc3NldElkQgUDbmlsBQpwbXRBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQtzdHJBc3NldElkQQIEIG9yIAULc3RyQXNzZXRJZEIDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDSR0MDE2NjYwMTY3MTgJAQxnZXRGZWVQYXJhbXMCCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQDZmVlCAUNJHQwMTY2NjAxNjcxOAJfMQQGZ292RmVlCAUNJHQwMTY2NjAxNjcxOAJfMgQNJHQwMTY3MzUxNzA3MgMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQkBDWNhbGN1bGF0ZUZlZXMGBQlwbXRBbW91bnQFEm1pbkFtb3VudFRvUmVjZWl2ZQUIYmFsYW5jZUEFCGJhbGFuY2VCBQNmZWUFBmdvdkZlZQkBDWNhbGN1bGF0ZUZlZXMGBQlwbXRBbW91bnQFEm1pbkFtb3VudFRvUmVjZWl2ZQUIYmFsYW5jZUIFCGJhbGFuY2VBBQNmZWUFBmdvdkZlZQQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDE2NzM1MTcwNzICXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAxNjczNTE3MDcyAl8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMTY3MzUxNzA3MgJfMwQNJHQwMTcwOTAxNzQxNQMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQkAlQoDCQBkAgUIYmFsYW5jZUEFCXBtdEFtb3VudAkAZQIJAGUCBQhiYWxhbmNlQgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAJUKAwkAZQIJAGUCBQhiYWxhbmNlQQUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQFCGFzc2V0SWRBBAtuZXdCYWxhbmNlQQgFDSR0MDE3MDkwMTc0MTUCXzEEC25ld0JhbGFuY2VCCAUNJHQwMTcwOTAxNzQxNQJfMgQLYXNzZXRJZFNlbmQIBQ0kdDAxNzA5MDE3NDE1Al8zBA0kdDAxNzQzMzE3NjgzAwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQCUCgIFCXBtdEFtb3VudAkAZAIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAJQKAgkAZAIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQFCXBtdEFtb3VudAQMc3Rha2VBbW91bnRBCAUNJHQwMTc0MzMxNzY4MwJfMQQMc3Rha2VBbW91bnRCCAUNJHQwMTc0MzMxNzY4MwJfMgQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQDMCAIFDHN0YWtlQW1vdW50QQkAzAgCBQtzdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRCCQDMCAIFDHN0YWtlQW1vdW50QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFDWFtb3VudFdpdGhGZWUFC2Fzc2V0SWRTZW5kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUQZ292ZXJuYW5jZVJld2FyZAULYXNzZXRJZFNlbmQFA25pbAkAzAgCBQ1hbW91bnRXaXRoRmVlCQDMCAIFC2Fzc2V0SWRTZW5kBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBAtwbXRBc3NldElkQQkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAAQLcG10QXNzZXRJZEIJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAEEDHN0YWtlRmFybWluZwkAAAIJAJEDAgUEYXJncwAAAgR0cnVlBAhsb2NrVHlwZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQQNJHQwMTg5NDYxOTAzNgkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMTg5NDYxOTAzNgJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAxODk0NjE5MDM2Al8yBAhhc3NldElkQQgFDSR0MDE4OTQ2MTkwMzYCXzMECGFzc2V0SWRCCAUNJHQwMTg5NDYxOTAzNgJfNAQMc2hhcmVBc3NldElkCAUNJHQwMTg5NDYxOTAzNgJfNQQNJHQwMTkwNDkxOTE3MwkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDE5MDQ5MTkxNzMCXzEECGJhbGFuY2VCCAUNJHQwMTkwNDkxOTE3MwJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMTkwNDkxOTE3MwJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMTkwNDkxOTE3MwJfNAQQc2hhcmVBc3NldFN1cHBseQgFDSR0MDE5MDQ5MTkxNzMCXzUDCQECIT0CCQCQAwEFBGFyZ3MAAgkAAgECD1dyb25nIGFyZ3Mgc2l6ZQMDCQECIT0CCQCQAwEFCHBBbW91bnRzAAIJAQIhPQIJAJADAQUIcEFtb3VudHMAAwcJAAIBAh5Ud28gb3IgdGhyZWUgcGF5bWVudHMgZXhwZWN0ZWQDAwkBAiE9AgULcG10QXNzZXRJZEEFCGFzc2V0SWRBBgkBAiE9AgULcG10QXNzZXRJZEIFCGFzc2V0SWRCCQACAQkArAICCQCsAgIJAKwCAgIlSW5jb3JyZWN0IGFzc2V0cyBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAULc3RyQXNzZXRJZEECBSBhbmQgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAkQMCBQhwQW1vdW50cwAABQtwbXRBc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAJEDAgUIcEFtb3VudHMAAQULcG10QXNzZXRJZEIFA25pbAMJAAACCQCQAwEFCHBBbW91bnRzAAMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIDCQAAAgkAkQMCBQlwQXNzZXRJZHMAAgEABQR1bml0CQCRAwIFCXBBc3NldElkcwACCQCRAwIFCHBBbW91bnRzAAIFA25pbAkAzggCBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQNJHQwMjAxNzQyMDI1MQkBDGdldEFzc2V0SW5mbwEFC3BtdEFzc2V0SWRBBA5wbXRTdHJBc3NldElkQQgFDSR0MDIwMTc0MjAyNTECXzEEDXBtdEFzc2V0TmFtZUEIBQ0kdDAyMDE3NDIwMjUxAl8yBAxwbXREZWNpbWFsc0EIBQ0kdDAyMDE3NDIwMjUxAl8zBA0kdDAyMDI2ODIwMzQ1CQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEIEDnBtdFN0ckFzc2V0SWRCCAUNJHQwMjAyNjgyMDM0NQJfMQQNcG10QXNzZXROYW1lQggFDSR0MDIwMjY4MjAzNDUCXzIEDHBtdERlY2ltYWxzQggFDSR0MDIwMjY4MjAzNDUCXzMEB2luaXRpYWwJAAACCQBkAgUIYmFsYW5jZUEFCGJhbGFuY2VCAAAEDSR0MDIwNDIwMjEyNjMDBQdpbml0aWFsCQCXCgUJAJEDAgUIcEFtb3VudHMAAAkAkQMCBQhwQW1vdW50cwABAAAFC3BtdEFzc2V0SWRBAAEEE3JhdGlvU2hhcmVUb2tlbnNJbkEJAGsDBQZzY2FsZTgJAJEDAgUIcEFtb3VudHMAAAUIYmFsYW5jZUEEE3JhdGlvU2hhcmVUb2tlbnNJbkIJAGsDBQZzY2FsZTgJAJEDAgUIcEFtb3VudHMAAQUIYmFsYW5jZUIDCQBmAgUTcmF0aW9TaGFyZVRva2Vuc0luQgUTcmF0aW9TaGFyZVRva2Vuc0luQQQDcG10CQBrAwkAkQMCBQhwQW1vdW50cwAABQhiYWxhbmNlQgUIYmFsYW5jZUEJAJcKBQkAkQMCBQhwQW1vdW50cwAABQNwbXQJAGUCCQCRAwIFCHBBbW91bnRzAAEFA3BtdAULcG10QXNzZXRJZEIFE3JhdGlvU2hhcmVUb2tlbnNJbkEEA3BtdAkAawMJAJEDAgUIcEFtb3VudHMAAQUIYmFsYW5jZUEFCGJhbGFuY2VCCQCXCgUFA3BtdAkAkQMCBQhwQW1vdW50cwABCQBlAgkAkQMCBQhwQW1vdW50cwAABQNwbXQFC3BtdEFzc2V0SWRBBRNyYXRpb1NoYXJlVG9rZW5zSW5CBApwbXRBbW91bnRBCAUNJHQwMjA0MjAyMTI2MwJfMQQKcG10QW1vdW50QggFDSR0MDIwNDIwMjEyNjMCXzIEBmNoYW5nZQgFDSR0MDIwNDIwMjEyNjMCXzMEDWNoYW5nZUFzc2V0SWQIBQ0kdDAyMDQyMDIxMjYzAl80BA9zaGFyZVRva2VuUmF0aW8IBQ0kdDAyMDQyMDIxMjYzAl81BBVzaGFyZVRva2VuVG9QYXlBbW91bnQDBQdpbml0aWFsBA1zaGFyZURlY2ltYWxzCQBpAgkAZAIFDHBtdERlY2ltYWxzQQUMcG10RGVjaW1hbHNCAAIJAGsDCQBsBgUKcG10QW1vdW50QQUMcG10RGVjaW1hbHNBAAUAAQUMcG10RGVjaW1hbHNBBQRET1dOCQBsBgUKcG10QW1vdW50QgUMcG10RGVjaW1hbHNCAAUAAQUMcG10RGVjaW1hbHNCBQRET1dOCQBsBgAKAAAFDXNoYXJlRGVjaW1hbHMAAAAABQRET1dOCQBrAwUPc2hhcmVUb2tlblJhdGlvBRBzaGFyZUFzc2V0U3VwcGx5BQZzY2FsZTgDCQAAAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAJAAIBAh1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAGYCAAAFBmNoYW5nZQkAAgECCkNoYW5nZSA8IDAEBnN0YWtlMQMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFDnBtdFN0ckFzc2V0SWRBCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFCnBtdEFtb3VudEEJAMwIAgUOcG10U3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFDnBtdFN0ckFzc2V0SWRCCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFCnBtdEFtb3VudEIJAMwIAgUOcG10U3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIEDHNoYXJlVG9rZW5TVAMFDHN0YWtlRmFybWluZwQKc3RQYXltZW50cwkAzggCCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUDbmlsAwkAAAIJAJADAQUIcEFtb3VudHMAAwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgMJAAACCQCRAwIFCXBBc3NldElkcwACAQAFBHVuaXQJAJEDAgUJcEFzc2V0SWRzAAIJAJEDAgUIcEFtb3VudHMAAgUDbmlsBQNuaWwEB3JlaXNzdWUJAPwHBAgFAWkGY2FsbGVyAhFyZWlzc3VlU2hhcmVUb2tlbgkAzAgCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAUDbmlsAwkAAAIFB3JlaXNzdWUFB3JlaXNzdWUEBnN0YWtlMwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAgULY2FsbGVyQnl0ZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUIbG9ja1R5cGUFA25pbAUKc3RQYXltZW50cwMJAAACBQZzdGFrZTMFBnN0YWtlMwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBRVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAkAlAoCBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEJAGQCBQhiYWxhbmNlQQUKcG10QW1vdW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCCQBkAgUIYmFsYW5jZUIFCnBtdEFtb3VudEIJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgUQc2hhcmVBc3NldFN1cHBseQUVc2hhcmVUb2tlblRvUGF5QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUGY2hhbmdlBQ1jaGFuZ2VBc3NldElkBQNuaWwFDHNoYXJlVG9rZW5TVAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBApwbXRBc3NldElkCQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAABAlwbXRBbW91bnQJAJEDAgUIcEFtb3VudHMAAAQQdmlydEdldE1pbkFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAQMc3Rha2VGYXJtaW5nCQAAAgkAkQMCBQRhcmdzAAECBHRydWUECGxvY2tUeXBlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwACBA0kdDAyNDE2ODI0MjU4CQENZ2V0UG9vbEFzc2V0cwEIBQFpBmNhbGxlcgQLc3RyQXNzZXRJZEEIBQ0kdDAyNDE2ODI0MjU4Al8xBAtzdHJBc3NldElkQggFDSR0MDI0MTY4MjQyNTgCXzIECGFzc2V0SWRBCAUNJHQwMjQxNjgyNDI1OAJfMwQIYXNzZXRJZEIIBQ0kdDAyNDE2ODI0MjU4Al80BAxzaGFyZUFzc2V0SWQIBQ0kdDAyNDE2ODI0MjU4Al81BA0kdDAyNDI3MTI0Mzk1CQEPZ2V0UG9vbEJhbGFuY2VzAwgFAWkGY2FsbGVyBQhhc3NldElkQQUIYXNzZXRJZEIECGJhbGFuY2VBCAUNJHQwMjQyNzEyNDM5NQJfMQQIYmFsYW5jZUIIBQ0kdDAyNDI3MTI0Mzk1Al8yBA9hY2NvdW50QmFsYW5jZUEIBQ0kdDAyNDI3MTI0Mzk1Al8zBA9hY2NvdW50QmFsYW5jZUIIBQ0kdDAyNDI3MTI0Mzk1Al80BBBzaGFyZUFzc2V0U3VwcGx5CAUNJHQwMjQyNzEyNDM5NQJfNQQHaW5pdGlhbAkAAAIJAGQCBQhiYWxhbmNlQQUIYmFsYW5jZUIAAAMJAQIhPQIJAJADAQUEYXJncwADCQACAQIPV3JvbmcgYXJncyBzaXplAwMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkBAiE9AgkAkAMBBQhwQW1vdW50cwACBwkAAgECI1R3byBvciBvbmUgYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQIhPQIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQECIT0CBQpwbXRBc3NldElkBQhhc3NldElkQgcJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMFB2luaXRpYWwJAAIBAjBGb3IgaW5pdGlhbCBleGNoYW5nZXIgeW91IG5lZWQgdG8gdXNlIHR3byB0b2tlbnMDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsAwkAAAIJAJADAQUIcEFtb3VudHMAAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgMJAAACCQCRAwIFCXBBc3NldElkcwACAQAFBHVuaXQJAJEDAgUJcEFzc2V0SWRzAAIJAJEDAgUIcEFtb3VudHMAAgUDbmlsCQDOCAIFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBA0kdDAyNTQ1MTI1NTA5CQEMZ2V0RmVlUGFyYW1zAggFAWkGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIEA2ZlZQgFDSR0MDI1NDUxMjU1MDkCXzEEBmdvdkZlZQgFDSR0MDI1NDUxMjU1MDkCXzIEDSR0MDI1NTI2Mjc3MzIDCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEEEDXZpcnRQYXlBbW91bnQJARBjYWxjdWxhdGVWaXJ0UGF5AwUJcG10QW1vdW50BQhiYWxhbmNlQQUDZmVlBA0kdDAyNTgwNTI1OTQyCQENY2FsY3VsYXRlRmVlcwYFDXZpcnRQYXlBbW91bnQFEHZpcnRHZXRNaW5BbW91bnQFCGJhbGFuY2VBBQhiYWxhbmNlQgUDZmVlBQZnb3ZGZWUEEGFtb3VudFdpdGhvdXRGZWUIBQ0kdDAyNTgwNTI1OTQyAl8xBA1hbW91bnRXaXRoRmVlCAUNJHQwMjU4MDUyNTk0MgJfMgQQZ292ZXJuYW5jZVJld2FyZAgFDSR0MDI1ODA1MjU5NDICXzMEDGJhbGFuY2VBVmlydAkAZAIFCGJhbGFuY2VBBQ12aXJ0UGF5QW1vdW50BAxiYWxhbmNlQlZpcnQJAGUCCQBkAgUIYmFsYW5jZUIFEGFtb3VudFdpdGhvdXRGZWUFEGdvdmVybmFuY2VSZXdhcmQEC25ld0JhbGFuY2VBCQBkAgUIYmFsYW5jZUEFCXBtdEFtb3VudAQLbmV3QmFsYW5jZUIJAGUCBQhiYWxhbmNlQgUQZ292ZXJuYW5jZVJld2FyZAQTcmF0aW9TaGFyZVRva2Vuc0luQQkAawMJAGUCBQlwbXRBbW91bnQFDXZpcnRQYXlBbW91bnQFBnNjYWxlOAUMYmFsYW5jZUFWaXJ0BBNyYXRpb1NoYXJlVG9rZW5zSW5CCQBrAwUNYW1vdW50V2l0aEZlZQUGc2NhbGU4BQxiYWxhbmNlQlZpcnQEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAawMJAJcDAQkAzAgCBRNyYXRpb1NoYXJlVG9rZW5zSW5BCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkIFA25pbAUQc2hhcmVBc3NldFN1cHBseQUGc2NhbGU4CQCZCgcFC25ld0JhbGFuY2VBBQtuZXdCYWxhbmNlQgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgULc3RyQXNzZXRJZEIFC3N0ckFzc2V0SWRBBA12aXJ0UGF5QW1vdW50CQEQY2FsY3VsYXRlVmlydFBheQMFCXBtdEFtb3VudAUIYmFsYW5jZUIFA2ZlZQQNJHQwMjY4MzcyNjk3NAkBDWNhbGN1bGF0ZUZlZXMGBQ12aXJ0UGF5QW1vdW50BRB2aXJ0R2V0TWluQW1vdW50BQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMjY4MzcyNjk3NAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDI2ODM3MjY5NzQCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAyNjgzNzI2OTc0Al8zBAxiYWxhbmNlQVZpcnQJAGUCCQBkAgUIYmFsYW5jZUEFEGFtb3VudFdpdGhvdXRGZWUFEGdvdmVybmFuY2VSZXdhcmQEDGJhbGFuY2VCVmlydAkAZAIFCGJhbGFuY2VCBQ12aXJ0UGF5QW1vdW50BAtuZXdCYWxhbmNlQQkAZQIFCGJhbGFuY2VBBRBnb3Zlcm5hbmNlUmV3YXJkBAtuZXdCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQEE3JhdGlvU2hhcmVUb2tlbnNJbkEJAGsDBQ1hbW91bnRXaXRoRmVlBQZzY2FsZTgFDGJhbGFuY2VBVmlydAQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMJAGUCBQlwbXRBbW91bnQFDXZpcnRQYXlBbW91bnQFBnNjYWxlOAUMYmFsYW5jZUJWaXJ0BBVzaGFyZVRva2VuVG9QYXlBbW91bnQJAGsDCQCXAwEJAMwIAgUTcmF0aW9TaGFyZVRva2Vuc0luQQkAzAgCBRNyYXRpb1NoYXJlVG9rZW5zSW5CBQNuaWwFEHNoYXJlQXNzZXRTdXBwbHkFBnNjYWxlOAkAmQoHBQtuZXdCYWxhbmNlQQULbmV3QmFsYW5jZUIFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEEFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQLbmV3QmFsYW5jZUEIBQ0kdDAyNTUyNjI3NzMyAl8xBAtuZXdCYWxhbmNlQggFDSR0MDI1NTI2Mjc3MzICXzIEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAgFDSR0MDI1NTI2Mjc3MzICXzMECWdvdlJld2FyZAgFDSR0MDI1NTI2Mjc3MzICXzQEDmdvdlJld2FyZEFzc2V0CAUNJHQwMjU1MjYyNzczMgJfNQQRZ292UmV3YXJkQXNzZXRTdHIIBQ0kdDAyNTUyNjI3NzMyAl82BA1wbXRBc3NldElkU3RyCAUNJHQwMjU1MjYyNzczMgJfNwMJAAACBRVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAkAAgECHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoBAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQ1wbXRBc3NldElkU3RyCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFCXBtdEFtb3VudAkAzAgCBQ1wbXRBc3NldElkU3RyBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBRFnb3ZSZXdhcmRBc3NldFN0cgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQlnb3ZSZXdhcmQJAMwIAgURZ292UmV3YXJkQXNzZXRTdHIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIEDHNoYXJlVG9rZW5TVAMFDHN0YWtlRmFybWluZwQKc3RQYXltZW50cwkAzggCCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUDbmlsAwkAAAIJAJADAQUIcEFtb3VudHMAAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgMJAAACCQCRAwIFCXBBc3NldElkcwABAQAFBHVuaXQJAJEDAgUJcEFzc2V0SWRzAAEJAJEDAgUIcEFtb3VudHMAAQUDbmlsBQNuaWwEB3JlaXNzdWUJAPwHBAgFAWkGY2FsbGVyAhFyZWlzc3VlU2hhcmVUb2tlbgkAzAgCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAUDbmlsAwkAAAIFB3JlaXNzdWUFB3JlaXNzdWUEBnN0YWtlMwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAgULY2FsbGVyQnl0ZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUIbG9ja1R5cGUFA25pbAUKc3RQYXltZW50cwMJAAACBQZzdGFrZTMFBnN0YWtlMwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBRVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAkAlAoCBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFEHNoYXJlQXNzZXRTdXBwbHkFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFCWdvdlJld2FyZAUOZ292UmV3YXJkQXNzZXQFA25pbAUMc2hhcmVUb2tlblNUBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcEC2NhbGxlckJ5dGVzBGFyZ3MIcEFtb3VudHMJcEFzc2V0SWRzCQELdmFsdWVPckVsc2UCCQEMaXNPcmFjbGVQb29sAQkApQgBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBHRpbWUIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDI5ODg2Mjk5NzYJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDI5ODg2Mjk5NzYCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjk4ODYyOTk3NgJfMgQIYXNzZXRJZEEIBQ0kdDAyOTg4NjI5OTc2Al8zBAhhc3NldElkQggFDSR0MDI5ODg2Mjk5NzYCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDI5ODg2Mjk5NzYCXzUEDSR0MDI5OTg5MzAxMTMJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyOTk4OTMwMTEzAl8xBAhiYWxhbmNlQggFDSR0MDI5OTg5MzAxMTMCXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDI5OTg5MzAxMTMCXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDI5OTg5MzAxMTMCXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyOTk4OTMwMTEzAl81BA0kdDAzMDEyNjMwNTM0AwkAAAIJAJADAQUIcEFtb3VudHMAAQQGcEFzc2V0CQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAAAwkBAiE9AgUGcEFzc2V0BQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQJAJQKAgkAkQMCBQhwQW1vdW50cwAABQZwQXNzZXQJAJQKAgAABQxzaGFyZUFzc2V0SWQECXBtdEFtb3VudAgFDSR0MDMwMTI2MzA1MzQCXzEECnBtdEFzc2V0SWQIBQ0kdDAzMDEyNjMwNTM0Al8yAwkBAiE9AgkAkAMBBQRhcmdzAAEJAAIBAg9Xcm9uZyBhcmdzIHNpemUDCQBmAgkAkAMBBQhwQW1vdW50cwABCQACAQIdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDHVubG9ja0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCRAwIFBGFyZ3MAAAIBMAQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAht3aXRoZHJhd1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAgULY2FsbGVyQnl0ZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BAxhbW91bnRUb1BheUEJAGsDBQ53aXRoZHJhd0Ftb3VudAUIYmFsYW5jZUEFEHNoYXJlQXNzZXRTdXBwbHkEDGFtb3VudFRvUGF5QgkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQgUQc2hhcmVBc3NldFN1cHBseQQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgUMYW1vdW50VG9QYXlBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQxhbW91bnRUb1BheUIJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHVubG9ja0Ftb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBCQBlAgUIYmFsYW5jZUEFDGFtb3VudFRvUGF5QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBRBzaGFyZUFzc2V0U3VwcGx5BQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQxhbW91bnRUb1BheUEFCGFzc2V0SWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUMYW1vdW50VG9QYXlCBQhhc3NldElkQgUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQd2l0aGRyYXdPbmVUb2tlbgQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBA13aXRoZHJhd0Fzc2V0AwkAAAIJAJEDAgUEYXJncwAAAgAFBHVuaXQJANkEAQkAkQMCBQRhcmdzAAAEDSR0MDMyODQ1MzI5MzUJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDMyODQ1MzI5MzUCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMzI4NDUzMjkzNQJfMgQIYXNzZXRJZEEIBQ0kdDAzMjg0NTMyOTM1Al8zBAhhc3NldElkQggFDSR0MDMyODQ1MzI5MzUCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDMyODQ1MzI5MzUCXzUEDSR0MDMyOTQ4MzMwNzIJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAzMjk0ODMzMDcyAl8xBAhiYWxhbmNlQggFDSR0MDMyOTQ4MzMwNzICXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDMyOTQ4MzMwNzICXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDMyOTQ4MzMwNzICXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAzMjk0ODMzMDcyAl81BA0kdDAzMzA4NTMzNDY1AwkAAAIJAJADAQUIcEFtb3VudHMAAQQGcEFzc2V0CQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAAAwkBAiE9AgUGcEFzc2V0BQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQJAJQKAgkAkQMCBQhwQW1vdW50cwAABQZwQXNzZXQJAJQKAgAABQxzaGFyZUFzc2V0SWQECXBtdEFtb3VudAgFDSR0MDMzMDg1MzM0NjUCXzEECnBtdEFzc2V0SWQIBQ0kdDAzMzA4NTMzNDY1Al8yBA92aXJ0TWluVG9SZWNpdmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAEDCQECIT0CCQCQAwEFBGFyZ3MAAwkAAgECD1dyb25nIGFyZ3Mgc2l6ZQMJAGYCCQCQAwEFCHBBbW91bnRzAAEJAAIBAh1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQIhPQIFCnBtdEFzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgEJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQDYBAEFDHNoYXJlQXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUIYXNzZXRJZEEJAMwIAgUIYXNzZXRJZEIFA25pbAUNd2l0aGRyYXdBc3NldAkAAgECGUluY29ycmVjdCB3aXRoZHJhdyBhc3NldC4DAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDHVubG9ja0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCRAwIFBGFyZ3MAAgIBMAQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAht3aXRoZHJhd1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAgULY2FsbGVyQnl0ZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BAxhbW91bnRUb1BheUEJAGsDBQ53aXRoZHJhd0Ftb3VudAUIYmFsYW5jZUEFEHNoYXJlQXNzZXRTdXBwbHkEDGFtb3VudFRvUGF5QgkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQgUQc2hhcmVBc3NldFN1cHBseQQNJHQwMzQ4MTMzNDg3MQkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAzNDgxMzM0ODcxAl8xBAZnb3ZGZWUIBQ0kdDAzNDgxMzM0ODcxAl8yBA0kdDAzNDg4ODM1Mjg4AwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QgUPdmlydE1pblRvUmVjaXZlCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgkAZQIFCGJhbGFuY2VBBQxhbW91bnRUb1BheUEFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QQUPdmlydE1pblRvUmVjaXZlCQBlAgUIYmFsYW5jZUEFDGFtb3VudFRvUGF5QQkAZQIFCGJhbGFuY2VCBQxhbW91bnRUb1BheUIFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMzQ4ODgzNTI4OAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDM0ODg4MzUyODgCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAzNDg4ODM1Mjg4Al8zBA0kdDAzNTMwNTM2NjUxAwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUEFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoECQBlAgkAZQIJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhiYWxhbmNlQgUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoEBQhiYWxhbmNlQQkAZQIJAGUCCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlCBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAtuZXdCYWxhbmNlQQgFDSR0MDM1MzA1MzY2NTECXzEEC25ld0JhbGFuY2VCCAUNJHQwMzUzMDUzNjY1MQJfMgQQZ292UmV3YXJkQXNzZXRJZAgFDSR0MDM1MzA1MzY2NTECXzMEDHVzZXJUcmFuc2ZlcggFDSR0MDM1MzA1MzY2NTECXzQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHVubG9ja0Ftb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFEGdvdmVybmFuY2VSZXdhcmQFEGdvdlJld2FyZEFzc2V0SWQFA25pbAUMdXNlclRyYW5zZmVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMzczNzYzNzQ1MgkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzczNzYzNzQ1MgJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzNzM3NjM3NDUyAl8yBAhhc3NldElkQQgFDSR0MDM3Mzc2Mzc0NTICXzMECGFzc2V0SWRCCAUNJHQwMzczNzYzNzQ1MgJfNAQNJHQwMzc0NjUzNzU3MQkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDM3NDY1Mzc1NzECXzEECGJhbGFuY2VCCAUNJHQwMzc0NjUzNzU3MQJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzc0NjUzNzU3MQJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzc0NjUzNzU3MQJfNAQNYW1vdW50RW5yb2xsQQkAZQIFD2FjY291bnRCYWxhbmNlQQUIYmFsYW5jZUEEDWFtb3VudEVucm9sbEIJAGUCBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VCAwkBAiE9AgkAkAMBBQRhcmdzAAAJAAIBAg9Xcm9uZyBhcmdzIHNpemUDCQECIT0CBQ9tb25leUJveEFkZHJlc3MIBQFpDG9yaWdpbkNhbGxlcgkAAgECJk9ubHkgdGhlIHdhbGxldCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwMJAGYCAAAFDWFtb3VudEVucm9sbEEGCQBmAgAABQ1hbW91bnRFbnJvbGxCCQEHc3VzcGVuZAECFkVucm9sbCBhbW91bnQgbmVnYXRpdmUDAwkAAAIFDWFtb3VudEVucm9sbEEAAAkAAAIFDWFtb3VudEVucm9sbEIAAAcJAAIBAhBObyBtb25leSB0byB0YWtlBAZzdGFrZTEDAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAGYCBQ1hbW91bnRFbnJvbGxBAAAHCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFDWFtb3VudEVucm9sbEEJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkAZgIFDWFtb3VudEVucm9sbEIAAAcJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUNYW1vdW50RW5yb2xsQgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBCQBkAgUIYmFsYW5jZUEFDWFtb3VudEVucm9sbEEJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQ1hbW91bnRFbnJvbGxCBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgUTbXVsdGlTaWduZWRCeUFkbWluc4clpT4=", "height": 2319559, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EXjsEDasfUDCeLqiocpK38baYdeKgfySzDbtYJmEpT2c Next: DPyp1jZciazAD3rf9Q7azcsWbqaaB7Unonk6KPBh4d2T Diff:
OldNewDifferences
741741 else $Tuple2(0, shareAssetId)
742742 let pmtAmount = $t03012630534._1
743743 let pmtAssetId = $t03012630534._2
744- if ((size(args) != 3))
744+ if ((size(args) != 1))
745745 then throw("Wrong args size")
746746 else if ((size(pAmounts) > 1))
747747 then throw("One attached payment expected")
810810 let virtMinToRecive = parseIntValue(args[1])
811811 if ((size(args) != 3))
812812 then throw("Wrong args size")
813- else if ((size(pAmounts) != 1))
813+ else if ((size(pAmounts) > 1))
814814 then throw("One attached payment expected")
815815 else if ((pmtAssetId != shareAssetId))
816816 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
830830 let withdrawAmount = (pmtAmount + unlockAmount)
831831 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
832832 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
833- let $t03481434872 = getFeeParams(i.caller, i.originCaller)
834- let fee = $t03481434872._1
835- let govFee = $t03481434872._2
836- let $t03488935289 = if ((withdrawAsset == assetIdA))
833+ let $t03481334871 = getFeeParams(i.caller, i.originCaller)
834+ let fee = $t03481334871._1
835+ let govFee = $t03481334871._2
836+ let $t03488835288 = if ((withdrawAsset == assetIdA))
837837 then calculateFees(amountToPayB, virtMinToRecive, (balanceB - amountToPayB), (balanceA - amountToPayA), fee, govFee)
838838 else calculateFees(amountToPayA, virtMinToRecive, (balanceA - amountToPayA), (balanceB - amountToPayB), fee, govFee)
839- let amountWithoutFee = $t03488935289._1
840- let amountWithFee = $t03488935289._2
841- let governanceReward = $t03488935289._3
842- let $t03530636652 = if ((withdrawAsset == assetIdA))
839+ let amountWithoutFee = $t03488835288._1
840+ let amountWithFee = $t03488835288._2
841+ let governanceReward = $t03488835288._3
842+ let $t03530536651 = if ((withdrawAsset == assetIdA))
843843 then {
844844 let unstake = if (contains(stakingAssets, strAssetIdA))
845845 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
856856 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
857857 else throw("Strict value is not equal to itself.")
858858 }
859- let newBalanceA = $t03530636652._1
860- let newBalanceB = $t03530636652._2
861- let govRewardAssetId = $t03530636652._3
862- let userTransfer = $t03530636652._4
859+ let newBalanceA = $t03530536651._1
860+ let newBalanceB = $t03530536651._2
861+ let govRewardAssetId = $t03530536651._3
862+ let userTransfer = $t03530536651._4
863863 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
864864 }
865865 else throw("Strict value is not equal to itself.")
870870
871871 @Callable(i)
872872 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
873- let $t03737737453 = getPoolAssets(i.caller)
874- let strAssetIdA = $t03737737453._1
875- let strAssetIdB = $t03737737453._2
876- let assetIdA = $t03737737453._3
877- let assetIdB = $t03737737453._4
878- let $t03746637572 = getPoolBalances(i.caller, assetIdA, assetIdB)
879- let balanceA = $t03746637572._1
880- let balanceB = $t03746637572._2
881- let accountBalanceA = $t03746637572._3
882- let accountBalanceB = $t03746637572._4
873+ let $t03737637452 = getPoolAssets(i.caller)
874+ let strAssetIdA = $t03737637452._1
875+ let strAssetIdB = $t03737637452._2
876+ let assetIdA = $t03737637452._3
877+ let assetIdB = $t03737637452._4
878+ let $t03746537571 = getPoolBalances(i.caller, assetIdA, assetIdB)
879+ let balanceA = $t03746537571._1
880+ let balanceB = $t03746537571._2
881+ let accountBalanceA = $t03746537571._3
882+ let accountBalanceB = $t03746537571._4
883883 let amountEnrollA = (accountBalanceA - balanceA)
884884 let amountEnrollB = (accountBalanceB - balanceB)
885885 if ((size(args) != 0))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kBalanceInitA = "A_asset_init"
1919
2020 let kBalanceInitB = "B_asset_init"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kFirstHarvest = "first_harvest"
3131
3232 let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
4242 let kUSDNAddress = "staking_usdnnsbt_address"
4343
4444 let kEURNAddress = "staking_eurn_address"
4545
4646 let kLeasingAmount = "leasing_amount"
4747
4848 let kUSDNAssetId = "usdn_asset_id"
4949
5050 let kEURNAssetId = "eurn_asset_id"
5151
5252 let kStakingAssets = "staking_assets"
5353
5454 let kOracleActive = "active_all_contracts"
5555
5656 let kOracleActiveExchangers = "active_global_exchangers"
5757
5858 let kDiscounts = "discounts"
5959
6060 let kDiscountValues = "discount_values"
6161
6262 let kUserGSwopInGov = "_GSwop_amount"
6363
6464 let kUserSwopInGov = "_SWOP_amount"
6565
6666 let kOraclePool = "pool_"
6767
6868 let kAdminPubKey1 = "admin_pub_1"
6969
7070 let kAdminPubKey2 = "admin_pub_2"
7171
7272 let kAdminPubKey3 = "admin_pub_3"
7373
7474 let kAdminInvokePubKey = "admin_invoke_pub"
7575
7676 let kMoneyBoxAddress = "money_box_address"
7777
7878 let kVotingAddress = "voting_address"
7979
8080 let kGovAddress = "governance_address"
8181
8282 let kFarmingAddress = "farming_address"
8383
8484 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
8585
8686 func getBase58FromOracle (key) = match getString(oracle, key) {
8787 case string: String =>
8888 fromBase58String(string)
8989 case nothing =>
9090 throw((key + "is empty"))
9191 }
9292
9393
9494 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
9595
9696 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
9797
9898 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
9999
100100 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
101101
102102 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
103103
104104 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
105105
106106 let govAddress = Address(getBase58FromOracle(kGovAddress))
107107
108108 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
109109
110110 let USDN = getBase58FromOracle(kUSDNAssetId)
111111
112112 let EURN = getBase58FromOracle(kEURNAssetId)
113113
114114 let stakingAssets = getStringValue(oracle, kStakingAssets)
115115
116116 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
117117
118118 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
119119
120120 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
121121
122122 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
123123
124124 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
125125
126126 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
127127
128128 let active = if (getBooleanValue(oracle, kOracleActive))
129129 then getBooleanValue(oracle, kOracleActiveExchangers)
130130 else false
131131
132132 let feeScale6 = 1000000
133133
134134 let scale8 = 100000000
135135
136136 func accountBalance (assetId,pool) = match assetId {
137137 case id: ByteVector =>
138138 assetBalance(pool, id)
139139 case waves: Unit =>
140140 wavesBalance(pool).available
141141 case _ =>
142142 throw("Match error")
143143 }
144144
145145
146146 func stakedAmount (assetId,pool) = {
147147 let stakedAmountCalculated = match assetId {
148148 case aId: ByteVector =>
149149 if ((aId == USDN))
150150 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(pool)))
151151 else if ((aId == EURN))
152152 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(pool)))
153153 else 0
154154 case _: Unit =>
155155 valueOrElse(getInteger(pool, kLeasingAmount), 0)
156156 case _ =>
157157 throw("Match error")
158158 }
159159 match stakedAmountCalculated {
160160 case i: Int =>
161161 i
162162 case _ =>
163163 0
164164 }
165165 }
166166
167167
168168 func getAssetInfo (assetId) = match assetId {
169169 case id: String|ByteVector =>
170170 let $t040054177 = match id {
171171 case aId: ByteVector =>
172172 $Tuple2(toBase58String(aId), aId)
173173 case aId: String =>
174174 $Tuple2(aId, fromBase58String(aId))
175175 case _ =>
176176 throw("Match error")
177177 }
178178 let stringId = $t040054177._1
179179 let bytesId = $t040054177._2
180180 let info = valueOrErrorMessage(assetInfo(bytesId), (("Asset " + stringId) + " doesn't exist"))
181181 $Tuple3(stringId, info.name, info.decimals)
182182 case waves: Unit =>
183183 $Tuple3("WAVES", "WAVES", 8)
184184 case _ =>
185185 throw("Match error")
186186 }
187187
188188
189189 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
190190
191191
192192 func calculateFeeDiscount (userAddr) = {
193193 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
194194 let gSwopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserGSwopInGov)), swopAmount)
195195 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
196196 let discounts = split(getStringValue(oracle, kDiscounts), ",")
197197 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
198198 then (parseIntValue(discountValues[1]) > gSwopAmount)
199199 else false)
200200 then (feeScale6 - parseIntValue(discounts[0]))
201201 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
202202 then (parseIntValue(discountValues[2]) > gSwopAmount)
203203 else false)
204204 then (feeScale6 - parseIntValue(discounts[1]))
205205 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
206206 then (parseIntValue(discountValues[3]) > gSwopAmount)
207207 else false)
208208 then (feeScale6 - parseIntValue(discounts[2]))
209209 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
210210 then (parseIntValue(discountValues[4]) > gSwopAmount)
211211 else false)
212212 then (feeScale6 - parseIntValue(discounts[3]))
213213 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
214214 then (feeScale6 - parseIntValue(discounts[4]))
215215 else feeScale6
216216 }
217217
218218
219219 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,fee,feeGovernance) = {
220220 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
221221 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
222222 let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
223223 if ((minAmountToReceive > amountWithFee))
224224 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
225225 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
226226 }
227227
228228
229229 func calculateVirtPay (pmtAmount,balance,fee) = {
230230 let F = (feeScale6 - fee)
231231 let k = fraction(fee, 60, 100)
232232 let a = (scale8 + fraction((F * k), scale8, (feeScale6 * feeScale6)))
233233 let b = ((((balance + fraction(balance, F, feeScale6)) + fraction(pmtAmount, F, feeScale6)) - pmtAmount) - fraction(pmtAmount, (F * k), (feeScale6 * feeScale6)))
234234 let c = (-(toBigInt(balance)) * toBigInt(pmtAmount))
235235 let D = ((toBigInt(b) * toBigInt(b)) - fraction((toBigInt(4) * c), toBigInt(a), toBigInt(scale8)))
236236 toInt(fraction((-(toBigInt(b)) + sqrtBigInt(D, 0, 0, DOWN)), toBigInt(scale8), toBigInt((2 * a))))
237237 }
238238
239239
240240 func parsePaymentAsset (assetId) = if ((assetId == base58''))
241241 then unit
242242 else assetId
243243
244244
245245 func suspendSuspicious (accountBalanceA,accountBalanceB,balanceA,balanceB,assetIdA,assetIdB) = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceA)) + " ") + assetIdA) + ", ") + toString(accountBalanceB)) + " ") + assetIdB) + ". State: ") + toString(balanceA)) + " ") + assetIdA) + ", ") + toString(balanceB)) + " ") + assetIdB))
246246
247247
248248 func isActive () = if (active)
249249 then unit
250250 else throw("DApp is inactive at this moment")
251251
252252
253253 func isOraclePool (poolAddress) = if (isDefined(getString(oracle, (kOraclePool + poolAddress))))
254254 then unit
255255 else throw("DApp is not registered pool")
256256
257257
258258 func getPoolBalances (pool,assetIdA,assetIdB) = {
259259 let balanceA = getIntegerValue(pool, kBalanceA)
260260 let balanceB = getIntegerValue(pool, kBalanceB)
261261 let stakedAmountA = stakedAmount(assetIdA, pool)
262262 let stakedAmountB = stakedAmount(assetIdB, pool)
263263 let accountBalanceA = (accountBalance(assetIdA, pool) + stakedAmountA)
264264 let accountBalanceB = (accountBalance(assetIdB, pool) + stakedAmountB)
265265 let shareSupply = getIntegerValue(pool, kShareAssetSupply)
266266 $Tuple5(balanceA, balanceB, accountBalanceA, accountBalanceB, shareSupply)
267267 }
268268
269269
270270 func getPoolAssets (pool) = {
271271 let strAssetIdA = getStringValue(pool, kAssetIdA)
272272 let strAssetIdB = getStringValue(pool, kAssetIdB)
273273 let assetIdA = if ((strAssetIdA == "WAVES"))
274274 then unit
275275 else fromBase58String(strAssetIdA)
276276 let assetIdB = if ((strAssetIdB == "WAVES"))
277277 then unit
278278 else fromBase58String(strAssetIdB)
279279 let shareAssetId = fromBase58String(getStringValue(pool, kShareAssetId))
280280 $Tuple5(strAssetIdA, strAssetIdB, assetIdA, assetIdB, shareAssetId)
281281 }
282282
283283
284284 func getFeeParams (pool,caller) = {
285285 let feeDiscount = calculateFeeDiscount(caller)
286286 let fee = fraction(getIntegerValue(pool, kFee), feeDiscount, feeScale6, CEILING)
287287 let govFee = fraction(fraction(fee, 40, 100), feeDiscount, feeScale6, CEILING)
288288 $Tuple2(fee, govFee)
289289 }
290290
291291
292292 @Callable(i)
293293 func init (callerBytes,args,pAmounts,pAssetIds) = {
294294 let caller = Address(callerBytes)
295295 let $t091849262 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
296296 let pmtAmountA = $t091849262._1
297297 let pmtAssetIdA = $t091849262._2
298298 let $t092679345 = $Tuple2(pAmounts[1], parsePaymentAsset(pAssetIds[1]))
299299 let pmtAmountB = $t092679345._1
300300 let pmtAssetIdB = $t092679345._2
301301 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
302302 then throw("Only admin can call this function")
303303 else if ((size(args) != 1))
304304 then throw("Wrong args size")
305305 else if (isDefined(getBoolean(caller, kActive)))
306306 then throw("DApp is already active")
307307 else if ((pmtAssetIdA == pmtAssetIdB))
308308 then throw("Assets must be different")
309309 else {
310310 let $t097809857 = getAssetInfo(pmtAssetIdA)
311311 let pmtStrAssetIdA = $t097809857._1
312312 let pmtAssetNameA = $t097809857._2
313313 let pmtDecimalsA = $t097809857._3
314314 let $t098669943 = getAssetInfo(pmtAssetIdB)
315315 let pmtStrAssetIdB = $t098669943._1
316316 let pmtAssetNameB = $t098669943._2
317317 let pmtDecimalsB = $t098669943._3
318318 let firstHarvest = (args[0] == "true")
319319 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
320320 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
321321 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
322322 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
323323 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
324324 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
325325 let shareInitialSupply = fraction(arg1, arg2, arg3)
326326 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
327327 let shareIssueId = calculateAssetId(shareIssue)
328328 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
329329 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
330330 else 0
331331 if ((stake1 == stake1))
332332 then {
333333 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
334334 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
335335 else 0
336336 if ((stake2 == stake2))
337337 then {
338338 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(caller, shareInitialSupply, shareIssueId)]
339339 if (firstHarvest)
340340 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
341341 else $Tuple2(nil, $Tuple2(baseEntry, nil))
342342 }
343343 else throw("Strict value is not equal to itself.")
344344 }
345345 else throw("Strict value is not equal to itself.")
346346 }
347347 }
348348
349349
350350
351351 @Callable(i)
352352 func initWithInitRatio (callerBytes,args,pAmounts,pAssetIds) = {
353353 let caller = Address(callerBytes)
354354 let $t01216412364 = $Tuple5(parseIntValue(args[0]), parseIntValue(args[1]), args[2], args[3], (args[4] == "true"))
355355 let amtAssetA = $t01216412364._1
356356 let amtAssetB = $t01216412364._2
357357 let assetIdAStr = $t01216412364._3
358358 let assetIdBStr = $t01216412364._4
359359 let firstHarvest = $t01216412364._5
360360 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
361361 then throw("Only admin can call this function")
362362 else if ((size(args) != 5))
363363 then throw("Wrong args size")
364364 else if (isDefined(getBoolean(caller, kActive)))
365365 then throw("DApp is already active")
366366 else if ((assetIdAStr == assetIdBStr))
367367 then throw("Assets must be different")
368368 else {
369369 let $t01279912876 = getAssetInfo(assetIdAStr)
370370 let pmtStrAssetIdA = $t01279912876._1
371371 let pmtAssetNameA = $t01279912876._2
372372 let pmtDecimalsA = $t01279912876._3
373373 let $t01288512962 = getAssetInfo(assetIdBStr)
374374 let pmtStrAssetIdB = $t01288512962._1
375375 let pmtAssetNameB = $t01288512962._2
376376 let pmtDecimalsB = $t01288512962._3
377377 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
378378 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
379379 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
380380 let shareInitialSupply = 0
381381 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
382382 let shareIssueId = calculateAssetId(shareIssue)
383383 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
384384 if (firstHarvest)
385385 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
386386 else $Tuple2(nil, $Tuple2(baseEntry, nil))
387387 }
388388 }
389389
390390
391391
392392 @Callable(i)
393393 func keepLimitForFirstHarvest (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
394394 then throw("Only admin can call this function")
395395 else if ((size(args) != 1))
396396 then throw("Wrong args size")
397397 else {
398398 let shareLimit = parseIntValue(args[0])
399399 $Tuple2(nil, $Tuple2([IntegerEntry(kShareLimit, shareLimit)], nil))
400400 }))
401401
402402
403403
404404 @Callable(i)
405405 func exchange (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
406406 let caller = Address(callerBytes)
407407 let $t01534815424 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
408408 let pmtAmount = $t01534815424._1
409409 let pmtAssetId = $t01534815424._2
410410 let minAmountToReceive = parseIntValue(args[0])
411411 let $t01549715573 = getPoolAssets(i.caller)
412412 let strAssetIdA = $t01549715573._1
413413 let strAssetIdB = $t01549715573._2
414414 let assetIdA = $t01549715573._3
415415 let assetIdB = $t01549715573._4
416416 let $t01558615692 = getPoolBalances(i.caller, assetIdA, assetIdB)
417417 let balanceA = $t01558615692._1
418418 let balanceB = $t01558615692._2
419419 let accountBalanceA = $t01558615692._3
420420 let accountBalanceB = $t01558615692._4
421421 if ((size(args) != 1))
422422 then throw("Wrong args size")
423423 else if (if ((balanceA == 0))
424424 then true
425425 else (balanceB == 0))
426426 then throw("Can't exchange with zero balance")
427427 else if ((0 >= minAmountToReceive))
428428 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
429429 else if ((size(pAmounts) != 1))
430430 then throw("One attached payment expected")
431431 else if (!(containsElement([assetIdA, assetIdB], pmtAssetId)))
432432 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
433433 else if (if ((balanceA > accountBalanceA))
434434 then true
435435 else (balanceB > accountBalanceB))
436436 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
437437 else {
438438 let $t01666016718 = getFeeParams(i.caller, i.originCaller)
439439 let fee = $t01666016718._1
440440 let govFee = $t01666016718._2
441441 let $t01673517072 = if ((pmtAssetId == assetIdA))
442442 then calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, fee, govFee)
443443 else calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, fee, govFee)
444444 let amountWithoutFee = $t01673517072._1
445445 let amountWithFee = $t01673517072._2
446446 let governanceReward = $t01673517072._3
447447 let $t01709017415 = if ((pmtAssetId == assetIdA))
448448 then $Tuple3((balanceA + pmtAmount), ((balanceB - amountWithFee) - governanceReward), assetIdB)
449449 else $Tuple3(((balanceA - amountWithFee) - governanceReward), (balanceB + pmtAmount), assetIdA)
450450 let newBalanceA = $t01709017415._1
451451 let newBalanceB = $t01709017415._2
452452 let assetIdSend = $t01709017415._3
453453 let $t01743317683 = if ((pmtAssetId == assetIdA))
454454 then $Tuple2(pmtAmount, (amountWithFee + governanceReward))
455455 else $Tuple2((amountWithFee + governanceReward), pmtAmount)
456456 let stakeAmountA = $t01743317683._1
457457 let stakeAmountB = $t01743317683._2
458458 let stake1 = if (contains(stakingAssets, strAssetIdA))
459459 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdA), stakeAmountA, strAssetIdA], nil)
460460 else 0
461461 if ((stake1 == stake1))
462462 then {
463463 let stake2 = if (contains(stakingAssets, strAssetIdB))
464464 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdB), stakeAmountB, strAssetIdB], nil)
465465 else 0
466466 if ((stake2 == stake2))
467467 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], [amountWithFee, assetIdSend]))
468468 else throw("Strict value is not equal to itself.")
469469 }
470470 else throw("Strict value is not equal to itself.")
471471 }
472472 }))
473473
474474
475475
476476 @Callable(i)
477477 func replenishWithTwoTokens (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
478478 let caller = Address(callerBytes)
479479 let pmtAssetIdA = parsePaymentAsset(pAssetIds[0])
480480 let pmtAssetIdB = parsePaymentAsset(pAssetIds[1])
481481 let stakeFarming = (args[0] == "true")
482482 let lockType = parseIntValue(args[1])
483483 let $t01894619036 = getPoolAssets(i.caller)
484484 let strAssetIdA = $t01894619036._1
485485 let strAssetIdB = $t01894619036._2
486486 let assetIdA = $t01894619036._3
487487 let assetIdB = $t01894619036._4
488488 let shareAssetId = $t01894619036._5
489489 let $t01904919173 = getPoolBalances(i.caller, assetIdA, assetIdB)
490490 let balanceA = $t01904919173._1
491491 let balanceB = $t01904919173._2
492492 let accountBalanceA = $t01904919173._3
493493 let accountBalanceB = $t01904919173._4
494494 let shareAssetSupply = $t01904919173._5
495495 if ((size(args) != 2))
496496 then throw("Wrong args size")
497497 else if (if ((size(pAmounts) != 2))
498498 then (size(pAmounts) != 3)
499499 else false)
500500 then throw("Two or three payments expected")
501501 else if (if ((pmtAssetIdA != assetIdA))
502502 then true
503503 else (pmtAssetIdB != assetIdB))
504504 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
505505 else if (if ((balanceA > accountBalanceA))
506506 then true
507507 else (balanceB > accountBalanceB))
508508 then $Tuple2(nil, ([ScriptTransfer(caller, pAmounts[0], pmtAssetIdA), ScriptTransfer(caller, pAmounts[1], pmtAssetIdB)] ++ (if ((size(pAmounts) == 3))
509509 then [AttachedPayment(if ((pAssetIds[2] == base58''))
510510 then unit
511511 else pAssetIds[2], pAmounts[2])]
512512 else (nil ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))))
513513 else {
514514 let $t02017420251 = getAssetInfo(pmtAssetIdA)
515515 let pmtStrAssetIdA = $t02017420251._1
516516 let pmtAssetNameA = $t02017420251._2
517517 let pmtDecimalsA = $t02017420251._3
518518 let $t02026820345 = getAssetInfo(pmtAssetIdB)
519519 let pmtStrAssetIdB = $t02026820345._1
520520 let pmtAssetNameB = $t02026820345._2
521521 let pmtDecimalsB = $t02026820345._3
522522 let initial = ((balanceA + balanceB) == 0)
523523 let $t02042021263 = if (initial)
524524 then $Tuple5(pAmounts[0], pAmounts[1], 0, pmtAssetIdA, 1)
525525 else {
526526 let ratioShareTokensInA = fraction(scale8, pAmounts[0], balanceA)
527527 let ratioShareTokensInB = fraction(scale8, pAmounts[1], balanceB)
528528 if ((ratioShareTokensInB > ratioShareTokensInA))
529529 then {
530530 let pmt = fraction(pAmounts[0], balanceB, balanceA)
531531 $Tuple5(pAmounts[0], pmt, (pAmounts[1] - pmt), pmtAssetIdB, ratioShareTokensInA)
532532 }
533533 else {
534534 let pmt = fraction(pAmounts[1], balanceA, balanceB)
535535 $Tuple5(pmt, pAmounts[1], (pAmounts[0] - pmt), pmtAssetIdA, ratioShareTokensInB)
536536 }
537537 }
538538 let pmtAmountA = $t02042021263._1
539539 let pmtAmountB = $t02042021263._2
540540 let change = $t02042021263._3
541541 let changeAssetId = $t02042021263._4
542542 let shareTokenRatio = $t02042021263._5
543543 let shareTokenToPayAmount = if (initial)
544544 then {
545545 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
546546 fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
547547 }
548548 else fraction(shareTokenRatio, shareAssetSupply, scale8)
549549 if ((shareTokenToPayAmount == 0))
550550 then throw("Too small amount to replenish")
551551 else if ((0 > change))
552552 then throw("Change < 0")
553553 else {
554554 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
555555 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
556556 else 0
557557 if ((stake1 == stake1))
558558 then {
559559 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
560560 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
561561 else 0
562562 if ((stake2 == stake2))
563563 then {
564564 let shareTokenST = if (stakeFarming)
565565 then {
566566 let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 3))
567567 then [AttachedPayment(if ((pAssetIds[2] == base58''))
568568 then unit
569569 else pAssetIds[2], pAmounts[2])]
570570 else nil))
571571 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
572572 if ((reissue == reissue))
573573 then {
574574 let stake3 = invoke(farmingAddress, "lockShareTokensFromPool", [callerBytes, toString(i.caller), lockType], stPayments)
575575 if ((stake3 == stake3))
576576 then nil
577577 else throw("Strict value is not equal to itself.")
578578 }
579579 else throw("Strict value is not equal to itself.")
580580 }
581581 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
582582 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(caller, change, changeAssetId)] ++ shareTokenST), nil))
583583 }
584584 else throw("Strict value is not equal to itself.")
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588 }
589589 }))
590590
591591
592592
593593 @Callable(i)
594594 func replenishWithOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
595595 let caller = Address(callerBytes)
596596 let pmtAssetId = parsePaymentAsset(pAssetIds[0])
597597 let pmtAmount = pAmounts[0]
598598 let virtGetMinAmount = parseIntValue(args[0])
599599 let stakeFarming = (args[1] == "true")
600600 let lockType = parseIntValue(args[2])
601601 let $t02416824258 = getPoolAssets(i.caller)
602602 let strAssetIdA = $t02416824258._1
603603 let strAssetIdB = $t02416824258._2
604604 let assetIdA = $t02416824258._3
605605 let assetIdB = $t02416824258._4
606606 let shareAssetId = $t02416824258._5
607607 let $t02427124395 = getPoolBalances(i.caller, assetIdA, assetIdB)
608608 let balanceA = $t02427124395._1
609609 let balanceB = $t02427124395._2
610610 let accountBalanceA = $t02427124395._3
611611 let accountBalanceB = $t02427124395._4
612612 let shareAssetSupply = $t02427124395._5
613613 let initial = ((balanceA + balanceB) == 0)
614614 if ((size(args) != 3))
615615 then throw("Wrong args size")
616616 else if (if ((size(pAmounts) != 1))
617617 then (size(pAmounts) != 2)
618618 else false)
619619 then throw("Two or one attached assets expected")
620620 else if (if ((pmtAssetId != assetIdA))
621621 then (pmtAssetId != assetIdB)
622622 else false)
623623 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
624624 else if (initial)
625625 then throw("For initial exchanger you need to use two tokens")
626626 else if (if ((balanceA > accountBalanceA))
627627 then true
628628 else (balanceB > accountBalanceB))
629629 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ (if ((size(pAmounts) == 2))
630630 then [AttachedPayment(if ((pAssetIds[2] == base58''))
631631 then unit
632632 else pAssetIds[2], pAmounts[2])]
633633 else (nil ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))))
634634 else {
635635 let $t02545125509 = getFeeParams(i.caller, i.originCaller)
636636 let fee = $t02545125509._1
637637 let govFee = $t02545125509._2
638638 let $t02552627732 = if ((pmtAssetId == assetIdA))
639639 then {
640640 let virtPayAmount = calculateVirtPay(pmtAmount, balanceA, fee)
641641 let $t02580525942 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
642642 let amountWithoutFee = $t02580525942._1
643643 let amountWithFee = $t02580525942._2
644644 let governanceReward = $t02580525942._3
645645 let balanceAVirt = (balanceA + virtPayAmount)
646646 let balanceBVirt = ((balanceB + amountWithoutFee) - governanceReward)
647647 let newBalanceA = (balanceA + pmtAmount)
648648 let newBalanceB = (balanceB - governanceReward)
649649 let ratioShareTokensInA = fraction((pmtAmount - virtPayAmount), scale8, balanceAVirt)
650650 let ratioShareTokensInB = fraction(amountWithFee, scale8, balanceBVirt)
651651 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
652652 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdB, strAssetIdB, strAssetIdA)
653653 }
654654 else {
655655 let virtPayAmount = calculateVirtPay(pmtAmount, balanceB, fee)
656656 let $t02683726974 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
657657 let amountWithoutFee = $t02683726974._1
658658 let amountWithFee = $t02683726974._2
659659 let governanceReward = $t02683726974._3
660660 let balanceAVirt = ((balanceA + amountWithoutFee) - governanceReward)
661661 let balanceBVirt = (balanceB + virtPayAmount)
662662 let newBalanceA = (balanceA - governanceReward)
663663 let newBalanceB = (balanceB + pmtAmount)
664664 let ratioShareTokensInA = fraction(amountWithFee, scale8, balanceAVirt)
665665 let ratioShareTokensInB = fraction((pmtAmount - virtPayAmount), scale8, balanceBVirt)
666666 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
667667 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdA, strAssetIdA, strAssetIdB)
668668 }
669669 let newBalanceA = $t02552627732._1
670670 let newBalanceB = $t02552627732._2
671671 let shareTokenToPayAmount = $t02552627732._3
672672 let govReward = $t02552627732._4
673673 let govRewardAsset = $t02552627732._5
674674 let govRewardAssetStr = $t02552627732._6
675675 let pmtAssetIdStr = $t02552627732._7
676676 if ((shareTokenToPayAmount == 0))
677677 then throw("Too small amount to replenish")
678678 else {
679679 let stake1 = if (contains(stakingAssets, pmtAssetIdStr))
680680 then invoke(i.caller, "stakeUnstake", [true, pmtAmount, pmtAssetIdStr], nil)
681681 else 0
682682 if ((stake1 == stake1))
683683 then {
684684 let stake2 = if (contains(stakingAssets, govRewardAssetStr))
685685 then invoke(i.caller, "stakeUnstake", [false, govReward, govRewardAssetStr], nil)
686686 else 0
687687 if ((stake2 == stake2))
688688 then {
689689 let shareTokenST = if (stakeFarming)
690690 then {
691691 let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 2))
692692 then [AttachedPayment(if ((pAssetIds[1] == base58''))
693693 then unit
694694 else pAssetIds[1], pAmounts[1])]
695695 else nil))
696696 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
697697 if ((reissue == reissue))
698698 then {
699699 let stake3 = invoke(farmingAddress, "lockShareTokensFromPool", [callerBytes, toString(i.caller), lockType], stPayments)
700700 if ((stake3 == stake3))
701701 then nil
702702 else throw("Strict value is not equal to itself.")
703703 }
704704 else throw("Strict value is not equal to itself.")
705705 }
706706 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
707707 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(moneyBoxAddress, govReward, govRewardAsset)] ++ shareTokenST), nil))
708708 }
709709 else throw("Strict value is not equal to itself.")
710710 }
711711 else throw("Strict value is not equal to itself.")
712712 }
713713 }
714714 }))
715715
716716
717717
718718 @Callable(i)
719719 func withdraw (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
720720 let time = lastBlock.timestamp
721721 let caller = Address(callerBytes)
722722 let $t02988629976 = getPoolAssets(i.caller)
723723 let strAssetIdA = $t02988629976._1
724724 let strAssetIdB = $t02988629976._2
725725 let assetIdA = $t02988629976._3
726726 let assetIdB = $t02988629976._4
727727 let shareAssetId = $t02988629976._5
728728 let $t02998930113 = getPoolBalances(i.caller, assetIdA, assetIdB)
729729 let balanceA = $t02998930113._1
730730 let balanceB = $t02998930113._2
731731 let accountBalanceA = $t02998930113._3
732732 let accountBalanceB = $t02998930113._4
733733 let shareAssetSupply = $t02998930113._5
734734 let $t03012630534 = if ((size(pAmounts) == 1))
735735 then {
736736 let pAsset = parsePaymentAsset(pAssetIds[0])
737737 if ((pAsset != shareAssetId))
738738 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
739739 else $Tuple2(pAmounts[0], pAsset)
740740 }
741741 else $Tuple2(0, shareAssetId)
742742 let pmtAmount = $t03012630534._1
743743 let pmtAssetId = $t03012630534._2
744- if ((size(args) != 3))
744+ if ((size(args) != 1))
745745 then throw("Wrong args size")
746746 else if ((size(pAmounts) > 1))
747747 then throw("One attached payment expected")
748748 else if (if ((balanceA > accountBalanceA))
749749 then true
750750 else (balanceB > accountBalanceB))
751751 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
752752 else {
753753 let unlockAmount = parseIntValue(valueOrElse(args[0], "0"))
754754 let unlock = if ((unlockAmount > 0))
755755 then invoke(farmingAddress, "withdrawShareTokensFromPool", [callerBytes, toString(i.caller), unlockAmount], nil)
756756 else 0
757757 if ((unlock == unlock))
758758 then {
759759 let withdrawAmount = (pmtAmount + unlockAmount)
760760 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
761761 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
762762 let stake1 = if (contains(stakingAssets, strAssetIdA))
763763 then invoke(i.caller, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
764764 else 0
765765 if ((stake1 == stake1))
766766 then {
767767 let stake2 = if (contains(stakingAssets, strAssetIdB))
768768 then invoke(i.caller, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
769769 else 0
770770 if ((stake2 == stake2))
771771 then $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2([IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(caller, amountToPayA, assetIdA), ScriptTransfer(caller, amountToPayB, assetIdB)], nil))
772772 else throw("Strict value is not equal to itself.")
773773 }
774774 else throw("Strict value is not equal to itself.")
775775 }
776776 else throw("Strict value is not equal to itself.")
777777 }
778778 }))
779779
780780
781781
782782 @Callable(i)
783783 func withdrawOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
784784 let caller = Address(callerBytes)
785785 let withdrawAsset = if ((args[0] == ""))
786786 then unit
787787 else fromBase58String(args[0])
788788 let $t03284532935 = getPoolAssets(i.caller)
789789 let strAssetIdA = $t03284532935._1
790790 let strAssetIdB = $t03284532935._2
791791 let assetIdA = $t03284532935._3
792792 let assetIdB = $t03284532935._4
793793 let shareAssetId = $t03284532935._5
794794 let $t03294833072 = getPoolBalances(i.caller, assetIdA, assetIdB)
795795 let balanceA = $t03294833072._1
796796 let balanceB = $t03294833072._2
797797 let accountBalanceA = $t03294833072._3
798798 let accountBalanceB = $t03294833072._4
799799 let shareAssetSupply = $t03294833072._5
800800 let $t03308533465 = if ((size(pAmounts) == 1))
801801 then {
802802 let pAsset = parsePaymentAsset(pAssetIds[0])
803803 if ((pAsset != shareAssetId))
804804 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
805805 else $Tuple2(pAmounts[0], pAsset)
806806 }
807807 else $Tuple2(0, shareAssetId)
808808 let pmtAmount = $t03308533465._1
809809 let pmtAssetId = $t03308533465._2
810810 let virtMinToRecive = parseIntValue(args[1])
811811 if ((size(args) != 3))
812812 then throw("Wrong args size")
813- else if ((size(pAmounts) != 1))
813+ else if ((size(pAmounts) > 1))
814814 then throw("One attached payment expected")
815815 else if ((pmtAssetId != shareAssetId))
816816 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
817817 else if (!(containsElement([assetIdA, assetIdB], withdrawAsset)))
818818 then throw("Incorrect withdraw asset.")
819819 else if (if ((balanceA > accountBalanceA))
820820 then true
821821 else (balanceB > accountBalanceB))
822822 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
823823 else {
824824 let unlockAmount = parseIntValue(valueOrElse(args[2], "0"))
825825 let unlock = if ((unlockAmount > 0))
826826 then invoke(farmingAddress, "withdrawShareTokensFromPool", [callerBytes, toString(i.caller), unlockAmount], nil)
827827 else 0
828828 if ((unlock == unlock))
829829 then {
830830 let withdrawAmount = (pmtAmount + unlockAmount)
831831 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
832832 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
833- let $t03481434872 = getFeeParams(i.caller, i.originCaller)
834- let fee = $t03481434872._1
835- let govFee = $t03481434872._2
836- let $t03488935289 = if ((withdrawAsset == assetIdA))
833+ let $t03481334871 = getFeeParams(i.caller, i.originCaller)
834+ let fee = $t03481334871._1
835+ let govFee = $t03481334871._2
836+ let $t03488835288 = if ((withdrawAsset == assetIdA))
837837 then calculateFees(amountToPayB, virtMinToRecive, (balanceB - amountToPayB), (balanceA - amountToPayA), fee, govFee)
838838 else calculateFees(amountToPayA, virtMinToRecive, (balanceA - amountToPayA), (balanceB - amountToPayB), fee, govFee)
839- let amountWithoutFee = $t03488935289._1
840- let amountWithFee = $t03488935289._2
841- let governanceReward = $t03488935289._3
842- let $t03530636652 = if ((withdrawAsset == assetIdA))
839+ let amountWithoutFee = $t03488835288._1
840+ let amountWithFee = $t03488835288._2
841+ let governanceReward = $t03488835288._3
842+ let $t03530536651 = if ((withdrawAsset == assetIdA))
843843 then {
844844 let unstake = if (contains(stakingAssets, strAssetIdA))
845845 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
846846 else 0
847847 if ((unstake == unstake))
848848 then $Tuple4((((balanceA - amountToPayA) - amountWithFee) - governanceReward), balanceB, assetIdA, [ScriptTransfer(caller, (amountToPayA + amountWithFee), assetIdA)])
849849 else throw("Strict value is not equal to itself.")
850850 }
851851 else {
852852 let unstake = if (contains(stakingAssets, strAssetIdB))
853853 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayB + amountWithFee) + governanceReward), strAssetIdB], nil)
854854 else 0
855855 if ((unstake == unstake))
856856 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
857857 else throw("Strict value is not equal to itself.")
858858 }
859- let newBalanceA = $t03530636652._1
860- let newBalanceB = $t03530636652._2
861- let govRewardAssetId = $t03530636652._3
862- let userTransfer = $t03530636652._4
859+ let newBalanceA = $t03530536651._1
860+ let newBalanceB = $t03530536651._2
861+ let govRewardAssetId = $t03530536651._3
862+ let userTransfer = $t03530536651._4
863863 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
864864 }
865865 else throw("Strict value is not equal to itself.")
866866 }
867867 }))
868868
869869
870870
871871 @Callable(i)
872872 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
873- let $t03737737453 = getPoolAssets(i.caller)
874- let strAssetIdA = $t03737737453._1
875- let strAssetIdB = $t03737737453._2
876- let assetIdA = $t03737737453._3
877- let assetIdB = $t03737737453._4
878- let $t03746637572 = getPoolBalances(i.caller, assetIdA, assetIdB)
879- let balanceA = $t03746637572._1
880- let balanceB = $t03746637572._2
881- let accountBalanceA = $t03746637572._3
882- let accountBalanceB = $t03746637572._4
873+ let $t03737637452 = getPoolAssets(i.caller)
874+ let strAssetIdA = $t03737637452._1
875+ let strAssetIdB = $t03737637452._2
876+ let assetIdA = $t03737637452._3
877+ let assetIdB = $t03737637452._4
878+ let $t03746537571 = getPoolBalances(i.caller, assetIdA, assetIdB)
879+ let balanceA = $t03746537571._1
880+ let balanceB = $t03746537571._2
881+ let accountBalanceA = $t03746537571._3
882+ let accountBalanceB = $t03746537571._4
883883 let amountEnrollA = (accountBalanceA - balanceA)
884884 let amountEnrollB = (accountBalanceB - balanceB)
885885 if ((size(args) != 0))
886886 then throw("Wrong args size")
887887 else if ((moneyBoxAddress != i.originCaller))
888888 then throw("Only the wallet can call this function")
889889 else if (if ((0 > amountEnrollA))
890890 then true
891891 else (0 > amountEnrollB))
892892 then suspend("Enroll amount negative")
893893 else if (if ((amountEnrollA == 0))
894894 then (amountEnrollB == 0)
895895 else false)
896896 then throw("No money to take")
897897 else {
898898 let stake1 = if (if (contains(stakingAssets, strAssetIdA))
899899 then (amountEnrollA > 0)
900900 else false)
901901 then invoke(i.caller, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
902902 else 0
903903 if ((stake1 == stake1))
904904 then {
905905 let stake2 = if (if (contains(stakingAssets, strAssetIdB))
906906 then (amountEnrollB > 0)
907907 else false)
908908 then invoke(i.caller, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
909909 else 0
910910 if ((stake2 == stake2))
911911 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))], nil))
912912 else throw("Strict value is not equal to itself.")
913913 }
914914 else throw("Strict value is not equal to itself.")
915915 }
916916 }))
917917
918918
919919 @Verifier(tx)
920920 func verify () = {
921921 let multiSignedByAdmins = {
922922 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
923923 then 1
924924 else 0
925925 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
926926 then 1
927927 else 0
928928 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
929929 then 1
930930 else 0
931931 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
932932 }
933933 multiSignedByAdmins
934934 }
935935

github/deemru/w8io/873ac7e 
104.17 ms