tx · 35XQkjvoqeBNJdAnVoCPD3mW4okgZ6Z2YMn8z6GckqjG

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.02500000 Waves

2024.11.22 17:00 [3382765] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "35XQkjvoqeBNJdAnVoCPD3mW4okgZ6Z2YMn8z6GckqjG", "fee": 2500000, "feeAssetId": null, "timestamp": 1732284050609, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "356DC6YmZfEXe6h1nEoyLCmbRevHpEd1M4Jy1CGPXzaH7YAK2VVB7BB5jt8htxCBaKBbjh3aboRCx6kM7eWLx61e" ], "script": "base64:BgJHCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBARIDCgEBEgMKAQgSAwoBCBIDCgEBEgCNAQAKREFZX01JTExJUwCAuJkpAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AEGFjcmVzMkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQNFVIM1Q5blhwTU5wVW1TbVFqUG1FejNHODV0M3puNmVBAwkAAAIBAVQFByRtYXRjaDACIzNOQlB4MUZjaXUzSlFORUdaMjFqU25UZHV0TE5HR0JVU1hoCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAA5NSU5TSE9QUEFZTUVOVACgjQYBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABFJZHhDZmdTdGFraW5nRGFwcAABAA1JZHhDZmdXbGdEYXBwAAQAFElkeENmZ1B1enpsZVBvb2xEYXBwAAUAFElkeENmZ0ludmVzdEZ1bmREYXBwAAYAD0lkeENmZ0FjcmVzRGFwcAAIAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1B1enpsZVBvb2xEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEPZ2V0UmFuZG9tTnVtYmVyAwhtYXhWYWx1ZQRzYWx0B2VudHJvcHkDCQBnAgAABQhtYXhWYWx1ZQkAAgECFm1heFZhbHVlIHNob3VsZCBiZSA+IDAECnJhbmRvbUhhc2gJANQWAQkAywECBQRzYWx0BQdlbnRyb3B5CQBqAgkAsQkBBQpyYW5kb21IYXNoBQhtYXhWYWx1ZQAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwACE1JTExJT042AICA6YOx3hYAC1BMQVlFUlNIQVJFAIC1GAAJREFZTUlMTElTAIC4mSkAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQRhZGRyCQCsAgICEWxhc3RXbGdMaW1pdFVzZXJfBQRhZGRyAA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAANNNl8AwIQ9AANNOF8AgMLXLwAKVEVBTV9TSEFSRQDAmgwADkFDVElWSVRZX1NIQVJFAKCNBgAMUExBWUVSX1NIQVJFAIC1GAALWUVBUl9NSUxMSVMAgIbrx3UABkRBWV9NUwCAuJkpAApEQVlfQkxPQ0tTAKALAAtXRUVLX0JMT0NLUwDgTgAHSVNTVUUxMACAlOvcAwAPUExBWUVSUzEwX1NIQVJFAIDqMAARTUFSS0VUSU5HMTBfU0hBUkUAoI0GAAxURUFNMTBfU0hBUkUAoI0GABFORVdfU1RBS0lOR19TVEFSVACA87jCsTIAEG1hcmtldGluZ0FkZHJLZXkCDW1hcmtldGluZ0FkZHIACnRlYW1BZHJLZXkCCHRlYW1BZGRyAA5sYXN0VGVhbVRpbUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0ADnRlYW1BbXRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAUbGFzdEFjdGl2aXRpZXNUaW1LZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzAA1hY3RBbXRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAARc3Rha2Vyc0FtdExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyAQ1kaXN0ckJ5UGVyaW9kAgxpc3N1ZWRBbW91bnQGcGVyaW9kCQBrAwUMaXNzdWVkQW1vdW50CQBoAgUMUExBWUVSX1NIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFA002XwARd2xnSXNzdWUxMFRpbWVLZXkCD3dsZ19pc3N1ZTEwVGltZQAOd2xnSXNzdWVUaW1LZXkCDXdsZ19pc3N1ZVRpbWUAD3dsZ0lzc3VlZEFtdEtleQIQd2xnX2lzc3VlZEFtb3VudAAOemJJc3N1ZWRBbXRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgAJZGFwcDJSZXN0AAAADGRhcHAyU3Rha2luZwABAAhkYXBwMldsZwACAAtkYXBwMlB1enpsZQADAA9kYXBwMkludmVzdEZ1bmQABAAUSWR4RHR4MVBlcmNHZW1XaW5uZXIAAQAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBEGdldEZhcm1pbmdQb3dlcnMCEnVzZXJBZGRyU3RyT3JFbXB0eQ5hY3JlczJDb250cmFjdAQHdG90YWxGUAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQJdXNlckFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAQGdXNlckZQCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFCXVzZXJBY3JlcwkAzAgCBQd0b3RhbEZQCQDMCAIFBnVzZXJGUAUDbmlsAQprZXlVc2VyQmV0AQRhZGRyCQCsAgICCHVzZXJCZXRfBQRhZGRyARJrZXlVc2VyV2Vla1RpY2tldHMCBGFkZHIEd2VlawkArAICCQCsAgIJAKwCAgIQdXNlcldlZWtUaWNrZXRzXwUEYWRkcgIBXwkApAMBBQR3ZWVrARNrZXlUb3RhbFdlZWtUaWNrZXRzAQR3ZWVrCQCsAgICEXRvdGFsV2Vla1RpY2tldHNfCQCkAwEFBHdlZWsBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEEd2VlawkArAICAhZ0b3RhbFdlZWtQYXJ0aWNpcGFudHNfCQCkAwEFBHdlZWsAFURFRkFVTFRfV0VFS0xZX1BSSVpFUwABAQ5rZXlOdW1ORlQyRHJhdwEEd2VlawkArAICAgxudW1ORlQyRHJhd18JAKQDAQUEd2VlawEOa2V5TnVtTkZURHJhd24BBHdlZWsJAKwCAgIMbnVtTkZURHJhd25fCQCkAwEFBHdlZWsBDmtleVdlZWtXaW5uZXJzAQR3ZWVrCQCsAgICDHdlZWtXaW5uZXJzXwkApAMBBQR3ZWVrAQp3aW5uaW5nQmV0AQNkYXkJAGoCCQCxCQEJAQV2YWx1ZQEICQEFdmFsdWUBCQDtBwEJAGgCBQNkYXkFCkRBWV9CTE9DS1MDdnJmAAQACmlkeFRvdGFsRlAAAAAJaWR4VXNlckZQAAEAC2l4V2xnQW1vdW50AAAACGl4V2xnV2xnAAEACml4V2xnUHJpY2UAAgAOaXhXbGdJc3N1ZVRpbWUACAAPaXhXbGdUZWFtQW1MZWZ0AAsAE2l4V2xnVGVhbUFtQXZhaWxOb3cADAAOaXhXbGdBY3RBbUxlZnQADwASaXhXbGdBY3RBbUF2YWlsTm93ABAAEGl4V2xnQW1MZWZ0VG90YWwAEwATaXhXbGdVc2VyQW1BdmFpbE5vdwAXABBpeFdsZ0VmZlVzZXJUaW1lABgAEml4V2xnSXNzdWUxMEFtb3VudAAZABtpeFdsZ01hcmtldGluZ0lzc3VlMTBBbW91bnQAGgAWaXhXbGdUZWFtSXNzdWUxMEFtb3VudAAbAA9peFdsZ1VzZXIxMHBhcnQAHAAQaXhXbGdJc3N1ZTEwVGltZQAdAQxnZXRXbGdTdGF0czIEC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFD3dsZ0lzc3VlZEFtdEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAdyZXN0VXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBnVzZHRJZAQGd2xnVXNkCQBlAgkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHAyUHV6emxlBQZ1c2R0SWQECWFjcmVzMlVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBQZ1c2R0SWQEEWludmVzdEZuZENvbnRyYWN0CQCRAwIFCWNvbnRyYWN0cwUPZGFwcDJJbnZlc3RGdW5kBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEWludmVzdEZuZENvbnRyYWN0BQZ1c2R0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgURaW52ZXN0Rm5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcCC3dsZ19hc3NldElkAhNOb3QgaW5pdGlhbGl6ZWQgeWV0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDndsZ0lzc3VlVGltS2V5Ag9Ob3QgaW5pdGlhbGl6ZWQEBndsZ1dsZwkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFBXdsZ0lkBAl0ZWFtVG90YWwJAGsDBQxpc3N1ZWRBbW91bnQFClRFQU1fU0hBUkUFA002XwQOdGVhbUFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ50ZWFtQW10TGVmdEtleQUJdGVhbVRvdGFsBAxsYXN0VGVhbVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ5sYXN0VGVhbVRpbUtleQUJaXNzdWVUaW1lBAh0ZWFtQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAnQgCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFCnRlYW1BZHJLZXkEFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUJdGVhbVRvdGFsCQBlAgUDbm93BQxsYXN0VGVhbVRpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFDGlzc3VlZEFtb3VudAUOQUNUSVZJVFlfU0hBUkUFA002XwQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDWFjdEFtdExlZnRLZXkFCGFjdFRvdGFsBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRRsYXN0QWN0aXZpdGllc1RpbUtleQUJaXNzdWVUaW1lBBVhY3RBbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUIYWN0VG90YWwJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUNYWN0QW1vdW50TGVmdAUDbmlsBAlhY3RXbGdvbGQJAPAHAgkAkQMCBQljb250cmFjdHMFCWRhcHAyUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQULdXNlckFkZHJPcHQFCWlzc3VlVGltZQQObGFzdFVzZXJQZXJpb2QJAGkCCQBlAgUMbGFzdFVzZXJUaW1lBQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFC1lFQVJfTUlMTElTBQNuaWwECWN1clBlcmlvZAkAlwMBCQDMCAIJAGkCCQBlAgUDbm93BQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTCQDMCAIAAgUDbmlsBANlZmYJARBnZXRGYXJtaW5nUG93ZXJzAgULdXNlckFkZHJPcHQJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQFCWN1clBlcmlvZAQNcHJldlBlcmlvZEVuZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QEEXByZXZQcmV2UGVyaW9kRW5kCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMJAGUCBQljdXJQZXJpb2QAAQQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBA11c2VyQXZhaWxhYmxlAwkAAAIFDmxhc3RVc2VyUGVyaW9kBQljdXJQZXJpb2QFAmEwAwkAAAIFDmxhc3RVc2VyUGVyaW9kCQBlAgUJY3VyUGVyaW9kAAEEAmExCQBrAwkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAQkAZQIFDXByZXZQZXJpb2RFbmQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMJAGQCBQJhMQUCYTAEAmEyCQBrAwkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAgkAZQIFEXByZXZQcmV2UGVyaW9kRW5kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMQkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQJhMgUCYTEFAmEwBA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRFzdGFrZXJzQW10TGVmdEtleQAABAp1c2VyQW1vdW50AwkBAiE9AgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAkAawMFDXVzZXJBdmFpbGFibGUJAJEDAgUDZWZmBQlpZHhVc2VyRlAJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAED2xhc3RJc3N1ZTEwVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXdsZ0lzc3VlMTBUaW1lS2V5BRFORVdfU1RBS0lOR19TVEFSVAQNaXNzdWUxMEFtb3VudAkAawMFB0lTU1VFMTAJAJYDAQkAzAgCCQBlAgUDbm93BQ9sYXN0SXNzdWUxMFRpbWUJAMwIAgAABQNuaWwFBkRBWV9NUwQWbWFya2V0aW5nSXNzdWUxMEFtb3VudAkAawMFDWlzc3VlMTBBbW91bnQFEU1BUktFVElORzEwX1NIQVJFBQNNNl8EEXRlYW1Jc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAUMVEVBTTEwX1NIQVJFBQNNNl8EDnVzZXIxMEludGVydmFsCQCWAwEJAMwIAgkAZQIFA25vdwkAlgMBCQDMCAIFEU5FV19TVEFLSU5HX1NUQVJUCQDMCAIFDGxhc3RVc2VyVGltZQUDbmlsCQDMCAIAAAUDbmlsBAp1c2VyMTBwYXJ0AwkBAiE9AgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAkAawMJAGsDCQBrAwUHSVNTVUUxMAUOdXNlcjEwSW50ZXJ2YWwFBkRBWV9NUwkAkQMCBQNlZmYFCWlkeFVzZXJGUAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAFD1BMQVlFUlMxMF9TSEFSRQUDTTZfAAAEDm5ld0lzc3VlMTBUaW1lCQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUDbm93BQNuaWwEEGFjcmVzU3Rha2VkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUSYWNyZXNTdGFrZFRvdGFsS2V5AAAJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIFBndsZ1dsZwkAzAgCCQBrAwUNdG90YWxGdW5kc1VzZAUDTThfBQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQdyZXN0VXNkCQDMCAIFCWFjcmVzMlVzZAkAzAgCBQZ3bGdVc2QJAMwIAgUJcHV6emxlVXNkCQDMCAIFCWlzc3VlVGltZQkAzAgCBQxsYXN0VGVhbVRpbWUJAMwIAgUJdGVhbVRvdGFsCQDMCAIFDnRlYW1BbW91bnRMZWZ0CQDMCAIFFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAMwIAgUKdGVhbVdsZ29sZAkAzAgCBQhhY3RUb3RhbAkAzAgCBQ1hY3RBbW91bnRMZWZ0CQDMCAIFFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQlhY3RXbGdvbGQJAMwIAgUJY3VyUGVyaW9kCQDMCAIFD2Ftb3VudExlZnRUb3RhbAkAzAgCBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAMwIAgUMbGFzdFVzZXJUaW1lCQDMCAIFD2ludmVzdEZ1bmRUb3RhbAkAzAgCBQp1c2VyQW1vdW50CQDMCAIFCm5vd0xpbWl0ZWQJAMwIAgUNaXNzdWUxMEFtb3VudAkAzAgCBRZtYXJrZXRpbmdJc3N1ZTEwQW1vdW50CQDMCAIFEXRlYW1Jc3N1ZTEwQW1vdW50CQDMCAIFCnVzZXIxMHBhcnQJAMwIAgUObmV3SXNzdWUxMFRpbWUJAMwIAgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAJAMwIAgUQYWNyZXNTdGFrZWRUb3RhbAUDbmlsAANuZXQJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFA25ldAMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4ADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAA5hY3JlczJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUQYWNyZXMyQWRkcmVzc1N0cgEHcHJvbG9nMgAJAQVhc0ludAEJAP0HBAUOYWNyZXMyQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsARJnZXRTd2FwTGltaXRXbGdvbGQBBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUEYWRkcgAABAxkZWZhdWx0TGltaXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIAAAQNbGFzdExpbWl0TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyBQxkZWZhdWx0TGltaXQEDGN1cnJlbnRMaW1pdAkAZAIFDWxhc3RMaW1pdExlZnQJAGsDBQxkZWZhdWx0TGltaXQJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIbGFzdFRpbWUFCkRBWV9NSUxMSVMJAJcDAQkAzAgCBQxjdXJyZW50TGltaXQJAMwIAgUMZGVmYXVsdExpbWl0BQNuaWwBDmNsYWltSW50ZXJuYWwyAQRhZGRyBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQFBGFkZHIJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEC3VzZXJUaW1lS2V5CQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFBGFkZHIEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQt1c2VyVGltZUtleQAABAt1c2VyRWZmVGltZQkAkQMCBQhjdXJTdGF0cwUQaXhXbGdFZmZVc2VyVGltZQMJAAACBQxsYXN0VXNlclRpbWUFC3VzZXJFZmZUaW1lCQCUCgIFA25pbAAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJAJEDAgUIY3VyU3RhdHMFDml4V2xnSXNzdWVUaW1lBA50ZWFtQW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUPaXhXbGdUZWFtQW1MZWZ0BAp0ZWFtQW1vdW50CQBkAgkAkQMCBQhjdXJTdGF0cwUTaXhXbGdUZWFtQW1BdmFpbE5vdwkAkQMCBQhjdXJTdGF0cwUWaXhXbGdUZWFtSXNzdWUxMEFtb3VudAQMdGVhbVRyYW5zZmVyAwkAZgIFCnRlYW1BbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFC3RlYW1BZGRyS2V5BQp0ZWFtQW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQNYWN0QW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUOaXhXbGdBY3RBbUxlZnQECWFjdEFtb3VudAkAkQMCBQhjdXJTdGF0cwUSaXhXbGdBY3RBbUF2YWlsTm93BAthY3RUcmFuc2ZlcgMJAGYCBQlhY3RBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwED21hcmtldGluZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUbaXhXbGdNYXJrZXRpbmdJc3N1ZTEwQW1vdW50BBFtYXJrZXRpbmdUcmFuc2ZlcgMJAGYCBQ9tYXJrZXRpbmdBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFEG1hcmtldGluZ0FkZHJLZXkFD21hcmtldGluZ0Ftb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVXNlckFtQXZhaWxOb3cEB3VzZXJLZXkJARhrZXlTdGFrZXJzQW1vdW50UGFpZFVzZXIBBQRhZGRyBAl1c2VyVG90YWwJAGQCBQp1c2VyQW1vdW50CQCRAwIFCGN1clN0YXRzBQ9peFdsZ1VzZXIxMHBhcnQEDmlzc3VlZDEwQW1vdW50CQCRAwIFCGN1clN0YXRzBRJpeFdsZ0lzc3VlMTBBbW91bnQJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFDmlzc3VlZDEwQW1vdW50BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQFDmlzc3VlZDEwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF3bGdJc3N1ZTEwVGltZUtleQkAkQMCBQhjdXJTdGF0cwUQaXhXbGdJc3N1ZTEwVGltZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdXNlcktleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdXNlcktleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBlAgkAkQMCBQhjdXJTdGF0cwUQaXhXbGdBbUxlZnRUb3RhbAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkJAGQCCQBlAgUOdGVhbUFtb3VudExlZnQFCnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBhY3RBbW91bnRMZWZ0S2V5CQBlAgUNYWN0QW1vdW50TGVmdAUJYWN0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgULdXNlclRpbWVLZXkFC3VzZXJFZmZUaW1lBQNuaWwFDHRlYW1UcmFuc2ZlcgULYWN0VHJhbnNmZXIFEW1hcmtldGluZ1RyYW5zZmVyBQl1c2VyVG90YWwBDnRha2VYcEludGVybmFsAgRhZGRyBWRlbHRhBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEWa2V5V2xnU3Rha2VkVGltZUJ5VXNlcgEFBGFkZHIECWFtb3VudEtleQkBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFB3RpbWVLZXkAAAQHb2xkVXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURd2xnU3Rha2VkVG90YWxLZXkAAAQCeHAJAGsDCQBrAwUFeHBXbGcFB29sZFVzZXIFD3dsZ0Jhc2VBbW91bnRYcAkAZQIFCGxhc3RUaW1lBQNub3cFCURBWU1JTExJUwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQkAZAIFB29sZFVzZXIFBWRlbHRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF3bGdTdGFrZWRUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQVkZWx0YQUDbmlsBQJ4cAUHb2xkVXNlcgERb3BlbkNoZXN0SW50ZXJuYWwBBGFkZHIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAhkcmF3V2VlawkAZQIFBHdlZWsAAQQJbnVtUHJpemVzCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlQyRHJhdwEFCGRyYXdXZWVrBRVERUZBVUxUX1dFRUtMWV9QUklaRVMEC3ByaXplc0RyYXduCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrAAAEC3VzZXJUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawAAAwkAZwIAAAULdXNlclRpY2tldHMJAJQKAgUDbmlsBQR1bml0BAt3ZWVrVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFCGRyYXdXZWVrAAADCQBnAgAABQt3ZWVrVGlja2V0cwkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawUDbmlsBQR1bml0BAdlbnRyb3B5CQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBCQBoAgUEd2VlawULV0VFS19CTE9DS1MDdnJmBARzYWx0CQDZBAEJAJEDAgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyAgo0Ml9ERUZBVUxUAgFfAAEEBnJhbmRvbQkBD2dldFJhbmRvbU51bWJlcgMFC3dlZWtUaWNrZXRzBQRzYWx0BQdlbnRyb3B5AwkAZgIJAGgCBQt1c2VyVGlja2V0cwUJbnVtUHJpemVzBQZyYW5kb20EC2lzc3VlUmVzdWx0CQD8BwQFDmFjcmVzMkNvbnRyYWN0Aghpc3N1ZU5GVAkAzAgCBQRhZGRyCQDMCAIFFElkeER0eDFQZXJjR2VtV2lubmVyBQNuaWwFA25pbAQHd2lubmVycwkAoggBCQEOa2V5V2Vla1dpbm5lcnMBBQhkcmF3V2VlawQKbmV3V2lubmVycwMJAQlpc0RlZmluZWQBBQd3aW5uZXJzCQCsAgIJAKwCAgkBBXZhbHVlAQUHd2lubmVycwIBXwUEYWRkcgUEYWRkcgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5TnVtTkZURHJhd24BBQhkcmF3V2VlawkAZAIFC3ByaXplc0RyYXduAAEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlXZWVrV2lubmVycwEFCGRyYXdXZWVrBQpuZXdXaW5uZXJzBQNuaWwFC2lzc3VlUmVzdWx0BAdyYW5kb20xCQBkAgkBD2dldFJhbmRvbU51bWJlcgMACQkAywECAQFCBQRzYWx0BQdlbnRyb3B5AAEEC2NvbnNUaWNrZXRzCQBrAwULdXNlclRpY2tldHMFB3JhbmRvbTEACgkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFBHdlZWsFC2NvbnNUaWNrZXRzBQNuaWwFC2NvbnNUaWNrZXRzARRjbGFpbVRpY2tldHNJbnRlcm5hbAIEYWRkcgp1c2VyQmV0U3RyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQKdGlja2V0c0tleQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFBHdlZWsEBmRheUJldAkAtQkCBQp1c2VyQmV0U3RyAgFfBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABAxkZWx0YVRpY2tldHMDCQAAAgkBCndpbm5pbmdCZXQBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZkYXlCZXQAAQABAAAED29sZFBhcnRpY2lwYW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQUEd2VlawAABBJ1cGRhdGVQYXJ0aWNpcGFudHMDAwkAAAIFCm9sZFRpY2tldHMAAAkAAAIFDGRlbHRhVGlja2V0cwABBwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsJAGQCBQ9vbGRQYXJ0aWNpcGFudHMAAQUDbmlsBQNuaWwJAJQKAgMJAAACBQxkZWx0YVRpY2tldHMAAAUDbmlsCQDNCAIJAM0IAgUSdXBkYXRlUGFydGljaXBhbnRzCQEMSW50ZWdlckVudHJ5AgUKdGlja2V0c0tleQkAZAIFCm9sZFRpY2tldHMFDGRlbHRhVGlja2V0cwkBDEludGVnZXJFbnRyeQIJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawkAZAIFD29sZFRvdGFsVGlja2V0cwUMZGVsdGFUaWNrZXRzBQxkZWx0YVRpY2tldHMOAWkBDWNvbnN0cnVjdG9yVjEECHJlc3RBZGRyDW1hcmtldGluZ0FkZHIIdGVhbUFkZHIKcHJvZml0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAwkBCWlzRGVmaW5lZAEJAKEIAQUNd2xnQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQEDGlzc3VlZEFtb3VudAUITUlMTElPTjYEBWlzc3VlCQDDCAcCBldMR09MRAIgV2F2ZXNMYW5kcyBHb2xkIGludmVzdG1lbnQgdG9rZW4FDGlzc3VlZEFtb3VudAAIBgUEdW5pdAAABAdhc3NldElkCQC4CAEFBWlzc3VlCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ93bGdJc3N1ZVRpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkFDGlzc3VlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAawMFCE1JTExJT042BQtQTEFZRVJTSEFSRQUFTVVMVDYJAMwIAgkBC0JpbmFyeUVudHJ5AgUNd2xnQXNzZXRJZEtleQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRBtYXJrZXRpbmdBZGRyS2V5BQ1tYXJrZXRpbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC3RlYW1BZGRyS2V5BQh0ZWFtQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1wcm9maXRBZGRyS2V5BQpwcm9maXRBZGRyBQNuaWwBaQENY29uc3RydWN0b3JWMgEJcmVzdDJBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVJlc3QyQWRkcmVzcwAFCXJlc3QyQWRkcgUDbmlsAWkBBmJ1eVdsZwEMbWluVG9SZWNlaXZlBAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAd1c2R0QW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkBQd1c2R0QW10BAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAh3bGdQcmljZQkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQQIYnV5UHJpY2UJAG4EBQh3bGdQcmljZQAGAAUFB0NFSUxJTkcECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUEYWRkcgMJAGYCBQl3bGdBbW91bnQFBm1heFdsZwkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAhUgV0xHT0xEIGF0IHRoZSBtb21lbnQDCQBmAgUMbWluVG9SZWNlaXZlBQl3bGdBbW91bnQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUJd2xnQW1vdW50BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgUMY3VyV2xnQW1vdW50BQl3bGdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIJAGUCBQZtYXhXbGcFCXdsZ0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQl3bGdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmJ1eVdsZ1JFQURPTkxZAgdhZGRyZXNzB3VzZHRBbXQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQId2xnUHJpY2UJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UECGJ1eVByaWNlCQBuBAUId2xnUHJpY2UABgAFBQdDRUlMSU5HBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFB2FkZHJlc3MEB21heFVzZHQJAGsDBQZtYXhXbGcFCGJ1eVByaWNlBQVNVUxUOAQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAGCQCUCgIFA25pbAkAzAgCBQl3bGdBbW91bnQJAMwIAgUOTUlOU0hPUFBBWU1FTlQJAMwIAgUHbWF4VXNkdAkAzAgCBQxwcm9maXRBbW91bnQFA25pbAFpAQdzZWxsV2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUEYWRkcgMJAGYCBQZ3bGdBbXQFBm1heFdsZwkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHNwZW5kIG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCFSBXTEdPTEQgYXQgdGhlIG1vbWVudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGkCCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAIEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyCQBlAgUGbWF4V2xnBQZ3bGdBbXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUHdXNkdEFtdAULdXNkdEFzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3NlbGxXbGdSRUFET05MWQIHYWRkcmVzcwZ3bGdBbXQEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFB2FkZHJlc3MECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAlzZWxsUHJpY2UJAGkCCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAIEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgEBm1pbldsZwkAawMFDk1JTlNIT1BQQVlNRU5UBQVNVUxUOAUJc2VsbFByaWNlBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAUJAJQKAgUDbmlsCQDMCAIFB3VzZHRBbXQJAMwIAgUGbWluV2xnCQDMCAIFBm1heFdsZwkAzAgCBQxwcm9maXRBbW91bnQFA25pbAFpAQVjbGFpbQAEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEDSR0MDE0MDI3MTQwOTYJAQ5jbGFpbUludGVybmFsMgEJAKUIAQgFAWkGY2FsbGVyBAdhY3Rpb25zCAUNJHQwMTQwMjcxNDA5NgJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDE0MDI3MTQwOTYCXzIJAJQKAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEHdsZ0NsYWltZWRBbW91bnQFCndsZ0Fzc2V0SWQFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJvblN0YWtlVW5zdGFrZUxhbmQBBGFkZHIDAwMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQECIT0CCAUBaQZjYWxsZXIFDWFjcmVzQ29udHJhY3QHCQECIT0CCAUBaQZjYWxsZXIFDmFjcmVzMkNvbnRyYWN0BwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAxNDQxNTE0NDY5CQEOY2xhaW1JbnRlcm5hbDIBBQRhZGRyBAdhY3Rpb25zCAUNJHQwMTQ0MTUxNDQ2OQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDE0NDE1MTQ0NjkCXzIJAJQKAgMJAGYCBRB3bGdDbGFpbWVkQW1vdW50AAAJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUHYWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQpidXJuV2xnb2xkAQZ3bGdBbXQDCQECIT0CCAUBaQZjYWxsZXIFDmFjcmVzMkNvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAAAwkAZgIFBndsZ0FtdAkAkQMCBQhjdXJTdGF0cwUIaXhXbGdXbGcJAAIBCQCsAgIJAKwCAgkArAICAgVPbmx5IAkBCmZpeGVkUG9pbnQCCQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwAIAiUgV0xHT0xEIGxlZnQgb24gY29udHJhY3QsIGNhbid0IGJ1cm4gCQEKZml4ZWRQb2ludAIFBndsZ0FtdAAIBA13bGdBbW91bnRMZWZ0CQBlAgkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQFBndsZ0FtdAkAlAoCCQDMCAIJAQRCdXJuAgUKd2xnQXNzZXRJZAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkFDXdsZ0Ftb3VudExlZnQFA25pbAUNd2xnQW1vdW50TGVmdAFpAQxiZXRGb3JUaWNrZXQBA2JldAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAMJAQIhPQIJAGkCBQNiZXQABAAACQACAQIbSW52YWxpZCBiZXQ6IHNob3VsZCBiZSAwLi4zBAZtb21lbnQJAGoCBQZoZWlnaHQFCkRBWV9CTE9DS1MDCQBmAgUGbW9tZW50CQBlAgUKREFZX0JMT0NLUwADCQACAQkArAICCQCsAgICMUNhbm5vdCBiZXQ6IHRoZSBkYXkgaXMgYWxtb3N0IGVuZGVkLCBwbGVhc2Ugd2FpdCAJAKQDAQkAZQIFCkRBWV9CTE9DS1MFBm1vbWVudAIHIGJsb2NrcwQEYWRkcgkApQgBCAUBaQZjYWxsZXIEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQRhZGRyAAAEA2x2bAkBD2dldExldmVsQnlBY3JlcwEFC3N0YWtlZEFjcmVzAwkAAAIFA2x2bAAACQACAQIjWW91IG5lZWQgdG8gc3Rha2Ugc29tZSBBQ1JFUyB0byBiZXQECHRvbW9ycm93CQBkAgkAaQIFBmhlaWdodAUKREFZX0JMT0NLUwABBAZiZXRLZXkJAQprZXlVc2VyQmV0AQUEYWRkcgQNb2xkVXNlckJldFN0cgkAoggBBQZiZXRLZXkEC25ld0JldEVudHJ5CQELU3RyaW5nRW50cnkCBQZiZXRLZXkJAKwCAgkArAICCQCkAwEFCHRvbW9ycm93AgFfCQCkAwEFA2JldAMJAQlpc0RlZmluZWQBBQ1vbGRVc2VyQmV0U3RyBAd1c2VyQmV0CQEFdmFsdWUBBQ1vbGRVc2VyQmV0U3RyAwkAAAIJAJEDAgkAtQkCBQd1c2VyQmV0AgFfAAAJAKQDAQUIdG9tb3Jyb3cJAAIBAhxZb3UgYWxyZWFkeSBiZXQgZm9yIHRvbW9ycm93BAFyCQEUY2xhaW1UaWNrZXRzSW50ZXJuYWwCBQRhZGRyBQd1c2VyQmV0CQCUCgIJAM0IAggFAXICXzEFC25ld0JldEVudHJ5CAUBcgJfMgkAlAoCCQDMCAIFC25ld0JldEVudHJ5BQNuaWwAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQl0YWtlV2xnWHABBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAyMjM3OTIyNDIyCQEOdGFrZVhwSW50ZXJuYWwCBQRhZGRyAAAEB2FjdGlvbnMIBQ0kdDAyMjM3OTIyNDIyAl8xBAJ4cAgFDSR0MDIyMzc5MjI0MjICXzIJAJQKAgUHYWN0aW9ucwUCeHABaQESY2hlY2tXbGdYcFJFQURPTkxZAQRhZGRyBA0kdDAyMjQ5OTIyNTQ3CQEOdGFrZVhwSW50ZXJuYWwCBQRhZGRyAAAEB2lnbm9yZWQIBQ0kdDAyMjQ5OTIyNTQ3Al8xBAdkZWx0YVhQCAUNJHQwMjI0OTkyMjU0NwJfMgQFbmV3WFAJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBCWtleVVzZXJYUAEFBGFkZHIAAAUHZGVsdGFYUAQJbHZsUG9pbnRzCQEHbGV2ZWxVcAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5VXNlckxldmVsAQUEYWRkcgAABQVuZXdYUAkAlAoCBQNuaWwJAM0IAgUJbHZsUG9pbnRzBQVuZXdYUAFpAQxzZXROdW1Qcml6ZXMBCW51bVByaXplcwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5TnVtTkZUMkRyYXcBBQR3ZWVrBQludW1Qcml6ZXMFA25pbAUJbnVtUHJpemVzAWkBCW9wZW5DaGVzdAAEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQECGRyYXdXZWVrCQBlAgkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MAAQQEYWRkcgkApQgBCAUBaQZjYWxsZXIEC3VzZXJUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawAAAwkAZwIAAAULdXNlclRpY2tldHMJAAIBAhlObyBnZW1zIHRvIG9wZW4gdGhlIGNoZXN0CQERb3BlbkNoZXN0SW50ZXJuYWwBBQRhZGRyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAFS0Heg=", "height": 3382765, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6BRiCTFrPUknhj6MC2tkwWXD59wgFM7oSuhD1hAnY38A Next: BZGMAks3Tw8M2gq64Pee4atbDcJUiBTSVqRY6RcYozHt Diff:
OldNewDifferences
3939 let MULT8 = 100000000
4040
4141 let MINSHOPPAYMENT = 100000
42-
43-let ITER6 = [0, 1, 2, 3, 4, 5]
4442
4543 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4644
9492 case _ =>
9593 throw("fail to cast into Int")
9694 }
95+
96+
97+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
9798
9899
99100 func fixedPoint (val,decimals) = {
290291 func keyUserBet (addr) = ("userBet_" + addr)
291292
292293
293-func keyUserTickets (addr) = ("userTickets_" + addr)
294+func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
294295
295296
296-let keyTotalTickets = "totalTickets"
297+func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
297298
298-let keyDrawParticipants = "drawParticipants"
299299
300-let keyLastDrawWeek = "lastDrawWeek"
300+func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
301+
302+
303+let DEFAULT_WEEKLY_PRIZES = 1
304+
305+func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
306+
307+
308+func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
309+
310+
311+func keyWeekWinners (week) = ("weekWinners_" + toString(week))
312+
301313
302314 func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
303315
480492 }
481493
482494
495+func openChestInternal (addr) = {
496+ let week = (height / WEEK_BLOCKS)
497+ let drawWeek = (week - 1)
498+ let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
499+ let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
500+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
501+ if ((0 >= userTickets))
502+ then $Tuple2(nil, unit)
503+ else {
504+ let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
505+ if ((0 >= weekTickets))
506+ then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
507+ else {
508+ let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
509+ let salt = fromBase58String(split(valueOrElse(getString(keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
510+ let random = getRandomNumber(weekTickets, salt, entropy)
511+ if (((userTickets * numPrizes) > random))
512+ then {
513+ let issueResult = invoke(acres2Contract, "issueNFT", [addr, IdxDtx1PercGemWinner], nil)
514+ let winners = getString(keyWeekWinners(drawWeek))
515+ let newWinners = if (isDefined(winners))
516+ then ((value(winners) + "_") + addr)
517+ else addr
518+ $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
519+ }
520+ else {
521+ let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
522+ let consTickets = fraction(userTickets, random1, 10)
523+ $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek)), IntegerEntry(keyUserWeekTickets(addr, week), consTickets)], consTickets)
524+ }
525+ }
526+ }
527+ }
528+
529+
483530 func claimTicketsInternal (addr,userBetStr) = {
484- let ticketsKey = keyUserTickets(addr)
531+ let week = (height / WEEK_BLOCKS)
532+ let ticketsKey = keyUserWeekTickets(addr, week)
485533 let dayBet = split(userBetStr, "_")
486- let oldTotalTickets = valueOrElse(getInteger(keyTotalTickets), 0)
534+ let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
487535 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
488536 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
489537 then 1
490538 else 0
491- $Tuple3(if ((deltaTickets == 0))
539+ let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
540+ let updateParticipants = if (if ((oldTickets == 0))
541+ then (deltaTickets == 1)
542+ else false)
543+ then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
544+ else nil
545+ $Tuple2(if ((deltaTickets == 0))
492546 then nil
493- else [IntegerEntry(ticketsKey, (oldTickets + deltaTickets)), IntegerEntry(keyTotalTickets, (oldTotalTickets + deltaTickets))], DeleteEntry(keyUserBet(addr)), deltaTickets)
547+ else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
494548 }
495549
496550
628682 then if ((size(i.payments) != 0))
629683 then throw("No payments required")
630684 else {
631- let $t01206812137 = claimInternal2(toString(i.caller))
632- let actions = $t01206812137._1
633- let wlgClaimedAmount = $t01206812137._2
685+ let $t01402714096 = claimInternal2(toString(i.caller))
686+ let actions = $t01402714096._1
687+ let wlgClaimedAmount = $t01402714096._2
634688 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
635689 }
636690 else throw("Strict value is not equal to itself.")
646700 else false)
647701 then throw("Permission denied")
648702 else {
649- let $t01245612510 = claimInternal2(addr)
650- let actions = $t01245612510._1
651- let wlgClaimedAmount = $t01245612510._2
703+ let $t01441514469 = claimInternal2(addr)
704+ let actions = $t01441514469._1
705+ let wlgClaimedAmount = $t01441514469._2
652706 $Tuple2(if ((wlgClaimedAmount > 0))
653707 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
654708 else actions, wlgClaimedAmount)
714768
715769
716770 @Callable(i)
717-func claimTickets () = {
718- let prologResult = prolog2()
719- if ((prologResult == prologResult))
720- then if ((size(i.payments) != 0))
721- then throw("No payments required")
722- else {
723- let addr = toString(i.caller)
724- let userBetStr = valueOrErrorMessage(getString(keyUserBet(addr)), "You have no tickets to claim")
725- let r = claimTicketsInternal(addr, userBetStr)
726- $Tuple2((r._1 :+ r._2), r._3)
727- }
728- else throw("Strict value is not equal to itself.")
729- }
730-
731-
732-
733-@Callable(i)
734771 func takeWlgXp (addr) = if ((i.caller != stakingContract))
735772 then throw("Permission denied")
736773 else {
737- let $t02052820571 = takeXpInternal(addr, 0)
738- let actions = $t02052820571._1
739- let xp = $t02052820571._2
774+ let $t02237922422 = takeXpInternal(addr, 0)
775+ let actions = $t02237922422._1
776+ let xp = $t02237922422._2
740777 $Tuple2(actions, xp)
741778 }
742779
744781
745782 @Callable(i)
746783 func checkWlgXpREADONLY (addr) = {
747- let $t02064820696 = takeXpInternal(addr, 0)
748- let ignored = $t02064820696._1
749- let deltaXP = $t02064820696._2
784+ let $t02249922547 = takeXpInternal(addr, 0)
785+ let ignored = $t02249922547._1
786+ let deltaXP = $t02249922547._2
750787 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
751788 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
752789 $Tuple2(nil, (lvlPoints :+ newXP))
755792
756793
757794 @Callable(i)
758-func weeklyDraw (numPrizes) = if ((i.caller != this))
795+func setNumPrizes (numPrizes) = if ((i.caller != this))
759796 then throw("Permission denied")
760797 else {
761798 let week = (height / WEEK_BLOCKS)
762- let lastDrawWeek = valueOrElse(getInteger(keyLastDrawWeek), 0)
763- if ((week == lastDrawWeek))
764- then $Tuple2(nil, 0)
799+ $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
800+ }
801+
802+
803+
804+@Callable(i)
805+func openChest () = {
806+ let prologResult = prolog2()
807+ if ((prologResult == prologResult))
808+ then if ((size(i.payments) != 0))
809+ then throw("No payments required")
765810 else {
766- let maxValue = valueOrElse(getInteger(keyTotalTickets), 0)
767- if ((maxValue == 0))
768- then $Tuple2(nil, 0)
769- else {
770- let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
771- let salt = base58'29'
772- let drawParticipants = valueOrElse(getString(keyDrawParticipants), "")
773- func singleDraw (ac,j) = if ((j >= numPrizes))
774- then ac
775- else {
776- let rand = getRandomNumber(ac._1, ac._2, entropy)
777- let drawList = if ((ac._3 == ""))
778- then nil
779- else split_51C(ac._3, "_")
780- func countTickets (acc,el) = {
781- let parts = split(el, ":")
782- let numTickets = parseIntValue(parts[1])
783- let newTotal = (acc._1 + numTickets)
784- if (if ((acc._3 == ""))
785- then (newTotal > rand)
786- else false)
787- then $Tuple3(newTotal, numTickets, parts[0])
788- else $Tuple3(newTotal, acc._2, acc._3)
789- }
790-
791- let r = {
792- let $l = drawList
793- let $s = size($l)
794- let $acc0 = $Tuple3(0, 0, "")
795- func $f0_1 ($a,$i) = if (($i >= $s))
796- then $a
797- else countTickets($a, $l[$i])
798-
799- func $f0_2 ($a,$i) = if (($i >= $s))
800- then $a
801- else throw("List size exceeds 200")
802-
803- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
804- }
805- let winner = r._3
806- if ((winner == ""))
807- then ac
808- else {
809- let mapParts = split_51C(ac._3, winner)
810- let newMap = if ((mapParts[0] == ""))
811- then drop(mapParts[1], 4)
812- else (dropRight(mapParts[0], 1) + drop(mapParts[1], 3))
813- let issueResult = invoke(acres2Contract, "issueNFT", [winner, IdxDtx1PercGemWinner], nil)
814- let newSalt = (ac._2 + base58'29')
815- $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ $Tuple2(winner, issueResult)))
816- }
817- }
818-
819- let draws = {
820- let $l = ITER6
821- let $s = size($l)
822- let $acc0 = $Tuple4(maxValue, salt, drawParticipants, nil)
823- func $f0_1 ($a,$i) = if (($i >= $s))
824- then $a
825- else singleDraw($a, $l[$i])
826-
827- func $f0_2 ($a,$i) = if (($i >= $s))
828- then $a
829- else throw("List size exceeds 6")
830-
831- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
832- }
833- $Tuple2([StringEntry(keyDrawParticipants, ""), IntegerEntry(keyTotalTickets, 0)], draws._4)
834- }
811+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
812+ let addr = toString(i.caller)
813+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
814+ if ((0 >= userTickets))
815+ then throw("No gems to open the chest")
816+ else openChestInternal(addr)
835817 }
836- }
818+ else throw("Strict value is not equal to itself.")
819+ }
837820
838821
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DAY_MILLIS = 86400000
55
66 let chain = take(drop(this.bytes, 1), 1)
77
88 let usdtAssetId = match chain {
99 case _ =>
1010 if ((base58'2W' == $match0))
1111 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1212 else if ((base58'2T' == $match0))
1313 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
1414 else throw("Unknown chain")
1515 }
1616
1717 let defaultRestAddressStr = match chain {
1818 case _ =>
1919 if ((base58'2W' == $match0))
2020 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2121 else if ((base58'2T' == $match0))
2222 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2323 else throw("Unknown chain")
2424 }
2525
2626 let acres2AddressStr = match chain {
2727 case _ =>
2828 if ((base58'2W' == $match0))
2929 then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
3030 else if ((base58'2T' == $match0))
3131 then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
3232 else throw("Unknown chain")
3333 }
3434
3535 let SEP = "__"
3636
3737 let MULT6 = 1000000
3838
3939 let MULT8 = 100000000
4040
4141 let MINSHOPPAYMENT = 100000
42-
43-let ITER6 = [0, 1, 2, 3, 4, 5]
4442
4543 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4644
4745
4846 let IdxCfgStakingDapp = 1
4947
5048 let IdxCfgWlgDapp = 4
5149
5250 let IdxCfgPuzzlePoolDapp = 5
5351
5452 let IdxCfgInvestFundDapp = 6
5553
5654 let IdxCfgAcresDapp = 8
5755
5856 func keyRestCfg () = "%s__restConfig"
5957
6058
6159 func keyRestAddress () = "%s__restAddr"
6260
6361
6462 func keyRest2Address () = "%s__rest2Addr"
6563
6664
6765 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
6866
6967
7068 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7169
7270
7371 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
7472
7573 let restCfg = readRestCfgOrFail(restContract)
7674
7775 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
7876
7977 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8078
8179 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
8280
8381 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
8482
8583 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
8684
8785 let wlgAssetIdKey = "wlg_assetId"
8886
8987 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
9088
9189 func asInt (v) = match v {
9290 case n: Int =>
9391 n
9492 case _ =>
9593 throw("fail to cast into Int")
9694 }
95+
96+
97+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
9798
9899
99100 func fixedPoint (val,decimals) = {
100101 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
101102 let lowPart = toString((val % tenPow))
102103 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
103104 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
104105 }
105106
106107
107108 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
108109 then throw("maxValue should be > 0")
109110 else {
110111 let randomHash = sha256_16Kb((salt + entropy))
111112 (toInt(randomHash) % maxValue)
112113 }
113114
114115
115116 let SCALE8 = 100000000
116117
117118 let xpLevelScale = 3200
118119
119120 let xpLevelRecipPow = 4000
120121
121122 let numPointsOnLevelUp = 3
122123
123124 let wlgBaseAmountXp = 100000000000
124125
125126 func keyUserXP (addr) = ("userXP_" + addr)
126127
127128
128129 func keyUserLevel (addr) = ("userLevel_" + addr)
129130
130131
131132 let xpWlg = 10000
132133
133134 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
134135
135136
136137 func levelUp (currLevel,newXP) = {
137138 let newLevel = levelByXP(newXP)
138139 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
139140 }
140141
141142
142143 let MILLION6 = 100000000000000
143144
144145 let PLAYERSHARE = 400000
145146
146147 let DAYMILLIS = 86400000
147148
148149 let teamAddrKey = "teamAddr"
149150
150151 let lastTeamTimeKey = "lastClaimedTime_team"
151152
152153 let teamAmountLeftKey = "teamAmountLeft"
153154
154155 let lastActivitiesTimeKey = "lastClaimedTime_activities"
155156
156157 let actAmountLeftKey = "activitiesAmountLeft"
157158
158159 let stakersAmountLeftKey = "stakersAmountLeft"
159160
160161 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
161162
162163
163164 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
164165
165166
166167 let wlgIssueTimeKey = "wlg_issueTime"
167168
168169 let wlgIssuedAmountKey = "wlg_issuedAmount"
169170
170171 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
171172
172173
173174 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
174175
175176
176177 let wlgStakedTotalKey = "wlgStakedAmountTotal"
177178
178179 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
179180
180181
181182 let M6_ = 1000000
182183
183184 let M8_ = 100000000
184185
185186 let TEAM_SHARE = 200000
186187
187188 let ACTIVITY_SHARE = 100000
188189
189190 let PLAYER_SHARE = 400000
190191
191192 let YEAR_MILLIS = 31557600000
192193
193194 let DAY_MS = 86400000
194195
195196 let DAY_BLOCKS = 1440
196197
197198 let WEEK_BLOCKS = 10080
198199
199200 let ISSUE10 = 1000000000
200201
201202 let PLAYERS10_SHARE = 800000
202203
203204 let MARKETING10_SHARE = 100000
204205
205206 let TEAM10_SHARE = 100000
206207
207208 let NEW_STAKING_START = 1731279600000
208209
209210 let marketingAddrKey = "marketingAddr"
210211
211212 let teamAdrKey = "teamAddr"
212213
213214 let lastTeamTimKey = "lastClaimedTime_team"
214215
215216 let teamAmtLeftKey = "teamAmountLeft"
216217
217218 let lastActivitiesTimKey = "lastClaimedTime_activities"
218219
219220 let actAmtLeftKey = "activitiesAmountLeft"
220221
221222 let stakersAmtLeftKey = "stakersAmountLeft"
222223
223224 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
224225
225226
226227 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
227228
228229
229230 let wlgIssue10TimeKey = "wlg_issue10Time"
230231
231232 let wlgIssueTimKey = "wlg_issueTime"
232233
233234 let wlgIssuedAmtKey = "wlg_issuedAmount"
234235
235236 let zbIssuedAmtKey = "zbill_issuedAmount"
236237
237238 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
238239
239240
240241 let acresStakdTotalKey = "acresStakedAmountTotal"
241242
242243 let totalFarmingPowerKey = "totalFarmingPower"
243244
244245 let dapp2Rest = 0
245246
246247 let dapp2Staking = 1
247248
248249 let dapp2Wlg = 2
249250
250251 let dapp2Puzzle = 3
251252
252253 let dapp2InvestFund = 4
253254
254255 let IdxDtx1PercGemWinner = 1
255256
256257 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
257258
258259 func getLevelByAcres (acres) = {
259260 let acr = ((acres + 99999999) / M8_)
260261 func checker (acc,item) = if ((item >= acr))
261262 then acc
262263 else (acc + 1)
263264
264265 let $l = levelAcres
265266 let $s = size($l)
266267 let $acc0 = 0
267268 func $f0_1 ($a,$i) = if (($i >= $s))
268269 then $a
269270 else checker($a, $l[$i])
270271
271272 func $f0_2 ($a,$i) = if (($i >= $s))
272273 then $a
273274 else throw("List size exceeds 10")
274275
275276 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
276277 }
277278
278279
279280 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
280281
281282
282283 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
283284 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
284285 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
285286 let userFP = getFarmingPowerByAcres(userAcres)
286287 [totalFP, userFP]
287288 }
288289
289290
290291 func keyUserBet (addr) = ("userBet_" + addr)
291292
292293
293-func keyUserTickets (addr) = ("userTickets_" + addr)
294+func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
294295
295296
296-let keyTotalTickets = "totalTickets"
297+func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
297298
298-let keyDrawParticipants = "drawParticipants"
299299
300-let keyLastDrawWeek = "lastDrawWeek"
300+func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
301+
302+
303+let DEFAULT_WEEKLY_PRIZES = 1
304+
305+func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
306+
307+
308+func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
309+
310+
311+func keyWeekWinners (week) = ("weekWinners_" + toString(week))
312+
301313
302314 func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
303315
304316
305317 let idxTotalFP = 0
306318
307319 let idxUserFP = 1
308320
309321 let ixWlgAmount = 0
310322
311323 let ixWlgWlg = 1
312324
313325 let ixWlgPrice = 2
314326
315327 let ixWlgIssueTime = 8
316328
317329 let ixWlgTeamAmLeft = 11
318330
319331 let ixWlgTeamAmAvailNow = 12
320332
321333 let ixWlgActAmLeft = 15
322334
323335 let ixWlgActAmAvailNow = 16
324336
325337 let ixWlgAmLeftTotal = 19
326338
327339 let ixWlgUserAmAvailNow = 23
328340
329341 let ixWlgEffUserTime = 24
330342
331343 let ixWlgIssue10Amount = 25
332344
333345 let ixWlgMarketingIssue10Amount = 26
334346
335347 let ixWlgTeamIssue10Amount = 27
336348
337349 let ixWlgUser10part = 28
338350
339351 let ixWlgIssue10Time = 29
340352
341353 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
342354 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
343355 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
344356 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
345357 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
346358 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
347359 let investFndContract = contracts[dapp2InvestFund]
348360 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
349361 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
350362 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
351363 let now = lastBlock.timestamp
352364 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
353365 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
354366 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
355367 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
356368 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
357369 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
358370 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
359371 let teamWlgold = assetBalance(teamAddr, wlgId)
360372 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
361373 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
362374 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
363375 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
364376 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
365377 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
366378 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
367379 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
368380 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
369381 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
370382 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
371383 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
372384 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
373385 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
374386 let userAvailable = if ((lastUserPeriod == curPeriod))
375387 then a0
376388 else if ((lastUserPeriod == (curPeriod - 1)))
377389 then {
378390 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
379391 (a1 + a0)
380392 }
381393 else {
382394 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
383395 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
384396 ((a2 + a1) + a0)
385397 }
386398 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
387399 let userAmount = if ((eff[idxTotalFP] != 0))
388400 then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
389401 else 0
390402 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
391403 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
392404 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
393405 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
394406 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
395407 let user10part = if ((eff[idxTotalFP] != 0))
396408 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFP], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
397409 else 0
398410 let newIssue10Time = max([NEW_STAKING_START, now])
399411 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
400412 [issuedAmount, wlgWlg, fraction(totalFundsUsd, M8_, issuedAmount), totalFundsUsd, restUsd, acres2Usd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, userAmount, nowLimited, issue10Amount, marketingIssue10Amount, teamIssue10Amount, user10part, newIssue10Time, eff[idxTotalFP], acresStakedTotal]
401413 }
402414
403415
404416 let net = take(drop(this.bytes, 1), 1)
405417
406418 let defaultRest2AddressStr = match net {
407419 case _ =>
408420 if ((base58'2W' == $match0))
409421 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
410422 else if ((base58'2T' == $match0))
411423 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
412424 else throw("Unknown chain")
413425 }
414426
415427 let profitAddrKey = "profitAddr"
416428
417429 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
418430
419431 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
420432
421433
422434 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
423435
424436 let acres2Contract = addressFromStringValue(acres2AddressStr)
425437
426438 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
427439
428440
429441 func getSwapLimitWlgold (addr) = {
430442 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
431443 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
432444 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
433445 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
434446 min([currentLimit, defaultLimit])
435447 }
436448
437449
438450 func claimInternal2 (addr) = {
439451 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
440452 let userTimeKey = keyLastClaimTimeByUser(addr)
441453 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
442454 let userEffTime = curStats[ixWlgEffUserTime]
443455 if ((lastUserTime == userEffTime))
444456 then $Tuple2(nil, 0)
445457 else {
446458 let now = lastBlock.timestamp
447459 let issueTime = curStats[ixWlgIssueTime]
448460 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
449461 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
450462 let teamTransfer = if ((teamAmount > 0))
451463 then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
452464 else nil
453465 let actAmountLeft = curStats[ixWlgActAmLeft]
454466 let actAmount = curStats[ixWlgActAmAvailNow]
455467 let actTransfer = if ((actAmount > 0))
456468 then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
457469 else nil
458470 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
459471 let marketingTransfer = if ((marketingAmount > 0))
460472 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
461473 else nil
462474 let userAmount = curStats[ixWlgUserAmAvailNow]
463475 let userKey = keyStakersAmountPaidUser(addr)
464476 let userTotal = (userAmount + curStats[ixWlgUser10part])
465477 let issued10Amount = curStats[ixWlgIssue10Amount]
466478 $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, userEffTime)] ++ teamTransfer) ++ actTransfer) ++ marketingTransfer), userTotal)
467479 }
468480 }
469481
470482
471483 func takeXpInternal (addr,delta) = {
472484 let now = lastBlock.timestamp
473485 let timeKey = keyWlgStakedTimeByUser(addr)
474486 let amountKey = keyWlgStakedAmountByUser(addr)
475487 let lastTime = valueOrElse(getInteger(timeKey), 0)
476488 let oldUser = valueOrElse(getInteger(amountKey), 0)
477489 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
478490 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
479491 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
480492 }
481493
482494
495+func openChestInternal (addr) = {
496+ let week = (height / WEEK_BLOCKS)
497+ let drawWeek = (week - 1)
498+ let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
499+ let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
500+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
501+ if ((0 >= userTickets))
502+ then $Tuple2(nil, unit)
503+ else {
504+ let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
505+ if ((0 >= weekTickets))
506+ then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
507+ else {
508+ let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
509+ let salt = fromBase58String(split(valueOrElse(getString(keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
510+ let random = getRandomNumber(weekTickets, salt, entropy)
511+ if (((userTickets * numPrizes) > random))
512+ then {
513+ let issueResult = invoke(acres2Contract, "issueNFT", [addr, IdxDtx1PercGemWinner], nil)
514+ let winners = getString(keyWeekWinners(drawWeek))
515+ let newWinners = if (isDefined(winners))
516+ then ((value(winners) + "_") + addr)
517+ else addr
518+ $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
519+ }
520+ else {
521+ let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
522+ let consTickets = fraction(userTickets, random1, 10)
523+ $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek)), IntegerEntry(keyUserWeekTickets(addr, week), consTickets)], consTickets)
524+ }
525+ }
526+ }
527+ }
528+
529+
483530 func claimTicketsInternal (addr,userBetStr) = {
484- let ticketsKey = keyUserTickets(addr)
531+ let week = (height / WEEK_BLOCKS)
532+ let ticketsKey = keyUserWeekTickets(addr, week)
485533 let dayBet = split(userBetStr, "_")
486- let oldTotalTickets = valueOrElse(getInteger(keyTotalTickets), 0)
534+ let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
487535 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
488536 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
489537 then 1
490538 else 0
491- $Tuple3(if ((deltaTickets == 0))
539+ let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
540+ let updateParticipants = if (if ((oldTickets == 0))
541+ then (deltaTickets == 1)
542+ else false)
543+ then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
544+ else nil
545+ $Tuple2(if ((deltaTickets == 0))
492546 then nil
493- else [IntegerEntry(ticketsKey, (oldTickets + deltaTickets)), IntegerEntry(keyTotalTickets, (oldTotalTickets + deltaTickets))], DeleteEntry(keyUserBet(addr)), deltaTickets)
547+ else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
494548 }
495549
496550
497551 @Callable(i)
498552 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
499553 then throw("Permission denied")
500554 else if (isDefined(getBinary(wlgAssetIdKey)))
501555 then throw("Already initialized")
502556 else {
503557 let issuedAmount = MILLION6
504558 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
505559 let assetId = calculateAssetId(issue)
506560 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
507561 }
508562
509563
510564
511565 @Callable(i)
512566 func constructorV2 (rest2Addr) = if ((i.caller != this))
513567 then throw("Permission denied")
514568 else [StringEntry(keyRest2Address(), rest2Addr)]
515569
516570
517571
518572 @Callable(i)
519573 func buyWlg (minToReceive) = {
520574 let prologResult = prolog2()
521575 if ((prologResult == prologResult))
522576 then if ((size(i.payments) != 1))
523577 then throw("exactly 1 payment must be attached")
524578 else {
525579 let pmt = i.payments[0]
526580 let usdtAmt = pmt.amount
527581 if (if (!(isDefined(pmt.assetId)))
528582 then true
529583 else (value(pmt.assetId) != usdtAssetId))
530584 then throw("USDT payments only!")
531585 else {
532586 let caller = i.caller
533587 let addr = toString(caller)
534588 if ((MINSHOPPAYMENT > usdtAmt))
535589 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
536590 else {
537591 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
538592 let curWlgAmount = curStats[ixWlgAmount]
539593 let wlgPrice = curStats[ixWlgPrice]
540594 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
541595 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
542596 let maxWlg = getSwapLimitWlgold(addr)
543597 if ((wlgAmount > maxWlg))
544598 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
545599 else if ((minToReceive > wlgAmount))
546600 then throw("Price changed during operation, please try again")
547601 else {
548602 let profitAmount = (usdtAmt / 6)
549603 $Tuple2([Reissue(wlgAssetId, wlgAmount, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + wlgAmount)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmount)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
550604 }
551605 }
552606 }
553607 }
554608 else throw("Strict value is not equal to itself.")
555609 }
556610
557611
558612
559613 @Callable(i)
560614 func buyWlgREADONLY (address,usdtAmt) = {
561615 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
562616 let wlgPrice = curStats[ixWlgPrice]
563617 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
564618 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
565619 let maxWlg = getSwapLimitWlgold(address)
566620 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
567621 let profitAmount = (usdtAmt / 6)
568622 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
569623 }
570624
571625
572626
573627 @Callable(i)
574628 func sellWlg (minAmount) = {
575629 let prologResult = prolog2()
576630 if ((prologResult == prologResult))
577631 then if ((size(i.payments) != 1))
578632 then throw("exactly 1 payment must be attached")
579633 else {
580634 let pmt = i.payments[0]
581635 let wlgAmt = pmt.amount
582636 let caller = i.caller
583637 let addr = toString(caller)
584638 let maxWlg = getSwapLimitWlgold(addr)
585639 if ((wlgAmt > maxWlg))
586640 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
587641 else if (if (!(isDefined(pmt.assetId)))
588642 then true
589643 else (value(pmt.assetId) != wlgAssetId))
590644 then throw("WLGOLD payments only!")
591645 else {
592646 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
593647 let curWlgAmount = curStats[ixWlgAmount]
594648 let sellPrice = (curStats[ixWlgPrice] / 2)
595649 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
596650 if ((MINSHOPPAYMENT > usdtAmt))
597651 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
598652 else if ((minAmount > usdtAmt))
599653 then throw("Price changed during operation, please try again")
600654 else {
601655 let profitAmount = (usdtAmt / 5)
602656 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmt)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
603657 }
604658 }
605659 }
606660 else throw("Strict value is not equal to itself.")
607661 }
608662
609663
610664
611665 @Callable(i)
612666 func sellWlgREADONLY (address,wlgAmt) = {
613667 let maxWlg = getSwapLimitWlgold(address)
614668 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
615669 let sellPrice = (curStats[ixWlgPrice] / 2)
616670 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
617671 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
618672 let profitAmount = (usdtAmt / 5)
619673 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
620674 }
621675
622676
623677
624678 @Callable(i)
625679 func claim () = {
626680 let prologResult = prolog2()
627681 if ((prologResult == prologResult))
628682 then if ((size(i.payments) != 0))
629683 then throw("No payments required")
630684 else {
631- let $t01206812137 = claimInternal2(toString(i.caller))
632- let actions = $t01206812137._1
633- let wlgClaimedAmount = $t01206812137._2
685+ let $t01402714096 = claimInternal2(toString(i.caller))
686+ let actions = $t01402714096._1
687+ let wlgClaimedAmount = $t01402714096._2
634688 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
635689 }
636690 else throw("Strict value is not equal to itself.")
637691 }
638692
639693
640694
641695 @Callable(i)
642696 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
643697 then (i.caller != acresContract)
644698 else false)
645699 then (i.caller != acres2Contract)
646700 else false)
647701 then throw("Permission denied")
648702 else {
649- let $t01245612510 = claimInternal2(addr)
650- let actions = $t01245612510._1
651- let wlgClaimedAmount = $t01245612510._2
703+ let $t01441514469 = claimInternal2(addr)
704+ let actions = $t01441514469._1
705+ let wlgClaimedAmount = $t01441514469._2
652706 $Tuple2(if ((wlgClaimedAmount > 0))
653707 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
654708 else actions, wlgClaimedAmount)
655709 }
656710
657711
658712
659713 @Callable(i)
660714 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
661715 then throw("Permission denied")
662716 else {
663717 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
664718 if ((wlgAmt > curStats[ixWlgWlg]))
665719 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
666720 else {
667721 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
668722 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
669723 }
670724 }
671725
672726
673727
674728 @Callable(i)
675729 func betForTicket (bet) = {
676730 let prologResult = prolog2()
677731 if ((prologResult == prologResult))
678732 then if ((size(i.payments) != 0))
679733 then throw("No payments required")
680734 else if (((bet / 4) != 0))
681735 then throw("Invalid bet: should be 0..3")
682736 else {
683737 let moment = (height % DAY_BLOCKS)
684738 if ((moment > (DAY_BLOCKS - 3)))
685739 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
686740 else {
687741 let addr = toString(i.caller)
688742 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
689743 let lvl = getLevelByAcres(stakedAcres)
690744 if ((lvl == 0))
691745 then throw("You need to stake some ACRES to bet")
692746 else {
693747 let tomorrow = ((height / DAY_BLOCKS) + 1)
694748 let betKey = keyUserBet(addr)
695749 let oldUserBetStr = getString(betKey)
696750 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
697751 if (isDefined(oldUserBetStr))
698752 then {
699753 let userBet = value(oldUserBetStr)
700754 if ((split(userBet, "_")[0] == toString(tomorrow)))
701755 then throw("You already bet for tomorrow")
702756 else {
703757 let r = claimTicketsInternal(addr, userBet)
704758 $Tuple2((r._1 :+ newBetEntry), r._2)
705759 }
706760 }
707761 else $Tuple2([newBetEntry], 0)
708762 }
709763 }
710764 }
711765 else throw("Strict value is not equal to itself.")
712766 }
713767
714768
715769
716770 @Callable(i)
717-func claimTickets () = {
718- let prologResult = prolog2()
719- if ((prologResult == prologResult))
720- then if ((size(i.payments) != 0))
721- then throw("No payments required")
722- else {
723- let addr = toString(i.caller)
724- let userBetStr = valueOrErrorMessage(getString(keyUserBet(addr)), "You have no tickets to claim")
725- let r = claimTicketsInternal(addr, userBetStr)
726- $Tuple2((r._1 :+ r._2), r._3)
727- }
728- else throw("Strict value is not equal to itself.")
729- }
730-
731-
732-
733-@Callable(i)
734771 func takeWlgXp (addr) = if ((i.caller != stakingContract))
735772 then throw("Permission denied")
736773 else {
737- let $t02052820571 = takeXpInternal(addr, 0)
738- let actions = $t02052820571._1
739- let xp = $t02052820571._2
774+ let $t02237922422 = takeXpInternal(addr, 0)
775+ let actions = $t02237922422._1
776+ let xp = $t02237922422._2
740777 $Tuple2(actions, xp)
741778 }
742779
743780
744781
745782 @Callable(i)
746783 func checkWlgXpREADONLY (addr) = {
747- let $t02064820696 = takeXpInternal(addr, 0)
748- let ignored = $t02064820696._1
749- let deltaXP = $t02064820696._2
784+ let $t02249922547 = takeXpInternal(addr, 0)
785+ let ignored = $t02249922547._1
786+ let deltaXP = $t02249922547._2
750787 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
751788 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
752789 $Tuple2(nil, (lvlPoints :+ newXP))
753790 }
754791
755792
756793
757794 @Callable(i)
758-func weeklyDraw (numPrizes) = if ((i.caller != this))
795+func setNumPrizes (numPrizes) = if ((i.caller != this))
759796 then throw("Permission denied")
760797 else {
761798 let week = (height / WEEK_BLOCKS)
762- let lastDrawWeek = valueOrElse(getInteger(keyLastDrawWeek), 0)
763- if ((week == lastDrawWeek))
764- then $Tuple2(nil, 0)
799+ $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
800+ }
801+
802+
803+
804+@Callable(i)
805+func openChest () = {
806+ let prologResult = prolog2()
807+ if ((prologResult == prologResult))
808+ then if ((size(i.payments) != 0))
809+ then throw("No payments required")
765810 else {
766- let maxValue = valueOrElse(getInteger(keyTotalTickets), 0)
767- if ((maxValue == 0))
768- then $Tuple2(nil, 0)
769- else {
770- let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
771- let salt = base58'29'
772- let drawParticipants = valueOrElse(getString(keyDrawParticipants), "")
773- func singleDraw (ac,j) = if ((j >= numPrizes))
774- then ac
775- else {
776- let rand = getRandomNumber(ac._1, ac._2, entropy)
777- let drawList = if ((ac._3 == ""))
778- then nil
779- else split_51C(ac._3, "_")
780- func countTickets (acc,el) = {
781- let parts = split(el, ":")
782- let numTickets = parseIntValue(parts[1])
783- let newTotal = (acc._1 + numTickets)
784- if (if ((acc._3 == ""))
785- then (newTotal > rand)
786- else false)
787- then $Tuple3(newTotal, numTickets, parts[0])
788- else $Tuple3(newTotal, acc._2, acc._3)
789- }
790-
791- let r = {
792- let $l = drawList
793- let $s = size($l)
794- let $acc0 = $Tuple3(0, 0, "")
795- func $f0_1 ($a,$i) = if (($i >= $s))
796- then $a
797- else countTickets($a, $l[$i])
798-
799- func $f0_2 ($a,$i) = if (($i >= $s))
800- then $a
801- else throw("List size exceeds 200")
802-
803- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
804- }
805- let winner = r._3
806- if ((winner == ""))
807- then ac
808- else {
809- let mapParts = split_51C(ac._3, winner)
810- let newMap = if ((mapParts[0] == ""))
811- then drop(mapParts[1], 4)
812- else (dropRight(mapParts[0], 1) + drop(mapParts[1], 3))
813- let issueResult = invoke(acres2Contract, "issueNFT", [winner, IdxDtx1PercGemWinner], nil)
814- let newSalt = (ac._2 + base58'29')
815- $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ $Tuple2(winner, issueResult)))
816- }
817- }
818-
819- let draws = {
820- let $l = ITER6
821- let $s = size($l)
822- let $acc0 = $Tuple4(maxValue, salt, drawParticipants, nil)
823- func $f0_1 ($a,$i) = if (($i >= $s))
824- then $a
825- else singleDraw($a, $l[$i])
826-
827- func $f0_2 ($a,$i) = if (($i >= $s))
828- then $a
829- else throw("List size exceeds 6")
830-
831- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
832- }
833- $Tuple2([StringEntry(keyDrawParticipants, ""), IntegerEntry(keyTotalTickets, 0)], draws._4)
834- }
811+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
812+ let addr = toString(i.caller)
813+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
814+ if ((0 >= userTickets))
815+ then throw("No gems to open the chest")
816+ else openChestInternal(addr)
835817 }
836- }
818+ else throw("Strict value is not equal to itself.")
819+ }
837820
838821

github/deemru/w8io/169f3d6 
100.95 ms