tx · BZGMAks3Tw8M2gq64Pee4atbDcJUiBTSVqRY6RcYozHt

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.02600000 Waves

2024.11.25 15:14 [3386927] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "BZGMAks3Tw8M2gq64Pee4atbDcJUiBTSVqRY6RcYozHt", "fee": 2600000, "feeAssetId": null, "timestamp": 1732536862056, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "2SfA3EzngkC1MGiNXowSLm8DA69GU3TKhJ9AAcxQJNZDQJ9vBqQLDbQrDXESFg3EyUcwYpe54iXrpDjjKfosp4T3" ], "script": "base64:BgJHCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBARIDCgEBEgMKAQgSAwoBCBIDCgEBEgCQAQADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAA5NSU5TSE9QUEFZTUVOVACgjQYACkRBWV9NSUxMSVMAgLiZKQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEACkRBWV9CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAoAsDCQAAAgEBVAUHJG1hdGNoMAA8CQACAQINVW5rbm93biBjaGFpbgALV0VFS19CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAA4E4DCQAAAgEBVAUHJG1hdGNoMAC0AQkAAgECDVVua25vd24gY2hhaW4AC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRndZdGE4YmlFejMxenBlRmU1REpLOHdFNXRyU3BRVkY4AwkAAAIBAVQFByRtYXRjaDACIzNON1V1WWFyNjI2NFA1OEZCaFZXS1BRQWg0WXVhMmhnbmd2CQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AEUtTX0FMTE9XX05GVF9EUkFXBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwBwMJAAACAQFUBQckbWF0Y2gwBgkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABAAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCHJlc3QyQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIcmVzdDJDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4ABFJZHhDZmdTdGFraW5nRGFwcAABAA9JZHhDZmdBY3Jlc0RhcHAACAAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBGFkZHIJAKwCAgITbGFzdFdlZWtUeElkQnlVc2VyXwUEYWRkcgANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AQprZXlVc2VyQmV0AQRhZGRyCQCsAgICCHVzZXJCZXRfBQRhZGRyARJrZXlVc2VyV2Vla1RpY2tldHMCBGFkZHIEd2VlawkArAICCQCsAgIJAKwCAgIQdXNlcldlZWtUaWNrZXRzXwUEYWRkcgIBXwkApAMBBQR3ZWVrARNrZXlUb3RhbFdlZWtUaWNrZXRzAQR3ZWVrCQCsAgICEXRvdGFsV2Vla1RpY2tldHNfCQCkAwEFBHdlZWsBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEEd2VlawkArAICAhZ0b3RhbFdlZWtQYXJ0aWNpcGFudHNfCQCkAwEFBHdlZWsBDmtleU51bU5GVDJEcmF3AQR3ZWVrCQCsAgICDG51bU5GVDJEcmF3XwkApAMBBQR3ZWVrAQ5rZXlOdW1ORlREcmF3bgEEd2VlawkArAICAgxudW1ORlREcmF3bl8JAKQDAQUEd2VlawEOa2V5V2Vla1dpbm5lcnMBBHdlZWsJAKwCAgIMd2Vla1dpbm5lcnNfCQCkAwEFBHdlZWsBCndpbm5pbmdCZXQBA2RheQkAagIJALEJAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQkAaAIFA2RheQUKREFZX0JMT0NLUwN2cmYABAEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEPZ2V0UmFuZG9tTnVtYmVyAwhtYXhWYWx1ZQRzYWx0B2VudHJvcHkDCQBnAgAABQhtYXhWYWx1ZQkAAgECFm1heFZhbHVlIHNob3VsZCBiZSA+IDAECnJhbmRvbUhhc2gJANQWAQkAywECBQRzYWx0BQdlbnRyb3B5CQBqAgkAsQkBBQpyYW5kb21IYXNoBQhtYXhWYWx1ZQAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwACE1JTExJT042AICA6YOx3hYAC1BMQVlFUlNIQVJFAIC1GAAJREFZTUlMTElTAIC4mSkAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQRhZGRyCQCsAgICEWxhc3RXbGdMaW1pdFVzZXJfBQRhZGRyAA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAANNNl8AwIQ9AANNOF8AgMLXLwAKVEVBTV9TSEFSRQDAmgwADkFDVElWSVRZX1NIQVJFAKCNBgAMUExBWUVSX1NIQVJFAIC1GAALWUVBUl9NSUxMSVMAgIbrx3UABkRBWV9NUwCAuJkpAAdJU1NVRTEwAICU69wDAA9QTEFZRVJTMTBfU0hBUkUAgOowABFNQVJLRVRJTkcxMF9TSEFSRQCgjQYADFRFQU0xMF9TSEFSRQCgjQYAEU5FV19TVEFLSU5HX1NUQVJUAIDzuMKxMgAQbWFya2V0aW5nQWRkcktleQINbWFya2V0aW5nQWRkcgAKdGVhbUFkcktleQIIdGVhbUFkZHIADmxhc3RUZWFtVGltS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQAOdGVhbUFtdExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABRsYXN0QWN0aXZpdGllc1RpbUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMADWFjdEFtdExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABFzdGFrZXJzQW10TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUbGFzdENsYWltZWRUaW1lVXNlcl8FBGFkZHIBDWRpc3RyQnlQZXJpb2QCDGlzc3VlZEFtb3VudAZwZXJpb2QJAGsDBQxpc3N1ZWRBbW91bnQJAGgCBQxQTEFZRVJfU0hBUkUJAGQCBQZwZXJpb2QAAQkAaAIABgUDTTZfABF3bGdJc3N1ZTEwVGltZUtleQIPd2xnX2lzc3VlMTBUaW1lAA53bGdJc3N1ZVRpbUtleQINd2xnX2lzc3VlVGltZQAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIAEmFjcmVzU3Rha2RUb3RhbEtleQIWYWNyZXNTdGFrZWRBbW91bnRUb3RhbAAUdG90YWxGYXJtaW5nUG93ZXJLZXkCEXRvdGFsRmFybWluZ1Bvd2VyAAlkYXBwMlJlc3QAAAAMZGFwcDJTdGFraW5nAAEACGRhcHAyV2xnAAIAC2RhcHAyUHV6emxlAAMAD2RhcHAySW52ZXN0RnVuZAAEABRJZHhEdHgxUGVyY0dlbVdpbm5lcgABABVERUZBVUxUX1dFRUtMWV9QUklaRVMABQEQa2V5VXNlckZ1bGxCb251cwEEYWRkcgkArAICAg51c2VyRnVsbEJvbnVzXwUEYWRkcgAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFYWNyZXMGYm9udXM2BApub3RCb251c2VkCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFBWFjcmVzCQCUCgIJAGsDBQpub3RCb251c2VkCQBkAgUDTTZfBQZib251czYFA002XwUKbm90Qm9udXNlZAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5DmFjcmVzMkNvbnRyYWN0BAd0b3RhbEZQCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUSdXNlckFkZHJTdHJPckVtcHR5AAAECCR0MDc5MTQzCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUJdXNlckFjcmVzBQl1c2VyQm9udXMEDXVzZXJGUGJvbnVzZWQIBQgkdDA3OTE0MwJfMQQQdXNlckZQbm90Qm9udXNlZAgFCCR0MDc5MTQzAl8yCQDMCAIFB3RvdGFsRlAJAMwIAgUNdXNlckZQYm9udXNlZAkAzAgCBRB1c2VyRlBub3RCb251c2VkCQDMCAIFCXVzZXJCb251cwUDbmlsAAppZHhUb3RhbEZQAAAAEGlkeFVzZXJGUGJvbnVzZWQAAQALaXhXbGdBbW91bnQAAAAIaXhXbGdXbGcAAQAKaXhXbGdQcmljZQACAA5peFdsZ0lzc3VlVGltZQAIAA9peFdsZ1RlYW1BbUxlZnQACwATaXhXbGdUZWFtQW1BdmFpbE5vdwAMAA5peFdsZ0FjdEFtTGVmdAAPABJpeFdsZ0FjdEFtQXZhaWxOb3cAEAAQaXhXbGdBbUxlZnRUb3RhbAATABNpeFdsZ1VzZXJBbUF2YWlsTm93ABcAEGl4V2xnRWZmVXNlclRpbWUAGAASaXhXbGdJc3N1ZTEwQW1vdW50ABkAG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAAaABZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50ABsAD2l4V2xnVXNlcjEwcGFydAAcABBpeFdsZ0lzc3VlMTBUaW1lAB0BDGdldFdsZ1N0YXRzMgQLdXNlckFkZHJPcHQJY29udHJhY3RzBnVzZHRJZBV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUPd2xnSXNzdWVkQW10S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCWRhcHAyUmVzdAUGdXNkdElkBAZ3bGdVc2QJAGUCCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUGdXNkdElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ECXB1enpsZVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwULZGFwcDJQdXp6bGUFBnVzZHRJZAQJYWNyZXMyVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFBnVzZHRJZAQRaW52ZXN0Rm5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ9kYXBwMkludmVzdEZ1bmQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgURaW52ZXN0Rm5kQ29udHJhY3QFBnVzZHRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRFpbnZlc3RGbmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwILd2xnX2Fzc2V0SWQCE05vdCBpbml0aWFsaXplZCB5ZXQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOd2xnSXNzdWVUaW1LZXkCD05vdCBpbml0aWFsaXplZAQGd2xnV2xnCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUFd2xnSWQECXRlYW1Ub3RhbAkAawMFDGlzc3VlZEFtb3VudAUKVEVBTV9TSEFSRQUDTTZfBA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDnRlYW1BbXRMZWZ0S2V5BQl0ZWFtVG90YWwEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDmxhc3RUZWFtVGltS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUKdGVhbUFkcktleQQWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUOdGVhbUFtb3VudExlZnQFA25pbAQKdGVhbVdsZ29sZAkA8AcCBQh0ZWFtQWRkcgUFd2xnSWQECGFjdFRvdGFsCQBrAwUMaXNzdWVkQW1vdW50BQ5BQ1RJVklUWV9TSEFSRQUDTTZfBA1hY3RBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUNYWN0QW10TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFFGxhc3RBY3Rpdml0aWVzVGltS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ1hY3RBbW91bnRMZWZ0BQNuaWwECWFjdFdsZ29sZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQV3bGdJZAQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQt1c2VyQWRkck9wdAUJaXNzdWVUaW1lBA5sYXN0VXNlclBlcmlvZAkAaQIJAGUCBQxsYXN0VXNlclRpbWUFCWlzc3VlVGltZQULWUVBUl9NSUxMSVMECm5vd0xpbWl0ZWQJAJcDAQkAzAgCBQNub3cJAMwIAgkAZAIFCWlzc3VlVGltZQkAaAIAAwULWUVBUl9NSUxMSVMFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQULWUVBUl9NSUxMSVMJAMwIAgACBQNuaWwEA2VmZgkBEGdldEZhcm1pbmdQb3dlcnMCBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwQVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAUJY3VyUGVyaW9kBA1wcmV2UGVyaW9kRW5kCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMFCWN1clBlcmlvZAQRcHJldlByZXZQZXJpb2RFbmQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEDXVzZXJBdmFpbGFibGUDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAUCYTADCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQQCYTEJAGsDCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAABCQBlAgUNcHJldlBlcmlvZEVuZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwkAZAIFAmExBQJhMAQCYTIJAGsDCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAACCQBlAgURcHJldlByZXZQZXJpb2RFbmQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEAmExCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFAmEyBQJhMQUCYTAED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXN0YWtlcnNBbXRMZWZ0S2V5AAAECnVzZXJBbW91bnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwUNdXNlckF2YWlsYWJsZQkAkQMCBQNlZmYFEGlkeFVzZXJGUGJvbnVzZWQJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAED2xhc3RJc3N1ZTEwVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXdsZ0lzc3VlMTBUaW1lS2V5BRFORVdfU1RBS0lOR19TVEFSVAQNaXNzdWUxMEFtb3VudAkAawMFB0lTU1VFMTAJAJYDAQkAzAgCCQBlAgUDbm93BQ9sYXN0SXNzdWUxMFRpbWUJAMwIAgAABQNuaWwFBkRBWV9NUwQWbWFya2V0aW5nSXNzdWUxMEFtb3VudAkAawMFDWlzc3VlMTBBbW91bnQFEU1BUktFVElORzEwX1NIQVJFBQNNNl8EEXRlYW1Jc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAUMVEVBTTEwX1NIQVJFBQNNNl8EDnVzZXIxMEludGVydmFsCQCWAwEJAMwIAgkAZQIFA25vdwkAlgMBCQDMCAIFEU5FV19TVEFLSU5HX1NUQVJUCQDMCAIFDGxhc3RVc2VyVGltZQUDbmlsCQDMCAIAAAUDbmlsBAp1c2VyMTBwYXJ0AwkBAiE9AgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAkAawMJAGsDCQBrAwUHSVNTVUUxMAUOdXNlcjEwSW50ZXJ2YWwFBkRBWV9NUwkAkQMCBQNlZmYFEGlkeFVzZXJGUGJvbnVzZWQJAJEDAgUDZWZmBQppZHhUb3RhbEZQBQ9QTEFZRVJTMTBfU0hBUkUFA002XwAABA5uZXdJc3N1ZTEwVGltZQkAlgMBCQDMCAIFEU5FV19TVEFLSU5HX1NUQVJUCQDMCAIFA25vdwUDbmlsBBBhY3Jlc1N0YWtlZFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEmFjcmVzU3Rha2RUb3RhbEtleQAACQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCBQZ3bGdXbGcJAMwIAgkAawMFDXRvdGFsRnVuZHNVc2QFA004XwUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUHcmVzdFVzZAkAzAgCBQlhY3JlczJVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgUMbGFzdFRlYW1UaW1lCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQ9pbnZlc3RGdW5kVG90YWwJAMwIAgUKdXNlckFtb3VudAkAzAgCBQpub3dMaW1pdGVkCQDMCAIFDWlzc3VlMTBBbW91bnQJAMwIAgUWbWFya2V0aW5nSXNzdWUxMEFtb3VudAkAzAgCBRF0ZWFtSXNzdWUxMEFtb3VudAkAzAgCBQp1c2VyMTBwYXJ0CQDMCAIFDm5ld0lzc3VlMTBUaW1lCQDMCAIJAJEDAgUDZWZmBQppZHhUb3RhbEZQCQDMCAIFEGFjcmVzU3Rha2VkVG90YWwFA25pbAANcHJvZml0QWRkcktleQIKcHJvZml0QWRkcgAZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQIWc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbAEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQRhZGRyCQCsAgICFnN0YWtlcnNBbW91bnRQYWlkVXNlcl8FBGFkZHIBB3Byb2xvZzIACQEFYXNJbnQBCQD9BwQFDmFjcmVzMkNvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAESZ2V0U3dhcExpbWl0V2xnb2xkAQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIAAAQMZGVmYXVsdExpbWl0CQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyAAAEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgUMZGVmYXVsdExpbWl0BAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUMZGVmYXVsdExpbWl0CQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGxhc3RUaW1lBQpEQVlfTUlMTElTCQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsAQ5jbGFpbUludGVybmFsMgEEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAt1c2VyVGltZUtleQkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQRhZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkAAAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEGl4V2xnRWZmVXNlclRpbWUDCQAAAgUMbGFzdFVzZXJUaW1lBQt1c2VyRWZmVGltZQkAlAoCBQNuaWwAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQCRAwIFCGN1clN0YXRzBQ5peFdsZ0lzc3VlVGltZQQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVGVhbUFtTGVmdAQKdGVhbUFtb3VudAkAZAIJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQEDHRlYW1UcmFuc2ZlcgMJAGYCBQp0ZWFtQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwEDWFjdEFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFDml4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnQWN0QW1BdmFpbE5vdwQLYWN0VHJhbnNmZXIDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA9tYXJrZXRpbmdBbW91bnQJAJEDAgUIY3VyU3RhdHMFG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAQRbWFya2V0aW5nVHJhbnNmZXIDCQBmAgUPbWFya2V0aW5nQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBRBtYXJrZXRpbmdBZGRyS2V5BQ9tYXJrZXRpbmdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBAp1c2VyQW1vdW50CQCRAwIFCGN1clN0YXRzBRNpeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQBkAgUKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUPaXhXbGdVc2VyMTBwYXJ0BA5pc3N1ZWQxMEFtb3VudAkAkQMCBQhjdXJTdGF0cwUSaXhXbGdJc3N1ZTEwQW1vdW50CQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQ5pc3N1ZWQxMEFtb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQ5pc3N1ZWQxMEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnSXNzdWUxMFRpbWVLZXkJAJEDAgUIY3VyU3RhdHMFEGl4V2xnSXNzdWUxMFRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFB3VzZXJLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFB3VzZXJLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZQIJAJEDAgUIY3VyU3RhdHMFEGl4V2xnQW1MZWZ0VG90YWwFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5CQBkAgkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFC3VzZXJUaW1lS2V5BQt1c2VyRWZmVGltZQUDbmlsBQx0ZWFtVHJhbnNmZXIFC2FjdFRyYW5zZmVyBRFtYXJrZXRpbmdUcmFuc2ZlcgUJdXNlclRvdGFsAQ50YWtlWHBJbnRlcm5hbAIEYWRkcgVkZWx0YQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBQRhZGRyBAlhbW91bnRLZXkJARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAEB29sZFVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEXdsZ1N0YWtlZFRvdGFsS2V5AAAEAnhwCQBrAwkAawMFBXhwV2xnBQdvbGRVc2VyBQ93bGdCYXNlQW1vdW50WHAJAGUCBQhsYXN0VGltZQUDbm93BQlEQVlNSUxMSVMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGQCBQdvbGRVc2VyBQVkZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUFZGVsdGEFA25pbAUCeHAFB29sZFVzZXIBEW9wZW5DaGVzdEludGVybmFsAQRhZGRyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQIZHJhd1dlZWsJAGUCBQR3ZWVrAAEECW51bVByaXplcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZUMkRyYXcBBQhkcmF3V2VlawUVREVGQVVMVF9XRUVLTFlfUFJJWkVTBAtwcml6ZXNEcmF3bgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZURHJhd24BBQhkcmF3V2VlawAABAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAMJAGcCAAAFC3VzZXJUaWNrZXRzCQCUCgIFA25pbAUEdW5pdAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwkAZwIAAAULd2Vla1RpY2tldHMJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsFA25pbAUEdW5pdAQHZW50cm9weQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQkAaAIFBHdlZWsFC1dFRUtfQkxPQ0tTA3ZyZgQEc2FsdAkA2QQBCQCRAwIJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgIKNDJfREVGQVVMVAIBXwABBAZyYW5kb20JAQ9nZXRSYW5kb21OdW1iZXIDBQt3ZWVrVGlja2V0cwUEc2FsdAUHZW50cm9weQMJAGYCCQBoAgULdXNlclRpY2tldHMFCW51bVByaXplcwUGcmFuZG9tBAtpc3N1ZVJlc3VsdAkA/AcEBQ5hY3JlczJDb250cmFjdAIIaXNzdWVORlQJAMwIAgUEYWRkcgkAzAgCBRRJZHhEdHgxUGVyY0dlbVdpbm5lcgUDbmlsBQNuaWwEB3dpbm5lcnMJAKIIAQkBDmtleVdlZWtXaW5uZXJzAQUIZHJhd1dlZWsECm5ld1dpbm5lcnMDCQEJaXNEZWZpbmVkAQUHd2lubmVycwkArAICCQCsAgIJAQV2YWx1ZQEFB3dpbm5lcnMCAV8FBGFkZHIFBGFkZHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleU51bU5GVERyYXduAQUIZHJhd1dlZWsJAGQCBQtwcml6ZXNEcmF3bgABCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5V2Vla1dpbm5lcnMBBQhkcmF3V2VlawUKbmV3V2lubmVycwUDbmlsBQtpc3N1ZVJlc3VsdAQHcmFuZG9tMQkAZAIJAQ9nZXRSYW5kb21OdW1iZXIDAAkJAMsBAgEBQgUEc2FsdAUHZW50cm9weQABBAtjb25zVGlja2V0cwkAawMFC3VzZXJUaWNrZXRzBQdyYW5kb20xAAoJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBQtjb25zVGlja2V0cwUDbmlsBQtjb25zVGlja2V0cwEUY2xhaW1UaWNrZXRzSW50ZXJuYWwCBGFkZHIKdXNlckJldFN0cgQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBAZkYXlCZXQJALUJAgUKdXNlckJldFN0cgIBXwQPb2xkVG90YWxUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawAABApvbGRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEFCnRpY2tldHNLZXkAAAQMZGVsdGFUaWNrZXRzAwkAAAIJAQp3aW5uaW5nQmV0AQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmRheUJldAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAEAAQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIDCQAAAgUMZGVsdGFUaWNrZXRzAAAFA25pbAkAzQgCCQDNCAIFEnVwZGF0ZVBhcnRpY2lwYW50cwkBDEludGVnZXJFbnRyeQIFCnRpY2tldHNLZXkJAGQCBQpvbGRUaWNrZXRzBQxkZWx0YVRpY2tldHMJAQxJbnRlZ2VyRW50cnkCCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsJAGQCBQ9vbGRUb3RhbFRpY2tldHMFDGRlbHRhVGlja2V0cwUMZGVsdGFUaWNrZXRzDgFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFCE1JTExJT042BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQhNSUxMSU9ONgULUExBWUVSU0hBUkUFBU1VTFQ2CQDMCAIJAQtCaW5hcnlFbnRyeQIFDXdsZ0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbWFya2V0aW5nQWRkcktleQUNbWFya2V0aW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQt0ZWFtQWRkcktleQUIdGVhbUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNcHJvZml0QWRkcktleQUKcHJvZml0QWRkcgUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBCXJlc3QyQWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIFA25pbAFpAQZidXlXbGcBDG1pblRvUmVjZWl2ZQQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQId2xnUHJpY2UJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UECGJ1eVByaWNlCQBuBAUId2xnUHJpY2UABgAFBQdDRUlMSU5HBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUJd2xnQW1vdW50BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgIQWW91IGNhbiBnZXQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIVIFdMR09MRCBhdCB0aGUgbW9tZW50AwkAZgIFDG1pblRvUmVjZWl2ZQUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFCXdsZ0Ftb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIFDGN1cldsZ0Ftb3VudAUJd2xnQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyCQBlAgUGbWF4V2xnBQl3bGdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJd2xnQW1vdW50BQp3bGdBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5idXlXbGdSRUFET05MWQIHYWRkcmVzcwd1c2R0QW10BAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQECHdsZ1ByaWNlCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlBAhidXlQcmljZQkAbgQFCHdsZ1ByaWNlAAYABQUHQ0VJTElORwQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAdtYXhVc2R0CQBrAwUGbWF4V2xnBQhidXlQcmljZQUFTVVMVDgEDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCBQNuaWwJAMwIAgUJd2xnQW1vdW50CQDMCAIFDk1JTlNIT1BQQVlNRU5UCQDMCAIFB21heFVzZHQJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEHc2VsbFdsZwEJbWluQW1vdW50BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUGd2xnQW10BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAhUgV0xHT0xEIGF0IHRoZSBtb21lbnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4AwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAMJAGYCBQltaW5BbW91bnQFB3VzZHRBbXQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABQkAlAoCCQDMCAIJAQRCdXJuAgUKd2xnQXNzZXRJZAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGUCBQxjdXJXbGdBbW91bnQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgkAZQIFBm1heFdsZwUGd2xnQW10CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9zZWxsV2xnUkVBRE9OTFkCB2FkZHJlc3MGd2xnQW10BAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4BAZtaW5XbGcJAGsDBQ5NSU5TSE9QUEFZTUVOVAUFTVVMVDgFCXNlbGxQcmljZQQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIFA25pbAkAzAgCBQd1c2R0QW10CQDMCAIFBm1pbldsZwkAzAgCBQZtYXhXbGcJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA0kdDAxNDA0NTE0MTE0CQEOY2xhaW1JbnRlcm5hbDIBCQClCAEIBQFpBmNhbGxlcgQHYWN0aW9ucwgFDSR0MDE0MDQ1MTQxMTQCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxNDA0NTE0MTE0Al8yCQCUCgIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESb25TdGFrZVVuc3Rha2VMYW5kAQRhZGRyAwMDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkBAiE9AggFAWkGY2FsbGVyBQ1hY3Jlc0NvbnRyYWN0BwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTQ0MzMxNDQ4NwkBDmNsYWltSW50ZXJuYWwyAQUEYWRkcgQHYWN0aW9ucwgFDSR0MDE0NDMzMTQ0ODcCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxNDQzMzE0NDg3Al8yCQCUCgIDCQBmAgUQd2xnQ2xhaW1lZEFtb3VudAAACQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIFEHdsZ0NsYWltZWRBbW91bnQFCndsZ0Fzc2V0SWQFB2FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEKYnVybldsZ29sZAEGd2xnQW10AwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAMJAGYCBQZ3bGdBbXQJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnCQACAQkArAICCQCsAgIJAKwCAgIFT25seSAJAQpmaXhlZFBvaW50AgkAkQMCBQhjdXJTdGF0cwUIaXhXbGdXbGcACAIlIFdMR09MRCBsZWZ0IG9uIGNvbnRyYWN0LCBjYW4ndCBidXJuIAkBCmZpeGVkUG9pbnQCBQZ3bGdBbXQACAQNd2xnQW1vdW50TGVmdAkAZQIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQZ3bGdBbXQJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQ13bGdBbW91bnRMZWZ0BQNuaWwFDXdsZ0Ftb3VudExlZnQBaQEMYmV0Rm9yVGlja2V0AQNiZXQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAhkcmF3V2VlawkAZQIJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTAAEEC3VzZXJUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawAABAt3ZWVrVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFCGRyYXdXZWVrAAADAwkAZgIFC3VzZXJUaWNrZXRzAAAJAGYCBQt3ZWVrVGlja2V0cwAABwkAAgECG1BsZWFzZSBvcGVuIHRoZSBjaGVzdCBmaXJzdAMJAQIhPQIJAGkCBQNiZXQABAAACQACAQIbSW52YWxpZCBiZXQ6IHNob3VsZCBiZSAwLi4zBAZtb21lbnQJAGoCBQZoZWlnaHQFCkRBWV9CTE9DS1MDCQBmAgUGbW9tZW50CQBlAgUKREFZX0JMT0NLUwADCQACAQkArAICCQCsAgICMUNhbm5vdCBiZXQ6IHRoZSBkYXkgaXMgYWxtb3N0IGVuZGVkLCBwbGVhc2Ugd2FpdCAJAKQDAQkAZQIFCkRBWV9CTE9DS1MFBm1vbWVudAIHIGJsb2NrcwQLc3Rha2VkQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFBGFkZHIAAAQDbHZsCQEPZ2V0TGV2ZWxCeUFjcmVzAQULc3Rha2VkQWNyZXMDCQAAAgUDbHZsAAAJAAIBAiNZb3UgbmVlZCB0byBzdGFrZSBzb21lIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBA1vbGRVc2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFDW9sZFVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFDW9sZFVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzQgCCAUBcgJfMQULbmV3QmV0RW50cnkIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE3MDg3MTcxMzAJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDE3MDg3MTcxMzACXzEEAnhwCAUNJHQwMTcwODcxNzEzMAJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDE3MjA3MTcyNTUJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDE3MjA3MTcyNTUCXzEEB2RlbHRhWFAIBQ0kdDAxNzIwNzE3MjU1Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAWkBDHNldE51bVByaXplcwEJbnVtUHJpemVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlQyRHJhdwEFBHdlZWsFCW51bVByaXplcwUDbmlsBQludW1Qcml6ZXMBaQEJb3BlbkNoZXN0AAMJAQEhAQURS1NfQUxMT1dfTkZUX0RSQVcJAAIBAhRUZW1wb3JhcmlseSBkaXNhYmxlZAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLdXNlclRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrAAADCQBnAgAABQt1c2VyVGlja2V0cwkAAgECGU5vIGdlbXMgdG8gb3BlbiB0aGUgY2hlc3QJARFvcGVuQ2hlc3RJbnRlcm5hbAEFBGFkZHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4APA4SAQ==", "height": 3386927, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 35XQkjvoqeBNJdAnVoCPD3mW4okgZ6Z2YMn8z6GckqjG Next: 14MoyMZUbpiiwVuCi246oZZa9zNjuKUtYq4YDRy7VB9D Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let MULT6 = 1000000
7+
8+let MULT8 = 100000000
9+
10+let MINSHOPPAYMENT = 100000
11+
412 let DAY_MILLIS = 86400000
513
614 let chain = take(drop(this.bytes, 1), 1)
15+
16+let DAY_BLOCKS = match chain {
17+ case _ =>
18+ if ((base58'2W' == $match0))
19+ then 1440
20+ else if ((base58'2T' == $match0))
21+ then 60
22+ else throw("Unknown chain")
23+}
24+
25+let WEEK_BLOCKS = match chain {
26+ case _ =>
27+ if ((base58'2W' == $match0))
28+ then 10080
29+ else if ((base58'2T' == $match0))
30+ then 180
31+ else throw("Unknown chain")
32+}
733
834 let usdtAssetId = match chain {
935 case _ =>
1137 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1238 else if ((base58'2T' == $match0))
1339 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
40+ else throw("Unknown chain")
41+}
42+
43+let defaultRest2AddressStr = match chain {
44+ case _ =>
45+ if ((base58'2W' == $match0))
46+ then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
47+ else if ((base58'2T' == $match0))
48+ then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
1449 else throw("Unknown chain")
1550 }
1651
2358 else throw("Unknown chain")
2459 }
2560
26-let acres2AddressStr = match chain {
61+let KS_ALLOW_NFT_DRAW = match chain {
2762 case _ =>
2863 if ((base58'2W' == $match0))
29- then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
64+ then false
3065 else if ((base58'2T' == $match0))
31- then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
66+ then true
3267 else throw("Unknown chain")
3368 }
34-
35-let SEP = "__"
36-
37-let MULT6 = 1000000
38-
39-let MULT8 = 100000000
40-
41-let MINSHOPPAYMENT = 100000
4269
4370 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4471
4572
46-let IdxCfgStakingDapp = 1
73+let IdxCfgAcres2Dapp = 1
4774
48-let IdxCfgWlgDapp = 4
75+let IdxCfgWlgDapp = 2
4976
50-let IdxCfgPuzzlePoolDapp = 5
77+let IdxCfgPuzzlePoolDapp = 4
5178
52-let IdxCfgInvestFundDapp = 6
53-
54-let IdxCfgAcresDapp = 8
79+let IdxCfgInvestFundDapp = 5
5580
5681 func keyRestCfg () = "%s__restConfig"
82+
83+
84+func keyRest2Address () = "%s__rest2Addr"
5785
5886
5987 func keyRestAddress () = "%s__restAddr"
6088
6189
62-func keyRest2Address () = "%s__rest2Addr"
63-
90+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
6491
6592 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
6693
6794
68-func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
95+func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
6996
7097
71-let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
98+let IdxCfgStakingDapp = 1
99+
100+let IdxCfgAcresDapp = 8
72101
73102 let restCfg = readRestCfgOrFail(restContract)
74103
75104 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
76105
77-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
106+let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
78107
79-let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
108+let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
80109
81-let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
110+let rest2Cfg = readRestCfgOrFail(rest2Contract)
82111
83-let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
112+let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
113+
114+let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
115+
116+let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
117+
118+let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
119+
120+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
121+
84122
85123 let wlgAssetIdKey = "wlg_assetId"
86124
87125 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
126+
127+func keyUserBet (addr) = ("userBet_" + addr)
128+
129+
130+func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
131+
132+
133+func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
134+
135+
136+func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
137+
138+
139+func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
140+
141+
142+func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
143+
144+
145+func keyWeekWinners (week) = ("weekWinners_" + toString(week))
146+
147+
148+func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
149+
88150
89151 func asInt (v) = match v {
90152 case n: Int =>
92154 case _ =>
93155 throw("fail to cast into Int")
94156 }
95-
96-
97-func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
98157
99158
100159 func fixedPoint (val,decimals) = {
193252
194253 let DAY_MS = 86400000
195254
196-let DAY_BLOCKS = 1440
197-
198-let WEEK_BLOCKS = 10080
199-
200255 let ISSUE10 = 1000000000
201256
202257 let PLAYERS10_SHARE = 800000
254309
255310 let IdxDtx1PercGemWinner = 1
256311
312+let DEFAULT_WEEKLY_PRIZES = 5
313+
314+func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
315+
316+
257317 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
258318
259319 func getLevelByAcres (acres) = {
280340 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
281341
282342
343+func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
344+ let notBonused = getFarmingPowerByAcres(acres)
345+ $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
346+ }
347+
348+
283349 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
284350 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
285351 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
286- let userFP = getFarmingPowerByAcres(userAcres)
287-[totalFP, userFP]
352+ let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
353+ let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
354+ let userFPbonused = $t079143._1
355+ let userFPnotBonused = $t079143._2
356+[totalFP, userFPbonused, userFPnotBonused, userBonus]
288357 }
289-
290-
291-func keyUserBet (addr) = ("userBet_" + addr)
292-
293-
294-func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
295-
296-
297-func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
298-
299-
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-
313-
314-func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
315358
316359
317360 let idxTotalFP = 0
318361
319-let idxUserFP = 1
362+let idxUserFPbonused = 1
320363
321364 let ixWlgAmount = 0
322365
397440 }
398441 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
399442 let userAmount = if ((eff[idxTotalFP] != 0))
400- then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
443+ then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
401444 else 0
402445 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
403446 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
405448 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
406449 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
407450 let user10part = if ((eff[idxTotalFP] != 0))
408- then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFP], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
451+ then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
409452 else 0
410453 let newIssue10Time = max([NEW_STAKING_START, now])
411454 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
413456 }
414457
415458
416-let net = take(drop(this.bytes, 1), 1)
417-
418-let defaultRest2AddressStr = match net {
419- case _ =>
420- if ((base58'2W' == $match0))
421- then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
422- else if ((base58'2T' == $match0))
423- then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
424- else throw("Unknown chain")
425-}
426-
427459 let profitAddrKey = "profitAddr"
428460
429461 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
430462
431463 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
432464
433-
434-let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
435-
436-let acres2Contract = addressFromStringValue(acres2AddressStr)
437465
438466 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
439467
682710 then if ((size(i.payments) != 0))
683711 then throw("No payments required")
684712 else {
685- let $t01402714096 = claimInternal2(toString(i.caller))
686- let actions = $t01402714096._1
687- let wlgClaimedAmount = $t01402714096._2
713+ let $t01404514114 = claimInternal2(toString(i.caller))
714+ let actions = $t01404514114._1
715+ let wlgClaimedAmount = $t01404514114._2
688716 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
689717 }
690718 else throw("Strict value is not equal to itself.")
700728 else false)
701729 then throw("Permission denied")
702730 else {
703- let $t01441514469 = claimInternal2(addr)
704- let actions = $t01441514469._1
705- let wlgClaimedAmount = $t01441514469._2
731+ let $t01443314487 = claimInternal2(addr)
732+ let actions = $t01443314487._1
733+ let wlgClaimedAmount = $t01443314487._2
706734 $Tuple2(if ((wlgClaimedAmount > 0))
707735 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
708736 else actions, wlgClaimedAmount)
731759 if ((prologResult == prologResult))
732760 then if ((size(i.payments) != 0))
733761 then throw("No payments required")
734- else if (((bet / 4) != 0))
735- then throw("Invalid bet: should be 0..3")
736- else {
737- let moment = (height % DAY_BLOCKS)
738- if ((moment > (DAY_BLOCKS - 3)))
739- then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
762+ else {
763+ let addr = toString(i.caller)
764+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
765+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
766+ let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
767+ if (if ((userTickets > 0))
768+ then (weekTickets > 0)
769+ else false)
770+ then throw("Please open the chest first")
771+ else if (((bet / 4) != 0))
772+ then throw("Invalid bet: should be 0..3")
740773 else {
741- let addr = toString(i.caller)
742- let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
743- let lvl = getLevelByAcres(stakedAcres)
744- if ((lvl == 0))
745- then throw("You need to stake some ACRES to bet")
774+ let moment = (height % DAY_BLOCKS)
775+ if ((moment > (DAY_BLOCKS - 3)))
776+ then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
746777 else {
747- let tomorrow = ((height / DAY_BLOCKS) + 1)
748- let betKey = keyUserBet(addr)
749- let oldUserBetStr = getString(betKey)
750- let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
751- if (isDefined(oldUserBetStr))
752- then {
753- let userBet = value(oldUserBetStr)
754- if ((split(userBet, "_")[0] == toString(tomorrow)))
755- then throw("You already bet for tomorrow")
756- else {
757- let r = claimTicketsInternal(addr, userBet)
758- $Tuple2((r._1 :+ newBetEntry), r._2)
778+ let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
779+ let lvl = getLevelByAcres(stakedAcres)
780+ if ((lvl == 0))
781+ then throw("You need to stake some ACRES to bet")
782+ else {
783+ let tomorrow = ((height / DAY_BLOCKS) + 1)
784+ let betKey = keyUserBet(addr)
785+ let oldUserBetStr = getString(betKey)
786+ let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
787+ if (isDefined(oldUserBetStr))
788+ then {
789+ let userBet = value(oldUserBetStr)
790+ if ((split(userBet, "_")[0] == toString(tomorrow)))
791+ then throw("You already bet for tomorrow")
792+ else {
793+ let r = claimTicketsInternal(addr, userBet)
794+ $Tuple2((r._1 :+ newBetEntry), r._2)
795+ }
759796 }
797+ else $Tuple2([newBetEntry], 0)
760798 }
761- else $Tuple2([newBetEntry], 0)
762799 }
763800 }
764- }
801+ }
765802 else throw("Strict value is not equal to itself.")
766803 }
767804
771808 func takeWlgXp (addr) = if ((i.caller != stakingContract))
772809 then throw("Permission denied")
773810 else {
774- let $t02237922422 = takeXpInternal(addr, 0)
775- let actions = $t02237922422._1
776- let xp = $t02237922422._2
811+ let $t01708717130 = takeXpInternal(addr, 0)
812+ let actions = $t01708717130._1
813+ let xp = $t01708717130._2
777814 $Tuple2(actions, xp)
778815 }
779816
781818
782819 @Callable(i)
783820 func checkWlgXpREADONLY (addr) = {
784- let $t02249922547 = takeXpInternal(addr, 0)
785- let ignored = $t02249922547._1
786- let deltaXP = $t02249922547._2
821+ let $t01720717255 = takeXpInternal(addr, 0)
822+ let ignored = $t01720717255._1
823+ let deltaXP = $t01720717255._2
787824 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
788825 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
789826 $Tuple2(nil, (lvlPoints :+ newXP))
802839
803840
804841 @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")
810- else {
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)
817- }
818- else throw("Strict value is not equal to itself.")
819- }
842+func openChest () = if (!(KS_ALLOW_NFT_DRAW))
843+ then throw("Temporarily disabled")
844+ else {
845+ let prologResult = prolog2()
846+ if ((prologResult == prologResult))
847+ then if ((size(i.payments) != 0))
848+ then throw("No payments required")
849+ else {
850+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
851+ let addr = toString(i.caller)
852+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
853+ if ((0 >= userTickets))
854+ then throw("No gems to open the chest")
855+ else openChestInternal(addr)
856+ }
857+ else throw("Strict value is not equal to itself.")
858+ }
820859
821860
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let MULT6 = 1000000
7+
8+let MULT8 = 100000000
9+
10+let MINSHOPPAYMENT = 100000
11+
412 let DAY_MILLIS = 86400000
513
614 let chain = take(drop(this.bytes, 1), 1)
15+
16+let DAY_BLOCKS = match chain {
17+ case _ =>
18+ if ((base58'2W' == $match0))
19+ then 1440
20+ else if ((base58'2T' == $match0))
21+ then 60
22+ else throw("Unknown chain")
23+}
24+
25+let WEEK_BLOCKS = match chain {
26+ case _ =>
27+ if ((base58'2W' == $match0))
28+ then 10080
29+ else if ((base58'2T' == $match0))
30+ then 180
31+ else throw("Unknown chain")
32+}
733
834 let usdtAssetId = match chain {
935 case _ =>
1036 if ((base58'2W' == $match0))
1137 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1238 else if ((base58'2T' == $match0))
1339 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
40+ else throw("Unknown chain")
41+}
42+
43+let defaultRest2AddressStr = match chain {
44+ case _ =>
45+ if ((base58'2W' == $match0))
46+ then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
47+ else if ((base58'2T' == $match0))
48+ then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
1449 else throw("Unknown chain")
1550 }
1651
1752 let defaultRestAddressStr = match chain {
1853 case _ =>
1954 if ((base58'2W' == $match0))
2055 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2156 else if ((base58'2T' == $match0))
2257 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2358 else throw("Unknown chain")
2459 }
2560
26-let acres2AddressStr = match chain {
61+let KS_ALLOW_NFT_DRAW = match chain {
2762 case _ =>
2863 if ((base58'2W' == $match0))
29- then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
64+ then false
3065 else if ((base58'2T' == $match0))
31- then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
66+ then true
3267 else throw("Unknown chain")
3368 }
34-
35-let SEP = "__"
36-
37-let MULT6 = 1000000
38-
39-let MULT8 = 100000000
40-
41-let MINSHOPPAYMENT = 100000
4269
4370 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4471
4572
46-let IdxCfgStakingDapp = 1
73+let IdxCfgAcres2Dapp = 1
4774
48-let IdxCfgWlgDapp = 4
75+let IdxCfgWlgDapp = 2
4976
50-let IdxCfgPuzzlePoolDapp = 5
77+let IdxCfgPuzzlePoolDapp = 4
5178
52-let IdxCfgInvestFundDapp = 6
53-
54-let IdxCfgAcresDapp = 8
79+let IdxCfgInvestFundDapp = 5
5580
5681 func keyRestCfg () = "%s__restConfig"
82+
83+
84+func keyRest2Address () = "%s__rest2Addr"
5785
5886
5987 func keyRestAddress () = "%s__restAddr"
6088
6189
62-func keyRest2Address () = "%s__rest2Addr"
63-
90+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
6491
6592 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
6693
6794
68-func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
95+func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
6996
7097
71-let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
98+let IdxCfgStakingDapp = 1
99+
100+let IdxCfgAcresDapp = 8
72101
73102 let restCfg = readRestCfgOrFail(restContract)
74103
75104 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
76105
77-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
106+let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
78107
79-let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
108+let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
80109
81-let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
110+let rest2Cfg = readRestCfgOrFail(rest2Contract)
82111
83-let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
112+let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
113+
114+let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
115+
116+let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
117+
118+let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
119+
120+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
121+
84122
85123 let wlgAssetIdKey = "wlg_assetId"
86124
87125 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
126+
127+func keyUserBet (addr) = ("userBet_" + addr)
128+
129+
130+func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
131+
132+
133+func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
134+
135+
136+func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
137+
138+
139+func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
140+
141+
142+func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
143+
144+
145+func keyWeekWinners (week) = ("weekWinners_" + toString(week))
146+
147+
148+func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
149+
88150
89151 func asInt (v) = match v {
90152 case n: Int =>
91153 n
92154 case _ =>
93155 throw("fail to cast into Int")
94156 }
95-
96-
97-func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
98157
99158
100159 func fixedPoint (val,decimals) = {
101160 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
102161 let lowPart = toString((val % tenPow))
103162 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
104163 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
105164 }
106165
107166
108167 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
109168 then throw("maxValue should be > 0")
110169 else {
111170 let randomHash = sha256_16Kb((salt + entropy))
112171 (toInt(randomHash) % maxValue)
113172 }
114173
115174
116175 let SCALE8 = 100000000
117176
118177 let xpLevelScale = 3200
119178
120179 let xpLevelRecipPow = 4000
121180
122181 let numPointsOnLevelUp = 3
123182
124183 let wlgBaseAmountXp = 100000000000
125184
126185 func keyUserXP (addr) = ("userXP_" + addr)
127186
128187
129188 func keyUserLevel (addr) = ("userLevel_" + addr)
130189
131190
132191 let xpWlg = 10000
133192
134193 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
135194
136195
137196 func levelUp (currLevel,newXP) = {
138197 let newLevel = levelByXP(newXP)
139198 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
140199 }
141200
142201
143202 let MILLION6 = 100000000000000
144203
145204 let PLAYERSHARE = 400000
146205
147206 let DAYMILLIS = 86400000
148207
149208 let teamAddrKey = "teamAddr"
150209
151210 let lastTeamTimeKey = "lastClaimedTime_team"
152211
153212 let teamAmountLeftKey = "teamAmountLeft"
154213
155214 let lastActivitiesTimeKey = "lastClaimedTime_activities"
156215
157216 let actAmountLeftKey = "activitiesAmountLeft"
158217
159218 let stakersAmountLeftKey = "stakersAmountLeft"
160219
161220 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
162221
163222
164223 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
165224
166225
167226 let wlgIssueTimeKey = "wlg_issueTime"
168227
169228 let wlgIssuedAmountKey = "wlg_issuedAmount"
170229
171230 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
172231
173232
174233 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
175234
176235
177236 let wlgStakedTotalKey = "wlgStakedAmountTotal"
178237
179238 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
180239
181240
182241 let M6_ = 1000000
183242
184243 let M8_ = 100000000
185244
186245 let TEAM_SHARE = 200000
187246
188247 let ACTIVITY_SHARE = 100000
189248
190249 let PLAYER_SHARE = 400000
191250
192251 let YEAR_MILLIS = 31557600000
193252
194253 let DAY_MS = 86400000
195254
196-let DAY_BLOCKS = 1440
197-
198-let WEEK_BLOCKS = 10080
199-
200255 let ISSUE10 = 1000000000
201256
202257 let PLAYERS10_SHARE = 800000
203258
204259 let MARKETING10_SHARE = 100000
205260
206261 let TEAM10_SHARE = 100000
207262
208263 let NEW_STAKING_START = 1731279600000
209264
210265 let marketingAddrKey = "marketingAddr"
211266
212267 let teamAdrKey = "teamAddr"
213268
214269 let lastTeamTimKey = "lastClaimedTime_team"
215270
216271 let teamAmtLeftKey = "teamAmountLeft"
217272
218273 let lastActivitiesTimKey = "lastClaimedTime_activities"
219274
220275 let actAmtLeftKey = "activitiesAmountLeft"
221276
222277 let stakersAmtLeftKey = "stakersAmountLeft"
223278
224279 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
225280
226281
227282 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
228283
229284
230285 let wlgIssue10TimeKey = "wlg_issue10Time"
231286
232287 let wlgIssueTimKey = "wlg_issueTime"
233288
234289 let wlgIssuedAmtKey = "wlg_issuedAmount"
235290
236291 let zbIssuedAmtKey = "zbill_issuedAmount"
237292
238293 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
239294
240295
241296 let acresStakdTotalKey = "acresStakedAmountTotal"
242297
243298 let totalFarmingPowerKey = "totalFarmingPower"
244299
245300 let dapp2Rest = 0
246301
247302 let dapp2Staking = 1
248303
249304 let dapp2Wlg = 2
250305
251306 let dapp2Puzzle = 3
252307
253308 let dapp2InvestFund = 4
254309
255310 let IdxDtx1PercGemWinner = 1
256311
312+let DEFAULT_WEEKLY_PRIZES = 5
313+
314+func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
315+
316+
257317 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
258318
259319 func getLevelByAcres (acres) = {
260320 let acr = ((acres + 99999999) / M8_)
261321 func checker (acc,item) = if ((item >= acr))
262322 then acc
263323 else (acc + 1)
264324
265325 let $l = levelAcres
266326 let $s = size($l)
267327 let $acc0 = 0
268328 func $f0_1 ($a,$i) = if (($i >= $s))
269329 then $a
270330 else checker($a, $l[$i])
271331
272332 func $f0_2 ($a,$i) = if (($i >= $s))
273333 then $a
274334 else throw("List size exceeds 10")
275335
276336 $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)
277337 }
278338
279339
280340 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
281341
282342
343+func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
344+ let notBonused = getFarmingPowerByAcres(acres)
345+ $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
346+ }
347+
348+
283349 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
284350 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
285351 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
286- let userFP = getFarmingPowerByAcres(userAcres)
287-[totalFP, userFP]
352+ let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
353+ let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
354+ let userFPbonused = $t079143._1
355+ let userFPnotBonused = $t079143._2
356+[totalFP, userFPbonused, userFPnotBonused, userBonus]
288357 }
289-
290-
291-func keyUserBet (addr) = ("userBet_" + addr)
292-
293-
294-func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
295-
296-
297-func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
298-
299-
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-
313-
314-func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
315358
316359
317360 let idxTotalFP = 0
318361
319-let idxUserFP = 1
362+let idxUserFPbonused = 1
320363
321364 let ixWlgAmount = 0
322365
323366 let ixWlgWlg = 1
324367
325368 let ixWlgPrice = 2
326369
327370 let ixWlgIssueTime = 8
328371
329372 let ixWlgTeamAmLeft = 11
330373
331374 let ixWlgTeamAmAvailNow = 12
332375
333376 let ixWlgActAmLeft = 15
334377
335378 let ixWlgActAmAvailNow = 16
336379
337380 let ixWlgAmLeftTotal = 19
338381
339382 let ixWlgUserAmAvailNow = 23
340383
341384 let ixWlgEffUserTime = 24
342385
343386 let ixWlgIssue10Amount = 25
344387
345388 let ixWlgMarketingIssue10Amount = 26
346389
347390 let ixWlgTeamIssue10Amount = 27
348391
349392 let ixWlgUser10part = 28
350393
351394 let ixWlgIssue10Time = 29
352395
353396 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
354397 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
355398 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
356399 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
357400 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
358401 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
359402 let investFndContract = contracts[dapp2InvestFund]
360403 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
361404 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
362405 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
363406 let now = lastBlock.timestamp
364407 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
365408 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
366409 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
367410 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
368411 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
369412 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
370413 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
371414 let teamWlgold = assetBalance(teamAddr, wlgId)
372415 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
373416 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
374417 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
375418 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
376419 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
377420 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
378421 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
379422 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
380423 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
381424 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
382425 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
383426 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
384427 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
385428 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
386429 let userAvailable = if ((lastUserPeriod == curPeriod))
387430 then a0
388431 else if ((lastUserPeriod == (curPeriod - 1)))
389432 then {
390433 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
391434 (a1 + a0)
392435 }
393436 else {
394437 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
395438 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
396439 ((a2 + a1) + a0)
397440 }
398441 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
399442 let userAmount = if ((eff[idxTotalFP] != 0))
400- then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
443+ then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
401444 else 0
402445 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
403446 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
404447 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
405448 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
406449 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
407450 let user10part = if ((eff[idxTotalFP] != 0))
408- then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFP], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
451+ then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
409452 else 0
410453 let newIssue10Time = max([NEW_STAKING_START, now])
411454 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
412455 [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]
413456 }
414457
415458
416-let net = take(drop(this.bytes, 1), 1)
417-
418-let defaultRest2AddressStr = match net {
419- case _ =>
420- if ((base58'2W' == $match0))
421- then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
422- else if ((base58'2T' == $match0))
423- then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
424- else throw("Unknown chain")
425-}
426-
427459 let profitAddrKey = "profitAddr"
428460
429461 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
430462
431463 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
432464
433-
434-let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
435-
436-let acres2Contract = addressFromStringValue(acres2AddressStr)
437465
438466 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
439467
440468
441469 func getSwapLimitWlgold (addr) = {
442470 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
443471 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
444472 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
445473 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
446474 min([currentLimit, defaultLimit])
447475 }
448476
449477
450478 func claimInternal2 (addr) = {
451479 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
452480 let userTimeKey = keyLastClaimTimeByUser(addr)
453481 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
454482 let userEffTime = curStats[ixWlgEffUserTime]
455483 if ((lastUserTime == userEffTime))
456484 then $Tuple2(nil, 0)
457485 else {
458486 let now = lastBlock.timestamp
459487 let issueTime = curStats[ixWlgIssueTime]
460488 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
461489 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
462490 let teamTransfer = if ((teamAmount > 0))
463491 then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
464492 else nil
465493 let actAmountLeft = curStats[ixWlgActAmLeft]
466494 let actAmount = curStats[ixWlgActAmAvailNow]
467495 let actTransfer = if ((actAmount > 0))
468496 then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
469497 else nil
470498 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
471499 let marketingTransfer = if ((marketingAmount > 0))
472500 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
473501 else nil
474502 let userAmount = curStats[ixWlgUserAmAvailNow]
475503 let userKey = keyStakersAmountPaidUser(addr)
476504 let userTotal = (userAmount + curStats[ixWlgUser10part])
477505 let issued10Amount = curStats[ixWlgIssue10Amount]
478506 $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)
479507 }
480508 }
481509
482510
483511 func takeXpInternal (addr,delta) = {
484512 let now = lastBlock.timestamp
485513 let timeKey = keyWlgStakedTimeByUser(addr)
486514 let amountKey = keyWlgStakedAmountByUser(addr)
487515 let lastTime = valueOrElse(getInteger(timeKey), 0)
488516 let oldUser = valueOrElse(getInteger(amountKey), 0)
489517 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
490518 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
491519 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
492520 }
493521
494522
495523 func openChestInternal (addr) = {
496524 let week = (height / WEEK_BLOCKS)
497525 let drawWeek = (week - 1)
498526 let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
499527 let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
500528 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
501529 if ((0 >= userTickets))
502530 then $Tuple2(nil, unit)
503531 else {
504532 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
505533 if ((0 >= weekTickets))
506534 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
507535 else {
508536 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
509537 let salt = fromBase58String(split(valueOrElse(getString(keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
510538 let random = getRandomNumber(weekTickets, salt, entropy)
511539 if (((userTickets * numPrizes) > random))
512540 then {
513541 let issueResult = invoke(acres2Contract, "issueNFT", [addr, IdxDtx1PercGemWinner], nil)
514542 let winners = getString(keyWeekWinners(drawWeek))
515543 let newWinners = if (isDefined(winners))
516544 then ((value(winners) + "_") + addr)
517545 else addr
518546 $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
519547 }
520548 else {
521549 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
522550 let consTickets = fraction(userTickets, random1, 10)
523551 $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek)), IntegerEntry(keyUserWeekTickets(addr, week), consTickets)], consTickets)
524552 }
525553 }
526554 }
527555 }
528556
529557
530558 func claimTicketsInternal (addr,userBetStr) = {
531559 let week = (height / WEEK_BLOCKS)
532560 let ticketsKey = keyUserWeekTickets(addr, week)
533561 let dayBet = split(userBetStr, "_")
534562 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
535563 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
536564 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
537565 then 1
538566 else 0
539567 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
540568 let updateParticipants = if (if ((oldTickets == 0))
541569 then (deltaTickets == 1)
542570 else false)
543571 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
544572 else nil
545573 $Tuple2(if ((deltaTickets == 0))
546574 then nil
547575 else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
548576 }
549577
550578
551579 @Callable(i)
552580 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
553581 then throw("Permission denied")
554582 else if (isDefined(getBinary(wlgAssetIdKey)))
555583 then throw("Already initialized")
556584 else {
557585 let issuedAmount = MILLION6
558586 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
559587 let assetId = calculateAssetId(issue)
560588 [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)]
561589 }
562590
563591
564592
565593 @Callable(i)
566594 func constructorV2 (rest2Addr) = if ((i.caller != this))
567595 then throw("Permission denied")
568596 else [StringEntry(keyRest2Address(), rest2Addr)]
569597
570598
571599
572600 @Callable(i)
573601 func buyWlg (minToReceive) = {
574602 let prologResult = prolog2()
575603 if ((prologResult == prologResult))
576604 then if ((size(i.payments) != 1))
577605 then throw("exactly 1 payment must be attached")
578606 else {
579607 let pmt = i.payments[0]
580608 let usdtAmt = pmt.amount
581609 if (if (!(isDefined(pmt.assetId)))
582610 then true
583611 else (value(pmt.assetId) != usdtAssetId))
584612 then throw("USDT payments only!")
585613 else {
586614 let caller = i.caller
587615 let addr = toString(caller)
588616 if ((MINSHOPPAYMENT > usdtAmt))
589617 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
590618 else {
591619 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
592620 let curWlgAmount = curStats[ixWlgAmount]
593621 let wlgPrice = curStats[ixWlgPrice]
594622 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
595623 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
596624 let maxWlg = getSwapLimitWlgold(addr)
597625 if ((wlgAmount > maxWlg))
598626 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
599627 else if ((minToReceive > wlgAmount))
600628 then throw("Price changed during operation, please try again")
601629 else {
602630 let profitAmount = (usdtAmt / 6)
603631 $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)
604632 }
605633 }
606634 }
607635 }
608636 else throw("Strict value is not equal to itself.")
609637 }
610638
611639
612640
613641 @Callable(i)
614642 func buyWlgREADONLY (address,usdtAmt) = {
615643 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
616644 let wlgPrice = curStats[ixWlgPrice]
617645 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
618646 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
619647 let maxWlg = getSwapLimitWlgold(address)
620648 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
621649 let profitAmount = (usdtAmt / 6)
622650 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
623651 }
624652
625653
626654
627655 @Callable(i)
628656 func sellWlg (minAmount) = {
629657 let prologResult = prolog2()
630658 if ((prologResult == prologResult))
631659 then if ((size(i.payments) != 1))
632660 then throw("exactly 1 payment must be attached")
633661 else {
634662 let pmt = i.payments[0]
635663 let wlgAmt = pmt.amount
636664 let caller = i.caller
637665 let addr = toString(caller)
638666 let maxWlg = getSwapLimitWlgold(addr)
639667 if ((wlgAmt > maxWlg))
640668 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
641669 else if (if (!(isDefined(pmt.assetId)))
642670 then true
643671 else (value(pmt.assetId) != wlgAssetId))
644672 then throw("WLGOLD payments only!")
645673 else {
646674 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
647675 let curWlgAmount = curStats[ixWlgAmount]
648676 let sellPrice = (curStats[ixWlgPrice] / 2)
649677 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
650678 if ((MINSHOPPAYMENT > usdtAmt))
651679 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
652680 else if ((minAmount > usdtAmt))
653681 then throw("Price changed during operation, please try again")
654682 else {
655683 let profitAmount = (usdtAmt / 5)
656684 $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)
657685 }
658686 }
659687 }
660688 else throw("Strict value is not equal to itself.")
661689 }
662690
663691
664692
665693 @Callable(i)
666694 func sellWlgREADONLY (address,wlgAmt) = {
667695 let maxWlg = getSwapLimitWlgold(address)
668696 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
669697 let sellPrice = (curStats[ixWlgPrice] / 2)
670698 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
671699 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
672700 let profitAmount = (usdtAmt / 5)
673701 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
674702 }
675703
676704
677705
678706 @Callable(i)
679707 func claim () = {
680708 let prologResult = prolog2()
681709 if ((prologResult == prologResult))
682710 then if ((size(i.payments) != 0))
683711 then throw("No payments required")
684712 else {
685- let $t01402714096 = claimInternal2(toString(i.caller))
686- let actions = $t01402714096._1
687- let wlgClaimedAmount = $t01402714096._2
713+ let $t01404514114 = claimInternal2(toString(i.caller))
714+ let actions = $t01404514114._1
715+ let wlgClaimedAmount = $t01404514114._2
688716 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
689717 }
690718 else throw("Strict value is not equal to itself.")
691719 }
692720
693721
694722
695723 @Callable(i)
696724 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
697725 then (i.caller != acresContract)
698726 else false)
699727 then (i.caller != acres2Contract)
700728 else false)
701729 then throw("Permission denied")
702730 else {
703- let $t01441514469 = claimInternal2(addr)
704- let actions = $t01441514469._1
705- let wlgClaimedAmount = $t01441514469._2
731+ let $t01443314487 = claimInternal2(addr)
732+ let actions = $t01443314487._1
733+ let wlgClaimedAmount = $t01443314487._2
706734 $Tuple2(if ((wlgClaimedAmount > 0))
707735 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
708736 else actions, wlgClaimedAmount)
709737 }
710738
711739
712740
713741 @Callable(i)
714742 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
715743 then throw("Permission denied")
716744 else {
717745 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
718746 if ((wlgAmt > curStats[ixWlgWlg]))
719747 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
720748 else {
721749 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
722750 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
723751 }
724752 }
725753
726754
727755
728756 @Callable(i)
729757 func betForTicket (bet) = {
730758 let prologResult = prolog2()
731759 if ((prologResult == prologResult))
732760 then if ((size(i.payments) != 0))
733761 then throw("No payments required")
734- else if (((bet / 4) != 0))
735- then throw("Invalid bet: should be 0..3")
736- else {
737- let moment = (height % DAY_BLOCKS)
738- if ((moment > (DAY_BLOCKS - 3)))
739- then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
762+ else {
763+ let addr = toString(i.caller)
764+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
765+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
766+ let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
767+ if (if ((userTickets > 0))
768+ then (weekTickets > 0)
769+ else false)
770+ then throw("Please open the chest first")
771+ else if (((bet / 4) != 0))
772+ then throw("Invalid bet: should be 0..3")
740773 else {
741- let addr = toString(i.caller)
742- let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
743- let lvl = getLevelByAcres(stakedAcres)
744- if ((lvl == 0))
745- then throw("You need to stake some ACRES to bet")
774+ let moment = (height % DAY_BLOCKS)
775+ if ((moment > (DAY_BLOCKS - 3)))
776+ then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
746777 else {
747- let tomorrow = ((height / DAY_BLOCKS) + 1)
748- let betKey = keyUserBet(addr)
749- let oldUserBetStr = getString(betKey)
750- let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
751- if (isDefined(oldUserBetStr))
752- then {
753- let userBet = value(oldUserBetStr)
754- if ((split(userBet, "_")[0] == toString(tomorrow)))
755- then throw("You already bet for tomorrow")
756- else {
757- let r = claimTicketsInternal(addr, userBet)
758- $Tuple2((r._1 :+ newBetEntry), r._2)
778+ let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
779+ let lvl = getLevelByAcres(stakedAcres)
780+ if ((lvl == 0))
781+ then throw("You need to stake some ACRES to bet")
782+ else {
783+ let tomorrow = ((height / DAY_BLOCKS) + 1)
784+ let betKey = keyUserBet(addr)
785+ let oldUserBetStr = getString(betKey)
786+ let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
787+ if (isDefined(oldUserBetStr))
788+ then {
789+ let userBet = value(oldUserBetStr)
790+ if ((split(userBet, "_")[0] == toString(tomorrow)))
791+ then throw("You already bet for tomorrow")
792+ else {
793+ let r = claimTicketsInternal(addr, userBet)
794+ $Tuple2((r._1 :+ newBetEntry), r._2)
795+ }
759796 }
797+ else $Tuple2([newBetEntry], 0)
760798 }
761- else $Tuple2([newBetEntry], 0)
762799 }
763800 }
764- }
801+ }
765802 else throw("Strict value is not equal to itself.")
766803 }
767804
768805
769806
770807 @Callable(i)
771808 func takeWlgXp (addr) = if ((i.caller != stakingContract))
772809 then throw("Permission denied")
773810 else {
774- let $t02237922422 = takeXpInternal(addr, 0)
775- let actions = $t02237922422._1
776- let xp = $t02237922422._2
811+ let $t01708717130 = takeXpInternal(addr, 0)
812+ let actions = $t01708717130._1
813+ let xp = $t01708717130._2
777814 $Tuple2(actions, xp)
778815 }
779816
780817
781818
782819 @Callable(i)
783820 func checkWlgXpREADONLY (addr) = {
784- let $t02249922547 = takeXpInternal(addr, 0)
785- let ignored = $t02249922547._1
786- let deltaXP = $t02249922547._2
821+ let $t01720717255 = takeXpInternal(addr, 0)
822+ let ignored = $t01720717255._1
823+ let deltaXP = $t01720717255._2
787824 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
788825 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
789826 $Tuple2(nil, (lvlPoints :+ newXP))
790827 }
791828
792829
793830
794831 @Callable(i)
795832 func setNumPrizes (numPrizes) = if ((i.caller != this))
796833 then throw("Permission denied")
797834 else {
798835 let week = (height / WEEK_BLOCKS)
799836 $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
800837 }
801838
802839
803840
804841 @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")
810- else {
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)
817- }
818- else throw("Strict value is not equal to itself.")
819- }
842+func openChest () = if (!(KS_ALLOW_NFT_DRAW))
843+ then throw("Temporarily disabled")
844+ else {
845+ let prologResult = prolog2()
846+ if ((prologResult == prologResult))
847+ then if ((size(i.payments) != 0))
848+ then throw("No payments required")
849+ else {
850+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
851+ let addr = toString(i.caller)
852+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
853+ if ((0 >= userTickets))
854+ then throw("No gems to open the chest")
855+ else openChestInternal(addr)
856+ }
857+ else throw("Strict value is not equal to itself.")
858+ }
820859
821860

github/deemru/w8io/026f985 
447.26 ms