tx · GwsfeCjPHUA2ZWTvfrdVFcd2TZ86yDRdhW4SUKY6VtLE

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.05000000 Waves

2023.08.23 13:37 [2723169] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "GwsfeCjPHUA2ZWTvfrdVFcd2TZ86yDRdhW4SUKY6VtLE", "fee": 5000000, "feeAssetId": null, "timestamp": 1692786969672, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "581nvtvG9pM59v1XKKi26MEEJrnjMGww9pJFQGJ9vZJBNcEZPvuAHhLkHci99hDsMQvWAq82pYHH4MmM1dnUBxLc", "4em7GbdMuZawJVKggjqWTw7AcAW5FDJ3L7hhgVEpBzUG9npi1QA3H52Adg2k9MjhPBS2ZKQdwvRLSCXTxUKUTyqE" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUE+06HqYmRCC3D4wq0lzrbsHxoPvs0AmgABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECyR0MDUxNTk1MzA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDUxNTk1MzA5Al8xBA1idXlBc3NldFN0cklkCAULJHQwNTE1OTUzMDkCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDUxNTk1MzA5Al8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwNTE1OTUzMDkCXzQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTQ5MTU2MzUJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTQ5MTU2MzUCXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDU0OTE1NjM1Al8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDU0OTE1NjM1Al8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTQ5MTU2MzUCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzc4OTc4NjQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzc4OTc4NjQCXzEECnBtdEFzc2V0SWQIBQskdDA3Nzg5Nzg2NAJfMgQLJHQwNzg3Mzc5NDYJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzg3Mzc5NDYCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc4NzM3OTQ2Al8yBAtwbXREZWNpbWFscwgFCyR0MDc4NzM3OTQ2Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA3MjkxMDg3MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDcyOTEwODczAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDcyOTEwODczAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNzI5MTA4NzMCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDcyOTEwODczAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMTA5MDExMjQwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDExMDkwMTEyNDACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMTA5MDExMjQwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMTA5MDExMjQwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTEwOTAxMTI0MAJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExOTY1MTMwMjEDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvR2V0BQlhbW50VG9HZXQEDXRpY2tldHNBbW91bnQJAGkCBQlhbW50VG9HZXQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQQYW1udFRvR2V0VGlja2V0cwkAaAIFDXRpY2tldHNBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQJYW1udFRvUGF5CgABQAkAkQMCCgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91UGF5UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvUGF5BQlhbW50VG9QYXkEAmV4CQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUJYW1udFRvUGF5BQNuaWwDCQAAAgUCZXgFAmV4BAZjaGFuZ2UJAGUCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUQYW1udFRvR2V0VGlja2V0cwQGY0VudHJ5AwkAZgIFBmNoYW5nZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGY2hhbmdlCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAUDbmlsCQCVCgMFEGFtbnRUb0dldFRpY2tldHMFCmJ1eUFzc2V0SWQFBmNFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlQoDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwECXBtdEFtb3VudAgFDSR0MDExOTY1MTMwMjECXzEECnBtdEFzc2V0SWQIBQ0kdDAxMTk2NTEzMDIxAl8yBAtjaGFuZ2VFbnRyeQgFDSR0MDExOTY1MTMwMjECXzMDCQECIT0CBRFhY3RpdmVMYXVuY2hwYWRJZAULbGF1bmNocGFkSWQJAAIBAjdUaGVyZSBpcyBubyBhY3RpdmUgbGF1bmNocGFkIG9yIHRoaXMgbGF1bmNocGFkIGlzIGVuZGVkAwkAZgIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQJAAIBAh5MYXVuY2hwYWQgc2FsZSBub3Qgc3RhcnRlZCB5ZXQDCQBmAgUGaGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uCQACAQIUTGF1bmNocGFkIHNhbGUgZW5kZWQDAwkBASEBBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4DCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkBwkAAgEJAKwCAgkArAICAhhPbmUgYXR0YWNoZWQgcGF5bWVudCBpbiAFDGJ1eUFzc2V0TmFtZQIJIGV4cGVjdGVkAwMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQHBA1mcmVlemVUb2tlbklkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQJAAIBCQCsAgIJAKwCAgkArAICAilUd28gYXR0YWNoZWQgcGF5bWVudHMgZXhwZWN0ZWQ6IEZpcnN0IGluIAUMYnV5QXNzZXROYW1lAgwsIHNlY29uZCBpbiAFDWZyZWV6ZVRva2VuSWQDAwkAZwIAAAUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwGCQBnAgAABRRhbGxvd2VkVGlja2V0c0Ftb3VudAkAAgECKk5vdCBlbm91Z2h0IFNXT1AgaW4gc3Rha2luZyB0byBidXkgdGlja2V0cwQPYnV5VGlja2V0QW1vdW50CQBpAgUJcG10QW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAJcDAQkAzAgCBQ9idXlUaWNrZXRBbW91bnQJAMwIAgUUYWxsb3dlZFRpY2tldHNBbW91bnQFA25pbAQcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbgkAaAIFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQGY2hhbmdlCQBlAgUJcG10QW1vdW50BRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uAwkAAAIFD2J1eVRpY2tldEFtb3VudAAACQACAQkArAICCQCsAgICDE5vdCBlbm91Z2h0IAUMYnV5QXNzZXROYW1lAg8gdG8gYnV5IHRpY2tldHMDCQECIT0CBQZjaGFuZ2UAAAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIWV3JvbmcgcGF5bWVudC4gVG8gYnV5IAkApAMBBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50Ahh0aWNrZXRzIHlvdSBuZWVkIHRvIHBheSAJAKQDAQUcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4EDWZyZWV6ZVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAQUZnJlZXplVG9rZW5QZXJUaWNrZXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQEDSR0MDE0ODY0MTQ5NTEJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAQPcG10QW1vdW50RnJlZXplCAUNJHQwMTQ4NjQxNDk1MQJfMQQQcG10QXNzZXRJZEZyZWV6ZQgFDSR0MDE0ODY0MTQ5NTECXzIEDSR0MDE0OTY4MTUwNTkJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBBNwbXRGcmVlemVTdHJBc3NldElkCAUNJHQwMTQ5NjgxNTA1OQJfMQQScG10RnJlZXplQXNzZXROYW1lCAUNJHQwMTQ5NjgxNTA1OQJfMgQRcG10RnJlZXplRGVjaW1hbHMIBQ0kdDAxNDk2ODE1MDU5Al8zBBBuZWVkRnJlZXplVG9rZW5zCQBoAgUUZnJlZXplVG9rZW5QZXJUaWNrZXQFD2J1eVRpY2tldEFtb3VudAMDCQECIT0CBRNwbXRGcmVlemVTdHJBc3NldElkBQ1mcmVlemVUb2tlbklkBgkBAiE9AgUQbmVlZEZyZWV6ZVRva2VucwUPcG10QW1vdW50RnJlZXplCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBZb3UgbmVlZCB0byBhZGQgCQCkAwEFEG5lZWRGcmVlemVUb2tlbnMCASAFEnBtdEZyZWV6ZUFzc2V0TmFtZQIUIGFzIGEgc2Vjb25kIHBheW1lbnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4FD3BtdEFtb3VudEZyZWV6ZQUDbmlsBQNuaWwEGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUOa2V5VXNlclRpY2tldHMCAAQWbGFzdEJvdWdodFRpY2tldE51bWJlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUaWNrZXRMYXN0TnVtYmVyBAtib3VnaHRSYW5nZQkArAICCQCsAgIJAKQDAQkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIAAQIBLQkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAQbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQCsAgIFGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwMJAQIhPQIFGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwIACQCsAgICASwFC2JvdWdodFJhbmdlCQCsAgICAAULYm91Z2h0UmFuZ2UEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAkAZAIFE2JvdWdodFRpY2tldHNBbW91bnQFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VGlja2V0TGFzdE51bWJlcgkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDmtleVVzZXJUaWNrZXRzBRtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMFA25pbAUVZnJlZXplQWRkaXRpb25hbEVudHJ5BQtjaGFuZ2VFbnRyeQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFGNvbW1pdEFjY2Vzc0xpc3RTYWxlAgtsYXVuY2hwYWRJZAVyZWZJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMTcxNDUxNzIyMAkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAlwbXRBbW91bnQIBQ0kdDAxNzE0NTE3MjIwAl8xBApwbXRBc3NldElkCAUNJHQwMTcxNDUxNzIyMAJfMgQNJHQwMTcyMjUxNzM3NQkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAxNzIyNTE3Mzc1Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMTcyMjUxNzM3NQJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMTcyMjUxNzM3NQJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDE3MjI1MTczNzUCXzQEE3VzZXJVc2RuSW5NYXJrZXRpbmcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAAAED3VzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQRYm91Z2h0QWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwAABApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQKdG9rZW5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlQcmljZVBlclRva2VuBBN0b2tlbnNQZXJBbGxvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleVRva2Vuc1BlckFsbG9jYXRpb24EDSR0MDE4MDQ0MTgxODgJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMTgwNDQxODE4OAJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMTgwNDQxODE4OAJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAxODA0NDE4MTg4Al8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMTgwNDQxODE4OAJfNAQcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbgkAawMJAGsDBQp0b2tlblByaWNlBRN0b2tlbnNQZXJBbGxvY2F0aW9uCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOCQBkAgBkBQpjb21taXNzaW9uAGQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24DCQECIT0CBRFhY3RpdmVMYXVuY2hwYWRJZAULbGF1bmNocGFkSWQJAAIBAjdUaGVyZSBpcyBubyBhY3RpdmUgbGF1bmNocGFkIG9yIHRoaXMgbGF1bmNocGFkIGlzIGVuZGVkAwkAZgIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQJAAIBAh5MYXVuY2hwYWQgc2FsZSBub3Qgc3RhcnRlZCB5ZXQDCQBmAgUGaGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uCQACAQIUTGF1bmNocGFkIHNhbGUgZW5kZWQDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAkAAgEJAKwCAgkArAICAhhPbmUgYXR0YWNoZWQgcGF5bWVudCBpbiAFDGJ1eUFzc2V0TmFtZQIJIGV4cGVjdGVkAwkAZwIFEWJvdWdodEFsbG9jYXRpb25zBRRtYXhBbGxvY2F0aW9uc0Ftb3VudAkAAgEJAKwCAgkArAICAhFZb3UgY2FuIGJ1eSBvbmx5IAkApAMBBRRtYXhBbGxvY2F0aW9uc0Ftb3VudAILYWxsb2NhdGlvbnMDAwkBAiE9AgUcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbgUJcG10QW1vdW50CQECIT0CCQBoAgUcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbgACBQlwbXRBbW91bnQHCQACAQkArAICCQCsAgIJAKwCAgIyV3JvbmcgcGF5bWVudC4gWW91IGNhbiBidXkgMSBvciAyIGFsbG9jYXRpb25zIGZvciAJAKQDAQUcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lAg8gcGVyIGFsbG9jYXRpb24EFGJ1eUFsbG9jYXRpb25zQW1vdW50CQBpAgUJcG10QW1vdW50BRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMJAGQCBRFib3VnaHRBbGxvY2F0aW9ucwUUYnV5QWxsb2NhdGlvbnNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBSBrZXlVc2VyQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwkAZAIFE3VzZXJVc2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUPdXNkbkluTWFya2V0aW5nBQlwbXRBbW91bnQFA25pbAMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGWNvbW1pdEhpZ2hDb21wZXRpdGlvblNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAyMDQ0NjIwNTk2CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDIwNDQ2MjA1OTYCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAyMDQ0NjIwNTk2Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAyMDQ0NjIwNTk2Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMjA0NDYyMDU5NgJfNAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgQVYm91Z2h0SENUaWNrZXRzQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50AAAEE2hpZ2hDb21wZXRpdGlvblNhbGUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlIaWdoQ29tcGV0aXRpb25TYWxlBwQKdG9rZW5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlQcmljZVBlclRva2VuBA90b2tlbnNQZXJUaWNrZXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VG9rZW5zUGVyVGlja2V0BA0kdDAyMTIwNjIxMzUwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QXNzZXRJZAQHdG9rZW5JZAgFDSR0MDIxMjA2MjEzNTACXzEED3Rva2VuU3RyQXNzZXRJZAgFDSR0MDIxMjA2MjEzNTACXzIEDnRva2VuQXNzZXROYW1lCAUNJHQwMjEyMDYyMTM1MAJfMwQNdG9rZW5EZWNpbWFscwgFDSR0MDIxMjA2MjEzNTACXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0CQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEDSR0MDIxNTgzMjI2MzkDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvR2V0BQlhbW50VG9HZXQEDXRpY2tldHNBbW91bnQJAGkCBQlhbW50VG9HZXQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQQYW1udFRvR2V0VGlja2V0cwkAaAIFDXRpY2tldHNBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQJYW1udFRvUGF5CgABQAkAkQMCCgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91UGF5UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvUGF5BQlhbW50VG9QYXkEAmV4CQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUJYW1udFRvUGF5BQNuaWwDCQAAAgUCZXgFAmV4BAZjaGFuZ2UJAGUCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUQYW1udFRvR2V0VGlja2V0cwQGY0VudHJ5AwkAZgIFBmNoYW5nZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGY2hhbmdlCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAUDbmlsCQCVCgMFEGFtbnRUb0dldFRpY2tldHMFCmJ1eUFzc2V0SWQFBmNFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlQoDCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwECXBtdEFtb3VudAgFDSR0MDIxNTgzMjI2MzkCXzEECnBtdEFzc2V0SWQIBQ0kdDAyMTU4MzIyNjM5Al8yBAtjaGFuZ2VFbnRyeQgFDSR0MDIxNTgzMjI2MzkCXzMDCQECIT0CBRFhY3RpdmVMYXVuY2hwYWRJZAULbGF1bmNocGFkSWQJAAIBAjdUaGVyZSBpcyBubyBhY3RpdmUgbGF1bmNocGFkIG9yIHRoaXMgbGF1bmNocGFkIGlzIGVuZGVkAwkBASEBBRNoaWdoQ29tcGV0aXRpb25TYWxlCQACAQI0VGhlcmUgaXMgbm8gaGlnaCBjb21wZXRpdGlvbiBzYWxlIGZvciB0aGlzIGxhdW5jaHBhZAMJAGYCBQtzdGFydEhlaWdodAUGaGVpZ2h0CQACAQIeTGF1bmNocGFkIHNhbGUgbm90IHN0YXJ0ZWQgeWV0AwkAZgIFBmhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgkAAgECFExhdW5jaHBhZCBzYWxlIGVuZGVkAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQJAAIBCQCsAgIJAKwCAgIYT25lIGF0dGFjaGVkIHBheW1lbnQgaW4gBQxidXlBc3NldE5hbWUCCSBleHBlY3RlZAQPYnV5VGlja2V0QW1vdW50CQBpAgUJcG10QW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEFWJ1eVByaWNlV2l0aENvbWlzc2lvbgkAaAIFD2J1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFFWJ1eVByaWNlV2l0aENvbWlzc2lvbgMJAAACBQ9idXlUaWNrZXRBbW91bnQAAAkAAgEJAKwCAgkArAICAgxOb3QgZW5vdWdodCAFDGJ1eUFzc2V0TmFtZQIPIHRvIGJ1eSB0aWNrZXRzAwkBAiE9AgUGY2hhbmdlAAAJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICFldyb25nIHBheW1lbnQuIFRvIGJ1eSAJAKQDAQUPYnV5VGlja2V0QW1vdW50Ahh0aWNrZXRzIHlvdSBuZWVkIHRvIHBheSAJAKQDAQUVYnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUQa2V5VXNlckhDVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFWtleUhDVGlja2V0TGFzdE51bWJlcgQLYm91Z2h0UmFuZ2UJAKwCAgkArAICCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyAAECAS0JAKQDAQkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFD2J1eVRpY2tldEFtb3VudAQbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQCsAgIFGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwMJAQIhPQIFGHVzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwIACQCsAgICASwFC2JvdWdodFJhbmdlCQCsAgICAAULYm91Z2h0UmFuZ2UEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAkAZAIFFWJvdWdodEhDVGlja2V0c0Ftb3VudAUPYnV5VGlja2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFWtleUhDVGlja2V0TGFzdE51bWJlcgkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFD2J1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUQa2V5VXNlckhDVGlja2V0cwUbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzBQNuaWwFC2NoYW5nZUVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpc2UDC2xhdW5jaHBhZElkCXZyZkhlaWdodApzZWNyZXRXb3JkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpBAlzYXZlZEhhc2gJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUNa2V5VmVyaWZ5SGFzaAQIY2FsY0hhc2gJANgEAQkA9wMBCQDLAQIJAJoDAQUJdnJmSGVpZ2h0CQCbAwEFCnNlY3JldFdvcmQDCQECIT0CBQhjYWxjSGFzaAUJc2F2ZWRIYXNoCQACAQIcdnJmIEhlaWdodCBoYXNoIG5vdCBtYXRjaGluZwQNJHQwMjU1OTIyNTc0MgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAyNTU5MjI1NzQyAl8xBA1idXlBc3NldFN0cklkCAUNJHQwMjU1OTIyNTc0MgJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjU1OTIyNTc0MgJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDI1NTkyMjU3NDICXzQEDnByb2plY3RBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFkZHJlc3MECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAxjb21taXNzaW9uSEMJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBBJ0cmFuc2ZlcmVkQnV5QXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0AAAEG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAQWc3dvcGZpSENCdXlBc3NldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleVRvdGFsQW1vdW50QnV5QXNzZXRTb2xkSEMAAAQWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgkAawMFG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUKY29tbWlzc2lvbgBkBBFzd29wZmlIQ0NvbWlzc2lvbgkAawMFFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQFDGNvbW1pc3Npb25IQwBkBB50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUla2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZ0ZpbmFsaXplZAQSbWFya2V0aW5nQ29taXNzaW9uCQBrAwUedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBQpjb21taXNzaW9uAGQEDXVuc3Rha2VBbW91bnQJAGUCCQBkAgkAZAIJAGQCCQBkAgkAZAIFG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBRZzd29wZmlNZW1iZXJzQ29taXNzaW9uBRJtYXJrZXRpbmdDb21pc3Npb24FFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQFEXN3b3BmaUhDQ29taXNzaW9uBRJ0cmFuc2ZlcmVkQnV5QXNzZXQDCQBmAgUSdHJhbnNmZXJlZEJ1eUFzc2V0CQBkAgkAZAIFG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50CQACAQIoQ2FuJ3QgdHJhbnNmZXIgbmVnYXRpdmUgdmFsdWUgdG8gcHJvamVjdAQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAg51bmxvY2tOZXV0cmlubwkAzAgCBQ11bnN0YWtlQW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAUGaGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnByb2plY3RBZGRyZXNzCQBlAgkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUSdHJhbnNmZXJlZEJ1eUFzc2V0BQpidXlBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEGNvbW1pc3Npb25XYWxsZXQJAGQCCQBkAgUWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUSbWFya2V0aW5nQ29taXNzaW9uBRFzd29wZmlIQ0NvbWlzc2lvbgUKYnV5QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQtsYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNYm91Z2h0VGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VXNlckJvdWdodFRpY2tldHNBbW91bnQAAAQPYm91Z2h0SENUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50AAAEEWJvdWdodEFsbG9jYXRpb25zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMAAAQPdXNlckNsYWltU3RhdHVzCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMHBA5maW5hbGl6ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEWtleUZpbmFsaXNlSGVpZ2h0AAADCQAAAgUOZmluYWxpemVIZWlnaHQAAAkAAgECMVlvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHJlc3VsdHMgYXJlIG5vdCBmaW5hbGl6ZWQDBQ91c2VyQ2xhaW1TdGF0dXMJAAIBAhdZb3UgYXJlIGFscmVhZHkgY2xhaW1lZAMDAwkAAAIFDWJvdWdodFRpY2tldHMAAAkAAAIFEWJvdWdodEFsbG9jYXRpb25zAAAHCQAAAgUPYm91Z2h0SENUaWNrZXRzAAAHCQACAQIuWW91IGNhbid0IGNsYWltIGJlY2F1c2UgeW91IGRvbid0IGJ1eSBhbnl0aGluZwQNJHQwMjg4MjYyOTAwMwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4JANgEAQUEVVNETgQKYnV5QXNzZXRJZAgFDSR0MDI4ODI2MjkwMDMCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAyODgyNjI5MDAzAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAyODgyNjI5MDAzAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMjg4MjYyOTAwMwJfNAQNd29ubmVkVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VXNlcldpbm5lZFRpY2tldHNBbW91bnQAAAQPd29ubmVkSENUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBSlrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAAABBRhd2FpbGFibGVBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUba2V5VXNlckF2YWlsYWJsZUFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAxjb21taXNzaW9uSEMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24AAAQSYWxsb3dlZEFsbG9jYXRpb25zCQCXAwEJAMwIAgURYm91Z2h0QWxsb2NhdGlvbnMJAMwIAgUUYXdhaWxhYmxlQWxsb2NhdGlvbnMFA25pbAQKdG9rZW5QcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlQcmljZVBlclRva2VuBA90b2tlbnNQZXJUaWNrZXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VG9rZW5zUGVyVGlja2V0BA0kdDAyOTkxOTMwMDYzCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QXNzZXRJZAQHdG9rZW5JZAgFDSR0MDI5OTE5MzAwNjMCXzEED3Rva2VuU3RyQXNzZXRJZAgFDSR0MDI5OTE5MzAwNjMCXzIEDnRva2VuQXNzZXROYW1lCAUNJHQwMjk5MTkzMDA2MwJfMwQNdG9rZW5EZWNpbWFscwgFDSR0MDI5OTE5MzAwNjMCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBN0b2tlbnNQZXJBbGxvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleVRva2Vuc1BlckFsbG9jYXRpb24EFHRyYW5zZmVyVG9rZW5zQW1vdW50CQBkAgkAZAIJAGgCBQ13b25uZWRUaWNrZXRzBQ90b2tlbnNQZXJUaWNrZXQJAGgCBRJhbGxvd2VkQWxsb2NhdGlvbnMFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGgCBQ93b25uZWRIQ1RpY2tldHMFD3Rva2Vuc1BlclRpY2tldAQbbm90QWxsb3dlZEFsbG9jYXRpb25zVG9rZW5zCQBoAgkAZQIFEWJvdWdodEFsbG9jYXRpb25zBRJhbGxvd2VkQWxsb2NhdGlvbnMFE3Rva2Vuc1BlckFsbG9jYXRpb24EFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMJAGsDCQBrAwUbbm90QWxsb3dlZEFsbG9jYXRpb25zVG9rZW5zBQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOCQBkAgBkBQpjb21taXNzaW9uAGQEGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzCQBrAwkAaAIJAGUCBQ1ib3VnaHRUaWNrZXRzBQ13b25uZWRUaWNrZXRzBQt0aWNrZXRQcmljZQkAZAIAZAUKY29tbWlzc2lvbgBkBBxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzCQBrAwkAaAIJAGUCBQ9ib3VnaHRIQ1RpY2tldHMFD3dvbm5lZEhDVGlja2V0cwULdGlja2V0UHJpY2UJAGQCAGQFDGNvbW1pc3Npb25IQwBkBA9jbGFpbWVkQnV5VG9rZW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAAADAwMJAGYCAAAFFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMGCQBmAgAABRpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwYJAGYCAAAFHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMJAAIBAlJFcnJvciB3aXRoIGFsbG93ZWQgYWxsb2NhdGlvbiBwYXJhbSBvciB3b25uZWQgdGlja2V0cyBwYXJhbSBwbGVhc2UgY29udGFjdCBzdXBwb3J0BBZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50CQBlAgkAZAIJAGQCBRpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwUcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwUWYnV5QXNzZXRGb3JBbGxvY2F0aW9ucwUPY2xhaW1lZEJ1eVRva2VuBBB0cmFuc2ZlckJ1eUFzc2V0AwkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQFCmJ1eUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucwUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAUDbmlsBQNuaWwEA2ludgMDCQBmAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAAACQAAAgUKYnV5QXNzZXRJZAUEVVNETgcJAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAg51bmxvY2tOZXV0cmlubwkAzAgCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgQNY2xhaW1lZFBhcmFtcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5Q2xhaW1QYXJhbXMCCGNsYWltQWxsAgEsAwkAAAIJAJEDAgUNY2xhaW1lZFBhcmFtcwAAAghjbGFpbUFsbAQOdHJhbnNmZXJUb2tlbnMDCQBmAgUUdHJhbnNmZXJUb2tlbnNBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFFHRyYW5zZmVyVG9rZW5zQW1vdW50BQd0b2tlbklkBQNuaWwFA25pbAkAzggCCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMFFHRyYW5zZmVyVG9rZW5zQW1vdW50BQNuaWwFDnRyYW5zZmVyVG9rZW5zBRB0cmFuc2ZlckJ1eUFzc2V0AwkAAAIJAJEDAgUNY2xhaW1lZFBhcmFtcwAAAgtjbGFpbVBlcmlvZAQNY2xhaW1lZFRva2VucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMAAAQMdW5sb2NrUGVyaW9kCQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwACBAtibG9ja0hlaWdodAkAZAIJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAMFDmZpbmFsaXplSGVpZ2h0BAx1bmxvY2tIZWlnaHQJAGQCBQx1bmxvY2tQZXJpb2QFC2Jsb2NrSGVpZ2h0BBJhbGxvd2VkU3RhcnRBbW91bnQJAGsDBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAQBkBBNhbGxvd2VkVG9rZW5zQW1vdW50CQBkAgUSYWxsb3dlZFN0YXJ0QW1vdW50AwkAZgIFBmhlaWdodAULYmxvY2tIZWlnaHQJAGUCCQBrAwkAZQIFFHRyYW5zZmVyVG9rZW5zQW1vdW50BRJhbGxvd2VkU3RhcnRBbW91bnQJAGUCCQCXAwEJAMwIAgUGaGVpZ2h0CQDMCAIFDHVubG9ja0hlaWdodAUDbmlsBQtibG9ja0hlaWdodAUMdW5sb2NrUGVyaW9kBQ1jbGFpbWVkVG9rZW5zCQBlAgAABQ1jbGFpbWVkVG9rZW5zBBBjbGFpbVN0YXR1c0VudHJ5AwkAZwIFFHRyYW5zZmVyVG9rZW5zQW1vdW50CQBkAgUNY2xhaW1lZFRva2VucwUTYWxsb3dlZFRva2Vuc0Ftb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJDbGFpbVN0YXR1cwYFA25pbAUDbmlsAwMJAGYCBRNhbGxvd2VkVG9rZW5zQW1vdW50AAAGCQBmAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAAABA50cmFuc2ZlclRva2VucwMJAGYCBRNhbGxvd2VkVG9rZW5zQW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRRrZXlVc2VyQ2xhaW1lZFRva2VucwkAZAIFDWNsYWltZWRUb2tlbnMFE2FsbG93ZWRUb2tlbnNBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRNhbGxvd2VkVG9rZW5zQW1vdW50BQd0b2tlbklkBQNuaWwFA25pbAkAzggCBRB0cmFuc2ZlckJ1eUFzc2V0BQ50cmFuc2ZlclRva2VucwkAAgECEE5vdGhpbmcgdG8gY2xhaW0JAAIBAhZVbmtub3duIGNsYWltIGZ1bmN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGNsYWltRnJlZXplVG9rZW4BC2xhdW5jaHBhZElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABBVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4HAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEWtleUZpbmFsaXNlSGVpZ2h0CQACAQIxWW91IGNhbid0IGNsYWltIGJlY2F1c2UgcmVzdWx0cyBhcmUgbm90IGZpbmFsaXplZAMJAQEhAQUVZnJlZXplQWRkaXRpb25hbFRva2VuCQACAQI5VGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgdG9rZW4gZnJlZXppbmcgZm9yIHRoaXMgbGF1bmNocGFkBAd0b2tlbklkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAQRdXNlclRva2Vuc0ZyZWV6ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgAABAtzdGFydEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0AAAECGR1cmF0aW9uCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24AAAQTZnJlZXplVG9rZW5EdXJhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlGcmVlemVUb2tlbkR1cmF0aW9uBA5ibG9ja0VuZEhlaWdodAkAZAIJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24FE2ZyZWV6ZVRva2VuRHVyYXRpb24DCQAAAgURdXNlclRva2Vuc0ZyZWV6ZWQAAAkAAgECOFlvdSBhcmUgYWxyZWFkeSBjbGFpbWVkIHlvdXIgdG9rZW5zIG9yIG5vdCBwYWlkIGFueXRoaW5nAwkAZgIFDmJsb2NrRW5kSGVpZ2h0BQZoZWlnaHQJAAIBCQCsAgICGVlvdXIgdG9rZW5zIGZyZWV6ZWQgdGVlbCAJAKQDAQUOYmxvY2tFbmRIZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRF1c2VyVG9rZW5zRnJlZXplZAUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgAABQNuaWwBaQEQdHJhbnNmZXJCdXlBc3NldAILbGF1bmNocGFkSWQGYW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpBA5wcm9qZWN0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBZGRyZXNzBA0kdDAzNjIyODM2Mzc4CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDM2MjI4MzYzNzgCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAzNjIyODM2Mzc4Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAzNjIyODM2Mzc4Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMzYyMjgzNjM3OAJfNAQSdHJhbnNmZXJlZEJ1eUFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAAABANpbnYDAwkAZgIFBmFtb3VudAAACQAAAgUKYnV5QXNzZXRJZAUEVVNETgcJAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAg51bmxvY2tOZXV0cmlubwkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQRVU0ROBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQJAGQCBRJ0cmFuc2ZlcmVkQnV5QXNzZXQFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9qZWN0QWRkcmVzcwUGYW1vdW50BQpidXlBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBBQZhY3RpdmUJAAIBAhVEQXBwIGFscmVhZHkgaW5hY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCWtleUFjdGl2ZQcFA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDBQZhY3RpdmUJAAIBAhNEQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrZXlBY3RpdmUGBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEmFkbWluUHViS2V5U3Rha2luZwQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIPRGF0YVRyYW5zYWN0aW9uBANkdHgFByRtYXRjaDADCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQUha2V5TGF1bmNocGFkRGF0YVRyYW5zYWN0aW9uU3RhdHVzBwUNc2lnbmVkQnlBZG1pbgcFE211bHRpU2lnbmVkQnlBZG1pbnMp2dOT", "height": 2723169, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2JDR8bGKCEusjNJXAdbsbmjLPUXmVRiKHsCpv13E7o8w Next: 3AF4QCzJ2Fpvh6QERPbz1DDUSiNZh3tzfYqCVsGuru6N Diff:
OldNewDifferences
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))
210- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
211- if ($isInstanceOf(@, "(Int, String)"))
212- then @
213- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
210+ let amntToPay = {
211+ let @ = ({
212+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
213+ if ($isInstanceOf(@, "List[Any]"))
214+ then @
215+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
216+ })[0]
217+ if ($isInstanceOf(@, "Int"))
218+ then @
219+ else throw(($getType(@) + " couldn't be cast to Int"))
220+ }
214221 if ((amntToPay == amntToPay))
215222 then fraction(amntToPay, 101, 100)
216223 else throw("Strict value is not equal to itself.")
241248 else {
242249 let launchpadId = getLaunchpadNextId()
243250 let launchpadIdStr = toString(launchpadId)
244- let $t077807855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
245- let pmtAmount = $t077807855._1
246- let pmtAssetId = $t077807855._2
247- let $t078647937 = getAssetInfo(pmtAssetId)
248- let pmtStrAssetId = $t078647937._1
249- let pmtAssetName = $t078647937._2
250- let pmtDecimals = $t078647937._3
251+ let $t077897864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
252+ let pmtAmount = $t077897864._1
253+ let pmtAssetId = $t077897864._2
254+ let $t078737946 = getAssetInfo(pmtAssetId)
255+ let pmtStrAssetId = $t078737946._1
256+ let pmtAssetName = $t078737946._2
257+ let pmtDecimals = $t078737946._3
251258 let freezeAdditionalEntry = if (freezeAdditionalToken)
252259 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
253260 else nil
260267 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
261268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
262269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
263- let $t01072010864 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
264- let tokenId = $t01072010864._1
265- let tokenStrAssetId = $t01072010864._2
266- let tokenAssetName = $t01072010864._3
267- let tokenDecimals = $t01072010864._4
270+ let $t01072910873 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
271+ let tokenId = $t01072910873._1
272+ let tokenStrAssetId = $t01072910873._2
273+ let tokenAssetName = $t01072910873._3
274+ let tokenDecimals = $t01072910873._4
268275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
269276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
270- let $t01108111231 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
271- let buyAssetId = $t01108111231._1
272- let buyAssetStrId = $t01108111231._2
273- let buyAssetName = $t01108111231._3
274- let buyAssetDecimals = $t01108111231._4
277+ let $t01109011240 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
278+ let buyAssetId = $t01109011240._1
279+ let buyAssetStrId = $t01109011240._2
280+ let buyAssetName = $t01109011240._3
281+ let buyAssetDecimals = $t01109011240._4
275282 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
276283 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
277284 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
279286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
280287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
281288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
282- let $t01195613004 = if ((i.payments[0].assetId == unit))
289+ let $t01196513021 = if ((i.payments[0].assetId == unit))
283290 then {
284- let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
285- if ($isInstanceOf(@, "(Int, String, Int, Int)"))
286- then @
287- else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
291+ let amntToGet = {
292+ let @ = ({
293+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
294+ if ($isInstanceOf(@, "List[Any]"))
295+ then @
296+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
297+ })[0]
298+ if ($isInstanceOf(@, "Int"))
299+ then @
300+ else throw(($getType(@) + " couldn't be cast to Int"))
301+ }
288302 if ((amntToGet == amntToGet))
289303 then {
290304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
291305 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
292- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
293- if ($isInstanceOf(@, "(Int, String)"))
294- then @
295- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
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+ }
296317 if ((amntToPay == amntToPay))
297318 then {
298319 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
311332 else throw("Strict value is not equal to itself.")
312333 }
313334 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
314- let pmtAmount = $t01195613004._1
315- let pmtAssetId = $t01195613004._2
316- let changeEntry = $t01195613004._3
335+ let pmtAmount = $t01196513021._1
336+ let pmtAssetId = $t01196513021._2
337+ let changeEntry = $t01196513021._3
317338 if ((activeLaunchpadId != launchpadId))
318339 then throw("There is no active launchpad or this launchpad is ended")
319340 else if ((startHeight > height))
353374 then {
354375 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
355376 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
356- let $t01484714934 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
357- let pmtAmountFreeze = $t01484714934._1
358- let pmtAssetIdFreeze = $t01484714934._2
359- let $t01495115042 = getAssetInfo(pmtAssetId)
360- let pmtFreezeStrAssetId = $t01495115042._1
361- let pmtFreezeAssetName = $t01495115042._2
362- let pmtFreezeDecimals = $t01495115042._3
377+ let $t01486414951 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378+ let pmtAmountFreeze = $t01486414951._1
379+ let pmtAssetIdFreeze = $t01486414951._2
380+ let $t01496815059 = getAssetInfo(pmtAssetId)
381+ let pmtFreezeStrAssetId = $t01496815059._1
382+ let pmtFreezeAssetName = $t01496815059._2
383+ let pmtFreezeDecimals = $t01496815059._3
363384 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
364385 if (if ((pmtFreezeStrAssetId != freezeTokenId))
365386 then true
393414
394415 @Callable(i)
395416 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
396- let $t01712817203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
397- let pmtAmount = $t01712817203._1
398- let pmtAssetId = $t01712817203._2
399- let $t01720817358 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
400- let buyAssetId = $t01720817358._1
401- let buyAssetStrId = $t01720817358._2
402- let buyAssetName = $t01720817358._3
403- let buyAssetDecimals = $t01720817358._4
417+ let $t01714517220 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01714517220._1
419+ let pmtAssetId = $t01714517220._2
420+ let $t01722517375 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421+ let buyAssetId = $t01722517375._1
422+ let buyAssetStrId = $t01722517375._2
423+ let buyAssetName = $t01722517375._3
424+ let buyAssetDecimals = $t01722517375._4
404425 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
405426 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
406427 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
407428 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
408429 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
409430 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
410- let $t01802718171 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
411- let tokenId = $t01802718171._1
412- let tokenStrAssetId = $t01802718171._2
413- let tokenAssetName = $t01802718171._3
414- let tokenDecimals = $t01802718171._4
431+ let $t01804418188 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432+ let tokenId = $t01804418188._1
433+ let tokenStrAssetId = $t01804418188._2
434+ let tokenAssetName = $t01804418188._3
435+ let tokenDecimals = $t01804418188._4
415436 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
416437 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
417438 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
451472
452473 @Callable(i)
453474 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
454- let $t02042920579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
455- let buyAssetId = $t02042920579._1
456- let buyAssetStrId = $t02042920579._2
457- let buyAssetName = $t02042920579._3
458- let buyAssetDecimals = $t02042920579._4
475+ let $t02044620596 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476+ let buyAssetId = $t02044620596._1
477+ let buyAssetStrId = $t02044620596._2
478+ let buyAssetName = $t02044620596._3
479+ let buyAssetDecimals = $t02044620596._4
459480 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
460481 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
461482 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
462483 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
463484 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
464485 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
465- let $t02118921333 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
466- let tokenId = $t02118921333._1
467- let tokenStrAssetId = $t02118921333._2
468- let tokenAssetName = $t02118921333._3
469- let tokenDecimals = $t02118921333._4
486+ let $t02120621350 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487+ let tokenId = $t02120621350._1
488+ let tokenStrAssetId = $t02120621350._2
489+ let tokenAssetName = $t02120621350._3
490+ let tokenDecimals = $t02120621350._4
470491 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
471492 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
472- let $t02156622614 = if ((i.payments[0].assetId == unit))
493+ let $t02158322639 = if ((i.payments[0].assetId == unit))
473494 then {
474- let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
475- if ($isInstanceOf(@, "(Int, String, Int, Int)"))
476- then @
477- else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
495+ let amntToGet = {
496+ let @ = ({
497+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
498+ if ($isInstanceOf(@, "List[Any]"))
499+ then @
500+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
501+ })[0]
502+ if ($isInstanceOf(@, "Int"))
503+ then @
504+ else throw(($getType(@) + " couldn't be cast to Int"))
505+ }
478506 if ((amntToGet == amntToGet))
479507 then {
480508 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
481509 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
482- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
483- if ($isInstanceOf(@, "(Int, String)"))
484- then @
485- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
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+ }
486521 if ((amntToPay == amntToPay))
487522 then {
488523 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
501536 else throw("Strict value is not equal to itself.")
502537 }
503538 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
504- let pmtAmount = $t02156622614._1
505- let pmtAssetId = $t02156622614._2
506- let changeEntry = $t02156622614._3
539+ let pmtAmount = $t02158322639._1
540+ let pmtAssetId = $t02158322639._2
541+ let changeEntry = $t02158322639._3
507542 if ((activeLaunchpadId != launchpadId))
508543 then throw("There is no active launchpad or this launchpad is ended")
509544 else if (!(highCompetitionSale))
555590 if ((calcHash != savedHash))
556591 then throw("vrf Height hash not matching")
557592 else {
558- let $t02556725717 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
559- let buyAssetId = $t02556725717._1
560- let buyAssetStrId = $t02556725717._2
561- let buyAssetName = $t02556725717._3
562- let buyAssetDecimals = $t02556725717._4
593+ let $t02559225742 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594+ let buyAssetId = $t02559225742._1
595+ let buyAssetStrId = $t02559225742._2
596+ let buyAssetName = $t02559225742._3
597+ let buyAssetDecimals = $t02559225742._4
563598 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
564599 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
565600 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
604639 else false)
605640 then throw("You can't claim because you don't buy anything")
606641 else {
607- let $t02880128978 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
608- let buyAssetId = $t02880128978._1
609- let buyAssetStrId = $t02880128978._2
610- let buyAssetName = $t02880128978._3
611- let buyAssetDecimals = $t02880128978._4
642+ let $t02882629003 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643+ let buyAssetId = $t02882629003._1
644+ let buyAssetStrId = $t02882629003._2
645+ let buyAssetName = $t02882629003._3
646+ let buyAssetDecimals = $t02882629003._4
612647 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
613648 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
614649 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
617652 let allowedAllocations = min([boughtAllocations, awailableAllocations])
618653 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
619654 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
620- let $t02989430038 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
621- let tokenId = $t02989430038._1
622- let tokenStrAssetId = $t02989430038._2
623- let tokenAssetName = $t02989430038._3
624- let tokenDecimals = $t02989430038._4
655+ let $t02991930063 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656+ let tokenId = $t02991930063._1
657+ let tokenStrAssetId = $t02991930063._2
658+ let tokenAssetName = $t02991930063._3
659+ let tokenDecimals = $t02991930063._4
625660 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
626661 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
627662 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
716751 @Callable(i)
717752 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
718753 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
719- let $t03620336353 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
720- let buyAssetId = $t03620336353._1
721- let buyAssetStrId = $t03620336353._2
722- let buyAssetName = $t03620336353._3
723- let buyAssetDecimals = $t03620336353._4
754+ let $t03622836378 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755+ let buyAssetId = $t03622836378._1
756+ let buyAssetStrId = $t03622836378._2
757+ let buyAssetName = $t03622836378._3
758+ let buyAssetDecimals = $t03622836378._4
724759 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
725760 let inv = if (if ((amount > 0))
726761 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))
210- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
211- if ($isInstanceOf(@, "(Int, String)"))
212- then @
213- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
210+ let amntToPay = {
211+ let @ = ({
212+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
213+ if ($isInstanceOf(@, "List[Any]"))
214+ then @
215+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
216+ })[0]
217+ if ($isInstanceOf(@, "Int"))
218+ then @
219+ else throw(($getType(@) + " couldn't be cast to Int"))
220+ }
214221 if ((amntToPay == amntToPay))
215222 then fraction(amntToPay, 101, 100)
216223 else throw("Strict value is not equal to itself.")
217224 }
218225
219226
220227 @Callable(i)
221228 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
222229
223230
224231
225232 @Callable(i)
226233 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
227234
228235
229236
230237 @Callable(i)
231238 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), "")))
232239 then throw("Only project admin can call init function")
233240 else if ((size(i.payments) != 1))
234241 then throw("One attached payment expected")
235242 else if ((height > startHeight))
236243 then throw("Start height must be greater than blockchain height")
237244 else if (if (freezeAdditionalToken)
238245 then (size(freezeParams) != 3)
239246 else false)
240247 then throw("Freeze params list must have 3 items")
241248 else {
242249 let launchpadId = getLaunchpadNextId()
243250 let launchpadIdStr = toString(launchpadId)
244- let $t077807855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
245- let pmtAmount = $t077807855._1
246- let pmtAssetId = $t077807855._2
247- let $t078647937 = getAssetInfo(pmtAssetId)
248- let pmtStrAssetId = $t078647937._1
249- let pmtAssetName = $t078647937._2
250- let pmtDecimals = $t078647937._3
251+ let $t077897864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
252+ let pmtAmount = $t077897864._1
253+ let pmtAssetId = $t077897864._2
254+ let $t078737946 = getAssetInfo(pmtAssetId)
255+ let pmtStrAssetId = $t078737946._1
256+ let pmtAssetName = $t078737946._2
257+ let pmtDecimals = $t078737946._3
251258 let freezeAdditionalEntry = if (freezeAdditionalToken)
252259 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
253260 else nil
254261 ([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)
255262 })
256263
257264
258265
259266 @Callable(i)
260267 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
261268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
262269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
263- let $t01072010864 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
264- let tokenId = $t01072010864._1
265- let tokenStrAssetId = $t01072010864._2
266- let tokenAssetName = $t01072010864._3
267- let tokenDecimals = $t01072010864._4
270+ let $t01072910873 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
271+ let tokenId = $t01072910873._1
272+ let tokenStrAssetId = $t01072910873._2
273+ let tokenAssetName = $t01072910873._3
274+ let tokenDecimals = $t01072910873._4
268275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
269276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
270- let $t01108111231 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
271- let buyAssetId = $t01108111231._1
272- let buyAssetStrId = $t01108111231._2
273- let buyAssetName = $t01108111231._3
274- let buyAssetDecimals = $t01108111231._4
277+ let $t01109011240 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
278+ let buyAssetId = $t01109011240._1
279+ let buyAssetStrId = $t01109011240._2
280+ let buyAssetName = $t01109011240._3
281+ let buyAssetDecimals = $t01109011240._4
275282 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
276283 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
277284 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
278285 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
279286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
280287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
281288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
282- let $t01195613004 = if ((i.payments[0].assetId == unit))
289+ let $t01196513021 = if ((i.payments[0].assetId == unit))
283290 then {
284- let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
285- if ($isInstanceOf(@, "(Int, String, Int, Int)"))
286- then @
287- else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
291+ let amntToGet = {
292+ let @ = ({
293+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
294+ if ($isInstanceOf(@, "List[Any]"))
295+ then @
296+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
297+ })[0]
298+ if ($isInstanceOf(@, "Int"))
299+ then @
300+ else throw(($getType(@) + " couldn't be cast to Int"))
301+ }
288302 if ((amntToGet == amntToGet))
289303 then {
290304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
291305 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
292- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
293- if ($isInstanceOf(@, "(Int, String)"))
294- then @
295- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
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+ }
296317 if ((amntToPay == amntToPay))
297318 then {
298319 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
299320 if ((ex == ex))
300321 then {
301322 let change = (i.payments[0].amount - amntToGetTickets)
302323 let cEntry = if ((change > 0))
303324 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
304325 else nil
305326 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
306327 }
307328 else throw("Strict value is not equal to itself.")
308329 }
309330 else throw("Strict value is not equal to itself.")
310331 }
311332 else throw("Strict value is not equal to itself.")
312333 }
313334 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
314- let pmtAmount = $t01195613004._1
315- let pmtAssetId = $t01195613004._2
316- let changeEntry = $t01195613004._3
335+ let pmtAmount = $t01196513021._1
336+ let pmtAssetId = $t01196513021._2
337+ let changeEntry = $t01196513021._3
317338 if ((activeLaunchpadId != launchpadId))
318339 then throw("There is no active launchpad or this launchpad is ended")
319340 else if ((startHeight > height))
320341 then throw("Launchpad sale not started yet")
321342 else if ((height > (startHeight + duration)))
322343 then throw("Launchpad sale ended")
323344 else if (if (!(freezeAdditionalToken))
324345 then if ((size(i.payments) != 1))
325346 then true
326347 else (pmtAssetId != buyAssetId)
327348 else false)
328349 then throw((("One attached payment in " + buyAssetName) + " expected"))
329350 else if (if (freezeAdditionalToken)
330351 then if ((size(i.payments) != 2))
331352 then true
332353 else (pmtAssetId != buyAssetId)
333354 else false)
334355 then {
335356 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
336357 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
337358 }
338359 else if (if ((0 >= allowedTicketsAmountAll))
339360 then true
340361 else (0 >= allowedTicketsAmount))
341362 then throw("Not enought SWOP in staking to buy tickets")
342363 else {
343364 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
344365 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
345366 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
346367 let change = (pmtAmount - allowedBuyPriceWithComission)
347368 if ((buyTicketAmount == 0))
348369 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
349370 else if ((change != 0))
350371 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
351372 else {
352373 let freezeAdditionalEntry = if (freezeAdditionalToken)
353374 then {
354375 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
355376 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
356- let $t01484714934 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
357- let pmtAmountFreeze = $t01484714934._1
358- let pmtAssetIdFreeze = $t01484714934._2
359- let $t01495115042 = getAssetInfo(pmtAssetId)
360- let pmtFreezeStrAssetId = $t01495115042._1
361- let pmtFreezeAssetName = $t01495115042._2
362- let pmtFreezeDecimals = $t01495115042._3
377+ let $t01486414951 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378+ let pmtAmountFreeze = $t01486414951._1
379+ let pmtAssetIdFreeze = $t01486414951._2
380+ let $t01496815059 = getAssetInfo(pmtAssetId)
381+ let pmtFreezeStrAssetId = $t01496815059._1
382+ let pmtFreezeAssetName = $t01496815059._2
383+ let pmtFreezeDecimals = $t01496815059._3
363384 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
364385 if (if ((pmtFreezeStrAssetId != freezeTokenId))
365386 then true
366387 else (needFreezeTokens != pmtAmountFreeze))
367388 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
368389 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
369390 }
370391 else nil
371392 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
372393 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
373394 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
374395 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
375396 then ("," + boughtRange)
376397 else ("" + boughtRange)))
377398 let inv = if ((buyAssetId == USDN))
378399 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
379400 else 0
380401 if ((inv == inv))
381402 then {
382403 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)
383404 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
384405 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
385406 else baseEntry
386407 }
387408 else throw("Strict value is not equal to itself.")
388409 }
389410 }
390411 })
391412
392413
393414
394415 @Callable(i)
395416 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
396- let $t01712817203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
397- let pmtAmount = $t01712817203._1
398- let pmtAssetId = $t01712817203._2
399- let $t01720817358 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
400- let buyAssetId = $t01720817358._1
401- let buyAssetStrId = $t01720817358._2
402- let buyAssetName = $t01720817358._3
403- let buyAssetDecimals = $t01720817358._4
417+ let $t01714517220 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01714517220._1
419+ let pmtAssetId = $t01714517220._2
420+ let $t01722517375 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421+ let buyAssetId = $t01722517375._1
422+ let buyAssetStrId = $t01722517375._2
423+ let buyAssetName = $t01722517375._3
424+ let buyAssetDecimals = $t01722517375._4
404425 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
405426 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
406427 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
407428 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
408429 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
409430 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
410- let $t01802718171 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
411- let tokenId = $t01802718171._1
412- let tokenStrAssetId = $t01802718171._2
413- let tokenAssetName = $t01802718171._3
414- let tokenDecimals = $t01802718171._4
431+ let $t01804418188 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432+ let tokenId = $t01804418188._1
433+ let tokenStrAssetId = $t01804418188._2
434+ let tokenAssetName = $t01804418188._3
435+ let tokenDecimals = $t01804418188._4
415436 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
416437 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
417438 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
418439 if ((activeLaunchpadId != launchpadId))
419440 then throw("There is no active launchpad or this launchpad is ended")
420441 else if ((startHeight > height))
421442 then throw("Launchpad sale not started yet")
422443 else if ((height > (startHeight + duration)))
423444 then throw("Launchpad sale ended")
424445 else if (if ((size(i.payments) != 1))
425446 then true
426447 else (pmtAssetId != buyAssetId))
427448 then throw((("One attached payment in " + buyAssetName) + " expected"))
428449 else if ((boughtAllocations >= maxAllocationsAmount))
429450 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
430451 else if (if ((allocationPriceWithComission != pmtAmount))
431452 then ((allocationPriceWithComission * 2) != pmtAmount)
432453 else false)
433454 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
434455 else {
435456 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
436457 let inv = if ((buyAssetId == USDN))
437458 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
438459 else 0
439460 if ((inv == inv))
440461 then {
441462 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))]
442463 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
443464 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
444465 else baseEntry
445466 }
446467 else throw("Strict value is not equal to itself.")
447468 }
448469 })
449470
450471
451472
452473 @Callable(i)
453474 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
454- let $t02042920579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
455- let buyAssetId = $t02042920579._1
456- let buyAssetStrId = $t02042920579._2
457- let buyAssetName = $t02042920579._3
458- let buyAssetDecimals = $t02042920579._4
475+ let $t02044620596 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476+ let buyAssetId = $t02044620596._1
477+ let buyAssetStrId = $t02044620596._2
478+ let buyAssetName = $t02044620596._3
479+ let buyAssetDecimals = $t02044620596._4
459480 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
460481 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
461482 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
462483 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
463484 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
464485 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
465- let $t02118921333 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
466- let tokenId = $t02118921333._1
467- let tokenStrAssetId = $t02118921333._2
468- let tokenAssetName = $t02118921333._3
469- let tokenDecimals = $t02118921333._4
486+ let $t02120621350 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487+ let tokenId = $t02120621350._1
488+ let tokenStrAssetId = $t02120621350._2
489+ let tokenAssetName = $t02120621350._3
490+ let tokenDecimals = $t02120621350._4
470491 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
471492 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
472- let $t02156622614 = if ((i.payments[0].assetId == unit))
493+ let $t02158322639 = if ((i.payments[0].assetId == unit))
473494 then {
474- let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
475- if ($isInstanceOf(@, "(Int, String, Int, Int)"))
476- then @
477- else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
495+ let amntToGet = {
496+ let @ = ({
497+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
498+ if ($isInstanceOf(@, "List[Any]"))
499+ then @
500+ else throw(($getType(@) + " couldn't be cast to List[Any]"))
501+ })[0]
502+ if ($isInstanceOf(@, "Int"))
503+ then @
504+ else throw(($getType(@) + " couldn't be cast to Int"))
505+ }
478506 if ((amntToGet == amntToGet))
479507 then {
480508 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
481509 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
482- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
483- if ($isInstanceOf(@, "(Int, String)"))
484- then @
485- else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
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+ }
486521 if ((amntToPay == amntToPay))
487522 then {
488523 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
489524 if ((ex == ex))
490525 then {
491526 let change = (i.payments[0].amount - amntToGetTickets)
492527 let cEntry = if ((change > 0))
493528 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
494529 else nil
495530 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
496531 }
497532 else throw("Strict value is not equal to itself.")
498533 }
499534 else throw("Strict value is not equal to itself.")
500535 }
501536 else throw("Strict value is not equal to itself.")
502537 }
503538 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
504- let pmtAmount = $t02156622614._1
505- let pmtAssetId = $t02156622614._2
506- let changeEntry = $t02156622614._3
539+ let pmtAmount = $t02158322639._1
540+ let pmtAssetId = $t02158322639._2
541+ let changeEntry = $t02158322639._3
507542 if ((activeLaunchpadId != launchpadId))
508543 then throw("There is no active launchpad or this launchpad is ended")
509544 else if (!(highCompetitionSale))
510545 then throw("There is no high competition sale for this launchpad")
511546 else if ((startHeight > height))
512547 then throw("Launchpad sale not started yet")
513548 else if ((height > (startHeight + duration)))
514549 then throw("Launchpad sale ended")
515550 else if (if ((size(i.payments) != 1))
516551 then true
517552 else (pmtAssetId != buyAssetId))
518553 then throw((("One attached payment in " + buyAssetName) + " expected"))
519554 else {
520555 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
521556 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
522557 let change = (pmtAmount - buyPriceWithComission)
523558 if ((buyTicketAmount == 0))
524559 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
525560 else if ((change != 0))
526561 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
527562 else {
528563 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
529564 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
530565 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
531566 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
532567 then ("," + boughtRange)
533568 else ("" + boughtRange)))
534569 let inv = if ((buyAssetId == USDN))
535570 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
536571 else 0
537572 if ((inv == inv))
538573 then {
539574 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)
540575 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
541576 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
542577 else baseEntry
543578 }
544579 else throw("Strict value is not equal to itself.")
545580 }
546581 }
547582 })
548583
549584
550585
551586 @Callable(i)
552587 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
553588 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
554589 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
555590 if ((calcHash != savedHash))
556591 then throw("vrf Height hash not matching")
557592 else {
558- let $t02556725717 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
559- let buyAssetId = $t02556725717._1
560- let buyAssetStrId = $t02556725717._2
561- let buyAssetName = $t02556725717._3
562- let buyAssetDecimals = $t02556725717._4
593+ let $t02559225742 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594+ let buyAssetId = $t02559225742._1
595+ let buyAssetStrId = $t02559225742._2
596+ let buyAssetName = $t02559225742._3
597+ let buyAssetDecimals = $t02559225742._4
563598 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
564599 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
565600 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
566601 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
567602 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
568603 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
569604 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
570605 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
571606 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
572607 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
573608 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
574609 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
575610 then throw("Can't transfer negative value to project")
576611 else {
577612 let inv = if ((buyAssetId == USDN))
578613 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
579614 else 0
580615 if ((inv == inv))
581616 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
582617 else throw("Strict value is not equal to itself.")
583618 }
584619 }
585620 }))
586621
587622
588623
589624 @Callable(i)
590625 func claim (launchpadId) = valueOrElse(isActive(), {
591626 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
592627 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
593628 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
594629 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
595630 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
596631 if ((finalizeHeight == 0))
597632 then throw("You can't claim because results are not finalized")
598633 else if (userClaimStatus)
599634 then throw("You are already claimed")
600635 else if (if (if ((boughtTickets == 0))
601636 then (boughtAllocations == 0)
602637 else false)
603638 then (boughtHCTickets == 0)
604639 else false)
605640 then throw("You can't claim because you don't buy anything")
606641 else {
607- let $t02880128978 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
608- let buyAssetId = $t02880128978._1
609- let buyAssetStrId = $t02880128978._2
610- let buyAssetName = $t02880128978._3
611- let buyAssetDecimals = $t02880128978._4
642+ let $t02882629003 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643+ let buyAssetId = $t02882629003._1
644+ let buyAssetStrId = $t02882629003._2
645+ let buyAssetName = $t02882629003._3
646+ let buyAssetDecimals = $t02882629003._4
612647 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
613648 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
614649 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
615650 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
616651 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
617652 let allowedAllocations = min([boughtAllocations, awailableAllocations])
618653 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
619654 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
620- let $t02989430038 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
621- let tokenId = $t02989430038._1
622- let tokenStrAssetId = $t02989430038._2
623- let tokenAssetName = $t02989430038._3
624- let tokenDecimals = $t02989430038._4
655+ let $t02991930063 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656+ let tokenId = $t02991930063._1
657+ let tokenStrAssetId = $t02991930063._2
658+ let tokenAssetName = $t02991930063._3
659+ let tokenDecimals = $t02991930063._4
625660 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
626661 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
627662 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
628663 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
629664 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
630665 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
631666 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
632667 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
633668 if (if (if ((0 > buyAssetForAllocations))
634669 then true
635670 else (0 > buyAssetForUnwonnedTickets))
636671 then true
637672 else (0 > buyAssetForHCUnwonnedTickets))
638673 then throw("Error with allowed allocation param or wonned tickets param please contact support")
639674 else {
640675 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
641676 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
642677 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
643678 else nil
644679 let inv = if (if ((returnedBuyAssetAmount > 0))
645680 then (buyAssetId == USDN)
646681 else false)
647682 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
648683 else 0
649684 if ((inv == inv))
650685 then {
651686 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
652687 if ((claimedParams[0] == "claimAll"))
653688 then {
654689 let transferTokens = if ((transferTokensAmount > 0))
655690 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
656691 else nil
657692 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
658693 }
659694 else if ((claimedParams[0] == "claimPeriod"))
660695 then {
661696 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
662697 let unlockPeriod = value(parseInt(claimedParams[2]))
663698 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
664699 let unlockHeight = (unlockPeriod + blockHeight)
665700 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
666701 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
667702 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
668703 else (0 - claimedTokens)))
669704 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
670705 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
671706 else nil
672707 if (if ((allowedTokensAmount > 0))
673708 then true
674709 else (returnedBuyAssetAmount > 0))
675710 then {
676711 let transferTokens = if ((allowedTokensAmount > 0))
677712 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
678713 else nil
679714 (transferBuyAsset ++ transferTokens)
680715 }
681716 else throw("Nothing to claim")
682717 }
683718 else throw("Unknown claim function")
684719 }
685720 else throw("Strict value is not equal to itself.")
686721 }
687722 }
688723 })
689724
690725
691726
692727 @Callable(i)
693728 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
694729 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
695730 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
696731 then throw("You can't claim because results are not finalized")
697732 else if (!(freezeAdditionalToken))
698733 then throw("There are no additional token freezing for this launchpad")
699734 else {
700735 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
701736 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
702737 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
703738 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
704739 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
705740 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
706741 if ((userTokensFreezed == 0))
707742 then throw("You are already claimed your tokens or not paid anything")
708743 else if ((blockEndHeight > height))
709744 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
710745 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
711746 }
712747 })
713748
714749
715750
716751 @Callable(i)
717752 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
718753 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
719- let $t03620336353 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
720- let buyAssetId = $t03620336353._1
721- let buyAssetStrId = $t03620336353._2
722- let buyAssetName = $t03620336353._3
723- let buyAssetDecimals = $t03620336353._4
754+ let $t03622836378 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755+ let buyAssetId = $t03622836378._1
756+ let buyAssetStrId = $t03622836378._2
757+ let buyAssetName = $t03622836378._3
758+ let buyAssetDecimals = $t03622836378._4
724759 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
725760 let inv = if (if ((amount > 0))
726761 then (buyAssetId == USDN)
727762 else false)
728763 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
729764 else 0
730765 if ((inv == inv))
731766 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
732767 else throw("Strict value is not equal to itself.")
733768 }))
734769
735770
736771
737772 @Callable(i)
738773 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
739774 then throw("DApp already inactive")
740775 else [BooleanEntry(keyActive, false)])
741776
742777
743778
744779 @Callable(i)
745780 func activate () = valueOrElse(isAdminCall(i), if (active)
746781 then throw("DApp already active")
747782 else [BooleanEntry(keyActive, true)])
748783
749784
750785 @Verifier(tx)
751786 func verify () = {
752787 let multiSignedByAdmins = {
753788 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
754789 then 1
755790 else 0
756791 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
757792 then 1
758793 else 0
759794 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
760795 then 1
761796 else 0
762797 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
763798 }
764799 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
765800 then true
766801 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
767802 then true
768803 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
769804 then true
770805 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
771806 match tx {
772807 case dtx: DataTransaction =>
773808 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
774809 then signedByAdmin
775810 else false
776811 case _ =>
777812 multiSignedByAdmins
778813 }
779814 }
780815

github/deemru/w8io/3ef1775 
599.81 ms