tx · 53sA5VLq99nvaxJCGq57b2i7agwKsWrR57fh5ahhQYQ8

3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk:  -0.06000000 Waves

2023.08.08 21:00 [3767562] smart account 3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk > SELF 0.00000000 Waves

{ "type": 13, "id": "53sA5VLq99nvaxJCGq57b2i7agwKsWrR57fh5ahhQYQ8", "fee": 6000000, "feeAssetId": null, "timestamp": 1691517641345, "version": 2, "chainId": 87, "sender": "3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk", "senderPublicKey": "DGuDyEBiewoZje46attYBabwJWnk7PPwtLi6yBjzctPV", "proofs": [ "2zsJPXwfq4cJpMbmhLRSvtuhNWwiQE7t3g33N3YXaU754ffRX4oC73hHXZEhDmMXJ2GZMny5d6JentcgwyyAZLZG" ], "script": "base64:BgJvCAISDwoNGBgBAQgIAQEBAQEIARIDCgEBEgMKAQESABIECgIIARIECgIIARIDCgEBEgQKAggBEgMKAQESBAoCCAESBQoDCAgBEgMKAQgSABIDCgEIEgASAwoBARIECgIIGBIAEgASAwoBCBIDCgEIcwADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIAwIQ9ABRNQVhfV0VJR0hUX0FNUExJRklFUgDAhD0ACk1BWF9XRUlHSFQAwIQ9ABRTTElQUEFHRV9SQVRFX0ZBQ1RPUgDAhD0AD0ZFRV9SQVRFX0ZBQ1RPUgDAhD0AC1JBVEVfRkFDVE9SAMCEPQAOUEVSQ0VOVF9GQUNUT1IJALYCAQCAoJSljR0AEFpFUk9fSU5UX0xJU1RfMTAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAABQNuaWwAEFpFUk9fSU5UX0xJU1RfMTEJAM0IAgUQWkVST19JTlRfTElTVF8xMAAAAAtaRVJPX0JJR0lOVAkAtgIBAAAAE1pFUk9fQklHSU5UX0xJU1RfMTEJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQFA25pbAAMSU5UX0RFQ0lNQUxTAAgAD0JJR0lOVF9ERUNJTUFMUwASAAdMSVNUXzY0CQC9CQICfzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzACAV8ADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwAKS0VZX1BBVVNFRAIGUEFVU0VEAApLRVlfUEFVU0VSAgZQQVVTRVIAC0tFWV9TVE9SQUdFAgdTVE9SQUdFAApLRVlfQVNTRVRTAgZBU1NFVFMAEktFWV9BU1NFVF9CQUxBTkNFUwIOQVNTRVRfQkFMQU5DRVMAEUtFWV9BU1NFVF9XRUlHSFRTAg1BU1NFVF9XRUlHSFRTAApLRVlfTFBfRkVFAgZMUF9GRUUAEEtFWV9QUk9UT0NPTF9GRUUCDFBST1RPQ09MX0ZFRQANS0VZX1BSRUNJU0lPTgIJUFJFQ0lTSU9OABRLRVlfU0lHTUFfRkVFX1BFUl9MUAIQU0lHTUFfRkVFX1BFUl9MUAAZS0VZX1VTRVJfU0lHTUFfRkVFX1BFUl9MUAIVVVNFUl9TSUdNQV9GRUVfUEVSX0xQAAtLRVlfVVNFUl9MUAIHVVNFUl9MUAAMS0VZX1RPVEFMX0xQAghUT1RBTF9MUAAQS0VZX1VTRVJfUFJPRklUUwIMVVNFUl9QUk9GSVRTARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEw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AgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMEB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwZyb3VuZF8DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJn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CgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQGYW1vdW50CQCRAwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAZAIFBGVsZW0FBmFtb3VudAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEcX2luY3JlbWVudEJhbGFuY2VzQnlQYXltZW50cwUJYmFsYW5jZXNfCXBheW1lbnRzXwdhc3NldHNfCWRlY2ltYWxzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQHcGF5bWVudAkAkQMCBQlwYXltZW50c18FBWluZGV4BA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEIBQdwYXltZW50B2Fzc2V0SWQEA2VycgMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgkAkQMCBQdhc3NldHNfBQVpbmRleAkAAgEJAKwCAgkArAICBQRlcnJfAgg6IGluZGV4PQkApAMBBQVpbmRleAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQKbmV3QmFsYW5jZQkAZAIFBGVsZW0JARJfbm9ybWFsaXplRGVjaW1hbHME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XzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaWNyb0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMJAGYCBQxlcXVpbGlicml1bV8FCGJhbGFuY2VfBAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGUCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQBmAgUJdGhyZXNob2xkBQhiYWxhbmNlXwQMbWF4RGV2aWF0aW9uCQBlAgUJdGhyZXNob2xkBQhiYWxhbmNlXwQHZmVlUmF0ZQkAawMJAGsDBQxtYXhEZXZpYXRpb24FDXNsaXBwYWdlUmF0ZV8FFFNMSVBQQUdFX1JBVEVfRkFDVE9SBQ9GRUVfUkFURV9GQUNUT1IFDGVxdWlsaWJyaXVtXwMJAGYCBQdmZWVSYXRlBQtmZWVNYXhSYXRlXwkAawMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAawMFDG1heERldmlhdGlvbgUHZmVlUmF0ZQUPRkVFX1JBVEVfRkFDVE9SAAAECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZAIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwUJdGhyZXNob2xkBAxtYXhEZXZpYXRpb24JAGUCBQhiYWxhbmNlXwUJdGhyZXNob2xkBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAENX2NhbGN1bGF0ZUZlZQcJYmFsYW5jZXNfEmFzc2V0c1RvdGFsU3VwcGx5Xwh3ZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfCgEIZm9sZEZ1bmMCA2FjYwdiYWxhbmNlBAVpbmRleAgFA2FjYwJfMQQLZXF1aWxpYnJpdW0JAGsDBRJhc3NldHNUb3RhbFN1cHBseV8JAJEDAgUId2VpZ2h0c18FBWluZGV4BQxzaWdtYVdlaWdodF8JAJQKAgkAZAIFBWluZGV4AAEJAGQCCAUDYWNjAl8yCQESX2NhbGN1bGF0ZU1pY3JvRmVlBQUHYmFsYW5jZQULZXF1aWxpYnJpdW0FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAZyZXN1bHQKAAIkbAUJYmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2THBUb3RhbFN1cHBseV8ObHBUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwMJAAACBRJwcmV2THBUb3RhbFN1cHBseV8AAAYJAAACBQ5scFRvdGFsU3VwcGx5XwAABgQOcHJldkFzc2V0c1JhdGUJAGsDCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUScHJldkxwVG90YWxTdXBwbHlfBA1uZXdBc3NldHNSYXRlCQBrAwkAZQIFEWFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFDmFzc2V0QmFsYW5jZXNfBRFhc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwULUkFURV9GQUNUT1IFDmxwVG90YWxTdXBwbHlfBARkaWZmCQBlAgUNbmV3QXNzZXRzUmF0ZQUOcHJldkFzc2V0c1JhdGUDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEFC1JBVEVfRkFDVE9SBQRkaWZmBwkAAgEJAKwCAgIqX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CRJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwQIcHJldlV0aWwJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EB25ld1V0aWwJAGUCBRFhc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBQ5hc3NldEJhbGFuY2VzXwURYXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EBGRpZmYJAGUCBQduZXdVdGlsBQhwcmV2VXRpbAMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQULUkFURV9GQUNUT1IFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAZQIFDW1heEFsbG9jYXRpb24FCGJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQMIBQNhY2MCXzIJARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HBQRlbGVtBRFhc3NldFRvdGFsU3VwcGx5XwkAkQMCBRJwcmV2QXNzZXRCYWxhbmNlc18FBWluZGV4BRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAJEDAgUNYXNzZXRXZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwUMbWF4QWxsb2NBbXBfBwQGcmVzdWx0CgACJGwFDmFzc2V0QmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI0NTg5MjQ2NjIKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI0NTg5MjQ2NjICXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjQ1ODkyNDY2MgJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI1MzEyMjUzOTEKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1MzEyMjUzOTECXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjUzMTIyNTM5MQJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjU2MTIyNTg4NwMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjU2MTIyNTg4NwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNTYxMjI1ODg3Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjYzOTYyNjQ0OQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjYzOTYyNjQ0OQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNjM5NjI2NDQ5Al8yBA0kdDAyNjQ1NDI2NTIyCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNjQ1NDI2NTIyAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI2NDU0MjY1MjICXzIEDSR0MDI2NTI4Mjc3NTgDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNjk3MDI3MDQ0CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNjk3MDI3MDQ0Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjY5NzAyNzA0NAJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI3NTg3Mjc2NjIKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzU4NzI3NjYyAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc1ODcyNzY2MgJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjY1MjgyNzc1OAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI2NTI4Mjc3NTgCXzIEDSR0MDI3NzY0Mjc4NzcJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI3NzY0Mjc4NzcCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzc2NDI3ODc3Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjg1NzIyODYyNQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjg1NzIyODYyNQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyODU3MjI4NjI1Al8yBA0kdDAyODYzMDI4NzQ0CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyODYzMDI4NzQ0Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI4NjMwMjg3NDQCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQBlAgUQYXNzZXRUb3RhbFN1cHBseQUDZmVlBAlhc3NldERpZmYJAGUCBRBhc3NldFRvdGFsU3VwcGx5BRRwcmV2QXNzZXRUb3RhbFN1cHBseQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQQTdXRpbGl0eUNoYW5nZUZhY3RvcgkAawMJAGUCBQlhc3NldERpZmYFB2ZlZURpZmYFC1JBVEVfRkFDVE9SCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEE2xwVG9rZW5zVG9NaW50SW5uZXIJAGsDBQ1scFRvdGFsU3VwcGx5BRN1dGlsaXR5Q2hhbmdlRmFjdG9yBQtSQVRFX0ZBQ1RPUgQEZXJyMwkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFE2xwVG9rZW5zVG9NaW50SW5uZXIFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjMFBGVycjMFE2xwVG9rZW5zVG9NaW50SW5uZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUObHBUb2tlbnNUb01pbnQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDF93aXRoZHJhd0FsbAEHYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDAzMDY3MTMwNzM5CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMDY3MTMwNzM5Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwNjcxMzA3MzkCXzIEDSR0MDMwNzQ0MzA3OTcJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMwNzQ0MzA3OTcCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzA3NDQzMDc5NwJfMgQObHBUb2tlbnNUb0J1cm4FB2Ftb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9CdXJuAAAFB01BWF9JTlQCKF93aXRoZHJhd0FsbDogbHBUb2tlbnNUb0J1cm4gbGVzcyB0aGFuIDADCQAAAgUDZXJyBQNlcnIEDSR0MDMwOTM5MzEwNzIJARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwURcHJldkFzc2V0QmFsYW5jZXMFDmxwVG9rZW5zVG9CdXJuBQ1scFRvdGFsU3VwcGx5BA1hc3NldEJhbGFuY2VzCAUNJHQwMzA5MzkzMTA3MgJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwOTM5MzEwNzICXzIEDWJhbGFuY2VzVG9QYXkIBQ0kdDAzMDkzOTMxMDcyAl8zBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBlAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb0J1cm4FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb0J1cm4FDWJhbGFuY2VzVG9QYXkFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCV93aXRoZHJhdwIIYXNzZXRJZF8JbHBBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDAzMTg2NDMxOTMyCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMTg2NDMxOTMyAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMxODY0MzE5MzICXzIEDSR0MDMxOTM3MzE5OTAJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMxOTM3MzE5OTACXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzE5MzczMTk5MAJfMgQQdGFyZ2V0QXNzZXRJbmRleAkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDXByZXZVdGlsVmFsdWUJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQBawkAvAIDCQC2AgEJAGUCBQ1scFRvdGFsU3VwcGx5BQlscEFtb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFDWxwVG90YWxTdXBwbHkEEnByZXZVdGlsVmFsdWVXaXRoSwkAoAMBCQC8AgMJALYCAQUNcHJldlV0aWxWYWx1ZQUBawUOUEVSQ0VOVF9GQUNUT1IKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwUQdGFyZ2V0QXNzZXRJbmRleAUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQBlAgUUdGVtcEFzc2V0VG90YWxTdXBwbHkJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMDCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsJAGcCCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsAAAcJAJYKBAYFCnN0YXJ0SW5uZXIFCXN0b3BJbm5lcgUNY3VycmVudEFtb3VudAMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlgoEBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAAACQCWCgQHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIAAAQMdGFyZ2V0QW1vdW50BA0kdDAzMzQ4OTMzNjA0CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQHAAAJAGQCBQlscEFtb3VudF8FB3ByZXZGZWUAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDY0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAEB3N1Y2Nlc3MIBQ0kdDAzMzQ4OTMzNjA0Al8xBAhzdGFydE91dAgFDSR0MDMzNDg5MzM2MDQCXzIEB3N0b3BPdXQIBQ0kdDAzMzQ4OTMzNjA0Al8zBA90YXJnZXRBbW91bnRPdXQIBQ0kdDAzMzQ4OTMzNjA0Al80AwkBASEBBQdzdWNjZXNzCQACAQkArAICAihfd2l0aGRyYXc6IGNhbid0IGNhbGN1bGF0ZSB0YXJnZXRBbW91bnQ9CQCkAwEFD3RhcmdldEFtb3VudE91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwUQdGFyZ2V0QXNzZXRJbmRleAUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BARlcnIxAwkBE192YWxpZGF0ZUFsbG9jYXRpb24HBRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BQlscEFtb3VudF8FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzNDQ3OTM0NjE5CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEHRhcmdldEFzc2V0SW5kZXgAAQUMdGFyZ2V0QW1vdW50BQlscEZlZVJhdGUFD3Byb3RvY29sRmVlUmF0ZQQFbHBGZWUIBQ0kdDAzNDQ3OTM0NjE5Al8xBAtwcm90b2NvbEZlZQgFDSR0MDM0NDc5MzQ2MTkCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzQ0NzkzNDYxOQJfMwkAlwoFBQx0YXJnZXRBbW91bnQFEmZpbmFsQXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEFX3N3YXADEXNvdXJjZUFzc2V0SW5kZXhfEXRhcmdldEFzc2V0SW5kZXhfDXNvdXJjZUFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEDSR0MDM1MjAxMzUyNjkJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDM1MjAxMzUyNjkCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzUyMDEzNTI2OQJfMgQNJHQwMzUyNzQzNTMyNwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzUyNzQzNTMyNwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzNTI3NDM1MzI3Al8yBA1hc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBQ1zb3VyY2VBbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDXNvdXJjZUFtb3VudF8EB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQNcHJldlV0aWxWYWx1ZQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQBlAgUUdGVtcEFzc2V0VG90YWxTdXBwbHkJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMDCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBnAgkAZQIFCXV0aWxWYWx1ZQUNcHJldlV0aWxWYWx1ZQAABwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAZgIAAAkAZQIFCXV0aWxWYWx1ZQUNcHJldlV0aWxWYWx1ZQkAlgoEBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAAACQCWCgQHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIAAAQMdGFyZ2V0QW1vdW50BAx0YXJnZXRBbW91bnQFDXNvdXJjZUFtb3VudF8EEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDHRhcmdldEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlAwkAAAIFB2ZlZURpZmYAAAUMdGFyZ2V0QW1vdW50BA0kdDAzNzE3ODM3Mjk3CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQHAAAJAGQCBQ1zb3VyY2VBbW91bnRfBQdwcmV2RmVlAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzcxNzgzNzI5NwJfMQQIc3RhcnRPdXQIBQ0kdDAzNzE3ODM3Mjk3Al8yBAdzdG9wT3V0CAUNJHQwMzcxNzgzNzI5NwJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzcxNzgzNzI5NwJfNAMJAQEhAQUHc3VjY2VzcwkAAgEJAKwCAgIkX3N3YXA6IGNhbid0IGNhbGN1bGF0ZSB0YXJnZXRBbW91bnQ9CQCkAwEFD3RhcmdldEFtb3VudE91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzODExMDM4MjUxCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwMzgxMTAzODI1MQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzODExMDM4MjUxAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDM4MTEwMzgyNTECXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4VAWkBBGluaXQNB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwQDZXJyAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAAUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwAABQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcDCQAAAgUDZXJyBQNlcnIEDSR0MDQwMDMyNDAxMDEJARRfcHJlcGFyZUFzc2V0V2VpZ2h0cwEFDWFzc2V0V2VpZ2h0c18EDGFzc2V0V2VpZ2h0cwgFDSR0MDQwMDMyNDAxMDECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNDAwMzI0MDEwMQJfMgQNYXNzZXRCYWxhbmNlcwkBFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEFB2Fzc2V0c18EBWlzc3VlCQDCCAUFDGxwVG9rZW5OYW1lXwUNbHBUb2tlbkRlc2NyXwAABRBscFRva2VuRGVjaW1hbHNfBgQJbHBBc3NldElkCQC4CAEFBWlzc3VlBA5zdG9yYWdlVXBkYXRlZAkAnAoKBQlscEFzc2V0SWQGAAAFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8FF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQxNzk0NDE4NzkJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDE3OTQ0MTg3OQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQxNzk0NDE4NzkCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MTc5NDQxODc5Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQzMDIyNDMwODQKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQzMDIyNDMwODQCXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0MzAyMjQzMDg0Al8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBARlcnIxAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIeZGVwb3NpdDogaW52YWxpZCBwYXltZW50cyBzaXplBwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIeZGVwb3NpdDogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCH2RlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFBGVycjEFBGVycjEECGFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldFN0cgQQYW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA0NDQ2MzQ0NTM3CQEIX2RlcG9zaXQCBQhhc3NldFN0cgUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NDQ2MzQ0NTM3Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDQ0NjM0NDUzNwJfMgQEZXJyMgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9NaW50BQxtaW5McEFtb3VudF8FB01BWF9JTlQCGWRlcG9zaXQ6IGxlc3MgdGhhbiBtaW4gbHADCQAAAgUEZXJyMgUEZXJyMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0FsbAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ1NzU4NDU4NDUJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0NTc1ODQ1ODQ1Al8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDU3NTg0NTg0NQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ1NzU4NDU4NDUCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDcxNzE0NzMwNQkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ3MTcxNDczMDUCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ3MTcxNDczMDUCXzIEBWxwRmVlCAUNJHQwNDcxNzE0NzMwNQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NzE3MTQ3MzA1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ3MTcxNDczMDUCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAiN3aXRoZHJhdzogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFCGFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUIYXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUIYXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQhhc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACDnRhcmdldEFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQOc291cmNlQXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRTdHIFCmxwRGVjaW1hbHMFBERPV04EEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0U3RyAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQDZXJyAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfdmFsaWRhdGVJbnQEBQptaW5BbW91bnRfAAAFB01BWF9JTlQCH3N3YXA6IGludmFsaWQgbWluIHRhcmdldCBhbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAAABQdNQVhfSU5UAhtzd2FwOiBpbnZhbGlkIHNvdXJjZSBhbW91bnQHCQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldFN0cgUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIbc3dhcDogaW52YWxpZCBwYXltZW50cyBzaXplBwMJAAACBQNlcnIFA2VycgQNJHQwNDk0MDI0OTU2MAkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ5NDAyNDk1NjACXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ5NDAyNDk1NjACXzIEBWxwRmVlCAUNJHQwNDk0MDI0OTU2MAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0OTQwMjQ5NTYwAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ5NDAyNDk1NjACXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAh9zd2FwOiBpbnN1ZmZpY2llbnQgZmluYWwgYW1vdW50AwkAAAIFBGVycjEFBGVycjEJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULZmluYWxBbW91bnQJAQtfc3RyVG9Bc3NldAEFDnRhcmdldEFzc2V0SWRfBQNuaWwJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQ50YXJnZXRBc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDnRhcmdldEFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZ2V0RGVwb3NpdEFsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIdZ2V0RGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUwNjkyNTA3NzkJAQtfZGVwb3NpdEFsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MDY5MjUwNzc5Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNTA2OTI1MDc3OQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDUwNjkyNTA3NzkCXzMJAJQKAgUDbmlsCQCUCgIFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmdldERlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIZZ2V0RGVwb3NpdDogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZ2V0RGVwb3NpdDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA1MTUzODUxNjEyCQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MTUzODUxNjEyAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTE1Mzg1MTYxMgJfMgkAlAoCBQNuaWwFDmxwVG9rZW5zVG9NaW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmdldFdpdGhkcmF3QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUxOTg5NTIwNjUJAQxfd2l0aGRyYXdBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNTE5ODk1MjA2NQJfMQQNYmFsYW5jZXNUb0dldAgFDSR0MDUxOTg5NTIwNjUCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MTk4OTUyMDY1Al8zCQCUCgIFA25pbAUNYmFsYW5jZXNUb0dldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtnZXRXaXRoZHJhdwIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhpnZXRXaXRoZHJhdzogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIbZ2V0V2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNJHQwNTI3MTY1MjgzMgkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTI3MTY1MjgzMgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUyNzE2NTI4MzICXzIEBWxwRmVlCAUNJHQwNTI3MTY1MjgzMgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1MjcxNjUyODMyAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUyNzE2NTI4MzICXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2dldFN3YXADDnNvdXJjZUFzc2V0SWRfDnRhcmdldEFzc2V0SWRfDXNvdXJjZUFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRJZF8CGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUNc291cmNlQW1vdW50XwkBDF9nZXREZWNpbWFscwEFDnNvdXJjZUFzc2V0SWRfBQpscERlY2ltYWxzBQRET1dOBANlcnIDCQEMX3ZhbGlkYXRlSW50BAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAAABQdNQVhfSU5UAhtzd2FwOiBpbnZhbGlkIHNvdXJjZSBhbW91bnQJARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFDnNvdXJjZUFzc2V0SWRfBQ50YXJnZXRBc3NldElkXwIRc3dhcDogc2FtZSBhc3NldHMHAwkAAAIFA2VycgUDZXJyBA0kdDA1NDI0NjU0NDA0CQEFX3N3YXADBRBzb3VyY2VBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BRZzb3VyY2VBbW91bnROb3JtYWxpemVkBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTQyNDY1NDQwNAJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNTQyNDY1NDQwNAJfMgQFbHBGZWUIBQ0kdDA1NDI0NjU0NDA0Al8zBAtwcm90b2NvbEZlZQgFDSR0MDU0MjQ2NTQ0MDQCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTQyNDY1NDQwNAJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZ2V0Q2xhaW0BBXVzZXJfBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhZnZXRDbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEDSR0MDU1MDQ2NTUxMDIJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTUwNDY1NTEwMgJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1NTA0NjU1MTAyAl8yCQCUCgIFA25pbAULdXNlclByb2ZpdHMBaQELZ2V0VXRpbEZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDA1NTQzNTU1NDk1CQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU1NDM1NTU0OTUCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1NTQzNTU1NDk1Al8yBA0kdDA1NTUwMDU1NTUzCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDA1NTUwMDU1NTUzAl8xBAtzaWdtYVdlaWdodAgFDSR0MDU1NTAwNTU1NTMCXzIEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQJdXRpbFZhbHVlCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUDZmVlCQCUCgIFA25pbAkAlAoCBQl1dGlsVmFsdWUFDWxwVG90YWxTdXBwbHkBaQEKY2hlY2twb2ludAEFdXNlcl8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CGGNoZWNrcG9pbnQ6IGludmFsaWQgdXNlcggFAWkGY2FsbGVyCQELX2NoZWNrcG9pbnQBBQR1c2VyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YWtlAAQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgFB3N0b3JhZ2UCXzEEBGVycjEDAwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIcc3Rha2U6IGludmFsaWQgcGF5bWVudHMgc2l6ZQkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHHN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIdc3Rha2U6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFBGVycjEFBGVycjEEDSR0MDU2NjI2NTY2ODYJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1NjYyNjU2Njg2Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU2NjI2NTY2ODYCXzIJAJQKAgkAzggCCQDOCAIFEWNoZWNrcG9pbnRBY3Rpb25zCQELX3NhdmVVc2VyTHACCAUBaQZjYWxsZXIJAGQCCQELX2xvYWRVc2VyTHABCAUBaQZjYWxsZXIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQEMX3NhdmVUb3RhbExwAQkAZAIJAQxfbG9hZFRvdGFsTHAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnN0YWtlAQdhbW91bnRfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQGdXNlckxwCQELX2xvYWRVc2VyTHABCAUBaQZjYWxsZXIEBGVycjEJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFBnVzZXJMcAIXdW5zdGFrZTogaW52YWxpZCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQQNJHQwNTcxOTc1NzI1NwkBC19jaGVja3BvaW50AQgFAWkGY2FsbGVyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3MTk3NTcyNTcCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTcxOTc1NzI1NwJfMgkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHYW1vdW50XwUJbHBBc3NldElkBQNuaWwFEWNoZWNrcG9pbnRBY3Rpb25zCQELX3NhdmVVc2VyTHACCAUBaQZjYWxsZXIJAGUCBQZ1c2VyTHAFB2Ftb3VudF8JAQxfc2F2ZVRvdGFsTHABCQBlAgkBDF9sb2FkVG90YWxMcAAFB2Ftb3VudF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0CBXVzZXJfB2Fzc2V0c18EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAkAkAMBBQdhc3NldHNfAAEACgIaY2xhaW06IGludmFsaWQgYXNzZXRzIHNpemUHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhNjbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEFCWxwQXNzZXRJZAQGYXNzZXRzCQDMCAIFDGxwQXNzZXRJZFN0cgkBC19sb2FkQXNzZXRzAAQIbWF4SW5kZXgJAGUCCQCQAwEFBmFzc2V0cwABBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBHVzZXIEDSR0MDU4MDgwNTgxMzYJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTgwODA1ODEzNgJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1ODA4MDU4MTM2Al8yCgEIZm9sZEZ1bmMCA2FjYwZwcm9maXQEBWluZGV4CAUDYWNjAl8xAwkAZgIFBWluZGV4BQhtYXhJbmRleAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEBWFzc2V0CQCRAwIFBmFzc2V0cwUFaW5kZXgDCQEPY29udGFpbnNFbGVtZW50AgUHYXNzZXRzXwUFYXNzZXQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgAACQDNCAIIBQNhY2MCXzMJAQ5TY3JpcHRUcmFuc2ZlcgMFBHVzZXIFBnByb2ZpdAkBC19zdHJUb0Fzc2V0AQUFYXNzZXQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUGcHJvZml0CAUDYWNjAl8zBA0kdDA1ODYyNTU4NzE2CgACJGwFC3VzZXJQcm9maXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDA1ODYyNTU4NzE2Al8xBBJ1c2VyUHJvZml0c1VwZGF0ZWQIBQ0kdDA1ODYyNTU4NzE2Al8yBA1wcm9maXRBY3Rpb25zCAUNJHQwNTg2MjU1ODcxNgJfMwkAlAoCCQDOCAIJAM4IAgUNcHJvZml0QWN0aW9ucwkA0QgCBRFjaGVja3BvaW50QWN0aW9ucwAACQEQX3NhdmVVc2VyUHJvZml0cwIFBHVzZXIFEnVzZXJQcm9maXRzVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFA1NFUAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXn3No8X", "height": 3767562, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 7KkLjrrYvT7yoKipLywrPCaokBf4gNzktCNmGk4GXKcF Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let WAVES = "waves"
7+
8+let MAX_INT = 9223372036854775807
9+
10+let MAX_FEE = 1000000
11+
12+let MAX_AMPLIFIER = 1000000
13+
14+let MAX_WEIGHT_AMPLIFIER = 1000000
15+
16+let MAX_WEIGHT = 1000000
17+
18+let SLIPPAGE_RATE_FACTOR = 1000000
19+
20+let FEE_RATE_FACTOR = 1000000
21+
22+let RATE_FACTOR = 1000000
23+
24+let PERCENT_FACTOR = toBigInt(1000000000000)
25+
26+let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
27+
28+let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
29+
30+let ZERO_BIGINT = toBigInt(0)
31+
32+let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
33+
34+let INT_DECIMALS = 8
35+
36+let BIGINT_DECIMALS = 18
37+
38+let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
39+
40+let KEY_MULTISIG = "MULTISIG"
41+
42+let KEY_STATUS = "STATUS"
43+
44+let KEY_PAUSED = "PAUSED"
45+
46+let KEY_PAUSER = "PAUSER"
47+
48+let KEY_STORAGE = "STORAGE"
49+
50+let KEY_ASSETS = "ASSETS"
51+
52+let KEY_ASSET_BALANCES = "ASSET_BALANCES"
53+
54+let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
55+
56+let KEY_LP_FEE = "LP_FEE"
57+
58+let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
59+
60+let KEY_PRECISION = "PRECISION"
61+
62+let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
63+
64+let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
65+
66+let KEY_USER_LP = "USER_LP"
67+
68+let KEY_TOTAL_LP = "TOTAL_LP"
69+
70+let KEY_USER_PROFITS = "USER_PROFITS"
71+
72+func _validateAddress (address_,err_) = match addressFromString(address_) {
73+ case a: Address =>
74+ true
75+ case _ =>
76+ throw(err_)
77+}
78+
79+
80+func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
81+ then true
82+ else match assetInfo(fromBase58String(assetId_)) {
83+ case a: Asset =>
84+ true
85+ case _ =>
86+ throw(err_)
87+ }
88+
89+
90+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
91+ then true
92+ else (val_ > upperBoundary_))
93+ then throw(err_)
94+ else true
95+
96+
97+func _validateBool (val_,target_,err_) = if ((val_ != target_))
98+ then throw(err_)
99+ else true
100+
101+
102+func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103+ then throw(err_)
104+ else true
105+
106+
107+func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108+ then throw(err_)
109+ else true
110+
111+
112+func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113+ func foldFunc (acc,elem) = match parseInt(elem) {
114+ case a: Int =>
115+ if (acc)
116+ then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117+ else false
118+ case _ =>
119+ throw(err_)
120+ }
121+
122+ let $l = val_
123+ let $s = size($l)
124+ let $acc0 = true
125+ func $f0_1 ($a,$i) = if (($i >= $s))
126+ then $a
127+ else foldFunc($a, $l[$i])
128+
129+ func $f0_2 ($a,$i) = if (($i >= $s))
130+ then $a
131+ else throw("List size exceeds 10")
132+
133+ $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)
134+ }
135+
136+
137+func _validateAssets (assets_,err_) = {
138+ func foldFunc (acc,elem) = if (acc)
139+ then _validateAsset(elem, err_)
140+ else false
141+
142+ let $l = assets_
143+ let $s = size($l)
144+ let $acc0 = true
145+ func $f0_1 ($a,$i) = if (($i >= $s))
146+ then $a
147+ else foldFunc($a, $l[$i])
148+
149+ func $f0_2 ($a,$i) = if (($i >= $s))
150+ then $a
151+ else throw("List size exceeds 10")
152+
153+ $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)
154+ }
155+
156+
157+func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158+ then throw(err_)
159+ else true
160+
161+
162+func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163+ then true
164+ else (size(val_) > 16))
165+ then throw(err_)
166+ else true
167+
168+
169+func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170+ then throw(err_)
171+ else true
172+
173+
174+func _validateDecimals (val_,err_) = if (if ((0 > val_))
175+ then true
176+ else (val_ > 8))
177+ then throw(err_)
178+ else true
179+
180+
181+func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182+ case a: ByteVector =>
183+ if ((assetId_ != toBase58String(a)))
184+ then throw((err_ + ": asset"))
185+ else if ((requiredAmount_ > payment_.amount))
186+ then throw((err_ + ": amount"))
187+ else true
188+ case _ =>
189+ throw((err_ + ": asset"))
190+}
191+
192+
193+func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194+ then throw(err_)
195+ else true
196+
197+
198+func _assetToStr (asset_) = match asset_ {
199+ case a: ByteVector =>
200+ toBase58String(a)
201+ case _ =>
202+ WAVES
203+}
204+
205+
206+func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207+ then true
208+ else (asset_ == ""))
209+ then unit
210+ else fromBase58String(asset_)
211+
212+
213+func _loadPause () = match getBoolean(KEY_PAUSED) {
214+ case a: Boolean =>
215+ a
216+ case _ =>
217+ false
218+}
219+
220+
221+func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222+
223+
224+func _loadPauser () = match getString(KEY_PAUSER) {
225+ case a: String =>
226+ addressFromStringValue(a)
227+ case _ =>
228+ Address(base58'')
229+}
230+
231+
232+func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233+
234+
235+func _loadMultisig () = match getString(KEY_MULTISIG) {
236+ case a: String =>
237+ addressFromStringValue(a)
238+ case _ =>
239+ Address(base58'')
240+}
241+
242+
243+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244+
245+
246+func _loadStorage () = match getString(KEY_STORAGE) {
247+ case a: String =>
248+ let struct = split(a, SEP)
249+ $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
250+ case _ =>
251+ $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252+}
253+
254+
255+func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256+ then "1"
257+ else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
258+
259+
260+func _loadAssets () = match getString(KEY_ASSETS) {
261+ case a: String =>
262+ if ((size(a) > 0))
263+ then split_51C(a, SEP)
264+ else nil
265+ case _ =>
266+ nil
267+}
268+
269+
270+func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271+
272+
273+func _loadAssetBalances () = {
274+ func foldFunc (acc,elem) = {
275+ let balance = parseIntValue(elem)
276+ $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277+ }
278+
279+ match getString(KEY_ASSET_BALANCES) {
280+ case a: String =>
281+ if ((size(a) > 0))
282+ then {
283+ let $l = split_51C(a, SEP)
284+ let $s = size($l)
285+ let $acc0 = $Tuple2(nil, 0)
286+ func $f0_1 ($a,$i) = if (($i >= $s))
287+ then $a
288+ else foldFunc($a, $l[$i])
289+
290+ func $f0_2 ($a,$i) = if (($i >= $s))
291+ then $a
292+ else throw("List size exceeds 10")
293+
294+ $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)
295+ }
296+ else $Tuple2(ZERO_INT_LIST_10, 0)
297+ case _ =>
298+ $Tuple2(ZERO_INT_LIST_10, 0)
299+ }
300+ }
301+
302+
303+func _saveAssetBalances (balances_) = {
304+ func foldFunc (acc,elem) = (acc :+ toString(elem))
305+
306+[StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307+ let $l = balances_
308+ let $s = size($l)
309+ let $acc0 = nil
310+ func $f0_1 ($a,$i) = if (($i >= $s))
311+ then $a
312+ else foldFunc($a, $l[$i])
313+
314+ func $f0_2 ($a,$i) = if (($i >= $s))
315+ then $a
316+ else throw("List size exceeds 10")
317+
318+ $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)
319+ }, SEP))]
320+ }
321+
322+
323+func _loadAssetWeights () = {
324+ func foldFunc (acc,elem) = {
325+ let weight = parseIntValue(elem)
326+ $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327+ }
328+
329+ match getString(KEY_ASSET_WEIGHTS) {
330+ case a: String =>
331+ if ((size(a) > 0))
332+ then {
333+ let $l = split_51C(a, SEP)
334+ let $s = size($l)
335+ let $acc0 = $Tuple2(nil, 0)
336+ func $f0_1 ($a,$i) = if (($i >= $s))
337+ then $a
338+ else foldFunc($a, $l[$i])
339+
340+ func $f0_2 ($a,$i) = if (($i >= $s))
341+ then $a
342+ else throw("List size exceeds 10")
343+
344+ $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)
345+ }
346+ else $Tuple2(ZERO_INT_LIST_10, 0)
347+ case _ =>
348+ $Tuple2(ZERO_INT_LIST_10, 0)
349+ }
350+ }
351+
352+
353+func _saveAssetWeights (weights_) = {
354+ func foldFunc (acc,elem) = (acc :+ toString(elem))
355+
356+[StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357+ let $l = weights_
358+ let $s = size($l)
359+ let $acc0 = nil
360+ func $f0_1 ($a,$i) = if (($i >= $s))
361+ then $a
362+ else foldFunc($a, $l[$i])
363+
364+ func $f0_2 ($a,$i) = if (($i >= $s))
365+ then $a
366+ else throw("List size exceeds 10")
367+
368+ $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)
369+ }, SEP))]
370+ }
371+
372+
373+func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374+ case a: Int =>
375+ a
376+ case _ =>
377+ 0
378+}
379+
380+
381+func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382+
383+
384+func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385+ case a: Int =>
386+ a
387+ case _ =>
388+ 0
389+}
390+
391+
392+func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393+
394+
395+func _loadPrecision () = match getInteger(KEY_PRECISION) {
396+ case a: Int =>
397+ a
398+ case _ =>
399+ 0
400+}
401+
402+
403+func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404+
405+
406+func _loadSigmaFeePerLp () = {
407+ func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408+
409+ match getString(KEY_SIGMA_FEE_PER_LP) {
410+ case a: String =>
411+ if ((size(a) > 0))
412+ then {
413+ let $l = split_51C(a, SEP)
414+ let $s = size($l)
415+ let $acc0 = nil
416+ func $f0_1 ($a,$i) = if (($i >= $s))
417+ then $a
418+ else foldFunc($a, $l[$i])
419+
420+ func $f0_2 ($a,$i) = if (($i >= $s))
421+ then $a
422+ else throw("List size exceeds 11")
423+
424+ $f0_2($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)
425+ }
426+ else ZERO_BIGINT_LIST_11
427+ case _ =>
428+ ZERO_BIGINT_LIST_11
429+ }
430+ }
431+
432+
433+func _saveSigmaFeePerLp (val_) = {
434+ func foldFunc (acc,elem) = (acc :+ toString(elem))
435+
436+[StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437+ let $l = val_
438+ let $s = size($l)
439+ let $acc0 = nil
440+ func $f0_1 ($a,$i) = if (($i >= $s))
441+ then $a
442+ else foldFunc($a, $l[$i])
443+
444+ func $f0_2 ($a,$i) = if (($i >= $s))
445+ then $a
446+ else throw("List size exceeds 11")
447+
448+ $f0_2($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)
449+ }, SEP))]
450+ }
451+
452+
453+func _loadUserSigmaFeePerLp (user_) = {
454+ func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455+
456+ match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457+ case a: String =>
458+ if ((size(a) > 0))
459+ then {
460+ let $l = split_51C(a, SEP)
461+ let $s = size($l)
462+ let $acc0 = nil
463+ func $f0_1 ($a,$i) = if (($i >= $s))
464+ then $a
465+ else foldFunc($a, $l[$i])
466+
467+ func $f0_2 ($a,$i) = if (($i >= $s))
468+ then $a
469+ else throw("List size exceeds 11")
470+
471+ $f0_2($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)
472+ }
473+ else ZERO_BIGINT_LIST_11
474+ case _ =>
475+ ZERO_BIGINT_LIST_11
476+ }
477+ }
478+
479+
480+func _saveUserSigmaFeePerLp (user_,val_) = {
481+ func foldFunc (acc,elem) = (acc :+ toString(elem))
482+
483+[StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484+ let $l = val_
485+ let $s = size($l)
486+ let $acc0 = nil
487+ func $f0_1 ($a,$i) = if (($i >= $s))
488+ then $a
489+ else foldFunc($a, $l[$i])
490+
491+ func $f0_2 ($a,$i) = if (($i >= $s))
492+ then $a
493+ else throw("List size exceeds 11")
494+
495+ $f0_2($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)
496+ }, SEP))]
497+ }
498+
499+
500+func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501+ case a: Int =>
502+ a
503+ case _ =>
504+ 0
505+}
506+
507+
508+func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509+
510+
511+func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512+ case a: Int =>
513+ a
514+ case _ =>
515+ 0
516+}
517+
518+
519+func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520+
521+
522+func _loadUserProfits (user_) = {
523+ func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524+
525+ match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526+ case a: String =>
527+ if ((size(a) > 0))
528+ then {
529+ let $l = split_51C(a, SEP)
530+ let $s = size($l)
531+ let $acc0 = nil
532+ func $f0_1 ($a,$i) = if (($i >= $s))
533+ then $a
534+ else foldFunc($a, $l[$i])
535+
536+ func $f0_2 ($a,$i) = if (($i >= $s))
537+ then $a
538+ else throw("List size exceeds 11")
539+
540+ $f0_2($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)
541+ }
542+ else ZERO_INT_LIST_11
543+ case _ =>
544+ ZERO_INT_LIST_11
545+ }
546+ }
547+
548+
549+func _saveUserProfits (user_,val_) = {
550+ func foldFunc (acc,elem) = (acc :+ toString(elem))
551+
552+[StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553+ let $l = val_
554+ let $s = size($l)
555+ let $acc0 = nil
556+ func $f0_1 ($a,$i) = if (($i >= $s))
557+ then $a
558+ else foldFunc($a, $l[$i])
559+
560+ func $f0_2 ($a,$i) = if (($i >= $s))
561+ then $a
562+ else throw("List size exceeds 11")
563+
564+ $f0_2($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)
565+ }, SEP))]
566+ }
567+
568+
569+func _onlyThisContract (caller_) = if ((caller_ != this))
570+ then throw("_onlyThisContract: revert")
571+ else true
572+
573+
574+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575+ then throw("_whenMultisigSet: revert")
576+ else true
577+
578+
579+func _whenNotInitialized () = {
580+ let storage = _loadStorage()
581+ if ((storage._1 != base58''))
582+ then throw("_whenNotInitialized: revert")
583+ else true
584+ }
585+
586+
587+func _whenInitialized () = {
588+ let storage = _loadStorage()
589+ if ((storage._1 == base58''))
590+ then throw("_whenInitialized: revert")
591+ else true
592+ }
593+
594+
595+func _whenNotPaused () = if (_loadPause())
596+ then throw("_whenNotPaused: revert")
597+ else true
598+
599+
600+func _whenPaused () = if (!(_loadPause()))
601+ then throw("_whenPaused: revert")
602+ else true
603+
604+
605+func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606+ then throw("_onlyPauser: revert")
607+ else true
608+
609+
610+func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611+ case a: Asset =>
612+ a.decimals
613+ case _ =>
614+ throw(("_getDecimals: no asset=" + assetId_))
615+}
616+
617+
618+func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619+ then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620+ else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
621+
622+
623+func _prepareAssetBalances (assets_) = {
624+ func foldFunc (acc,elem) = (acc :+ 0)
625+
626+ let $l = assets_
627+ let $s = size($l)
628+ let $acc0 = nil
629+ func $f0_1 ($a,$i) = if (($i >= $s))
630+ then $a
631+ else foldFunc($a, $l[$i])
632+
633+ func $f0_2 ($a,$i) = if (($i >= $s))
634+ then $a
635+ else throw("List size exceeds 10")
636+
637+ $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)
638+ }
639+
640+
641+func _prepareAssetWeights (assetWeights_) = {
642+ func foldFunc (acc,elem) = {
643+ let weight = parseIntValue(elem)
644+ $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645+ }
646+
647+ let $l = assetWeights_
648+ let $s = size($l)
649+ let $acc0 = $Tuple2(nil, 0)
650+ func $f0_1 ($a,$i) = if (($i >= $s))
651+ then $a
652+ else foldFunc($a, $l[$i])
653+
654+ func $f0_2 ($a,$i) = if (($i >= $s))
655+ then $a
656+ else throw("List size exceeds 10")
657+
658+ $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)
659+ }
660+
661+
662+func _getAssetBalances (assets_,decimals_) = {
663+ func foldFunc (acc,elem) = {
664+ let assetDecimals = _getDecimals(elem)
665+ let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666+ $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667+ }
668+
669+ let $l = assets_
670+ let $s = size($l)
671+ let $acc0 = $Tuple2(nil, 0)
672+ func $f0_1 ($a,$i) = if (($i >= $s))
673+ then $a
674+ else foldFunc($a, $l[$i])
675+
676+ func $f0_2 ($a,$i) = if (($i >= $s))
677+ then $a
678+ else throw("List size exceeds 10")
679+
680+ $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)
681+ }
682+
683+
684+func _listIntToString (assets_) = {
685+ func foldFunc (acc,elem) = (acc :+ toString(elem))
686+
687+ makeString({
688+ let $l = assets_
689+ let $s = size($l)
690+ let $acc0 = nil
691+ func $f0_1 ($a,$i) = if (($i >= $s))
692+ then $a
693+ else foldFunc($a, $l[$i])
694+
695+ func $f0_2 ($a,$i) = if (($i >= $s))
696+ then $a
697+ else throw("List size exceeds 11")
698+
699+ $f0_2($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)
700+ }, SEP)
701+ }
702+
703+
704+func _listBigIntToString (assets_) = {
705+ func foldFunc (acc,elem) = (acc :+ toString(elem))
706+
707+ makeString({
708+ let $l = assets_
709+ let $s = size($l)
710+ let $acc0 = nil
711+ func $f0_1 ($a,$i) = if (($i >= $s))
712+ then $a
713+ else foldFunc($a, $l[$i])
714+
715+ func $f0_2 ($a,$i) = if (($i >= $s))
716+ then $a
717+ else throw("List size exceeds 11")
718+
719+ $f0_2($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)
720+ }, SEP)
721+ }
722+
723+
724+func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725+ func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
726+
727+ let $l = weights_
728+ let $s = size($l)
729+ let $acc0 = nil
730+ func $f0_1 ($a,$i) = if (($i >= $s))
731+ then $a
732+ else foldFunc($a, $l[$i])
733+
734+ func $f0_2 ($a,$i) = if (($i >= $s))
735+ then $a
736+ else throw("List size exceeds 10")
737+
738+ $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)
739+ }
740+
741+
742+func _incrementBalancesByAmounts (balances_,amounts_) = {
743+ func foldFunc (acc,elem) = {
744+ let index = acc._1
745+ let amount = amounts_[index]
746+ let newBalance = (elem + amount)
747+ $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748+ }
749+
750+ let result = {
751+ let $l = balances_
752+ let $s = size($l)
753+ let $acc0 = $Tuple3(0, nil, 0)
754+ func $f0_1 ($a,$i) = if (($i >= $s))
755+ then $a
756+ else foldFunc($a, $l[$i])
757+
758+ func $f0_2 ($a,$i) = if (($i >= $s))
759+ then $a
760+ else throw("List size exceeds 10")
761+
762+ $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)
763+ }
764+ $Tuple2(result._2, result._3)
765+ }
766+
767+
768+func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769+ func foldFunc (acc,elem) = {
770+ let index = acc._1
771+ let payment = payments_[index]
772+ let paymentAssetStr = _assetToStr(payment.assetId)
773+ let err = if ((paymentAssetStr != assets_[index]))
774+ then throw(((err_ + ": index=") + toString(index)))
775+ else unit
776+ if ((err == err))
777+ then {
778+ let assetDecimals = _getDecimals(paymentAssetStr)
779+ let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
780+ $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781+ }
782+ else throw("Strict value is not equal to itself.")
783+ }
784+
785+ let result = {
786+ let $l = balances_
787+ let $s = size($l)
788+ let $acc0 = $Tuple3(0, nil, 0)
789+ func $f0_1 ($a,$i) = if (($i >= $s))
790+ then $a
791+ else foldFunc($a, $l[$i])
792+
793+ func $f0_2 ($a,$i) = if (($i >= $s))
794+ then $a
795+ else throw("List size exceeds 10")
796+
797+ $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)
798+ }
799+ $Tuple2(result._2, result._3)
800+ }
801+
802+
803+func _incrementBalanceByIndex (balances_,index_,amount_) = {
804+ func foldFunc (acc,elem) = {
805+ let index = acc._1
806+ if ((index == index_))
807+ then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808+ else $Tuple2((index + 1), (acc._2 :+ elem))
809+ }
810+
811+ let result = {
812+ let $l = balances_
813+ let $s = size($l)
814+ let $acc0 = $Tuple2(0, nil)
815+ func $f0_1 ($a,$i) = if (($i >= $s))
816+ then $a
817+ else foldFunc($a, $l[$i])
818+
819+ func $f0_2 ($a,$i) = if (($i >= $s))
820+ then $a
821+ else throw("List size exceeds 10")
822+
823+ $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)
824+ }
825+ result._2
826+ }
827+
828+
829+func _decrementBalanceByIndex (balances_,index_,amount_) = {
830+ func foldFunc (acc,elem) = {
831+ let index = acc._1
832+ if ((index == index_))
833+ then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834+ else $Tuple2((index + 1), (acc._2 :+ elem))
835+ }
836+
837+ let result = {
838+ let $l = balances_
839+ let $s = size($l)
840+ let $acc0 = $Tuple2(0, nil)
841+ func $f0_1 ($a,$i) = if (($i >= $s))
842+ then $a
843+ else foldFunc($a, $l[$i])
844+
845+ func $f0_2 ($a,$i) = if (($i >= $s))
846+ then $a
847+ else throw("List size exceeds 10")
848+
849+ $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)
850+ }
851+ result._2
852+ }
853+
854+
855+func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856+ let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857+ func foldFunc (acc,elem) = {
858+ let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859+ let deltaBalance = (elem - newBalance)
860+ $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861+ }
862+
863+ let $l = balances_
864+ let $s = size($l)
865+ let $acc0 = $Tuple3(nil, 0, nil)
866+ func $f0_1 ($a,$i) = if (($i >= $s))
867+ then $a
868+ else foldFunc($a, $l[$i])
869+
870+ func $f0_2 ($a,$i) = if (($i >= $s))
871+ then $a
872+ else throw("List size exceeds 10")
873+
874+ $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)
875+ }
876+
877+
878+func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879+ func foldFunc (acc,elem) = {
880+ let index = acc._1
881+ $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
882+ }
883+
884+ let result = {
885+ let $l = assets_
886+ let $s = size($l)
887+ let $acc0 = $Tuple2(0, nil)
888+ func $f0_1 ($a,$i) = if (($i >= $s))
889+ then $a
890+ else foldFunc($a, $l[$i])
891+
892+ func $f0_2 ($a,$i) = if (($i >= $s))
893+ then $a
894+ else throw("List size exceeds 10")
895+
896+ $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)
897+ }
898+ result._2
899+ }
900+
901+
902+func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903+ then {
904+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905+ if ((threshold > balance_))
906+ then {
907+ let maxDeviation = (threshold - balance_)
908+ let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909+ if ((feeRate > feeMaxRate_))
910+ then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911+ else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912+ }
913+ else 0
914+ }
915+ else {
916+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917+ if ((balance_ > threshold))
918+ then {
919+ let maxDeviation = (balance_ - threshold)
920+ let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921+ if ((feeRate > feeMaxRate_))
922+ then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923+ else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924+ }
925+ else 0
926+ }
927+
928+
929+func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930+ func foldFunc (acc,balance) = {
931+ let index = acc._1
932+ let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
933+ $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934+ }
935+
936+ let result = {
937+ let $l = balances_
938+ let $s = size($l)
939+ let $acc0 = $Tuple2(0, 0)
940+ func $f0_1 ($a,$i) = if (($i >= $s))
941+ then $a
942+ else foldFunc($a, $l[$i])
943+
944+ func $f0_2 ($a,$i) = if (($i >= $s))
945+ then $a
946+ else throw("List size exceeds 10")
947+
948+ $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)
949+ }
950+ result._2
951+ }
952+
953+
954+func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955+ then true
956+ else (lpTotalSupply_ == 0))
957+ then true
958+ else {
959+ let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960+ let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
961+ let diff = (newAssetsRate - prevAssetsRate)
962+ if (if ((0 >= diff))
963+ then ((-1 * RATE_FACTOR) > diff)
964+ else false)
965+ then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966+ else true
967+ }
968+
969+
970+func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971+ let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972+ let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973+ let diff = (newUtil - prevUtil)
974+ if (if ((0 >= diff))
975+ then ((-1 * RATE_FACTOR) > diff)
976+ else false)
977+ then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978+ else true
979+ }
980+
981+
982+func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
983+ let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
984+ let maxAllocationAmp = if ((balance_ > equilibrium))
985+ then (MAX_AMPLIFIER + maxAllocAmp_)
986+ else (MAX_AMPLIFIER - maxAllocAmp_)
987+ let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
988+ let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
989+ if ((balance_ > equilibrium))
990+ then if ((balance_ > maxAllocation))
991+ then if ((prevMaxAllocation > prevBalance_))
992+ then throw("_validateAssetAllocation: new up")
993+ else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
994+ then throw("_validateAssetAllocation: still up")
995+ else true
996+ else true
997+ else if ((maxAllocation > balance_))
998+ then if ((prevBalance_ > prevMaxAllocation))
999+ then throw("_validateAssetAllocation: new down")
1000+ else if (((prevMaxAllocation - prevBalance_) > (maxAllocation - balance_)))
1001+ then throw("_validateAssetAllocation: still down")
1002+ else true
1003+ else true
1004+ }
1005+
1006+
1007+func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
1008+ func foldFunc (acc,elem) = {
1009+ let index = acc._1
1010+ $Tuple2((index + 1), if (acc._2)
1011+ then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
1012+ else false)
1013+ }
1014+
1015+ let result = {
1016+ let $l = assetBalances_
1017+ let $s = size($l)
1018+ let $acc0 = $Tuple2(0, true)
1019+ func $f0_1 ($a,$i) = if (($i >= $s))
1020+ then $a
1021+ else foldFunc($a, $l[$i])
1022+
1023+ func $f0_2 ($a,$i) = if (($i >= $s))
1024+ then $a
1025+ else throw("List size exceeds 10")
1026+
1027+ $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)
1028+ }
1029+ result._2
1030+ }
1031+
1032+
1033+func _checkpoint (user_) = {
1034+ let userLp = _loadUserLp(user_)
1035+ let userProfits = _loadUserProfits(user_)
1036+ let sigmaFeePerLp = _loadSigmaFeePerLp()
1037+ let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
1038+ func foldFunc (acc,elem) = {
1039+ let index = acc._1
1040+ let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
1041+ $Tuple2((index + 1), (acc._2 :+ profitUpdated))
1042+ }
1043+
1044+ let $t02458924662 = {
1045+ let $l = ZERO_INT_LIST_11
1046+ let $s = size($l)
1047+ let $acc0 = $Tuple2(0, nil)
1048+ func $f0_1 ($a,$i) = if (($i >= $s))
1049+ then $a
1050+ else foldFunc($a, $l[$i])
1051+
1052+ func $f0_2 ($a,$i) = if (($i >= $s))
1053+ then $a
1054+ else throw("List size exceeds 11")
1055+
1056+ $f0_2($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)
1057+ }
1058+ let idx = $t02458924662._1
1059+ let profitsUpdated = $t02458924662._2
1060+ $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
1061+ }
1062+
1063+
1064+func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
1065+ func foldFunc (acc,elem) = {
1066+ let index = acc._1
1067+ let sigmaFeePerLpUpdated = if ((index_ == index))
1068+ then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
1069+ else sigmaFeePerLp_[index]
1070+ $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
1071+ }
1072+
1073+ let $t02531225391 = {
1074+ let $l = ZERO_INT_LIST_11
1075+ let $s = size($l)
1076+ let $acc0 = $Tuple2(0, nil)
1077+ func $f0_1 ($a,$i) = if (($i >= $s))
1078+ then $a
1079+ else foldFunc($a, $l[$i])
1080+
1081+ func $f0_2 ($a,$i) = if (($i >= $s))
1082+ then $a
1083+ else throw("List size exceeds 11")
1084+
1085+ $f0_2($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)
1086+ }
1087+ let idx = $t02531225391._1
1088+ let sigmaFeePerLpUpdated = $t02531225391._2
1089+ sigmaFeePerLpUpdated
1090+ }
1091+
1092+
1093+func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
1094+ let sigmaFeePerLp = _loadSigmaFeePerLp()
1095+ let totalLp = _loadTotalLp()
1096+ let $t02561225887 = if ((totalLp == 0))
1097+ then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
1098+ else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099+ let lpFee = $t02561225887._1
1100+ let protocolFee = $t02561225887._2
1101+ let sigmaFeePerLpUpdated = if ((lpFee == 0))
1102+ then sigmaFeePerLp
1103+ else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
1104+ $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
1105+ }
1106+
1107+
1108+func _depositAll (amount_) = {
1109+ let storage = _loadStorage()
1110+ let lpTotalSupply = storage._3
1111+ let weightAmplifier = storage._7
1112+ let slippageRate = storage._8
1113+ let feeMaxRate = storage._9
1114+ let assets = _loadAssets()
1115+ let $t02639626449 = _loadAssetWeights()
1116+ let assetWeights = $t02639626449._1
1117+ let sigmaWeight = $t02639626449._2
1118+ let $t02645426522 = _loadAssetBalances()
1119+ let prevAssetBalances = $t02645426522._1
1120+ let prevAssetTotalSupply = $t02645426522._2
1121+ let $t02652827758 = if ((prevAssetTotalSupply == 0))
1122+ then {
1123+ func foldFunc (acc,elem) = {
1124+ let index = acc._1
1125+ let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
1126+ $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
1127+ }
1128+
1129+ let $t02697027044 = {
1130+ let $l = assets
1131+ let $s = size($l)
1132+ let $acc0 = $Tuple2(0, nil)
1133+ func $f0_1 ($a,$i) = if (($i >= $s))
1134+ then $a
1135+ else foldFunc($a, $l[$i])
1136+
1137+ func $f0_2 ($a,$i) = if (($i >= $s))
1138+ then $a
1139+ else throw("List size exceeds 10")
1140+
1141+ $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)
1142+ }
1143+ let idx = $t02697027044._1
1144+ let requiredAmountsNormalized = $t02697027044._2
1145+ $Tuple2(amount_, requiredAmountsNormalized)
1146+ }
1147+ else {
1148+ let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
1149+ func foldFunc1 (acc,elem) = {
1150+ let index = acc._1
1151+ let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
1152+ $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
1153+ }
1154+
1155+ let $t02758727662 = {
1156+ let $l = assets
1157+ let $s = size($l)
1158+ let $acc0 = $Tuple2(0, nil)
1159+ func $f0_1 ($a,$i) = if (($i >= $s))
1160+ then $a
1161+ else foldFunc1($a, $l[$i])
1162+
1163+ func $f0_2 ($a,$i) = if (($i >= $s))
1164+ then $a
1165+ else throw("List size exceeds 10")
1166+
1167+ $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)
1168+ }
1169+ let idx = $t02758727662._1
1170+ let requiredAmountsNormalized = $t02758727662._2
1171+ $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
1172+ }
1173+ let lpTokensToMint = $t02652827758._1
1174+ let requiredAmountsNormalized = $t02652827758._2
1175+ let $t02776427877 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176+ let assetBalances = $t02776427877._1
1177+ let assetTotalSupply = $t02776427877._2
1178+ let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1179+ if ((err2 == err2))
1180+ then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
1181+ else throw("Strict value is not equal to itself.")
1182+ }
1183+
1184+
1185+func _deposit (assetId_,amount_) = {
1186+ let storage = _loadStorage()
1187+ let lpTotalSupply = storage._3
1188+ let maxAllocAmplifier = storage._6
1189+ let weightAmplifier = storage._7
1190+ let slippageRate = storage._8
1191+ let feeMaxRate = storage._9
1192+ let assets = _loadAssets()
1193+ let $t02857228625 = _loadAssetWeights()
1194+ let assetWeights = $t02857228625._1
1195+ let sigmaWeight = $t02857228625._2
1196+ let $t02863028744 = _loadAssetBalances()
1197+ let prevAssetBalances = $t02863028744._1
1198+ let prevAssetTotalSupply = $t02863028744._2
1199+ let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
1200+ let assetTotalSupply = (prevAssetTotalSupply + amount_)
1201+ let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
1202+ if ((err2 == err2))
1203+ then {
1204+ let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1205+ let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1206+ let lpTokensToMint = if ((lpTotalSupply == 0))
1207+ then (assetTotalSupply - fee)
1208+ else {
1209+ let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
1210+ let feeDiff = (fee - prevFee)
1211+ let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
1212+ let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
1213+ let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1214+ if ((err3 == err3))
1215+ then lpTokensToMintInner
1216+ else throw("Strict value is not equal to itself.")
1217+ }
1218+ $Tuple2(lpTokensToMint, assetBalances)
1219+ }
1220+ else throw("Strict value is not equal to itself.")
1221+ }
1222+
1223+
1224+func _withdrawAll (amount_) = {
1225+ let storage = _loadStorage()
1226+ let lpTotalSupply = storage._3
1227+ let lpFeeRate = storage._4
1228+ let protocolFeeRate = storage._5
1229+ let maxAllocAmplifier = storage._6
1230+ let weightAmplifier = storage._7
1231+ let slippageRate = storage._8
1232+ let feeMaxRate = storage._9
1233+ let $t03067130739 = _loadAssetBalances()
1234+ let prevAssetBalances = $t03067130739._1
1235+ let prevAssetTotalSupply = $t03067130739._2
1236+ let $t03074430797 = _loadAssetWeights()
1237+ let assetWeights = $t03074430797._1
1238+ let sigmaWeight = $t03074430797._2
1239+ let lpTokensToBurn = amount_
1240+ let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
1241+ if ((err == err))
1242+ then {
1243+ let $t03093931072 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244+ let assetBalances = $t03093931072._1
1245+ let assetTotalSupply = $t03093931072._2
1246+ let balancesToPay = $t03093931072._3
1247+ let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1248+ if ((err2 == err2))
1249+ then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
1250+ else throw("Strict value is not equal to itself.")
1251+ }
1252+ else throw("Strict value is not equal to itself.")
1253+ }
1254+
1255+
1256+func _withdraw (assetId_,lpAmount_) = {
1257+ let storage = _loadStorage()
1258+ let lpTotalSupply = storage._3
1259+ let lpFeeRate = storage._4
1260+ let protocolFeeRate = storage._5
1261+ let maxAllocAmplifier = storage._6
1262+ let weightAmplifier = storage._7
1263+ let slippageRate = storage._8
1264+ let feeMaxRate = storage._9
1265+ let precision = _loadPrecision()
1266+ let assets = _loadAssets()
1267+ let $t03186431932 = _loadAssetBalances()
1268+ let prevAssetBalances = $t03186431932._1
1269+ let prevAssetTotalSupply = $t03186431932._2
1270+ let $t03193731990 = _loadAssetWeights()
1271+ let assetWeights = $t03193731990._1
1272+ let sigmaWeight = $t03193731990._2
1273+ let targetAssetIndex = value(indexOf(assets, assetId_))
1274+ let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1275+ let prevUtilValue = (prevAssetTotalSupply - prevFee)
1276+ let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
1277+ let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1278+ func foldFunc (acc,elem) = if (acc._1)
1279+ then acc
1280+ else {
1281+ let startInner = acc._2
1282+ let stopInner = acc._3
1283+ let currentAmount = ((stopInner + startInner) / 2)
1284+ let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
1285+ let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
1286+ let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1287+ if (if ((precision > (utilValue - prevUtilValueWithK)))
1288+ then ((utilValue - prevUtilValueWithK) >= 0)
1289+ else false)
1290+ then $Tuple4(true, startInner, stopInner, currentAmount)
1291+ else if ((0 > (utilValue - prevUtilValueWithK)))
1292+ then $Tuple4(false, startInner, currentAmount, 0)
1293+ else $Tuple4(false, currentAmount, stopInner, 0)
1294+ }
1295+
1296+ let targetAmount = {
1297+ let $t03348933604 = {
1298+ let $l = LIST_64
1299+ let $s = size($l)
1300+ let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
1301+ func $f0_1 ($a,$i) = if (($i >= $s))
1302+ then $a
1303+ else foldFunc($a, $l[$i])
1304+
1305+ func $f0_2 ($a,$i) = if (($i >= $s))
1306+ then $a
1307+ else throw("List size exceeds 64")
1308+
1309+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1310+ }
1311+ let success = $t03348933604._1
1312+ let startOut = $t03348933604._2
1313+ let stopOut = $t03348933604._3
1314+ let targetAmountOut = $t03348933604._4
1315+ if (!(success))
1316+ then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
1317+ else targetAmountOut
1318+ }
1319+ let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
1320+ let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
1321+ let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1322+ then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1323+ else false
1324+ if ((err1 == err1))
1325+ then {
1326+ let $t03447934619 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1327+ let lpFee = $t03447934619._1
1328+ let protocolFee = $t03447934619._2
1329+ let sigmaFeePerLpUpdated = $t03447934619._3
1330+ $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1331+ }
1332+ else throw("Strict value is not equal to itself.")
1333+ }
1334+
1335+
1336+func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
1337+ let storage = _loadStorage()
1338+ let lpAssetId = storage._1
1339+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1340+ let lpTotalSupply = storage._3
1341+ let lpFeeRate = storage._4
1342+ let protocolFeeRate = storage._5
1343+ let maxAllocAmplifier = storage._6
1344+ let weightAmplifier = storage._7
1345+ let slippageRate = storage._8
1346+ let feeMaxRate = storage._9
1347+ let precision = _loadPrecision()
1348+ let $t03520135269 = _loadAssetBalances()
1349+ let prevAssetBalances = $t03520135269._1
1350+ let prevAssetTotalSupply = $t03520135269._2
1351+ let $t03527435327 = _loadAssetWeights()
1352+ let assetWeights = $t03527435327._1
1353+ let sigmaWeight = $t03527435327._2
1354+ let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
1355+ let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
1356+ let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1357+ let prevUtilValue = (prevAssetTotalSupply - prevFee)
1358+ func foldFunc (acc,elem) = if (acc._1)
1359+ then acc
1360+ else {
1361+ let startInner = acc._2
1362+ let stopInner = acc._3
1363+ let currentAmount = ((stopInner + startInner) / 2)
1364+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
1365+ let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
1366+ let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1367+ if (if ((precision > (utilValue - prevUtilValue)))
1368+ then ((utilValue - prevUtilValue) >= 0)
1369+ else false)
1370+ then $Tuple4(true, startInner, stopInner, currentAmount)
1371+ else if ((0 > (utilValue - prevUtilValue)))
1372+ then $Tuple4(false, startInner, currentAmount, 0)
1373+ else $Tuple4(false, currentAmount, stopInner, 0)
1374+ }
1375+
1376+ let targetAmount = {
1377+ let targetAmount = sourceAmount_
1378+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1379+ let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1380+ let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1381+ let feeDiff = (fee - prevFee)
1382+ if ((feeDiff == 0))
1383+ then targetAmount
1384+ else {
1385+ let $t03717837297 = {
1386+ let $l = LIST_64
1387+ let $s = size($l)
1388+ let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
1389+ func $f0_1 ($a,$i) = if (($i >= $s))
1390+ then $a
1391+ else foldFunc($a, $l[$i])
1392+
1393+ func $f0_2 ($a,$i) = if (($i >= $s))
1394+ then $a
1395+ else throw("List size exceeds 64")
1396+
1397+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1398+ }
1399+ let success = $t03717837297._1
1400+ let startOut = $t03717837297._2
1401+ let stopOut = $t03717837297._3
1402+ let targetAmountOut = $t03717837297._4
1403+ if (!(success))
1404+ then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
1405+ else targetAmountOut
1406+ }
1407+ }
1408+ let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1409+ let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
1410+ let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1411+ then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1412+ else false
1413+ if ((err1 == err1))
1414+ then {
1415+ let $t03811038251 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1416+ let lpFee = $t03811038251._1
1417+ let protocolFee = $t03811038251._2
1418+ let sigmaFeePerLpUpdated = $t03811038251._3
1419+ $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1420+ }
1421+ else throw("Strict value is not equal to itself.")
1422+ }
1423+
1424+
1425+@Callable(i)
1426+func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_) = {
1427+ let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
1428+ then _whenNotInitialized()
1429+ else false)
1430+ then _whenMultisigSet()
1431+ else false)
1432+ then _validateAssets(assets_, "init: invalid assets")
1433+ else false)
1434+ then _validateIntList(assetWeights_, 0, MAX_WEIGHT, "init: invalid assetWeights")
1435+ else false)
1436+ then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
1437+ else false)
1438+ then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
1439+ else false)
1440+ then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
1441+ else false)
1442+ then _validateTokenName(lpTokenName_, "init: invalid name")
1443+ else false)
1444+ then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
1445+ else false)
1446+ then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
1447+ else false)
1448+ then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
1449+ else false)
1450+ then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
1451+ else false)
1452+ then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
1453+ else false)
1454+ then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
1455+ else false)
1456+ then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
1457+ else false)
1458+ then _validateInt(precision_, 0, MAX_INT, "init: invalid precision")
1459+ else false
1460+ if ((err == err))
1461+ then {
1462+ let $t04003240101 = _prepareAssetWeights(assetWeights_)
1463+ let assetWeights = $t04003240101._1
1464+ let sigmaWeight = $t04003240101._2
1465+ let assetBalances = _prepareAssetBalances(assets_)
1466+ let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
1467+ let lpAssetId = calculateAssetId(issue)
1468+ let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1469+ $Tuple2((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())), unit)
1470+ }
1471+ else throw("Strict value is not equal to itself.")
1472+ }
1473+
1474+
1475+
1476+@Callable(i)
1477+func depositAll (amount_) = {
1478+ let err = if (if (_whenInitialized())
1479+ then _whenNotPaused()
1480+ else false)
1481+ then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
1482+ else false
1483+ if ((err == err))
1484+ then {
1485+ let storage = _loadStorage()
1486+ let lpAssetId = storage._1
1487+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1488+ let assets = _loadAssets()
1489+ let $t04179441879 = _depositAll(amount_)
1490+ let lpTokensToMint = $t04179441879._1
1491+ let requiredAmountsNormalized = $t04179441879._2
1492+ let assetBalances = $t04179441879._3
1493+ func foldFunc (acc,elem) = {
1494+ let index = acc._1
1495+ let paymentAssetStr = _assetToStr(i.payments[index].assetId)
1496+ let paymentAssetDecimals = _getDecimals(paymentAssetStr)
1497+ let requiredAmountNormalized = requiredAmountsNormalized[index]
1498+ let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
1499+ let err1 = if ((paymentAssetStr != elem))
1500+ then throw(("depositAll: invalid payment: index=" + toString(index)))
1501+ else if ((0 >= requiredAmount))
1502+ then throw("depositAll: too little amount required")
1503+ else unit
1504+ if ((err1 == err1))
1505+ then {
1506+ let change = if ((i.payments[index].amount > requiredAmount))
1507+ then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
1508+ else if ((requiredAmount > i.payments[index].amount))
1509+ then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
1510+ else nil
1511+ $Tuple2((index + 1), (acc._2 ++ change))
1512+ }
1513+ else throw("Strict value is not equal to itself.")
1514+ }
1515+
1516+ let $t04302243084 = {
1517+ let $l = assets
1518+ let $s = size($l)
1519+ let $acc0 = $Tuple2(0, nil)
1520+ func $f0_1 ($a,$i) = if (($i >= $s))
1521+ then $a
1522+ else foldFunc($a, $l[$i])
1523+
1524+ func $f0_2 ($a,$i) = if (($i >= $s))
1525+ then $a
1526+ else throw("List size exceeds 10")
1527+
1528+ $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)
1529+ }
1530+ let idx = $t04302243084._1
1531+ let changeActions = $t04302243084._2
1532+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1533+ $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
1534+ }
1535+ else throw("Strict value is not equal to itself.")
1536+ }
1537+
1538+
1539+
1540+@Callable(i)
1541+func deposit (minLpAmount_) = {
1542+ let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
1543+ if ((err == err))
1544+ then {
1545+ let storage = _loadStorage()
1546+ let lpAssetId = storage._1
1547+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1548+ let err1 = if (if (if (if (_whenInitialized())
1549+ then _whenNotPaused()
1550+ else false)
1551+ then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
1552+ else false)
1553+ then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
1554+ else false)
1555+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: invalid payment amount")
1556+ else false
1557+ if ((err1 == err1))
1558+ then {
1559+ let assetStr = _assetToStr(i.payments[0].assetId)
1560+ let assetDecimals = _getDecimals(assetStr)
1561+ let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1562+ let $t04446344537 = _deposit(assetStr, amountNormalized)
1563+ let lpTokensToMint = $t04446344537._1
1564+ let assetBalances = $t04446344537._2
1565+ let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
1566+ if ((err2 == err2))
1567+ then {
1568+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1569+ $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
1570+ }
1571+ else throw("Strict value is not equal to itself.")
1572+ }
1573+ else throw("Strict value is not equal to itself.")
1574+ }
1575+ else throw("Strict value is not equal to itself.")
1576+ }
1577+
1578+
1579+
1580+@Callable(i)
1581+func withdrawAll () = {
1582+ let storage = _loadStorage()
1583+ let lpAssetId = storage._1
1584+ let lpAssetIdStr = toBase58String(lpAssetId)
1585+ let lpDecimals = _getDecimals(lpAssetIdStr)
1586+ let assets = _loadAssets()
1587+ let err = if (if (if (if (_whenInitialized())
1588+ then _whenNotPaused()
1589+ else false)
1590+ then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
1591+ else false)
1592+ then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
1593+ else false)
1594+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdrawAll: invalid payment amount")
1595+ else false
1596+ if ((err == err))
1597+ then {
1598+ let $t04575845845 = _withdrawAll(i.payments[0].amount)
1599+ let lpTokensToBurn = $t04575845845._1
1600+ let balancesToPay = $t04575845845._2
1601+ let assetBalances = $t04575845845._3
1602+ let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
1603+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1604+ $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
1605+ }
1606+ else throw("Strict value is not equal to itself.")
1607+ }
1608+
1609+
1610+
1611+@Callable(i)
1612+func withdraw (assetId_,minAmount_) = {
1613+ let storage = _loadStorage()
1614+ let lpAssetId = storage._1
1615+ let lpAssetIdStr = toBase58String(lpAssetId)
1616+ let lpDecimals = _getDecimals(lpAssetIdStr)
1617+ let assets = _loadAssets()
1618+ let err = if (if (if (if (if (if (_whenInitialized())
1619+ then _whenNotPaused()
1620+ else false)
1621+ then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
1622+ else false)
1623+ then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
1624+ else false)
1625+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdraw: invalid payment amount")
1626+ else false)
1627+ then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
1628+ else false)
1629+ then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
1630+ else false
1631+ if ((err == err))
1632+ then {
1633+ let $t04717147305 = _withdraw(assetId_, i.payments[0].amount)
1634+ let targetAmountNormalized = $t04717147305._1
1635+ let finalAssetBalances = $t04717147305._2
1636+ let lpFee = $t04717147305._3
1637+ let protocolFee = $t04717147305._4
1638+ let sigmaFeePerLpUpdated = $t04717147305._5
1639+ let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1640+ let targetDecimals = _getDecimals(assetId_)
1641+ let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1642+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
1643+ if ((err1 == err1))
1644+ then {
1645+ let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1646+ $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1647+ }
1648+ else throw("Strict value is not equal to itself.")
1649+ }
1650+ else throw("Strict value is not equal to itself.")
1651+ }
1652+
1653+
1654+
1655+@Callable(i)
1656+func swap (targetAssetId_,minAmount_) = {
1657+ let storage = _loadStorage()
1658+ let lpAssetId = storage._1
1659+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1660+ let assets = _loadAssets()
1661+ let sourceAssetStr = _assetToStr(i.payments[0].assetId)
1662+ let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
1663+ let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
1664+ if ((sourceAssetIndex == sourceAssetIndex))
1665+ then {
1666+ let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
1667+ if ((targetAssetIndex == targetAssetIndex))
1668+ then {
1669+ let err = if (if (if (if (if (_whenInitialized())
1670+ then _whenNotPaused()
1671+ else false)
1672+ then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
1673+ else false)
1674+ then _validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount")
1675+ else false)
1676+ then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
1677+ else false)
1678+ then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
1679+ else false
1680+ if ((err == err))
1681+ then {
1682+ let $t04940249560 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1683+ let targetAmountNormalized = $t04940249560._1
1684+ let finalAssetBalances = $t04940249560._2
1685+ let lpFee = $t04940249560._3
1686+ let protocolFee = $t04940249560._4
1687+ let sigmaFeePerLpUpdated = $t04940249560._5
1688+ let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1689+ let targetDecimals = _getDecimals(targetAssetId_)
1690+ let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1691+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
1692+ if ((err1 == err1))
1693+ then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
1694+ else throw("Strict value is not equal to itself.")
1695+ }
1696+ else throw("Strict value is not equal to itself.")
1697+ }
1698+ else throw("Strict value is not equal to itself.")
1699+ }
1700+ else throw("Strict value is not equal to itself.")
1701+ }
1702+
1703+
1704+
1705+@Callable(i)
1706+func getDepositAll (lpAmount_) = {
1707+ let err = _validateInt(lpAmount_, 0, MAX_INT, "getDepositAll: invalid amount")
1708+ if ((err == err))
1709+ then {
1710+ let $t05069250779 = _depositAll(lpAmount_)
1711+ let lpTokensToMint = $t05069250779._1
1712+ let requiredAmountsNormalized = $t05069250779._2
1713+ let assetBalances = $t05069250779._3
1714+ $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
1715+ }
1716+ else throw("Strict value is not equal to itself.")
1717+ }
1718+
1719+
1720+
1721+@Callable(i)
1722+func getDeposit (assetId_,amount_) = {
1723+ let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
1724+ then _validateInt(amount_, 0, MAX_INT, "getDeposit: invalid amount")
1725+ else false
1726+ if ((err == err))
1727+ then {
1728+ let storage = _loadStorage()
1729+ let lpAssetId = storage._1
1730+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1731+ let assetDecimals = _getDecimals(assetId_)
1732+ let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1733+ let $t05153851612 = _deposit(assetId_, amountNormalized)
1734+ let lpTokensToMint = $t05153851612._1
1735+ let assetBalances = $t05153851612._2
1736+ $Tuple2(nil, lpTokensToMint)
1737+ }
1738+ else throw("Strict value is not equal to itself.")
1739+ }
1740+
1741+
1742+
1743+@Callable(i)
1744+func getWithdrawAll (lpAmount_) = {
1745+ let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
1746+ if ((err == err))
1747+ then {
1748+ let $t05198952065 = _withdrawAll(lpAmount_)
1749+ let lpTokensToBurn = $t05198952065._1
1750+ let balancesToGet = $t05198952065._2
1751+ let assetBalances = $t05198952065._3
1752+ $Tuple2(nil, balancesToGet)
1753+ }
1754+ else throw("Strict value is not equal to itself.")
1755+ }
1756+
1757+
1758+
1759+@Callable(i)
1760+func getWithdraw (assetId_,amount_) = {
1761+ let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
1762+ then _validateInt(amount_, 0, MAX_INT, "getWithdraw: invalid amount")
1763+ else false
1764+ if ((err == err))
1765+ then {
1766+ let storage = _loadStorage()
1767+ let lpAssetId = storage._1
1768+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1769+ let $t05271652832 = _withdraw(assetId_, amount_)
1770+ let targetAmountNormalized = $t05271652832._1
1771+ let assetBalances = $t05271652832._2
1772+ let lpFee = $t05271652832._3
1773+ let protocolFee = $t05271652832._4
1774+ let sigmaFeePerLpUpdated = $t05271652832._5
1775+ let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1776+ let targetDecimals = _getDecimals(assetId_)
1777+ let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1778+ $Tuple2(nil, finalAmount)
1779+ }
1780+ else throw("Strict value is not equal to itself.")
1781+ }
1782+
1783+
1784+
1785+@Callable(i)
1786+func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
1787+ let storage = _loadStorage()
1788+ let lpAssetId = storage._1
1789+ let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1790+ let assets = _loadAssets()
1791+ let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
1792+ if ((sourceAssetIndex == sourceAssetIndex))
1793+ then {
1794+ let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
1795+ if ((targetAssetIndex == targetAssetIndex))
1796+ then {
1797+ let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
1798+ let err = if (_validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount"))
1799+ then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
1800+ else false
1801+ if ((err == err))
1802+ then {
1803+ let $t05424654404 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1804+ let targetAmountNormalized = $t05424654404._1
1805+ let finalAssetBalances = $t05424654404._2
1806+ let lpFee = $t05424654404._3
1807+ let protocolFee = $t05424654404._4
1808+ let sigmaFeePerLpUpdated = $t05424654404._5
1809+ let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1810+ let targetDecimals = _getDecimals(targetAssetId_)
1811+ let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1812+ $Tuple2(nil, finalAmount)
1813+ }
1814+ else throw("Strict value is not equal to itself.")
1815+ }
1816+ else throw("Strict value is not equal to itself.")
1817+ }
1818+ else throw("Strict value is not equal to itself.")
1819+ }
1820+
1821+
1822+
1823+@Callable(i)
1824+func getClaim (user_) = {
1825+ let user = if ((size(user_) > 0))
1826+ then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
1827+ else i.caller
1828+ let $t05504655102 = _checkpoint(user)
1829+ let checkpointActions = $t05504655102._1
1830+ let userProfits = $t05504655102._2
1831+ $Tuple2(nil, userProfits)
1832+ }
1833+
1834+
1835+
1836+@Callable(i)
1837+func getUtilFunc () = {
1838+ let storage = _loadStorage()
1839+ let lpTotalSupply = storage._3
1840+ let weightAmplifier = storage._7
1841+ let slippageRate = storage._8
1842+ let feeMaxRate = storage._9
1843+ let $t05543555495 = _loadAssetBalances()
1844+ let assetBalances = $t05543555495._1
1845+ let assetTotalSupply = $t05543555495._2
1846+ let $t05550055553 = _loadAssetWeights()
1847+ let assetWeights = $t05550055553._1
1848+ let sigmaWeight = $t05550055553._2
1849+ let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1850+ let utilValue = (assetTotalSupply - fee)
1851+ $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
1852+ }
1853+
1854+
1855+
1856+@Callable(i)
1857+func checkpoint (user_) = {
1858+ let err = if (_whenInitialized())
1859+ then _whenNotPaused()
1860+ else false
1861+ if ((err == err))
1862+ then {
1863+ let user = if ((size(user_) > 0))
1864+ then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
1865+ else i.caller
1866+ _checkpoint(user)
1867+ }
1868+ else throw("Strict value is not equal to itself.")
1869+ }
1870+
1871+
1872+
1873+@Callable(i)
1874+func stake () = {
1875+ let err = if (_whenInitialized())
1876+ then _whenNotPaused()
1877+ else false
1878+ if ((err == err))
1879+ then {
1880+ let storage = _loadStorage()
1881+ let lpAssetIdStr = _assetToStr(storage._1)
1882+ let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
1883+ then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
1884+ else false)
1885+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
1886+ else false
1887+ if ((err1 == err1))
1888+ then {
1889+ let $t05662656686 = _checkpoint(i.caller)
1890+ let checkpointActions = $t05662656686._1
1891+ let userProfits = $t05662656686._2
1892+ $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
1893+ }
1894+ else throw("Strict value is not equal to itself.")
1895+ }
1896+ else throw("Strict value is not equal to itself.")
1897+ }
1898+
1899+
1900+
1901+@Callable(i)
1902+func unstake (amount_) = {
1903+ let err = if (_whenInitialized())
1904+ then _whenNotPaused()
1905+ else false
1906+ if ((err == err))
1907+ then {
1908+ let storage = _loadStorage()
1909+ let lpAssetId = storage._1
1910+ let userLp = _loadUserLp(i.caller)
1911+ let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
1912+ if ((err1 == err1))
1913+ then {
1914+ let $t05719757257 = _checkpoint(i.caller)
1915+ let checkpointActions = $t05719757257._1
1916+ let userProfits = $t05719757257._2
1917+ $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
1918+ }
1919+ else throw("Strict value is not equal to itself.")
1920+ }
1921+ else throw("Strict value is not equal to itself.")
1922+ }
1923+
1924+
1925+
1926+@Callable(i)
1927+func claim (user_,assets_) = {
1928+ let err = if (if (_whenInitialized())
1929+ then _whenNotPaused()
1930+ else false)
1931+ then _validateInt(size(assets_), 1, 10, "claim: invalid assets size")
1932+ else false
1933+ if ((err == err))
1934+ then {
1935+ let user = if ((size(user_) > 0))
1936+ then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
1937+ else i.caller
1938+ let storage = _loadStorage()
1939+ let lpAssetId = storage._1
1940+ let lpAssetIdStr = _assetToStr(lpAssetId)
1941+ let assets = [lpAssetIdStr, _loadAssets()]
1942+ let maxIndex = (size(assets) - 1)
1943+ let userLp = _loadUserLp(user)
1944+ let $t05808058136 = _checkpoint(user)
1945+ let checkpointActions = $t05808058136._1
1946+ let userProfits = $t05808058136._2
1947+ func foldFunc (acc,profit) = {
1948+ let index = acc._1
1949+ if ((index > maxIndex))
1950+ then $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1951+ else {
1952+ let asset = assets[index]
1953+ if (containsElement(assets_, asset))
1954+ then $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
1955+ else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1956+ }
1957+ }
1958+
1959+ let $t05862558716 = {
1960+ let $l = userProfits
1961+ let $s = size($l)
1962+ let $acc0 = $Tuple3(0, nil, nil)
1963+ func $f0_1 ($a,$i) = if (($i >= $s))
1964+ then $a
1965+ else foldFunc($a, $l[$i])
1966+
1967+ func $f0_2 ($a,$i) = if (($i >= $s))
1968+ then $a
1969+ else throw("List size exceeds 11")
1970+
1971+ $f0_2($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)
1972+ }
1973+ let idx = $t05862558716._1
1974+ let userProfitsUpdated = $t05862558716._2
1975+ let profitActions = $t05862558716._3
1976+ $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1977+ }
1978+ else throw("Strict value is not equal to itself.")
1979+ }
1980+
1981+
1982+
1983+@Callable(i)
1984+func pause () = {
1985+ let err = if (if (_onlyPauser(i.caller))
1986+ then _whenInitialized()
1987+ else false)
1988+ then _whenNotPaused()
1989+ else false
1990+ if ((err == err))
1991+ then $Tuple2(_savePause(true), unit)
1992+ else throw("Strict value is not equal to itself.")
1993+ }
1994+
1995+
1996+
1997+@Callable(i)
1998+func unpause () = {
1999+ let err = if (if (_onlyPauser(i.caller))
2000+ then _whenInitialized()
2001+ else false)
2002+ then _whenPaused()
2003+ else false
2004+ if ((err == err))
2005+ then $Tuple2(_savePause(false), unit)
2006+ else throw("Strict value is not equal to itself.")
2007+ }
2008+
2009+
2010+
2011+@Callable(i)
2012+func updatePauser (pauser_) = {
2013+ let err = if (if (_onlyThisContract(i.caller))
2014+ then _whenInitialized()
2015+ else false)
2016+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
2017+ else false
2018+ if ((err == err))
2019+ then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
2020+ else throw("Strict value is not equal to itself.")
2021+ }
2022+
2023+
2024+
2025+@Callable(i)
2026+func setMultisig (multisig_) = {
2027+ let err = if (_onlyThisContract(i.caller))
2028+ then _validateAddress(multisig_, "setMultisig: invalid multisig")
2029+ else false
2030+ if ((err == err))
2031+ then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
2032+ else throw("Strict value is not equal to itself.")
2033+ }
2034+
2035+
2036+@Verifier(tx)
2037+func verify () = match getString(KEY_MULTISIG) {
2038+ case multisig: String =>
2039+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
2040+ case _ =>
2041+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
2042+}
2043+

github/deemru/w8io/0e76f2f 
91.25 ms