tx · EwKb2Q297EByqBoVLdBHeidEkvRBiKSzXDm1NWmYW346

3N59U742XgXGyo9yu5rW7Y6Nd4k317Z1d3o:  -0.02600000 Waves

2023.03.03 00:39 [2472997] smart account 3N59U742XgXGyo9yu5rW7Y6Nd4k317Z1d3o > SELF 0.00000000 Waves

{ "type": 13, "id": "EwKb2Q297EByqBoVLdBHeidEkvRBiKSzXDm1NWmYW346", "fee": 2600000, "feeAssetId": null, "timestamp": 1677793216421, "version": 2, "chainId": 84, "sender": "3N59U742XgXGyo9yu5rW7Y6Nd4k317Z1d3o", "senderPublicKey": "b6G2ZpW7xza1jC47JrGiVE1WuG4EqYCxyEPQhexVBUb", "proofs": [ "5MBUT4m4KmMbDgwMo5vRiFjQvrQ7pgn4a1DpwESuKigT4kTgR8oEKRAhe9x5eA2a6ez84L3BskvcBUdFpvaKXeAV" ], "script": "base64:BgJBCAISBQoDAQgBEgQKAgEYEgoKCAEBAQgIGAgBEgkKBwEBAQgICAESBAoCAQESBAoCAQESAwoBCBIDCgEBEgMKAQhrAAlTRVBBUkFUT1ICAl9fAA5BUkdTX1NFUEFSQVRPUgIEIyMjIwAIS0VZX0lOSVQCBElOSVQADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwASS0VZX1BST1hZX1NFQ19ERVBPAhZQUk9YWV9TRUNVUklUWV9ERVBPU0lUABxLRVlfUFJPWFlfU0VDX0RFUE9fUEVSX0VWRU5UAiBQUk9YWV9TRUNVUklUWV9ERVBPU0lUX1BFUl9FVkVOVAAPS0VZX1dBVkVTX0VWRU5UAgtXQVZFU19FVkVOVAANS0VZX0VWTV9FVkVOVAIJRVZNX0VWRU5UABRLRVlfV0FWRVNfRVZFTlRfU0laRQIQV0FWRVNfRVZFTlRfU0laRQASS0VZX0VWTV9FVkVOVF9TSVpFAg5FVk1fRVZFTlRfU0laRQAWS0VZX1dBVkVTX0VWRU5UX1NUQVRVUwISV0FWRVNfRVZFTlRfU1RBVFVTABRLRVlfRVZNX0VWRU5UX1NUQVRVUwIQRVZNX0VWRU5UX1NUQVRVUwAZS0VZX1dBVkVTX0VWRU5UX1BVQkxJU0hFRAIVV0FWRVNfRVZFTlRfUFVCTElTSEVEABdLRVlfRVZNX0VWRU5UX1BVQkxJU0hFRAITRVZNX0VWRU5UX1BVQkxJU0hFRAARS0VZX0NVUlJFTlRfRVBPQ0gCDUNVUlJFTlRfRVBPQ0gACEtFWV9TSVpFAgRTSVpFABZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSAhJXQVZFU19FVkVOVF9DQUxMRVIAFEtFWV9FVk1fRVZFTlRfQ0FMTEVSAhBFVk1fRVZFTlRfQ0FMTEVSABdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAITV0lUTkVTU0VTX1BFUl9FUE9DSAAYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SAhRXQVZFU19FVkVOVF9FWEVDVVRPUgAWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgISRVZNX0VWRU5UX0VYRUNVVE9SABhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MCFFJFV0FSRF9UT0tFTl9BRERSRVNTABFLRVlfUkVXQVJEX0FNT1VOVAINUkVXQVJEX0FNT1VOVAAORlVOQ19NSU5UX01BTlkCCG1pbnRNYW55ABdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwABABZFVkVOVF9TVEFUVVNfQ09ORklSTUVEAAIAFUVWRU5UX1NUQVRVU19SRUpFQ1RFRAADAAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBD192YWxpZGF0ZVN0cmluZwIEdmFsXwRlcnJfAwkAZwIAAAkAsQIBBQR2YWxfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMJcGF5bWVudHNfB3RhcmdldF8EZXJyXwMJAQIhPQIJAJADAQUJcGF5bWVudHNfBQd0YXJnZXRfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRBc3NldAMIcGF5bWVudF8GYXNzZXRfBGVycl8DCQECIT0CCAUIcGF5bWVudF8HYXNzZXRJZAUGYXNzZXRfCQACAQUEZXJyXwYBEV92YWxpZGF0ZUV2ZW50SWR4AwR2YWxfBG1heF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZwIFBHZhbF8FBG1heF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlRXZlbnRTdGF0dXMCBHZhbF8EZXJyXwMDCQBmAgUXRVZFTlRfU1RBVFVTX1BST0NFU1NJTkcFBHZhbF8GCQBmAgUEdmFsXwUVRVZFTlRfU1RBVFVT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A25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARFfc2F2ZVByb3h5U2VjRGVwbwIIYWNjb3VudF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFEktFWV9QUk9YWV9TRUNfREVQTwkAzAgCCQClCAEFCGFjY291bnRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARlfbG9hZFByb3h5U2VjRGVwb1BlckV2ZW50AAQHJG1hdGNoMAkAnwgBBRxLRVlfUFJPWFlfU0VDX0RFUE9fUEVSX0VWRU5UAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARlfc2F2ZVByb3h5U2VjRGVwb1BlckV2ZW50AQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRxLRVlfUFJPWFlfU0VDX0RFUE9fUEVSX0VWRU5UBQR2YWxfBQNuaWwBE19sb2FkV2F2ZXNFdmVudFNpemUABAckbWF0Y2gwCQCfCAEFFEtFWV9XQVZFU19FVkVOVF9TSVpFAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARNfc2F2ZVdhdmVzRXZlbnRTaXplAQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRLRVlfV0FWRVNfRVZFTlRfU0laRQUEdmFsXwUDbmlsARFfbG9hZEVWTUV2ZW50U2l6ZQAEByRtYXRjaDAJAJ8IAQUSS0VZX0VWTV9FVkVOVF9TSVpFAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARFfc2F2ZUVWTUV2ZW50U2l6ZQEEdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUSS0VZX0VWTV9FVkVOVF9TSVpFBQR2YWxfBQNuaWwBD19sb2FkV2F2ZXNFdmVudAEGaW5kZXhfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQ9LRVlfV0FWRVNfRVZFTlQJAMwIAgkApAMBBQZpbmRleF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFCVNFUEFSQVRPUgkAnwoNCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQCRAwIFBnN0cnVjdAADCQCRAwIFBnN0cnVjdAAECQC1CQIJAJEDAgUGc3RydWN0AAUFDkFSR1NfU0VQQVJBVE9SCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAJEDAgUGc3RydWN0AAgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAKCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAsJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUGc3RydWN0AAwJAJ8KDQAAAAAAAAIAAgAFA25pbAIAAAACAAAAAAAAAAkBB0FkZHJlc3MBAQABD19zYXZlV2F2ZXNFdmVudAIGaW5kZXhfBmV2ZW50XwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUPS0VZX1dBVkVTX0VWRU5UCQDMCAIJAKQDAQUGaW5kZXhfBQNuaWwFCVNFUEFSQVRPUgkAuQkCCQDMCAIJAKQDAQgFBmV2ZW50XwJfMQkAzAgCCQCkAwEIBQZldmVudF8CXzIJAMwIAgkApAMBCAUGZXZlbnRfAl8zCQDMCAIIBQZldmVudF8CXzQJAMwIAggFBmV2ZW50XwJfNQkAzAgCCQC5CQIIBQZldmVudF8CXzYFDkFSR1NfU0VQQVJBVE9SCQDMCAIIBQZldmVudF8CXzcJAMwIAgkApAMBCAUGZXZlbnRfAl84CQDMCAIIBQZldmVudF8CXzkJAMwIAgkApAMBCAUGZXZlbnRfA18xMAkAzAgCCQCkAwEIBQZldmVudF8DXzExCQDMCAIJAKQDAQgFBmV2ZW50XwNfMTIJAMwIAgkApQgBCAUGZXZlbnRfA18xMwUDbmlsBQlTRVBBUkFUT1IFA25pbAENX2xvYWRFVk1FdmVudAEGaW5kZXhfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQ1LRVlfRVZNX0VWRU5UCQDMCAIJAKQDAQUGaW5kZXhfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQlTRVBBUkFUT1IJAJ4KDAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkAkQMCBQZzdHJ1Y3QAAwkAkQMCBQZzdHJ1Y3QABAkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQCRAwIFBnN0cnVjdAAHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAKCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAALCQCeCgwAAAAAAAACAAIAAgAAAAIAAAAAAAAACQEHQWRkcmVzcwEBAAENX3NhdmVFVk1FdmVudAIGaW5kZXhfBmV2ZW50XwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUNS0VZX0VWTV9FVkVOVAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCQCkAwEIBQZldmVudF8CXzEJAMwIAgkApAMBCAUGZXZlbnRfAl8yCQDMCAIJAKQDAQgFBmV2ZW50XwJfMwkAzAgCCAUGZXZlbnRfAl80CQDMCAIIBQZldmVudF8CXzUJAMwIAggFBmV2ZW50XwJfNgkAzAgCCQCkAwEIBQZldmVudF8CXzcJAMwIAggFBmV2ZW50XwJfOAkAzAgCCQCkAwEIBQZldmVudF8CXzkJAMwIAgkApAMBCAUGZXZlbnRfA18xMAkAzAgCCQCkAwEIBQZldmVudF8DXzExCQDMCAIJAKUIAQgFBmV2ZW50XwNfMTIFA25pbAUJU0VQQVJBVE9SBQNuaWwBFV9sb2FkV2F2ZXNFdmVudFN0YXR1cwEKZXZlbnRIYXNoXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEVX3NhdmVXYXZlc0V2ZW50U3RhdHVzAgpldmVudEhhc2hfB3N0YXR1c18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SBQdzdGF0dXNfBQNuaWwBE19sb2FkRVZNRXZlbnRTdGF0dXMBCmV2ZW50SGFzaF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFEtFWV9FVk1fRVZFTlRfU1RBVFVTCQDMCAIFCmV2ZW50SGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARNfc2F2ZUVWTUV2ZW50U3RhdHVzAgpldmVudEhhc2hfB3N0YXR1c18JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX1NUQVRVUwkAzAgCBQpldmVudEhhc2hfBQNuaWwFCVNFUEFSQVRPUgUHc3RhdHVzXwUDbmlsASFfbG9hZFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MCCnB1YmxpY0tleV8IZXZlbnRJZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGUtFWV9XQVZFU19FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEhX3NhdmVQdWJsaXNoZWRXYXZlc0V2ZW50QnlXaXRuZXNzAwpwdWJsaWNLZXlfCGV2ZW50SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRlLRVlfV0FWRVNfRVZFTlRfUFVCTElTSEVECQDMCAIFCnB1YmxpY0tleV8JAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEfX2xvYWRQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwIKcHVibGljS2V5XwhldmVudElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUXS0VZX0VWTV9FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEfX3NhdmVQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUXS0VZX0VWTV9FVkVOVF9QVUJMSVNIRUQJAMwIAgUKcHVibGljS2V5XwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARFfbG9hZEN1cnJlbnRFcG9jaAEOY2FsbGVyQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFEUtFWV9DVVJSRU5UX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARFfc2F2ZUN1cnJlbnRFcG9jaAIOY2FsbGVyQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFEUtFWV9DVVJSRU5UX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBHF9sb2FkV2F2ZXNFdmVudENhbGxlcklkeFNpemUBDmNhbGxlckNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfV0FWRVNfRVZFTlRfQ0FMTEVSCQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARxfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHhTaXplAg5jYWxsZXJDaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX1dBVkVTX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARhfbG9hZFdhdmVzRXZlbnRDYWxsZXJJZHgCDmNhbGxlckNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARhfc2F2ZVdhdmVzRXZlbnRDYWxsZXJJZHgDDmNhbGxlckNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9XQVZFU19FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBGl9sb2FkRVZNRXZlbnRDYWxsZXJJZHhTaXplAQ5jYWxsZXJDaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGl9zYXZlRVZNRXZlbnRDYWxsZXJJZHhTaXplAg5jYWxsZXJDaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEWX2xvYWRFVk1FdmVudENhbGxlcklkeAIOY2FsbGVyQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUUS0VZX0VWTV9FVkVOVF9DQUxMRVIJAMwIAgkApAMBBQ5jYWxsZXJDaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARZfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4Aw5jYWxsZXJDaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRRLRVlfRVZNX0VWRU5UX0NBTExFUgkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEeX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHhTaXplARFleGVjdXRpb25DaGFpbklkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUYS0VZX1dBVkVTX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAR5fc2F2ZVdhdmVzRXZlbnRFeGVjdXRvcklkeFNpemUCEWV4ZWN1dGlvbkNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEaX2xvYWRXYXZlc0V2ZW50RXhlY3V0b3JJZHgCEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGEtFWV9XQVZFU19FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABGl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4AxFleGVjdXRpb25DaGFpbklkXwRpZHhfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRhLRVlfV0FWRVNfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBHF9sb2FkRVZNRXZlbnRFeGVjdXRvcklkeFNpemUBEWV4ZWN1dGlvbkNoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRZLRVlfRVZNX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARxfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHhTaXplAhFleGVjdXRpb25DaGFpbklkXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUWS0VZX0VWTV9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIFCEtFWV9TSVpFBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsARhfbG9hZEVWTUV2ZW50RXhlY3V0b3JJZHgCEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARhfc2F2ZUVWTUV2ZW50RXhlY3V0b3JJZHgDEWV4ZWN1dGlvbkNoYWluSWRfBGlkeF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFFktFWV9FVk1fRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCCQCkAwEFBGlkeF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBDl9sb2FkV2l0bmVzc2VzAg5jYWxsZXJDaGFpbklkXwZlcG9jaF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFF0tFWV9XSVRORVNTRVNfUEVSX0VQT0NICQDMCAIJAKQDAQUOY2FsbGVyQ2hhaW5JZF8JAMwIAgkApAMBBQZlcG9jaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkAtQkCBQFhBQlTRVBBUkFUT1IFA25pbAEOX3NhdmVXaXRuZXNzZXMDDmNhbGxlckNoYWluSWRfBmVwb2NoXwp3aXRuZXNzZXNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRdLRVlfV0lUTkVTU0VTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDmNhbGxlckNoYWluSWRfCQDMCAIJAKQDAQUGZXBvY2hfBQNuaWwFCVNFUEFSQVRPUgkAuQkCBQp3aXRuZXNzZXNfBQlTRVBBUkFUT1IFA25pbAEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABAckbWF0Y2gwCQCiCAEFGEtFWV9SRVdBUkRfVE9LRU5fQUREUkVTUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARdfc2F2ZVJld2FyZFRva2VuQWRkcmVzcwEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MJAKUIAQUEdmFsXwUDbmlsARFfbG9hZFJld2FyZEFtb3VudAAEByRtYXRjaDAJAJ8IAQURS0VZX1JFV0FSRF9BTU9VTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUmV3YXJkQW1vdW50AQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfUkVXQVJEX0FNT1VOVAUEdmFsXwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGARBfaXNBY3RpdmVXaXRuZXNzAwpwdWJsaWNLZXlfC3B1YmxpY0tleXNfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQtwdWJsaWNLZXlzXwUKcHVibGljS2V5XwkAAgEFBGVycl8GARdfbm90Q29uZmlybWVkV2F2ZXNFdmVudAIKZXZlbnRIYXNoXwRlcnJfAwkAZgIJARVfbG9hZFdhdmVzRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwkAAgEFBGVycl8GARVfbm90Q29uZmlybWVkRVZNRXZlbnQCCmV2ZW50SGFzaF8EZXJyXwMJAAACCQETX2xvYWRFVk1FdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQHBgETX3dhdmVzRXZlbnROb3RFeGlzdAIKZXZlbnRIYXNoXwRlcnJfAwkBAiE9AgkBFV9sb2FkV2F2ZXNFdmVudFN0YXR1cwEFCmV2ZW50SGFzaF8AAAkAAgEFBGVycl8GARFfZXZtRXZlbnROb3RFeGlzdAIKZXZlbnRIYXNoXwRlcnJfAwkBAiE9AgkBE19sb2FkRVZNRXZlbnRTdGF0dXMBBQpldmVudEhhc2hfAAAJAAIBBQRlcnJfBgEgX25vdFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MDCnB1YmxpY0tleV8IZXZlbnRJZF8EZXJyXwMJAQIhPQIJASFfbG9hZFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MCBQpwdWJsaWNLZXlfBQhldmVudElkXwAACQACAQUEZXJyXwYBHl9ub3RQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMKcHVibGljS2V5XwhldmVudElkXwRlcnJfAwkAZgIJAR9fbG9hZFB1Ymxpc2hlZEVWTUV2ZW50QnlXaXRuZXNzAgUKcHVibGljS2V5XwUIZXZlbnRJZF8AAAkAAgEFBGVycl8GARBfaXNRdW9ydW1SZWFjaGVkAw5jb25maXJtYXRpb25zXwZ0b3RhbF8Md2l0bmVzc1NpemVfAwMJAGYCBQ5jb25maXJtYXRpb25zXwkAaQIFDHdpdG5lc3NTaXplXwACBgkAZgIJAGUCBQZ0b3RhbF8FDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIGBwEPX2dldEV2ZW50U3RhdHVzAw5jb25maXJtYXRpb25zXwZ0b3RhbF8Md2l0bmVzc1NpemVfAwkAZgIFDmNvbmZpcm1hdGlvbnNfCQBpAgUMd2l0bmVzc1NpemVfAAIFFkVWRU5UX1NUQVRVU19DT05GSVJNRUQDCQBmAgkAZQIFBnRvdGFsXwUOY29uZmlybWF0aW9uc18JAGkCBQx3aXRuZXNzU2l6ZV8AAgUVRVZFTlRfU1RBVFVTX1JFSkVDVEVEBRdFVkVOVF9TVEFUVVNfUFJPQ0VTU0lORwETX2NhbGNXYXZlc0V2ZW50SGFzaAEGZXZlbnRfBApldmVudEJ5dGVzCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAJoDAQgFBmV2ZW50XwJfMQkAmgMBCAUGZXZlbnRfAl8yCQCaAwEIBQZldmVudF8CXzMJAJsDAQgFBmV2ZW50XwJfNAkAmwMBCAUGZXZlbnRfAl81CQCbAwEJALkJAggFBmV2ZW50XwJfNgUOQVJHU19TRVBBUkFUT1IJAJsDAQgFBmV2ZW50XwJfNwkAmgMBCAUGZXZlbnRfAl84CQDYBAEJAIwVAQUKZXZlbnRCeXRlcwERX2NhbGNFVk1FdmVudEhhc2gBBmV2ZW50XwQKZXZlbnRCeXRlcwkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAmgMBCAUGZXZlbnRfAl8xCQCaAwEIBQZldmVudF8CXzIJAJoDAQgFBmV2ZW50XwJfMwkAmwMBCAUGZXZlbnRfAl80CQCbAwEIBQZldmVudF8CXzUJAJsDAQgFBmV2ZW50XwJfNgkAmgMBCAUGZXZlbnRfAl83CQDYBAEJAIwVAQUKZXZlbnRCeXRlcwESX3NldFdhdmVzRXZlbnRIYXNoAgZldmVudF8FaGFzaF8JAJ8KDQgFBmV2ZW50XwJfMQgFBmV2ZW50XwJfMggFBmV2ZW50XwJfMwgFBmV2ZW50XwJfNAgFBmV2ZW50XwJfNQgFBmV2ZW50XwJfNggFBmV2ZW50XwJfNwgFBmV2ZW50XwJfOAUFaGFzaF8IBQZldmVudF8DXzEwCAUGZXZlbnRfA18xMQgFBmV2ZW50XwNfMTIIBQZldmVudF8DXzEzARBfc2V0RVZNRXZlbnRIYXNoAgZldmVudF8FaGFzaF8JAJ4KDAgFBmV2ZW50XwJfMQgFBmV2ZW50XwJfMggFBmV2ZW50XwJfMwgFBmV2ZW50XwJfNAgFBmV2ZW50XwJfNQgFBmV2ZW50XwJfNggFBmV2ZW50XwJfNwUFaGFzaF8IBQZldmVudF8CXzkIBQZldmVudF8DXzEwCAUGZXZlbnRfA18xMQgFBmV2ZW50XwNfMTIBG19zZXRXYXZlc0V2ZW50Q29uZmlybWF0aW9ucwMGZXZlbnRfDmNvbmZpcm1hdGlvbnNfBnRvdGFsXwkAnwoNCAUGZXZlbnRfAl8xCAUGZXZlbnRfAl8yCAUGZXZlbnRfAl8zCAUGZXZlbnRfAl80CAUGZXZlbnRfAl81CAUGZXZlbnRfAl82CAUGZXZlbnRfAl83CAUGZXZlbnRfAl84CAUGZXZlbnRfAl85BQ5jb25maXJtYXRpb25zXwUGdG90YWxfCAUGZXZlbnRfA18xMggFBmV2ZW50XwNfMTMBGV9zZXRFVk1FdmVudENvbmZpcm1hdGlvbnMDBmV2ZW50Xw5jb25maXJtYXRpb25zXwZ0b3RhbF8JAJ4KDAgFBmV2ZW50XwJfMQgFBmV2ZW50XwJfMggFBmV2ZW50XwJfMwgFBmV2ZW50XwJfNAgFBmV2ZW50XwJfNQgFBmV2ZW50XwJfNggFBmV2ZW50XwJfNwgFBmV2ZW50XwJfOAUOY29uZmlybWF0aW9uc18FBnRvdGFsXwgFBmV2ZW50XwNfMTEIBQZldmVudF8DXzEyCQFpAQRpbml0AxVwcm94eVNlY0RlcG9QZXJFdmVudF8TcmV3YXJkVG9rZW5BZGRyZXNzXw1yZXdhcmRBbW91bnRfBANlcnIDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEMX3ZhbGlkYXRlSW50BAUVcHJveHlTZWNEZXBvUGVyRXZlbnRfAAAFB01BWF9JTlQCImluaXQ6IGludmFsaWQgcHJveHlTZWNEZXBvUGVyRXZlbnQHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFE3Jld2FyZFRva2VuQWRkcmVzc18CIGluaXQ6IGludmFsaWQgcmV3YXJkVG9rZW5BZGRyZXNzBwkBDF92YWxpZGF0ZUludAQFDXJld2FyZEFtb3VudF8AAAUHTUFYX0lOVAIaaW5pdDogaW52YWxpZCByZXdhcmRBbW91bnQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBGV9zYXZlUHJveHlTZWNEZXBvUGVyRXZlbnQBBRVwcm94eVNlY0RlcG9QZXJFdmVudF8JARdfc2F2ZVJld2FyZFRva2VuQWRkcmVzcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFE3Jld2FyZFRva2VuQWRkcmVzc18JARFfc2F2ZVJld2FyZEFtb3VudAEFDXJld2FyZEFtb3VudF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESc2V0QWN0aXZlV2l0bmVzc2VzAg5jYWxsZXJDaGFpbklkXwp3aXRuZXNzZXNfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQETX3ZhbGlkYXRlUHVibGljS2V5cwIFCndpdG5lc3Nlc18CJXNldEFjdGl2ZVdpdG5lc3NlczogaW52YWxpZCB3aXRuZXNzZXMHAwkAAAIFA2VycgUDZXJyBAVlcG9jaAkBEV9sb2FkQ3VycmVudEVwb2NoAQUOY2FsbGVyQ2hhaW5JZF8JAJQKAgkAzggCCQERX3NhdmVDdXJyZW50RXBvY2gCBQ5jYWxsZXJDaGFpbklkXwkAZAIFBWVwb2NoAAEJAQ5fc2F2ZVdpdG5lc3NlcwMFDmNhbGxlckNoYWluSWRfCQBkAgUFZXBvY2gAAQUKd2l0bmVzc2VzXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRzdWJtaXRXYXZlc0NhbGxFdmVudAgOY2FsbGVyQ2hhaW5JZF8RZXhlY3V0aW9uQ2hhaW5JZF8Gbm9uY2VfEmV4ZWN1dGlvbkNvbnRyYWN0Xw1mdW5jdGlvbk5hbWVfBWFyZ3NfB3R4SGFzaF8MYmxvY2tOdW1iZXJfBANlcnIDAwMDAwMJAQxfdmFsaWRhdGVJbnQEBQ5jYWxsZXJDaGFpbklkXwAABQdNQVhfSU5UAitzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBjYWxsZXJDaGFpbklkCQEMX3ZhbGlkYXRlSW50BAURZXhlY3V0aW9uQ2hhaW5JZF8AAAUHTUFYX0lOVAIuc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgZXhlY3V0aW9uQ2hhaW5JZAcJAQxfdmFsaWRhdGVJbnQEBQZub25jZV8AAAUHTUFYX0lOVAIjc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgbm9uY2UHCQEPX3ZhbGlkYXRlU3RyaW5nAgUSZXhlY3V0aW9uQ29udHJhY3RfAi9zdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBleGVjdXRpb25Db250cmFjdAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQ1mdW5jdGlvbk5hbWVfAipzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBmdW5jdGlvbk5hbWUHCQEPX3ZhbGlkYXRlU3RyaW5nAgUHdHhIYXNoXwIkc3VibWl0V2F2ZXNDYWxsRXZlbnQ6IGludmFsaWQgdHhIYXNoBwkBDF92YWxpZGF0ZUludAQFDGJsb2NrTnVtYmVyXwAABQdNQVhfSU5UAilzdWJtaXRXYXZlc0NhbGxFdmVudDogaW52YWxpZCBibG9ja051bWJlcgcDCQAAAgUDZXJyBQNlcnIEDHByb3h5U2VjRGVwbwkBEV9sb2FkUHJveHlTZWNEZXBvAQgFAWkGY2FsbGVyBBRwcm94eVNlY0RlcG9QZXJFdmVudAkBGV9sb2FkUHJveHlTZWNEZXBvUGVyRXZlbnQABBNwcm94eVNlY0RlcG9VcGRhdGVkCQBlAgUMcHJveHlTZWNEZXBvBRRwcm94eVNlY0RlcG9QZXJFdmVudAQFZXZlbnQJAJ8KDQUOY2FsbGVyQ2hhaW5JZF8FEWV4ZWN1dGlvbkNoYWluSWRfBQZub25jZV8FEmV4ZWN1dGlvbkNvbnRyYWN0XwUNZnVuY3Rpb25OYW1lXwUFYXJnc18FB3R4SGFzaF8FDGJsb2NrTnVtYmVyXwIAAAAAAAUUcHJveHlTZWNEZXBvUGVyRXZlbnQIBQFpBmNhbGxlcgQJZXZlbnRTaXplCQETX2xvYWRXYXZlc0V2ZW50U2l6ZQAECWV2ZW50SGFzaAkBE19jYWxjV2F2ZXNFdmVudEhhc2gBBQVldmVudAQMZXZlbnRVcGRhdGVkCQESX3NldFdhdmVzRXZlbnRIYXNoAgUFZXZlbnQFCWV2ZW50SGFzaAQEZXJyMQMJARNfd2F2ZXNFdmVudE5vdEV4aXN0AgUJZXZlbnRIYXNoAiRzdWJtaXRXYXZlc0NhbGxFdmVudDogYWxyZWFkeSBleGlzdHMJAQxfdmFsaWRhdGVJbnQEBRNwcm94eVNlY0RlcG9VcGRhdGVkAAAFB01BWF9JTlQCKXN1Ym1pdFdhdmVzQ2FsbEV2ZW50OiBubyBzZWN1cml0eSBkZXBvc2l0BwMJAAACBQRlcnIxBQRlcnIxBA1jYWxsZXJJZHhTaXplCQEcX2xvYWRXYXZlc0V2ZW50Q2FsbGVySWR4U2l6ZQEFDmNhbGxlckNoYWluSWRfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVQcm94eVNlY0RlcG8CCAUBaQZjYWxsZXIFE3Byb3h5U2VjRGVwb1VwZGF0ZWQJAQ9fc2F2ZVdhdmVzRXZlbnQCBQlldmVudFNpemUFDGV2ZW50VXBkYXRlZAkBFV9zYXZlV2F2ZXNFdmVudFN0YXR1cwIFCWV2ZW50SGFzaAUXRVZFTlRfU1RBVFVTX1BST0NFU1NJTkcJARNfc2F2ZVdhdmVzRXZlbnRTaXplAQkAZAIFCWV2ZW50U2l6ZQABCQEYX3NhdmVXYXZlc0V2ZW50Q2FsbGVySWR4AwUOY2FsbGVyQ2hhaW5JZF8FDWNhbGxlcklkeFNpemUFCWV2ZW50U2l6ZQkBHF9zYXZlV2F2ZXNFdmVudENhbGxlcklkeFNpemUCBQ5jYWxsZXJDaGFpbklkXwkAZAIFDWNhbGxlcklkeFNpemUAAQUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJzdWJtaXRFVk1DYWxsRXZlbnQHDmNhbGxlckNoYWluSWRfEWV4ZWN1dGlvbkNoYWluSWRfBm5vbmNlXxJleGVjdXRpb25Db250cmFjdF8JY2FsbGRhdGFfB3R4SGFzaF8MYmxvY2tOdW1iZXJfBANlcnIDAwMDAwMJAQxfdmFsaWRhdGVJbnQEBQ5jYWxsZXJDaGFpbklkXwAABQdNQVhfSU5UAilzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgY2FsbGVyQ2hhaW5JZAkBDF92YWxpZGF0ZUludAQFEWV4ZWN1dGlvbkNoYWluSWRfAAAFB01BWF9JTlQCLHN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBleGVjdXRpb25DaGFpbklkBwkBDF92YWxpZGF0ZUludAQFBm5vbmNlXwAABQdNQVhfSU5UAiFzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgbm9uY2UHCQEPX3ZhbGlkYXRlU3RyaW5nAgUSZXhlY3V0aW9uQ29udHJhY3RfAi1zdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgZXhlY3V0aW9uQ29udHJhY3QHCQEPX3ZhbGlkYXRlU3RyaW5nAgUJY2FsbGRhdGFfAihzdWJtaXRFVk1DYWxsRXZlbnQ6IGludmFsaWQgZnVuY3Rpb25OYW1lBwkBD192YWxpZGF0ZVN0cmluZwIFB3R4SGFzaF8CInN1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCB0eEhhc2gHCQEMX3ZhbGlkYXRlSW50BAUMYmxvY2tOdW1iZXJfAAAFB01BWF9JTlQCJ3N1Ym1pdEVWTUNhbGxFdmVudDogaW52YWxpZCBibG9ja051bWJlcgcDCQAAAgUDZXJyBQNlcnIEDHByb3h5U2VjRGVwbwkBEV9sb2FkUHJveHlTZWNEZXBvAQgFAWkGY2FsbGVyBBRwcm94eVNlY0RlcG9QZXJFdmVudAkBGV9sb2FkUHJveHlTZWNEZXBvUGVyRXZlbnQABBNwcm94eVNlY0RlcG9VcGRhdGVkCQBlAgUMcHJveHlTZWNEZXBvBRRwcm94eVNlY0RlcG9QZXJFdmVudAQFZXZlbnQJAJ4KDAUOY2FsbGVyQ2hhaW5JZF8FEWV4ZWN1dGlvbkNoYWluSWRfBQZub25jZV8FEmV4ZWN1dGlvbkNvbnRyYWN0XwUJY2FsbGRhdGFfBQd0eEhhc2hfBQxibG9ja051bWJlcl8CAAAAAAAFFHByb3h5U2VjRGVwb1BlckV2ZW50CAUBaQZjYWxsZXIECWV2ZW50U2l6ZQkBEV9sb2FkRVZNRXZlbnRTaXplAAQJZXZlbnRIYXNoCQERX2NhbGNFVk1FdmVudEhhc2gBBQVldmVudAQMZXZlbnRVcGRhdGVkCQEQX3NldEVWTUV2ZW50SGFzaAIFBWV2ZW50BQlldmVudEhhc2gEBGVycjEDCQERX2V2bUV2ZW50Tm90RXhpc3QCBQlldmVudEhhc2gCInN1Ym1pdEVWTUNhbGxFdmVudDogYWxyZWFkeSBleGlzdHMJAQxfdmFsaWRhdGVJbnQEBRNwcm94eVNlY0RlcG9VcGRhdGVkAAAFB01BWF9JTlQCJ3N1Ym1pdEVWTUNhbGxFdmVudDogbm8gc2VjdXJpdHkgZGVwb3NpdAcDCQAAAgUEZXJyMQUEZXJyMQQNY2FsbGVySWR4U2l6ZQkBGl9sb2FkRVZNRXZlbnRDYWxsZXJJZHhTaXplAQUOY2FsbGVyQ2hhaW5JZF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJARFfc2F2ZVByb3h5U2VjRGVwbwIIBQFpBmNhbGxlcgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBDV9zYXZlRVZNRXZlbnQCBQlldmVudFNpemUFDGV2ZW50VXBkYXRlZAkBE19zYXZlRVZNRXZlbnRTdGF0dXMCBQlldmVudEhhc2gFF0VWRU5UX1NUQVRVU19QUk9DRVNTSU5HCQERX3NhdmVFVk1FdmVudFNpemUBCQBkAgUJZXZlbnRTaXplAAEJARZfc2F2ZUVWTUV2ZW50Q2FsbGVySWR4AwUOY2FsbGVyQ2hhaW5JZF8FDWNhbGxlcklkeFNpemUFCWV2ZW50U2l6ZQkBGl9zYXZlRVZNRXZlbnRDYWxsZXJJZHhTaXplAgUOY2FsbGVyQ2hhaW5JZF8JAGQCBQ1jYWxsZXJJZHhTaXplAAEFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXcHVibGlzaFdhdmVzRXZlbnRTdGF0dXMCCWV2ZW50SWR4XwdzdGF0dXNfBAlldmVudFNpemUJARNfbG9hZFdhdmVzRXZlbnRTaXplAAQPY2FsbGVyUHVibGljS2V5CQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQDZXJyAwkBEV92YWxpZGF0ZUV2ZW50SWR4AwUJZXZlbnRJZHhfBQlldmVudFNpemUCKnB1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbnZhbGlkIGV2ZW50IGlkeAkBFF92YWxpZGF0ZUV2ZW50U3RhdHVzAgUHc3RhdHVzXwIncHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGludmFsaWQgc3RhdHVzBwMJAAACBQNlcnIFA2VycgQFZXZlbnQJAQ9fbG9hZFdhdmVzRXZlbnQBBQlldmVudElkeF8EDWNhbGxlckNoYWluSWQIBQVldmVudAJfMQQQZXhlY3V0aW9uQ2hhaW5JZAgFBWV2ZW50Al8yBAlldmVudEhhc2gIBQVldmVudAJfOQQSZXZlbnRDb25maXJtYXRpb25zCAUFZXZlbnQDXzEwBApldmVudFRvdGFsCAUFZXZlbnQDXzExBAxwcm94eVNlY0RlcG8IBQVldmVudANfMTIEBXByb3h5CAUFZXZlbnQDXzEzBAVlcG9jaAkBEV9sb2FkQ3VycmVudEVwb2NoAQUNY2FsbGVyQ2hhaW5JZAQPYWN0aXZlV2l0bmVzc2VzCQEOX2xvYWRXaXRuZXNzZXMCBQ1jYWxsZXJDaGFpbklkBQVlcG9jaAQEZXJyMQMDCQEQX2lzQWN0aXZlV2l0bmVzcwMJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BQ9hY3RpdmVXaXRuZXNzZXMCJ3B1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbnZhbGlkIGNhbGxlcgkBF19ub3RDb25maXJtZWRXYXZlc0V2ZW50AgUJZXZlbnRIYXNoAjBwdWJsaXNoV2F2ZXNFdmVudFN0YXR1czogZXZlbnQgYWxyZWFkeSBjb25maXJtZWQHCQEgX25vdFB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwIqcHVibGlzaFdhdmVzRXZlbnRTdGF0dXM6IGFscmVhZHkgcHVibGlzaGVkBwMJAAACBQRlcnIxBQRlcnIxBAxldmVudFVwZGF0ZWQDCQAAAgUHc3RhdHVzXwUWRVZFTlRfU1RBVFVTX0NPTkZJUk1FRAkBG19zZXRXYXZlc0V2ZW50Q29uZmlybWF0aW9ucwMFBWV2ZW50CQBkAgUSZXZlbnRDb25maXJtYXRpb25zAAEJAGQCBQpldmVudFRvdGFsAAEDCQAAAgUHc3RhdHVzXwUVRVZFTlRfU1RBVFVTX1JFSkVDVEVECQEbX3NldFdhdmVzRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQFEmV2ZW50Q29uZmlybWF0aW9ucwkAZAIFCmV2ZW50VG90YWwAAQkAAgECKXB1Ymxpc2hXYXZlc0V2ZW50U3RhdHVzOiBpbmNvcnJlY3Qgc3RhdHVzBA9leGVjdXRvcklkeFNpemUJAR5fbG9hZFdhdmVzRXZlbnRFeGVjdXRvcklkeFNpemUBBRBleGVjdXRpb25DaGFpbklkBAxmaW5hbGl6YXRpb24DCQEQX2lzUXVvcnVtUmVhY2hlZAMIBQxldmVudFVwZGF0ZWQDXzEwCAUMZXZlbnRVcGRhdGVkA18xMQkAkAMBBQ9hY3RpdmVXaXRuZXNzZXMEBnN0YXR1cwkBD19nZXRFdmVudFN0YXR1cwMIBQxldmVudFVwZGF0ZWQDXzEwCAUMZXZlbnRVcGRhdGVkA18xMQkAkAMBBQ9hY3RpdmVXaXRuZXNzZXMEE3Byb3h5U2VjRGVwb1VwZGF0ZWQDCQAAAgUGc3RhdHVzBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQERX3NhdmVQcm94eVNlY0RlcG8CBQVwcm94eQkAZAIJARFfbG9hZFByb3h5U2VjRGVwbwEFBXByb3h5BQxwcm94eVNlY0RlcG8DCQAAAgUGc3RhdHVzBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDV9sb2FkTXVsdGlzaWcABQxwcm94eVNlY0RlcG8FBHVuaXQFA25pbAUDbmlsBA9yZXdhcmRBZGRyZXNzZXMJAMwIAgkApQgBBQVwcm94eQkBFV9wdWJsaWNLZXlzVG9BZGRyc1N0cgEFD2FjdGl2ZVdpdG5lc3NlcwQQd2l0bmVzc2VzUmV3YXJkcwkA/AcECQEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABQ5GVU5DX01JTlRfTUFOWQkAzAgCCQERX2xvYWRSZXdhcmRBbW91bnQACQDMCAIFD3Jld2FyZEFkZHJlc3NlcwUDbmlsBQNuaWwDCQAAAgUQd2l0bmVzc2VzUmV3YXJkcwUQd2l0bmVzc2VzUmV3YXJkcwkAzggCCQDOCAIJAM4IAgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBFV9zYXZlV2F2ZXNFdmVudFN0YXR1cwIFCWV2ZW50SGFzaAUGc3RhdHVzCQEaX3NhdmVXYXZlc0V2ZW50RXhlY3V0b3JJZHgDBRBleGVjdXRpb25DaGFpbklkBQ9leGVjdXRvcklkeFNpemUFCWV2ZW50SWR4XwkBHl9zYXZlV2F2ZXNFdmVudEV4ZWN1dG9ySWR4U2l6ZQIFEGV4ZWN1dGlvbkNoYWluSWQJAGQCBQ9leGVjdXRvcklkeFNpemUAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsCQCUCgIJAM4IAgkAzggCCQEPX3NhdmVXYXZlc0V2ZW50AgUJZXZlbnRJZHhfBQxldmVudFVwZGF0ZWQJASFfc2F2ZVB1Ymxpc2hlZFdhdmVzRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwUHc3RhdHVzXwUMZmluYWxpemF0aW9uBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXB1Ymxpc2hFVk1FdmVudFN0YXR1cwIJZXZlbnRJZHhfB3N0YXR1c18ECWV2ZW50U2l6ZQkBEV9sb2FkRVZNRXZlbnRTaXplAAQPY2FsbGVyUHVibGljS2V5CQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQDZXJyAwkBEV92YWxpZGF0ZUV2ZW50SWR4AwUJZXZlbnRJZHhfBQlldmVudFNpemUCKHB1Ymxpc2hFVk1FdmVudFN0YXR1czogaW52YWxpZCBldmVudCBpZHgJARRfdmFsaWRhdGVFdmVudFN0YXR1cwIFB3N0YXR1c18CJXB1Ymxpc2hFVk1FdmVudFN0YXR1czogaW52YWxpZCBzdGF0dXMHAwkAAAIFA2VycgUDZXJyBAVldmVudAkBDV9sb2FkRVZNRXZlbnQBBQlldmVudElkeF8EDWNhbGxlckNoYWluSWQIBQVldmVudAJfMQQQZXhlY3V0aW9uQ2hhaW5JZAgFBWV2ZW50Al8yBAlldmVudEhhc2gIBQVldmVudAJfOAQSZXZlbnRDb25maXJtYXRpb25zCAUFZXZlbnQCXzkECmV2ZW50VG90YWwIBQVldmVudANfMTAEDHByb3h5U2VjRGVwbwgFBWV2ZW50A18xMQQFcHJveHkIBQVldmVudANfMTIEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQ1jYWxsZXJDaGFpbklkBA9hY3RpdmVXaXRuZXNzZXMJAQ5fbG9hZFdpdG5lc3NlcwIFDWNhbGxlckNoYWluSWQFBWVwb2NoBARlcnIxAwMJARBfaXNBY3RpdmVXaXRuZXNzAwkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkFD2FjdGl2ZVdpdG5lc3NlcwIlcHVibGlzaEVWTUV2ZW50U3RhdHVzOiBpbnZhbGlkIGNhbGxlcgkBFV9ub3RDb25maXJtZWRFVk1FdmVudAIFCWV2ZW50SGFzaAIucHVibGlzaEVWTUV2ZW50U3RhdHVzOiBldmVudCBhbHJlYWR5IGNvbmZpcm1lZAcJAR5fbm90UHVibGlzaGVkRVZNRXZlbnRCeVdpdG5lc3MDBQ9jYWxsZXJQdWJsaWNLZXkFCWV2ZW50SWR4XwIocHVibGlzaEVWTUV2ZW50U3RhdHVzOiBhbHJlYWR5IHB1Ymxpc2hlZAcDCQAAAgUEZXJyMQUEZXJyMQQMZXZlbnRVcGRhdGVkAwkAAAIFB3N0YXR1c18FFkVWRU5UX1NUQVRVU19DT05GSVJNRUQJARlfc2V0RVZNRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQJAGQCBRJldmVudENvbmZpcm1hdGlvbnMAAQkAZAIFCmV2ZW50VG90YWwAAQMJAAACBQdzdGF0dXNfBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJARlfc2V0RVZNRXZlbnRDb25maXJtYXRpb25zAwUFZXZlbnQFEmV2ZW50Q29uZmlybWF0aW9ucwkAZAIFCmV2ZW50VG90YWwAAQkAAgECJ3B1Ymxpc2hFVk1FdmVudFN0YXR1czogaW5jb3JyZWN0IHN0YXR1cwQPZXhlY3V0b3JJZHhTaXplCQEcX2xvYWRFVk1FdmVudEV4ZWN1dG9ySWR4U2l6ZQEFEGV4ZWN1dGlvbkNoYWluSWQEDGZpbmFsaXphdGlvbgMJARBfaXNRdW9ydW1SZWFjaGVkAwgFDGV2ZW50VXBkYXRlZAJfOQgFDGV2ZW50VXBkYXRlZANfMTAJAJADAQUPYWN0aXZlV2l0bmVzc2VzBAZzdGF0dXMJAQ9fZ2V0RXZlbnRTdGF0dXMDCAUMZXZlbnRVcGRhdGVkAl85CAUMZXZlbnRVcGRhdGVkA18xMAkAkAMBBQ9hY3RpdmVXaXRuZXNzZXMEE3Byb3h5U2VjRGVwb1VwZGF0ZWQDCQAAAgUGc3RhdHVzBRZFVkVOVF9TVEFUVVNfQ09ORklSTUVECQERX3NhdmVQcm94eVNlY0RlcG8CBQVwcm94eQkAZAIJARFfbG9hZFByb3h5U2VjRGVwbwEFBXByb3h5BQxwcm94eVNlY0RlcG8DCQAAAgUGc3RhdHVzBRVFVkVOVF9TVEFUVVNfUkVKRUNURUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDV9sb2FkTXVsdGlzaWcABQxwcm94eVNlY0RlcG8FBHVuaXQFA25pbAUDbmlsBA9yZXdhcmRBZGRyZXNzZXMJAMwIAgkApQgBBQVwcm94eQkBFV9wdWJsaWNLZXlzVG9BZGRyc1N0cgEFD2FjdGl2ZVdpdG5lc3NlcwQQd2l0bmVzc2VzUmV3YXJkcwkA/AcECQEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABQ5GVU5DX01JTlRfTUFOWQkAzAgCCQERX2xvYWRSZXdhcmRBbW91bnQACQDMCAIFD3Jld2FyZEFkZHJlc3NlcwUDbmlsBQNuaWwDCQAAAgUQd2l0bmVzc2VzUmV3YXJkcwUQd2l0bmVzc2VzUmV3YXJkcwkAzggCCQDOCAIJAM4IAgUTcHJveHlTZWNEZXBvVXBkYXRlZAkBE19zYXZlRVZNRXZlbnRTdGF0dXMCBQlldmVudEhhc2gFBnN0YXR1cwkBGF9zYXZlRVZNRXZlbnRFeGVjdXRvcklkeAMFEGV4ZWN1dGlvbkNoYWluSWQFD2V4ZWN1dG9ySWR4U2l6ZQUJZXZlbnRJZHhfCQEcX3NhdmVFVk1FdmVudEV4ZWN1dG9ySWR4U2l6ZQIFEGV4ZWN1dGlvbkNoYWluSWQJAGQCBQ9leGVjdXRvcklkeFNpemUAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsCQCUCgIJAM4IAgkAzggCCQENX3NhdmVFVk1FdmVudAIFCWV2ZW50SWR4XwUMZXZlbnRVcGRhdGVkCQEfX3NhdmVQdWJsaXNoZWRFVk1FdmVudEJ5V2l0bmVzcwMFD2NhbGxlclB1YmxpY0tleQUJZXZlbnRJZHhfBQdzdGF0dXNfBQxmaW5hbGl6YXRpb24FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXYWRkUHJveHlTZWN1cml0eURlcG9zaXQBCnJlY2lwaWVudF8ECXJlY2lwaWVudAMJAAACBQpyZWNpcGllbnRfAgAJAKUIAQgFAWkGY2FsbGVyBQpyZWNpcGllbnRfBANlcnIDAwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlyZWNpcGllbnQCKmFkZFByb3h5U2VjdXJpdHlEZXBvc2l0OiBpbnZhbGlkIHJlY2lwaWVudAkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECI2FkZFByb3h5U2VjdXJpdHlEZXBvc2l0OiBubyBwYXltZW50BwkBFV92YWxpZGF0ZVBheW1lbnRBc3NldAMJAJEDAggFAWkIcGF5bWVudHMAAAUEdW5pdAImYWRkUHJveHlTZWN1cml0eURlcG9zaXQ6IGludmFsaWQgYXNzZXQHAwkAAAIFA2VycgUDZXJyBA1yZWNpcGllbnRBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQlyZWNpcGllbnQEB2JhbGFuY2UJARFfbG9hZFByb3h5U2VjRGVwbwEFDXJlY2lwaWVudEFkZHIEDnVwZGF0ZWRCYWxhbmNlCQBkAgUHYmFsYW5jZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJQKAgkBEV9zYXZlUHJveHlTZWNEZXBvAgUNcmVjaXBpZW50QWRkcgUOdXBkYXRlZEJhbGFuY2UFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXc3ViUHJveHlTZWN1cml0eURlcG9zaXQBB2Ftb3VudF8EB2JhbGFuY2UJARFfbG9hZFByb3h5U2VjRGVwbwEIBQFpBmNhbGxlcgMJAGYCBQdhbW91bnRfBQdiYWxhbmNlCQACAQItc3ViUHJveHlTZWN1cml0eURlcG9zaXQ6IGluc3VmZmljaWVudCBiYWxhbmNlCQCUCgIJAM4IAgkBEV9zYXZlUHJveHlTZWNEZXBvAggFAWkGY2FsbGVyCQBlAgUHYmFsYW5jZQUHYW1vdW50XwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FBHVuaXQFA25pbAUEdW5pdAFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5950tDA==", "height": 2472997, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: BBv26dtDwzbvzi5M8NwjtkkfaPJxjKcUSzLHD2ZbREGe Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEPARATOR = "__"
5+
6+let ARGS_SEPARATOR = "####"
7+
8+let KEY_INIT = "INIT"
9+
10+let KEY_MULTISIG = "MULTISIG"
11+
12+let KEY_STATUS = "STATUS"
13+
14+let KEY_PROXY_SEC_DEPO = "PROXY_SECURITY_DEPOSIT"
15+
16+let KEY_PROXY_SEC_DEPO_PER_EVENT = "PROXY_SECURITY_DEPOSIT_PER_EVENT"
17+
18+let KEY_WAVES_EVENT = "WAVES_EVENT"
19+
20+let KEY_EVM_EVENT = "EVM_EVENT"
21+
22+let KEY_WAVES_EVENT_SIZE = "WAVES_EVENT_SIZE"
23+
24+let KEY_EVM_EVENT_SIZE = "EVM_EVENT_SIZE"
25+
26+let KEY_WAVES_EVENT_STATUS = "WAVES_EVENT_STATUS"
27+
28+let KEY_EVM_EVENT_STATUS = "EVM_EVENT_STATUS"
29+
30+let KEY_WAVES_EVENT_PUBLISHED = "WAVES_EVENT_PUBLISHED"
31+
32+let KEY_EVM_EVENT_PUBLISHED = "EVM_EVENT_PUBLISHED"
33+
34+let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
35+
36+let KEY_SIZE = "SIZE"
37+
38+let KEY_WAVES_EVENT_CALLER = "WAVES_EVENT_CALLER"
39+
40+let KEY_EVM_EVENT_CALLER = "EVM_EVENT_CALLER"
41+
42+let KEY_WITNESSES_PER_EPOCH = "WITNESSES_PER_EPOCH"
43+
44+let KEY_WAVES_EVENT_EXECUTOR = "WAVES_EVENT_EXECUTOR"
45+
46+let KEY_EVM_EVENT_EXECUTOR = "EVM_EVENT_EXECUTOR"
47+
48+let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
49+
50+let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
51+
52+let FUNC_MINT_MANY = "mintMany"
53+
54+let EVENT_STATUS_PROCESSING = 1
55+
56+let EVENT_STATUS_CONFIRMED = 2
57+
58+let EVENT_STATUS_REJECTED = 3
59+
60+let MAX_INT = 9223372036854775807
61+
62+func _validateAddress (address_,err_) = match addressFromString(address_) {
63+ case a: Address =>
64+ true
65+ case _ =>
66+ throw(err_)
67+}
68+
69+
70+func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
71+ case a: Asset =>
72+ true
73+ case _ =>
74+ throw(err_)
75+}
76+
77+
78+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
79+ then true
80+ else (val_ > upperBoundary_))
81+ then throw(err_)
82+ else true
83+
84+
85+func _validateString (val_,err_) = if ((0 >= size(val_)))
86+ then throw(err_)
87+ else true
88+
89+
90+func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
91+ then throw(err_)
92+ else true
93+
94+
95+func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
96+ then throw(err_)
97+ else true
98+
99+
100+func _validateEventIdx (val_,max_,err_) = if (if ((0 > val_))
101+ then true
102+ else (val_ >= max_))
103+ then throw(err_)
104+ else true
105+
106+
107+func _validateEventStatus (val_,err_) = if (if ((EVENT_STATUS_PROCESSING > val_))
108+ then true
109+ else (val_ > EVENT_STATUS_REJECTED))
110+ then throw(err_)
111+ else true
112+
113+
114+func _validatePublicKey (publicKey_,err_) = if ((size(fromBase58String(publicKey_)) != 32))
115+ then throw(err_)
116+ else true
117+
118+
119+func _validatePublicKeys (publicKeys_,err_) = {
120+ func foldFunc (acc,elem) = $Tuple2(if (acc._1)
121+ then _validatePublicKey(elem, acc._2)
122+ else false, acc._2)
123+
124+ let result = {
125+ let $l = publicKeys_
126+ let $s = size($l)
127+ let $acc0 = $Tuple2(true, err_)
128+ func $f0_1 ($a,$i) = if (($i >= $s))
129+ then $a
130+ else foldFunc($a, $l[$i])
131+
132+ func $f0_2 ($a,$i) = if (($i >= $s))
133+ then $a
134+ else throw("List size exceeds 10")
135+
136+ $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)
137+ }
138+ result._1
139+ }
140+
141+
142+func _publicKeysToAddrsStr (publicKeys_) = {
143+ func foldfunc (acc_,elem_) = (acc_ :+ addressFromPublicKey(fromBase58String(elem_)))
144+
145+ let $l = publicKeys_
146+ let $s = size($l)
147+ let $acc0 = nil
148+ func $f0_1 ($a,$i) = if (($i >= $s))
149+ then $a
150+ else foldfunc($a, $l[$i])
151+
152+ func $f0_2 ($a,$i) = if (($i >= $s))
153+ then $a
154+ else throw("List size exceeds 51")
155+
156+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
157+ }
158+
159+
160+func _loadInit () = match getBoolean(KEY_INIT) {
161+ case a: Boolean =>
162+ a
163+ case _ =>
164+ false
165+}
166+
167+
168+func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
169+
170+
171+func _loadMultisig () = match getString(KEY_MULTISIG) {
172+ case a: String =>
173+ addressFromStringValue(a)
174+ case _ =>
175+ Address(base58'')
176+}
177+
178+
179+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
180+
181+
182+func _loadProxySecDepo (account_) = match getInteger(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR)) {
183+ case a: Int =>
184+ a
185+ case _ =>
186+ 0
187+}
188+
189+
190+func _saveProxySecDepo (account_,val_) = [IntegerEntry(makeString([KEY_PROXY_SEC_DEPO, toString(account_)], SEPARATOR), val_)]
191+
192+
193+func _loadProxySecDepoPerEvent () = match getInteger(KEY_PROXY_SEC_DEPO_PER_EVENT) {
194+ case a: Int =>
195+ a
196+ case _ =>
197+ 0
198+}
199+
200+
201+func _saveProxySecDepoPerEvent (val_) = [IntegerEntry(KEY_PROXY_SEC_DEPO_PER_EVENT, val_)]
202+
203+
204+func _loadWavesEventSize () = match getInteger(KEY_WAVES_EVENT_SIZE) {
205+ case a: Int =>
206+ a
207+ case _ =>
208+ 0
209+}
210+
211+
212+func _saveWavesEventSize (val_) = [IntegerEntry(KEY_WAVES_EVENT_SIZE, val_)]
213+
214+
215+func _loadEVMEventSize () = match getInteger(KEY_EVM_EVENT_SIZE) {
216+ case a: Int =>
217+ a
218+ case _ =>
219+ 0
220+}
221+
222+
223+func _saveEVMEventSize (val_) = [IntegerEntry(KEY_EVM_EVENT_SIZE, val_)]
224+
225+
226+func _loadWavesEvent (index_) = match getString(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR)) {
227+ case a: String =>
228+ let struct = split(a, SEPARATOR)
229+ $Tuple13(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], split(struct[5], ARGS_SEPARATOR), struct[6], parseIntValue(struct[7]), struct[8], parseIntValue(struct[9]), parseIntValue(struct[10]), parseIntValue(struct[11]), addressFromStringValue(struct[12]))
230+ case _ =>
231+ $Tuple13(0, 0, 0, "", "", nil, "", 0, "", 0, 0, 0, Address(base58''))
232+}
233+
234+
235+func _saveWavesEvent (index_,event_) = [StringEntry(makeString([KEY_WAVES_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, makeString(event_._6, ARGS_SEPARATOR), event_._7, toString(event_._8), event_._9, toString(event_._10), toString(event_._11), toString(event_._12), toString(event_._13)], SEPARATOR))]
236+
237+
238+func _loadEVMEvent (index_) = match getString(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR)) {
239+ case a: String =>
240+ let struct = split(a, SEPARATOR)
241+ $Tuple12(parseIntValue(struct[0]), parseIntValue(struct[1]), parseIntValue(struct[2]), struct[3], struct[4], struct[5], parseIntValue(struct[6]), struct[7], parseIntValue(struct[8]), parseIntValue(struct[9]), parseIntValue(struct[10]), addressFromStringValue(struct[11]))
242+ case _ =>
243+ $Tuple12(0, 0, 0, "", "", "", 0, "", 0, 0, 0, Address(base58''))
244+}
245+
246+
247+func _saveEVMEvent (index_,event_) = [StringEntry(makeString([KEY_EVM_EVENT, toString(index_)], SEPARATOR), makeString([toString(event_._1), toString(event_._2), toString(event_._3), event_._4, event_._5, event_._6, toString(event_._7), event_._8, toString(event_._9), toString(event_._10), toString(event_._11), toString(event_._12)], SEPARATOR))]
248+
249+
250+func _loadWavesEventStatus (eventHash_) = match getInteger(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR)) {
251+ case a: Int =>
252+ a
253+ case _ =>
254+ 0
255+}
256+
257+
258+func _saveWavesEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
259+
260+
261+func _loadEVMEventStatus (eventHash_) = match getInteger(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR)) {
262+ case a: Int =>
263+ a
264+ case _ =>
265+ 0
266+}
267+
268+
269+func _saveEVMEventStatus (eventHash_,status_) = [IntegerEntry(makeString([KEY_EVM_EVENT_STATUS, eventHash_], SEPARATOR), status_)]
270+
271+
272+func _loadPublishedWavesEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ 0
277+}
278+
279+
280+func _savePublishedWavesEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
281+
282+
283+func _loadPublishedEVMEventByWitness (publicKey_,eventId_) = match getInteger(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR)) {
284+ case a: Int =>
285+ a
286+ case _ =>
287+ 0
288+}
289+
290+
291+func _savePublishedEVMEventByWitness (publicKey_,eventId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_PUBLISHED, publicKey_, toString(eventId_)], SEPARATOR), val_)]
292+
293+
294+func _loadCurrentEpoch (callerChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR)) {
295+ case a: Int =>
296+ a
297+ case _ =>
298+ 0
299+}
300+
301+
302+func _saveCurrentEpoch (callerChainId_,val_) = [IntegerEntry(makeString([KEY_CURRENT_EPOCH, toString(callerChainId_)], SEPARATOR), val_)]
303+
304+
305+func _loadWavesEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
306+ case a: Int =>
307+ a
308+ case _ =>
309+ 0
310+}
311+
312+
313+func _saveWavesEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
314+
315+
316+func _loadWavesEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
317+ case a: Int =>
318+ a
319+ case _ =>
320+ 0
321+}
322+
323+
324+func _saveWavesEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
325+
326+
327+func _loadEVMEventCallerIdxSize (callerChainId_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR)) {
328+ case a: Int =>
329+ a
330+ case _ =>
331+ 0
332+}
333+
334+
335+func _saveEVMEventCallerIdxSize (callerChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), KEY_SIZE], SEPARATOR), val_)]
336+
337+
338+func _loadEVMEventCallerIdx (callerChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR)) {
339+ case a: Int =>
340+ a
341+ case _ =>
342+ 0
343+}
344+
345+
346+func _saveEVMEventCallerIdx (callerChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_CALLER, toString(callerChainId_), toString(idx_)], SEPARATOR), val_)]
347+
348+
349+func _loadWavesEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
350+ case a: Int =>
351+ a
352+ case _ =>
353+ 0
354+}
355+
356+
357+func _saveWavesEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
358+
359+
360+func _loadWavesEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
361+ case a: Int =>
362+ a
363+ case _ =>
364+ 0
365+}
366+
367+
368+func _saveWavesEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_WAVES_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
369+
370+
371+func _loadEVMEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
372+ case a: Int =>
373+ a
374+ case _ =>
375+ 0
376+}
377+
378+
379+func _saveEVMEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
380+
381+
382+func _loadEVMEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
383+ case a: Int =>
384+ a
385+ case _ =>
386+ 0
387+}
388+
389+
390+func _saveEVMEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_EVM_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
391+
392+
393+func _loadWitnesses (callerChainId_,epoch_) = match getString(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR)) {
394+ case a: String =>
395+ split(a, SEPARATOR)
396+ case _ =>
397+ nil
398+}
399+
400+
401+func _saveWitnesses (callerChainId_,epoch_,witnesses_) = [StringEntry(makeString([KEY_WITNESSES_PER_EPOCH, toString(callerChainId_), toString(epoch_)], SEPARATOR), makeString(witnesses_, SEPARATOR))]
402+
403+
404+func _loadRewardTokenAddress () = match getString(KEY_REWARD_TOKEN_ADDRESS) {
405+ case a: String =>
406+ addressFromStringValue(a)
407+ case _ =>
408+ Address(base58'')
409+}
410+
411+
412+func _saveRewardTokenAddress (val_) = [StringEntry(KEY_REWARD_TOKEN_ADDRESS, toString(val_))]
413+
414+
415+func _loadRewardAmount () = match getInteger(KEY_REWARD_AMOUNT) {
416+ case a: Int =>
417+ a
418+ case _ =>
419+ 0
420+}
421+
422+
423+func _saveRewardAmount (val_) = [IntegerEntry(KEY_REWARD_AMOUNT, val_)]
424+
425+
426+func _onlyThisContract (caller_) = if ((caller_ != this))
427+ then throw("_onlyThisContract: revert")
428+ else true
429+
430+
431+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
432+ then throw("_whenMultisigSet: revert")
433+ else true
434+
435+
436+func _whenNotInitialized () = if (_loadInit())
437+ then throw("_whenNotInitialized: revert")
438+ else true
439+
440+
441+func _whenInitialized () = if (!(_loadInit()))
442+ then throw("_whenInitialized: revert")
443+ else true
444+
445+
446+func _isActiveWitness (publicKey_,publicKeys_,err_) = if (!(containsElement(publicKeys_, publicKey_)))
447+ then throw(err_)
448+ else true
449+
450+
451+func _notConfirmedWavesEvent (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) > EVENT_STATUS_PROCESSING))
452+ then throw(err_)
453+ else true
454+
455+
456+func _notConfirmedEVMEvent (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) == EVENT_STATUS_CONFIRMED))
457+ then false
458+ else true
459+
460+
461+func _wavesEventNotExist (eventHash_,err_) = if ((_loadWavesEventStatus(eventHash_) != 0))
462+ then throw(err_)
463+ else true
464+
465+
466+func _evmEventNotExist (eventHash_,err_) = if ((_loadEVMEventStatus(eventHash_) != 0))
467+ then throw(err_)
468+ else true
469+
470+
471+func _notPublishedWavesEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedWavesEventByWitness(publicKey_, eventId_) != 0))
472+ then throw(err_)
473+ else true
474+
475+
476+func _notPublishedEVMEventByWitness (publicKey_,eventId_,err_) = if ((_loadPublishedEVMEventByWitness(publicKey_, eventId_) > 0))
477+ then throw(err_)
478+ else true
479+
480+
481+func _isQuorumReached (confirmations_,total_,witnessSize_) = if (if ((confirmations_ > (witnessSize_ / 2)))
482+ then true
483+ else ((total_ - confirmations_) > (witnessSize_ / 2)))
484+ then true
485+ else false
486+
487+
488+func _getEventStatus (confirmations_,total_,witnessSize_) = if ((confirmations_ > (witnessSize_ / 2)))
489+ then EVENT_STATUS_CONFIRMED
490+ else if (((total_ - confirmations_) > (witnessSize_ / 2)))
491+ then EVENT_STATUS_REJECTED
492+ else EVENT_STATUS_PROCESSING
493+
494+
495+func _calcWavesEventHash (event_) = {
496+ let eventBytes = (((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(makeString(event_._6, ARGS_SEPARATOR))) + toBytes(event_._7)) + toBytes(event_._8))
497+ toBase58String(keccak256_16Kb(eventBytes))
498+ }
499+
500+
501+func _calcEVMEventHash (event_) = {
502+ let eventBytes = ((((((toBytes(event_._1) + toBytes(event_._2)) + toBytes(event_._3)) + toBytes(event_._4)) + toBytes(event_._5)) + toBytes(event_._6)) + toBytes(event_._7))
503+ toBase58String(keccak256_16Kb(eventBytes))
504+ }
505+
506+
507+func _setWavesEventHash (event_,hash_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, hash_, event_._10, event_._11, event_._12, event_._13)
508+
509+
510+func _setEVMEventHash (event_,hash_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, hash_, event_._9, event_._10, event_._11, event_._12)
511+
512+
513+func _setWavesEventConfirmations (event_,confirmations_,total_) = $Tuple13(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, event_._9, confirmations_, total_, event_._12, event_._13)
514+
515+
516+func _setEVMEventConfirmations (event_,confirmations_,total_) = $Tuple12(event_._1, event_._2, event_._3, event_._4, event_._5, event_._6, event_._7, event_._8, confirmations_, total_, event_._11, event_._12)
517+
518+
519+@Callable(i)
520+func init (proxySecDepoPerEvent_,rewardTokenAddress_,rewardAmount_) = {
521+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
522+ then _whenNotInitialized()
523+ else false)
524+ then _whenMultisigSet()
525+ else false)
526+ then _validateInt(proxySecDepoPerEvent_, 0, MAX_INT, "init: invalid proxySecDepoPerEvent")
527+ else false)
528+ then _validateAddress(rewardTokenAddress_, "init: invalid rewardTokenAddress")
529+ else false)
530+ then _validateInt(rewardAmount_, 0, MAX_INT, "init: invalid rewardAmount")
531+ else false
532+ if ((err == err))
533+ then $Tuple2((((_saveInit(true) ++ _saveProxySecDepoPerEvent(proxySecDepoPerEvent_)) ++ _saveRewardTokenAddress(addressFromStringValue(rewardTokenAddress_))) ++ _saveRewardAmount(rewardAmount_)), unit)
534+ else throw("Strict value is not equal to itself.")
535+ }
536+
537+
538+
539+@Callable(i)
540+func setActiveWitnesses (callerChainId_,witnesses_) = {
541+ let err = if (if (_onlyThisContract(i.caller))
542+ then _whenInitialized()
543+ else false)
544+ then _validatePublicKeys(witnesses_, "setActiveWitnesses: invalid witnesses")
545+ else false
546+ if ((err == err))
547+ then {
548+ let epoch = _loadCurrentEpoch(callerChainId_)
549+ $Tuple2((_saveCurrentEpoch(callerChainId_, (epoch + 1)) ++ _saveWitnesses(callerChainId_, (epoch + 1), witnesses_)), unit)
550+ }
551+ else throw("Strict value is not equal to itself.")
552+ }
553+
554+
555+
556+@Callable(i)
557+func submitWavesCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,functionName_,args_,txHash_,blockNumber_) = {
558+ let err = if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid callerChainId"))
559+ then _validateInt(executionChainId_, 0, MAX_INT, "submitWavesCallEvent: invalid executionChainId")
560+ else false)
561+ then _validateInt(nonce_, 0, MAX_INT, "submitWavesCallEvent: invalid nonce")
562+ else false)
563+ then _validateString(executionContract_, "submitWavesCallEvent: invalid executionContract")
564+ else false)
565+ then _validateString(functionName_, "submitWavesCallEvent: invalid functionName")
566+ else false)
567+ then _validateString(txHash_, "submitWavesCallEvent: invalid txHash")
568+ else false)
569+ then _validateInt(blockNumber_, 0, MAX_INT, "submitWavesCallEvent: invalid blockNumber")
570+ else false
571+ if ((err == err))
572+ then {
573+ let proxySecDepo = _loadProxySecDepo(i.caller)
574+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
575+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
576+ let event = $Tuple13(callerChainId_, executionChainId_, nonce_, executionContract_, functionName_, args_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
577+ let eventSize = _loadWavesEventSize()
578+ let eventHash = _calcWavesEventHash(event)
579+ let eventUpdated = _setWavesEventHash(event, eventHash)
580+ let err1 = if (_wavesEventNotExist(eventHash, "submitWavesCallEvent: already exists"))
581+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitWavesCallEvent: no security deposit")
582+ else false
583+ if ((err1 == err1))
584+ then {
585+ let callerIdxSize = _loadWavesEventCallerIdxSize(callerChainId_)
586+ $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveWavesEvent(eventSize, eventUpdated)) ++ _saveWavesEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveWavesEventSize((eventSize + 1))) ++ _saveWavesEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveWavesEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
587+ }
588+ else throw("Strict value is not equal to itself.")
589+ }
590+ else throw("Strict value is not equal to itself.")
591+ }
592+
593+
594+
595+@Callable(i)
596+func submitEVMCallEvent (callerChainId_,executionChainId_,nonce_,executionContract_,calldata_,txHash_,blockNumber_) = {
597+ let err = if (if (if (if (if (if (_validateInt(callerChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid callerChainId"))
598+ then _validateInt(executionChainId_, 0, MAX_INT, "submitEVMCallEvent: invalid executionChainId")
599+ else false)
600+ then _validateInt(nonce_, 0, MAX_INT, "submitEVMCallEvent: invalid nonce")
601+ else false)
602+ then _validateString(executionContract_, "submitEVMCallEvent: invalid executionContract")
603+ else false)
604+ then _validateString(calldata_, "submitEVMCallEvent: invalid functionName")
605+ else false)
606+ then _validateString(txHash_, "submitEVMCallEvent: invalid txHash")
607+ else false)
608+ then _validateInt(blockNumber_, 0, MAX_INT, "submitEVMCallEvent: invalid blockNumber")
609+ else false
610+ if ((err == err))
611+ then {
612+ let proxySecDepo = _loadProxySecDepo(i.caller)
613+ let proxySecDepoPerEvent = _loadProxySecDepoPerEvent()
614+ let proxySecDepoUpdated = (proxySecDepo - proxySecDepoPerEvent)
615+ let event = $Tuple12(callerChainId_, executionChainId_, nonce_, executionContract_, calldata_, txHash_, blockNumber_, "", 0, 0, proxySecDepoPerEvent, i.caller)
616+ let eventSize = _loadEVMEventSize()
617+ let eventHash = _calcEVMEventHash(event)
618+ let eventUpdated = _setEVMEventHash(event, eventHash)
619+ let err1 = if (_evmEventNotExist(eventHash, "submitEVMCallEvent: already exists"))
620+ then _validateInt(proxySecDepoUpdated, 0, MAX_INT, "submitEVMCallEvent: no security deposit")
621+ else false
622+ if ((err1 == err1))
623+ then {
624+ let callerIdxSize = _loadEVMEventCallerIdxSize(callerChainId_)
625+ $Tuple2((((((_saveProxySecDepo(i.caller, proxySecDepoUpdated) ++ _saveEVMEvent(eventSize, eventUpdated)) ++ _saveEVMEventStatus(eventHash, EVENT_STATUS_PROCESSING)) ++ _saveEVMEventSize((eventSize + 1))) ++ _saveEVMEventCallerIdx(callerChainId_, callerIdxSize, eventSize)) ++ _saveEVMEventCallerIdxSize(callerChainId_, (callerIdxSize + 1))), unit)
626+ }
627+ else throw("Strict value is not equal to itself.")
628+ }
629+ else throw("Strict value is not equal to itself.")
630+ }
631+
632+
633+
634+@Callable(i)
635+func publishWavesEventStatus (eventIdx_,status_) = {
636+ let eventSize = _loadWavesEventSize()
637+ let callerPublicKey = toBase58String(i.callerPublicKey)
638+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishWavesEventStatus: invalid event idx"))
639+ then _validateEventStatus(status_, "publishWavesEventStatus: invalid status")
640+ else false
641+ if ((err == err))
642+ then {
643+ let event = _loadWavesEvent(eventIdx_)
644+ let callerChainId = event._1
645+ let executionChainId = event._2
646+ let eventHash = event._9
647+ let eventConfirmations = event._10
648+ let eventTotal = event._11
649+ let proxySecDepo = event._12
650+ let proxy = event._13
651+ let epoch = _loadCurrentEpoch(callerChainId)
652+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
653+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishWavesEventStatus: invalid caller"))
654+ then _notConfirmedWavesEvent(eventHash, "publishWavesEventStatus: event already confirmed")
655+ else false)
656+ then _notPublishedWavesEventByWitness(callerPublicKey, eventIdx_, "publishWavesEventStatus: already published")
657+ else false
658+ if ((err1 == err1))
659+ then {
660+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
661+ then _setWavesEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
662+ else if ((status_ == EVENT_STATUS_REJECTED))
663+ then _setWavesEventConfirmations(event, eventConfirmations, (eventTotal + 1))
664+ else throw("publishWavesEventStatus: incorrect status")
665+ let executorIdxSize = _loadWavesEventExecutorIdxSize(executionChainId)
666+ let finalization = if (_isQuorumReached(eventUpdated._10, eventUpdated._11, size(activeWitnesses)))
667+ then {
668+ let status = _getEventStatus(eventUpdated._10, eventUpdated._11, size(activeWitnesses))
669+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
670+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
671+ else if ((status == EVENT_STATUS_REJECTED))
672+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
673+ else nil
674+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
675+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
676+ if ((witnessesRewards == witnessesRewards))
677+ then (((proxySecDepoUpdated ++ _saveWavesEventStatus(eventHash, status)) ++ _saveWavesEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveWavesEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
678+ else throw("Strict value is not equal to itself.")
679+ }
680+ else nil
681+ $Tuple2(((_saveWavesEvent(eventIdx_, eventUpdated) ++ _savePublishedWavesEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
682+ }
683+ else throw("Strict value is not equal to itself.")
684+ }
685+ else throw("Strict value is not equal to itself.")
686+ }
687+
688+
689+
690+@Callable(i)
691+func publishEVMEventStatus (eventIdx_,status_) = {
692+ let eventSize = _loadEVMEventSize()
693+ let callerPublicKey = toBase58String(i.callerPublicKey)
694+ let err = if (_validateEventIdx(eventIdx_, eventSize, "publishEVMEventStatus: invalid event idx"))
695+ then _validateEventStatus(status_, "publishEVMEventStatus: invalid status")
696+ else false
697+ if ((err == err))
698+ then {
699+ let event = _loadEVMEvent(eventIdx_)
700+ let callerChainId = event._1
701+ let executionChainId = event._2
702+ let eventHash = event._8
703+ let eventConfirmations = event._9
704+ let eventTotal = event._10
705+ let proxySecDepo = event._11
706+ let proxy = event._12
707+ let epoch = _loadCurrentEpoch(callerChainId)
708+ let activeWitnesses = _loadWitnesses(callerChainId, epoch)
709+ let err1 = if (if (_isActiveWitness(toBase58String(i.callerPublicKey), activeWitnesses, "publishEVMEventStatus: invalid caller"))
710+ then _notConfirmedEVMEvent(eventHash, "publishEVMEventStatus: event already confirmed")
711+ else false)
712+ then _notPublishedEVMEventByWitness(callerPublicKey, eventIdx_, "publishEVMEventStatus: already published")
713+ else false
714+ if ((err1 == err1))
715+ then {
716+ let eventUpdated = if ((status_ == EVENT_STATUS_CONFIRMED))
717+ then _setEVMEventConfirmations(event, (eventConfirmations + 1), (eventTotal + 1))
718+ else if ((status_ == EVENT_STATUS_REJECTED))
719+ then _setEVMEventConfirmations(event, eventConfirmations, (eventTotal + 1))
720+ else throw("publishEVMEventStatus: incorrect status")
721+ let executorIdxSize = _loadEVMEventExecutorIdxSize(executionChainId)
722+ let finalization = if (_isQuorumReached(eventUpdated._9, eventUpdated._10, size(activeWitnesses)))
723+ then {
724+ let status = _getEventStatus(eventUpdated._9, eventUpdated._10, size(activeWitnesses))
725+ let proxySecDepoUpdated = if ((status == EVENT_STATUS_CONFIRMED))
726+ then _saveProxySecDepo(proxy, (_loadProxySecDepo(proxy) + proxySecDepo))
727+ else if ((status == EVENT_STATUS_REJECTED))
728+ then [ScriptTransfer(_loadMultisig(), proxySecDepo, unit)]
729+ else nil
730+ let rewardAddresses = [toString(proxy), _publicKeysToAddrsStr(activeWitnesses)]
731+ let witnessesRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
732+ if ((witnessesRewards == witnessesRewards))
733+ then (((proxySecDepoUpdated ++ _saveEVMEventStatus(eventHash, status)) ++ _saveEVMEventExecutorIdx(executionChainId, executorIdxSize, eventIdx_)) ++ _saveEVMEventExecutorIdxSize(executionChainId, (executorIdxSize + 1)))
734+ else throw("Strict value is not equal to itself.")
735+ }
736+ else nil
737+ $Tuple2(((_saveEVMEvent(eventIdx_, eventUpdated) ++ _savePublishedEVMEventByWitness(callerPublicKey, eventIdx_, status_)) ++ finalization), unit)
738+ }
739+ else throw("Strict value is not equal to itself.")
740+ }
741+ else throw("Strict value is not equal to itself.")
742+ }
743+
744+
745+
746+@Callable(i)
747+func addProxySecurityDeposit (recipient_) = {
748+ let recipient = if ((recipient_ == ""))
749+ then toString(i.caller)
750+ else recipient_
751+ let err = if (if (_validateAddress(recipient, "addProxySecurityDeposit: invalid recipient"))
752+ then _validatePaymentsSize(i.payments, 1, "addProxySecurityDeposit: no payment")
753+ else false)
754+ then _validatePaymentAsset(i.payments[0], unit, "addProxySecurityDeposit: invalid asset")
755+ else false
756+ if ((err == err))
757+ then {
758+ let recipientAddr = addressFromStringValue(recipient)
759+ let balance = _loadProxySecDepo(recipientAddr)
760+ let updatedBalance = (balance + i.payments[0].amount)
761+ $Tuple2(_saveProxySecDepo(recipientAddr, updatedBalance), unit)
762+ }
763+ else throw("Strict value is not equal to itself.")
764+ }
765+
766+
767+
768+@Callable(i)
769+func subProxySecurityDeposit (amount_) = {
770+ let balance = _loadProxySecDepo(i.caller)
771+ if ((amount_ > balance))
772+ then throw("subProxySecurityDeposit: insufficient balance")
773+ else $Tuple2((_saveProxySecDepo(i.caller, (balance - amount_)) ++ [ScriptTransfer(i.caller, amount_, unit)]), unit)
774+ }
775+
776+
777+
778+@Callable(i)
779+func setMultisig (multisig_) = {
780+ let err = if (_onlyThisContract(i.caller))
781+ then _validateAddress(multisig_, "setMultisig: invalid multisig address")
782+ else false
783+ if ((err == err))
784+ then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
785+ else throw("Strict value is not equal to itself.")
786+ }
787+
788+
789+@Verifier(tx)
790+func verify () = match getString(KEY_MULTISIG) {
791+ case multisig: String =>
792+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
793+ case _ =>
794+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
795+}
796+

github/deemru/w8io/3ef1775 
91.88 ms