tx · 2Pj5cNtS4v2SiQTCvBSjytfm29PzwQgnhpREi4A87och

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.02800000 Waves

2023.12.12 22:17 [3949750] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "2Pj5cNtS4v2SiQTCvBSjytfm29PzwQgnhpREi4A87och", "fee": 2800000, "feeAssetId": null, "timestamp": 1702408622129, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "5ieda9SDGPo9meZL2abYL3Kh6mGM4WPpi6KLQBn83uj6x5Giz8sajdSCkm4hUvyNR7BHNmtNWSyhJK3ZgRstndY1" ], "script": "base64:BgJmCAISABIDCgEIEgMKAQgSAwoBCBIECgIBCBIECgIBCBIDCgEIEgMKAQgSBAoCCAgSABIFCgMIAQESAwoBCBIAEgASABIECgIICBIFCgMICAESAwoBARIKCggBCAEECAEBARIDCgEBRgEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwEYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzARRzdGF0aWNLZXlfZWdnQXNzZXRJZAACEXN0YXRpY19lZ2dBc3NldElkARpzdGF0aWNLZXlfdHJ1c3RlZENvbnRyYWN0cwACF3N0YXRpY190cnVzdGVkQ29udHJhY3RzARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAAhVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwACG3N0YXRpY190dXJ0bGVSZWJpcnRoQWRkcmVzcwEWc3RhdGljS2V5X3BpcGVsaW5lVXNlcgACE3N0YXRpY19waXBlbGluZVVzZXIBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEbc3RhdGljS2V5X2h1bnREaXN0cm9BZGRyZXNzAAIYc3RhdGljX2h1bnREaXN0cm9BZGRyZXNzARJzdGF0aWNLZXlfd2Fyc1BLZXkAAg9zdGF0aWNfd2Fyc1BLZXkBF3N0YXRpc0tleV9kdXBsaWNhdG9yRmVlAAIUc3RhdGljX2R1cGxpY2F0b3JGZWUBEWtleV9hcnRlZmFjdE93bmVyAgxhcnRlZmFjdE5hbWUFb3duZXIJAKwCAgkArAICCQCsAgIFDGFydGVmYWN0TmFtZQIBXwUFb3duZXICBl9vd25lcgERa2V5X3Vuc3Rha2VIZWlnaHQCDGFydGVmYWN0TmFtZQphcnRlZmFjdElkCQCsAgIJAKwCAgkArAICBQxhcnRlZmFjdE5hbWUCAV8FCmFydGVmYWN0SWQCD191bnN0YWtlX2hlaWdodAEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQZkdWNrSWQJAKwCAgUGZHVja0lkAhRfZHVja19leHRlcm5hbF9ib29zdAEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCFF91c2VyX2V4dGVybmFsX2Jvb3N0ARFrZXlfcHJpY2VDb3NtZXRpYwEEaXRlbQkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtARRrZXlfbWF4U2FsZXNDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CCl9tYXhfc2FsZXMBEGtleV9zYWxlQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgVfc2FsZQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CC19wcmljZUFzc2V0ARprZXlfZ3Jvd1BlcmNlbnRhZ2VDb3NtZXRpYwEEaXRlbQkArAICCQCsAgICEGRpcmVjdF9jb3NtZXRpY18FBGl0ZW0CE19ncm93aW5nX3BlcmNlbnRhZ2UBEGtleV9zb2xkQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgVfc29sZAEVa2V5X2xhc3RQcmljZUNvc21ldGljAQRpdGVtCQCsAgIJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQILX2xhc3RfcHJpY2UBE2tleV9zdGFydFRzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAghfc3RhcnRUcwERa2V5X2VuZFRzQ29zbWV0aWMBBGl0ZW0JAKwCAgkArAICAhBkaXJlY3RfY29zbWV0aWNfBQRpdGVtAgZfZW5kVHMBF2tleV9wcm9jZXNzRmluaXNoSGVpZ2h0AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAIDX2ZoARhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAhVzdGF0aWNfY291cG9uc0FkZHJlc3MACmRldkFkZHJlc3MBGgFXF3fYQk8hOgpGT8vir4YiaxOc51un3nx7AAplZ2dzTmVlZGVkCQBoAgADAIDC1y8ADmFydGVmYWN0c0xpbWl0CQBkAgCtAgDYBAAJZnJlZUdlbmVzCQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGCQDMCAICAUcJAMwIAgIBSAkAzAgCAgFJBQNuaWwADG9sZEFydGVmYWN0cwkAzAgCAghBUlQtTEFLRQkAzAgCAglBUlQtSE9VU0UJAMwIAgIMQVJULUJJR0hPVVNFCQDMCAICC0FSVC1GSVhHRU5FCQDMCAICDEFSVC1GUkVFR0VORQkAzAgCAgpBUlQtTUlSUk9SCQDMCAICCEFSVC1QT01QCQDMCAICCEFSVC1DQVBFCQDMCAICB0FSVC1IQVQJAMwIAgIOQVJULUNVU1RPTURVQ0sFA25pbAAJYXJ0ZWZhY3RzCQDMCAICCkFSVC1YTUlTVEwJAMwIAgIIQVJULVhIQVQJAMwIAgIKQVJULVhTQ0FSRgkAzAgCAgxBUlQtWFNXRUFURVIJAMwIAgIJQVJULVhTT0NLCQDMCAICCUFSVC1YVFJFRQUDbmlsAAthbGxBcnRlZmFjdAkAzggCBQlhcnRlZmFjdHMFDG9sZEFydGVmYWN0cwAIYm9vc3RlcnMJAMwIAgIKQVJULVRJTlNFTAkAzAgCAgpBUlQtRkVFRDEwCQDMCAICDkFSVC1HTkdSX0JSRUFECQDMCAICDEFSVC1TTk9XQkFMTAkAzAgCAg5BUlQtR0lGVF9ET1VCTAUDbmlsAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQMZmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBQxmaW5pc2hIZWlnaHQAAQQKcmFuZG9tSGFzaAkA9wMBCQDLAQIJAMsBAgEEHEF95gUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBEWdldFJhbmRvbUFydGVmYWN0AgVib3hJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCWFydGVmYWN0cwUFYm94SWQFAWgAAQkAkQMCBQlhcnRlZmFjdHMFDHJhbmRvbU51bWJlcgEOZ2V0UmFuZG9tR2VuZXMCBHR4SWQBaAQMcmFuZG9tTnVtYmVyCQEPZ2V0UmFuZG9tTnVtYmVyBAkAkAMBBQlmcmVlR2VuZXMFBHR4SWQFAWgAAgkAkQMCBQlmcmVlR2VuZXMFDHJhbmRvbU51bWJlcgEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARNnZXRUcnVzdGVkQ29udHJhY3RzAAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARpzdGF0aWNLZXlfdHJ1c3RlZENvbnRyYWN0cwABEWdldFJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfdHVydGxlUmViaXJ0aEFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAARRnZXRIdW50RGlzdHJvQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBG3N0YXRpY0tleV9odW50RGlzdHJvQWRkcmVzcwABC2dldFdhcnNQS2V5AAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV93YXJzUEtleQABEGdldER1cGxpY2F0b3JGZWUACQENdHJ5R2V0SW50ZWdlcgEJARdzdGF0aXNLZXlfZHVwbGljYXRvckZlZQABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBGl0ZW0EA2tleQkBEWtleV9wcmljZUNvc21ldGljAQUEaXRlbQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQkArAICCQCsAgICCElUR0NJUDogBQRpdGVtAh8gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUhAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQ5tYW5pcHVsYXRlTmFtZQMJYXNzZXROYW1lCHBvc2l0aW9uBGNoYXIJAKwCAgkArAICCQCvAgIFCWFzc2V0TmFtZQkAZQIFCHBvc2l0aW9uAAEFBGNoYXIJALICAgUJYXNzZXROYW1lCQBlAgAQBQhwb3NpdGlvbgEQaXRlbUlzSW5Db29sRG93bgIMYXJ0ZWZhY3ROYW1lCmFydGVmYWN0SWQEEXVuc3Rha2VIZWlnaHRMYXN0CQENdHJ5R2V0SW50ZWdlcgEJARFrZXlfdW5zdGFrZUhlaWdodAIFDGFydGVmYWN0TmFtZQUKYXJ0ZWZhY3RJZAQOY29vbGRvd25QZXJpb2QA8AEDCQBmAgUGaGVpZ2h0CQBkAgURdW5zdGFrZUhlaWdodExhc3QFDmNvb2xkb3duUGVyaW9kBwYBCWlzVGVzdEVudgAJAQ10cnlHZXRCb29sZWFuAQIHVEVTVEVOVgEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxXQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsAQlpc3N1ZUl0ZW0DBHR5cGUFbm9uY2UHYWRkcmVzcwQIYXJ0ZWZhY3QJAMMIBwUEdHlwZQIhTkZUIGFydGVmYWN0IG9mIFdhdmVzIER1Y2tzIGdhbWUuAAEAAAcFBHVuaXQFBW5vbmNlBAphcnRlZmFjdElkCQC4CAEFCGFydGVmYWN0CQCUCgIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUEdHlwZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQFA25pbAkA2AQBBQphcnRlZmFjdElkAQppdGVtTWVyZ2VyCQhiYXNlSXRlbQ5hbW91bnRCYXNlSXRlbQdlbmRJdGVtCHBheW1lbnRzCWZlZUFtb3VudApmZWVBc3NldElkCXJlY2lwaWVudA1pbnN0YW50RmluaXNoBHR4SWQDCQECIT0CCQCQAwEFCHBheW1lbnRzCQBkAgUOYW1vdW50QmFzZUl0ZW0AAQkAAgEJAKwCAgkArAICAhNJSUQ6IFBsZWFzZSBhdHRhY2ggCQCkAwEJAGQCBQ5hbW91bnRCYXNlSXRlbQACAgogcGF5bWVudHMhCgEKaXNCYXNlSXRlbQILYWNjdW11bGF0ZWQDcGF5BAdhc3NldElkCQEFdmFsdWUBCAUDcGF5B2Fzc2V0SWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkAAAIFCGFydGVmYWN0BQhiYXNlSXRlbQkAlAoCCQDOCAIIBQthY2N1bXVsYXRlZAJfMQkAzAgCCQEEQnVybgIFB2Fzc2V0SWQAAQUDbmlsCQBkAggFC2FjY3VtdWxhdGVkAl8yAAEJAJQKAggFC2FjY3VtdWxhdGVkAl8xCQBkAggFC2FjY3VtdWxhdGVkAl8yAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDXRvdGFsQmFzZUl0ZW0KAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQppc0Jhc2VJdGVtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA4CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAMJAQIhPQIIBQ10b3RhbEJhc2VJdGVtAl8yBQ5hbW91bnRCYXNlSXRlbQkAAgEJAKwCAgkArAICCQCsAgICE0lJRDogUGxlYXNlIGF0dGFjaCAJAKQDAQUOYW1vdW50QmFzZUl0ZW0CEyBhcnRlZmFjdHMgb2YgdHlwZSAFCGJhc2VJdGVtBApmZWVQYXltZW50CQCRAwIFCHBheW1lbnRzBQ5hbW91bnRCYXNlSXRlbQMJAQIhPQIIBQpmZWVQYXltZW50B2Fzc2V0SWQFCmZlZUFzc2V0SWQJAAIBAiVJSUQ6IFlvdSBtaXNzIGEgcGF5bWVudCB3aXRoIHRoZSBmZWUhAwkBAiE9AggFCmZlZVBheW1lbnQGYW1vdW50BQlmZWVBbW91bnQJAAIBAi9JSUQ6IFlvdSBkaWQgbm90IGF0dGFjaCB0aGUgY29ycmVjdCBmZWUgYW1vdW50IQQIYXJ0ZWZhY3QJAMMIBwUHZW5kSXRlbQkArAICAiJORlQgYXJ0ZWZhY3Qgb2YgV2F2ZXMgRHVja3MgZ2FtZTogBQdlbmRJdGVtAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAQHaW5zdGFudAMFDWluc3RhbnRGaW5pc2gJAQlpc3N1ZUl0ZW0DBQdlbmRJdGVtAAAFCXJlY2lwaWVudAkAlAoCBQNuaWwCAAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIIX2luc3RhbnQFDWluc3RhbnRGaW5pc2gJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQlmZWVBbW91bnQIBQpmZWVQYXltZW50B2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIHX3Jld2FyZAUHZW5kSXRlbQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBm1lcmdlXwUEdHhJZAIJX2ZpbmlzaGVkCQEBIQEFDWluc3RhbnRGaW5pc2gFA25pbAgFB2luc3RhbnQCXzEIBQ10b3RhbEJhc2VJdGVtAl8xCAUHaW5zdGFudAJfMgERZ2V0QW1vdW50QmFzZUl0ZW0BCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIHX2Ftb3VudAEKZ2V0RW5kSXRlbQEIYmFzZUl0ZW0JARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgkArAICAgZtZXJnZV8FCGJhc2VJdGVtAghfZW5kSXRlbQEIZ2V0UHJpY2UBCGJhc2VJdGVtCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX3ByaWNlAQpnZXRJbnN0YW50AQhiYXNlSXRlbQkBEUBleHRyTmF0aXZlKDEwNTYpAQkArAICCQCsAgICBm1lcmdlXwUIYmFzZUl0ZW0CCF9pbnN0YW50AQhnZXRBc3NldAEIYmFzZUl0ZW0EBWFzc2V0CQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgIGbWVyZ2VfBQhiYXNlSXRlbQIGX2Fzc2V0AwkAAAIFBWFzc2V0AgVXQVZFUwUEdW5pdAkA2QQBBQVhc3NldAEOdXNlckV4cGVyaWVuY2UBBHVzZXIJAKwCAgUEdXNlcgILX2V4cGVyaWVuY2UBGWZpbmlzaFNoYWtlSXRCYWJ5SW50ZXJuYWwDBmluaXRUeAdhZGRyZXNzB3BheW1lbnQEB2V4cFVzZXIJARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCCQERZ2V0Q291cG9uc0FkZHJlc3MACQEOdXNlckV4cGVyaWVuY2UBBQdhZGRyZXNzBAptdWx0aXBsaWVyCQCXAwEJAMwIAgkAZAIJAGkCBQdleHBVc2VyAGQAAQkAzAgCAAYFA25pbAQGZmluaXNoCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfZmluaXNoQmxvY2sDCQBmAgUGZmluaXNoBQZoZWlnaHQJAAIBAilQbGVhc2Ugd2FpdCB0aWxsIHRoZSBzaGFraW5nIGlzIGZpbmlzaGVkIQoBCmhhbmRsZU1pbnQCA2FjYwVpbmRleAMJAGcCBQptdWx0aXBsaWVyBQVpbmRleAQOcmFuZG9tUG9zaXRpb24JAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCGJvb3N0ZXJzCQDZBAEFBmluaXRUeAUGZmluaXNoBQVpbmRleAkAzggCBQNhY2MICQEJaXNzdWVJdGVtAwkAkQMCBQhib29zdGVycwUOcmFuZG9tUG9zaXRpb24JAGUCBQVpbmRleAABCQERQGV4dHJOYXRpdmUoMTA2MikBBQdhZGRyZXNzAl8xBQNhY2MKAAIkbAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpoYW5kbGVNaW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGFAFpARBzdGFydFNoYWtlSXRCYWJ5AAQLaXRlbVBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQQLaXRlbUFzc2V0SWQJANgEAQkBBXZhbHVlAQgFC2l0ZW1QYXltZW50B2Fzc2V0SWQDCQECIT0CCAULaXRlbVBheW1lbnQGYW1vdW50AAEJAAIBAh1JSUQ6IEl0ZW0gTkZUIGlzIG5vdCBhdHRhY2hlZAQNZ2xvYmVBcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQtpdGVtQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUNZ2xvYmVBcnRlZmFjdAUNZ2xvYmVBcnRlZmFjdAMJAQIhPQIFDWdsb2JlQXJ0ZWZhY3QCDUFSVC1TTldfR0xCRVMJAAIBAjBJSUQ6IFlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1TTldfR0xCRVMgYXJ0ZWZhY3QEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAZpbml0VHgJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQtpdGVtUGF5bWVudAdhc3NldElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCDF9maW5pc2hCbG9jawkAZAIFBmhlaWdodAACCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBG9wZW4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX2Fzc2V0SWQFC2l0ZW1Bc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZmluaXNoU2hha2VJdEJhYnkBBmluaXRUeAkBGWZpbmlzaFNoYWtlSXRCYWJ5SW50ZXJuYWwDBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAABaQEPaW5zdGFuTWVyZ2VJdGVtAQhiYXNlSXRlbQMJAQIhPQIFCGJhc2VJdGVtAgpBUlQtS0FUQU5BCQACAQIfSUlEOiBPbmx5IEthdGFuYSBjYW4gYmUgbWVyZ2VkIQQGcGFyYW1zCQCXCgUJARFnZXRBbW91bnRCYXNlSXRlbQEFCGJhc2VJdGVtCQEKZ2V0RW5kSXRlbQEFCGJhc2VJdGVtCQEIZ2V0UHJpY2UBBQhiYXNlSXRlbQkBCGdldEFzc2V0AQUIYmFzZUl0ZW0JAQpnZXRJbnN0YW50AQUIYmFzZUl0ZW0JAQppdGVtTWVyZ2VyCQUIYmFzZUl0ZW0IBQZwYXJhbXMCXzEIBQZwYXJhbXMCXzIIBQFpCHBheW1lbnRzCAUGcGFyYW1zAl8zCAUGcGFyYW1zAl80CAUBaQZjYWxsZXIIBQZwYXJhbXMCXzUJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAFpAQ1kaXJlY3RCdXlJdGVtAQhpdGVtTmFtZQQJYmFzZVByaWNlCQEXdHJ5R2V0Q29zbWV0aWNJdGVtUHJpY2UBBQhpdGVtTmFtZQQEZ3JvdwkBDXRyeUdldEludGVnZXIBCQEaa2V5X2dyb3dQZXJjZW50YWdlQ29zbWV0aWMBBQhpdGVtTmFtZQQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETa2V5X3N0YXJ0VHNDb3NtZXRpYwEFCGl0ZW1OYW1lBAVlbmRUcwkBDXRyeUdldEludGVnZXIBCQERa2V5X2VuZFRzQ29zbWV0aWMBBQhpdGVtTmFtZQMDCQECIT0CBQdzdGFydFRzAAAJAGYCBQdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcJAAIBAiFJREJJOiBUaGUgc2FsZSBkaWQgbm90IHN0YXJ0IHlldCEDAwkBAiE9AgUFZW5kVHMAAAkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQVlbmRUcwcJAAIBAiRJREJJOiBUaGUgc2FsZSBoYXMgYWxyZWFkeSBmaW5pc2hlZCEDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQkAAgEJAKwCAgIfSURCSTogSXRlbSBub3QgZm9yIHNhbGUgYW55bW9yZQkBEGtleV9zYWxlQ29zbWV0aWMBBQhpdGVtTmFtZQQNbWF4U2FsZXNWYWx1ZQkBDXRyeUdldEludGVnZXIBCQEUa2V5X21heFNhbGVzQ29zbWV0aWMBBQhpdGVtTmFtZQQJc29sZFZhbHVlCQENdHJ5R2V0SW50ZWdlcgEJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUEBXByaWNlAwkAAAIFBGdyb3cAAAUJYmFzZVByaWNlCQBkAgUJYmFzZVByaWNlCQBoAgkAaQIFCWJhc2VQcmljZQBkCQBoAgUJc29sZFZhbHVlBQRncm93AwMJAQIhPQIFDW1heFNhbGVzVmFsdWUAAAkAZwIFCXNvbGRWYWx1ZQUNbWF4U2FsZXNWYWx1ZQcJAAIBAhhJREJJOiBNYXggZWRpdGlvbnMgc29sZCEEB2Fzc2V0SWQDCQAAAgkBDHRyeUdldFN0cmluZwEJARZrZXlfcHJpY2VBc3NldENvc21ldGljAQUIaXRlbU5hbWUCAAkBDWdldEVnZ0Fzc2V0SWQAAwkAAAIJAQx0cnlHZXRTdHJpbmcBCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFCGl0ZW1OYW1lAgVXQVZFUwUEdW5pdAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBFmtleV9wcmljZUFzc2V0Q29zbWV0aWMBBQhpdGVtTmFtZQQTYW1vdW50UGFpZEJ5Q291cG9ucwAABAlsZWZ0VG9QYXkJAGUCBQVwcmljZQUTYW1vdW50UGFpZEJ5Q291cG9ucwQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmFtb3VudAgFDGZpcnN0UGF5bWVudAZhbW91bnQDCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFB2Fzc2V0SWQJAAIBAjpJREJJOiBZb3UgY2FuIGF0dGFjaCBvbmx5IHRva2VucyB3aXRoIHRoZSBjb3JyZWN0IHBheW1lbnQgAwkBAiE9AgUGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgICKklEQkk6IFBsZWFzZSBhdHRhY2ggdGhlIGV4YWN0IGFzc2V0IGFtb3VudAkApAMBBQVwcmljZQQHdHhJZFN0cgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIECGFydGVmYWN0CQDDCAcFCGl0ZW1OYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFCGl0ZW1OYW1lAAEAAAcFBHVuaXQAAAQKYXJ0ZWZhY3RJZAkAuAgBBQhhcnRlZmFjdAkAlAoCCQDOCAIJAMwIAgUIYXJ0ZWZhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICCWFydGVmYWN0XwkA2AQBBQphcnRlZmFjdElkAgVfdHlwZQUIaXRlbU5hbWUJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlfbGFzdFByaWNlQ29zbWV0aWMBBQhpdGVtTmFtZQUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlfc29sZENvc21ldGljAQUIaXRlbU5hbWUJAGQCBQlzb2xkVmFsdWUAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzAAEFCmFydGVmYWN0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQZhbW91bnQFB2Fzc2V0SWQFA25pbAUMdmFsaWRQYXltZW50CQDYBAEFCmFydGVmYWN0SWQBaQEPbWFuaXB1bGF0ZUJvb3N0AgVib29zdAZkdWNrSWQEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNElNQjogVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEA2tleQkBFWtleV9leHRlcm5hbEJvb3N0RHVjawEFBmR1Y2tJZAQLYWN0aXZlQm9vc3QJAQ10cnlHZXRJbnRlZ2VyAQUDa2V5BAhuZXdCb29zdAkAZAIFC2FjdGl2ZUJvb3N0BQVib29zdAMJAGYCAAAFCG5ld0Jvb3N0CQACAQJASU1COiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFm1hbmlwdWxhdGVCb29zdEFjY291bnQCBWJvb3N0B2FkZHJlc3MEEGFsbG93ZWRDb250cmFjdHMJARNnZXRUcnVzdGVkQ29udHJhY3RzAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQAAAgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUKZGFwcFRvQ2FsbAUEdW5pdAkAAgECNUlNQkE6IFRoaXMgc21hcnQgY29udHJhY3QgY2FuJ3QgbWFuaXB1bGF0ZSB0aGUgYm9vc3QhBANrZXkJARhrZXlfZXh0ZXJuYWxCb29zdEFkZHJlc3MBBQdhZGRyZXNzBAthY3RpdmVCb29zdAkBDXRyeUdldEludGVnZXIBBQNrZXkECG5ld0Jvb3N0CQBkAgULYWN0aXZlQm9vc3QFBWJvb3N0AwkAZgIAAAUIbmV3Qm9vc3QJAAIBAkFJTUJBOiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGJvb3N0LCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zIQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQhuZXdCb29zdAUDbmlsAWkBFGNoZWNrQXJ0ZWZhY3REZXRhaWxzAQdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQECWFzc2V0TmFtZQkBBXZhbHVlAQgFBWFzc2V0BG5hbWUDAwMJAQ9jb250YWluc0VsZW1lbnQCBQthbGxBcnRlZmFjdAUJYXNzZXROYW1lBgkBCWlzRGVmaW5lZAEJARd0cnlHZXRDb3NtZXRpY0l0ZW1QcmljZQEFCWFzc2V0TmFtZQkAAAIIBQVhc3NldAZpc3N1ZXIFBHRoaXMHCQCUCgIFA25pbAUJYXNzZXROYW1lCQACAQIQSW52YWxpZCBhcnRlZmFjdAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEaY2FsY3VsYXRlRmFybWluZ1Bvd2VyQm9vc3QCBmR1Y2tJZAdhZGRyZXNzBBFleHRlcm5hbEJvb3N0RHVjawkBDXRyeUdldEludGVnZXIBCQEVa2V5X2V4dGVybmFsQm9vc3REdWNrAQUGZHVja0lkBBRleHRlcm5hbEJvb3N0QWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEYa2V5X2V4dGVybmFsQm9vc3RBZGRyZXNzAQUHYWRkcmVzcwQKdG90YWxCb29zdAkAZAIFEWV4dGVybmFsQm9vc3REdWNrBRRleHRlcm5hbEJvb3N0QWRkcmVzcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmR1Y2tJZAILX2xhc3RfYm9vc3QFCnRvdGFsQm9vc3QFA25pbAUKdG90YWxCb29zdAFpAQ5pdGVtRHVwbGljYXRvcgADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAQJAAIBAh9JSUQ6IFRocmVlIHBheW1lbnRzIGFyZSBuZWVkZWQhBBFkdXBsaWNhdG9yUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAtpdGVtUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAplZ2dQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAIEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAMEEWR1cGxpY2F0b3JBc3NldElkCQDYBAEJAQV2YWx1ZQEIBRFkdXBsaWNhdG9yUGF5bWVudAdhc3NldElkAwkBAiE9AggFEWR1cGxpY2F0b3JQYXltZW50BmFtb3VudAABCQACAQIjSUlEOiBEdXBsaWNhdG9yIE5GVCBpcyBub3QgYXR0YWNoZWQEC2l0ZW1Bc3NldElkCQDYBAEJAQV2YWx1ZQEIBQtpdGVtUGF5bWVudAdhc3NldElkAwkBAiE9AggFC2l0ZW1QYXltZW50BmFtb3VudAABCQACAQIdSUlEOiBJdGVtIE5GVCBpcyBub3QgYXR0YWNoZWQECmVnZ0Fzc2V0SWQJAQV2YWx1ZQEIBQplZ2dQYXltZW50B2Fzc2V0SWQDCQECIT0CBQplZ2dBc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBAhhJSUQ6IFBsZWFzZSBhdHRhY2ggZWdncyEDCQBmAgkBEGdldER1cGxpY2F0b3JGZWUACAUKZWdnUGF5bWVudAZhbW91bnQJAAIBCQCsAgICRUlJRDogdG8gZHVwbGljYXRlIGFuIGl0ZW1zIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIGVnZ2xldHM6IAkApAMBCQEQZ2V0RHVwbGljYXRvckZlZQAEEmR1cGxpY2F0b3JBcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBRFkdXBsaWNhdG9yQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUSZHVwbGljYXRvckFydGVmYWN0BRJkdXBsaWNhdG9yQXJ0ZWZhY3QDCQECIT0CBRJkdXBsaWNhdG9yQXJ0ZWZhY3QCDkFSVC1JVEVNX0RVUExJCQACAQIxSUlEOiBZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtSVRFTV9EVVBMSSBhcnRlZmFjdAQMYXJ0ZWZhY3ROYW1lCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFC2l0ZW1Bc3NldElkBQNuaWwFA25pbAMJAAACBQxhcnRlZmFjdE5hbWUFDGFydGVmYWN0TmFtZQQIYXJ0ZWZhY3QJAMMIBwUMYXJ0ZWZhY3ROYW1lCQCsAgICIk5GVCBhcnRlZmFjdCBvZiBXYXZlcyBEdWNrcyBnYW1lOiAFDGFydGVmYWN0TmFtZQABAAAHBQR1bml0AAAECmFydGVmYWN0SWQJALgIAQUIYXJ0ZWZhY3QJAJQKAgkAzggCCQDMCAIFCGFydGVmYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAglhcnRlZmFjdF8JANgEAQUKYXJ0ZWZhY3RJZAIFX3R5cGUFDGFydGVmYWN0TmFtZQkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBRFkdXBsaWNhdG9yUGF5bWVudAdhc3NldElkAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkMb3JpZ2luQ2FsbGVyAAEIBQtpdGVtUGF5bWVudAdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpDG9yaWdpbkNhbGxlcgABBQphcnRlZmFjdElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAgFCmVnZ1BheW1lbnQGYW1vdW50CAUKZWdnUGF5bWVudAdhc3NldElkBQNuaWwFDHZhbGlkUGF5bWVudAkA2AQBBQphcnRlZmFjdElkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWZpeGVkR2VuZQMHdHhJZFN0cg9wYXJlbnRGaXhlZEdlbmURcG9zaXRpb25GaXhlZEdlbmUEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwABBAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCC0FSVC1GSVhHRU5FCQACAQIpWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUZJWEdFTkUgYXJ0ZWZhY3QEBHR4SWQJANkEAQUHdHhJZFN0cgQPZmluaXNoSGVpZ2h0S2V5CQEXa2V5X3Byb2Nlc3NGaW5pc2hIZWlnaHQCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgkBEWdldEJyZWVkZXJBZGRyZXNzAAUPZmluaXNoSGVpZ2h0S2V5BA9kdWNrR2VuZXNTdHJpbmcJAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIMZ2VuZXJhdGVEdWNrCQDMCAIFBHR4SWQJAMwIAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAkAzAgCBQ9wYXJlbnRGaXhlZEdlbmUJAMwIAgURcG9zaXRpb25GaXhlZEdlbmUJAMwIAgIACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUPZHVja0dlbmVzU3RyaW5nBQ9kdWNrR2VuZXNTdHJpbmcEBGNhbGwJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIXZmluaXNoRHVja0hhdGNoaW5nSXRlbXMJAMwIAgUHdHhJZFN0cgkAzAgCBQ9kdWNrR2VuZXNTdHJpbmcFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEJAMwIAgkAkQMCCAUBaQhwYXltZW50cwACBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZnJlZUdlbmUBB3R4SWRTdHIEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCDEFSVC1GUkVFR0VORQkAAgECKllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GUkVFR0VORSBhcnRlZmFjdAQEdHhJZAkA2QQBBQd0eElkU3RyBA9maW5pc2hIZWlnaHRLZXkJARdrZXlfcHJvY2Vzc0ZpbmlzaEhlaWdodAIJAKUIAQgFAWkGY2FsbGVyBQR0eElkBBNwcm9jZXNzRmluaXNoSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCCQERZ2V0QnJlZWRlckFkZHJlc3MABQ9maW5pc2hIZWlnaHRLZXkEDHNlbGVjdGVkR2VuZQkBDmdldFJhbmRvbUdlbmVzAgUEdHhJZAUTcHJvY2Vzc0ZpbmlzaEhlaWdodAQOcmFuZG9tUG9zaXRpb24JAQ9nZXRSYW5kb21OdW1iZXIEAAgFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQAAwQPZHVja0dlbmVzU3RyaW5nCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgAACQDMCAIAAAkAzAgCBQxzZWxlY3RlZEdlbmUJAMwIAgUOcmFuZG9tUG9zaXRpb24FA25pbAUDbmlsAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwUPZHVja0dlbmVzU3RyaW5nBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQDMCAIFB3R4SWRTdHIJAMwIAgUPZHVja0dlbmVzU3RyaW5nBQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwABCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAgUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBBEJ1cm4CCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNvcHlEdWNrAAQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDXNlY29uZFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAgQMZmlyc3RBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgMDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABBgkBAiE9AggFDXNlY29uZFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBAhhcnRlZmFjdAkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgpBUlQtTUlSUk9SCQACAQIoWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULU1JUlJPUiBhcnRlZmFjdAQHbmZ0SW5mbwkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQECWFzc2V0MUdlbgkAtQkCCAUHbmZ0SW5mbwRuYW1lAgADAwkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUcGCQAAAgkAkQMCBQlhc3NldDFHZW4ADgIBSgkAAgECGllvdSBjYW4ndCBtaXJyb3IgdGhpcyBkdWNrBAdkdWNrR2VuCAUHbmZ0SW5mbwRuYW1lBARjYWxsCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFmNyZWF0ZUR1Y2tTcGVjaWFsR2VuZXMJAMwIAggIBQFpBmNhbGxlcgVieXRlcwkAzAgCBQdkdWNrR2VuCQDMCAIFCGNoaWxkcmVuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERYWRkQXJ0ZUZhY3RUb0R1Y2sABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwACBAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50AAEGCQECIT0CCAUNc2Vjb25kUGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUMZmlyc3RBc3NldElkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4DCQAAAgUIY2hpbGRyZW4AAAkAAgECJFlvdSBjYW4gb25seSBwaWNrIGEgc3RlcmlsZSBORlQtZHVjawQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBCQEFdmFsdWUBCAUNc2Vjb25kUGF5bWVudAdhc3NldElkBQNuaWwFA25pbAMJAAACBQhhcnRlZmFjdAUIYXJ0ZWZhY3QDAwkBAiE9AgUIYXJ0ZWZhY3QCCEFSVC1YSEFUCQECIT0CBQhhcnRlZmFjdAIIQVJULVBPTVAHCQACAQIyWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULVhIQVQgb3IgQVJULVBPTVAgYXJ0ZWZhY3QEB25mdEluZm8JAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBAlhc3NldDFHZW4JALUJAggFB25mdEluZm8EbmFtZQIAAwMJAAACCQCRAwIFCWFzc2V0MUdlbgAOAgFHBgkAAAIJAJEDAgUJYXNzZXQxR2VuAA4CAUoJAAIBAhpZb3UgY2FuJ3QgbWlycm9yIHRoaXMgZHVjawMDCQAAAgkAkQMCBQlhc3NldDFHZW4ABQIBUwYJAAACCQCRAwIFCWFzc2V0MUdlbgAFAgFUCQACAQIfeW91IGFscmVhZHkgYXR0YWNoZWQgYSBhcnRlZmFjdAQEY2hhcgMJAAACBQhhcnRlZmFjdAIIQVJULVhIQVQCAVQDCQAAAgUIYXJ0ZWZhY3QCCEFSVC1QT01QAgFTCQACAQIPTm8gY2hhciBkZWZpbmVkBApvbGREdWNrR2VuCAUHbmZ0SW5mbwRuYW1lBApvbGRGYXJtR2VuCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDmdldEdlbkZyb21OYW1lCQDMCAIFCm9sZER1Y2tHZW4FA25pbAUDbmlsAwkAAAIFCm9sZEZhcm1HZW4FCm9sZEZhcm1HZW4EB2R1Y2tHZW4JAQ5tYW5pcHVsYXRlTmFtZQMFCm9sZER1Y2tHZW4ABgUEY2hhcgQEY2FsbAkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAhZjcmVhdGVEdWNrU3BlY2lhbEdlbmVzCQDMCAIICAUBaQZjYWxsZXIFYnl0ZXMJAMwIAgUHZHVja0dlbgkAzAgCBQhjaGlsZHJlbgUDbmlsBQNuaWwDCQAAAgUEY2FsbAUEY2FsbAQKY2FsbFJlZHVjZQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAgxyZWR1Y2VSYXJpdHkJAMwIAgUMZmlyc3RBc3NldElkCQDMCAIFCm9sZEZhcm1HZW4FA25pbAUDbmlsAwkAAAIFCmNhbGxSZWR1Y2UFCmNhbGxSZWR1Y2UJAM4IAgkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAABBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdwcmVJbml0AAkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3RhdGljX0FSVC1MQUtFX2Zhcm1pbmdTbG90cwDIAQkAzAgCCQEMSW50ZWdlckVudHJ5AgIcc3RhdGljX0FSVC1MQUtFX2Zhcm1pbmdCb29zdAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCAh1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdTbG90cwAECQDMCAIJAQxJbnRlZ2VyRW50cnkCAh1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdCb29zdAAeCQDMCAIJAQxJbnRlZ2VyRW50cnkCAiBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdTbG90cwAKCQDMCAIJAQxJbnRlZ2VyRW50cnkCAiBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdCb29zdAAPBQNuaWwBaQENaXNzdWVBcnRlZmFjdAIEdHlwZQhyZWNlaXZlcgMDAwMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldFJlYmlydGhBZGRyZXNzAAcJAQIhPQIIBQFpBmNhbGxlcgkBF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAcJAQIhPQIIBQFpBmNhbGxlcgkBFGdldEh1bnREaXN0cm9BZGRyZXNzAAcJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQkBC2dldFdhcnNQS2V5AAcJAAIBAgphZG1pbiBvbmx5AwMDAwkAAAIIBQFpBmNhbGxlcgkBFGdldEh1bnREaXN0cm9BZGRyZXNzAAYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQtnZXRXYXJzUEtleQAJAQEhAQkBCGNvbnRhaW5zAgUEdHlwZQIJQVJULUZJUkVfBwkBASEBCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgUEdHlwZQIGX2lzc3VlBwkAAgECHUZJUkUgQU5EIFdISVRFTElTVCBJVEVNIE9OTFkhBAdhZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUIcmVjZWl2ZXIJAQlpc3N1ZUl0ZW0DBQR0eXBlAAAFB2FkZHJlc3MBaQESaXNzdWVBcnRlZmFjdEluZGV4AwR0eXBlCHJlY2VpdmVyBW5vbmNlAwMDAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyCQEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyCQEUZ2V0SHVudERpc3Ryb0FkZHJlc3MABwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5CQELZ2V0V2Fyc1BLZXkABwkAAgECCmFkbWluIG9ubHkDAwMDCQAAAggFAWkGY2FsbGVyCQEUZ2V0SHVudERpc3Ryb0FkZHJlc3MABgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBC2dldFdhcnNQS2V5AAkBASEBCQEIY29udGFpbnMCBQR0eXBlAglBUlQtRklSRV8HCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkArAICBQR0eXBlAgZfaXNzdWUHCQACAQIdRklSRSBBTkQgV0hJVEVMSVNUIElURU0gT05MWSEEB2FkZHJlc3MJAQdBZGRyZXNzAQkA2QQBBQhyZWNlaXZlcgQLaXNzdWVSZXN1bHQJAQlpc3N1ZUl0ZW0DBQR0eXBlBQVub25jZQUHYWRkcmVzcwULaXNzdWVSZXN1bHQBaQEHc2V0TG9jawEBbgMJAAACCAUBaQZjYWxsZXIFBHRoaXMJAMwIAgkBDEludGVnZXJFbnRyeQICDWdsb2JhbF9sb2NrZWQFAW4FA25pbAkAAgECCmFkbWluIG9ubHkBaQEOYWRkSXRlbVRvU3RvcmUIBXByaWNlBGl0ZW0IbWF4U2FsZXMEc2FsZQlwcmljZXNzZXQQZ3Jvd3RoUGVyY2VudGFnZQdzdGFydFRzBWVuZFRzAwkBAiE9AggFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9waXBlbGluZVVzZXIACQACAQIeSUFJVFM6IE9ubHkgZm9yIHRydXN0ZWQgdXNlcnMhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X3ByaWNlQ29zbWV0aWMBBQRpdGVtBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleV9tYXhTYWxlc0Nvc21ldGljAQUEaXRlbQUIbWF4U2FsZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARBrZXlfc2FsZUNvc21ldGljAQUEaXRlbQUEc2FsZQkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5X3ByaWNlQXNzZXRDb3NtZXRpYwEFBGl0ZW0FCXByaWNlc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleV9ncm93UGVyY2VudGFnZUNvc21ldGljAQUEaXRlbQUQZ3Jvd3RoUGVyY2VudGFnZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleV9zdGFydFRzQ29zbWV0aWMBBQRpdGVtBQdzdGFydFRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5X2VuZFRzQ29zbWV0aWMBBQRpdGVtBQVlbmRUcwUDbmlsAWkBEnNldEdsb2JhbEFydEFtb3VudAEJbmV3QW1vdW50AwMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQAAAggFAWkGY2FsbGVyCQEHQWRkcmVzcwEFCmRldkFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF9hcnRBbW91bnQFCW5ld0Ftb3VudAUDbmlsCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACVO3y+g==", "height": 3949750, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 845LGGyWrHyJyAdh14qfZ6ZfHbBkkAidZTgtpUozV4WX Next: Ee6qMofLCJBRokMGwX3etdj7QfVJ5AaucWMUmUw7NXPG Diff:
OldNewDifferences
323323 let expUser = tryGetIntegerExternal(getCouponsAddress(), userExperience(address))
324324 let multiplier = min([((expUser / 100) + 1), 6])
325325 let finish = getIntegerValue((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
326- func handleMint (acc,index) = if ((multiplier >= index))
327- then {
328- let randomPosition = getRandomNumber(size(boosters), fromBase58String(initTx), finish, index)
329- (acc ++ issueItem(boosters[randomPosition], (index - 1), addressFromStringValue(address))._1)
326+ if ((finish > height))
327+ then throw("Please wait till the shaking is finished!")
328+ else {
329+ func handleMint (acc,index) = if ((multiplier >= index))
330+ then {
331+ let randomPosition = getRandomNumber(size(boosters), fromBase58String(initTx), finish, index)
332+ (acc ++ issueItem(boosters[randomPosition], (index - 1), addressFromStringValue(address))._1)
333+ }
334+ else acc
335+
336+ let $l = [1, 2, 3, 4, 5, 6]
337+ let $s = size($l)
338+ let $acc0 = nil
339+ func $f0_1 ($a,$i) = if (($i >= $s))
340+ then $a
341+ else handleMint($a, $l[$i])
342+
343+ func $f0_2 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else throw("List size exceeds 6")
346+
347+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
330348 }
331- else acc
332-
333- let $l = [1, 2, 3, 4, 5, 6]
334- let $s = size($l)
335- let $acc0 = nil
336- func $f0_1 ($a,$i) = if (($i >= $s))
337- then $a
338- else handleMint($a, $l[$i])
339-
340- func $f0_2 ($a,$i) = if (($i >= $s))
341- then $a
342- else throw("List size exceeds 6")
343-
344- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
345349 }
346350
347351
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func staticKey_oracleAddress () = "static_oracleAddress"
55
66
77 func staticKey_breederAddress () = "static_breederAddress"
88
99
1010 func staticKey_eggAssetId () = "static_eggAssetId"
1111
1212
1313 func staticKey_trustedContracts () = "static_trustedContracts"
1414
1515
1616 func staticKey_rebirthAddress () = "static_rebirthAddress"
1717
1818
1919 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
2020
2121
2222 func staticKey_pipelineUser () = "static_pipelineUser"
2323
2424
2525 func staticKey_extraFee () = "static_extraFee"
2626
2727
2828 func staticKey_feeAggregator () = "static_feeAggregator"
2929
3030
3131 func staticKey_huntDistroAddress () = "static_huntDistroAddress"
3232
3333
3434 func staticKey_warsPKey () = "static_warsPKey"
3535
3636
3737 func statisKey_duplicatorFee () = "static_duplicatorFee"
3838
3939
4040 func key_artefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
4141
4242
4343 func key_unstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
4444
4545
4646 func key_externalBoostDuck (duckId) = (duckId + "_duck_external_boost")
4747
4848
4949 func key_externalBoostAddress (address) = (address + "_user_external_boost")
5050
5151
5252 func key_priceCosmetic (item) = ("direct_cosmetic_" + item)
5353
5454
5555 func key_maxSalesCosmetic (item) = (("direct_cosmetic_" + item) + "_max_sales")
5656
5757
5858 func key_saleCosmetic (item) = (("direct_cosmetic_" + item) + "_sale")
5959
6060
6161 func key_priceAssetCosmetic (item) = (("direct_cosmetic_" + item) + "_priceAsset")
6262
6363
6464 func key_growPercentageCosmetic (item) = (("direct_cosmetic_" + item) + "_growing_percentage")
6565
6666
6767 func key_soldCosmetic (item) = (("direct_cosmetic_" + item) + "_sold")
6868
6969
7070 func key_lastPriceCosmetic (item) = (("direct_cosmetic_" + item) + "_last_price")
7171
7272
7373 func key_startTsCosmetic (item) = (("direct_cosmetic_" + item) + "_startTs")
7474
7575
7676 func key_endTsCosmetic (item) = (("direct_cosmetic_" + item) + "_endTs")
7777
7878
7979 func key_processFinishHeight (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
8080
8181
8282 func staticKey_couponsAddress () = "static_couponsAddress"
8383
8484
8585 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
8686
8787 let eggsNeeded = (3 * 100000000)
8888
8989 let artefactsLimit = (301 + 600)
9090
9191 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
9292
9393 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
9494
9595 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
9696
9797 let allArtefact = (artefacts ++ oldArtefacts)
9898
9999 let boosters = ["ART-TINSEL", "ART-FEED10", "ART-GNGR_BREAD", "ART-SNOWBALL", "ART-GIFT_DOUBL"]
100100
101101 func tryGetBoolean (key) = match getBoolean(this, key) {
102102 case b: Boolean =>
103103 b
104104 case _ =>
105105 false
106106 }
107107
108108
109109 func tryGetString (key) = match getString(this, key) {
110110 case a: String =>
111111 a
112112 case _ =>
113113 ""
114114 }
115115
116116
117117 func tryGetInteger (key) = match getInteger(this, key) {
118118 case a: Int =>
119119 a
120120 case _ =>
121121 0
122122 }
123123
124124
125125 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
126126 case b: Int =>
127127 b
128128 case _ =>
129129 0
130130 }
131131
132132
133133 func getRandomNumber (variants,txId,finishHeight,offset) = {
134134 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
135135 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
136136 (toInt(randomHash, offset) % variants)
137137 }
138138
139139
140140 func getRandomArtefact (boxId,h) = {
141141 let randomNumber = getRandomNumber(size(artefacts), boxId, h, 1)
142142 artefacts[randomNumber]
143143 }
144144
145145
146146 func getRandomGenes (txId,h) = {
147147 let randomNumber = getRandomNumber(size(freeGenes), txId, h, 2)
148148 freeGenes[randomNumber]
149149 }
150150
151151
152152 func tryGetStringExternal (address,key) = match getString(address, key) {
153153 case a: String =>
154154 a
155155 case _ =>
156156 ""
157157 }
158158
159159
160160 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
161161
162162
163163 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
164164
165165
166166 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
167167
168168
169169 func getTrustedContracts () = tryGetStringExternal(getOracle(), staticKey_trustedContracts())
170170
171171
172172 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
173173
174174
175175 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
176176
177177
178178 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
179179
180180
181181 func getHuntDistroAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntDistroAddress())))
182182
183183
184184 func getWarsPKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_warsPKey()))
185185
186186
187187 func getDuplicatorFee () = tryGetInteger(statisKey_duplicatorFee())
188188
189189
190190 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
191191
192192
193193 func tryGetCosmeticItemPrice (item) = {
194194 let key = key_priceCosmetic(item)
195195 match getInteger(this, key) {
196196 case a: Int =>
197197 a
198198 case _ =>
199199 throw((("ITGCIP: " + item) + " is not available in the store!"))
200200 }
201201 }
202202
203203
204204 func asString (value) = match value {
205205 case string: String =>
206206 string
207207 case _ =>
208208 throw("wrong type, expected: String")
209209 }
210210
211211
212212 func asInt (value) = match value {
213213 case int: Int =>
214214 int
215215 case _ =>
216216 throw("wrong type, expected: Int")
217217 }
218218
219219
220220 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
221221
222222
223223 func itemIsInCoolDown (artefactName,artefactId) = {
224224 let unstakeHeightLast = tryGetInteger(key_unstakeHeight(artefactName, artefactId))
225225 let cooldownPeriod = 240
226226 if ((height > (unstakeHeightLast + cooldownPeriod)))
227227 then false
228228 else true
229229 }
230230
231231
232232 func isTestEnv () = tryGetBoolean("TESTENV")
233233
234234
235235 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
236236 then throw("WCAP: Please attach waves")
237237 else {
238238 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
239239 if ((payment.amount != feeAmount))
240240 then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
241241 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
242242 }
243243
244244
245245 func issueItem (type,nonce,address) = {
246246 let artefact = Issue(type, "NFT artefact of Waves Ducks game.", 1, 0, false, unit, nonce)
247247 let artefactId = calculateAssetId(artefact)
248248 $Tuple2([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)], toBase58String(artefactId))
249249 }
250250
251251
252252 func itemMerger (baseItem,amountBaseItem,endItem,payments,feeAmount,feeAssetId,recipient,instantFinish,txId) = if ((size(payments) != (amountBaseItem + 1)))
253253 then throw((("IID: Please attach " + toString((amountBaseItem + 2))) + " payments!"))
254254 else {
255255 func isBaseItem (accumulated,pay) = {
256256 let assetId = value(pay.assetId)
257257 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
258258 if ((artefact == artefact))
259259 then if ((artefact == baseItem))
260260 then $Tuple2((accumulated._1 ++ [Burn(assetId, 1)]), (accumulated._2 + 1))
261261 else $Tuple2(accumulated._1, (accumulated._2 + 0))
262262 else throw("Strict value is not equal to itself.")
263263 }
264264
265265 let totalBaseItem = {
266266 let $l = payments
267267 let $s = size($l)
268268 let $acc0 = $Tuple2(nil, 0)
269269 func $f0_1 ($a,$i) = if (($i >= $s))
270270 then $a
271271 else isBaseItem($a, $l[$i])
272272
273273 func $f0_2 ($a,$i) = if (($i >= $s))
274274 then $a
275275 else throw("List size exceeds 8")
276276
277277 $f0_2($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)
278278 }
279279 if ((totalBaseItem._2 != amountBaseItem))
280280 then throw(((("IID: Please attach " + toString(amountBaseItem)) + " artefacts of type ") + baseItem))
281281 else {
282282 let feePayment = payments[amountBaseItem]
283283 if ((feePayment.assetId != feeAssetId))
284284 then throw("IID: You miss a payment with the fee!")
285285 else if ((feePayment.amount != feeAmount))
286286 then throw("IID: You did not attach the correct fee amount!")
287287 else {
288288 let artefact = Issue(endItem, ("NFT artefact of Waves Ducks game: " + endItem), 1, 0, false, unit, 0)
289289 let artefactId = calculateAssetId(artefact)
290290 let instant = if (instantFinish)
291291 then issueItem(endItem, 0, recipient)
292292 else $Tuple2(nil, "")
293293 $Tuple2((([BooleanEntry((("merge_" + txId) + "_instant"), instantFinish), ScriptTransfer(getFeeAggregator(), feeAmount, feePayment.assetId), StringEntry((("merge_" + txId) + "_reward"), endItem), BooleanEntry((("merge_" + txId) + "_finished"), !(instantFinish))] ++ instant._1) ++ totalBaseItem._1), instant._2)
294294 }
295295 }
296296 }
297297
298298
299299 func getAmountBaseItem (baseItem) = getIntegerValue((("merge_" + baseItem) + "_amount"))
300300
301301
302302 func getEndItem (baseItem) = getStringValue((("merge_" + baseItem) + "_endItem"))
303303
304304
305305 func getPrice (baseItem) = getIntegerValue((("merge_" + baseItem) + "_price"))
306306
307307
308308 func getInstant (baseItem) = getBooleanValue((("merge_" + baseItem) + "_instant"))
309309
310310
311311 func getAsset (baseItem) = {
312312 let asset = getStringValue((("merge_" + baseItem) + "_asset"))
313313 if ((asset == "WAVES"))
314314 then unit
315315 else fromBase58String(asset)
316316 }
317317
318318
319319 func userExperience (user) = (user + "_experience")
320320
321321
322322 func finishShakeItBabyInternal (initTx,address,payment) = {
323323 let expUser = tryGetIntegerExternal(getCouponsAddress(), userExperience(address))
324324 let multiplier = min([((expUser / 100) + 1), 6])
325325 let finish = getIntegerValue((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
326- func handleMint (acc,index) = if ((multiplier >= index))
327- then {
328- let randomPosition = getRandomNumber(size(boosters), fromBase58String(initTx), finish, index)
329- (acc ++ issueItem(boosters[randomPosition], (index - 1), addressFromStringValue(address))._1)
326+ if ((finish > height))
327+ then throw("Please wait till the shaking is finished!")
328+ else {
329+ func handleMint (acc,index) = if ((multiplier >= index))
330+ then {
331+ let randomPosition = getRandomNumber(size(boosters), fromBase58String(initTx), finish, index)
332+ (acc ++ issueItem(boosters[randomPosition], (index - 1), addressFromStringValue(address))._1)
333+ }
334+ else acc
335+
336+ let $l = [1, 2, 3, 4, 5, 6]
337+ let $s = size($l)
338+ let $acc0 = nil
339+ func $f0_1 ($a,$i) = if (($i >= $s))
340+ then $a
341+ else handleMint($a, $l[$i])
342+
343+ func $f0_2 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else throw("List size exceeds 6")
346+
347+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
330348 }
331- else acc
332-
333- let $l = [1, 2, 3, 4, 5, 6]
334- let $s = size($l)
335- let $acc0 = nil
336- func $f0_1 ($a,$i) = if (($i >= $s))
337- then $a
338- else handleMint($a, $l[$i])
339-
340- func $f0_2 ($a,$i) = if (($i >= $s))
341- then $a
342- else throw("List size exceeds 6")
343-
344- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
345349 }
346350
347351
348352 @Callable(i)
349353 func startShakeItBaby () = {
350354 let itemPayment = value(i.payments[0])
351355 let validPayment = checkAdditionalPayment(i.payments[1])
352356 let itemAssetId = toBase58String(value(itemPayment.assetId))
353357 if ((itemPayment.amount != 1))
354358 then throw("IID: Item NFT is not attached")
355359 else {
356360 let globeArtefact = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
357361 if ((globeArtefact == globeArtefact))
358362 then if ((globeArtefact != "ART-SNW_GLBES"))
359363 then throw("IID: You need to attach a ART-SNW_GLBES artefact")
360364 else {
361365 let address = toString(i.caller)
362366 let initTx = toBase58String(i.transactionId)
363367 [Burn(value(itemPayment.assetId), 1), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + 2)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), itemAssetId)]
364368 }
365369 else throw("Strict value is not equal to itself.")
366370 }
367371 }
368372
369373
370374
371375 @Callable(i)
372376 func finishShakeItBaby (initTx) = finishShakeItBabyInternal(initTx, toString(i.caller), i.payments[0])
373377
374378
375379
376380 @Callable(i)
377381 func instanMergeItem (baseItem) = if ((baseItem != "ART-KATANA"))
378382 then throw("IID: Only Katana can be merged!")
379383 else {
380384 let params = $Tuple5(getAmountBaseItem(baseItem), getEndItem(baseItem), getPrice(baseItem), getAsset(baseItem), getInstant(baseItem))
381385 itemMerger(baseItem, params._1, params._2, i.payments, params._3, params._4, i.caller, params._5, toBase58String(i.transactionId))
382386 }
383387
384388
385389
386390 @Callable(i)
387391 func directBuyItem (itemName) = {
388392 let basePrice = tryGetCosmeticItemPrice(itemName)
389393 let grow = tryGetInteger(key_growPercentageCosmetic(itemName))
390394 let startTs = tryGetInteger(key_startTsCosmetic(itemName))
391395 let endTs = tryGetInteger(key_endTsCosmetic(itemName))
392396 if (if ((startTs != 0))
393397 then (startTs > lastBlock.timestamp)
394398 else false)
395399 then throw("IDBI: The sale did not start yet!")
396400 else if (if ((endTs != 0))
397401 then (lastBlock.timestamp > endTs)
398402 else false)
399403 then throw("IDBI: The sale has already finished!")
400404 else if (!(tryGetBoolean(key_saleCosmetic(itemName))))
401405 then throw(("IDBI: Item not for sale anymore" + key_saleCosmetic(itemName)))
402406 else {
403407 let maxSalesValue = tryGetInteger(key_maxSalesCosmetic(itemName))
404408 let soldValue = tryGetInteger(key_soldCosmetic(itemName))
405409 let price = if ((grow == 0))
406410 then basePrice
407411 else (basePrice + ((basePrice / 100) * (soldValue * grow)))
408412 if (if ((maxSalesValue != 0))
409413 then (soldValue >= maxSalesValue)
410414 else false)
411415 then throw("IDBI: Max editions sold!")
412416 else {
413417 let assetId = if ((tryGetString(key_priceAssetCosmetic(itemName)) == ""))
414418 then getEggAssetId()
415419 else if ((tryGetString(key_priceAssetCosmetic(itemName)) == "WAVES"))
416420 then unit
417421 else fromBase58String(tryGetString(key_priceAssetCosmetic(itemName)))
418422 let amountPaidByCoupons = 0
419423 let leftToPay = (price - amountPaidByCoupons)
420424 let validPayment = checkAdditionalPayment(i.payments[0])
421425 let firstPayment = value(i.payments[1])
422426 let amount = firstPayment.amount
423427 if ((firstPayment.assetId != assetId))
424428 then throw("IDBI: You can attach only tokens with the correct payment ")
425429 else if ((amount != leftToPay))
426430 then throw(("IDBI: Please attach the exact asset amount" + toString(price)))
427431 else {
428432 let txIdStr = toBase58String(i.transactionId)
429433 let address = i.originCaller
430434 let artefact = Issue(itemName, ("NFT artefact of Waves Ducks game: " + itemName), 1, 0, false, unit, 0)
431435 let artefactId = calculateAssetId(artefact)
432436 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), itemName), IntegerEntry(key_lastPriceCosmetic(itemName), price), IntegerEntry(key_soldCosmetic(itemName), (soldValue + 1)), ScriptTransfer(address, 1, artefactId), ScriptTransfer(getFeeAggregator(), amount, assetId)] ++ validPayment), toBase58String(artefactId))
433437 }
434438 }
435439 }
436440 }
437441
438442
439443
440444 @Callable(i)
441445 func manipulateBoost (boost,duckId) = {
442446 let allowedContracts = getTrustedContracts()
443447 let allowedContractsList = split(allowedContracts, ";")
444448 let dappToCall = toString(i.caller)
445449 if ((indexOf(allowedContractsList, dappToCall) == unit))
446450 then throw("IMB: This smart contract can't manipulate the boost!")
447451 else {
448452 let key = key_externalBoostDuck(duckId)
449453 let activeBoost = tryGetInteger(key)
450454 let newBoost = (activeBoost + boost)
451455 if ((0 > newBoost))
452456 then throw("IMB: Something went wrong with boost, please contact the admins!")
453457 else [IntegerEntry(key, newBoost)]
454458 }
455459 }
456460
457461
458462
459463 @Callable(i)
460464 func manipulateBoostAccount (boost,address) = {
461465 let allowedContracts = getTrustedContracts()
462466 let allowedContractsList = split(allowedContracts, ";")
463467 let dappToCall = toString(i.caller)
464468 if ((indexOf(allowedContractsList, dappToCall) == unit))
465469 then throw("IMBA: This smart contract can't manipulate the boost!")
466470 else {
467471 let key = key_externalBoostAddress(address)
468472 let activeBoost = tryGetInteger(key)
469473 let newBoost = (activeBoost + boost)
470474 if ((0 > newBoost))
471475 then throw("IMBA: Something went wrong with boost, please contact the admins!")
472476 else [IntegerEntry(key, newBoost)]
473477 }
474478 }
475479
476480
477481
478482 @Callable(i)
479483 func checkArtefactDetails (assetId) = {
480484 let asset = value(assetInfo(fromBase58String(assetId)))
481485 let assetName = value(asset.name)
482486 if (if (if (containsElement(allArtefact, assetName))
483487 then true
484488 else isDefined(tryGetCosmeticItemPrice(assetName)))
485489 then (asset.issuer == this)
486490 else false)
487491 then $Tuple2(nil, assetName)
488492 else throw("Invalid artefact")
489493 }
490494
491495
492496
493497 @Callable(i)
494498 func configureOracle (oracle) = if ((i.caller != this))
495499 then throw("admin only")
496500 else [StringEntry(staticKey_oracleAddress(), oracle)]
497501
498502
499503
500504 @Callable(i)
501505 func calculateFarmingPowerBoost (duckId,address) = {
502506 let externalBoostDuck = tryGetInteger(key_externalBoostDuck(duckId))
503507 let externalBoostAddress = tryGetInteger(key_externalBoostAddress(address))
504508 let totalBoost = (externalBoostDuck + externalBoostAddress)
505509 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
506510 }
507511
508512
509513
510514 @Callable(i)
511515 func itemDuplicator () = if ((size(i.payments) != 4))
512516 then throw("IID: Three payments are needed!")
513517 else {
514518 let duplicatorPayment = value(i.payments[0])
515519 let itemPayment = value(i.payments[1])
516520 let eggPayment = value(i.payments[2])
517521 let validPayment = checkAdditionalPayment(i.payments[3])
518522 let duplicatorAssetId = toBase58String(value(duplicatorPayment.assetId))
519523 if ((duplicatorPayment.amount != 1))
520524 then throw("IID: Duplicator NFT is not attached")
521525 else {
522526 let itemAssetId = toBase58String(value(itemPayment.assetId))
523527 if ((itemPayment.amount != 1))
524528 then throw("IID: Item NFT is not attached")
525529 else {
526530 let eggAssetId = value(eggPayment.assetId)
527531 if ((eggAssetId != getEggAssetId()))
528532 then throw("IID: Please attach eggs!")
529533 else if ((getDuplicatorFee() > eggPayment.amount))
530534 then throw(("IID: to duplicate an items you need the following amount of egglets: " + toString(getDuplicatorFee())))
531535 else {
532536 let duplicatorArtefact = asString(invoke(this, "checkArtefactDetails", [duplicatorAssetId], nil))
533537 if ((duplicatorArtefact == duplicatorArtefact))
534538 then if ((duplicatorArtefact != "ART-ITEM_DUPLI"))
535539 then throw("IID: You need to attach a ART-ITEM_DUPLI artefact")
536540 else {
537541 let artefactName = asString(invoke(this, "checkArtefactDetails", [itemAssetId], nil))
538542 if ((artefactName == artefactName))
539543 then {
540544 let artefact = Issue(artefactName, ("NFT artefact of Waves Ducks game: " + artefactName), 1, 0, false, unit, 0)
541545 let artefactId = calculateAssetId(artefact)
542546 $Tuple2(([artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), artefactName), Burn(value(duplicatorPayment.assetId), 1), ScriptTransfer(i.originCaller, 1, itemPayment.assetId), ScriptTransfer(i.originCaller, 1, artefactId), ScriptTransfer(getFeeAggregator(), eggPayment.amount, eggPayment.assetId)] ++ validPayment), toBase58String(artefactId))
543547 }
544548 else throw("Strict value is not equal to itself.")
545549 }
546550 else throw("Strict value is not equal to itself.")
547551 }
548552 }
549553 }
550554 }
551555
552556
553557
554558 @Callable(i)
555559 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
556560 let firstPayment = value(i.payments[0])
557561 let validPayment = checkAdditionalPayment(i.payments[1])
558562 let firstAssetId = toBase58String(value(firstPayment.assetId))
559563 if ((firstPayment.amount != 1))
560564 then throw("NFT is not attached")
561565 else {
562566 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
563567 if ((artefact == artefact))
564568 then if ((artefact != "ART-FIXGENE"))
565569 then throw("You need to attach a ART-FIXGENE artefact")
566570 else {
567571 let txId = fromBase58String(txIdStr)
568572 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
569573 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
570574 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
571575 if ((duckGenesString == duckGenesString))
572576 then {
573577 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
574578 if ((call == call))
575579 then [Burn(value(firstPayment.assetId), 1)]
576580 else throw("Strict value is not equal to itself.")
577581 }
578582 else throw("Strict value is not equal to itself.")
579583 }
580584 else throw("Strict value is not equal to itself.")
581585 }
582586 }
583587
584588
585589
586590 @Callable(i)
587591 func freeGene (txIdStr) = {
588592 let firstPayment = value(i.payments[0])
589593 let firstAssetId = toBase58String(value(firstPayment.assetId))
590594 if ((firstPayment.amount != 1))
591595 then throw("NFT is not attached")
592596 else {
593597 let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
594598 if ((artefact == artefact))
595599 then if ((artefact != "ART-FREEGENE"))
596600 then throw("You need to attach a ART-FREEGENE artefact")
597601 else {
598602 let txId = fromBase58String(txIdStr)
599603 let finishHeightKey = key_processFinishHeight(toString(i.caller), txId)
600604 let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
601605 let selectedGene = getRandomGenes(txId, processFinishHeight)
602606 let randomPosition = getRandomNumber(8, txId, processFinishHeight, 3)
603607 let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
604608 if ((duckGenesString == duckGenesString))
605609 then {
606610 let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], [i.payments[1], i.payments[2]])
607611 if ((call == call))
608612 then [Burn(value(firstPayment.assetId), 1)]
609613 else throw("Strict value is not equal to itself.")
610614 }
611615 else throw("Strict value is not equal to itself.")
612616 }
613617 else throw("Strict value is not equal to itself.")
614618 }
615619 }
616620
617621
618622
619623 @Callable(i)
620624 func copyDuck () = {
621625 let firstPayment = value(i.payments[0])
622626 let secondPayment = value(i.payments[1])
623627 let validPayment = checkAdditionalPayment(i.payments[2])
624628 let firstAssetId = toBase58String(value(firstPayment.assetId))
625629 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
626630 if ((children == children))
627631 then if (if ((firstPayment.amount != 1))
628632 then true
629633 else (secondPayment.amount != 1))
630634 then throw("NFT is not attached")
631635 else {
632636 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
633637 if ((artefact == artefact))
634638 then if ((artefact != "ART-MIRROR"))
635639 then throw("You need to attach a ART-MIRROR artefact")
636640 else {
637641 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
638642 let asset1Gen = split(nftInfo.name, "")
639643 if (if ((asset1Gen[14] == "G"))
640644 then true
641645 else (asset1Gen[14] == "J"))
642646 then throw("You can't mirror this duck")
643647 else {
644648 let duckGen = nftInfo.name
645649 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
646650 if ((call == call))
647651 then ([ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
648652 else throw("Strict value is not equal to itself.")
649653 }
650654 }
651655 else throw("Strict value is not equal to itself.")
652656 }
653657 else throw("Strict value is not equal to itself.")
654658 }
655659
656660
657661
658662 @Callable(i)
659663 func addArteFactToDuck () = {
660664 let firstPayment = value(i.payments[0])
661665 let secondPayment = value(i.payments[1])
662666 let validPayment = checkAdditionalPayment(i.payments[2])
663667 let firstAssetId = toBase58String(value(firstPayment.assetId))
664668 if (if ((firstPayment.amount != 1))
665669 then true
666670 else (secondPayment.amount != 1))
667671 then throw("NFT is not attached")
668672 else {
669673 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
670674 if ((children == children))
671675 then if ((children == 0))
672676 then throw("You can only pick a sterile NFT-duck")
673677 else {
674678 let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
675679 if ((artefact == artefact))
676680 then if (if ((artefact != "ART-XHAT"))
677681 then (artefact != "ART-POMP")
678682 else false)
679683 then throw("You need to attach a ART-XHAT or ART-POMP artefact")
680684 else {
681685 let nftInfo = value(assetInfo(value(firstPayment.assetId)))
682686 let asset1Gen = split(nftInfo.name, "")
683687 if (if ((asset1Gen[14] == "G"))
684688 then true
685689 else (asset1Gen[14] == "J"))
686690 then throw("You can't mirror this duck")
687691 else if (if ((asset1Gen[5] == "S"))
688692 then true
689693 else (asset1Gen[5] == "T"))
690694 then throw("you already attached a artefact")
691695 else {
692696 let char = if ((artefact == "ART-XHAT"))
693697 then "T"
694698 else if ((artefact == "ART-POMP"))
695699 then "S"
696700 else throw("No char defined")
697701 let oldDuckGen = nftInfo.name
698702 let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
699703 if ((oldFarmGen == oldFarmGen))
700704 then {
701705 let duckGen = manipulateName(oldDuckGen, 6, char)
702706 let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
703707 if ((call == call))
704708 then {
705709 let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
706710 if ((callReduce == callReduce))
707711 then ([Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] ++ validPayment)
708712 else throw("Strict value is not equal to itself.")
709713 }
710714 else throw("Strict value is not equal to itself.")
711715 }
712716 else throw("Strict value is not equal to itself.")
713717 }
714718 }
715719 else throw("Strict value is not equal to itself.")
716720 }
717721 else throw("Strict value is not equal to itself.")
718722 }
719723 }
720724
721725
722726
723727 @Callable(i)
724728 func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
725729
726730
727731
728732 @Callable(i)
729733 func issueArtefact (type,receiver) = if (if (if (if (if ((i.caller != this))
730734 then (i.caller != getRebirthAddress())
731735 else false)
732736 then (i.caller != getTurtleRebirthAddress())
733737 else false)
734738 then (i.caller != getHuntDistroAddress())
735739 else false)
736740 then (i.callerPublicKey != getWarsPKey())
737741 else false)
738742 then throw("admin only")
739743 else if (if (if (if ((i.caller == getHuntDistroAddress()))
740744 then true
741745 else (i.callerPublicKey == getWarsPKey()))
742746 then !(contains(type, "ART-FIRE_"))
743747 else false)
744748 then !(tryGetBoolean((type + "_issue")))
745749 else false)
746750 then throw("FIRE AND WHITELIST ITEM ONLY!")
747751 else {
748752 let address = Address(fromBase58String(receiver))
749753 issueItem(type, 0, address)
750754 }
751755
752756
753757
754758 @Callable(i)
755759 func issueArtefactIndex (type,receiver,nonce) = if (if (if (if (if ((i.caller != this))
756760 then (i.caller != getRebirthAddress())
757761 else false)
758762 then (i.caller != getTurtleRebirthAddress())
759763 else false)
760764 then (i.caller != getHuntDistroAddress())
761765 else false)
762766 then (i.callerPublicKey != getWarsPKey())
763767 else false)
764768 then throw("admin only")
765769 else if (if (if (if ((i.caller == getHuntDistroAddress()))
766770 then true
767771 else (i.callerPublicKey == getWarsPKey()))
768772 then !(contains(type, "ART-FIRE_"))
769773 else false)
770774 then !(tryGetBoolean((type + "_issue")))
771775 else false)
772776 then throw("FIRE AND WHITELIST ITEM ONLY!")
773777 else {
774778 let address = Address(fromBase58String(receiver))
775779 let issueResult = issueItem(type, nonce, address)
776780 issueResult
777781 }
778782
779783
780784
781785 @Callable(i)
782786 func setLock (n) = if ((i.caller == this))
783787 then [IntegerEntry("global_locked", n)]
784788 else throw("admin only")
785789
786790
787791
788792 @Callable(i)
789793 func addItemToStore (price,item,maxSales,sale,pricesset,growthPercentage,startTs,endTs) = if ((i.caller != addressFromStringValue(tryGetStringExternal(getOracle(), staticKey_pipelineUser()))))
790794 then throw("IAITS: Only for trusted users!")
791795 else [IntegerEntry(key_priceCosmetic(item), price), IntegerEntry(key_maxSalesCosmetic(item), maxSales), BooleanEntry(key_saleCosmetic(item), sale), StringEntry(key_priceAssetCosmetic(item), pricesset), IntegerEntry(key_growPercentageCosmetic(item), growthPercentage), IntegerEntry(key_startTsCosmetic(item), startTs), IntegerEntry(key_endTsCosmetic(item), endTs)]
792796
793797
794798
795799 @Callable(i)
796800 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
797801 then true
798802 else (i.caller == Address(devAddress)))
799803 then [IntegerEntry("global_artAmount", newAmount)]
800804 else throw("Permission denied")
801805
802806
803807 @Verifier(tx)
804808 func verify () = if (isTestEnv())
805809 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
806810 else {
807811 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
808812 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
809813 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
810814 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
811815 then 1
812816 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
813817 then 1
814818 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
815819 then 1
816820 else 0
817821 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
818822 then 1
819823 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
820824 then 1
821825 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
822826 then 1
823827 else 0
824828 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
825829 then 1
826830 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
827831 then 1
828832 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
829833 then 1
830834 else 0
831835 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
832836 match tx {
833837 case _ =>
834838 (signaturesCount >= 2)
835839 }
836840 }
837841

github/deemru/w8io/3ef1775 
75.04 ms