tx · 6fXQU633NvXpTrp9JYc1tekuydQtKwEk2fu57G21dN1x

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.05000000 Waves

2023.08.23 14:00 [2723191] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "6fXQU633NvXpTrp9JYc1tekuydQtKwEk2fu57G21dN1x", "fee": 5000000, "feeAssetId": null, "timestamp": 1692788410052, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "5rdVuDww3qcywHAqesWCBML61YLpH8z1K4RPJh5MFdCakXUcdXWME4HENwQhoY2MCZUbhcTc5BrvgxBGWQ7yceiG", "6nQH8gFWSmFJZVwgTcAWjDz2zoP7Gz84QBEZ5t51vaG5ss4rWK6KteRPSeHPzxDY3dKArieVWoTgccDiCzwZGtd" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUE+06HqYmRCC3D4wq0lzrbsHxoPvs0AmgABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECyR0MDUxNTk1MzA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDUxNTk1MzA5Al8xBA1idXlBc3NldFN0cklkCAULJHQwNTE1OTUzMDkCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDUxNTk1MzA5Al8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwNTE1OTUzMDkCXzQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTQ5MTU2MzUJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTQ5MTU2MzUCXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDU0OTE1NjM1Al8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDU0OTE1NjM1Al8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTQ5MTU2MzUCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzc4OTc4NjQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzc4OTc4NjQCXzEECnBtdEFzc2V0SWQIBQskdDA3Nzg5Nzg2NAJfMgQLJHQwNzg3Mzc5NDYJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzg3Mzc5NDYCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc4NzM3OTQ2Al8yBAtwbXREZWNpbWFscwgFCyR0MDc4NzM3OTQ2Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA3MjkxMDg3MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDcyOTEwODczAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDcyOTEwODczAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNzI5MTA4NzMCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDcyOTEwODczAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMTA5MDExMjQwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDExMDkwMTEyNDACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMTA5MDExMjQwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMTA5MDExMjQwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTEwOTAxMTI0MAJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExOTY1MTMxMDUDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgEABQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9HZXQFCWFtbnRUb0dldAQNdGlja2V0c0Ftb3VudAkAaQIFCWFtbnRUb0dldAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFDXRpY2tldHNBbW91bnQAAAkAAgECIE5vdCBlbm91Z2h0IFdBVkVTIHRvIGJ1eSB0aWNrZXRzBBBhbW50VG9HZXRUaWNrZXRzCQBoAgUNdGlja2V0c0Ftb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAlhbW50VG9QYXkKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9QYXkFCWFtbnRUb1BheQQCZXgJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQlhbW50VG9QYXkFA25pbAMJAAACBQJleAUCZXgEBmNoYW5nZQkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRBhbW50VG9HZXRUaWNrZXRzBAZjRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwJAJUKAwUQYW1udFRvR2V0VGlja2V0cwUKYnV5QXNzZXRJZAUGY0VudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQJcG10QW1vdW50CAUNJHQwMTE5NjUxMzEwNQJfMQQKcG10QXNzZXRJZAgFDSR0MDExOTY1MTMxMDUCXzIEC2NoYW5nZUVudHJ5CAUNJHQwMTE5NjUxMzEwNQJfMwMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQHCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcEDWZyZWV6ZVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAkAAgEJAKwCAgkArAICCQCsAgICKVR3byBhdHRhY2hlZCBwYXltZW50cyBleHBlY3RlZDogRmlyc3QgaW4gBQxidXlBc3NldE5hbWUCDCwgc2Vjb25kIGluIAUNZnJlZXplVG9rZW5JZAMDCQBnAgAABRdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAYJAGcCAAAFFGFsbG93ZWRUaWNrZXRzQW1vdW50CQACAQIqTm90IGVub3VnaHQgU1dPUCBpbiBzdGFraW5nIHRvIGJ1eSB0aWNrZXRzBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAlwMBCQDMCAIFD2J1eVRpY2tldEFtb3VudAkAzAgCBRRhbGxvd2VkVGlja2V0c0Ftb3VudAUDbmlsBBxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBRmcmVlemVUb2tlblBlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAQNJHQwMTQ5NDgxNTAzNQkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBA9wbXRBbW91bnRGcmVlemUIBQ0kdDAxNDk0ODE1MDM1Al8xBBBwbXRBc3NldElkRnJlZXplCAUNJHQwMTQ5NDgxNTAzNQJfMgQNJHQwMTUwNTIxNTE0MwkBDGdldEFzc2V0SW5mbwEFCnBtdEFzc2V0SWQEE3BtdEZyZWV6ZVN0ckFzc2V0SWQIBQ0kdDAxNTA1MjE1MTQzAl8xBBJwbXRGcmVlemVBc3NldE5hbWUIBQ0kdDAxNTA1MjE1MTQzAl8yBBFwbXRGcmVlemVEZWNpbWFscwgFDSR0MDE1MDUyMTUxNDMCXzMEEG5lZWRGcmVlemVUb2tlbnMJAGgCBRRmcmVlemVUb2tlblBlclRpY2tldAUPYnV5VGlja2V0QW1vdW50AwMJAQIhPQIFE3BtdEZyZWV6ZVN0ckFzc2V0SWQFDWZyZWV6ZVRva2VuSWQGCQECIT0CBRBuZWVkRnJlZXplVG9rZW5zBQ9wbXRBbW91bnRGcmVlemUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEFlvdSBuZWVkIHRvIGFkZCAJAKQDAQUQbmVlZEZyZWV6ZVRva2VucwIBIAUScG10RnJlZXplQXNzZXROYW1lAhQgYXMgYSBzZWNvbmQgcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgUPcG10QW1vdW50RnJlZXplBQNuaWwFA25pbAQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50CQBkAgUTYm91Z2h0VGlja2V0c0Ftb3VudAUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUaWNrZXRMYXN0TnVtYmVyCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUOa2V5VXNlclRpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkFC2NoYW5nZUVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUY29tbWl0QWNjZXNzTGlzdFNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNzIyOTE3MzA0CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE3MjI5MTczMDQCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNzIyOTE3MzA0Al8yBA0kdDAxNzMwOTE3NDU5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDE3MzA5MTc0NTkCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxNzMwOTE3NDU5Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAxNzMwOTE3NDU5Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTczMDkxNzQ1OQJfNAQTdXNlclVzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQPdXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQNJHQwMTgxMjgxODI3MgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxODEyODE4MjcyAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxODEyODE4MjcyAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE4MTI4MTgyNzICXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxODEyODE4MjcyAl80BBxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uCQBrAwkAawMFCnRva2VuUHJpY2UFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDCQBnAgURYm91Z2h0QWxsb2NhdGlvbnMFFG1heEFsbG9jYXRpb25zQW1vdW50CQACAQkArAICCQCsAgICEVlvdSBjYW4gYnV5IG9ubHkgCQCkAwEFFG1heEFsbG9jYXRpb25zQW1vdW50AgthbGxvY2F0aW9ucwMDCQECIT0CBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQlwbXRBbW91bnQJAQIhPQIJAGgCBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uAAIFCXBtdEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAjJXcm9uZyBwYXltZW50LiBZb3UgY2FuIGJ1eSAxIG9yIDIgYWxsb2NhdGlvbnMgZm9yIAkApAMBBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUCDyBwZXIgYWxsb2NhdGlvbgQUYnV5QWxsb2NhdGlvbnNBbW91bnQJAGkCBQlwbXRBbW91bnQFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24EA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwkAZAIFEWJvdWdodEFsbG9jYXRpb25zBRRidXlBbGxvY2F0aW9uc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUTdXNlclVzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBQ91c2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZY29tbWl0SGlnaENvbXBldGl0aW9uU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDIwNTMwMjA2ODAJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjA1MzAyMDY4MAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDIwNTMwMjA2ODACXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDIwNTMwMjA2ODACXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyMDUzMDIwNjgwAl80BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVib3VnaHRIQ1RpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQTaGlnaENvbXBldGl0aW9uU2FsZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUhpZ2hDb21wZXRpdGlvblNhbGUHBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDIxMjkwMjE0MzQJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMjEyOTAyMTQzNAJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMjEyOTAyMTQzNAJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAyMTI5MDIxNDM0Al8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMjEyOTAyMTQzNAJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE2NvbW1pc3Npb25QZXJUaWNrZXQJAGsDBQt0aWNrZXRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24AZAQNJHQwMjE2NjcyMjgwNwMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQECWFtbnRUb0dldAoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdUdldFJFQURPTkxZCQDMCAIJAMwIAgkApAMBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCAQAFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb0dldAUJYW1udFRvR2V0BA10aWNrZXRzQW1vdW50CQBpAgUJYW1udFRvR2V0CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQDCQAAAgUNdGlja2V0c0Ftb3VudAAACQACAQIgTm90IGVub3VnaHQgV0FWRVMgdG8gYnV5IHRpY2tldHMEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5BAJleAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFCWFtbnRUb1BheQUDbmlsAwkAAAIFAmV4BQJleAQGY2hhbmdlCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEGFtbnRUb0dldFRpY2tldHMEBmNFbnRyeQMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwFA25pbAkAlQoDBRBhbW50VG9HZXRUaWNrZXRzBQpidXlBc3NldElkBQZjRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBAlwbXRBbW91bnQIBQ0kdDAyMTY2NzIyODA3Al8xBApwbXRBc3NldElkCAUNJHQwMjE2NjcyMjgwNwJfMgQLY2hhbmdlRW50cnkIBQ0kdDAyMTY2NzIyODA3Al8zAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAQEhAQUTaGlnaENvbXBldGl0aW9uU2FsZQkAAgECNFRoZXJlIGlzIG5vIGhpZ2ggY29tcGV0aXRpb24gc2FsZSBmb3IgdGhpcyBsYXVuY2hwYWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQED2J1eVRpY2tldEFtb3VudAkAaQIFCXBtdEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBVidXlQcmljZVdpdGhDb21pc3Npb24JAGgCBQ9idXlUaWNrZXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQGY2hhbmdlCQBlAgUJcG10QW1vdW50BRVidXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFD2J1eVRpY2tldEFtb3VudAIYdGlja2V0cyB5b3UgbmVlZCB0byBwYXkgCQCkAwEFFWJ1eVByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lBBh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMCAAQWbGFzdEJvdWdodFRpY2tldE51bWJlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQEG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkArAICBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMDCQECIT0CBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMCAAkArAICAgEsBQtib3VnaHRSYW5nZQkArAICAgAFC2JvdWdodFJhbmdlBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQJAGQCBRVib3VnaHRIQ1RpY2tldHNBbW91bnQFD2J1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBQtjaGFuZ2VFbnRyeQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXNlAwtsYXVuY2hwYWRJZAl2cmZIZWlnaHQKc2VjcmV0V29yZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQJc2F2ZWRIYXNoCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gECGNhbGNIYXNoCQDYBAEJAPcDAQkAywECCQCaAwEFCXZyZkhlaWdodAkAmwMBBQpzZWNyZXRXb3JkAwkBAiE9AgUIY2FsY0hhc2gFCXNhdmVkSGFzaAkAAgECHHZyZiBIZWlnaHQgaGFzaCBub3QgbWF0Y2hpbmcEDSR0MDI1NzYwMjU5MTAJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjU3NjAyNTkxMAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI1NzYwMjU5MTACXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI1NzYwMjU5MTACXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyNTc2MDI1OTEwAl80BA5wcm9qZWN0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBZGRyZXNzBApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgQSdHJhbnNmZXJlZEJ1eUFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAAABBtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQEFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDAAAEFnN3b3BmaU1lbWJlcnNDb21pc3Npb24JAGsDBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFCmNvbW1pc3Npb24AZAQRc3dvcGZpSENDb21pc3Npb24JAGsDBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BQxjb21taXNzaW9uSEMAZAQedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQEEm1hcmtldGluZ0NvbWlzc2lvbgkAawMFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUKY29tbWlzc2lvbgBkBA11bnN0YWtlQW1vdW50CQBlAgkAZAIJAGQCCQBkAgkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUSbWFya2V0aW5nQ29taXNzaW9uBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BRFzd29wZmlIQ0NvbWlzc2lvbgUSdHJhbnNmZXJlZEJ1eUFzc2V0AwkAZgIFEnRyYW5zZmVyZWRCdXlBc3NldAkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAkAAgECKENhbid0IHRyYW5zZmVyIG5lZ2F0aXZlIHZhbHVlIHRvIHByb2plY3QEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUNdW5zdGFrZUFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9qZWN0QWRkcmVzcwkAZQIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFEnRyYW5zZmVyZWRCdXlBc3NldAUKYnV5QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBjb21taXNzaW9uV2FsbGV0CQBkAgkAZAIFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgURc3dvcGZpSENDb21pc3Npb24FCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDWJvdWdodFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAED2JvdWdodEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAED3VzZXJDbGFpbVN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBwQOZmluYWxpemVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAAAAwkAAAIFDmZpbmFsaXplSGVpZ2h0AAAJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwUPdXNlckNsYWltU3RhdHVzCQACAQIXWW91IGFyZSBhbHJlYWR5IGNsYWltZWQDAwMJAAACBQ1ib3VnaHRUaWNrZXRzAAAJAAACBRFib3VnaHRBbGxvY2F0aW9ucwAABwkAAAIFD2JvdWdodEhDVGlja2V0cwAABwkAAgECLllvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHlvdSBkb24ndCBidXkgYW55dGhpbmcEDSR0MDI4OTk0MjkxNzEJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuCQDYBAEFBFVTRE4ECmJ1eUFzc2V0SWQIBQ0kdDAyODk5NDI5MTcxAl8xBA1idXlBc3NldFN0cklkCAUNJHQwMjg5OTQyOTE3MQJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjg5OTQyOTE3MQJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDI4OTk0MjkxNzECXzQEDXdvbm5lZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50AAAED3dvbm5lZEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUpa2V5VXNlcldpbm5lZEhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQAAAQUYXdhaWxhYmxlQWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwAABApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAAAEEmFsbG93ZWRBbGxvY2F0aW9ucwkAlwMBCQDMCAIFEWJvdWdodEFsbG9jYXRpb25zCQDMCAIFFGF3YWlsYWJsZUFsbG9jYXRpb25zBQNuaWwECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMzAwODczMDIzMQkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAzMDA4NzMwMjMxAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAzMDA4NzMwMjMxAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDMwMDg3MzAyMzECXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAzMDA4NzMwMjMxAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTdG9rZW5zUGVyQWxsb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBBR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIJAGQCCQBoAgUNd29ubmVkVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0CQBoAgUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uCQBoAgUPd29ubmVkSENUaWNrZXRzBQ90b2tlbnNQZXJUaWNrZXQEG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwkAaAIJAGUCBRFib3VnaHRBbGxvY2F0aW9ucwUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uBBZidXlBc3NldEZvckFsbG9jYXRpb25zCQBrAwkAawMFG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgkAZAIAZAUKY29tbWlzc2lvbgBkBBpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUNYm91Z2h0VGlja2V0cwUNd29ubmVkVGlja2V0cwULdGlja2V0UHJpY2UJAGQCAGQFCmNvbW1pc3Npb24AZAQcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUPYm91Z2h0SENUaWNrZXRzBQ93b25uZWRIQ1RpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQxjb21taXNzaW9uSEMAZAQPY2xhaW1lZEJ1eVRva2VuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucwAAAwMDCQBmAgAABRZidXlBc3NldEZvckFsbG9jYXRpb25zBgkAZgIAAAUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMGCQBmAgAABRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzCQACAQJSRXJyb3Igd2l0aCBhbGxvd2VkIGFsbG9jYXRpb24gcGFyYW0gb3Igd29ubmVkIHRpY2tldHMgcGFyYW0gcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydAQWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAZQIJAGQCCQBkAgUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMFHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMFFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMFD2NsYWltZWRCdXlUb2tlbgQQdHJhbnNmZXJCdXlBc3NldAMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQpidXlBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMFFnJldHVybmVkQnV5QXNzZXRBbW91bnQFA25pbAUDbmlsBANpbnYDAwkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYEDWNsYWltZWRQYXJhbXMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleUNsYWltUGFyYW1zAghjbGFpbUFsbAIBLAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAIIY2xhaW1BbGwEDnRyYW5zZmVyVG9rZW5zAwkAZgIFFHRyYW5zZmVyVG9rZW5zQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUDbmlsBQ50cmFuc2ZlclRva2VucwUQdHJhbnNmZXJCdXlBc3NldAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAILY2xhaW1QZXJpb2QEDWNsYWltZWRUb2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zAAAEDHVubG9ja1BlcmlvZAkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAgQLYmxvY2tIZWlnaHQJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwADBQ5maW5hbGl6ZUhlaWdodAQMdW5sb2NrSGVpZ2h0CQBkAgUMdW5sb2NrUGVyaW9kBQtibG9ja0hlaWdodAQSYWxsb3dlZFN0YXJ0QW1vdW50CQBrAwUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAEAZAQTYWxsb3dlZFRva2Vuc0Ftb3VudAkAZAIFEmFsbG93ZWRTdGFydEFtb3VudAMJAGYCBQZoZWlnaHQFC2Jsb2NrSGVpZ2h0CQBlAgkAawMJAGUCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUSYWxsb3dlZFN0YXJ0QW1vdW50CQBlAgkAlwMBCQDMCAIFBmhlaWdodAkAzAgCBQx1bmxvY2tIZWlnaHQFA25pbAULYmxvY2tIZWlnaHQFDHVubG9ja1BlcmlvZAUNY2xhaW1lZFRva2VucwkAZQIAAAUNY2xhaW1lZFRva2VucwQQY2xhaW1TdGF0dXNFbnRyeQMJAGcCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIFDWNsYWltZWRUb2tlbnMFE2FsbG93ZWRUb2tlbnNBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMGBQNuaWwFA25pbAMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAABgkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAQOdHJhbnNmZXJUb2tlbnMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUTYWxsb3dlZFRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgUQdHJhbnNmZXJCdXlBc3NldAUOdHJhbnNmZXJUb2tlbnMJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQACAQIWVW5rbm93biBjbGFpbSBmdW5jdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjbGFpbUZyZWV6ZVRva2VuAQtsYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQVZnJlZXplQWRkaXRpb25hbFRva2VuCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUYa2V5RnJlZXplQWRkaXRpb25hbFRva2VuBwMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAkAAgECMVlvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHJlc3VsdHMgYXJlIG5vdCBmaW5hbGl6ZWQDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkAAgECOVRoZXJlIGFyZSBubyBhZGRpdGlvbmFsIHRva2VuIGZyZWV6aW5nIGZvciB0aGlzIGxhdW5jaHBhZAQHdG9rZW5JZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQEEXVzZXJUb2tlbnNGcmVlemVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAQLc3RhcnRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAAABAhkdXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uAAAEE2ZyZWV6ZVRva2VuRHVyYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgQOYmxvY2tFbmRIZWlnaHQJAGQCCQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uBRNmcmVlemVUb2tlbkR1cmF0aW9uAwkAAAIFEXVzZXJUb2tlbnNGcmVlemVkAAAJAAIBAjhZb3UgYXJlIGFscmVhZHkgY2xhaW1lZCB5b3VyIHRva2VucyBvciBub3QgcGFpZCBhbnl0aGluZwMJAGYCBQ5ibG9ja0VuZEhlaWdodAUGaGVpZ2h0CQACAQkArAICAhlZb3VyIHRva2VucyBmcmVlemVkIHRlZWwgCQCkAwEFDmJsb2NrRW5kSGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURdXNlclRva2Vuc0ZyZWV6ZWQFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAUDbmlsAWkBEHRyYW5zZmVyQnV5QXNzZXQCC2xhdW5jaHBhZElkBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQNJHQwMzYzOTYzNjU0NgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAzNjM5NjM2NTQ2Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMzYzOTYzNjU0NgJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMzYzOTYzNjU0NgJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDM2Mzk2MzY1NDYCXzQEEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQDaW52AwMJAGYCBQZhbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUGYW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0CQBkAgUSdHJhbnNmZXJlZEJ1eUFzc2V0BQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MFBmFtb3VudAUKYnV5QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQIVREFwcCBhbHJlYWR5IGluYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrZXlBY3RpdmUHBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQITREFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBgUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRJhZG1pblB1YktleVN0YWtpbmcEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACD0RhdGFUcmFuc2FjdGlvbgQDZHR4BQckbWF0Y2gwAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cwcFDXNpZ25lZEJ5QWRtaW4HBRNtdWx0aVNpZ25lZEJ5QWRtaW5z45su7g==", "height": 2723191, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3AF4QCzJ2Fpvh6QERPbz1DDUSiNZh3tzfYqCVsGuru6N Next: 8qMb324TTFRDxGjKhTaLRjBvT17cGtC58UYK6UuLmC4c Diff:
OldNewDifferences
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513019 = if ((i.payments[0].assetId == unit))
289+ let $t01196513105 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
302302 if ((amntToGet == amntToGet))
303303 then {
304304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
305- let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
306- let amntToPay = {
307- let @ = ({
308- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
309- if ($isInstanceOf(@, "List[Any]"))
310- then @
311- else throw(($getType(@) + " couldn't be cast to List[Any]"))
312- })[0]
313- if ($isInstanceOf(@, "Int"))
314- then @
315- else throw(($getType(@) + " couldn't be cast to Int"))
316- }
317- if ((amntToPay == amntToPay))
318- then {
319- let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
320- if ((ex == ex))
305+ if ((ticketsAmount == 0))
306+ then throw("Not enought WAVES to buy tickets")
307+ else {
308+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
309+ let amntToPay = {
310+ let @ = ({
311+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
312+ if ($isInstanceOf(@, "List[Any]"))
313+ then @
314+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
315+ })[0]
316+ if ($isInstanceOf(@, "Int"))
317+ then @
318+ else throw(($getType(@) + " couldn't be cast to Int"))
319+ }
320+ if ((amntToPay == amntToPay))
321321 then {
322- let change = (i.payments[0].amount - amntToGetTickets)
323- let cEntry = if ((change > 0))
324- then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
325- else nil
326- $Tuple3(amntToGetTickets, buyAssetId, cEntry)
322+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
323+ if ((ex == ex))
324+ then {
325+ let change = (i.payments[0].amount - amntToGetTickets)
326+ let cEntry = if ((change > 0))
327+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
328+ else nil
329+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
330+ }
331+ else throw("Strict value is not equal to itself.")
327332 }
328333 else throw("Strict value is not equal to itself.")
329334 }
330- else throw("Strict value is not equal to itself.")
331335 }
332336 else throw("Strict value is not equal to itself.")
333337 }
334338 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
335- let pmtAmount = $t01196513019._1
336- let pmtAssetId = $t01196513019._2
337- let changeEntry = $t01196513019._3
339+ let pmtAmount = $t01196513105._1
340+ let pmtAssetId = $t01196513105._2
341+ let changeEntry = $t01196513105._3
338342 if ((activeLaunchpadId != launchpadId))
339343 then throw("There is no active launchpad or this launchpad is ended")
340344 else if ((startHeight > height))
374378 then {
375379 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
376380 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
377- let $t01486214949 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378- let pmtAmountFreeze = $t01486214949._1
379- let pmtAssetIdFreeze = $t01486214949._2
380- let $t01496615057 = getAssetInfo(pmtAssetId)
381- let pmtFreezeStrAssetId = $t01496615057._1
382- let pmtFreezeAssetName = $t01496615057._2
383- let pmtFreezeDecimals = $t01496615057._3
381+ let $t01494815035 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382+ let pmtAmountFreeze = $t01494815035._1
383+ let pmtAssetIdFreeze = $t01494815035._2
384+ let $t01505215143 = getAssetInfo(pmtAssetId)
385+ let pmtFreezeStrAssetId = $t01505215143._1
386+ let pmtFreezeAssetName = $t01505215143._2
387+ let pmtFreezeDecimals = $t01505215143._3
384388 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
385389 if (if ((pmtFreezeStrAssetId != freezeTokenId))
386390 then true
414418
415419 @Callable(i)
416420 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
417- let $t01714317218 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418- let pmtAmount = $t01714317218._1
419- let pmtAssetId = $t01714317218._2
420- let $t01722317373 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421- let buyAssetId = $t01722317373._1
422- let buyAssetStrId = $t01722317373._2
423- let buyAssetName = $t01722317373._3
424- let buyAssetDecimals = $t01722317373._4
421+ let $t01722917304 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422+ let pmtAmount = $t01722917304._1
423+ let pmtAssetId = $t01722917304._2
424+ let $t01730917459 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425+ let buyAssetId = $t01730917459._1
426+ let buyAssetStrId = $t01730917459._2
427+ let buyAssetName = $t01730917459._3
428+ let buyAssetDecimals = $t01730917459._4
425429 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
426430 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
427431 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
428432 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
429433 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
430434 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
431- let $t01804218186 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432- let tokenId = $t01804218186._1
433- let tokenStrAssetId = $t01804218186._2
434- let tokenAssetName = $t01804218186._3
435- let tokenDecimals = $t01804218186._4
435+ let $t01812818272 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436+ let tokenId = $t01812818272._1
437+ let tokenStrAssetId = $t01812818272._2
438+ let tokenAssetName = $t01812818272._3
439+ let tokenDecimals = $t01812818272._4
436440 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
437441 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
438442 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
472476
473477 @Callable(i)
474478 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
475- let $t02044420594 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476- let buyAssetId = $t02044420594._1
477- let buyAssetStrId = $t02044420594._2
478- let buyAssetName = $t02044420594._3
479- let buyAssetDecimals = $t02044420594._4
479+ let $t02053020680 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480+ let buyAssetId = $t02053020680._1
481+ let buyAssetStrId = $t02053020680._2
482+ let buyAssetName = $t02053020680._3
483+ let buyAssetDecimals = $t02053020680._4
480484 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
481485 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
482486 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
483487 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
484488 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
485489 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
486- let $t02120421348 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487- let tokenId = $t02120421348._1
488- let tokenStrAssetId = $t02120421348._2
489- let tokenAssetName = $t02120421348._3
490- let tokenDecimals = $t02120421348._4
490+ let $t02129021434 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491+ let tokenId = $t02129021434._1
492+ let tokenStrAssetId = $t02129021434._2
493+ let tokenAssetName = $t02129021434._3
494+ let tokenDecimals = $t02129021434._4
491495 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
492496 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
493- let $t02158122635 = if ((i.payments[0].assetId == unit))
497+ let $t02166722807 = if ((i.payments[0].assetId == unit))
494498 then {
495499 let amntToGet = {
496500 let @ = ({
506510 if ((amntToGet == amntToGet))
507511 then {
508512 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
509- let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
510- let amntToPay = {
511- let @ = ({
512- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
513- if ($isInstanceOf(@, "List[Any]"))
514- then @
515- else throw(($getType(@) + " couldn't be cast to List[Any]"))
516- })[0]
517- if ($isInstanceOf(@, "Int"))
518- then @
519- else throw(($getType(@) + " couldn't be cast to Int"))
520- }
521- if ((amntToPay == amntToPay))
522- then {
523- let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
524- if ((ex == ex))
513+ if ((ticketsAmount == 0))
514+ then throw("Not enought WAVES to buy tickets")
515+ else {
516+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
517+ let amntToPay = {
518+ let @ = ({
519+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
520+ if ($isInstanceOf(@, "List[Any]"))
521+ then @
522+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
523+ })[0]
524+ if ($isInstanceOf(@, "Int"))
525+ then @
526+ else throw(($getType(@) + " couldn't be cast to Int"))
527+ }
528+ if ((amntToPay == amntToPay))
525529 then {
526- let change = (i.payments[0].amount - amntToGetTickets)
527- let cEntry = if ((change > 0))
528- then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
529- else nil
530- $Tuple3(amntToGetTickets, buyAssetId, cEntry)
530+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
531+ if ((ex == ex))
532+ then {
533+ let change = (i.payments[0].amount - amntToGetTickets)
534+ let cEntry = if ((change > 0))
535+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
536+ else nil
537+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
538+ }
539+ else throw("Strict value is not equal to itself.")
531540 }
532541 else throw("Strict value is not equal to itself.")
533542 }
534- else throw("Strict value is not equal to itself.")
535543 }
536544 else throw("Strict value is not equal to itself.")
537545 }
538546 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
539- let pmtAmount = $t02158122635._1
540- let pmtAssetId = $t02158122635._2
541- let changeEntry = $t02158122635._3
547+ let pmtAmount = $t02166722807._1
548+ let pmtAssetId = $t02166722807._2
549+ let changeEntry = $t02166722807._3
542550 if ((activeLaunchpadId != launchpadId))
543551 then throw("There is no active launchpad or this launchpad is ended")
544552 else if (!(highCompetitionSale))
590598 if ((calcHash != savedHash))
591599 then throw("vrf Height hash not matching")
592600 else {
593- let $t02558825738 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t02558825738._1
595- let buyAssetStrId = $t02558825738._2
596- let buyAssetName = $t02558825738._3
597- let buyAssetDecimals = $t02558825738._4
601+ let $t02576025910 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602+ let buyAssetId = $t02576025910._1
603+ let buyAssetStrId = $t02576025910._2
604+ let buyAssetName = $t02576025910._3
605+ let buyAssetDecimals = $t02576025910._4
598606 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
599607 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
600608 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
639647 else false)
640648 then throw("You can't claim because you don't buy anything")
641649 else {
642- let $t02882228999 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643- let buyAssetId = $t02882228999._1
644- let buyAssetStrId = $t02882228999._2
645- let buyAssetName = $t02882228999._3
646- let buyAssetDecimals = $t02882228999._4
650+ let $t02899429171 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651+ let buyAssetId = $t02899429171._1
652+ let buyAssetStrId = $t02899429171._2
653+ let buyAssetName = $t02899429171._3
654+ let buyAssetDecimals = $t02899429171._4
647655 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
648656 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
649657 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
652660 let allowedAllocations = min([boughtAllocations, awailableAllocations])
653661 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
654662 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
655- let $t02991530059 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656- let tokenId = $t02991530059._1
657- let tokenStrAssetId = $t02991530059._2
658- let tokenAssetName = $t02991530059._3
659- let tokenDecimals = $t02991530059._4
663+ let $t03008730231 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664+ let tokenId = $t03008730231._1
665+ let tokenStrAssetId = $t03008730231._2
666+ let tokenAssetName = $t03008730231._3
667+ let tokenDecimals = $t03008730231._4
660668 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
661669 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
662670 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
751759 @Callable(i)
752760 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
753761 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
754- let $t03622436374 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755- let buyAssetId = $t03622436374._1
756- let buyAssetStrId = $t03622436374._2
757- let buyAssetName = $t03622436374._3
758- let buyAssetDecimals = $t03622436374._4
762+ let $t03639636546 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763+ let buyAssetId = $t03639636546._1
764+ let buyAssetStrId = $t03639636546._2
765+ let buyAssetName = $t03639636546._3
766+ let buyAssetDecimals = $t03639636546._4
759767 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
760768 let inv = if (if ((amount > 0))
761769 then (buyAssetId == USDN)
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
128128 let WAVES_XTN_EX = Address(base58'3MqjSoPUdGHaan9uhxwTnFw1uH7uZ8dgt8f')
129129
130130 let maxAllocationsAmount = 2
131131
132132 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
133133
134134 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
135135 case string: String =>
136136 fromBase58String(string)
137137 case nothing =>
138138 throw("Admin public key is empty")
139139 }
140140
141141
142142 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
143143
144144 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
145145
146146 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
147147
148148 func getAssetInfo (assetId) = match assetId {
149149 case id: ByteVector =>
150150 let stringId = toBase58String(id)
151151 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
152152 $Tuple3(stringId, info.name, info.decimals)
153153 case waves: Unit =>
154154 $Tuple3("WAVES", "WAVES", 8)
155155 case _ =>
156156 throw("Match error")
157157 }
158158
159159
160160 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
161161
162162
163163 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
164164
165165
166166 let active = valueOrElse(getBoolean(this, keyActive), true)
167167
168168 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
169169
170170 func isActive () = if (if (active)
171171 then activeGlob
172172 else false)
173173 then unit
174174 else throw("DApp is inactive at this moment")
175175
176176
177177 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
178178 then unit
179179 else throw("Only admin can call this function")
180180
181181
182182 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
183183 then $Tuple4(unit, "WAVES", "WAVES", 8)
184184 else {
185185 let stringId = assetStr
186186 let id = fromBase58String(assetStr)
187187 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
188188 $Tuple4(id, stringId, info.name, info.decimals)
189189 }
190190
191191
192192 func buyInWaves (launchpadId,ticketsAmount,type) = {
193193 let $t051595309 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
194194 let buyAssetId = $t051595309._1
195195 let buyAssetStrId = $t051595309._2
196196 let buyAssetName = $t051595309._3
197197 let buyAssetDecimals = $t051595309._4
198198 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
199199 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
200200 let $t054915635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
201201 let tokenId = $t054915635._1
202202 let tokenStrAssetId = $t054915635._2
203203 let tokenAssetName = $t054915635._3
204204 let tokenDecimals = $t054915635._4
205205 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
206206 let commissionPerTicket = if ((type == 1))
207207 then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
208208 else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
209209 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
210210 let amntToPay = {
211211 let @ = ({
212212 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
213213 if ($isInstanceOf(@, "List[Any]"))
214214 then @
215215 else throw(($getType(@) + " couldn't be cast to List[Any]"))
216216 })[0]
217217 if ($isInstanceOf(@, "Int"))
218218 then @
219219 else throw(($getType(@) + " couldn't be cast to Int"))
220220 }
221221 if ((amntToPay == amntToPay))
222222 then fraction(amntToPay, 101, 100)
223223 else throw("Strict value is not equal to itself.")
224224 }
225225
226226
227227 @Callable(i)
228228 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
229229
230230
231231
232232 @Callable(i)
233233 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
234234
235235
236236
237237 @Callable(i)
238238 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), "")))
239239 then throw("Only project admin can call init function")
240240 else if ((size(i.payments) != 1))
241241 then throw("One attached payment expected")
242242 else if ((height > startHeight))
243243 then throw("Start height must be greater than blockchain height")
244244 else if (if (freezeAdditionalToken)
245245 then (size(freezeParams) != 3)
246246 else false)
247247 then throw("Freeze params list must have 3 items")
248248 else {
249249 let launchpadId = getLaunchpadNextId()
250250 let launchpadIdStr = toString(launchpadId)
251251 let $t077897864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
252252 let pmtAmount = $t077897864._1
253253 let pmtAssetId = $t077897864._2
254254 let $t078737946 = getAssetInfo(pmtAssetId)
255255 let pmtStrAssetId = $t078737946._1
256256 let pmtAssetName = $t078737946._2
257257 let pmtDecimals = $t078737946._3
258258 let freezeAdditionalEntry = if (freezeAdditionalToken)
259259 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
260260 else nil
261261 ([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)
262262 })
263263
264264
265265
266266 @Callable(i)
267267 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
268268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
269269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
270270 let $t01072910873 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
271271 let tokenId = $t01072910873._1
272272 let tokenStrAssetId = $t01072910873._2
273273 let tokenAssetName = $t01072910873._3
274274 let tokenDecimals = $t01072910873._4
275275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
276276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
277277 let $t01109011240 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
278278 let buyAssetId = $t01109011240._1
279279 let buyAssetStrId = $t01109011240._2
280280 let buyAssetName = $t01109011240._3
281281 let buyAssetDecimals = $t01109011240._4
282282 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
283283 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
284284 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
285285 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513019 = if ((i.payments[0].assetId == unit))
289+ let $t01196513105 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
293293 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
294294 if ($isInstanceOf(@, "List[Any]"))
295295 then @
296296 else throw(($getType(@) + " couldn't be cast to List[Any]"))
297297 })[0]
298298 if ($isInstanceOf(@, "Int"))
299299 then @
300300 else throw(($getType(@) + " couldn't be cast to Int"))
301301 }
302302 if ((amntToGet == amntToGet))
303303 then {
304304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
305- let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
306- let amntToPay = {
307- let @ = ({
308- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
309- if ($isInstanceOf(@, "List[Any]"))
310- then @
311- else throw(($getType(@) + " couldn't be cast to List[Any]"))
312- })[0]
313- if ($isInstanceOf(@, "Int"))
314- then @
315- else throw(($getType(@) + " couldn't be cast to Int"))
316- }
317- if ((amntToPay == amntToPay))
318- then {
319- let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
320- if ((ex == ex))
305+ if ((ticketsAmount == 0))
306+ then throw("Not enought WAVES to buy tickets")
307+ else {
308+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
309+ let amntToPay = {
310+ let @ = ({
311+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
312+ if ($isInstanceOf(@, "List[Any]"))
313+ then @
314+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
315+ })[0]
316+ if ($isInstanceOf(@, "Int"))
317+ then @
318+ else throw(($getType(@) + " couldn't be cast to Int"))
319+ }
320+ if ((amntToPay == amntToPay))
321321 then {
322- let change = (i.payments[0].amount - amntToGetTickets)
323- let cEntry = if ((change > 0))
324- then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
325- else nil
326- $Tuple3(amntToGetTickets, buyAssetId, cEntry)
322+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
323+ if ((ex == ex))
324+ then {
325+ let change = (i.payments[0].amount - amntToGetTickets)
326+ let cEntry = if ((change > 0))
327+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
328+ else nil
329+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
330+ }
331+ else throw("Strict value is not equal to itself.")
327332 }
328333 else throw("Strict value is not equal to itself.")
329334 }
330- else throw("Strict value is not equal to itself.")
331335 }
332336 else throw("Strict value is not equal to itself.")
333337 }
334338 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
335- let pmtAmount = $t01196513019._1
336- let pmtAssetId = $t01196513019._2
337- let changeEntry = $t01196513019._3
339+ let pmtAmount = $t01196513105._1
340+ let pmtAssetId = $t01196513105._2
341+ let changeEntry = $t01196513105._3
338342 if ((activeLaunchpadId != launchpadId))
339343 then throw("There is no active launchpad or this launchpad is ended")
340344 else if ((startHeight > height))
341345 then throw("Launchpad sale not started yet")
342346 else if ((height > (startHeight + duration)))
343347 then throw("Launchpad sale ended")
344348 else if (if (!(freezeAdditionalToken))
345349 then if ((size(i.payments) != 1))
346350 then true
347351 else (pmtAssetId != buyAssetId)
348352 else false)
349353 then throw((("One attached payment in " + buyAssetName) + " expected"))
350354 else if (if (freezeAdditionalToken)
351355 then if ((size(i.payments) != 2))
352356 then true
353357 else (pmtAssetId != buyAssetId)
354358 else false)
355359 then {
356360 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
357361 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
358362 }
359363 else if (if ((0 >= allowedTicketsAmountAll))
360364 then true
361365 else (0 >= allowedTicketsAmount))
362366 then throw("Not enought SWOP in staking to buy tickets")
363367 else {
364368 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
365369 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
366370 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
367371 let change = (pmtAmount - allowedBuyPriceWithComission)
368372 if ((buyTicketAmount == 0))
369373 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
370374 else if ((change != 0))
371375 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
372376 else {
373377 let freezeAdditionalEntry = if (freezeAdditionalToken)
374378 then {
375379 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
376380 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
377- let $t01486214949 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378- let pmtAmountFreeze = $t01486214949._1
379- let pmtAssetIdFreeze = $t01486214949._2
380- let $t01496615057 = getAssetInfo(pmtAssetId)
381- let pmtFreezeStrAssetId = $t01496615057._1
382- let pmtFreezeAssetName = $t01496615057._2
383- let pmtFreezeDecimals = $t01496615057._3
381+ let $t01494815035 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382+ let pmtAmountFreeze = $t01494815035._1
383+ let pmtAssetIdFreeze = $t01494815035._2
384+ let $t01505215143 = getAssetInfo(pmtAssetId)
385+ let pmtFreezeStrAssetId = $t01505215143._1
386+ let pmtFreezeAssetName = $t01505215143._2
387+ let pmtFreezeDecimals = $t01505215143._3
384388 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
385389 if (if ((pmtFreezeStrAssetId != freezeTokenId))
386390 then true
387391 else (needFreezeTokens != pmtAmountFreeze))
388392 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
389393 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
390394 }
391395 else nil
392396 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
393397 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
394398 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
395399 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
396400 then ("," + boughtRange)
397401 else ("" + boughtRange)))
398402 let inv = if ((buyAssetId == USDN))
399403 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
400404 else 0
401405 if ((inv == inv))
402406 then {
403407 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)
404408 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
405409 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
406410 else baseEntry
407411 }
408412 else throw("Strict value is not equal to itself.")
409413 }
410414 }
411415 })
412416
413417
414418
415419 @Callable(i)
416420 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
417- let $t01714317218 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418- let pmtAmount = $t01714317218._1
419- let pmtAssetId = $t01714317218._2
420- let $t01722317373 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421- let buyAssetId = $t01722317373._1
422- let buyAssetStrId = $t01722317373._2
423- let buyAssetName = $t01722317373._3
424- let buyAssetDecimals = $t01722317373._4
421+ let $t01722917304 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422+ let pmtAmount = $t01722917304._1
423+ let pmtAssetId = $t01722917304._2
424+ let $t01730917459 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425+ let buyAssetId = $t01730917459._1
426+ let buyAssetStrId = $t01730917459._2
427+ let buyAssetName = $t01730917459._3
428+ let buyAssetDecimals = $t01730917459._4
425429 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
426430 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
427431 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
428432 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
429433 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
430434 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
431- let $t01804218186 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432- let tokenId = $t01804218186._1
433- let tokenStrAssetId = $t01804218186._2
434- let tokenAssetName = $t01804218186._3
435- let tokenDecimals = $t01804218186._4
435+ let $t01812818272 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436+ let tokenId = $t01812818272._1
437+ let tokenStrAssetId = $t01812818272._2
438+ let tokenAssetName = $t01812818272._3
439+ let tokenDecimals = $t01812818272._4
436440 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
437441 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
438442 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
439443 if ((activeLaunchpadId != launchpadId))
440444 then throw("There is no active launchpad or this launchpad is ended")
441445 else if ((startHeight > height))
442446 then throw("Launchpad sale not started yet")
443447 else if ((height > (startHeight + duration)))
444448 then throw("Launchpad sale ended")
445449 else if (if ((size(i.payments) != 1))
446450 then true
447451 else (pmtAssetId != buyAssetId))
448452 then throw((("One attached payment in " + buyAssetName) + " expected"))
449453 else if ((boughtAllocations >= maxAllocationsAmount))
450454 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
451455 else if (if ((allocationPriceWithComission != pmtAmount))
452456 then ((allocationPriceWithComission * 2) != pmtAmount)
453457 else false)
454458 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
455459 else {
456460 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
457461 let inv = if ((buyAssetId == USDN))
458462 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
459463 else 0
460464 if ((inv == inv))
461465 then {
462466 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))]
463467 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
464468 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
465469 else baseEntry
466470 }
467471 else throw("Strict value is not equal to itself.")
468472 }
469473 })
470474
471475
472476
473477 @Callable(i)
474478 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
475- let $t02044420594 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476- let buyAssetId = $t02044420594._1
477- let buyAssetStrId = $t02044420594._2
478- let buyAssetName = $t02044420594._3
479- let buyAssetDecimals = $t02044420594._4
479+ let $t02053020680 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480+ let buyAssetId = $t02053020680._1
481+ let buyAssetStrId = $t02053020680._2
482+ let buyAssetName = $t02053020680._3
483+ let buyAssetDecimals = $t02053020680._4
480484 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
481485 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
482486 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
483487 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
484488 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
485489 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
486- let $t02120421348 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487- let tokenId = $t02120421348._1
488- let tokenStrAssetId = $t02120421348._2
489- let tokenAssetName = $t02120421348._3
490- let tokenDecimals = $t02120421348._4
490+ let $t02129021434 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491+ let tokenId = $t02129021434._1
492+ let tokenStrAssetId = $t02129021434._2
493+ let tokenAssetName = $t02129021434._3
494+ let tokenDecimals = $t02129021434._4
491495 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
492496 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
493- let $t02158122635 = if ((i.payments[0].assetId == unit))
497+ let $t02166722807 = if ((i.payments[0].assetId == unit))
494498 then {
495499 let amntToGet = {
496500 let @ = ({
497501 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
498502 if ($isInstanceOf(@, "List[Any]"))
499503 then @
500504 else throw(($getType(@) + " couldn't be cast to List[Any]"))
501505 })[0]
502506 if ($isInstanceOf(@, "Int"))
503507 then @
504508 else throw(($getType(@) + " couldn't be cast to Int"))
505509 }
506510 if ((amntToGet == amntToGet))
507511 then {
508512 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
509- let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
510- let amntToPay = {
511- let @ = ({
512- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
513- if ($isInstanceOf(@, "List[Any]"))
514- then @
515- else throw(($getType(@) + " couldn't be cast to List[Any]"))
516- })[0]
517- if ($isInstanceOf(@, "Int"))
518- then @
519- else throw(($getType(@) + " couldn't be cast to Int"))
520- }
521- if ((amntToPay == amntToPay))
522- then {
523- let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
524- if ((ex == ex))
513+ if ((ticketsAmount == 0))
514+ then throw("Not enought WAVES to buy tickets")
515+ else {
516+ let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
517+ let amntToPay = {
518+ let @ = ({
519+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
520+ if ($isInstanceOf(@, "List[Any]"))
521+ then @
522+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
523+ })[0]
524+ if ($isInstanceOf(@, "Int"))
525+ then @
526+ else throw(($getType(@) + " couldn't be cast to Int"))
527+ }
528+ if ((amntToPay == amntToPay))
525529 then {
526- let change = (i.payments[0].amount - amntToGetTickets)
527- let cEntry = if ((change > 0))
528- then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
529- else nil
530- $Tuple3(amntToGetTickets, buyAssetId, cEntry)
530+ let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
531+ if ((ex == ex))
532+ then {
533+ let change = (i.payments[0].amount - amntToGetTickets)
534+ let cEntry = if ((change > 0))
535+ then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
536+ else nil
537+ $Tuple3(amntToGetTickets, buyAssetId, cEntry)
538+ }
539+ else throw("Strict value is not equal to itself.")
531540 }
532541 else throw("Strict value is not equal to itself.")
533542 }
534- else throw("Strict value is not equal to itself.")
535543 }
536544 else throw("Strict value is not equal to itself.")
537545 }
538546 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
539- let pmtAmount = $t02158122635._1
540- let pmtAssetId = $t02158122635._2
541- let changeEntry = $t02158122635._3
547+ let pmtAmount = $t02166722807._1
548+ let pmtAssetId = $t02166722807._2
549+ let changeEntry = $t02166722807._3
542550 if ((activeLaunchpadId != launchpadId))
543551 then throw("There is no active launchpad or this launchpad is ended")
544552 else if (!(highCompetitionSale))
545553 then throw("There is no high competition sale for this launchpad")
546554 else if ((startHeight > height))
547555 then throw("Launchpad sale not started yet")
548556 else if ((height > (startHeight + duration)))
549557 then throw("Launchpad sale ended")
550558 else if (if ((size(i.payments) != 1))
551559 then true
552560 else (pmtAssetId != buyAssetId))
553561 then throw((("One attached payment in " + buyAssetName) + " expected"))
554562 else {
555563 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
556564 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
557565 let change = (pmtAmount - buyPriceWithComission)
558566 if ((buyTicketAmount == 0))
559567 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
560568 else if ((change != 0))
561569 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
562570 else {
563571 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
564572 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
565573 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
566574 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
567575 then ("," + boughtRange)
568576 else ("" + boughtRange)))
569577 let inv = if ((buyAssetId == USDN))
570578 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
571579 else 0
572580 if ((inv == inv))
573581 then {
574582 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)
575583 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
576584 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
577585 else baseEntry
578586 }
579587 else throw("Strict value is not equal to itself.")
580588 }
581589 }
582590 })
583591
584592
585593
586594 @Callable(i)
587595 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
588596 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
589597 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
590598 if ((calcHash != savedHash))
591599 then throw("vrf Height hash not matching")
592600 else {
593- let $t02558825738 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t02558825738._1
595- let buyAssetStrId = $t02558825738._2
596- let buyAssetName = $t02558825738._3
597- let buyAssetDecimals = $t02558825738._4
601+ let $t02576025910 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602+ let buyAssetId = $t02576025910._1
603+ let buyAssetStrId = $t02576025910._2
604+ let buyAssetName = $t02576025910._3
605+ let buyAssetDecimals = $t02576025910._4
598606 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
599607 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
600608 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
601609 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
602610 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
603611 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
604612 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
605613 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
606614 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
607615 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
608616 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
609617 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
610618 then throw("Can't transfer negative value to project")
611619 else {
612620 let inv = if ((buyAssetId == USDN))
613621 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
614622 else 0
615623 if ((inv == inv))
616624 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
617625 else throw("Strict value is not equal to itself.")
618626 }
619627 }
620628 }))
621629
622630
623631
624632 @Callable(i)
625633 func claim (launchpadId) = valueOrElse(isActive(), {
626634 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
627635 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
628636 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
629637 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
630638 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
631639 if ((finalizeHeight == 0))
632640 then throw("You can't claim because results are not finalized")
633641 else if (userClaimStatus)
634642 then throw("You are already claimed")
635643 else if (if (if ((boughtTickets == 0))
636644 then (boughtAllocations == 0)
637645 else false)
638646 then (boughtHCTickets == 0)
639647 else false)
640648 then throw("You can't claim because you don't buy anything")
641649 else {
642- let $t02882228999 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643- let buyAssetId = $t02882228999._1
644- let buyAssetStrId = $t02882228999._2
645- let buyAssetName = $t02882228999._3
646- let buyAssetDecimals = $t02882228999._4
650+ let $t02899429171 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651+ let buyAssetId = $t02899429171._1
652+ let buyAssetStrId = $t02899429171._2
653+ let buyAssetName = $t02899429171._3
654+ let buyAssetDecimals = $t02899429171._4
647655 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
648656 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
649657 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
650658 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
651659 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
652660 let allowedAllocations = min([boughtAllocations, awailableAllocations])
653661 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
654662 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
655- let $t02991530059 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656- let tokenId = $t02991530059._1
657- let tokenStrAssetId = $t02991530059._2
658- let tokenAssetName = $t02991530059._3
659- let tokenDecimals = $t02991530059._4
663+ let $t03008730231 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664+ let tokenId = $t03008730231._1
665+ let tokenStrAssetId = $t03008730231._2
666+ let tokenAssetName = $t03008730231._3
667+ let tokenDecimals = $t03008730231._4
660668 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
661669 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
662670 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
663671 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
664672 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
665673 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
666674 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
667675 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
668676 if (if (if ((0 > buyAssetForAllocations))
669677 then true
670678 else (0 > buyAssetForUnwonnedTickets))
671679 then true
672680 else (0 > buyAssetForHCUnwonnedTickets))
673681 then throw("Error with allowed allocation param or wonned tickets param please contact support")
674682 else {
675683 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
676684 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
677685 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
678686 else nil
679687 let inv = if (if ((returnedBuyAssetAmount > 0))
680688 then (buyAssetId == USDN)
681689 else false)
682690 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
683691 else 0
684692 if ((inv == inv))
685693 then {
686694 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
687695 if ((claimedParams[0] == "claimAll"))
688696 then {
689697 let transferTokens = if ((transferTokensAmount > 0))
690698 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
691699 else nil
692700 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
693701 }
694702 else if ((claimedParams[0] == "claimPeriod"))
695703 then {
696704 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
697705 let unlockPeriod = value(parseInt(claimedParams[2]))
698706 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
699707 let unlockHeight = (unlockPeriod + blockHeight)
700708 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
701709 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
702710 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
703711 else (0 - claimedTokens)))
704712 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
705713 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
706714 else nil
707715 if (if ((allowedTokensAmount > 0))
708716 then true
709717 else (returnedBuyAssetAmount > 0))
710718 then {
711719 let transferTokens = if ((allowedTokensAmount > 0))
712720 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
713721 else nil
714722 (transferBuyAsset ++ transferTokens)
715723 }
716724 else throw("Nothing to claim")
717725 }
718726 else throw("Unknown claim function")
719727 }
720728 else throw("Strict value is not equal to itself.")
721729 }
722730 }
723731 })
724732
725733
726734
727735 @Callable(i)
728736 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
729737 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
730738 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
731739 then throw("You can't claim because results are not finalized")
732740 else if (!(freezeAdditionalToken))
733741 then throw("There are no additional token freezing for this launchpad")
734742 else {
735743 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
736744 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
737745 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
738746 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
739747 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
740748 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
741749 if ((userTokensFreezed == 0))
742750 then throw("You are already claimed your tokens or not paid anything")
743751 else if ((blockEndHeight > height))
744752 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
745753 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
746754 }
747755 })
748756
749757
750758
751759 @Callable(i)
752760 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
753761 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
754- let $t03622436374 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755- let buyAssetId = $t03622436374._1
756- let buyAssetStrId = $t03622436374._2
757- let buyAssetName = $t03622436374._3
758- let buyAssetDecimals = $t03622436374._4
762+ let $t03639636546 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763+ let buyAssetId = $t03639636546._1
764+ let buyAssetStrId = $t03639636546._2
765+ let buyAssetName = $t03639636546._3
766+ let buyAssetDecimals = $t03639636546._4
759767 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
760768 let inv = if (if ((amount > 0))
761769 then (buyAssetId == USDN)
762770 else false)
763771 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
764772 else 0
765773 if ((inv == inv))
766774 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
767775 else throw("Strict value is not equal to itself.")
768776 }))
769777
770778
771779
772780 @Callable(i)
773781 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
774782 then throw("DApp already inactive")
775783 else [BooleanEntry(keyActive, false)])
776784
777785
778786
779787 @Callable(i)
780788 func activate () = valueOrElse(isAdminCall(i), if (active)
781789 then throw("DApp already active")
782790 else [BooleanEntry(keyActive, true)])
783791
784792
785793 @Verifier(tx)
786794 func verify () = {
787795 let multiSignedByAdmins = {
788796 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
789797 then 1
790798 else 0
791799 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
792800 then 1
793801 else 0
794802 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
795803 then 1
796804 else 0
797805 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
798806 }
799807 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
800808 then true
801809 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
802810 then true
803811 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
804812 then true
805813 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
806814 match tx {
807815 case dtx: DataTransaction =>
808816 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
809817 then signedByAdmin
810818 else false
811819 case _ =>
812820 multiSignedByAdmins
813821 }
814822 }
815823

github/deemru/w8io/026f985 
128.90 ms