tx · Dks9HsD9JkzXta34GuUS1JzwRAvxTe6xAKq4t3DRg97x

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.03400000 Waves

2023.08.23 12:47 [2723116] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "Dks9HsD9JkzXta34GuUS1JzwRAvxTe6xAKq4t3DRg97x", "fee": 3400000, "feeAssetId": null, "timestamp": 1692784016089, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "2e5Z4qs42XPm1uFrPEBdGtWgwDXTvB9GM2u8PHVb1dkBYzZb7Nv4cE8742ZJCgXUQLbni1pEGBeuUx7Rys67X6Rp" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUGAMYFa03a6HKRXSPpCOfih8CFDv9hKreABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTMzNjU0ODAJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTMzNjU0ODACXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDUzMzY1NDgwAl8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDUzMzY1NDgwAl8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTMzNjU0ODACXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQRVU0ROBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACDShJbnQsIFN0cmluZykFAUAJAAIBCQCsAgIJAAMBBQFAAiIgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcpAl8xAwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzYxOTc2OTQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzYxOTc2OTQCXzEECnBtdEFzc2V0SWQIBQskdDA3NjE5NzY5NAJfMgQLJHQwNzcwMzc3NzYJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzcwMzc3NzYCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc3MDM3Nzc2Al8yBAtwbXREZWNpbWFscwgFCyR0MDc3MDM3Nzc2Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA1NTkxMDcwMwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDU1OTEwNzAzAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDU1OTEwNzAzAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNTU5MTA3MDMCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDU1OTEwNzAzAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMDkyMDExMDcwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDEwOTIwMTEwNzACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMDkyMDExMDcwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMDkyMDExMDcwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTA5MjAxMTA3MAJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExNzk1MTI4NDMDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQICgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91R2V0UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIXKEludCwgU3RyaW5nLCBJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAiwgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcsIEludCwgSW50KQJfMQMJAAACBQlhbW50VG9HZXQFCWFtbnRUb0dldAQNdGlja2V0c0Ftb3VudAkAaQIFCWFtbnRUb0dldAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBBhbW50VG9HZXRUaWNrZXRzCQBoAgUNdGlja2V0c0Ftb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAlhbW50VG9QYXkICgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91UGF5UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAg0oSW50LCBTdHJpbmcpBQFACQACAQkArAICCQADAQUBQAIiIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgU3RyaW5nKQJfMQMJAAACBQlhbW50VG9QYXkFCWFtbnRUb1BheQQCZXgJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQlhbW50VG9QYXkFA25pbAMJAAACBQJleAUCZXgEBmNoYW5nZQkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRBhbW50VG9HZXRUaWNrZXRzBAZjRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwJAJUKAwUQYW1udFRvR2V0VGlja2V0cwUKYnV5QXNzZXRJZAUGY0VudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQJcG10QW1vdW50CAUNJHQwMTE3OTUxMjg0MwJfMQQKcG10QXNzZXRJZAgFDSR0MDExNzk1MTI4NDMCXzIEC2NoYW5nZUVudHJ5CAUNJHQwMTE3OTUxMjg0MwJfMwMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQHCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcEDWZyZWV6ZVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAkAAgEJAKwCAgkArAICCQCsAgICKVR3byBhdHRhY2hlZCBwYXltZW50cyBleHBlY3RlZDogRmlyc3QgaW4gBQxidXlBc3NldE5hbWUCDCwgc2Vjb25kIGluIAUNZnJlZXplVG9rZW5JZAMDCQBnAgAABRdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAYJAGcCAAAFFGFsbG93ZWRUaWNrZXRzQW1vdW50CQACAQIqTm90IGVub3VnaHQgU1dPUCBpbiBzdGFraW5nIHRvIGJ1eSB0aWNrZXRzBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAlwMBCQDMCAIFD2J1eVRpY2tldEFtb3VudAkAzAgCBRRhbGxvd2VkVGlja2V0c0Ftb3VudAUDbmlsBBxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBRmcmVlemVUb2tlblBlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAQNJHQwMTQ2ODYxNDc3MwkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBA9wbXRBbW91bnRGcmVlemUIBQ0kdDAxNDY4NjE0NzczAl8xBBBwbXRBc3NldElkRnJlZXplCAUNJHQwMTQ2ODYxNDc3MwJfMgQNJHQwMTQ3OTAxNDg4MQkBDGdldEFzc2V0SW5mbwEFCnBtdEFzc2V0SWQEE3BtdEZyZWV6ZVN0ckFzc2V0SWQIBQ0kdDAxNDc5MDE0ODgxAl8xBBJwbXRGcmVlemVBc3NldE5hbWUIBQ0kdDAxNDc5MDE0ODgxAl8yBBFwbXRGcmVlemVEZWNpbWFscwgFDSR0MDE0NzkwMTQ4ODECXzMEEG5lZWRGcmVlemVUb2tlbnMJAGgCBRRmcmVlemVUb2tlblBlclRpY2tldAUPYnV5VGlja2V0QW1vdW50AwMJAQIhPQIFE3BtdEZyZWV6ZVN0ckFzc2V0SWQFDWZyZWV6ZVRva2VuSWQGCQECIT0CBRBuZWVkRnJlZXplVG9rZW5zBQ9wbXRBbW91bnRGcmVlemUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEFlvdSBuZWVkIHRvIGFkZCAJAKQDAQUQbmVlZEZyZWV6ZVRva2VucwIBIAUScG10RnJlZXplQXNzZXROYW1lAhQgYXMgYSBzZWNvbmQgcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgUPcG10QW1vdW50RnJlZXplBQNuaWwFA25pbAQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50CQBkAgUTYm91Z2h0VGlja2V0c0Ftb3VudAUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUaWNrZXRMYXN0TnVtYmVyCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUOa2V5VXNlclRpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkFC2NoYW5nZUVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUY29tbWl0QWNjZXNzTGlzdFNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNjk2NzE3MDQyCQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE2OTY3MTcwNDICXzEECnBtdEFzc2V0SWQIBQ0kdDAxNjk2NzE3MDQyAl8yBA0kdDAxNzA0NzE3MTk3CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDE3MDQ3MTcxOTcCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxNzA0NzE3MTk3Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAxNzA0NzE3MTk3Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTcwNDcxNzE5NwJfNAQTdXNlclVzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQPdXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQNJHQwMTc4NjYxODAxMAkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxNzg2NjE4MDEwAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxNzg2NjE4MDEwAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE3ODY2MTgwMTACXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxNzg2NjE4MDEwAl80BBxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uCQBrAwkAawMFCnRva2VuUHJpY2UFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDCQBnAgURYm91Z2h0QWxsb2NhdGlvbnMFFG1heEFsbG9jYXRpb25zQW1vdW50CQACAQkArAICCQCsAgICEVlvdSBjYW4gYnV5IG9ubHkgCQCkAwEFFG1heEFsbG9jYXRpb25zQW1vdW50AgthbGxvY2F0aW9ucwMDCQECIT0CBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQlwbXRBbW91bnQJAQIhPQIJAGgCBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uAAIFCXBtdEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAjJXcm9uZyBwYXltZW50LiBZb3UgY2FuIGJ1eSAxIG9yIDIgYWxsb2NhdGlvbnMgZm9yIAkApAMBBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUCDyBwZXIgYWxsb2NhdGlvbgQUYnV5QWxsb2NhdGlvbnNBbW91bnQJAGkCBQlwbXRBbW91bnQFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24EA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwkAZAIFEWJvdWdodEFsbG9jYXRpb25zBRRidXlBbGxvY2F0aW9uc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUTdXNlclVzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBQ91c2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZY29tbWl0SGlnaENvbXBldGl0aW9uU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDIwMjY4MjA0MTgJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjAyNjgyMDQxOAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDIwMjY4MjA0MTgCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDIwMjY4MjA0MTgCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyMDI2ODIwNDE4Al80BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVib3VnaHRIQ1RpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQTaGlnaENvbXBldGl0aW9uU2FsZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUhpZ2hDb21wZXRpdGlvblNhbGUHBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDIxMDI4MjExNzIJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMjEwMjgyMTE3MgJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMjEwMjgyMTE3MgJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAyMTAyODIxMTcyAl8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMjEwMjgyMTE3MgJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE2NvbW1pc3Npb25QZXJUaWNrZXQJAGsDBQt0aWNrZXRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24AZAQNJHQwMjE0MDUyMjQ1MwMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQECWFtbnRUb0dldAgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAhcoSW50LCBTdHJpbmcsIEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACLCBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIFN0cmluZywgSW50LCBJbnQpAl8xAwkAAAIFCWFtbnRUb0dldAUJYW1udFRvR2V0BA10aWNrZXRzQW1vdW50CQBpAgUJYW1udFRvR2V0CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACDShJbnQsIFN0cmluZykFAUAJAAIBCQCsAgIJAAMBBQFAAiIgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcpAl8xAwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5BAJleAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFCWFtbnRUb1BheQUDbmlsAwkAAAIFAmV4BQJleAQGY2hhbmdlCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEGFtbnRUb0dldFRpY2tldHMEBmNFbnRyeQMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwFA25pbAkAlQoDBRBhbW50VG9HZXRUaWNrZXRzBQpidXlBc3NldElkBQZjRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBAlwbXRBbW91bnQIBQ0kdDAyMTQwNTIyNDUzAl8xBApwbXRBc3NldElkCAUNJHQwMjE0MDUyMjQ1MwJfMgQLY2hhbmdlRW50cnkIBQ0kdDAyMTQwNTIyNDUzAl8zAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAQEhAQUTaGlnaENvbXBldGl0aW9uU2FsZQkAAgECNFRoZXJlIGlzIG5vIGhpZ2ggY29tcGV0aXRpb24gc2FsZSBmb3IgdGhpcyBsYXVuY2hwYWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQED2J1eVRpY2tldEFtb3VudAkAaQIFCXBtdEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBVidXlQcmljZVdpdGhDb21pc3Npb24JAGgCBQ9idXlUaWNrZXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQGY2hhbmdlCQBlAgUJcG10QW1vdW50BRVidXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFD2J1eVRpY2tldEFtb3VudAIYdGlja2V0cyB5b3UgbmVlZCB0byBwYXkgCQCkAwEFFWJ1eVByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lBBh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMCAAQWbGFzdEJvdWdodFRpY2tldE51bWJlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQEG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkArAICBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMDCQECIT0CBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMCAAkArAICAgEsBQtib3VnaHRSYW5nZQkArAICAgAFC2JvdWdodFJhbmdlBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQJAGQCBRVib3VnaHRIQ1RpY2tldHNBbW91bnQFD2J1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBQtjaGFuZ2VFbnRyeQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXNlAwtsYXVuY2hwYWRJZAl2cmZIZWlnaHQKc2VjcmV0V29yZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQJc2F2ZWRIYXNoCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gECGNhbGNIYXNoCQDYBAEJAPcDAQkAywECCQCaAwEFCXZyZkhlaWdodAkAmwMBBQpzZWNyZXRXb3JkAwkBAiE9AgUIY2FsY0hhc2gFCXNhdmVkSGFzaAkAAgECHHZyZiBIZWlnaHQgaGFzaCBub3QgbWF0Y2hpbmcEDSR0MDI1NDA2MjU1NTYJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjU0MDYyNTU1NgJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI1NDA2MjU1NTYCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI1NDA2MjU1NTYCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyNTQwNjI1NTU2Al80BA5wcm9qZWN0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBZGRyZXNzBApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgQSdHJhbnNmZXJlZEJ1eUFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAAABBtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQEFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDAAAEFnN3b3BmaU1lbWJlcnNDb21pc3Npb24JAGsDBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFCmNvbW1pc3Npb24AZAQRc3dvcGZpSENDb21pc3Npb24JAGsDBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BQxjb21taXNzaW9uSEMAZAQedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQEEm1hcmtldGluZ0NvbWlzc2lvbgkAawMFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUKY29tbWlzc2lvbgBkBA11bnN0YWtlQW1vdW50CQBlAgkAZAIJAGQCCQBkAgkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUSbWFya2V0aW5nQ29taXNzaW9uBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BRFzd29wZmlIQ0NvbWlzc2lvbgUSdHJhbnNmZXJlZEJ1eUFzc2V0AwkAZgIFEnRyYW5zZmVyZWRCdXlBc3NldAkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAkAAgECKENhbid0IHRyYW5zZmVyIG5lZ2F0aXZlIHZhbHVlIHRvIHByb2plY3QEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUNdW5zdGFrZUFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9qZWN0QWRkcmVzcwkAZQIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFEnRyYW5zZmVyZWRCdXlBc3NldAUKYnV5QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBjb21taXNzaW9uV2FsbGV0CQBkAgkAZAIFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgURc3dvcGZpSENDb21pc3Npb24FCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDWJvdWdodFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAED2JvdWdodEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAED3VzZXJDbGFpbVN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBwQOZmluYWxpemVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAAAAwkAAAIFDmZpbmFsaXplSGVpZ2h0AAAJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwUPdXNlckNsYWltU3RhdHVzCQACAQIXWW91IGFyZSBhbHJlYWR5IGNsYWltZWQDAwMJAAACBQ1ib3VnaHRUaWNrZXRzAAAJAAACBRFib3VnaHRBbGxvY2F0aW9ucwAABwkAAAIFD2JvdWdodEhDVGlja2V0cwAABwkAAgECLllvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHlvdSBkb24ndCBidXkgYW55dGhpbmcEDSR0MDI4NjQwMjg4MTcJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuCQDYBAEFBFVTRE4ECmJ1eUFzc2V0SWQIBQ0kdDAyODY0MDI4ODE3Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMjg2NDAyODgxNwJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjg2NDAyODgxNwJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDI4NjQwMjg4MTcCXzQEDXdvbm5lZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50AAAED3dvbm5lZEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUpa2V5VXNlcldpbm5lZEhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQAAAQUYXdhaWxhYmxlQWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwAABApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAAAEEmFsbG93ZWRBbGxvY2F0aW9ucwkAlwMBCQDMCAIFEWJvdWdodEFsbG9jYXRpb25zCQDMCAIFFGF3YWlsYWJsZUFsbG9jYXRpb25zBQNuaWwECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMjk3MzMyOTg3NwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAyOTczMzI5ODc3Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAyOTczMzI5ODc3Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDI5NzMzMjk4NzcCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAyOTczMzI5ODc3Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTdG9rZW5zUGVyQWxsb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBBR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIJAGQCCQBoAgUNd29ubmVkVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0CQBoAgUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uCQBoAgUPd29ubmVkSENUaWNrZXRzBQ90b2tlbnNQZXJUaWNrZXQEG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwkAaAIJAGUCBRFib3VnaHRBbGxvY2F0aW9ucwUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uBBZidXlBc3NldEZvckFsbG9jYXRpb25zCQBrAwkAawMFG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgkAZAIAZAUKY29tbWlzc2lvbgBkBBpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUNYm91Z2h0VGlja2V0cwUNd29ubmVkVGlja2V0cwULdGlja2V0UHJpY2UJAGQCAGQFCmNvbW1pc3Npb24AZAQcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUPYm91Z2h0SENUaWNrZXRzBQ93b25uZWRIQ1RpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQxjb21taXNzaW9uSEMAZAQPY2xhaW1lZEJ1eVRva2VuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucwAAAwMDCQBmAgAABRZidXlBc3NldEZvckFsbG9jYXRpb25zBgkAZgIAAAUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMGCQBmAgAABRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzCQACAQJSRXJyb3Igd2l0aCBhbGxvd2VkIGFsbG9jYXRpb24gcGFyYW0gb3Igd29ubmVkIHRpY2tldHMgcGFyYW0gcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydAQWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAZQIJAGQCCQBkAgUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMFHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMFFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMFD2NsYWltZWRCdXlUb2tlbgQQdHJhbnNmZXJCdXlBc3NldAMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQpidXlBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMFFnJldHVybmVkQnV5QXNzZXRBbW91bnQFA25pbAUDbmlsBANpbnYDAwkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYEDWNsYWltZWRQYXJhbXMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleUNsYWltUGFyYW1zAghjbGFpbUFsbAIBLAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAIIY2xhaW1BbGwEDnRyYW5zZmVyVG9rZW5zAwkAZgIFFHRyYW5zZmVyVG9rZW5zQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUDbmlsBQ50cmFuc2ZlclRva2VucwUQdHJhbnNmZXJCdXlBc3NldAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAILY2xhaW1QZXJpb2QEDWNsYWltZWRUb2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zAAAEDHVubG9ja1BlcmlvZAkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAgQLYmxvY2tIZWlnaHQJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwADBQ5maW5hbGl6ZUhlaWdodAQMdW5sb2NrSGVpZ2h0CQBkAgUMdW5sb2NrUGVyaW9kBQtibG9ja0hlaWdodAQSYWxsb3dlZFN0YXJ0QW1vdW50CQBrAwUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAEAZAQTYWxsb3dlZFRva2Vuc0Ftb3VudAkAZAIFEmFsbG93ZWRTdGFydEFtb3VudAMJAGYCBQZoZWlnaHQFC2Jsb2NrSGVpZ2h0CQBlAgkAawMJAGUCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUSYWxsb3dlZFN0YXJ0QW1vdW50CQBlAgkAlwMBCQDMCAIFBmhlaWdodAkAzAgCBQx1bmxvY2tIZWlnaHQFA25pbAULYmxvY2tIZWlnaHQFDHVubG9ja1BlcmlvZAUNY2xhaW1lZFRva2VucwkAZQIAAAUNY2xhaW1lZFRva2VucwQQY2xhaW1TdGF0dXNFbnRyeQMJAGcCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIFDWNsYWltZWRUb2tlbnMFE2FsbG93ZWRUb2tlbnNBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMGBQNuaWwFA25pbAMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAABgkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAQOdHJhbnNmZXJUb2tlbnMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUTYWxsb3dlZFRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgUQdHJhbnNmZXJCdXlBc3NldAUOdHJhbnNmZXJUb2tlbnMJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQACAQIWVW5rbm93biBjbGFpbSBmdW5jdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjbGFpbUZyZWV6ZVRva2VuAQtsYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQVZnJlZXplQWRkaXRpb25hbFRva2VuCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUYa2V5RnJlZXplQWRkaXRpb25hbFRva2VuBwMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAkAAgECMVlvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHJlc3VsdHMgYXJlIG5vdCBmaW5hbGl6ZWQDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkAAgECOVRoZXJlIGFyZSBubyBhZGRpdGlvbmFsIHRva2VuIGZyZWV6aW5nIGZvciB0aGlzIGxhdW5jaHBhZAQHdG9rZW5JZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQEEXVzZXJUb2tlbnNGcmVlemVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAQLc3RhcnRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAAABAhkdXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uAAAEE2ZyZWV6ZVRva2VuRHVyYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgQOYmxvY2tFbmRIZWlnaHQJAGQCCQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uBRNmcmVlemVUb2tlbkR1cmF0aW9uAwkAAAIFEXVzZXJUb2tlbnNGcmVlemVkAAAJAAIBAjhZb3UgYXJlIGFscmVhZHkgY2xhaW1lZCB5b3VyIHRva2VucyBvciBub3QgcGFpZCBhbnl0aGluZwMJAGYCBQ5ibG9ja0VuZEhlaWdodAUGaGVpZ2h0CQACAQkArAICAhlZb3VyIHRva2VucyBmcmVlemVkIHRlZWwgCQCkAwEFDmJsb2NrRW5kSGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURdXNlclRva2Vuc0ZyZWV6ZWQFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAUDbmlsAWkBEHRyYW5zZmVyQnV5QXNzZXQCC2xhdW5jaHBhZElkBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQNJHQwMzYwNDIzNjE5MgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAzNjA0MjM2MTkyAl8xBA1idXlBc3NldFN0cklkCAUNJHQwMzYwNDIzNjE5MgJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMzYwNDIzNjE5MgJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDM2MDQyMzYxOTICXzQEEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQDaW52AwMJAGYCBQZhbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUGYW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0CQBkAgUSdHJhbnNmZXJlZEJ1eUFzc2V0BQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MFBmFtb3VudAUKYnV5QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQIVREFwcCBhbHJlYWR5IGluYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrZXlBY3RpdmUHBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQITREFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBgUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRJhZG1pblB1YktleVN0YWtpbmcEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACD0RhdGFUcmFuc2FjdGlvbgQDZHR4BQckbWF0Y2gwAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cwcFDXNpZ25lZEJ5QWRtaW4HBRNtdWx0aVNpZ25lZEJ5QWRtaW5zjYZ2yA==", "height": 2723116, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5Unuj6SH4L7t9EfURPMuZpSKjFF42oHnwvHsHJaE7jfk Next: 2JDR8bGKCEusjNJXAdbsbmjLPUXmVRiKHsCpv13E7o8w Diff:
OldNewDifferences
125125
126126 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
127127
128+let WAVES_XTN_EX = Address(base58'3Mr73hWEyivaVitnLKceS6TuL2aZPZMXqjj')
129+
128130 let maxAllocationsAmount = 2
129131
130132 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
187189 }
188190
189191
192+func buyInWaves (launchpadId,ticketsAmount,type) = {
193+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
194+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
195+ let $t053365480 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
196+ let tokenId = $t053365480._1
197+ let tokenStrAssetId = $t053365480._2
198+ let tokenAssetName = $t053365480._3
199+ let tokenDecimals = $t053365480._4
200+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
201+ let commissionPerTicket = if ((type == 1))
202+ then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
203+ else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
204+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
205+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), USDN]], nil)
206+ if ($isInstanceOf(@, "(Int, String)"))
207+ then @
208+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
209+ if ((amntToPay == amntToPay))
210+ then fraction(amntToPay, 101, 100)
211+ else throw("Strict value is not equal to itself.")
212+ }
213+
214+
190215 @Callable(i)
191216 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
192217
211236 else {
212237 let launchpadId = getLaunchpadNextId()
213238 let launchpadIdStr = toString(launchpadId)
214- let $t064996574 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
215- let pmtAmount = $t064996574._1
216- let pmtAssetId = $t064996574._2
217- let $t065836656 = getAssetInfo(pmtAssetId)
218- let pmtStrAssetId = $t065836656._1
219- let pmtAssetName = $t065836656._2
220- let pmtDecimals = $t065836656._3
239+ let $t076197694 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
240+ let pmtAmount = $t076197694._1
241+ let pmtAssetId = $t076197694._2
242+ let $t077037776 = getAssetInfo(pmtAssetId)
243+ let pmtStrAssetId = $t077037776._1
244+ let pmtAssetName = $t077037776._2
245+ let pmtDecimals = $t077037776._3
221246 let freezeAdditionalEntry = if (freezeAdditionalToken)
222247 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
223248 else nil
228253
229254 @Callable(i)
230255 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
231- let $t092629337 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
232- let pmtAmount = $t092629337._1
233- let pmtAssetId = $t092629337._2
234- let $t093429492 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
235- let buyAssetId = $t093429492._1
236- let buyAssetStrId = $t093429492._2
237- let buyAssetName = $t093429492._3
238- let buyAssetDecimals = $t093429492._4
256+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
257+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
258+ let $t01055910703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
259+ let tokenId = $t01055910703._1
260+ let tokenStrAssetId = $t01055910703._2
261+ let tokenAssetName = $t01055910703._3
262+ let tokenDecimals = $t01055910703._4
263+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
264+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
265+ let $t01092011070 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
266+ let buyAssetId = $t01092011070._1
267+ let buyAssetStrId = $t01092011070._2
268+ let buyAssetName = $t01092011070._3
269+ let buyAssetDecimals = $t01092011070._4
239270 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
240271 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
241272 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
243274 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
244275 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
245276 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
277+ let $t01179512843 = if ((i.payments[0].assetId == unit))
278+ then {
279+ let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
280+ if ($isInstanceOf(@, "(Int, String, Int, Int)"))
281+ then @
282+ else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
283+ if ((amntToGet == amntToGet))
284+ then {
285+ let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
286+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
287+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
288+ if ($isInstanceOf(@, "(Int, String)"))
289+ then @
290+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
291+ if ((amntToPay == amntToPay))
292+ then {
293+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
294+ if ((ex == ex))
295+ then {
296+ let change = (i.payments[0].amount - amntToGetTickets)
297+ let cEntry = if ((change > 0))
298+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
299+ else nil
300+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
301+ }
302+ else throw("Strict value is not equal to itself.")
303+ }
304+ else throw("Strict value is not equal to itself.")
305+ }
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
309+ let pmtAmount = $t01179512843._1
310+ let pmtAssetId = $t01179512843._2
311+ let changeEntry = $t01179512843._3
246312 if ((activeLaunchpadId != launchpadId))
247313 then throw("There is no active launchpad or this launchpad is ended")
248314 else if ((startHeight > height))
269335 else (0 >= allowedTicketsAmount))
270336 then throw("Not enought SWOP in staking to buy tickets")
271337 else {
272- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
273- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
274- let $t01130411448 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
275- let tokenId = $t01130411448._1
276- let tokenStrAssetId = $t01130411448._2
277- let tokenAssetName = $t01130411448._3
278- let tokenDecimals = $t01130411448._4
279- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
280- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
281338 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
282339 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
283340 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
291348 then {
292349 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
293350 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
294- let $t01261212699 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
295- let pmtAmountFreeze = $t01261212699._1
296- let pmtAssetIdFreeze = $t01261212699._2
297- let $t01271612807 = getAssetInfo(pmtAssetId)
298- let pmtFreezeStrAssetId = $t01271612807._1
299- let pmtFreezeAssetName = $t01271612807._2
300- let pmtFreezeDecimals = $t01271612807._3
351+ let $t01468614773 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
352+ let pmtAmountFreeze = $t01468614773._1
353+ let pmtAssetIdFreeze = $t01468614773._2
354+ let $t01479014881 = getAssetInfo(pmtAssetId)
355+ let pmtFreezeStrAssetId = $t01479014881._1
356+ let pmtFreezeAssetName = $t01479014881._2
357+ let pmtFreezeDecimals = $t01479014881._3
301358 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
302359 if (if ((pmtFreezeStrAssetId != freezeTokenId))
303360 then true
317374 else 0
318375 if ((inv == inv))
319376 then {
320- let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry)
377+ let baseEntry = (([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry) ++ changeEntry)
321378 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
322379 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
323380 else baseEntry
331388
332389 @Callable(i)
333390 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
334- let $t01487814953 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
335- let pmtAmount = $t01487814953._1
336- let pmtAssetId = $t01487814953._2
337- let $t01495815108 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
338- let buyAssetId = $t01495815108._1
339- let buyAssetStrId = $t01495815108._2
340- let buyAssetName = $t01495815108._3
341- let buyAssetDecimals = $t01495815108._4
391+ let $t01696717042 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
392+ let pmtAmount = $t01696717042._1
393+ let pmtAssetId = $t01696717042._2
394+ let $t01704717197 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
395+ let buyAssetId = $t01704717197._1
396+ let buyAssetStrId = $t01704717197._2
397+ let buyAssetName = $t01704717197._3
398+ let buyAssetDecimals = $t01704717197._4
342399 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
343400 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
344401 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
345402 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
346403 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
347404 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
348- let $t01577715921 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
349- let tokenId = $t01577715921._1
350- let tokenStrAssetId = $t01577715921._2
351- let tokenAssetName = $t01577715921._3
352- let tokenDecimals = $t01577715921._4
405+ let $t01786618010 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
406+ let tokenId = $t01786618010._1
407+ let tokenStrAssetId = $t01786618010._2
408+ let tokenAssetName = $t01786618010._3
409+ let tokenDecimals = $t01786618010._4
353410 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
354411 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
355412 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
389446
390447 @Callable(i)
391448 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
392- let $t01817918254 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393- let pmtAmount = $t01817918254._1
394- let pmtAssetId = $t01817918254._2
395- let $t01825918409 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
396- let buyAssetId = $t01825918409._1
397- let buyAssetStrId = $t01825918409._2
398- let buyAssetName = $t01825918409._3
399- let buyAssetDecimals = $t01825918409._4
449+ let $t02026820418 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
450+ let buyAssetId = $t02026820418._1
451+ let buyAssetStrId = $t02026820418._2
452+ let buyAssetName = $t02026820418._3
453+ let buyAssetDecimals = $t02026820418._4
400454 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
401455 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
402456 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
403457 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
458+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
459+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
460+ let $t02102821172 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
461+ let tokenId = $t02102821172._1
462+ let tokenStrAssetId = $t02102821172._2
463+ let tokenAssetName = $t02102821172._3
464+ let tokenDecimals = $t02102821172._4
465+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
466+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
467+ let $t02140522453 = if ((i.payments[0].assetId == unit))
468+ then {
469+ let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
470+ if ($isInstanceOf(@, "(Int, String, Int, Int)"))
471+ then @
472+ else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
473+ if ((amntToGet == amntToGet))
474+ then {
475+ let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
476+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
477+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
478+ if ($isInstanceOf(@, "(Int, String)"))
479+ then @
480+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
481+ if ((amntToPay == amntToPay))
482+ then {
483+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
484+ if ((ex == ex))
485+ then {
486+ let change = (i.payments[0].amount - amntToGetTickets)
487+ let cEntry = if ((change > 0))
488+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
489+ else nil
490+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
491+ }
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
496+ else throw("Strict value is not equal to itself.")
497+ }
498+ else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
499+ let pmtAmount = $t02140522453._1
500+ let pmtAssetId = $t02140522453._2
501+ let changeEntry = $t02140522453._3
404502 if ((activeLaunchpadId != launchpadId))
405503 then throw("There is no active launchpad or this launchpad is ended")
406504 else if (!(highCompetitionSale))
414512 else (pmtAssetId != buyAssetId))
415513 then throw((("One attached payment in " + buyAssetName) + " expected"))
416514 else {
417- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
418- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
419- let $t01958219726 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
420- let tokenId = $t01958219726._1
421- let tokenStrAssetId = $t01958219726._2
422- let tokenAssetName = $t01958219726._3
423- let tokenDecimals = $t01958219726._4
424- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
425- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
426515 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
427516 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
428517 let change = (pmtAmount - buyPriceWithComission)
442531 else 0
443532 if ((inv == inv))
444533 then {
445- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
534+ let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)] ++ changeEntry)
446535 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
447536 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
448537 else baseEntry
461550 if ((calcHash != savedHash))
462551 then throw("vrf Height hash not matching")
463552 else {
464- let $t02233922489 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465- let buyAssetId = $t02233922489._1
466- let buyAssetStrId = $t02233922489._2
467- let buyAssetName = $t02233922489._3
468- let buyAssetDecimals = $t02233922489._4
553+ let $t02540625556 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
554+ let buyAssetId = $t02540625556._1
555+ let buyAssetStrId = $t02540625556._2
556+ let buyAssetName = $t02540625556._3
557+ let buyAssetDecimals = $t02540625556._4
469558 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
470559 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
471560 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
510599 else false)
511600 then throw("You can't claim because you don't buy anything")
512601 else {
513- let $t02557325750 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
514- let buyAssetId = $t02557325750._1
515- let buyAssetStrId = $t02557325750._2
516- let buyAssetName = $t02557325750._3
517- let buyAssetDecimals = $t02557325750._4
602+ let $t02864028817 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
603+ let buyAssetId = $t02864028817._1
604+ let buyAssetStrId = $t02864028817._2
605+ let buyAssetName = $t02864028817._3
606+ let buyAssetDecimals = $t02864028817._4
518607 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
519608 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
520609 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
523612 let allowedAllocations = min([boughtAllocations, awailableAllocations])
524613 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
525614 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
526- let $t02666626810 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527- let tokenId = $t02666626810._1
528- let tokenStrAssetId = $t02666626810._2
529- let tokenAssetName = $t02666626810._3
530- let tokenDecimals = $t02666626810._4
615+ let $t02973329877 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
616+ let tokenId = $t02973329877._1
617+ let tokenStrAssetId = $t02973329877._2
618+ let tokenAssetName = $t02973329877._3
619+ let tokenDecimals = $t02973329877._4
531620 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
532621 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
533622 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
622711 @Callable(i)
623712 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
624713 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
625- let $t03297533125 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
626- let buyAssetId = $t03297533125._1
627- let buyAssetStrId = $t03297533125._2
628- let buyAssetName = $t03297533125._3
629- let buyAssetDecimals = $t03297533125._4
714+ let $t03604236192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
715+ let buyAssetId = $t03604236192._1
716+ let buyAssetStrId = $t03604236192._2
717+ let buyAssetName = $t03604236192._3
718+ let buyAssetDecimals = $t03604236192._4
630719 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
631720 let inv = if (if ((amount > 0))
632721 then (buyAssetId == USDN)
653742 else [BooleanEntry(keyActive, true)])
654743
655744
745+@Verifier(tx)
746+func verify () = {
747+ let multiSignedByAdmins = {
748+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
749+ then 1
750+ else 0
751+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
752+ then 1
753+ else 0
754+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
755+ then 1
756+ else 0
757+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
758+ }
759+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
760+ then true
761+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
762+ then true
763+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
764+ then true
765+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
766+ match tx {
767+ case dtx: DataTransaction =>
768+ if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
769+ then signedByAdmin
770+ else false
771+ case _ =>
772+ multiSignedByAdmins
773+ }
774+ }
775+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let keyAdminPubKey1 = "admin_pub_1"
99
1010 let keyAdminPubKey2 = "admin_pub_2"
1111
1212 let keyAdminPubKey3 = "admin_pub_3"
1313
1414 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1515
1616 let keyLaunchpadNextId = "launchpad_next_id"
1717
1818 let keyLaunchpadActiveId = "launchpad_active_id"
1919
2020 let keyInitCaller = "init_caller"
2121
2222 let keyAddress = "_address"
2323
2424 let keyInitHeight = "_init_height"
2525
2626 let keyStartHeight = "_start_height"
2727
2828 let keyFinaliseHeight = "_finalise_height"
2929
3030 let keyComission = "_comission"
3131
3232 let keyAssetId = "_asset_id"
3333
3434 let keyTotalTokenAmount = "_total_token_amount"
3535
3636 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3737
3838 let keyTokensPerTicket = "_tokens_per_ticket"
3939
4040 let keyPricePerToken = "_price_per_token"
4141
4242 let keySwopPerTicket = "_swop_per_ticket"
4343
4444 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4545
4646 let keyCampaignTokensAmount = "_tokens_access_list"
4747
4848 let keyTokensPerAllocation = "_tokens_per_allocation"
4949
5050 let keyTicketLastNumber = "_ticket_last_number"
5151
5252 let keyGovernanceStaked = "_GSwop_amount"
5353
5454 let keyUserRefId = "_ref_id"
5555
5656 let keyVerifyHash = "_verify_hash"
5757
5858 let keyDuration = "_duration"
5959
6060 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
6161
6262 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6363
6464 let keyTransferBuyAsset = "_transfer_buy_asset"
6565
6666 let keyFreezSwopDuration = "_freeze_swop_duration"
6767
6868 let keyFreezeAdditionalToken = "_freeze_additional_token"
6969
7070 let keyFreezeTokenId = "_freeze_token_id"
7171
7272 let keyFreezeTokenDuration = "_freeze_token_duration"
7373
7474 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7575
7676 let keyBuyToken = "_buy_token"
7777
7878 let keyClaimParams = "_claim_params"
7979
8080 let keyHighCompetitionComission = "_high_competition_comission"
8181
8282 let keyHighCompetitionSale = "_high_competition_sale"
8383
8484 let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
8585
8686 let keyHighCompetitionAmount = "_tickets_high_competition"
8787
8888 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8989
9090 let keyUserClaimedTokens = "_claimed_tokens"
9191
9292 let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
9393
9494 let keyUserBoughtTicketsAmount = "_bought_tickets"
9595
9696 let keyUserTickets = "_tickets_number"
9797
9898 let keyUserHCTickets = "_tickets_number_high_competition"
9999
100100 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
101101
102102 let keyUserAvailableAllocations = "_available_purchase_marketing"
103103
104104 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
105105
106106 let keyUserBoughtAllocations = "_bought_allocations"
107107
108108 let keyUserClaimStatus = "_claim_status"
109109
110110 let keyUserWinnedTicketsAmount = "_tickets_result"
111111
112112 let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
113113
114114 let keyUserFreezeToken = "_freeze_token_amount"
115115
116116 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
117117
118118 let governance = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
119119
120120 let commissionWallet = Address(base58'3N2eueE5vLLKe8jXuBDbdbKcPaH36yG1Had')
121121
122122 let stakingUSDNAddress = Address(base58'3N8STSY7dWpBYLiCimEQMkRizyWePSX3qQx')
123123
124124 let USDN = base58'4W19ndijcc2CsQa9HGW2dfXKTVXhnneWWttxXrtjPmEp'
125125
126126 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
127127
128+let WAVES_XTN_EX = Address(base58'3Mr73hWEyivaVitnLKceS6TuL2aZPZMXqjj')
129+
128130 let maxAllocationsAmount = 2
129131
130132 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
131133
132134 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
133135 case string: String =>
134136 fromBase58String(string)
135137 case nothing =>
136138 throw("Admin public key is empty")
137139 }
138140
139141
140142 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
141143
142144 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
143145
144146 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
145147
146148 func getAssetInfo (assetId) = match assetId {
147149 case id: ByteVector =>
148150 let stringId = toBase58String(id)
149151 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
150152 $Tuple3(stringId, info.name, info.decimals)
151153 case waves: Unit =>
152154 $Tuple3("WAVES", "WAVES", 8)
153155 case _ =>
154156 throw("Match error")
155157 }
156158
157159
158160 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
159161
160162
161163 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
162164
163165
164166 let active = valueOrElse(getBoolean(this, keyActive), true)
165167
166168 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
167169
168170 func isActive () = if (if (active)
169171 then activeGlob
170172 else false)
171173 then unit
172174 else throw("DApp is inactive at this moment")
173175
174176
175177 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
176178 then unit
177179 else throw("Only admin can call this function")
178180
179181
180182 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
181183 then $Tuple4(unit, "WAVES", "WAVES", 8)
182184 else {
183185 let stringId = assetStr
184186 let id = fromBase58String(assetStr)
185187 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
186188 $Tuple4(id, stringId, info.name, info.decimals)
187189 }
188190
189191
192+func buyInWaves (launchpadId,ticketsAmount,type) = {
193+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
194+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
195+ let $t053365480 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
196+ let tokenId = $t053365480._1
197+ let tokenStrAssetId = $t053365480._2
198+ let tokenAssetName = $t053365480._3
199+ let tokenDecimals = $t053365480._4
200+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
201+ let commissionPerTicket = if ((type == 1))
202+ then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
203+ else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
204+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
205+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), USDN]], nil)
206+ if ($isInstanceOf(@, "(Int, String)"))
207+ then @
208+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
209+ if ((amntToPay == amntToPay))
210+ then fraction(amntToPay, 101, 100)
211+ else throw("Strict value is not equal to itself.")
212+ }
213+
214+
190215 @Callable(i)
191216 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
192217
193218
194219
195220 @Callable(i)
196221 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
197222
198223
199224
200225 @Callable(i)
201226 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = valueOrElse(isActive(), if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
202227 then throw("Only project admin can call init function")
203228 else if ((size(i.payments) != 1))
204229 then throw("One attached payment expected")
205230 else if ((height > startHeight))
206231 then throw("Start height must be greater than blockchain height")
207232 else if (if (freezeAdditionalToken)
208233 then (size(freezeParams) != 3)
209234 else false)
210235 then throw("Freeze params list must have 3 items")
211236 else {
212237 let launchpadId = getLaunchpadNextId()
213238 let launchpadIdStr = toString(launchpadId)
214- let $t064996574 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
215- let pmtAmount = $t064996574._1
216- let pmtAssetId = $t064996574._2
217- let $t065836656 = getAssetInfo(pmtAssetId)
218- let pmtStrAssetId = $t065836656._1
219- let pmtAssetName = $t065836656._2
220- let pmtDecimals = $t065836656._3
239+ let $t076197694 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
240+ let pmtAmount = $t076197694._1
241+ let pmtAssetId = $t076197694._2
242+ let $t077037776 = getAssetInfo(pmtAssetId)
243+ let pmtStrAssetId = $t077037776._1
244+ let pmtAssetName = $t077037776._2
245+ let pmtDecimals = $t077037776._3
221246 let freezeAdditionalEntry = if (freezeAdditionalToken)
222247 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
223248 else nil
224249 ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyHCTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
225250 })
226251
227252
228253
229254 @Callable(i)
230255 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
231- let $t092629337 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
232- let pmtAmount = $t092629337._1
233- let pmtAssetId = $t092629337._2
234- let $t093429492 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
235- let buyAssetId = $t093429492._1
236- let buyAssetStrId = $t093429492._2
237- let buyAssetName = $t093429492._3
238- let buyAssetDecimals = $t093429492._4
256+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
257+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
258+ let $t01055910703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
259+ let tokenId = $t01055910703._1
260+ let tokenStrAssetId = $t01055910703._2
261+ let tokenAssetName = $t01055910703._3
262+ let tokenDecimals = $t01055910703._4
263+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
264+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
265+ let $t01092011070 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
266+ let buyAssetId = $t01092011070._1
267+ let buyAssetStrId = $t01092011070._2
268+ let buyAssetName = $t01092011070._3
269+ let buyAssetDecimals = $t01092011070._4
239270 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
240271 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
241272 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
242273 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
243274 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
244275 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
245276 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
277+ let $t01179512843 = if ((i.payments[0].assetId == unit))
278+ then {
279+ let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
280+ if ($isInstanceOf(@, "(Int, String, Int, Int)"))
281+ then @
282+ else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
283+ if ((amntToGet == amntToGet))
284+ then {
285+ let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
286+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
287+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
288+ if ($isInstanceOf(@, "(Int, String)"))
289+ then @
290+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
291+ if ((amntToPay == amntToPay))
292+ then {
293+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
294+ if ((ex == ex))
295+ then {
296+ let change = (i.payments[0].amount - amntToGetTickets)
297+ let cEntry = if ((change > 0))
298+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
299+ else nil
300+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
301+ }
302+ else throw("Strict value is not equal to itself.")
303+ }
304+ else throw("Strict value is not equal to itself.")
305+ }
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
309+ let pmtAmount = $t01179512843._1
310+ let pmtAssetId = $t01179512843._2
311+ let changeEntry = $t01179512843._3
246312 if ((activeLaunchpadId != launchpadId))
247313 then throw("There is no active launchpad or this launchpad is ended")
248314 else if ((startHeight > height))
249315 then throw("Launchpad sale not started yet")
250316 else if ((height > (startHeight + duration)))
251317 then throw("Launchpad sale ended")
252318 else if (if (!(freezeAdditionalToken))
253319 then if ((size(i.payments) != 1))
254320 then true
255321 else (pmtAssetId != buyAssetId)
256322 else false)
257323 then throw((("One attached payment in " + buyAssetName) + " expected"))
258324 else if (if (freezeAdditionalToken)
259325 then if ((size(i.payments) != 2))
260326 then true
261327 else (pmtAssetId != buyAssetId)
262328 else false)
263329 then {
264330 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
265331 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
266332 }
267333 else if (if ((0 >= allowedTicketsAmountAll))
268334 then true
269335 else (0 >= allowedTicketsAmount))
270336 then throw("Not enought SWOP in staking to buy tickets")
271337 else {
272- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
273- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
274- let $t01130411448 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
275- let tokenId = $t01130411448._1
276- let tokenStrAssetId = $t01130411448._2
277- let tokenAssetName = $t01130411448._3
278- let tokenDecimals = $t01130411448._4
279- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
280- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
281338 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
282339 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
283340 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
284341 let change = (pmtAmount - allowedBuyPriceWithComission)
285342 if ((buyTicketAmount == 0))
286343 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
287344 else if ((change != 0))
288345 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
289346 else {
290347 let freezeAdditionalEntry = if (freezeAdditionalToken)
291348 then {
292349 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
293350 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
294- let $t01261212699 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
295- let pmtAmountFreeze = $t01261212699._1
296- let pmtAssetIdFreeze = $t01261212699._2
297- let $t01271612807 = getAssetInfo(pmtAssetId)
298- let pmtFreezeStrAssetId = $t01271612807._1
299- let pmtFreezeAssetName = $t01271612807._2
300- let pmtFreezeDecimals = $t01271612807._3
351+ let $t01468614773 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
352+ let pmtAmountFreeze = $t01468614773._1
353+ let pmtAssetIdFreeze = $t01468614773._2
354+ let $t01479014881 = getAssetInfo(pmtAssetId)
355+ let pmtFreezeStrAssetId = $t01479014881._1
356+ let pmtFreezeAssetName = $t01479014881._2
357+ let pmtFreezeDecimals = $t01479014881._3
301358 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
302359 if (if ((pmtFreezeStrAssetId != freezeTokenId))
303360 then true
304361 else (needFreezeTokens != pmtAmountFreeze))
305362 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
306363 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
307364 }
308365 else nil
309366 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
310367 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
311368 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
312369 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
313370 then ("," + boughtRange)
314371 else ("" + boughtRange)))
315372 let inv = if ((buyAssetId == USDN))
316373 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
317374 else 0
318375 if ((inv == inv))
319376 then {
320- let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry)
377+ let baseEntry = (([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry) ++ changeEntry)
321378 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
322379 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
323380 else baseEntry
324381 }
325382 else throw("Strict value is not equal to itself.")
326383 }
327384 }
328385 })
329386
330387
331388
332389 @Callable(i)
333390 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
334- let $t01487814953 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
335- let pmtAmount = $t01487814953._1
336- let pmtAssetId = $t01487814953._2
337- let $t01495815108 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
338- let buyAssetId = $t01495815108._1
339- let buyAssetStrId = $t01495815108._2
340- let buyAssetName = $t01495815108._3
341- let buyAssetDecimals = $t01495815108._4
391+ let $t01696717042 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
392+ let pmtAmount = $t01696717042._1
393+ let pmtAssetId = $t01696717042._2
394+ let $t01704717197 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
395+ let buyAssetId = $t01704717197._1
396+ let buyAssetStrId = $t01704717197._2
397+ let buyAssetName = $t01704717197._3
398+ let buyAssetDecimals = $t01704717197._4
342399 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
343400 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
344401 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
345402 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
346403 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
347404 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
348- let $t01577715921 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
349- let tokenId = $t01577715921._1
350- let tokenStrAssetId = $t01577715921._2
351- let tokenAssetName = $t01577715921._3
352- let tokenDecimals = $t01577715921._4
405+ let $t01786618010 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
406+ let tokenId = $t01786618010._1
407+ let tokenStrAssetId = $t01786618010._2
408+ let tokenAssetName = $t01786618010._3
409+ let tokenDecimals = $t01786618010._4
353410 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
354411 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
355412 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
356413 if ((activeLaunchpadId != launchpadId))
357414 then throw("There is no active launchpad or this launchpad is ended")
358415 else if ((startHeight > height))
359416 then throw("Launchpad sale not started yet")
360417 else if ((height > (startHeight + duration)))
361418 then throw("Launchpad sale ended")
362419 else if (if ((size(i.payments) != 1))
363420 then true
364421 else (pmtAssetId != buyAssetId))
365422 then throw((("One attached payment in " + buyAssetName) + " expected"))
366423 else if ((boughtAllocations >= maxAllocationsAmount))
367424 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
368425 else if (if ((allocationPriceWithComission != pmtAmount))
369426 then ((allocationPriceWithComission * 2) != pmtAmount)
370427 else false)
371428 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
372429 else {
373430 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
374431 let inv = if ((buyAssetId == USDN))
375432 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
376433 else 0
377434 if ((inv == inv))
378435 then {
379436 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountBuyAssetInMarketing), (usdnInMarketing + pmtAmount))]
380437 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
381438 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
382439 else baseEntry
383440 }
384441 else throw("Strict value is not equal to itself.")
385442 }
386443 })
387444
388445
389446
390447 @Callable(i)
391448 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
392- let $t01817918254 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393- let pmtAmount = $t01817918254._1
394- let pmtAssetId = $t01817918254._2
395- let $t01825918409 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
396- let buyAssetId = $t01825918409._1
397- let buyAssetStrId = $t01825918409._2
398- let buyAssetName = $t01825918409._3
399- let buyAssetDecimals = $t01825918409._4
449+ let $t02026820418 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
450+ let buyAssetId = $t02026820418._1
451+ let buyAssetStrId = $t02026820418._2
452+ let buyAssetName = $t02026820418._3
453+ let buyAssetDecimals = $t02026820418._4
400454 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
401455 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
402456 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
403457 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
458+ let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
459+ let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
460+ let $t02102821172 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
461+ let tokenId = $t02102821172._1
462+ let tokenStrAssetId = $t02102821172._2
463+ let tokenAssetName = $t02102821172._3
464+ let tokenDecimals = $t02102821172._4
465+ let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
466+ let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
467+ let $t02140522453 = if ((i.payments[0].assetId == unit))
468+ then {
469+ let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
470+ if ($isInstanceOf(@, "(Int, String, Int, Int)"))
471+ then @
472+ else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
473+ if ((amntToGet == amntToGet))
474+ then {
475+ let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
476+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
477+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
478+ if ($isInstanceOf(@, "(Int, String)"))
479+ then @
480+ else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
481+ if ((amntToPay == amntToPay))
482+ then {
483+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
484+ if ((ex == ex))
485+ then {
486+ let change = (i.payments[0].amount - amntToGetTickets)
487+ let cEntry = if ((change > 0))
488+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
489+ else nil
490+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
491+ }
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
496+ else throw("Strict value is not equal to itself.")
497+ }
498+ else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
499+ let pmtAmount = $t02140522453._1
500+ let pmtAssetId = $t02140522453._2
501+ let changeEntry = $t02140522453._3
404502 if ((activeLaunchpadId != launchpadId))
405503 then throw("There is no active launchpad or this launchpad is ended")
406504 else if (!(highCompetitionSale))
407505 then throw("There is no high competition sale for this launchpad")
408506 else if ((startHeight > height))
409507 then throw("Launchpad sale not started yet")
410508 else if ((height > (startHeight + duration)))
411509 then throw("Launchpad sale ended")
412510 else if (if ((size(i.payments) != 1))
413511 then true
414512 else (pmtAssetId != buyAssetId))
415513 then throw((("One attached payment in " + buyAssetName) + " expected"))
416514 else {
417- let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
418- let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
419- let $t01958219726 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
420- let tokenId = $t01958219726._1
421- let tokenStrAssetId = $t01958219726._2
422- let tokenAssetName = $t01958219726._3
423- let tokenDecimals = $t01958219726._4
424- let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
425- let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
426515 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
427516 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
428517 let change = (pmtAmount - buyPriceWithComission)
429518 if ((buyTicketAmount == 0))
430519 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
431520 else if ((change != 0))
432521 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
433522 else {
434523 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
435524 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
436525 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
437526 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
438527 then ("," + boughtRange)
439528 else ("" + boughtRange)))
440529 let inv = if ((buyAssetId == USDN))
441530 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
442531 else 0
443532 if ((inv == inv))
444533 then {
445- let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
534+ let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)] ++ changeEntry)
446535 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
447536 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
448537 else baseEntry
449538 }
450539 else throw("Strict value is not equal to itself.")
451540 }
452541 }
453542 })
454543
455544
456545
457546 @Callable(i)
458547 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
459548 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
460549 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
461550 if ((calcHash != savedHash))
462551 then throw("vrf Height hash not matching")
463552 else {
464- let $t02233922489 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465- let buyAssetId = $t02233922489._1
466- let buyAssetStrId = $t02233922489._2
467- let buyAssetName = $t02233922489._3
468- let buyAssetDecimals = $t02233922489._4
553+ let $t02540625556 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
554+ let buyAssetId = $t02540625556._1
555+ let buyAssetStrId = $t02540625556._2
556+ let buyAssetName = $t02540625556._3
557+ let buyAssetDecimals = $t02540625556._4
469558 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
470559 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
471560 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
472561 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
473562 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
474563 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
475564 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
476565 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
477566 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
478567 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
479568 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
480569 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
481570 then throw("Can't transfer negative value to project")
482571 else {
483572 let inv = if ((buyAssetId == USDN))
484573 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
485574 else 0
486575 if ((inv == inv))
487576 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
488577 else throw("Strict value is not equal to itself.")
489578 }
490579 }
491580 }))
492581
493582
494583
495584 @Callable(i)
496585 func claim (launchpadId) = valueOrElse(isActive(), {
497586 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
498587 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
499588 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
500589 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
501590 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
502591 if ((finalizeHeight == 0))
503592 then throw("You can't claim because results are not finalized")
504593 else if (userClaimStatus)
505594 then throw("You are already claimed")
506595 else if (if (if ((boughtTickets == 0))
507596 then (boughtAllocations == 0)
508597 else false)
509598 then (boughtHCTickets == 0)
510599 else false)
511600 then throw("You can't claim because you don't buy anything")
512601 else {
513- let $t02557325750 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
514- let buyAssetId = $t02557325750._1
515- let buyAssetStrId = $t02557325750._2
516- let buyAssetName = $t02557325750._3
517- let buyAssetDecimals = $t02557325750._4
602+ let $t02864028817 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
603+ let buyAssetId = $t02864028817._1
604+ let buyAssetStrId = $t02864028817._2
605+ let buyAssetName = $t02864028817._3
606+ let buyAssetDecimals = $t02864028817._4
518607 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
519608 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
520609 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
521610 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
522611 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
523612 let allowedAllocations = min([boughtAllocations, awailableAllocations])
524613 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
525614 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
526- let $t02666626810 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527- let tokenId = $t02666626810._1
528- let tokenStrAssetId = $t02666626810._2
529- let tokenAssetName = $t02666626810._3
530- let tokenDecimals = $t02666626810._4
615+ let $t02973329877 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
616+ let tokenId = $t02973329877._1
617+ let tokenStrAssetId = $t02973329877._2
618+ let tokenAssetName = $t02973329877._3
619+ let tokenDecimals = $t02973329877._4
531620 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
532621 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
533622 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
534623 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
535624 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
536625 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
537626 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
538627 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
539628 if (if (if ((0 > buyAssetForAllocations))
540629 then true
541630 else (0 > buyAssetForUnwonnedTickets))
542631 then true
543632 else (0 > buyAssetForHCUnwonnedTickets))
544633 then throw("Error with allowed allocation param or wonned tickets param please contact support")
545634 else {
546635 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
547636 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
548637 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
549638 else nil
550639 let inv = if (if ((returnedBuyAssetAmount > 0))
551640 then (buyAssetId == USDN)
552641 else false)
553642 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
554643 else 0
555644 if ((inv == inv))
556645 then {
557646 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
558647 if ((claimedParams[0] == "claimAll"))
559648 then {
560649 let transferTokens = if ((transferTokensAmount > 0))
561650 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
562651 else nil
563652 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
564653 }
565654 else if ((claimedParams[0] == "claimPeriod"))
566655 then {
567656 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
568657 let unlockPeriod = value(parseInt(claimedParams[2]))
569658 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
570659 let unlockHeight = (unlockPeriod + blockHeight)
571660 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
572661 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
573662 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
574663 else (0 - claimedTokens)))
575664 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
576665 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
577666 else nil
578667 if (if ((allowedTokensAmount > 0))
579668 then true
580669 else (returnedBuyAssetAmount > 0))
581670 then {
582671 let transferTokens = if ((allowedTokensAmount > 0))
583672 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
584673 else nil
585674 (transferBuyAsset ++ transferTokens)
586675 }
587676 else throw("Nothing to claim")
588677 }
589678 else throw("Unknown claim function")
590679 }
591680 else throw("Strict value is not equal to itself.")
592681 }
593682 }
594683 })
595684
596685
597686
598687 @Callable(i)
599688 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
600689 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
601690 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
602691 then throw("You can't claim because results are not finalized")
603692 else if (!(freezeAdditionalToken))
604693 then throw("There are no additional token freezing for this launchpad")
605694 else {
606695 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
607696 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
608697 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
609698 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
610699 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
611700 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
612701 if ((userTokensFreezed == 0))
613702 then throw("You are already claimed your tokens or not paid anything")
614703 else if ((blockEndHeight > height))
615704 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
616705 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
617706 }
618707 })
619708
620709
621710
622711 @Callable(i)
623712 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
624713 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
625- let $t03297533125 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
626- let buyAssetId = $t03297533125._1
627- let buyAssetStrId = $t03297533125._2
628- let buyAssetName = $t03297533125._3
629- let buyAssetDecimals = $t03297533125._4
714+ let $t03604236192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
715+ let buyAssetId = $t03604236192._1
716+ let buyAssetStrId = $t03604236192._2
717+ let buyAssetName = $t03604236192._3
718+ let buyAssetDecimals = $t03604236192._4
630719 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
631720 let inv = if (if ((amount > 0))
632721 then (buyAssetId == USDN)
633722 else false)
634723 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
635724 else 0
636725 if ((inv == inv))
637726 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
638727 else throw("Strict value is not equal to itself.")
639728 }))
640729
641730
642731
643732 @Callable(i)
644733 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
645734 then throw("DApp already inactive")
646735 else [BooleanEntry(keyActive, false)])
647736
648737
649738
650739 @Callable(i)
651740 func activate () = valueOrElse(isAdminCall(i), if (active)
652741 then throw("DApp already active")
653742 else [BooleanEntry(keyActive, true)])
654743
655744
745+@Verifier(tx)
746+func verify () = {
747+ let multiSignedByAdmins = {
748+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
749+ then 1
750+ else 0
751+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
752+ then 1
753+ else 0
754+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
755+ then 1
756+ else 0
757+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
758+ }
759+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
760+ then true
761+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
762+ then true
763+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
764+ then true
765+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
766+ match tx {
767+ case dtx: DataTransaction =>
768+ if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
769+ then signedByAdmin
770+ else false
771+ case _ =>
772+ multiSignedByAdmins
773+ }
774+ }
775+

github/deemru/w8io/3ef1775 
167.93 ms